特定の論理ボリューム上のLVM(およびこれらのLV上に仮想マシンを作成しようとするとXenによって)によって報告されるエラーが表示され始めました。しかし、ディスクでテストを実行しましたが、ハードウェアの問題は見当たりません。
ここでは、XEN/Linux(Debian Lenny)ボックスを実行しており、LVM2で管理されている単一のSATAディスクを実行しています。カーネルの最近のapt-getアップグレードだけが大きな変更であり、1年以上稼働しています。
# uname -a
Linux hostname 2.6.26-2-xen-AMD64 #1 SMP Thu Sep 16 16:32:15 UTC 2010 x86_64 GNU/Linux
エラーは次のように表示されます。
# vgck
/dev/dm-20: read failed after 0 of 4096 at 0: Input/output error
そして、そのLVをCドライブ(Windows仮想マシン)に使用するVMを起動しようとすると、VMは起動を拒否し、 /var/log/xen/qemu-dm-*.log
ログファイルの最後にこれが表示されます。
...
Register xen platform.
Done register platform.
raw_read(6:/dev/vgroup/newvm-cdrive, 0, 0x7fff02bca520, 512) [20971520] read failed -1 : 5 = Input/output error
I/O request not ready: 0, ptr: 0, port: 0, data: 0, count: 0, size: 0
raw_read(6:/dev/vgroup/newvm-cdrive, 0, 0x12dfff0, 512) [20971520] read failed -1 : 5 = Input/output error
これは、ディスクが3番目の元のVMのスナップショットに基づいている2つのVMで最初に発生しました。私は2つのLVを削除し、それらを再作成しました(ここでも、同じ元のVMのLVのスナップショットを作成しました)。それ以来、問題はありません。
しかし、今日、私は新しいVMを作成しようとしました。同じ元のVMのLV(lvcreate -L500M --snapshot --name newvm-cdrive /dev/vgroup/original-cdrive
)のスナップショットを作成し、新しいVMを作成しました。最初は機能しましたが、VMを一度シャットダウンすると、上記のエラーで再起動を拒否します。
私の明白な最初の推測はドライブの物理的な問題でしょうが、smartmonは何も報告しません。
# smartctl -t long /dev/sda
# [later]
# smartctl -l selftest /dev/sda
smartctl version 5.38 [x86_64-unknown-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed without error 00% 1 -
# 2 Short offline Completed without error 00% 0 -
また、badblocks
からエラーが発生しません。
vgck
とpvck
を実行してみました:
# vgck vgroup -v
Using volume group(s) on command line
Finding volume group "vgroup"
/dev/dm-20: read failed after 0 of 4096 at 0: Input/output error
# pvck /dev/sda2
Found label on /dev/sda2, sector 1, type=LVM2 001
Found text metadata area: offset=4096, size=192512
Interwebsでこのエラーメッセージへのいくつかの参照(「4096の0の後で読み取りに失敗しました」)を見つけましたが、私の状況に当てはまるものは何もありません。
何か案は?
pdate:要求に応じて、以下はlvdisplayおよびls -lの出力です。 COWスペースが足りなくなるのはもっともなことです。どうすればわかりますか?
# lvdisplay /dev/vgroup/newvm-cdrive
/dev/dm-20: read failed after 0 of 4096 at 0: Input/output error
--- Logical volume ---
LV Name /dev/vgroup/newvm-cdrive
VG Name vgroup
LV UUID jiarxt-q2NO-SyIf-5FrW-I9iq-mNEQ-iwS4EH
LV Write Access read/write
LV snapshot status INACTIVE destination for /dev/vgroup/original-cdrive
LV Status available
# open 0
LV Size 10.00 GB
Current LE 2560
COW-table size 200.00 MB
COW-table LE 50
Snapshot chunk size 4.00 KB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:20
# ls -l /dev/dm-20
brw-rw---- 1 root disk 254, 20 2010-10-11 15:02 /dev/dm-20
そして、これがfdisk-lです。
# fdisk -l /dev/sda
Disk /dev/sda: 160.0 GB, 160000000000 bytes
255 heads, 63 sectors/track, 19452 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x00000080
Device Boot Start End Blocks Id System
/dev/sda1 * 1 31 248976 83 Linux
/dev/sda2 32 19452 155999182+ 8e Linux LVM
答えは、論理ボリュームのCOWスペースがいっぱいだということだと思います。
コマンド「lvs」(先ほど発見した)を使用すると、...
# lvs
/dev/dm-20: read failed after 0 of 4096 at 0: Input/output error
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
[...other LVs...]
newvm-cdrive mrburns Swi-I- 2.00G original-cdrive 100.00
[...other LVs...]
「Attr」列の先頭にある大文字の「S」は、「無効なスナップショット」を意味します。 (小文字の 's'は(有効な)スナップショットを意味します。)ご覧のように、Snap%は100です。つまり、すべてのCOWスペースが使用されます。
迷惑なことに、lvdisplay
しませんこの情報を提供しますが、スナップショット論理ボリュームが無効であることを通知しません。 (スナップショットのステータスは「INACTIVE」であり、「現在使用されていません」という意味であると言っているだけです。)そして、lvs
コマンドはあまり広く宣伝されていません。また、エラーメッセージ(「入出力エラー」)はあまり役に立ちません-実際にはnoログメッセージまたは「スナップショットがいっぱいです」というエラーメッセージがありました。 (LVM2のそれ以降のバージョンは、スペースがいっぱいになり始めると/ var/log/messagesにメッセージを書き込みますが、Debian Lennyのバージョンはそうではありません。ブー。)
そして問題を悪化させるために、インターネット上でこれについての議論はありません(または少なくとも、私が見つけることができなかった)!
LVにスペースを追加するだけではCOWスナップショットを修正できないのはなぜだろうと思いました(lvextend
を使用しますが、実際には、スナップショットの宛先に書き込むときだけでなく、- またスナップショットソースに書き込む場合。COW領域がいっぱいになると、ソースLVへの書き込みにより、必ずスナップショットLVが無効になり、簡単に回復できなくなります。
(直接的な答えではありませんが、入出力エラーの原因となる100%完全なスナップショットと戦っている他の人に使用したいと思っています)
これは私に起こりました:私のスナップショットは100%いっぱいになりましたが、その中のファイルシステムはスペースの負荷があると考え、lvs
または他のLVM2コマンドを実行するたびにinput/output
エラーが発生しました。
私の場合、唯一のオプションはlvremove
を使用してスナップショットを削除することですが、umount -l
を使用してスナップショットをレイジーにアンマウントしたため、削除できませんでした。これにより、最近マウントされるまでファイルシステムを使用していたプロセスを追跡することが非常に困難になりました。
論理ボリュームのメジャー+マイナーデバイス番号を取得することで成功しました。以下の252:10
:
root@hostname:~# lvdisplay
--- Logical volume ---
LV Path /dev/vg00/
LV Name snapshot_of_my_Origin
VG Name vg00
LV UUID CWZxOa-depw-k5P4-SqDo-bdFb-h3Np-ukQkmM
LV Write Access read/write
LV Creation Host, time cz3328jlkj, 2016-07-12 13:47:31 +0100
LV snapshot status active destination for my_Origin
LV Status available
# open 1
LV Size 150.00 GiB
Current LE 38400
COW-table size 50.00 GiB
COW-table LE 12800
Allocated to snapshot 0.03%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:10
引数なしでルートとしてlsof
を実行すると、システムで開いているファイルの完全なリストが表示されます。上記のようにコロンではなく、commaで区切られたメジャー+マイナーブロックデバイス番号でフィルタリングすると、それを使用するプロセスが見つかる場合があります。
root@hostname:~# lsof | sed -ne '1p; / 252,10 /p'
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2055 upr473 cwd DIR 252,10 4096 2 /
NAME
は/
であることに注意してください。これは、レイジーにマウント解除されているため、lsof
は元のパス名を解決できません。
このプロセス(この例では2055
)を強制終了し、lvremove
etalを再試行してください。