技術部ネットワーク課の上曽山です。
先日CentOS Stream8で、検証のためにkvmゲストを作成→削除していたら、同じ名前のボリュームが作れなくなるという事象が起きました。
エラーメッセージ等で検索しても、あまりいい情報が出て来なかったんですが、とりあえずの回避策を見つけたのでまとめました。
この問題は03/18にBugzillaに登録されたようです。 bugzilla.redhat.com
目次
発生した事象
環境は以下の通りです。
バージョン | |
---|---|
OS | centos-stream-release-8.4-1 |
lvm2 | lvm2-2.03.11 |
libvirt | libvirt-3.9.0-14.el7_5.6.x86_64 |
まず適当な名前で論理ボリュームを作成します。
# virsh vol-create-as pool01 test001.example.com 10G Vol test001.example.com created
事象を再現するため、パーティションにラベル(シグネチャ)を作成します。
# parted /dev/vg01/test001.example.com mklabel msdos
一旦、論理ボリュームを削除します。
# virsh vol-delete --pool pool01 test001.example.com Vol test001.example.com deleted
その後、同じ名前で論理ボリュームを作ろうとすると作成に失敗します。
# virsh vol-create-as pool01 test001.example.com 10G error: Failed to create vol test001.example.com error: internal error: Child process (/usr/sbin/lvcreate --name test001.example.com -L 10485760K vg01) unexpected exit status 5: WARNING: dos signature detected on /dev/vg01/test001.example.com at offset 510. Wipe it? [y/n]: [n] Aborted wiping of dos. 1 existing signature left on the device. Failed to wipe signatures on logical volume vg01/test001.example.com. Aborting. Failed to wipe start of new LV.
以前のシグネチャが残っているから作成に失敗しているのは分かりますが、じゃあどうすればいいのか?
エラーメッセージに具体的な解決策は示されていないので色々試してみました。
試行錯誤
lvcreateしてみる
前述のエラーメッセージに含まれている、論理ボリューム作成コマンドを実行してみます。
# /usr/sbin/lvcreate --name test001.example.com -L 10485760K vg01 WARNING: dos signature detected on /dev/vg01/test001.example.com at offset 510. Wipe it? [y/n]: y Wiping dos signature on /dev/vg01/test001.example.com. Logical volume "test001.example.com" created.
シグネチャの削除に同意すれば作成に成功します。
LVMの問題でシグネチャが削除出来ない訳ではないようです。
virsh vol-create-asにオプションを追加してみる
virshで論理ボリュームを作成する時のコマンドが正しくないのかもしれない、と思いオプションを省略しない形で実行してみました。
# virsh vol-create-as --pool pool01 --name test001.example.com --capacity 10G error: Failed to create vol test001.example.com error: internal error: Child process (/usr/sbin/lvcreate --name test001.example.com -L 10485760K vg01) unexpected exit status 5: WARNING: dos signature detected on /dev/vg01/test001.example.com at offset 510. Wipe it? [y/n]: [n] Aborted wiping of dos. 1 existing signature left on the device. Failed to wipe signatures on logical volume vg01/test001.example.com. Aborting. Failed to wipe start of new LV.
当然ながら失敗しました。
マニュアル等も見てみましたが、virshコマンドにこの問題を解決出来そうなオプションは見つかりません。
シグネチャを削除してみる
ddコマンドでパーティションの先頭をゼロ埋めしてみます。
# dd if=/dev/zero of=/dev/sda4 bs=512 count=1
シグネチャが削除されるので論理ボリュームは作成出来るのですが、2個目、3個目と複数のボリュームが存在していたら、この手は危なっかしくて使えません。
パッケージをアップデートしてみる
libvirt系のアップデートはありませんでした。
# dnf update libvirt\* Last metadata expiration check: 0:00:22 ago on Thu 25 Mar 2021 09:14:12 PM JST. Dependencies resolved. Nothing to do. Complete!
lvm2はアップデートされましたが、状況は改善しませんでした。
# dnf update lvm2 Last metadata expiration check: 0:03:21 ago on Thu 25 Mar 2021 07:30:07 PM JST. Dependencies resolved. ==================================================================================================================================== Package Architecture Version Repository Size ==================================================================================================================================== Upgrading: device-mapper x86_64 8:1.02.175-5.el8 baseos 375 k device-mapper-event x86_64 8:1.02.175-5.el8 baseos 269 k device-mapper-event-libs x86_64 8:1.02.175-5.el8 baseos 269 k device-mapper-libs x86_64 8:1.02.175-5.el8 baseos 408 k lvm2 x86_64 8:2.03.11-5.el8 baseos 1.6 M lvm2-libs x86_64 8:2.03.11-5.el8 baseos 1.1 M Transaction Summary ==================================================================================================================================== Upgrade 6 Packages ※以下、省略
回避策
LVMの設定変更
改めてLVMの設定を確認していたところ、関係しそうな箇所を発見しました。
# Configuration option allocation/wipe_signatures_when_zeroing_new_lvs. # Look for and erase any signatures while zeroing a new LV. # The --wipesignatures option overrides this setting. # Zeroing is controlled by the -Z/--zero option, and if not specified, # zeroing is used by default if possible. Zeroing simply overwrites the # first 4KiB of a new LV with zeroes and does no signature detection or # wiping. Signature wiping goes beyond zeroing and detects exact types # and positions of signatures within the whole LV. It provides a # cleaner LV after creation as all known signatures are wiped. The LV # is not claimed incorrectly by other tools because of old signatures # from previous use. The number of signatures that LVM can detect # depends on the detection code that is selected (see # use_blkid_wiping.) Wiping each detected signature must be confirmed. # When this setting is disabled, signatures on new LVs are not detected # or erased unless the --wipesignatures option is used directly. wipe_signatures_when_zeroing_new_lvs = 1
この設定を書き換えてみます。
wipe_signatures_when_zeroing_new_lvs = 0
これで削除したものと同じ名前の論理ボリュームが作成出来るようになりました。
サービスやサーバを再起動しなくても、設定を書き換えるだけで挙動が変わります。
論理ボリュームのデータを消す
virshには論理ボリュームのデータを削除するコマンドが用意されています。
ゲストOSの状態(running/shut off)に関わらずデータを削除してしまうので取り扱いには中止してください。
# virsh vol-wipe test001.example.com pool01 Vol test001.example.com wiped
この後、論理ボリュームを削除すれば同じ名前で論理ボリュームの作成が可能です。
データ削除には結構時間がかかるので、シグネチャ消すだけなら、すぐ止めても良いかもしれません。
最後に
一応の回避策は見つかったものの、根本的な原因が分からずモヤモヤします。
# CentOS7だと同じ設定でも事象は発生しないんですよ...
その後もチョコチョコ調べていたところBugzillaの登録を見つけたので、一旦アップデートを待つことにしました。