Как заставить Linux Kernel> 3.0 полностью игнорировать сбойный диск?

23

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

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

  • припаянный к основной плате (неподвижный)
  • Busted (он просто дает ошибки ввода-вывода для любой операции)
  • он не появляется в биосе (вероятно, потому что он сломан)

Теперь этот диск:

  • задерживает загрузку на три-пять минут, пытаясь проверить неисправный диск, что раздражает;
  • но самое неприятное, что система не может приостановить работу из-за /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.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 ).

Rmano
источник
Извините, если это слишком очевидно, но поскольку вы не включили в свой вопрос: вы убедились, что имя устройства или 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 ...

Но я пошел и написал патч для ядра , который его реализует. Он должен очень легко применяться ко многим ядрам (строка выше была добавлена ​​2013-05-21 / v3.10-rc1 *, но может быть безопасно применена вручную без этой строки).

Обновление Пластырь теперь вверх по течению (по крайней мере в 3.12.7 стабильного ядра). Он находится в стандартном ядре, распространяемом с Ubuntu 14.04 (который основан на версии 3.13-stable).

После установки патча добавим

 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в первой строке выше.

robbat2
источник
Большое спасибо. Я постараюсь проверить это, как только смогу вспомнить, как скомпилировать и установить ядро ​​на мою Ubuntu. К сожалению, у меня будет очень сложная неделя вперед ...
Rmano
1
+1 Это явно лучше, чем трюк, который я написал. Я надеюсь, что это станет официальным.
Эммануэль
1
Хорошо, проверил патч. Оно работает. Если вам нужно продвинуть его вверх по течению, я могу добавить свой Tested-by: в патч - у вас есть мой истинный адрес электронной почты в моем профиле. Я установил его, следуя (со странностями) инструкциям в wiki.ubuntu.com/Kernel/BuildYourOwnKernel .
Rmano
1
@lightÉ - только что отредактировал ответ в этом смысле - дождитесь его одобрения.
Rmano
1
Еще одна причина любить GENTOO!
eyoung100
15

Аппаратные проблемы имеют физическое аппаратное решение. Рассматривали ли вы распаять или отключить питание привода?

РЕДАКТИРОВАТЬ: Хорошо, если это не вариант, люди используют это раньше для горячего подключения жесткого диска. Вы можете использовать это, чтобы отключить ваш диск.

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
@Rmano Как выполнить трюк "удалить"?
Эммануил
ЭТО РАБОТАЕТ --- Я могу приостановить после трюка "удалить". Большое спасибо. (Это все еще задерживает загрузку, но хорошо - не проблема).
Rmano
Большое спасибо за напоминание о delete.
Михаил Шигорин
3

BIOS

Это устройство не отображается каким-либо образом через ваш BIOS?

Зачастую, когда жесткие диски настраиваются в «автоматическом» режиме, я просматриваю и проверяю, чтобы эти устройства находились в отключенном состоянии и даже доходили до явного включения только одного жесткого диска и отключения всего остального.

Параметры загрузки ядра

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

Большинство, если не все варианты перечислены здесь:

Linux в двух словах

Возможно, вы захотите просмотреть книгу О'Рейли « Ядро Linux в двух словах» , в частности, главу 7: «Настройка ядра» .

Эта книга доступна бесплатно ее автором, Грегом Кроа-Хартманом, на его личном веб-сайте. Также можно скачать всю книгу.

SLM
источник
Нет, в BIOS нет никаких следов этого диска; Я вижу HDD и DVD и не более. До сбоя в Windows (теперь в системе больше нет окон) он использовался в качестве ускоряющего кэша для основного диска. Я попытался установить режим AHCI на устаревшее, выключенное, да или автоматическое (для всех дисков), но это ничего не изменило или (для выключенного) просто заставило систему не загружаться.
Rmano
Другой метод, который я использовал в прошлом, это когда ядро ​​загружается, чтобы сообщить об этом через Grub (параметры загрузки ядра) noide=..... Есть множество других опций, которые вы можете предоставить загрузочному ядру, чтобы отключить автоопределение оборудования.
slm
диск SATA (scsi), нет IDE. И hdb=noprobeпараметры не прошли проверку в SCSI (я думаю, что он был исключен около 2.6.x), поэтому он не существует (насколько я знаю) вариант 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.

синтаксическая ошибка
источник