web-dev-qa-db-ja.com

ディスクフィルターの書き込みはサポートされていません>このエラーの原因は何ですか?

このメッセージは、Grubメニューを終了したとき、Ubuntuスプラッシュ画面の前に表示されます。

問題を修正してメッセージをクリアするにはどうすればよいですか?

そして、それはどういう意味ですか?

error:  Diskfilter writes are not supported

システムが起動し、正常に動作するようです。

87
RCF

それはバグです!

これは、LVMまたはRAIDパーティション内にブートパーティション(またはブートパーティションが存在しない場合はルートパーティション)を作成するときに、Ubuntu Server LTS(Ubuntu Server 14.04 LTS)の最新バージョンで発生するバグです。 。

Ubuntu Launchpadでこのバグに関する詳細情報を取得できます。 バグ#1274320 "エラー:diskfilterの書き込みはサポートされていません"

更新:このバグは、Ubuntu Server 14.04およびいくつかの新しいUbuntuバージョンですでに修正されています。おそらく、apt-get upgradeを実行するだけで済みます。

なぜこのバグが発生するのですか?

システムの起動時に、GRUBはload_envの(/boot/grub/grubenv)データを読み取ります。このファイルは GRUB環境ブロック と呼ばれます。

GRUBマニュアルから:

ブートごとに少量の情報を記憶できると便利な場合がよくあります。

[...]

ブート時に、load_envコマンド(load_envを参照)はそこから環境変数をロードし、save_env(save_envを参照)コマンドは環境変数をそこに保存します。

[...]

grub-mkconfigはこの機能を使用してGRUB_SAVEDEFAULTを実装します

この動作は/etc/grub.d/00_headerにあります(update-grubはこのファイルを使用して/boot/grub/grub.cfgファイルを生成します):

if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi

問題は、save_envステートメントは単純なインストールでのみ機能することです(RAIDまたはLVMディスク内でsave_envを実行することはできません)。 GRUBマニュアルから:

安全上の理由から、このストレージはプレーンディスク(LVMまたはRAIDなし)、非チェックサムファイルシステム(ZFSなし)、およびBIOSまたはEFI機能(ATA、USBまたはIEEE1275なし)にインストールされている場合にのみ利用可能です。

GRUBrecordfail機能はsave_envステートメントを使用してrecordfail状態を更新します( buntuヘルプ- Grub 2 、「最後の起動に失敗したか、復旧モードで起動する」セクション)。ただし、Ubuntu 14.04(および最近のDebianバージョン)では、GRUBがLVMまたはRAIDにインストールされている場合でも、save_envステートメント(recordfail機能内)が使用されます。

/etc/grub.d/00_headerの104から124までの行を見てみましょう。

if [ "$quick_boot" = 1 ]; then
    [...]
    case "$FS" in
      btrfs | cpiofs | newc | odc | romfs | squash4 | tarfs | zfs)
    cat <<EOF
  # GRUB lacks write support for $FS, so recordfail support is disabled.
  [...]
  if [ -n "\${have_grubenv}" ]; then if [ -z "\${boot_once}" ]; then save_env recordfail; fi; fi

サポートされていないファイルシステム(btrfs、zfsなど)を使用する場合、GRUBはrecordfail機能を正しくスキップしますが、LVMとRAIDはいつでもスキップしません

GRUBはRAIDおよびLVM内の書き込みからどのように保護しますか?

ファイルシステムで正しく読み書きするには、GRUBは適切なモジュールをロードします。

GRUBは、RAIDパーティションでdiskfilterモジュール(insmod diskfilter)を使用し、lvmLVMパーティションのモジュール。

diskfilterモジュールの読み取り/書き込みの実装を見てみましょう:

apt-get source grub2
vim grub2-2.02~beta2/grub-core/disk/diskfilter.c

ここにコードを貼り付けます(808から823までの行)。この質問に示されている警告は、821行目に表示されます。

static grub_err_t
grub_diskfilter_read (grub_disk_t disk, grub_disk_addr_t sector,
                  grub_size_t size, char *buf)
{
  return read_lv (disk->data, sector, size, buf);
}

static grub_err_t
grub_diskfilter_write (grub_disk_t disk __attribute ((unused)),
             grub_disk_addr_t sector __attribute ((unused)),
             grub_size_t size __attribute ((unused)),
             const char *buf __attribute ((unused)))
{
  return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
                 "diskfilter writes are not supported");
}

grub_diskfilter_read関数が実装されています(GRUBはRAIDファイルシステムを読み取ることができます)。ただし、grub_diskfilter_write関数はGRUB_ERR_NOT_IMPLEMENTED_YETエラーを発生させます。

quick_boot=0を使用すると問題が解決するのはなぜですか?そして、なぜそれが間違った解決策ですか?

/etc/grub.d/00_headerコードをもう一度見ると、quick_boot=1の場合にのみrecordfail機能が使用されていることがわかります。したがって、quick_bootを1から0に変更すると、recordfail機能が無効になり、RAID/LVMパーティションでの書き込みが無効になります。

ただし、他の多くの機能も無効になります(grep \$quick_boot /etc/grub.d/*を実行すると表示されます)。さらに、ある日/boot/grubディレクトリをRAID/LVMの外部に変更した場合、recordfail機能は引き続き無効になります。

要約すると、このソリューションは機能を不必要に無効にし、一般的ではありません。

正しい解決策は何ですか?

GRUBがLVMまたはRAIDパーティション内にある場合、正しいソリューションはsave_envステートメントを無効にすることを検討する必要があります。

このバグを解決するために、Debian Bug Trackerシステムで1つのパッチが提案されました。次の場所にあります: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=754921

このパッチの背後にある考え方は次のとおりです。

  • grub-probe --target=abstraction "${grubdir}"コマンドを実行して、GRUBが/boot/grubディレクトリ内のファイルの読み取り/書き込みに使用する抽象化モジュールの種類を取得します。
  • GRUBがdiskfilterまたはlvmモジュールを使用する場合、recordfail save_envステートメントをスキップして、/boot/grub/grub.cfgファイルに適切なコメントを記述します;
    • たとえば、# GRUB lacks write support for /dev/md0, so recordfail support is disabled.

正しいソリューションを適用する方法は?

このパッチが公式コードでUbuntu/Debianの人たちによって適用されるのを待ちたくない場合は、パッチを適用した00_headerを使用できます:

# Download
wget https://Gist.githubusercontent.com/rarylson/da6b77ad6edde25529b2/raw/99f266a10e663e1829efc25eca6eddb9412c6fdc/00_header_patched
# Apply
mv /etc/grub.d/00_header /etc/grub.d/00_header.orig
mv 00_header_patched /etc/grub.d/00_header
# Disable the old script and enable the new one
chmod -x /etc/grub.d/00_header.orig
chmod +x /etc/grub.d/00_header
# Update Grub
update-grub
144

このエラーはraidまたはLVM partitionが原因で発生すると思います。

この問題の一時的な修正:

編集:/etc/grub.d/10_linux

'quick_boot="1"' with 'quick_boot="0"'を置換

それから:

Sudo update-grub
33
nux