我已经开始看到LVM在某些逻辑卷上报告的错误(当Xen试图在这些LV上创build虚拟机时)。 但是我在磁盘上运行testing,并且看不到任何硬件问题。
我们在这里运行一个XEN / Linux(Debian Lenny)盒,运行一个由LVM2pipe理的SATA磁盘。 它已经运行了一年多了,唯一的重大变化是最近的内核升级。
# 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虚拟机)的虚拟机时,虚拟机拒绝启动,我在/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
这首先发生在两个虚拟机上,这些虚拟机的磁盘基于第三个原始虚拟机的快照。 我加了两个LV,并重新创build了它们(再次通过截取同一个原始VM的LV),从那以后他们一直很好。
不过,今天我试图创build一个新的虚拟机。 我快照了相同的原始虚拟机的LV( lvcreate -L500M --snapshot --name newvm-cdrive /dev/vgroup/original-cdrive ),并创build了新的虚拟机。 它最初的工作,但一旦closures虚拟机,它拒绝再次启动,与上面显示的错误。
我明显的第一个猜测是驱动器的物理问题,但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之后读取失败……”),但似乎并不适用于我的情况。
有任何想法吗?
更新:根据要求,以下是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”表示“无效的快照”。 (小写的意思是(有效的)快照)。正如你所看到的,Snap%是100,也就是说,它的所有COW空间都被使用了。
令人烦恼的是, lvdisplay 不提供这些信息,也不会告诉你快照逻辑卷是无效的。 (它说的是,快照状态是“INACTIVE”,我认为它的意思是“目前没有使用”)。而lvs命令并没有被广泛宣传。 而错误消息(“input/输出错误”)不是很有帮助 – 事实上没有任何日志消息或错误消息提示“快照已满”。 (更新版本的LVM2在空间开始填满时将消息写入/ var / log / messages,但是Debian Lenny中的版本不会。
为了解决这个问题,在互联网上没有讨论过这个问题(或者至less不是我能find的)!
我想知道为什么COW快照无法通过向LV添加更多空间来解决(使用lvextend ,但实际上,不仅要在写入快照目标时需要COW空间,而且还要在写入到快照目标时所以一旦你的COW区域被填满了,任何对源LV的写入都必然使快照LV失效,并且不容易恢复。
(不是一个直接的答案,但我希望用于对付导致input/输出错误的100%完整快照的其他人)
这发生在我身上:我的快照成为100%满,但其中的文件系统认为它有空间的负载,每当我运行lvs或任何其他LVM2命令,导致input/output错误。
在我的情况下,唯一的select是用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
如果以root身份运行lsof ,而没有参数,则会得到系统上打开文件的完整列表。 过滤您的主要+次要块设备号码,用逗号分隔,而不是上面的冒号,您可能会发现使用它的过程:
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无法parsing其原始path名称。
在这个例子中杀死这个过程, 2055年,再次尝试lvremove等人。