จะบอก Linux Kernel> 3.0 ให้เพิกเฉยต่อดิสก์ที่ล้มเหลวได้อย่างไร?


23

ฉันมีแล็ปท็อปซัมซุง (โครโนส S7) กับหนึ่งดิสก์ SATA ฮาร์ดบนรถบัสata:1ซึ่งจะตรวจพบว่าเป็น/dev/sdaความ 8G SSD บนata:2, /dev/sdbและอุปกรณ์อื่น ๆ ในส่วนที่เหลือของอินเตอร์เฟซ SATA

ปัญหาคือดิสก์ SSD นั้น

  • บัดกรีให้กับกระดานหลัก (unmovable)
  • จับ (มันแค่ให้ข้อผิดพลาด I / O สำหรับการดำเนินการใด ๆ )
  • มันไม่ปรากฏในประวัติ (อาจเป็นเพราะมันเสีย)

ตอนนี้ดิสก์นี้:

  • หน่วงเวลาบูตสามถึงห้านาทีพยายามตรวจสอบดิสก์ที่ล้มเหลวซึ่งน่ารำคาญ
  • แต่สิ่งที่น่ารำคาญที่สุดคือระบบไม่สามารถระงับได้เนื่องจาก/dev/sdbความล้มเหลว

สังเกตเห็นว่าฉันสามารถอยู่กับความล่าช้าในการบูต --- สิ่งที่ฉันกังวลคือสิ่งที่ดำเนินการต่อ / หยุดชั่วคราว


ดังนั้นคำถามคือ:ฉันสามารถบอกเคอร์เนลเพื่อหลีกเลี่ยงการละเอียดอุปกรณ์ใน ata: 2 ได้หรือไม่

ในเคอร์เนลที่เก่ากว่า (<3.0) เมื่อฉันยังสามารถขุดลงไปในแหล่งที่มาได้มีพารามิเตอร์บรรทัดคำสั่งของรูปแบบhdb=ignoreที่จะได้ทำเคล็ดลับ

ฉันได้ลองใช้เทคนิคทั้งหมดที่เสนอด้านล่างด้วยudevและlibata:forceพารามิเตอร์เคอร์เนลเพื่อประโยชน์ โดยเฉพาะอย่างยิ่งต่อไปนี้ใช้งานไม่ได้:

  1. การเพิ่มลงใน/etc/udev/rules.d/ไฟล์ใดไฟล์หนึ่งต่อไปนี้(ในการประมวลผลก่อนหน้าเช่น00-ignoredisk.rulesหรือในช่วงปลาย99-ignoredisk.rulesหรือในทั้งสองสถานที่)

    SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 
    

    ไม่

    KERNEL=="sdb", ENV{UDISKS_IGNORE}="1"
    

    หรือโซลูชันระดับกลางจำนวนมาก --- สิ่งนี้ทำให้ดิสก์ไม่สามารถเข้าถึงได้หลังจากการบู๊ต แต่มันถูกตรวจสอบตอนบู๊ตและยังตรวจสอบเมื่อหยุดทำงาน --- ทำให้การหยุดทำงานล้มเหลว

  2. การแก้ไขการเปลี่ยนแปลงไฟล์ระบบ/lib/udev/rules.d/60-persistent-storage.rules(และudisks, udisks2)

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md", GOTO="persistent_storage_end"
    

    ไปยัง

    KERNEL=="ram*|loop*|fd*|nbd*|gnbd*|dm-|md|sdb*", GOTO="persistent_storage_end"
    

    อีกครั้งนี้มีผลกระทบบางอย่างกำบังดิสก์จาก userspace แต่ดิสก์ยังสามารถมองเห็นเคอร์เนล

  3. การบูตด้วยชุดค่าผสมที่เป็นไปได้ทั้งหมด (เช่นกันจำนวนมาก) ของlibata:forceพารามิเตอร์ (ดูตัวอย่างที่นี่ ) เพื่อปิดการใช้งาน DMA ความเร็วต่ำกว่าหรืออะไรก็ตามที่เกี่ยวกับดิสก์ที่ล้มเหลว --- ไม่ทำงาน มีการใช้พารามิเตอร์ แต่ดิสก์ยังคงถูกตรวจสอบและล้มเหลว

    udevadm info -a -n /dev/sdbวางแบบเต็มไปที่http://paste.ubuntu.com/6186145/

    smartctl -i /dev/sdb -T permissive ให้:

    root@samsung-romano:/home/romano# smartctl -i /dev/sdb -T permissive
    smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-31-generic] (local build)
    Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net
    
    Vendor:               /1:0:0:0
    Product:              
    User Capacity:        600,332,565,813,390,450 bytes [600 PB]
    Logical block size:   774843950 bytes
    >> Terminate command early due to bad response to IEC mode page
    

    ซึ่งผิดอย่างชัดเจน อย่างไรก็ตาม:

    root@samsung-romano:/home/romano# fdisk -b 512 -C 970 -H 256 -S 63 /dev/sdb
    fdisk: unable to read /dev/sdb: Input/output error
    

(ข้อมูล SSD จากhttp://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579 )


ขออภัยถ้านี้เป็นที่เห็นได้ชัดเกินไป แต่เนื่องจากคุณยังไม่ได้รวมอยู่ในคำถามของคุณ: คุณทำให้แน่ใจว่าชื่ออุปกรณ์หรือ UUID ไม่ได้อยู่ใน/etc/fstab? เนื่องจากความล่าช้าในการบูตที่อาจจะเกิดขึ้นก่อนหน้านี้โดยเคอร์เนลหรือ udev ซึ่งดูเหมือนว่าจะเป็นกรณีที่ แต่ยังในภายหลังโดย fsck fstabเมื่ออ่าน
Teresa e Junior

ใช่ไม่มีการกล่าวถึง / dev / sdb (หรือพาร์ติชัน) ในไฟล์ระบบ ความล่าช้าคือก่อนที่ init จะเริ่มต้น ... มันอยู่ใน kthread (เนื่องจากการบู๊ตต่อเนื่องกัน) แต่มันอยู่ในระดับพื้นฐานมากขึ้น แต่จริงๆแล้วความล่าช้าในการบู๊ตคือปัญหาที่น้อยลงถ้าเพียง แต่ฉันสามารถเพิกเฉยต่อดิสก์ในระหว่างการหยุดทำงานชั่วคราว / ดำเนินการต่อเพื่อให้การหยุดทำงานชั่วคราวฉันจะมีความสุข (ขอบคุณต่อไป)
Rmano

คุณกำลังใช้งานใน initrd หรือไม่ ถ้าเป็นเช่นนั้น
hildred

@hildred: ฉันใช้เคอร์เนลหุ้นและ initramfs จาก Ubuntu 13.04 ฉันสามารถปิดการใช้งาน AHCI หรือ SATA ทั้งหมดได้ แต่จากนั้นระบบของฉันก็ตาย --- ไม่มีดิสก์เลย
Rmano

Debian (และ Umbutu) รวบรวมระบบย่อย ata เป็นโมดูล คุณได้ลองตั้งค่าพารามิเตอร์ให้กับโมดูลเมื่อโหลดโดย initrd แล้วหรือยัง
hildred

คำตอบ:


26

libataไม่มีตัวเลือก noprobe เลย; นั่นคือตัวเลือก IDE ดั้งเดิม ...

แต่ฉันไปและเขียน kernel patchสำหรับคุณที่นำไปใช้ ควรนำไปใช้กับเมล็ดจำนวนมากได้อย่างง่ายดาย (บรรทัดด้านบนถูกเพิ่ม 2013-05-21 / v3.10-rc1 * แต่สามารถใช้ได้อย่างปลอดภัยด้วยตนเองโดยไม่ต้องใช้บรรทัดนั้น)

อัปเดตแพตช์ตอนนี้อัปสตรีม (อย่างน้อยในเคอร์เนลเสถียร 3.12.7) มันอยู่ในเคอร์เนลมาตรฐานที่แจกจ่ายกับ Ubuntu 14.04 (ซึ่งยึดตามความเสถียร 3.13)

เมื่อติดตั้งแพตช์แล้วให้เพิ่ม

 libata.force=2.00:disable

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

(0)samsung-romano:~% dmesg | grep iSSD
[    1.493279] ata2.00: ATA-8: SanDisk iSSD P4 8GB, SSD 9.14, max UDMA/133
[    1.494236] scsi 1:0:0:0: Direct-Access     ATA      SanDisk iSSD P4  SSD  PQ: 0 ANSI: 5

หมายเลขที่สำคัญคือata2.00ในบรรทัดแรกด้านบน


ขอบคุณมาก. ฉันจะลองตรวจสอบทันทีที่ฉันจำวิธีการคอมไพล์และติดตั้งเคอร์เนลบน Ubuntu ของฉัน แต่น่าเสียดายที่ฉันจะมีสัปดาห์ที่ซับซ้อนมากไปข้างหน้า ...
Rmano

1
+1 มันชัดเจนกว่าเคล็ดลับที่ฉันโพสต์ ฉันหวังว่ามันจะเป็นทางการ
Emmanuel

1
ตกลงทดสอบแพตช์ มันได้ผล. หากคุณต้องการผลักดันอัปสตรีมฉันสามารถเพิ่มการทดสอบโดย: ไปยังแพตช์ --- คุณมีอีเมลจริงในโปรไฟล์ของฉัน ผมติดตั้งมันดังต่อไปนี้ (กับนิสัยใจคอ) คำแนะนำในwiki.ubuntu.com/Kernel/BuildYourOwnKernel
Rmano

1
@ illuminÉ --- เพิ่งแก้ไขคำตอบในแง่นั้น --- รอให้อนุมัติ
Rmano

1
อีกเหตุผลที่จะรัก GENTOO !!
eyoung100

15

ปัญหาฮาร์ดแวร์มีวิธีแก้ไขปัญหาฮาร์ดแวร์ทางกายภาพ คุณพิจารณาที่จะปลดล็อคหรือตัดไฟของไดรฟ์หรือไม่?

แก้ไข: ตกลงถ้าไม่ใช่ตัวเลือกที่คนใช้ก่อนหน้านี้เพื่อเสียบฮาร์ดไดรฟ์ คุณสามารถใช้เพื่อปิดการใช้งานไดรฟ์ของคุณ

echo 1 > /sys/block/sdb/device/delete

โปรดทราบว่ากระบวนการอื่นใดที่สามารถบังคับให้สแกนบัส SATA ได้และทำให้กลับมาทำงานได้อีกครั้ง ลองทำก่อนที่จะจำศีลแล็ปท็อป

แก้ไขโดย OP: ได้ผล ฉันเพิ่มไฟล์ต่อไปนี้:

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb

มีเนื้อหา:

#!/bin/sh

# Tell grub that resume was successful

case "$1" in
    suspend|hibernate)
        if [ -d /sys/block/sdb ]; then
            echo Deleting device sdb 
            echo 1 > /sys/block/sdb/device/delete       
        fi
        ;;
esac

... และตอนนี้ระบบระงับ (และดำเนินการต่อ) อย่างถูกต้อง


1
ถ้าเพียง แต่มันเป็นเรื่องจริง ฉันไม่สามารถบอกได้เลยว่าชิพ (หรือชิป) ใดเป็นไดรฟ์ SSD --- ส่วนใหญ่ไม่มีการทำเครื่องหมาย และการไม่ได้ใช้ชิปก็ไม่ปลอดภัย - แล้วหมุดสามสถานะที่เอามาทำอะไรล่ะ? ฉันเปิดแล็ปท็อปหวังว่าไดรฟ์ SSD นั้นเชื่อมต่อกับบอร์ดลูกสาวบางประเภท ไม่มีโชค. (และนอกจากนี้ความยากที่สุดในการเขียนไดรเวอร์เคอร์เนลคือการหลีกเลี่ยง hw ที่ออกแบบมาไม่ดี)
Rmano

@Rmano เล่นกล "ลบ" ได้อย่างไร?
Emmanuel

มัน ทำงาน --- ฉันสามารถระงับหลังจากเคล็ดลับ "ลบ" ขอบคุณมาก. (มันยังคงชะลอการบู๊ต แต่ก็ไม่เป็นปัญหา)
Rmano

deleteขอบคุณมากสำหรับการเตือนเกี่ยวกับ
Michael Shigorin

3

ไบออส

อุปกรณ์นี้ไม่แสดงผลในลักษณะใด ๆ ผ่าน BIOS ของคุณหรือไม่?

บ่อยครั้งที่มีการกำหนดค่า HDD ในโหมด "อัตโนมัติ" ฉันจะผ่านและตรวจสอบให้แน่ใจว่าอุปกรณ์เหล่านี้อยู่ในสถานะปิดใช้งานและแม้กระทั่งในระดับที่เปิดใช้งาน HDD เพียงตัวเดียวและปิดการใช้งานอย่างอื่น

ตัวเลือกการบูตเคอร์เนล

บ่อยครั้งที่คุณสามารถปิดการใช้งานระบบย่อยต่างๆไม่ให้ตรวจพบอัตโนมัติโดยการบูท Linux Kernel ผ่านการใช้ตัวเลือกการบูตที่แตกต่างกันซึ่งสามารถส่งผ่านไปเป็นสวิตช์ได้

ส่วนใหญ่ถ้าไม่มีตัวเลือกทั้งหมดอยู่ที่นี่:

ลินุกซ์ในหนังสือเล่มสั้น

คุณอาจต้องการที่จะอ่านผ่านหนังสือ O'Reilly, Linux Kernel ในกะลาโดยเฉพาะบทที่ 7: การปรับแต่งเคอร์เนล

หนังสือเล่มนี้ให้บริการฟรีโดยผู้แต่ง Greg Kroah-Hartman บนเว็บไซต์ส่วนตัวของเขา สามารถดาวน์โหลดหนังสือทั้งเล่มได้เช่นกัน


ไม่ BIOS ไม่มีร่องรอยของดิสก์นี้ ฉันสามารถดู HDD และ DVD และไม่มาก ก่อนที่จะล้มเหลวใน Windows (ตอนนี้ไม่มี windows อีกต่อไปในระบบ) มันถูกใช้เป็นแคชเร็วสำหรับดิสก์หลัก ฉันพยายามตั้งค่าโหมด AHCI เป็นมรดก, ปิด, ใช่หรืออัตโนมัติ (สำหรับดิสก์ทั้งหมด) แต่นั่นไม่ได้เปลี่ยนอะไรเลยหรือ (สำหรับปิด) เพียงแค่ทำให้ระบบไม่บูต
Rmano

วิธีการอื่น ๆ ที่ผมเคยใช้ในอดีตคือเมื่อเคอร์เนลบูตที่จะบอกผ่านทาง (ตัวเลือกการบูตเคอร์เนล) noide=....ด้วงไป มีโฮสต์ของตัวเลือกอื่น ๆ ที่คุณสามารถให้กับเคอร์เนลการบูตเพื่อปิดใช้งานการตรวจจับอัตโนมัติของฮาร์ดแวร์
slm

ดิสก์คือ SATA (scsi), ไม่มี IDE และhdb=noprobeตัวเลือกไม่ได้ผ่านการรวบรวมไปยัง scsi (ฉันคิดว่ามันถูกกำจัดไปประมาณ 2.6.x) ดังนั้นจึงไม่มีอยู่ (ทันทีที่ฉันรู้) a sdb=noprobeหรือata:2=noprobeตัวเลือก ฉันได้อ่าน (เกือบ) kernel-parameters.txtไฟล์ทั้งหมดในเคอร์เนลแหล่งและฉันไม่สามารถหาพารามิเตอร์ที่ถูกต้อง ถ้าคุณรู้จักใครกรุณาบอกด้วยคำตอบ --- ฉันจะขอบคุณจริงๆ
Rmano

@Rmano - ฉันต้องขุดมากกว่านี้เพื่อค้นหาฉันจำหลายตัวเลือกที่เกี่ยวข้องกับการตรวจจับ HDD และบัส แต่ไม่ปิดส่วนบนของหัวของฉัน
slm

@Rmano - สิ่งที่เกี่ยวกับตัวเลือก:libata.dma=
slm

0

วิธี Linux เพื่อตรวจสอบการล็อก: sudo hdparm -I /dev/sdX(พร้อม X = a..z; คุณต้องรู้ว่าอุปกรณ์ของคุณคือไดรฟ์) ในตอนท้ายของ (ใหญ่) ออกคุณจะต้องสามารถอ่านได้ในช่วง 10 *not* lockedบรรทัด:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.