このメッセージは、Grubメニューを終了したとき、Ubuntuスプラッシュ画面の前に表示されます。
問題を修正してメッセージをクリアするにはどうすればよいですか?
そして、それはどういう意味ですか?
error: Diskfilter writes are not supported
システムが起動し、正常に動作するようです。
これは、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は適切なモジュールをロードします。
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
ディレクトリ内のファイルの読み取り/書き込みに使用する抽象化モジュールの種類を取得します。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
このエラーはraidまたはLVM partitionが原因で発生すると思います。
この問題の一時的な修正:
編集:/etc/grub.d/10_linux
'quick_boot="1"' with 'quick_boot="0"'
を置換
それから:
Sudo update-grub