在 Linux 服务器上,我将一个大分区(标识为 /dev/sdb1)专用于加密文件系统。我在用着
losetup /dev/loop0 /dev/sdb1
cryptsetup -c aes -h sha512 create crypto /dev/loop0
mount /dev/mapper/crypto /var/crypto/db/
以及用于安装分区并使用它的长密码。安装新内核软件包时,将运行 /usr/bin/os-prober。据我所知,它会检查每个分区的操作系统安装情况。显然,它在 /dev/sdb1 上失败了,除了噪音之外什么都没有(当然,除非你有密码并使用 dmcrypt)。
根据我的系统日志,紧接着
running /usr/lib/os-probes/50mounted-tests on /dev/sdb1
记录“dev dm-0 上的缓冲区 I/O 错误,...”,检测到中止的日志,并重新挂载文件系统。日志继续显示许多有关在 /dev/sdb1 上检测文件系统的失败消息,例如
Aug 17 17:12:59 mibi202 kernel: [1903146.947192] EXT4-fs (sdb1): VFS: Can't find ext4 filesystem
squashfs: SQUASHFS error: Can't find a SQUASHFS superblock on sdb1
FAT-fs (sdb1): invalid media value (0xca)
显然,os-prober 无法在加密设备上发挥其魔力,并且以某种方式干扰了其正常功能。
卸载加密的文件系统,删除 dmcrypt 设备和循环,然后以正确的顺序再次启动这些内容,让我回到文件系统。
任何有关如何避免 os-prober 导致服务器服务中断的提示都将受到欢迎。谢谢。
答案1
不幸的是os-prober
它非常质朴,它不接受任何类型的配置(文件或命令行)。然而,它理解 LUKS。
如果您使用 LUKS 而不是普通的 cryptsetup,它将停止尝试解释该分区(另一方面,如果分区打开,它将尝试查找并理解循环设备)。
内部/usr/lib/os-probes/50mounted-tests
测试如下:
types="$(fs_type "$partition")" || types=NOT-DETECTED
# ...
elif [ -z "$types" ]; then
if type cryptsetup >/dev/null 2>&1 && \
cryptsetup luksDump "$partition" >/dev/null 2>&1; then
debug "$1 is a LUKS partition; skipping"
exit 0
fi
因此,使用 LUKS 是更简单的解决方案。
然而,如果您确实不想使用 LUKS,您可以简单地破解os-prober
并将您的加密分区包含到fs_type
检查中。该检查是在内部执行的/usr/share/os-prober/common.sh
,实际上非常简单:
fs_type () {
if (export PATH="/lib/udev:$PATH"; type vol_id) >/dev/null 2>&1; then
PATH="/lib/udev:$PATH" vol_id --type "$1" 2>/dev/null
elif type blkid >/dev/null 2>&1; then
blkid -o value -s TYPE "$1" 2>/dev/null
else
return 0
fi
}
你可以将其破解为:
fs_type () {
if [ "x$1" = "x/dev/sdb1" ]; then
return 0
elif (export PATH="/lib/udev:$PATH"; type vol_id) >/dev/null 2>&1; then
PATH="/lib/udev:$PATH" vol_id --type "$1" 2>/dev/null
elif type blkid >/dev/null 2>&1; then
blkid -o value -s TYPE "$1" 2>/dev/null
else
return 0
fi
}
os-prober
实际上只是 shell 脚本的集合。