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

18

уведомление

Пожалуйста, прокрутите вниз, чтобы найти ответ (у него мало пунктов, но он правильный). Проблема решена патчем, который будет в ядре 3.12.7 и выше; Я надеюсь, что это будет перенесено на более ранние версии.

Мой ноутбук - Samsung Chronos серии 7. Ubuntu Gnome Remix 13.04 с обновленными драйверами Intel.

У меня проблема с внутренним SSD-накопителем (емкостью 8G). Сбой с COMRESET и ошибками ввода / вывода. Я совершенно уверен, что проблема аппаратная; к сожалению, у меня не установлено Windows на ноутбуке, чтобы проверить, является ли это вопросом конфигурации SSD или чего-то еще.

Проблема в том, что диск распознается udev:

KERNEL[9.515930] add      /devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb (block)
ACTION=add
DEVNAME=sdb
DEVPATH=/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb
DEVTYPE=disk
MAJOR=8
MINOR=16
SEQNUM=1785
SUBSYSTEM=block
UDEV_LOG=3

и после этого он терпит неудачу во многих проверках, задерживая загрузку, задерживая выключение и делая (я думаю) приостановку невозможной.

Можно ли сказать Linux полностью игнорировать что-либо по ссылке ata2? Я попытался добавить эту строку в /etc/udev/rules.d/10-local.rules

SUBSYSTEMS=="pci"  DRIVERS=="ahci" KERNELS=="ata2" OPTIONS=="ignore_device"

но это не работает

С другой стороны, если кто-нибудь знает, как сбросить твердотельный накопитель, если он был оставлен в режиме «кеша» без использования Windows ... или загрузить «живые» окна, чтобы сделать то же самое ...

Благодарность!

Данные добавлены:

Полная 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 ).

ДОПОЛНИТЕЛЬНАЯ МЫСЛЬ:

Может ли все это быть побочным эффектом технологии Intel Smart Response не отключаться перед установкой Linux? Если да, как я могу проверить это, кроме переустановки Windows на машине? Или это выстрел в темноте? (В биосе SSD-накопитель не показывается и в Intel SRT ничего нет).

О МАРКИРОВКЕ КАК ДУБЛИКАТА:

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

Rmano
источник
2
Если диск, который вы хотите скрыть, это "sdb", не могли бы вы опубликовать полный вывод "udevadm info -a -n / dev / sdb" ?.
Роман Рагует
1
Это совсем не дубликат связанного вопроса. Не могли бы вы снять отметку как дубликат? Я изменил название, чтобы лучше передать вопрос. Речь идет не о проверке SSD, а об общем вопросе об управлении дисками в Linux. Благодарность!
Rmano
1
В чем проблема просто ... отключить диск?
Брайам
1
Подобный вопрос на Super User: Как отключить зондирование ядра на диске?
rndrük
3
Брайам: диск SSD припаян к материнской плате.
Rmano

Ответы:

14

Здесь есть два решения: одно быстро применяется, хотя и решает проблему только частично, другое - полное, но требует компиляции собственного ядра.

Правильный ответ - исправление ядра.

Робин Х. Джонсон написал патч для драйвера ядра SATA ( его можно найти на сайте обмена стеками Unix / Linux ), который полностью скрывает диск.

Обновление 1 Патч теперь в апстриме (по крайней мере, в стабильном ядре 3.12.7), смотрите репозиторий git . Я попросил backport в панели запуска Ubuntu .

Обновление 2 Патч в стандартном ядре для Ubuntu Trusty Thar 14.04; так что теперь требуется только следующее дополнение к параметру загрузки.

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

 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

Чтобы добавить параметр ядра (бот временно и постоянно), вы можете проверить следующие вопросы и ответы: Как добавить параметр загрузки ядра?

Временное решение

По крайней мере, проблема включения приостановленного возобновления была решена пользователем Unix StackExchange Эммануэлем на /unix//a/103742/52205 . От имени пользователя root введите команду:

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

до приостановки.

Чтобы сделать его постоянным, добавьте следующий файл /etc/pm/sleep.d/и сделайте его исполняемым:

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

с содержанием:

#!/bin/sh

# Delete the failing disk so that it will not block suspend

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

... и теперь система приостанавливает (и возобновляет) правильно.

Rmano
источник
1
Спасибо, что напомнили о /sys/block/*/device/delete.
Михаил Шигорин
@kikuto --- предложенное вами редактирование показалось немного не по теме, но я добавил ссылку на то, как добавить параметр загрузки ядра. Спасибо.
Rmano
5

Вы можете попытаться создать правило udev со следующей информацией (вывод udevadm info -a -n / dev / sdb).

ИНФОРМАЦИЯ:

looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0':
    KERNELS=="1:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="SSD "
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{model}=="SanDisk iSSD P4 "
    ATTRS{state}=="running"
    ATTRS{queue_type}=="none"
    ATTRS{iodone_cnt}=="0x309"
    ATTRS{iorequest_cnt}=="0x30a"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{ioerr_cnt}=="0x1d6"
    ATTRS{queue_depth}=="1"
    ATTRS{vendor}=="ATA     "
    ATTRS{device_blocked}=="0"
    ATTRS{iocounterbits}=="32"

1) Создайте правило udev.

  • sudo nano /etc/udev/rules.d/99-hide-ssd.rules

Вы можете попытаться сопоставить ключи "SUBSYSTEMS" и "DRIVERS" , а также атрибуты "ATTRS {rev}" & ATTRS {model} , а затем назначить переменную «UDISKS», чтобы игнорировать ее.

Содержимое файла 99-hide-ssd.rules будет таким:

SUBSYSTEMS == "scsi", DRIVERS == "sd", ATTRS {rev} == "SSD", ATTRS {модель} == "SanDisk iSSD P4", ENV {UDISKS_IGNORE} = "1"

Чтобы сохранить изменения в нано ... Ctrl+ O, тогда Enterи наконец Ctrl+X .

2) Наконец, обновите правила udev:

  • sudo udevadm trigger

ПРИМЕЧАНИЕ. Если ENV {UDISKS_IGNORE} = "1", он будет игнорировать диск для Ubuntu 12.10 и 13.04.
Для Ubuntu 12.04 переменная будет ENV {UDISKS_PRESENTATION_HIDE} = "1" .

Надеюсь это поможет.

Роман Рагет
источник
Попробовал, все равно sdb обнаруживается при загрузке (и задерживает это). Я думаю, что должен быть какой-то параметр параметра строки ядра, но я не смог ничего найти ... вздох. Спасибо, в любом случае.
Rmano
@Rmano ... Если вы пытаетесь сопоставить только ключ ядра ?. правило будет KERNEL == "sdb", ENV {UDISKS_IGNORE} = "1" ... чтобы увидеть, обнаружен ли диск в udev.
Роман Рагет
Я знаю, это было много лет назад. но эта проблема до сих пор без ответа ... ни одно из предложений не сработало. Спасибо всем в любом случае.
Rmano
2

/server/112147/tell-ubuntu-to-ignore-dead-hard-drive-during-booting предлагает частично:

В качестве пользователя root откройте /etc/udev/rules.d/60-persistent-storage.rules в своем любимом текстовом редакторе.

Через несколько строк вы, вероятно, увидите строку, которая выглядит следующим образом:

пропустить правила для неподходящих блочных устройств

KERNEL == "ram * | loop * | fd * | nbd * | gnbd * | dm- | md ", GOTO = "persistent_storage_end" Добавить "sdb *" во вторую строку, поэтому это выглядит так:

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

Сохраните, перезагрузите, и, возможно, это работает. Если нет, ну это пост-гарантия?

K7AAY
источник
Пробовал, не повезло. Все еще есть привод sdb, все еще блокируя приостановку. Когда-то существовал параметр командной строки ядра sdb = ignore ... И, к сожалению, да, это постгарантийный.
Rmano
Кстати, у меня не было этого файла, поэтому я добавил его ...
Rmano
2

Если другие ваши диски не используют ahci или не SSD, вы можете удалить для них драйвер ядра.

чтобы удалить для этого сеанса (до следующей перезагрузки), запустите:

sudo rmmod ahci

чтобы перезагрузить его, запустите:

sudo modprobe ahci

если вы видите, что все идет хорошо, теперь вы можете полностью отключить его (не загружайте его при следующей загрузке). откройте файл /etc/modprobe.d/blacklist.conf и добавьте следующую строку:

blacklist ahci 

в черный список драйверов ssd, просто замените ahci на sd

Охад Коэн
источник
2
Это оставит мне систему без диска ... основной диск ata1включен, сбой ssd включен ata2. Отключение режима ahci в BIOS делает систему не загружаемой ...
Rmano
1

Из того, что я знаю, нет никакого способа удалить сообщение, кроме удаления вашего SSD.

Анудип Ревури
источник
К сожалению, SSD (насколько я знаю) припаян к материнской плате. Это просто чип 8G.
Rmano
Вырезать один из светодиодов на чипе, желательно найти линию + 5 В и разрезать это с помощью X-Acto?
K7AAY
... если бы я только знал, какой чип и где он находится. Тогда я боюсь, что это может создать еще больше проблем (неразвитые три государства ...).
Rmano
1

Я написал для вас патч для ядра, в котором реализована возможность отключения одного диска во время загрузки, чтобы вам не нужно было отключать его в udev или ждать при начальной загрузке.

http://dev.gentoo.org/~robbat2/patches/3.13-libata-disable-disks-by-param.patch

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

robbat2
источник