8.8 fsck:檢查並修復Linux文件系統
fsck命令用於檢查並修復文件系統中的錯誤,即針對有問題的系統或磁盤進行修復,類似的命令還有e2fsck命令。有關fsck的使用需要特別注意的是:
1)文件系統必須是卸載狀態,否則可能會出現故障。
2)不要對正常的分區使用fsck,在不加參數的情況下,fsck會根據/etc/fstab進行文件系統檢查,這相當於fsck -As參數的功能。
1)在fsck命令及后面的選項和文件系統里,每個元素之間都至少要有一個空格。
2)filesys可以是一個設備名(例如:/dev/sdal、/dev/sdb2)、一個掛載點(例如:/、/usr、/home)或一個文件系統的磁盤標簽,也可以是UUID指定符(例如:UUID=8868abf6-88c5-4a83-98b8-bfc24057f7bd或LABEL=root)。
fsck 命令的參數選項及說明
-a 自動修復文件系統,不詢問任何問題
-s 按順序檢查多個文件系統
-t 指定要檢查的分區的文件系統類型
-A 依服/etc/fstab配置文件的內容,檢查文件內所列的全部文件系統
-N 不執行指令,僅列出實際執行會進行的動作
必須卸載文件系統后才能對其進行檢查,否則可能會出現錯誤。平時沒有必要使用這個命令檢查磁盤,只有當系統開機顯示磁盤錯誤時,才需要執行。
系統開機通過fsck自檢。
Linux在開機過程中系統會自動調用fsck命令對需要自檢的磁盤進行自檢(如圖8-3所示)。

系統開機之所以會通過fsck自檢,就是因為系統開機過程中會優先讀取/etc/fstab文件,當最后一列設置為1或2時,這個磁盤在開機時就會調用fsck進行自檢,fstab的文件(man fstab看幫助)信息如下:
[root@cs6 ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sun May 5 23:10:33 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/vg_cs6-lv_root / ext4 defaults 1 1 UUID=b7b58ad5-f612-4132-9e1f-5d55af6a9a58 /boot ext4 defaults 1 2 /dev/mapper/vg_cs6-lv_swap swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/sdb1 /mnt ext4 defaults 0 0
提示:管理員增加硬盤規划分區,一般最后一列都設置為0,即開機過程中不對磁盤檢查,如果真有問題,可以在啟動系統后人為進行檢查。
Linux 斷電后重啟故障修復案例。
當Linux系統遭遇突然斷電等非正常關機操作時,很容易導致文件系統數據損壞,造成系統不能重新啟動,此時,屏幕出現的提示可能是如下內容:

此時根據系統提示輸入root用戶的密碼,注意而不是直接按Control-D繼續,會再重啟。
當輸入正確的密碼之后,正常會出現下面的提示:
(Repair filesystem)1
此時就可以輸入fsck或者fsck -A對磁盤進行修復檢查,執行后可能出現一堆詢問,按yes即可。
(Repair filesystem) 1 # fsck -A #<==可能會等種一段時間或 fsck
(Repair filesystem) 2 # <=修復完畢會返回到這個提示符,此時就可以試着重啟系統,看故障是否修復了。
1)除了按照開機的提示進行修復外,也可以利用系統盤進入教援模式或單用戶模式對系統故障進行修復。
2)千萬不要在開機正常工作的情況下執行fsck來檢查磁盤,因為這樣有可能會導致正常的磁盤發生故障。
3)/etc/fstab中的最后一列數字為1或2時,當系統開機時就會讀取fsck對這些系統磁盤進行自檢。
4)不要在已經掛載的文件系統上執行fsck等磁盤修復命令,因為這樣可能會導致故障。
8.9 dd:轉換或復制文件
dd命令具有復制文件、轉換文件和格式化文本的功能。
dd命令的參數選項及說明
if=<輸入文件> 從指定文件中讀取,全稱為input file of=<輸出文件> 寫入到指定文件,全稱為output file bs=<字節數> 一次讀寫的字節數,全稱為block size count=<塊數> 指定復制block塊的個數 ibs=<字節數> 一次讀的字節,默認是512 obs=<字節數> 一次寫的字節,默認是512 conv=<格式> 格式轉換 ucase把字母由小寫轉換為大寫 lcase把字母由大寫轉換為小寫
將/dev/sda1分區復制(備份)到文件中
[root@cs6 ~]# dd if=/dev/sdb1 of=dev_sdb1.img #<==使用if從/dev/sdb1中讀取數據,使用of指定輸出到當前日錄的dev_sdb1.img。 835317+0 records in 835317+0 records out 427682304 bytes (428 MB) copied, 13.3079 s, 32.1 MB/s [root@cs6 ~]# ll -h dev_sdb1.img -rw-r--r--. 1 root root 408M May 11 15:20 dev_sdb1.img
刪除/dev/sdb1分區數據
下面的實驗很危險,請使用虛擬機操作,並提前做好快照。
從/dev/zero設備讀取數據,寫入或覆蓋/dev/sdb1的數據:
[root@cs6 ~]# dd if=/dev/zero of=/dev/sdb1 #<==/dev/zero是一個特殊的設備,相當於什么都沒有。 dd: writing to `/dev/sdb1': No space left on device #<==提示寫滿了。 835318+0 records in 835317+0 records out 427682304 bytes (428 MB) copied, 1.77188 s, 241 MB/s #/dev/zero是0字符設備,可產生連續不斷的特殊數據流,生成的文件為特殊格式的數據文件(二進制)。 [root@cs6 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_cs6-lv_root 26G 1.3G 24G 5% / tmpfs 931M 0 931M 0% /dev/shm /dev/sda1 477M 28M 424M 7% /boot /dev/sdb1 16Z 16Z 389M 100% /mnt/data1 [root@cs6 ~]# ls /mnt/data1 可以看到,上面的/mnt/data1分區被清空了,此時系統已經遭到破壞。這種情況千萬不要重啟系統,/mnt/data1分區受損是無法啟動系統的,應該繼續下面的恢復操作。
用范例8-19的備份恢復范例8-20刪除的分區數據。
[root@cs6 ~]# dd if=dev_sdb1.img of=/dev/sdb1 835317+0 records in 835317+0 records out 427682304 bytes (428 MB) copied, 1.6525 s, 259 MB/s [root@cs6 ~]# ls /mnt/data1 1.html 2.html 3.html 4.html 5.html lost+found
要特別注意if、of參數,如果位置寫反了,就會出大問題。
生成任意大小的測試文件
[root@cs6 ~]# dd if=/dev/zero of=test.data bs=1M count=2 #<= 從/dev/zero讀取數據寫入到test,dita,生成文件test,data的大小為bs*count=1M*2=2M; 2+0 records in 2+0 records out 2097152 bytes (2.1 MB) copied, 0.11628 s, 18.0 MB/s [root@cs6 ~]# ll -h test.data -rw-r--r--. 1 root root 2.0M May 11 15:27 test.data
制作Linux系統的ISO鏡像
在Windows系統里制作光盤的ISO鏡像,還需要安裝其他軟件。但在Linux系統中只需要dd命令就足夠了。
在做實驗時,如果需要將CentOS的完整系統鏡像上傳到Linux系統中,一般使用winSCP或Xshell等工具,但這是通過網絡傳輸的方式,上傳速度受限於網絡帶寬。此時可以使用dd命令,將從光驅讀取的鏡像復制到系統中,相當於光驅與磁盤對拷。
將光盤放入光驅之后,需要確保光驅可以正常讀取,然后執行如下命令即可實現將光盤復制到Linux硬盤的操作:
[root@cs6 ~]# ls /dev/cdrom /dev/cdrom [root@cs6 ~]# dd if=/dev/cdrom of=centos6_10.iso 831488+0 records in 831488+0 records out 425721856 bytes (426 MB) copied, 49.5612 s, 8.6 MB/s #<==傳輸速度取決於光驅與磁盤之間的讀寫速度,可以看到這種方式的傳輸速度遠遠大於網絡傳輸速度。 [root@cs6 ~]# ll -h centos6_10.iso -rw-r--r--. 1 root root 406M May 11 15:32 centos6_10.iso
使用dd復制文件並進行格式轉換的例子。
[root@cs6 ~]# cat test.txt I love linux www.wenyule.top [root@cs6 ~]# dd if=test.txt conv=ucase of=test.test_u 0+1 records in 0+1 records out 29 bytes (29 B) copied, 0.00036375 s, 79.7 kB/s [root@cs6 ~]# cat test.test_u I LOVE LINUX WWW.WENYULE.TOP