LVM 報告 I/O 錯誤,但磁碟報告沒有問題。啊啊啊
我已經開始看到 LVM 在某些邏輯卷上報告的錯誤(以及 Xen 在嘗試在這些 LV 上創建虛擬機時)。但是我已經在磁碟上執行了測試,並且看不到任何硬體問題。
我們在這裡執行一個 XEN/Linux (Debian Lenny) 機器,執行一個使用 LVM2 管理的 SATA 磁碟。它已經執行了一年多,唯一的主要變化是最近對核心進行了 apt-get 升級。
# 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 驅動器的 VM(它是一個 Windows 虛擬機)時,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
這首先發生在 2 個 VM 上,其磁碟基於第三個原始 VM 的快照。我核對了 2 個 LV 並重新創建了它們(再次通過快照相同的原始 VM 的 LV),從那以後它們一直很好。
但是,今天我嘗試創建一個新的虛擬機。我對相同的原始 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 之後…讀取失敗”),但似乎沒有任何內容適用於我的情況。
有任何想法嗎?
**更新:**根據要求,下面是 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
它沒有提供此資訊,也沒有告訴您您的快照邏輯卷無效。(它所說的只是快照狀態是“未啟動”,我認為它的意思是“目前未使用”。)並且該lvs
命令並未得到廣泛宣傳。並且錯誤消息(“輸入/輸出錯誤”)不是很有幫助——實際上沒有提示“快照已滿”的日誌消息或錯誤消息。(後來的 LVM2 版本在空間開始填滿時將消息寫入 /var/log/messages,但 Debian Lenny 中的版本沒有。噓。)更複雜的是,網際網路上沒有討論這個問題(或者至少,我找不到)!
我確實想知道為什麼不能通過向 LV 添加更多空間來修復 COW 快照(使用
lvextend
,但實際上,不僅在寫入快照目標時需要 COW 空間,而且在寫入快照時也需要所以一旦你的 COW 區域被填滿,任何對源 LV 的寫入都必須使快照 LV 無效,並且不容易恢復。