暗号化されたパーティションを妨げる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 が実行されます。私が知る限り、OSのインストールのために各パーティションをチェックします。明らかに/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を理解しています。

通常の cryptsetup の代わりに LUKS を使用すると、パーティションの解釈試行が停止します。一方、パーティションが開いている場合は、ループデバイスを見つけて理解しようとします。

内部/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実際にはシェルスクリプトのコレクションにすぎません。

おすすめ記事