Jak powiedzieć Linux Kernel> 3.0, aby całkowicie zignorował uszkodzony dysk?

23

Mam laptopa Samsung (Chronos S7) z jednego dysku twardego SATA na autobus ata:1, który jest wykrywany jako /dev/sda, na 8G na SSD ata:2, /dev/sdbi różnych innych urządzeń w pozostałej części interfejsu SATA.

Problem polega na tym, że jest dysk SSD

  • wlutowany do płyty głównej (niewymienny)
  • odpadł (po prostu podaje błędy we / wy dla dowolnej operacji)
  • nie pojawia się w biosie (prawdopodobnie dlatego, że jest zepsuty)

Teraz ten dysk:

  • opóźnia rozruch o trzy do pięciu minut, próbując sondować uszkodzony dysk, co jest denerwujące;
  • ale najbardziej denerwujące jest to, że system nie zawiesza się z powodu /dev/sdbawarii.

Zauważ, że mogę żyć z opóźnieniem przy starcie --- martwi mnie to wznawianie / zawieszanie.


Pytanie więc brzmi: czy mogę powiedzieć kernelowi, aby unikał nawet sondowania urządzenia na ata: 2?

W starszym jądrze (<3.0), kiedy nadal byłem w stanie trochę zagłębić się w źródło, istniał parametr wiersza polecenia stylu hdb=ignore, który zrobiłby tę sztuczkę.

Wypróbowałem wszystkie sztuczki zaproponowane poniżej z parametrami jądra udevi libata:forcebezskutecznie. W szczególności następujące funkcje nie działają:

  1. Dodanie do jednego z poniższych /etc/udev/rules.d/plików (we wczesnym wykonaniu, jak 00-ignoredisk.ruleslub późno, jak 99-ignoredisk.rulesw obu miejscach)

    SUBSYSTEMS=="scsi", DRIVERS=="sd", ATTRS{rev}=="SSD ", ATTRS{model}=="SanDisk iSSD P4 ", ENV{UDISKS_IGNORE}="1" 
    

    ani

    KERNEL=="sdb", ENV{UDISKS_IGNORE}="1"
    

    ani wiele rozwiązań pośrednich --- powoduje to, że dysk nie jest dostępny po rozruchu, ale jest sprawdzany podczas rozruchu i nadal sprawdzany podczas zawieszania --- powodując awarię zawieszenia.

  2. Edycja plików systemowych /lib/udev/rules.d/60-persistent-storage.rules(i udisks, udisks2) zmiana

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

    do

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

    znowu ma to pewien efekt, maskując dysk z przestrzeni użytkownika, ale dysk jest nadal widoczny dla jądra.

  3. Uruchamianie ze wszystkimi możliwymi kombinacjami (cóż, wiele z nich) libata:forceparametrów (znalezionych na przykład tutaj ) w celu wyłączenia DMA, niższej prędkości lub cokolwiek innego o uszkodzonym dysku --- nie działa. Ten parametr jest używany, ale dysk jest nadal sondowany i nie działa.

    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 ).

Rmano
źródło
Przepraszam, jeśli jest to zbyt oczywiste, ale skoro nie udzieliłeś odpowiedzi na pytanie: czy upewniłeś się, że nazwa urządzenia lub identyfikator UUID nie jest wymieniony /etc/fstab? Ponieważ opóźnienie przy rozruchu może być spowodowane wcześniej przez jądro lub udev, co wydaje się, że tak jest, ale także później przez fsck podczas czytania fstab.
Teresa e Junior
Tak, w plikach systemowych nie ma wzmianki o / dev / sdb (lub jego partycjach). Opóźnienie występuje nawet przed rozpoczęciem init ... jest w kthread (ponieważ boot trwa równolegle), ale na bardziej podstawowym poziomie. Ale tak naprawdę opóźnienie rozruchu jest mniejszym problemem - gdybym tylko mógł zignorować dysk podczas zawieszania / wznawiania, aby zawieszenie działało, będę szczęśliwy. (w każdym razie dzięki).
Rmano
Używasz w initrd? jeśli tak to czyje?
hildred
@hildred: Używam podstawowego jądra i initramfs z Ubuntu 13.04. Mogę wyłączyć AHCI lub wszystkie SATA, ale wtedy mój system jest martwy --- żadnych dysków.
Rmano,
Debian (i Umbutu) kompilują podsystem ata jako moduł. Czy próbowałeś ustawić parametry modułu, gdy jest on ładowany przez initrd?
hildred

Odpowiedzi:

26

libataw ogóle nie ma opcji noprobe; to była starsza opcja IDE ...

Ale poszedłem i napisałem dla ciebie łatkę na jądro , która ją implementuje. Powinien bardzo łatwo stosować się do wielu jąder (linia powyżej została dodana 2013-05-21 / v3.10-rc1 *, ale może być bezpiecznie stosowana ręcznie bez tej linii).

Aktualizacja Łata jest teraz w górę (przynajmniej w stabilnym jądrze 3.12.7). Znajduje się w standardowym jądrze rozpowszechnianym z Ubuntu 14.04 (opartym na wersji 3.13-stabilnej).

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 (oczywiście przed dodaniem parametrów rozruchowych należy sprawdzić komunikaty jądra ):

(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

Ważna liczba to ata2.00pierwsza linia powyżej.

robbat2
źródło
Wielkie dzięki. Spróbuję to sprawdzić, gdy tylko będę pamiętał, jak skompilować i zainstalować jądro na moim Ubuntu. Niestety będę miał bardzo skomplikowany tydzień do przodu ...
Rmano,
1
+1 To wyraźnie lepsze niż sztuczka, którą opublikowałem. Mam nadzieję, że stanie się to oficjalne.
Emmanuel,
1
Ok, przetestowałem łatkę. To działa. Jeśli chcesz zepchnąć go w górę, mogę dodać mój Tested-by: do łatki --- masz mój prawdziwy e-mail w moim profilu. Zainstalowałem go zgodnie z instrukcjami ( wiki) .ubuntu.com/Kernel/BuildYourOwnKernel .
Rmano
1
@ illuminÉ --- właśnie edytowałem odpowiedź w tym sensie --- poczekaj na jej zatwierdzenie.
Rmano
1
Kolejny powód, by pokochać GENTOO !!
eyoung100
15

Problemy sprzętowe mają fizyczne rozwiązanie sprzętowe. Czy zastanawiałeś się nad odlutowaniem lub odcięciem zasilania napędu?

EDYCJA: Ok, jeśli nie jest to opcja, ludzie używają tego do podłączania dysku twardego na gorąco. Możesz go użyć do wyłączenia dysku.

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

Zauważ, że jakikolwiek inny proces może wymusić skanowanie szyny SATA, a następnie sprawi, że wróci. Spróbuj to zrobić tuż przed hibernacją laptopa.

Edytowane przez OP: działało . Dodałem następujący plik:

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

z treścią:

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

Emmanuel
źródło
1
Gdyby tylko to była prawda. Nie mogę nawet powiedzieć, który układ (lub układy) to dysk SSD - większość z nich jest nieoznaczona. A odłączenie zasilania układu nie jest bezpieczne --- a co z niedoświadczonymi pinami trójstanowymi? Otworzyłem laptopa z nadzieją, że dysk SSD jest podłączony do jakiejś płyty głównej. Brak szczęścia. (Poza tym większość trudności w pisaniu sterowników jądra polega na obejściu źle zaprojektowanego oprogramowania).
Rmano
@Rmano Jak wykonać lewę „usuń”?
Emmanuel,
TO DZIAŁA --- Mogę zawiesić po lewie „usuń”. Wielkie dzięki. (Nadal opóźnia rozruch, ale cóż - nie stanowi problemu).
Rmano,
Wielkie dzięki za przypomnienie delete.
Michael Shigorin
3

BIOS

Czy to urządzenie nie wyświetla się w żaden sposób przez BIOS?

Często HDD są konfigurowane w trybie „automatycznym”, przechodzę przez i upewniam się, że urządzenia te są w stanie wyłączonym, a nawet przechodzę do zakresu jawnego włączania tylko jednego HDD i wyłączania wszystkiego innego.

Opcje uruchamiania jądra

Często można wyłączyć automatyczne wykrywanie różnych podsystemów przez uruchamianie jądra systemu Linux za pomocą różnych opcji uruchamiania, które można mu przekazać jako przełączniki.

Większość, jeśli nie wszystkie opcje są wymienione tutaj:

Linux w książce Nutshell

Możesz przejrzeć książkę O'Reilly, Linux Kernel in a Nutshell , a konkretnie rozdział 7: Dostosowywanie jądra .

Ta książka jest dostępna bezpłatnie przez jej autora, Grega Kroah-Hartmana, na jego osobistej stronie internetowej. Całą książkę można również pobrać.

slm
źródło
Nie, BIOS nie ma żadnych śladów tego dysku; Widzę dysk twardy i DVD i nic więcej. Przed niepowodzeniem w systemie Windows (teraz w systemie nie ma już okien) był używany jako pamięć podręczna przyspieszenia dla dysku głównego. Próbowałem ustawić tryb AHCI na starszy, wyłączony, tak lub automatyczny (dla wszystkich dysków), ale to nic nie zmieniło lub (dla wyłączenia) po prostu uniemożliwiło uruchomienie systemu.
Rmano,
Inną metodą, której używałem w przeszłości, jest uruchamianie jądra w celu poinformowania go za pomocą Grub (opcje rozruchu jądra) noide=..... Istnieje wiele innych opcji, które można podać w jądrze rozruchowym, aby wyłączyć automatyczne wykrywanie sprzętu.
slm
dysk to SATA (scsi), bez IDE. I hdb=noprobeopcje nie przeszły do ​​scsi (myślę, że zostało wyeliminowane około 2.6.x), więc nie istnieje (jak tylko się dowiem) a sdb=noprobelub ata:2=noprobeopcję. Przeczytałem (prawie) cały kernel-parameters.txtplik w źródle jądra i nie mogę znaleźć poprawnego parametru. Jeśli kogoś znasz, powiedz to w odpowiedzi --- Będę naprawdę wdzięczny.
Rmano,
@Rmano - Będę musiał kopać więcej, aby go znaleźć, pamiętam kilka opcji związanych z wykrywaniem dysku twardego i magistrali, ale nie z głowy.
slm
@Rmano - co z opcją:libata.dma=
slm
0

Sposób sprawdzania blokady przez Linux: sudo hdparm -I /dev/sdX(przy X = a..z; oczywiście musisz wiedzieć, jakie urządzenie jest twoim dyskiem). Na koniec (big) wyjścia, trzeba być w stanie odczytać na w ciągu ostatnich 10 linii: *not* locked.

błąd składni
źródło