LVM正在报告I / O错误,但磁盘报告没有问题。 哎呀

我已经开始看到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获取任何错误。

我试过运行vgckpvck

 # 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等人。