การแทนที่ดิสก์ที่ตายแล้วใน zpool


31

ฉันใช้เซิร์ฟเวอร์ Ubuntu 13.04 64 บิตโดยใช้ ZFS ดั้งเดิม ฉันมี zpool ซึ่งประกอบด้วยฮาร์ดไดรฟ์ 4 ตัวที่หนึ่งเสียชีวิตเมื่อวานและตอนนี้ไม่ได้รับการยอมรับจากระบบปฏิบัติการหรือ BIOS อีกต่อไป

แต่น่าเสียดายที่ผมเห็นปัญหาที่เกิดขึ้นเฉพาะหลังจากรีบูตถัดไปดังนั้นตอนนี้ป้ายชื่อไดรฟ์จะหายไปและผมก็ไม่สามารถแทนที่ดิสก์โดยใช้คำแนะนำอย่างเป็นทางการที่นี่และที่นี่

zpool status hermes -x

พิมพ์

root@zeus:~# zpool status hermes -x
  pool: hermes
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
        invalid.  Sufficient replicas exist for the pool to continue
        functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-4J
  scan: scrub repaired 0 in 2h4m with 0 errors on Sun Jun  9 00:28:24 2013
config:

        NAME                         STATE     READ WRITE CKSUM
        hermes                       DEGRADED     0     0     0
          raidz1-0                   DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP  ONLINE       0     0     0
            ata-ST3300831A_5NF0552X  UNAVAIL      0     0     0
            ata-ST3200822A_5LJ1CHMS  ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C  ONLINE       0     0     0

errors: No known data errors

ฉันเปลี่ยนไดรฟ์เป็นไดรฟ์ใหม่แล้ว (ซึ่งมีฉลาก/dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

คำสั่งใดคำหนึ่ง

zpool replace hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
zpool detatch hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X

ล้มเหลวด้วย

root@zeus:~# zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
cannot offline /dev/disk/by-id/ata-ST3300831A_5NF0552X: no such device in pool

เนื่องจากฉลากของไดรฟ์ที่ตายไปแล้วไม่มีอยู่ในระบบอีกต่อไปนอกจากนี้ฉันยังลองใช้คำสั่งด้านบนเพื่อไม่ให้พา ธ ไปยังเลเบลของไดรฟ์นั้นไม่มีประโยชน์

ฉันจะแทนที่ดิสก์ "โกสต์" ได้อย่างไร

คำตอบ:


38

หลังจากขุดไม่สิ้นสุดในคืนนี้ในที่สุดฉันก็พบทางออก คำตอบสั้น ๆ คือคุณสามารถใช้ GUID ของดิสก์ (ซึ่งยังคงอยู่แม้หลังจากถอดไดรฟ์) ด้วยzpoolคำสั่ง

คำตอบยาว: ฉันได้ GUID ของดิสก์โดยใช้zdbคำสั่งซึ่งให้ผลลัพธ์ต่อไปนี้ให้ฉัน

root@zeus:/dev# zdb
hermes:
    version: 28
    name: 'hermes'
    state: 0
    txg: 162804
    pool_guid: 14829240649900366534
    hostname: 'zeus'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 14829240649900366534
        children[0]:
            type: 'raidz'
            id: 0
            guid: 5355850150368902284
            nparity: 1
            metaslab_array: 31
            metaslab_shift: 32
            ashift: 9
            asize: 791588896768
            is_log: 0
            create_txg: 4
            children[0]:
                type: 'disk'
                id: 0
                guid: 11426107064765252810
                path: '/dev/disk/by-id/ata-ST3300620A_5QF0MJFP-part2'
                phys_path: '/dev/gptid/73b31683-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[1]:
                type: 'disk'
                id: 1
                guid: 15935140517898495532
                path: '/dev/disk/by-id/ata-ST3300831A_5NF0552X-part2'
                phys_path: '/dev/gptid/746c949a-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[2]:
                type: 'disk'
                id: 2
                guid: 7183706725091321492
                path: '/dev/disk/by-id/ata-ST3200822A_5LJ1CHMS-part2'
                phys_path: '/dev/gptid/7541115a-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[3]:
                type: 'disk'
                id: 3
                guid: 17196042497722925662
                path: '/dev/disk/by-id/ata-ST3200822A_3LJ0189C-part2'
                phys_path: '/dev/gptid/760a94ee-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
    features_for_read:

GUID ที่ฉันต้องการคือ15935140517898495532สิ่งที่ทำให้ฉันสามารถทำได้

root@zeus:/dev# zpool offline hermes 15935140517898495532
root@zeus:/dev# zpool status
  pool: hermes
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Online the device using 'zpool online' or replace the device with
        'zpool replace'.
  scan: scrub repaired 0 in 2h4m with 0 errors on Sun Jun  9 00:28:24 2013
config:

        NAME                         STATE     READ WRITE CKSUM
        hermes                       DEGRADED     0     0     0
          raidz1-0                   DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP  ONLINE       0     0     0
            ata-ST3300831A_5NF0552X  OFFLINE      0     0     0
            ata-ST3200822A_5LJ1CHMS  ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C  ONLINE       0     0     0

errors: No known data errors

แล้ว

root@zeus:/dev# zpool replace hermes 15935140517898495532 /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
root@zeus:/dev# zpool status
  pool: hermes
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sun Jun  9 01:44:36 2013
    408M scanned out of 419G at 20,4M/s, 5h50m to go
    101M resilvered, 0,10% done
config:

        NAME                            STATE     READ WRITE CKSUM
        hermes                          DEGRADED     0     0     0
          raidz1-0                      DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP     ONLINE       0     0     0
            replacing-1                 OFFLINE      0     0     0
              ata-ST3300831A_5NF0552X   OFFLINE      0     0     0
              ata-ST3500320AS_9QM03ATQ  ONLINE       0     0     0  (resilvering)
            ata-ST3200822A_5LJ1CHMS     ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C     ONLINE       0     0     0

errors: No known data errors

หลังจากการกู้คืนเสร็จสิ้นทุกอย่างทำงานได้ดีอีกครั้ง คงจะเป็นการดีที่จะรวมข้อมูลนี้ไว้ซึ่งคุณสามารถใช้ GUID ของดิสก์ที่ได้รับzdbจากzpoolคำสั่งด้วย manpage ของ zpool

แก้ไข

ตามที่ระบุโดย durval ด้านล่างzdbคำสั่งอาจไม่แสดงผลใด ๆ จากนั้นคุณอาจลองใช้

zdb -l /dev/<name-of-device>

เพื่อแสดงรายการข้อมูลเกี่ยวกับอุปกรณ์อย่างชัดเจน (แม้ว่าจะหายไปจากระบบแล้ว)


เจ๋งแล้วก่อนเรียกใช้เพิ่มโดยใช้-nสวิทช์ แต่ยัง-gสวิทช์จะคว้า uuid แบบนั้นเช่นกัน
Brian Thomas

ขอบคุณสิ่งนี้มีประโยชน์มากเนื่องจากมีการท่องเว็บฉันไม่สามารถหาข้อมูลเกี่ยวกับการรวบรวมสิ่งต่าง ๆ จาก zdb ได้
xamox

ฉันค้นหามาหลายสัปดาห์แล้วและในที่สุดคำตอบนี้ก็เป็นกลอุบาย แต่ ID ที่แสดงโดยzpool status(ชื่ออย่าง sdab) นั้นไม่เหมือนกับเส้นทางใน/dev/disk/by-id(ชื่อ ID แบบยาว) แต่ls -la /dev/disk/by-idพบว่าพวกมันคือลิงก์ทั้งหมด/dev/...ดังนั้นฉันจึงพบสิ่งที่ชี้ไปยังดิสก์ UNAVAIL ของฉัน (และต่อมาออฟไลน์) และฉันสามารถทำตามขั้นตอนเหล่านี้ได้สำเร็จ ขณะนี้มีการคืนค่า ขอขอบคุณ!
Matt

อีกวิธีหนึ่งที่สั้นกว่าในการรับ GUID คือการzpool status -gแสดงสถานะโดยใช้ GUID สำหรับอุปกรณ์แต่ละเครื่อง นอกจากนี้สำหรับ @Matt zpool status -Lจะแสดงสถานะโดยใช้ชื่ออุปกรณ์พื้นฐานแทน/dev/disk/by-idชื่อแบบยาว
StarNamer

คุณคือ MVP ตัวจริงที่กลับมาพร้อมกับทางออกของคุณ สิ่งนี้ใช้ได้สำหรับฉัน
extracrispy

3

ปัญหาคือดิสก์ถูกอ้างอิงโดยรหัสและไม่ใช่อุปกรณ์

นี่เป็นวิธีแก้ปัญหาที่ควรใช้งาน:

ln -s /dev/null /dev/ata-ST3300831A_5NF0552X
zpool export hermes
zpool import hermes
zpool status
# note the new device name that should appear here
zpool offline hermes xxxx
zpool replace hermes xxxx /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ

แก้ไข: ฉันสาย 30 วินาที ...


ขอบคุณ ผมพยายามที่จะสร้างการเชื่อมโยงที่ว่างเปล่ากับไดรฟ์หายไป no such device in poolแต่ก็เก็บไว้ว่า
Marcus

คำแนะนำของฉันเกือบจะเหมือนกับสิ่งที่คุณทำ ข้อแตกต่างเพียงอย่างเดียวคือวิธีรับอุปกรณ์ guid หลังจากสร้าง symlink ไปยัง / dev / null (ซึ่งแตกต่างจากลิงก์ว่าง) และส่งออก / นำเข้ากลุ่มนั้นจะปรากฏในzpool status
jlliagre

ใช้วิธีนี้ฉันได้รับจริง "ไดรฟ์" ข้อบกพร่องไดรฟ์กลับมาออนไลน์โดยไม่ต้องแทนที่ (ดังนั้นฉันข้ามofflineและreplaceขั้นตอน) ฉันนำเข้าพูลครั้งที่สองหลังจากลบลิงค์ null อาจเป็นเพียงปัญหาของฉลากไดรฟ์ อันที่จริงชื่อไดรฟ์ยังคงเหมือนเดิม ฉันขัดเสร็จแล้วและไม่พบข้อผิดพลาด
Serrano

2

@ Marcus: ขอบคุณสำหรับการโพสต์คำตอบที่ยอดเยี่ยมสำหรับคำถามของคุณมันช่วยฉันได้มาก

เมื่อวันก่อนฉันพบสิ่งที่อาจทำให้คุณสนใจ (และคนอื่น ๆ ที่มาที่นี่ในอนาคต): ฉันมีอุปกรณ์แคชที่หลุดจากสระ (และทำเครื่องหมายว่า "UNAVAIL") เนื่องจากข้อผิดพลาดเดียวกันนี้ (ZFS-8000-4J, "ฉลากขาดหายไปหรือไม่ถูกต้อง") และพยายามออฟไลน์ / ลบ / แทนที่มันล้มเหลวด้วยข้อความ "ไม่มีอุปกรณ์ดังกล่าวในกลุ่มเดียวกัน"

แต่เมื่อฉันพยายามที่จะใช้วิธีแก้ปัญหาของคุณธรรมดา "zdb" (ไม่มีข้อโต้แย้ง) ไม่ได้แสดงรายการอุปกรณ์น้อยกว่า GUID ของมัน

หลังจากการขุดฉันพบว่า "zdb -l / dev / DEVICENAME" แสดง GUID (นำโดยตรงจากอุปกรณ์ไม่ใช่จากบันทึกในพูล) และการใช้ GUID นั้นทำให้ฉันสามารถแทนที่ได้ (จริง ๆ แล้วฉันทำ "zpool ออฟไลน์" ตามด้วย "zpool remove" และจากนั้น "zpool add" ซึ่งทำงานได้อย่างสมบูรณ์)


ขอบคุณ! คำใบ้เพิ่มเติมในคำตอบที่ฉันยอมรับโดยอ้างอิงถึงความคิดเห็นของคุณ
มาร์คัส

สำหรับฉันzdb -l /dev/...แสดงเสมอว่า "ไม่สามารถแกะฉลากได้"
Matt

0

ฉันมีปัญหาที่คล้ายกัน:

ไดรฟ์ล้มเหลวในลักษณะที่ไม่ได้ลงทะเบียนใน BIOS อีกต่อไป (ตายโดยสิ้นเชิง) ชี้ให้เห็นว่ามันเป็นzpool statusUNAVAILABLE

ฉันใส่ไดรฟ์ความจุที่คล้ายกันและฉันจัดการเพื่อจัดสรรมันเป็นใหม่spareที่ถูกINUSEและ resilvered ไดรฟ์ แต่จริงๆแล้วมันไม่ได้เป็นส่วนหนึ่งของสวนสัตว์ แต่สระว่ายน้ำมีความทรงจำเกี่ยวกับไดรฟ์ที่หายไปโดยคิดว่าสักวันหนึ่งจะปรากฏขึ้นอีกครั้ง

วิธีแก้ปัญหาคือการดรอปไดรฟ์ที่หายไปจาก zpool ก่อน:

[root@hactar ~]# zpool detach hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094  

จากนั้นให้วางไดรฟ์ที่ทำเครื่องหมายไว้spare-1 INUSEด้วย:

[root@hactar ~]# zpool detach hactar_data /dev/gptid/f2089b59-2654-11e5-8d99-00241d738094

เมื่อฉันทำสิ่งนี้ดูเหมือนว่า FreeNAS จะคิดออกโดยที่ฉันไม่ต้องทำreplaceคำสั่งอย่างไรก็ตามหากระบบของคุณไม่สามารถเข้าใจได้เองคำสั่งต่อไปนี้ควรแทนที่อุปกรณ์หนึ่งด้วยอุปกรณ์อื่น:

zpool replace {your_poolname} {drive to be replaced} {new drive to take its place}

ตัวอย่างเช่น:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • gptids มาจากzpool statusคำสั่งของฉัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.