Jak mogę powiedzieć jądro Linuksa, aby całkowicie zignorowało dysk tak, jakby nawet nie był podłączony?

18

Ogłoszenie

Proszę przewinąć na odpowiedź (ma kilka punktów, ale jest prawidłowa). Problem został rozwiązany przez łatkę, która będzie w jądrze 3.12.7 i nowszych; Mam nadzieję, że zostanie przeniesiony również do wcześniejszych.

Mój laptop to seria Samsung Chronos 7. Ubuntu Gnome Remix 13.04 ze zaktualizowanymi sterownikami Intela.

Mam problem z wewnętrznym dyskiem SSD (pojemność 8G). Błąd z COMRESET i błędami wejścia / wyjścia. Jestem przekonany, że problemem jest sprzęt; niestety nie mam zainstalowanego systemu Windows na laptopie, aby sprawdzić, czy jest to kwestia konfiguracji SSD, czy coś takiego.

Problem polega na tym, że dysk jest rozpoznawany przez 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

a potem nie udaje się to w wielu kontrolach, opóźnia rozruch, opóźnia zamknięcie i uniemożliwia (myślę) zawieszenie.

Czy można powiedzieć Linuksowi, aby całkowicie ignorował cokolwiek na łączu ata2? Próbowałem dodać tę linię do /etc/udev/rules.d/10-local.rules

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

ale to nie działa.

Z drugiej strony, jeśli ktoś wie, jak zresetować dysk SSD, jeśli pozostawiono go w trybie „pamięci podręcznej” bez użycia systemu Windows ... lub w celu uruchomienia systemu Windows na żywo, aby zrobić to samo…

Dzięki!

Dodano dane:

Pełna udevadm info -a -n /dev/sdbwklejona na http://paste.ubuntu.com/6186145/

smartctl -i /dev/sdb -T permissive daje:

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

co jest wyraźnie błędne. Niemniej jednak:

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

(Dane SSD z http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579 ).

DODATKOWA MYŚL:

Czy to wszystko może być efektem ubocznym technologii Intel Smart Response, która nie jest wyłączana przed instalacją Linuksa? Jeśli tak, jak mogę to sprawdzić bez ponownej instalacji systemu Windows na komputerze? Czy to jest strzał w ciemność? (W bios dysk SSD nie pokazuje się i nie ma nic o Intel SRT).

O OZNAKOWANIU W DUPLIKATIE:

Zmieniłem tytuł pytania; Nie sądzę, że powiązane pytanie odpowiada na mój problem. Wiem pozytywnie , że SSD zawodzi. Pytam, czy można powiedzieć jądru Linuksa, żeby w ogóle tego nie sprawdzał.

Rmano
źródło
2
Jeśli dysk, który chcesz ukryć to „sdb”, czy możesz zamieścić pełne dane wyjściowe „udevadm info -a -n / dev / sdb” ?.
Roman Raguet
1
To wcale nie jest duplikat połączonego pytania. Czy możesz odznaczyć go jako duplikat? Zmieniłem tytuł, aby lepiej przekazać pytanie. Nie chodzi o sprawdzenie SSD, dotyczy ogólnego pytania na temat zarządzania dyskami w systemie Linux. Dzięki!
Rmano
1
Na czym polega problem z ... odłączeniem dysku?
Braiam
1
Podobne pytanie na temat superużytkownika: jak wyłączyć sondowanie jądra dla napędu?
ændrük
3
Braiam: dysk SSD jest przylutowany do płyty głównej.
Rmano

Odpowiedzi:

14

Dwa rozwiązania tutaj: jedno jest szybkie do zastosowania, chociaż rozwiązuje problem tylko częściowo, drugie jest kompletne, ale wymaga skompilowania własnego jądra.

Prawidłowa odpowiedź to łatka na jądro.

Robin H. Johnson napisał łatkę do sterownika jądra SATA ( znajdź go na stronie wymiany stosów Unix / Linux ), która całkowicie ukrywa dysk.

Aktualizacja 1 Łata jest teraz w górę (przynajmniej w stabilnym jądrze 3.12.7), zobacz repozytorium git . Poprosiłem o backport w starterze Ubuntu .

Aktualizacja 2 Łatka jest w standardowym jądrze dla Ubuntu Trusty Thar 14.04; więc teraz potrzebny jest tylko następujący dodatek do parametru rozruchu.

Po zainstalowaniu poprawki dodawanie

 libata.force=2.00:disable

do parametrów rozruchowych jądra ukryje dysk przed jądrem Linux. Sprawdź dokładnie, czy numer jest poprawny; wyszukiwanie nazwy urządzenia może pomóc:

(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

Aby dodać parametr jądra (bot tymczasowo i na stałe), możesz sprawdzić następujące pytania i odpowiedzi: Jak dodać parametr rozruchowy jądra?

Obejście

Przynajmniej problem włączania zawieszenia-wznowienia został rozwiązany przez użytkownika Unix StackExchange Emmanuela w /unix//a/103742/52205 . Jako root wydaj polecenie:

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

przed zawieszeniem.

Aby było trwałe, dodaj następujący plik /etc/pm/sleep.d/i uczyń go wykonywalnym:

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

z treścią:

#!/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

... a teraz system poprawnie zawiesza (i wznawia).

Rmano
źródło
1
Dziękujemy za przypomnienie /sys/block/*/device/delete.
Michael Shigorin
@kikuto --- proponowana edycja wydawała się trochę nie na temat, ale dodałem link do sposobu dodawania parametru rozruchowego jądra. Dziękuję Ci.
Rmano
5

Możesz spróbować utworzyć regułę udev z następującymi informacjami (dane wyjściowe udevadm info -a -n / dev / sdb).

INFORMACJE:

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) Utwórz regułę udev.

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

Możesz spróbować dopasować atrybuty „PODSYSTEMY” i „STEROWNIKI” oraz atrybuty „ATTRS {rev}” i ATTRS {model} , a następnie przypisać „UDISKS” zmienną , aby ją zignorować.

Zawartość pliku 99-hide-ssd.rules byłaby następująca:

PODSYSTEMY == „scsi”, STEROWNIKI == „sd”, ATTRS {rev} == „SSD”, ATTRS {model} == „SanDisk iSSD P4”, ENV {UDISKS_IGNORE} = „1”

Aby zapisać zmiany w nano ... Ctrl+ O, a następnie Enteri na końcu Ctrl+X .

2) Na koniec odśwież zasady udev za pomocą:

  • sudo udevadm trigger

UWAGA: Z ENV {UDISKS_IGNORE} = "1" zignoruje dysk dla Ubuntu 12.10 i 13.04.
W przypadku Ubuntu 12.04 zmienną będzie ENV {UDISKS_PRESENTATION_HIDE} = „1” .

Mam nadzieję że to pomoże.

Roman Raguet
źródło
Próbowałem, nadal sdb jest wykrywany podczas rozruchu (i opóźnia go). Myślę, że powinna być jakaś opcja parametru linii jądra, ale nie byłem w stanie znaleźć ... westchnienia. W każdym razie dzięki.
Rmano
@Rmano ... Jeśli spróbujesz dopasować tylko klucz jądra ?. regułą byłoby KERNEL == "sdb", ENV {UDISKS_IGNORE} = "1" ... aby sprawdzić, czy dysk zostanie wykryty w udev.
Roman Raguet
Wiem, że to było dużo czasu temu. ale ten problem wciąż nie ma odpowiedzi ... żadna z sugestii nie zadziałała. W każdym razie dziękuję.
Rmano,
2

/server/112147/tell-ubuntu-to-ignore-dead-hard-drive-during-booting sugeruje częściowo:

Jako root otwórz /etc/udev/rules.d/60-persistent-storage.rules w swoim ulubionym edytorze tekstu.

Kilka linii w dół prawdopodobnie zobaczysz linię, która wygląda następująco:

pomiń reguły dla nieodpowiednich urządzeń blokowych

KERNEL == "ram * | loop * | fd * | nbd * | gnbd * | dm- | md ", GOTO = "persistent_storage_end" Dodaj "sdb *" do drugiej linii, więc wygląda to tak:

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

Zapisz, uruchom ponownie, a może to działa. Jeśli nie, to czy jest to gwarancja pogwarancyjna?

K7AAY
źródło
Próbowałem, bez powodzenia. Nadal mam napęd SDB, nadal blokuje zawieszenie. Dawno, dawno temu istniała opcja wiersza polecenia jądra sdb = ignore ... I niestety tak, to jest pogwarancja.
Rmano,
BTW, nie miałem tego pliku, więc dodałem go ...
Rmano,
2

Jeśli twoje inne dyski nie używają ahci lub nie są dyskami SSD, możesz usunąć dla nich sterownik jądra.

aby usunąć dla tej sesji (do następnego ponownego uruchomienia), uruchom:

sudo rmmod ahci

aby go ponownie załadować, uruchom:

sudo modprobe ahci

jeśli widzisz, że wszystko idzie dobrze, możesz to teraz całkowicie wyłączyć (nie ładuj go przy następnym uruchomieniu). otwórz plik /etc/modprobe.d/blacklist.conf i dodaj następujący wiersz:

blacklist ahci 

do czarnej listy SSD sterowników, wystarczy zastąpić AHCI z sd

Ohad Cohen
źródło
2
To pozostawi mi system bez dysku ... główny dysk jest włączony ata1, awaria ssd włączona ata2. Wyłączenie trybu ahci w biosie powoduje, że system nie
nadaje się do rozruchu
1

Z tego co wiem, nie ma innego sposobu na usunięcie wiadomości niż usunięcie dysku SSD.

Anudeep Revuri
źródło
Niestety, SSD jest (o ile wiem) przylutowany do płyty głównej. To tylko układ 8G.
Rmano
Wytnij jedną z diod LED na chipie, lepiej znaleźć linię + 5 V i przeciąć to za pomocą X-Acto?
K7AAY,
... gdybym tylko wiedział, który chip jest i gdzie on jest. Obawiam się, że może to spowodować jeszcze więcej problemów (niedościgniony stan trzy ...).
Rmano,
1

Poszedłem i napisałem dla ciebie łatkę na jądro, która implementuje możliwość wyłączenia pojedynczego dysku w czasie uruchamiania, abyś nie musiał zawracać sobie głowy wyłączaniem go w udev lub czekaniem podczas pierwszego uruchomienia.

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

Powinien być bardzo łatwo stosowany do wielu jąder (linia powyżej została dodana 2013-05-21 / v3.10-rc1 *, ale można go bezpiecznie ręcznie zastosować bez tej linii).

robbat2
źródło