如何掃描和修復 Linux 磁盤錯誤
在本文中,將學習如何使用 fsck 和 xfs_repair 命令修復 Linux 磁盤錯誤。
什么是FSCK?
fsck(文件系統一致性檢查)是用于檢查Linux操作系統文件系統一致性的工具。
列出 Linux 磁盤分區和類型:
首先,需要確定 Linux 系統的磁盤分區、它們各自的文件系統以及掛載點。下面使用lsblk命令列出磁盤明、文件系統類型、掛載點:
[root@localhost ~]# lsblk -o NAME,FSTYPE,MOUNTPOINT
NAME FSTYPE MOUNTPOINT
sda
sdb
sdc
sdd
sr0 iso9660
nvme0n1
├─nvme0n1p1 ext4 /boot
└─nvme0n1p2 LVM2_member
├─cl-root xfs /
└─cl-swap swap [SWAP]
獲取 Linux 磁盤的上次掃描時間
你可以使用下命令找到 Ext2,Ext3,Ext4 類型分區的最后一次掃描時間。
[root@localhost ~]# tune2fs -l /dev/nvme0n1p1 |grep checked
Last checked: Wed Sep 1 15:42:11 2021
掃描和修復 Ext4 類型的磁盤分區
掃描 Linux 磁盤分區,可以使用 fsck(文件系統一致性檢查)命令。但是在檢查和修復它之前,需要卸載該分區。下面實例中,我們卸載的是/boot分區。
[root@localhost ~]# umount /dev/nvme0n1p1
卸載成功后,使用fsck.ext4檢查/dev/nvme0n1p1分區
[root@localhost ~]# fsck.ext4 /dev/nvme0n1p1
e2fsck 1.44.3 (10-July-2018)
/dev/nvme0n1p1: files, 55546/262144 blocks
檢查并修復您的 Linux 磁盤后,在其各自的掛載點再次掛載分區。執行以下命令用來掛載 /etc/fstab 配置文件中列出的所有磁盤分區。
[root@localhost ~]# mount -a
在 Linux 啟動時啟用 Ext4 磁盤分區掃描
在系統啟動時啟用磁盤檢查。你必須修改該磁盤分區的 Mount Count 參數。
[root@localhost ~]# tune2fs -c 1 /dev/nvme0n1p1
tune2fs 1.44.3 (10-July-2018)
Setting maximal mount count to 1
重啟系統之后,fsck命令現在會在啟動時檢查你的 Ext4 磁盤分區。
[root@localhost ~]# reboot
重新啟動后,獲取磁盤分區的Last Checked值,現在它會顯示 Linux 上次啟動的時間。
[root@localhost ~]# tune2fs -l /dev/nvme0n1p1 |grep checked
Last checked: Tue Sep 14 11:08:11 2021
恢復Mount Count 參數的默認值,否則它會在每次系統啟動時繼續執行磁盤掃描。
[root@localhost ~]# tune2fs -c -1 /dev/nvme0n1p1
tune2fs 1.44.3 (10-July-2018)
Setting maximal mount count to -1
什么是 XFS_REPAIR?
xfs_repair 實用程序具有高度可擴展性,旨在有效修復具有許多 inode 且非常大的文件系統。與其他 Linux 文件系統不同,xfs_repair 不會在啟動時運行,即使 XFS 文件系統沒有完全卸載。如果發生不干凈的卸載,xfs_repair 只會在掛載時重放日志,確保文件系統一致。
掃描和修復 XFS 類型的磁盤分區
XFS 類型的磁盤分區有自己的一組命令,與 Ext4 有點不同。在檢查其一致性之前,必須卸載 XFS 磁盤分區。
[root@localhost ~]# umount /dev/sda1
我們有 xfs_repair 命令用于檢查和修復磁盤錯誤。使用xfs_repair 命令的-n選項來檢查磁盤錯誤。
[root@localhost ~]# xfs_repair -n /dev/sda1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan (but don't clear) agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
No modify flag set, skipping phase 5
Phase 6 - check inode connectivity...
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify link counts...
No modify flag set, skipping filesystem flush and exiting.
上述命令只執行磁盤檢查,不嘗試修復任何錯誤?,F在,執行不帶 -n 選項的 xfs_repair 命令,它將執行 Linux 磁盤分區的掃描和修復。
[root@localhost ~]# xfs_repair /dev/sda1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan and clear agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
Phase 5 - rebuild AG headers and trees...
- reset superblock...
Phase 6 - check inode connectivity...
- resetting contents of realtime bitmap and summary inodes
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done
下面誠信掛載分區
[root@localhost ~]# mount /dev/sda1 /data/
在 Linux 啟動時啟用 XFS 磁盤分區掃描
在某些情況下,如果 Linux 操作系統正在使用磁盤分區,則無法卸載磁盤分區。出于這個原因,您可能不得不將磁盤檢查推遲到下一次系統啟動。要使 xfs_repair 命令能夠在 Linux 啟動時運行,請在 GRUB 菜單內核命令的末尾添加“fsck.mode=force fsck.repair=yes”。查看系統日志以驗證磁盤修復命令的執行情況。
[root@localhost ~]# journalctl |grep systemd-fsck
要在啟動時永久啟用磁盤檢查,您必須在 GRUB 配置文件中添加“fsck.mode=force fsck.repair=yes”。下面編輯grub配置文件,找到 GRUB_CMDLINE_LINUX 參數并在行尾附加fsck.mode=force fsck.repair=yes。
[root@localhost ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap fsck.mode=force fsck.repair=yes"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
根據新參數重新生成 GRUB 菜單配置。
[root@localhost ~]# grub2-mkconfig
然后重啟系統:
# reboot
總 結
到目前為止已經成功掃描和修復XFS、Ext4文件系統了。