如何掃描和修復(fù) Linux 磁盤錯誤
在本文中,將學(xué)習(xí)如何使用 fsck 和 xfs_repair 命令修復(fù) Linux 磁盤錯誤。
什么是FSCK?
fsck(文件系統(tǒng)一致性檢查)是用于檢查Linux操作系統(tǒng)文件系統(tǒng)一致性的工具。
列出 Linux 磁盤分區(qū)和類型:
首先,需要確定 Linux 系統(tǒng)的磁盤分區(qū)、它們各自的文件系統(tǒng)以及掛載點。下面使用lsblk命令列出磁盤明、文件系統(tǒng)類型、掛載點:
[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 類型分區(qū)的最后一次掃描時間。
[root@localhost ~]# tune2fs -l /dev/nvme0n1p1 |grep checked
Last checked: Wed Sep 1 15:42:11 2021
掃描和修復(fù) Ext4 類型的磁盤分區(qū)
掃描 Linux 磁盤分區(qū),可以使用 fsck(文件系統(tǒng)一致性檢查)命令。但是在檢查和修復(fù)它之前,需要卸載該分區(qū)。下面實例中,我們卸載的是/boot分區(qū)。
[root@localhost ~]# umount /dev/nvme0n1p1
卸載成功后,使用fsck.ext4檢查/dev/nvme0n1p1分區(qū)
[root@localhost ~]# fsck.ext4 /dev/nvme0n1p1
e2fsck 1.44.3 (10-July-2018)
/dev/nvme0n1p1: files, 55546/262144 blocks
檢查并修復(fù)您的 Linux 磁盤后,在其各自的掛載點再次掛載分區(qū)。執(zhí)行以下命令用來掛載 /etc/fstab 配置文件中列出的所有磁盤分區(qū)。
[root@localhost ~]# mount -a
在 Linux 啟動時啟用 Ext4 磁盤分區(qū)掃描
在系統(tǒng)啟動時啟用磁盤檢查。你必須修改該磁盤分區(qū)的 Mount Count 參數(shù)。
[root@localhost ~]# tune2fs -c 1 /dev/nvme0n1p1
tune2fs 1.44.3 (10-July-2018)
Setting maximal mount count to 1
重啟系統(tǒng)之后,fsck命令現(xiàn)在會在啟動時檢查你的 Ext4 磁盤分區(qū)。
[root@localhost ~]# reboot
重新啟動后,獲取磁盤分區(qū)的Last Checked值,現(xiàn)在它會顯示 Linux 上次啟動的時間。
[root@localhost ~]# tune2fs -l /dev/nvme0n1p1 |grep checked
Last checked: Tue Sep 14 11:08:11 2021
恢復(fù)Mount Count 參數(shù)的默認(rèn)值,否則它會在每次系統(tǒng)啟動時繼續(xù)執(zhí)行磁盤掃描。
[root@localhost ~]# tune2fs -c -1 /dev/nvme0n1p1
tune2fs 1.44.3 (10-July-2018)
Setting maximal mount count to -1
什么是 XFS_REPAIR?
xfs_repair 實用程序具有高度可擴(kuò)展性,旨在有效修復(fù)具有許多 inode 且非常大的文件系統(tǒng)。與其他 Linux 文件系統(tǒng)不同,xfs_repair 不會在啟動時運行,即使 XFS 文件系統(tǒng)沒有完全卸載。如果發(fā)生不干凈的卸載,xfs_repair 只會在掛載時重放日志,確保文件系統(tǒng)一致。
掃描和修復(fù) XFS 類型的磁盤分區(qū)
XFS 類型的磁盤分區(qū)有自己的一組命令,與 Ext4 有點不同。在檢查其一致性之前,必須卸載 XFS 磁盤分區(qū)。
[root@localhost ~]# umount /dev/sda1
我們有 xfs_repair 命令用于檢查和修復(fù)磁盤錯誤。使用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.
上述命令只執(zhí)行磁盤檢查,不嘗試修復(fù)任何錯誤?,F(xiàn)在,執(zhí)行不帶 -n 選項的 xfs_repair 命令,它將執(zhí)行 Linux 磁盤分區(qū)的掃描和修復(fù)。
[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
下面誠信掛載分區(qū)
[root@localhost ~]# mount /dev/sda1 /data/
在 Linux 啟動時啟用 XFS 磁盤分區(qū)掃描
在某些情況下,如果 Linux 操作系統(tǒng)正在使用磁盤分區(qū),則無法卸載磁盤分區(qū)。出于這個原因,您可能不得不將磁盤檢查推遲到下一次系統(tǒng)啟動。要使 xfs_repair 命令能夠在 Linux 啟動時運行,請在 GRUB 菜單內(nèi)核命令的末尾添加“fsck.mode=force fsck.repair=yes”。查看系統(tǒng)日志以驗證磁盤修復(fù)命令的執(zhí)行情況。
[root@localhost ~]# journalctl |grep systemd-fsck
要在啟動時永久啟用磁盤檢查,您必須在 GRUB 配置文件中添加“fsck.mode=force fsck.repair=yes”。下面編輯grub配置文件,找到 GRUB_CMDLINE_LINUX 參數(shù)并在行尾附加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
根據(jù)新參數(shù)重新生成 GRUB 菜單配置。
[root@localhost ~]# grub2-mkconfig
然后重啟系統(tǒng):
# reboot
總 結(jié)
到目前為止已經(jīng)成功掃描和修復(fù)XFS、Ext4文件系統(tǒng)了。