我应该怎么做才能在启动时强制进行根文件系统检查(以及可选的修复)?

Lin*_*eak 15 linux ext4 fsck

昨天,我们的一台计算机掉线了,grub或者说老实说,当我们打开机器时,我不确定它是什么外壳。

它表明由于不一致,它无法挂载根文件系统或某种意义上的东西。

我跑了,我相信:

fsck -fy /dev/sda2
Run Code Online (Sandbox Code Playgroud)

重新启动,问题消失了。

问题部分来了:

我已经在她的 root 的 crontab 中:

@reboot /home/ruzena/Development/bash/fs-check.sh
Run Code Online (Sandbox Code Playgroud)

而脚本包含:

#!/bin/bash
touch /forcefsck
Run Code Online (Sandbox Code Playgroud)

想一想,我不知道,为什么我为这么短的命令创建了脚本文件,但无论如何......

此外,在文件中:

/etc/default/rcS
Run Code Online (Sandbox Code Playgroud)

我已经定义:

FSCKFIX=yes
Run Code Online (Sandbox Code Playgroud)

所以我不明白。怎么会出现这种情况?


我应该怎么做才能在启动时强制进行根文件系统检查(以及可选的修复)?

或者这两件事是我能做的最大的事情吗?

操作系统: Linux Mint 18.x Cinnamon 64 位。

fstab

cat /etc/fstab | grep ext4
Run Code Online (Sandbox Code Playgroud)

显示:

UUID=a121371e-eb12-43a0-a5ae-11af58ad09f4    /    ext4    errors=remount-ro    0    1
Run Code Online (Sandbox Code Playgroud)

grub

fsck.mode=force
Run Code Online (Sandbox Code Playgroud)

已经添加到grub配置中。

jc_*_*c__ 17

ext4 引导期间的文件系统检查

在操作系统上测试:虚拟机中的 Linux Mint 18.x

基本信息

/etc/fstabfsck订单作为最后(第 6)列,例如:

<file system>    <mount point>    <type>    <options>    <dump>    <fsck>
UUID=2fbcf5e7-1234-abcd-88e8-a72d15580c99 / ext4 errors=remount-ro 0 1
Run Code Online (Sandbox Code Playgroud)

FSCKFIX=yes 变量 /etc/default/rcS

这会将 fsck 更改为自动修复,但不会强制进行 fsck 检查。

来自man rcS

FSCKFIX
    When  the  root  and all other file systems are checked, fsck is
    invoked with the -a option which means "autorepair".   If  there
    are  major  inconsistencies then the fsck process will bail out.
    The system will print a  message  asking  the  administrator  to
    repair  the  file  system manually and will present a root shell
    prompt (actually a sulogin prompt) on the console.  Setting this
    option  to  yes  causes  the fsck commands to be run with the -y
    option instead of the -a option.  This will tell fsck always  to
    repair the file systems without asking for permission.
Run Code Online (Sandbox Code Playgroud)

man tune2fs

If you are using journaling on your filesystem, your filesystem
will never be marked dirty, so it will not normally be checked.
Run Code Online (Sandbox Code Playgroud)

从...开始

设置如下

FSCKFIX=yes
Run Code Online (Sandbox Code Playgroud)

在文件中

/etc/default/rcS
Run Code Online (Sandbox Code Playgroud)

检查并注意上次检查 fs 时:

sudo tune2fs -l /dev/sda1 | grep "Last checked"
Run Code Online (Sandbox Code Playgroud)

这两个选项不起作用

  1. -F(强制fsck重启)参数传递给shutdown

    shutdown -rF now
    
    Run Code Online (Sandbox Code Playgroud)

    不; 见:man shutdown

  2. 添加/forcefsck空文件:

    touch /forcefsck
    
    Run Code Online (Sandbox Code Playgroud)

    这些脚本似乎使用这个:

    /etc/init.d/checkfs.sh
    /etc/init.d/checkroot.sh
    
    Run Code Online (Sandbox Code Playgroud)

    根本不是在重新启动工作,但该文件已被删除。

    经核实:

    sudo tune2fs -l /dev/sda1 | grep "Last checked"
    sudo less /var/log/fsck/checkfs
    sudo less /var/log/fsck/checkroot
    
    Run Code Online (Sandbox Code Playgroud)

    这些似乎是init脚本的日志。

我再说一遍,这两个选项不起作用!


这两种方法都有效

  1. systemd-fsck内核启动开关

    编辑主grub配置文件:

    sudoedit /etc/default/grub
    
    Run Code Online (Sandbox Code Playgroud)
    GRUB_CMDLINE_LINUX="fsck.mode=force"
    
    Run Code Online (Sandbox Code Playgroud)
    sudo update-grub
    sudo reboot
    
    Run Code Online (Sandbox Code Playgroud)

    这确实进行了文件系统检查,并通过以下方式进行了验证:

    sudo tune2fs -l /dev/sda1 | grep "Last checked"
    
    Run Code Online (Sandbox Code Playgroud)

    注意:这确实进行了检查,但要强制修复,您需要指定fsck.repair="preen", 或fsck.repair="yes"

  2. tune2fs做之前设置文件系统安装数量fsckman tune2fs

    tune2fs' info is kept in the file system superblock
    
    Run Code Online (Sandbox Code Playgroud)

    -c switch 设置检查 fs 之前挂载 fs 的次数。

    sudo tune2fs -c 1 /dev/sda1
    
    Run Code Online (Sandbox Code Playgroud)

    验证:

    sudo tune2fs -l /dev/sda1
    
    Run Code Online (Sandbox Code Playgroud)

    DID已通过以下方式进行验证:

    sudo tune2fs -l /dev/sda1 | grep "Last checked"
    
    Run Code Online (Sandbox Code Playgroud)

概括

fsck在 Linux Mint 18.x 上的每次启动时强制使用 a,请使用tune2fs, 或fsck.mode=force,以及可选的fsck.repair=preen/ fsck.repair=yes,内核命令行开关。


Lin*_*eak 6

对现有答案的进一步调查和更新

我现在只是想检查一下,上面的内容是否仍然适用于基于 Ubuntu 20.04/22.04-LTS 的系统(直接在 Linux Mint 20/21 Cinnamon amd64 桌面和 Ubuntu MATE 20.04/22.04 amd64 桌面上测试),我发现了一些首先,让我们从文件系统检查间隔开始(我以 root 身份运行所有命令(正如您可能~#在命令前面注意到的那样):


文件系统检查间隔

~# LC_ALL=C tune2fs -l /dev/nvme0n1p2 | grep 'Check interval'

Check interval:           0 (<none>)
Run Code Online (Sandbox Code Playgroud)

嗯,这是出乎意料的。我以为我们已经解决了这个问题,但修复起来很容易。请注意,它作为参数的数字默认以天为单位,因此请务必使用 1s(1 秒)而不是 1,这意味着 1 天(86400 秒):

~# LC_ALL=C tune2fs -i 1s /dev/nvme0n1p2

tune2fs 1.45.5 (07-Jan-2020)
Setting interval between checks to 1 seconds
Run Code Online (Sandbox Code Playgroud)

现在,如果我们重复上述检查,我们会得到:

Check interval:           1 (0:00:01)
Run Code Online (Sandbox Code Playgroud)

当然,这并不意味着每秒都会检查文件系统。相反,实际上它将强制对每个文件系统挂载进行文件系统检查。(因为没有办法在一秒钟内启动任何系统两次。)


检查前文件系统最大挂载数

默认设置:

~# LC_ALL=C tune2fs -l /dev/nvme0n1p2 | grep 'Maximum mount count'

Maximum mount count:      -1
Run Code Online (Sandbox Code Playgroud)

此设置调整检查文件系统之前需要安装的次数。原答案中写的没问题:

~# LC_ALL=C tune2fs -c 1 /dev/nvme0n1p2

tune2fs 1.45.5 (07-Jan-2020)
Setting maximal mount count to 1
Run Code Online (Sandbox Code Playgroud)

只需确保您不使用 0 或 -1,因为它会被忽略。

---

两者结合 - 推荐方式

这里您只需更改磁盘名称(例如sdavdanvme0n1等)和分区号:

首先,我们通过以下方式了解当前状态:

partition=/dev/nvme0n1p2; LC_ALL=C tune2fs -l $partition | grep -E 'Check\ interval|Maximum\ mount\ count'
Run Code Online (Sandbox Code Playgroud)

=

Maximum mount count:      -1
Check interval:           0 (<none>)
Run Code Online (Sandbox Code Playgroud)

之后,我们设置这些值,以便在每次启动时检查文件系统:

partition=/dev/nvme0n1p2; LC_ALL=C tune2fs -i 1s -c 1 $partition 2>&1 | grep Setting
Run Code Online (Sandbox Code Playgroud)

=

Setting maximal mount count to 1
Setting interval between checks to 1 seconds
Run Code Online (Sandbox Code Playgroud)

最后,让我们使用相同的第一个命令查看新状态:

partition=/dev/nvme0n1p2; LC_ALL=C tune2fs -l $partition | grep -E 'Check\ interval|Maximum\ mount\ count'
Run Code Online (Sandbox Code Playgroud)

=

Maximum mount count:      1
Check interval:           1 (0:00:01)
Run Code Online (Sandbox Code Playgroud)

信息来源:


继续检查(双关语)!