回答:
これは、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_header
(update-grub
このファイルを使用してファイルを生成し/boot/grub/grub.cfg
ます)。
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
問題は、save_env
ステートメントが単純なインストールでのみ機能することです(save_env
RAIDまたはLVMディスク内で実行することはできません)。GRUBマニュアルから:
安全上の理由から、このストレージはプレーンディスク(LVMまたはRAIDなし)、非チェックサムファイルシステム(ZFSなし)、およびBIOSまたはEFI機能(ATA、USBまたはIEEE1275なし)にインストールされている場合にのみ利用可能です。
GRUB recordfail機能は、save_env
ステートメントを使用してrecordfail状態を更新します(Ubuntuヘルプ -Grub 2の「最後の起動に失敗したか、復旧モードで起動する」セクションを参照)。ただし、Ubuntu 14.04(および最近のDebianバージョン)では、save_env
GRUBが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は適切なモジュールをロードします。
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_boot
1から0 に変更すると、recordfail機能が無効になり、RAID / LVMパーティションの書き込みが無効になります。
ただし、他の多くの機能も無効になります(実行するgrep \$quick_boot /etc/grub.d/*
と表示されます)。さらに、ある日/boot/grub
ディレクトリをRAID / LVMの外部に変更した場合、recordfail機能は引き続き無効になります。
要約すると、このソリューションは機能を不必要に無効にし、一般的ではありません。
save_env
GRUBがLVMまたはRAIDパーティション内にある場合、正しいソリューションではステートメントを無効にすることを検討する必要があります。
このバグを解決するために、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の人たちによって適用されるのを待ちたくない場合は、私の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
00_header
ファイルの編集による修正は機能していません。無効にすることはありませんquick_boot
。
00_header
ファイル(ここで推奨)が機能しない理由がわかりません。私(およびRarylson Freitas)に効果があるからといって、必ずしもすべての人に効果があるとは限りません。しかし、あなたは古いものと新しいものに必要な権限を与えてくださいました00_header
し、実行するためにupdate-grub
?(その00_header
場で編集した場合 、chmod
必要ありませんが、必要なupdate-grub
ままです。)
このエラーはRAIDまたはLVMパーティションが原因で発生すると思います。
この問題の一時的な修正:
編集:/etc/grub.d/10_linux
交換 'quick_boot="1"' with 'quick_boot="0"'
それから:
sudo update-grub