我们所有的重要数据都位于一个或另一个类型的文件系统中,文件系统问题必然会发生。在Linux上,我们可以使用fsck命令查找并修复文件系统错误。
文件系统是软件
文件系统是计算机最关键的组件之一。如果没有文件系统,计算机就无法在硬盘上存储任何数据,无论硬盘是旋转机械盘还是固态硬盘。事实上,必须先创建文件系统,然后才能在硬盘上安装操作系统。必须有一些操作系统文件可以存储在其中。因此,在安装过程中会创建一个文件系统。
文件系统由软件创建,由软件写入,并由软件读取。正如你所知,所有复杂的软件都有bug。我们的数据对我们来说至关重要,因此我们非常信任文件系统以及创建和使用它们的软件。如果出现问题,我们可能会失去对部分文件系统甚至整个分区的访问。
现代日志文件系统更善于处理突然断电或系统崩溃可能导致的问题。他们很强壮,但不是无敌的。如果他们的内部表被打乱,他们可能会丢失每个文件在驱动器上的位置、大小、名称以及设置的文件权限。
fsck命令允许您检查文件系统是否正常。如果它发现任何问题,通常也可以为您解决。
做飞行前检查
使用fsck需要sudo权限。任何可以对文件系统进行更改的命令都需要谨慎对待,并仅限于那些知道自己在做什么的人。
飞行员不会跳上飞机,启动飞机,然后飞到那边淡蓝色的地方。他们做飞行前检查。否则,风险太大。这是一个好习惯。在使用fsck之前,您需要确保在正确的驱动器上使用它。所以在对fsck做任何事情之前,我们要做一点侦察。
我们将从fdisk开始,并将其导入较少的。我们不是在询问有关特定分区的信息。通过使用-l(list)选项,fdisk列出在“/proc/partitions”文件中找到的所有设备上的分区表(如果存在)。
sudo fdisk -l | less
我们可以看到/dev/sda和/dev/sdb的条目。您可以滚动文件以查看计算机上可能存在的任何其他条目。
/dev/sda上的分区列为/dev/sda1、/dev/sda2和/dev/sda3。所以我们在第一个驱动器上有三个分区。通过使用parted命令,我们可以看到更多的信息。我们将使用“打印”选项在终端窗口中显示分区表。
sudo parted /dev/sda 'print'
这次我们得到了一些额外的信息,包括每个分区上的文件系统类型。
Model: ATA VBOX HARDDISK (scsi) Disk /dev/sda: 34.4GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 540MB 538MB fat32 EFI System Partition boot, esp 3 540MB 34.4GB 33.8GB ext4
这台测试计算机中有三个驱动器。以下是其他两个驱动器/dev/sdb和/dev/sdc的结果。请注意,这些文件系统没有“名称”字段。
sudo parted /dev/sdb 'print'
Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdb: 21.5GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 21.5GB 21.5GB primary ext4
sudo parted /dev/sdc 'print'
Model: ATA VBOX HARDDISK (scsi) Disk /dev/sdc: 21.5GB Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 21.5GB 21.5GB primary ext3
第二个和第三个驱动器恰好大小相同,并且每个驱动器都有一个分区。但是第二个驱动器上的文件系统是ext4,第三个驱动器上文件系统是旧的ext3。
我们将一个分区标识符传递给fsck,它检查该分区上的文件系统。但是我们不能在装载的文件系统上运行fsck。我们需要卸载驱动器。要做到这一点,我们需要知道分区以及文件系统所在的装载点。
我们可以使用df命令轻松地找到这一点。
df /dev/sdb1
df /dev/sdc1
使用fsck命令
我们已经得到了所需的所有信息。我们要做的第一件事是卸载要检查的文件系统。我们将在/dev/sdb的第一个也是唯一一个分区上处理文件系统,即/dev/sdb1。我们之前看到这是一个ext4文件系统,它安装在“/run/mount/dave/sata2”
我们将使用umount命令。注意“umount”中没有“n”
sudo umount /run/mount/dave/sata2
没有消息就是好消息。如果您默默地返回到命令提示符,我们就可以开始了。
sudo fsck /dev/sdb1
此文件系统报告为干净。这意味着文件系统报告它没有错误或问题。不会自动执行更深入的文件系统检查。我们还可以查看fsck返回到shell的返回代码。
echo $?
返回值为零表示没有错误。可能的返回代码有:
- 0:无错误
- 1:已更正文件系统错误
- 2:应重新启动系统
- 4:文件系统错误未更正
- 8:操作错误
- 16:用法或语法错误
- 32:用户请求取消了检查
- 128:共享库错误
尽管文件系统报告为干净,但我们可以使用-f(force)选项强制执行文件系统检查。
sudo fsck /dev/sdb1 -f
这一次,检查需要更长的时间才能完成,但它会对文件系统进行更彻底的测试。我们的文件系统确实很干净,没有报告任何错误。如果在测试过程中发现问题,系统会提示您让fsck解决问题或忽略错误。
完成测试后,需要重新装载文件系统。最简单的方法是将mount与-a(all)选项一起使用。这将检查“/etc/fstab”中的文件系统列表,并确保它们都按照正常引导后的方式安装。
sudo mount -a
注意,我们不需要告诉fsck分区上的文件系统类型;该实用程序通过检查文件系统来确定。这意味着我们可以使用与我们在/dev/sdb1(ext4分区)上使用的命令完全相同的命令,对测试PC上的ext3文件系统/dev/sdc1强制执行文件系统检查。
sudo fsck /dev/sdc1 -f
您可能不想直接修复文件系统。你最好三思而后行。您可以要求fsck不要提供修复任何问题,只向终端窗口报告问题。-N(干运行)选项仅执行以下操作:
sudo fsck -N /dev/sdb1
与此相反的是,告诉fsck如果发现任何错误,不要麻烦提示,只需继续并修复它们。为此,请使用-y(无提示)选项。
sudo fsck -y /dev/sdb1
在根分区上使用fsck
不能在已安装的分区上使用fsck,但要启动计算机,必须安装根分区。那么我们如何在根分区上运行fsck?答案是中断引导过程并以恢复模式运行fsck。
在计算机启动时,按住“Shift”键。如果计时正确,就不会启动到Linux。引导过程将在黑白菜单处停止。本文使用的测试机器运行的是Ubuntu,但其他发行版的菜单类型相同,尽管外观可能有所不同。屏幕截图中显示“Ubuntu”的地方将显示您的发行版名称。
用“向上箭头”和“向下箭头”键移动高亮显示栏,以选择“Ubuntu的高级选项”菜单项。点击“Enter”进入下一个屏幕。
选择以“(recoverymode)”结尾的选项。在我们的示例中,它是“Ubuntu,with Linux 5.11.0-20-generic(recoverymmode)”。点击“Enter”键。
您将看到恢复菜单。选择“fsck check all file system”(fsck检查所有文件系统),然后按“Tab”键将突出显示移动到“OK”(确定)按钮。按“Enter”
您将看到一个通知,即根分区将与“/etc/fstab”文件中定义的任何其他分区一起装入。
按“Tab”键将突出显示移动到“Yes”按钮,然后按“Enter”
您将看到fsck在交互模式下运行。如果有问题,系统会提示您让fsck修复或忽略它们。检查文件系统后,您将再次看到恢复菜单。
选择“resume”选项,按“Tab”键将突出显示移动到“Ok”按钮,然后按“Enter”。引导过程将继续,您将引导到Linux。
恢复模式引导可能会影响某些驱动程序,因此最好在引导到Linux时再次重新启动。这将确保您的计算机以其标准方式运行。
当事情出错时
安全网是有原因的。了解fsck命令。如果有一天需要在愤怒中使用它,你会很高兴提前熟悉了自己。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts