一、 處理linux系統故障的思路
作為一名優秀的linux運維工程師,一定要有一套清晰、明確的解決故障思路,當問題出現時,才能迅速定位、解決問題,在開始本文學習之前,我根據多年工作和處理問題和故障的經驗,總結出了一套處理問題的一般思路,供大家參考:
1、 重視報錯提示信息:每個錯誤的出現,都是給出錯誤提示信息,一般情況下這個提示基本定位了問題的所在,因此一定要重視這個報錯信息,如果對這些錯誤信息視而不見,問題永遠得不到解決。
2、 查閱日誌文件:有時候報錯信息只是給出了問題的表面現象,要想更深入的瞭解問題,必須查看相應的日誌文件,而日誌文件又分為系統日誌文件(/var/log)和應用的日誌文件,結合這兩個日誌文件,一般就能定位問題所在。
3、 分析、定位問題:這個過程是比較複雜的,根據報錯信息,結合日誌文件,同時還要考慮其它相關情況,最終找到引起問題的原因。
4、 解決問題:找到了問題出現的原因,解決問題就是很簡單的事情了。
從這個流程可以看出,解決問題的過程就是分析、查找問題的過程,一旦確定問題產生的原因,故障也就隨之解決了。看似簡單明瞭的思路,但是真正能重視這個思路的、按照這個思路處理問題的卻很少,衷心的希望大家在處理故障的時候,能靜下心來,先整理思路,然後有目的的去處理問題。
二、 忘記linux root密碼或進入單用戶方法
這個問題出現的幾率是很高的,也是linux運維最基礎的技能,要解決這個問題,在linux下非常簡單,只需重啟linux系統,然後引導進入linux的單用戶模式(init 1)就可以搞定了,由於單用戶模式是不需要輸入登錄密碼的,因此,可以直接登錄系統,修改root密碼即可解決問題。
目前企業線上環境,最常用的Linux就是centos6.x和7.x版本,那麼這裡首先以RHEL/Centos6.x版本為例,介紹下如何進入單用戶並重置root密碼,操作步驟如下:
1、 重啟系統,待linux系統啟動到grub引導菜單時,按esc鍵,找到當前系統引導選項,如圖所示:如果有多個可用內核,這裡就有多個引導選項。
2、 通過方向鍵將光標放到需要使用的系統引導內核選項上,然後按鍵盤字母“e”,進入編輯狀態,如圖所示:
3、然後通過上下鍵,選中帶有kernel指令的一行,繼續按鍵盤字母“e”,編輯該行,在行末尾加個空格,然後添加single,類似下圖所示:
4、 修改完成,按回車鍵,返回到剛才的界面。
5、 最後按鍵盤“b”,系統開始引導。
這樣系統就啟動到了單用戶模式下,這裡的單用戶與windows下的安全模式類似,在單用戶模式下,只是啟動最基本的系統,網絡以及應用服務均不啟動。單用戶模式啟動完畢,系統會自動進入到命令行狀態下,然後直接執行命令“passwd”,接著敲回車,系統會提示輸入新的root密碼兩次,最後會看到修改密碼成功的提示,這樣就完成了root密碼的修改。如果需要正常啟動系統,現在只需輸入“init 3”,就進入了多用戶模式。用root用戶重新登錄系統,看看設置的新密碼是否生效。
在RHEL/Centos7.x版本之後,Linux的機制發生了較大變化,在系統引導方面,使用了grub2代替了之前的grub引導,init初始化程序也更換成了systemd初始化,隨之帶來的root密碼重置的方法也有所改變,,下面就介紹一下在Centos7.5版本中,忘記root密碼的處理方法,操作步驟如下:
1、 重啟系統,待linux系統啟動到grub2引導菜單時,找到當前系統引導選項,如果有多個可用內核,這裡就有多個引導選項,按e鍵,如下圖所示:
2、 按e鍵後,出現如下圖所示界面,通過方向鍵將光標放到linux16引導行所在行尾,然後添加以下內容:
init=/bin/sh
3、 添加完成,按鍵Ctrl+x啟動shell引導,最後進入單用戶模式。
4、 掛載根分區為可讀寫模式,執行如下命令:
mount -o remount,rw /
然後,就可以執行“passwd”命令重置密碼了,這裡有一點需要注意,如果系統中開啟有selinux,還需在根分區創建autorelabel文件,否則系統無法正常啟動,操作命令如下:
touch /.autorelabel
5、密碼修改完成後,直接執行reboot命令已經無效,此時需要輸入全路徑命令,操作如下:
exec /sbin/init
這樣就完成了密碼重置,正常登錄系統,查看密碼是否修改成功。
三、 linux系統無法啟動的解決辦法
導致linux無法啟動的原因有很多,常見的原因有如下幾種:
1、 文件系統配置不當,比如/etc/inittab文件、/etc/fstab文件等配置錯誤或丟失,導致系統錯誤,無法啟動。
2、 非法關機,導致root文件系統破壞,也就是linux根分區破壞,系統無法正常啟動
3、 Linux內核崩潰,從而無法啟動
4、 系統引導程序出現問題,比如grub丟失或者損壞,導致系統無法引導啟動。
5、 硬件故障,比如主板、電源、硬盤等出現問題,導致linux無法啟動。
從這些常見的故障可知,導致系統無法啟動的主要有兩個問題,硬件原因和操作系統原因,對於硬件出現的問題,只需通過更換硬件設備,即可解決,而對於操作系統出現的問題,雖然出現的問題可能千差萬別,不過在多數情況下都可以用相對簡單統一的一些方法來恢復系統,下面我們就針對上面提出的幾個問題,結合RHEL/Centos Linux系統環境,給出一些常用的、普遍的解決問題的方法。
3.1、/etc/fstab文件丟失,導致系統無法啟動
/etc/fstab文件存放了系統中文件系統的相關信息,如果正確的配置了該文件,那麼在linux啟動時,系統會讀取此文件,自動掛載linux的各個分區,如果此文件配置錯誤,或者丟失,就會導致系統無法啟動,具體的故障現象是在檢測mount partition時出現:
starting system logger
此後系統啟動就停止了。
針對這個問題,我們的第一思路就是想辦法恢復/etc/fstab這個文件的信息,只要恢復了此文件,系統就能自動掛載每個分區,正常啟動。可能很多讀者首先想到的是將系統切換到單用戶模式下,然後手動掛載分區,最後結合系統信息,重建/etc/fstab文件。
但是這種方法是行不通的,因為fatab文件丟失導致linux無法掛載任何一個分區,即使linux還能切換到單用戶下,那麼此時的系統也只是一個read-only的文件系統,無法向磁盤寫入任何信息。
我們介紹另外一個方法,就是利用linux rescue修復模式登錄系統,進而獲取分區和掛載點信息,重構/etc/fstab文件。
這裡以Centos6.9為例,其它版本方法類似,首先將系統第一章光盤放入光驅,設置BOIS從光驅啟動,這樣系統就從光驅引導,如下圖所示,選擇“Rescue installed system”一項,然後回車,系統開始引導進入rescue模式。
接著系統自動開始引導,進入下圖所示畫面:
這裡是選擇模式使用的語言,可以按照自己需要設定,我們這裡選擇“English“,然後按tab鍵,選中“ok”,回車進入下一步。
下面進入的是鍵盤選擇界面,如下圖所示,這裡選擇默認的“us”即可。
下面進入網絡配置界面,如下圖所示:
這裡是選擇是否啟用網絡,由於系統已經無法啟動,我們已經在linux系統上進行操作了,啟用網絡與否都無所謂。這裡選擇不啟用。
下面到了最關鍵的步驟了,如下圖所示,修復模式會自動將系統的所有分區掛載到/mnt/sysimage目錄下,選擇“Continue”,則修復環境進入到read-write狀態下,可以對分區進行讀寫操作,選擇“Read-Only”,修復環境進入到只讀模式,由於我們要重建fstab文件到/etc目錄下,因此選擇“Continue”進入可讀寫模式下。
下面是一個友情提示界面,如下圖所示,由於fstab文件丟失,修復模式找不到任何可掛載的分區,從這裡可知,修復模式在這裡也讀取/etc/fstab文件,回車,進入下一步。
下面是選擇下一步要執行的動作,如下圖所示,這裡選擇“shell Start shell”進入修復模式命令行。
最後,就進入了修復環境下,可以進行操作了。如下圖所示
上面詳細演示瞭如何進入linux的修復模式,其實很多情況下,linux無法啟動時,都可以通過這個方式登錄系統進行修復和更改操作。
下面是恢復/etc/fstab文件的詳細過程,首先查看一下系統分區情況,如下所示:
bash-4.1# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 25 200781 83 Linux
/dev/sda2 26 1300 10241437+ 83 Linux
/dev/sda3 1301 1682 3068415 83 Linux
/dev/sda4 1683 5221 28427017+ 5 Extended
/dev/sda5 1683 1873 1534176 83 Linux
/dev/sda6 1874 2064 1534176 83 Linux
/dev/sda7 2065 2255 1534176 83 Linux
/dev/sda8 2256 2382 1020096 83 Linux
/dev/sda9 2383 2484 819283+ 82 Linux swap / Solaris
/dev/sda10 2485 5221 21984921 83 Linux
因為分區並沒有損壞,通過fdisk命令可以查看到系統分區的完整信息,但是每個分區對應的label name信息我們還不知道,下面通過tune2fs命令查看每個分區對應的label name:
bash-4.1# tune2fs -l /dev/sda1 |grep mounted
Last mounted on: /boot
bash-4.1# tune2fs -l /dev/sda2 |grep mounted
Last mounted on: /usr
bash-4.1# tune2fs -l /dev/sda3 |grep mounted
Last mounted on: /
bash-4.1# tune2fs -l /dev/sda5 |grep mounted
Last mounted on: /var
bash-4.1# tune2fs -l /dev/sda6 |grep mounted
Last mounted on: /tmp
bash-4.1# tune2fs -l /dev/sda7 |grep mounted
Last mounted on: /home
bash-4.1# tune2fs -l /dev/sda8 |grep mounted
Last mounted on: /opt
bash-4.1# tune2fs -l /dev/sda10 |grep mounted
Last mounted on: /data
這樣,就得到了所有分區的掛載點信息,接下來就可以構造一個fstab文件了。
小技巧:可以參考其它系統中fstab文件的格式,結合本系統的分區和掛載點信息,構造出自己的fstab文件來。
由於fstab文件是存放在系統根目錄下的,因此需要掛載原來系統的根分區,從上面可知根分區對應的設備名為/dev/sda3,接著在修復模式創建的臨時根分區下創建一個
掛載點,然後掛載原來系統的根分區。操作過程如下所示:
bash-4.1# pwd
/
bash-4.1# mkdir temp
bash-4.1# mount /dev/sda3 /temp
bash-4.1# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev 515644 0 515644 0% /dev
/tmp/loop0 79872 79872 0 100% /mnt/runtime
/dev/sda3 2972268 259916 2558932 10% /temp
這樣以來,原有根分區的文件全部掛載到了/temp目錄下,接著就可以創建我們需要的fstab文件了。
重構好的fstab文件內容如下:
bash-4.1# cat /temp/etc/fstab
LABEL=/ / ext4 defaults 1 1
LABEL=/boot /boot ext4 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
LABEL=/home /home ext4 defaults 1 2
LABEL=/opt /opt ext4 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/data /data ext4 defaults 1 2
LABEL=/usr /usr ext4 defaults 1 2
LABEL=/var /var ext4 defaults 1 2
LABEL=SWAP-sda9 swap swap defaults 0 0
配置完畢,保存退出,然後重啟系統,看系統是否能正常啟動。
bash-4.1#reboot
3.2、CentOS下誤刪除/boot目錄修復方法
這個問題經常發生在新手、研發身上,誤刪除的原因很多,但是並不重要,作為專業背鍋俠,要的就是誤刪除後怎麼回覆,一起來看下這個現象吧,看下圖:
出現這個情況,可能的原因有:系統引導出現問題、/boot目錄誤刪除、grub配置錯誤。
不管是什麼原因,這裡給個終極方法,也就是一定能解決問題的方法,保證大家屢試不爽。
要解決這個問題,還是要用到一個centos的U盤鏡像或者光盤鏡像,通過系統鏡像進入rescue修復模式,然後就可以大展拳腳了。
下面看看如何在centos7.x版本下,進入rescue修復模式,然後修復系統引導。
首先通過系統鏡像盤進入系統引導模式,如下圖所示:
然後選擇Troubleshooting,回車進入下圖界面:
這裡選擇"Rescue a Centos system", 回車,進入如下界面:
這是進入rescue修復模式的幾個選項,跟centos6.x版本類似,這裡選擇數字1,進入可讀、寫模式。
等待片刻,即可進入下圖所示界面:
敲回車,進入命令行模式,然後執行chroot命令,如下圖所示:
這樣,就變更多了root目錄下,相當於進入到了真實系統環境下了。
接著,將系統鏡像掛載到任意一個目錄下,這裡掛載到/mnt下,掛載系統鏡像的目的是將系統鏡像作為yum源,然後安裝系統丟失的內核模塊,並安裝grub2引導程序。
bash-4.2# mount /dev/cdrom /mnt
下面開始創建一個yum源倉庫,用於從本地系統鏡像中讀取rpm包,進行內核模塊的安裝。如下圖所示:
重點來了,第一步是重新安裝內核,這裡使用yum 的reinstall命令,千萬別用install來安裝,執行如下命令:
bash-4.2# yum reinstall kernel
這樣,內核模塊安裝完成了,接下來,還需要重新安裝grub2,並重新生成 grub2 配置文件 grub.cfg,執行如下圖所示操作:
執行完成後,兩次執行exit命令退出後,系統會自動重啟,完成boot引導的修復,不出意外的話,系統已經可以暢通無阻的啟動了。
四、 Linux系統無響應(死機)問題分析
Linux服務器在長期運行後,難免出現無響應現象,俗稱“死機”。在系統死機後,屏幕一般會輸出故障信息,鍵盤失去響應,這種情況的常見處理辦法就是重啟系統,不過在重啟前,要重點關注下屏幕的輸出信息,因為其提示的可能是引起死機的主要原因,對解決問題是有很大幫助的。
其實還有另一個方法,就是通過串口直連線連接客戶機和服務器,將服務器的出錯詳細信息發送到客戶機上。
引起服務器死機的原因有很多,但主要有兩個方面:軟件問題和硬件問題。下面總結了造成Linux系統死機的常見原因和解決問題的思路:
1)系統硬件問題,主要是有SCSI卡、主板、RAID卡、HBA卡、網卡、硬盤等硬件設備導致的。在這種情況下需要定位硬件故障細節,通過更換硬件來解決問題。
2)外圍硬件問題,主要是網絡問題導致的。此時就需要檢查網絡設備、網絡參數等方面查找和解決問題。
3)軟件問題,主要是系統內核bug、應用軟件bug、驅動程序bug等。在這種情況下就需要從升級內核、修復程序bug、更新驅動程序等方面來解決問題。
4)系統設置問題:主要是系統參數設置不當導致,可以通過恢復系統到默認狀態,關閉防火牆等方面來解決問題。
五、其它故障的一般解決方案
如果是linux的引導程序出現問題,那麼也可以通過光盤引導或U盤引導的方式進入linux rescue模式,然後修改對應的引導程序或者重新安裝引導程序。
如果linux內核崩潰或者丟失,同樣可以先進入linux rescue模式下,然後加載root分區,最後重新編譯內核。
如果出現了最壞的情況,文件系統破壞嚴重,同時內核也崩潰,那麼此時重新安裝系統反而比較容易,在這種情況下可以先將linux上有用的數據和文件備份轉移到其它設備,然後對整個文件系統進行全新安裝。
在這裡我們不可能對每個出現的問題,都給出詳細的解決方案,問題都是千差萬別的,每個問題的處理都不盡相同,本專欄要傳授給大家的是當linux系統出現問題後,解決問題的一般思路和通用策略,熟練掌握了這些技巧,處理任何linux問題都能遊刃有餘。
閱讀更多 互聯網螞蟻哥 的文章