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


88

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

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

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

error:  Diskfilter writes are not supported

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


1
まだUbuntuのデスクトップ15.04 ...で固定されていない
ThePiercingPrince

1
16.04ではまだ修正されていません。バグ修正のこの猛烈なペースに追いつくのは難しいです。
ポールトムブリン

回答:


145

それはバグです!

これは、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 Environment Blockと呼ばれます。

GRUBマニュアルから:

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

[...]

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

[...]

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

この動作は次の場所にあります/etc/grub.d/00_headerupdate-grubこのファイルを使用してファイルを生成し/boot/grub/grub.cfgます)。

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

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

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

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

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

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)を使用し、LVMパーティションでlvmモジュールを使用します。

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コードをもう1度見ると、recordfail機能が使用されるのはの場合のみquick_boot=1です。したがって、quick_boot1から0 に変更すると、recordfail機能が無効になり、RAID / LVMパーティションの書き込みが無効になります。

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

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

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

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

このバグを解決するために、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の人たちによって適用されるのを待ちたくない場合は、私のpatchedを使用できます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

特にバグ参照をありがとう。ただし、nuxのソリューションがより説得力があることを理解していただければ幸いです。;)
CMDの実行14

6
こんにちは@ClassStacker、答えをまとめました!それは非常に大きく、多くの人々が理解するのは非常に困難でした:pそれはまだ大きいですが、少なくとも私はそれをセクションにまとめました。これで、関心のあるセクションのみを見ることができます。
ラリルソンフレイタス14

8
ワオ。ありがとうございました。「今月の回答」機能があれば、私はあなたに投票します。また、「BSなし」賞に値します。これは本当に価値を提供し、フォーラムと比較してこのサイトネットワークの間に大きな違いをもたらす種類の記事です。
CMD 14

1
残念ながら、このバグの影響を受けており、バグレポートやここでの00_headerファイルの編集による修正は機能していません。無効にすることはありませんquick_boot
douggro

@douggro編集した00_headerファイル(ここで推奨)が機能しない理由がわかりません。私(およびRarylson Freitas)に効果があるからといって、必ずしもすべての人に効果があるとは限りません。しかし、あなたは古いものと新しいものに必要な権限を与えてくださいました00_headerし、実行するためにupdate-grub?(その00_header場で編集した場合 、chmod必要ありませんが、必要なupdate-grubままです。)
エリアカガン14

33

このエラーはRAIDまたはLVMパーティションが原因で発生すると思います。

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

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

交換 'quick_boot="1"' with 'quick_boot="0"'

それから:

sudo update-grub

おかげで、完璧に機能しました。はい、すべてのボリュームにLVMを使用しています。
RCF

この解決策をありがとう。それは私に多くの仕事を節約しました。背景情報も少しありますか?
CMDを実行する14

@ClassStacker nuxから詳細情報を要求する場合は、(@ nux)で始まるようにコメントを編集する必要があります。あなたが私に尋ねている場合、あなたはどんなタイプの背景を求めていますか?
RCF 14

2
@ RCF-U14.04 1)いいえ、する必要はありません。[コメントを追加]-> [ヘルプ]をクリックするだけで、「投稿者には常にコメントが通知されます」と表示されます。2)特にRarylson Freitasによる広範な回答を考えると、これが問題を解決する理由を(nuxから)知りたかった。しかし、あなたがそれに答えることができるなら、気軽にそうしてください。
CMD実行14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.