Xen

LVM 報告 I/O 錯誤,但磁碟報告沒有問題。啊啊啊

  • July 12, 2016

我已經開始看到 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.

我試過跑步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 的 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 無效,並且不容易恢復。

引用自:https://serverfault.com/questions/189803