Jak wyłączyć sondowanie jądra dla napędu?

9

Mam laptopa Samsung z dyskiem SSD SanDisk ExpressCache 30 GB przylutowanym na płycie głównej. SSD zmarł (daje mnóstwo błędów, gdy próbuję uzyskać do niego dostęp), ale nadal jest sprawdzany podczas rozruchu jądra, widzę, że to partycja, jedność Ubuntu pokazuje niezamontowaną ikonę napędu w szufladzie aplikacji, a co najgorsze, nie mogę zawiesić laptopa , ponieważ wysłanie polecenia zawieszenia do urządzenia ssd kończy się niepowodzeniem. Próbowałem przekazać parametr jądra sdb = noprobe, ale wygląda na to, że już dawno był przestarzały w jądrze 3.8.0 (Ubuntu 13.04). Jak mogę wyłączyć urządzenie SATA w najnowszych jądrach?

Siergiej Melechin
źródło

Odpowiedzi:

1

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 Łata jest teraz w górę (przynajmniej w stabilnym jądrze 3.12.7), zobacz repozytorium git . Poprosiłem o backport w starterze Ubuntu .

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

Obejście

Odpowiedzi udzielił użytkownik Unix StackExchange Emmanuel w https://unix.stackexchange.com/a/103742/52205

Możesz przynajmniej rozwiązać problem z zawieszeniem, wydając polecenie

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

przed zawieszeniem.

Aby go zautomatyzować, dodałem następujący plik: (zwróć uwagę na flagi, musi być wykonywalny)

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

w katalogu /etc/pm/sleep.d/

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

... a teraz system poprawnie zawiesza (i wznawia). Dodałem fragment kodu

if [ -d /sys/block/sdb ]; then
      echo Deleting device sdb 
      echo 1 > /sys/block/sdb/device/delete     
fi

do /etc/rc.localzbyt, na dokładkę.

Rmano
źródło
Dzięki @Rmano, echo działało. Ale nie jest jasne, gdzie powinienem umieścić 99_delete_sdbplik wykonywalny? W /etc/rc0.d/może być?
Sergey Melekhin,
Przepraszamy --- dodał odpowiednie informacje.
Rmano,
5

Poszedłem i napisałem dla ciebie łatkę do jądra, 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ć zastosowany do wielu jąder bardzo łatwo (linia powyżej została dodana 2013-05-21 / v3.10-rc1 *, ale można go bezpiecznie zastosować ręcznie bez tej linii).

robbat2
źródło
1
Dziękuję za Twój wysiłek. Być może możesz komentować (dla tych, którzy nie są tak obeznani z łatami jądra), jak zastosować łatkę i jak jej używać (prawdopodobnie sdb=disablejako parametr jądra).
mpy
1
kernel.org/doc/Documentation/applying-patches.txt obejmuje ogólnie stosowanie poprawek do jądra, ale wiele dystrybucji ma specyficzne metody stosowania poprawek. Ta poprawka dokładniej implementuje flagę wymuszenia „wyłącz” dla libata. Użytkownik będzie musiał użyć go z libata.force = ID: wyłącz gdzie ID to liczba lub liczba. Liczba krotek identyfikująca dysk.
robbat2
Nie wiem, czy te instrukcje: wiki.ubuntu.com/Kernel/BuildYourOwnKernel są aktualne. Spróbuję, jeśli będę mógł w tym tygodniu ...
Rmano
Nawiasem mówiąc, w przypadku laptopa Samsung polecenie powinno brzmieć „libata.force = 2.00: wyłącz” ( grep iSSD /var/log/syslogpowinno dać podpowiedź).
Rmano,
1
Do twojej wiadomości, to jest połączone z jądrem dla wersji 3.13, a także ze stabilnym drzewem jądra. Opcja nodisable NIE została jednak zaakceptowana.
robbat2
0

Zbadałem to i znalazłem rozwiązanie, które można dość łatwo wdrożyć na Ubuntu. Dystrybucja używa kmod, więc poniższe powinny działać dobrze na tej i każdej dystrybucji korzystającej z kmod.

W zależności od używanego sterownika musisz go umieścić na czarnej liście , jeśli chcesz wyłączyć wszystkie urządzenia SATA. Spróbuj lsmod | grep satadowiedzieć się, jakich sterowników używasz. Następnie /etc/modprobe.d/utwórz nowy plik, echo blacklist (module) > blacklist.confaby dodać go do czarnej listy. Odbuduj swoje initramfs, aby zadziałało mkinitramfs. Restart.

Alternatywnie, po prostu dodaj modprobe.blacklist=(module)do parametrów jądra.

Zabijaka
źródło
1
Wyłączy wszystkie urządzenia SATA, w tym dysk twardy, więc mój laptop nie będzie się już uruchamiał. Obsługa sata jest wkompilowana w jądro (nie jako moduł), więc nie mogę go umieścić na czarnej liście.
Sergey Melekhin
Okej, więc po prostu otwórz laptopa i wyjmij dysk ...
Hector
Niestety nie jestem wystarczająco kompetentny, aby to zrobić - jest przylutowany na płycie głównej, nie jest podłączony kablem sata. Nie jestem nawet pewien, czy laptop będzie działał, jeśli go po prostu wyjmę.
Sergey Melekhin