昨天,我们的一台计算机掉线了,grub或者说老实说,当我们打开机器时,我不确定它是什么外壳。
它表明由于不一致,它无法挂载根文件系统或某种意义上的东西。
我跑了,我相信:
fsck -fy /dev/sda2
Run Code Online (Sandbox Code Playgroud)
重新启动,问题消失了。
问题部分来了:
我已经在她的 root 的 crontab 中:
Run Code Online (Sandbox Code Playgroud)@reboot /home/ruzena/Development/bash/fs-check.sh
而脚本包含:
#!/bin/bash
touch /forcefsck
Run Code Online (Sandbox Code Playgroud)
想一想,我不知道,为什么我为这么短的命令创建了脚本文件,但无论如何......
此外,在文件中:
/etc/default/rcS
Run Code Online (Sandbox Code Playgroud)
我已经定义:
Run Code Online (Sandbox Code Playgroud)FSCKFIX=yes
所以我不明白。怎么会出现这种情况?
我应该怎么做才能在启动时强制进行根文件系统检查(以及可选的修复)?
或者这两件事是我能做的最大的事情吗?
操作系统: Linux Mint 18.x Cinnamon 64 位。
fstab:
cat /etc/fstab | grep ext4
Run Code Online (Sandbox Code Playgroud)
显示:
Run Code Online (Sandbox Code Playgroud)UUID=a121371e-eb12-43a0-a5ae-11af58ad09f4 / ext4 errors=remount-ro 0 1
grub:
Run Code Online (Sandbox Code Playgroud)fsck.mode=force
已经添加到grub配置中。
jc_*_*c__ 17
ext4 引导期间的文件系统检查在操作系统上测试:虚拟机中的 Linux Mint 18.x
/etc/fstab将fsck订单作为最后(第 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:
Run Code Online (Sandbox Code Playgroud)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.
从 man tune2fs
Run Code Online (Sandbox Code Playgroud)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
在文件中
/etc/default/rcS
Run Code Online (Sandbox Code Playgroud)
检查并注意上次检查 fs 时:
sudo tune2fs -l /dev/sda1 | grep "Last checked"
Run Code Online (Sandbox Code Playgroud)
将-F(强制fsck重启)参数传递给shutdown:
shutdown -rF now
Run Code Online (Sandbox Code Playgroud)
不; 见:man shutdown。
添加/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脚本的日志。
我再说一遍,这两个选项不起作用!
systemd-fsck内核启动开关
编辑主grub配置文件:
sudoedit /etc/default/grub
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)GRUB_CMDLINE_LINUX="fsck.mode=force"
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"。
用tune2fs做之前设置文件系统安装数量fsck,man tune2fs
Run Code Online (Sandbox Code Playgroud)tune2fs' info is kept in the file system superblock
-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,内核命令行开关。
我现在只是想检查一下,上面的内容是否仍然适用于基于 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,因为它会被忽略。
---
这里您只需更改磁盘名称(例如sda、vda、nvme0n1等)和分区号:
首先,我们通过以下方式了解当前状态:
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)
信息来源:
继续检查(双关语)!
| 归档时间: |
|
| 查看次数: |
19335 次 |
| 最近记录: |