Як сказати Linux Kernel> 3.0 повністю ігнорувати несправний диск?


23

У мене є ноутбук Samsung (Хронос) з s7 одним жорстким диском SATA на шину ata:1, яка визначається як /dev/sda, до 8G SSD на ata:2, /dev/sdbі різні інші пристрої на решті частини інтерфейсу SATA.

Проблема в тому, що диск SSD є

  • припаяний до основної плати (незнімний)
  • заповнений (він просто видає помилки вводу / виводу для будь-якої операції)
  • вона не з’являється в біосі (можливо, тому, що вона порушена)

Тепер цей диск:

  • затримує завантаження на три-п’ять хвилин, намагаючись дослідити збій диска, що дратує;
  • але найприємніше те, що система не спрацьовує через /dev/sdbзупинку.

Зауважте, що я можу жити із затримкою під час завантаження ---, що мене хвилює - це відновлення / призупинення роботи.


Отже, питання: чи можу я сказати ядру, щоб уникнути навіть зондування пристрою на ата: 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.rulesudisks, 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"
    

    знову ж таки, це має певний ефект, маскуючи диск з користувальницького простору, але диск все ще видно ядро.

  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 (бо завантаження триває паралельно), але це на більш фундаментальному рівні. Але насправді затримка завантаження є меншою проблемою --- якби тільки я міг ігнорувати диск під час призупинення / відновлення, щоб призупинити роботу, я буду радий. (все одно, дякую).
Рмано

Ви використовуєте initrd? якщо так чий?
hildred

@hildred: Я використовую ядро ​​акцій та initramfs від Ubuntu 13.04. Я можу там відключити AHCI або всі SATA, але тоді моя система мертва --- немає дисків взагалі.
Рмано

Debian (і Umbutu) складають підсистему ata як модуль. Ви спробували встановити параметри для модуля, коли він завантажується initrd?
hildred

Відповіді:


26

libataвзагалі не має опції без зондування; це був застарілий варіант IDE ...

Але я пішов і написав патч ядра для вас, який реалізує його. Він повинен застосовуватися до багатьох ядер дуже легко (рядок над ним було додано 2013-05-21 / v3.10-rc1 *, але його можна безпечно застосувати вручну без цього рядка).

Оновіть виправлення зараз за течією (принаймні в стабільному ядрі 3.12.7). Він знаходиться в стандартному ядрі, розповсюдженому за допомогою Ubuntu 14.04 (який базується на 3.13-стабільній).

Після встановлення патча додавання

 libata.force=2.00:disable

до параметрів завантаження ядра буде приховано диск від ядра Linux. Перевірити, чи правильно вказано число; пошук назви пристрою може допомогти (очевидно, ви повинні перевірити повідомлення ядра перед додаванням параметрів завантаження):

(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. На жаль, у мене буде дуже складний тиждень вперед ...
Рмано

1
+1 Це явно краще, ніж трюк, який я опублікував. Я сподіваюся, що це стане офіційним.
Еммануїл

1
Гаразд, випробуваний пластир. Це працює. Якщо вам потрібно підштовхнути її до течії, я можу додати тестування: до патчу --- у мене в моєму профілі є моя справжня електронна адреса. Я встановив його, дотримуючись (з примхами) інструкцій на wiki.ubuntu.com/Kernel/BuildYourOwnKernel .
Рмано

1
@ iluminÉ --- щойно відредагував відповідь у цьому сенсі --- чекайте її затвердження.
Рмано

1
Ще одна причина ЛЮБИТИ GENTOO !!
eyoung100

15

Апаратні проблеми мають фізичне апаратне рішення. Чи розглядали ви, як розпаяти чи відключити джерело живлення накопичувача?

EDIT: Гаразд, якщо це не варіант, люди використовують це раніше, щоб підключити жорсткий диск. Ви можете використовувати це для відключення вашого приводу.

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

Зауважте, що будь-який інший процес може змусити сканувати шину SATA, а потім змусить її повернутися. Спробуйте це зробити перед тим, як перезимувати ноутбук.

Під редакцією ОП: спрацювало . Я додав такий файл:

-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 Як виконує трюк "видалити"?
Еммануїл

ЇЇ РОБОТИ --- Я можу призупинити дійок після вилучення. Дуже дякую. (Це все ще затримує завантаження, але добре --- не проблема).
Рмано

Дуже дякую за нагадування delete.
Михайло Шигорін

3

BIOS

Чи не відображається цей пристрій жодним чином через ваш BIOS?

Часто, коли жорсткі диски конфігуруються в режимі "авто", я б перейшов і переконався, що ці пристрої знаходяться в інвалідному стані, і навіть перейти до міри явного включення лише одного жорсткого диска та відключення всього іншого.

Параметри завантаження ядра

Часто ви можете відключити різні підсистеми від автоматичного виявлення завантажувального ядра Linux через використання різних параметрів завантаження, які можуть передаватися йому як комутатори.

Тут наведено більшість, якщо не всі варіанти:

Linux в книзі "Про горіх"

Можливо, ви захочете проглядати книгу O'Reilly, Linux Kernel в горішці , зокрема, глава 7: Настроювання ядра .

Ця книга безкоштовно доступна його автором Грегом Кроа-Хартманом на своєму особистому веб-сайті. Можна також завантажити всю книгу.


Ні, в BIOS немає жодного сліду цього диска; Я бачу HDD і DVD і більше. Перш ніж вийти з ладу, в Windows (тепер у системі більше немає вікон) він використовувався як прискорений кеш для основного диска. Я спробував встановити режим AHCI на спадщину, вимкнено, так або автоматично (для всіх дисків), але це нічого не змінило або (для вимкнення) просто змусило систему не завантажуватися.
Рмано

Інший метод, який я використовував у минулому, це коли ядро ​​завантажується, щоб сказати це через Grub (параметри завантаження ядра) noide=..... Існує безліч інших опцій, які ви можете надати ядра завантаження, щоб відключити автоматичне виявлення обладнання.
slm

диск - SATA (scsi), без IDE. І hdb=noprobeпараметри не перейшли збирати до scsi (я думаю, це було ліквідовано близько 2.6.x), тому його не існує (як тільки я знаю) sdb=noprobeані ata:2=noprobeваріанту. Я прочитав (майже) весь kernel-parameters.txtфайл у джерелі ядра, і не можу знайти правильний параметр. Якщо ви когось знаєте, будь ласка, скажіть це у відповідь --- я буду дуже вдячний.
Рмано

@Rmano - Мені доведеться копати більше, щоб знайти його, я пам’ятаю декілька варіантів, пов’язаних із виявленням жорсткого диска та шини, але не вгорі голови.
slm

@Rmano - як щодо варіанту:libata.dma=
slm

0

Спосіб перевірки наявності блокування в Linux: sudo hdparm -I /dev/sdX(з X = a..z; звичайно, ви повинні знати, на якому пристрої знаходиться ваш привід). В кінці (великий) вихід, ви повинні бути в змозі прочитати в останні 10 рядків: *not* locked.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.