如何避免 os-prober 干扰加密分区

如何避免 os-prober 干扰加密分区

在 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 脚本的集合。

相关内容