Come dire a Linux Kernel> 3.0 di ignorare completamente un disco guasto?


23

Ho un portatile Samsung (Chronos S7) con un disco rigido SATA sul bus ata:1, che viene rilevato come /dev/sda, uno SSD 8G su ata:2, /dev/sdbe vari altri dispositivi sul resto dell'interfaccia SATA.

Il problema è che il disco SSD è

  • saldato alla scheda madre (immobile)
  • eliminato (fornisce solo errori I / O per qualsiasi operazione)
  • non appare nel bios (probabilmente perché è rotto)

Ora questo disco:

  • ritarda l'avvio da tre a cinque minuti nel tentativo di sondare il disco guasto, il che è fastidioso;
  • ma la cosa più fastidiosa è che il sistema non riesce a sospendere a causa di un /dev/sdberrore.

Si noti che posso vivere con il ritardo all'avvio --- ciò che mi preoccupa è la cosa di riprendere / sospendere.


Quindi la domanda è: posso dire al kernel di evitare anche di sondare il dispositivo su ata: 2?

Nel kernel più vecchio (<3.0), quando ero ancora in grado di scavare un po 'nel sorgente, c'era un parametro da riga di comando dello stile hdb=ignoreche avrebbe fatto il trucco.

Ho provato tutti i trucchi proposti di seguito con udeve libata:forcedel kernel parametri, senza alcun risultato. In particolare, quanto segue non funziona:

  1. Aggiunta a uno dei seguenti /etc/udev/rules.d/file (in esecuzione anticipata come 00-ignoredisk.ruleso in ritardo come 99-ignoredisk.ruleso in entrambi i punti)

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

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

    né molte soluzioni intermedie --- questo rende il disco non accessibile dopo l'avvio, ma viene sondato all'avvio e comunque controllato durante la sospensione --- causando il fallimento della sospensione.

  2. Modifica dei file di sistema /lib/udev/rules.d/60-persistent-storage.rules(e udisks, udisks2) modifica

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

    a

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

    ancora una volta, questo ha qualche effetto, mascherando il disco dallo spazio utente, ma il disco è ancora visibile al kernel.

  3. L'avvio con tutte le possibili combinazioni (beh, molte di esse) dei libata:forceparametri (trovate ad esempio qui ) per disabilitare DMA, velocità più bassa o qualsiasi altra cosa sul disco guasto --- non funziona. Il parametro viene utilizzato, ma il disco è ancora sondato e ha esito negativo.

    Completamente udevadm info -a -n /dev/sdbincollato su http://paste.ubuntu.com/6186145/

    smartctl -i /dev/sdb -T permissive dà:

    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
    

    che è chiaramente sbagliato. Tuttavia:

    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
    

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


Scusa se questo è troppo ovvio, ma poiché non hai incluso nella tua domanda: ti sei assicurato che il nome del dispositivo o l'UUID non sia elencato in /etc/fstab? Perché il ritardo all'avvio potrebbe essere causato prima dal kernel o da udev, il che sembra essere il caso, ma anche più tardi da fsck, durante la lettura fstab.
Teresa e Junior,

Sì, non c'è menzione di / dev / sdb (o delle sue partizioni) nei file di sistema. Il ritardo è ancora prima che inizi init ... è in un kthread (perché l'avvio continua in parallelo), ma è a un livello più fondamentale. Ma in realtà il ritardo di avvio è il minore del problema --- se solo potessi ignorare il disco durante la sospensione / ripresa in modo che la sospensione funzioni sarei felice. (grazie comunque).
Rmano,

Stai usando in initrd? in tal caso di chi?
Hildred

@hildred: sto usando stock kernel e initramfs da Ubuntu 13.04. Posso disabilitare AHCI o tutti i SATA lì, ma poi il mio sistema è morto --- nessun disco.
Rmano,

Debian (e Umbutu) compilano il sottosistema ata come modulo. Hai provato a impostare i parametri sul modulo quando viene caricato da initrd?
Hildred

Risposte:


26

libatanon ha affatto un'opzione noprobe; quella era un'opzione IDE legacy ...

Ma sono andato e ho scritto una patch del kernel per te che la implementa. Dovrebbe applicarsi a molti kernel molto facilmente (la riga sopra è stata aggiunta 21/05/2013 / v3.10-rc1 *, ma può essere tranquillamente applicata manualmente senza quella riga).

Aggiornamento La patch è ora a monte (almeno nel kernel stabile 3.12.7). È nel kernel standard distribuito con Ubuntu 14.04 (che si basa su 3.13-stable).

Una volta installata la patch, aggiungendo

 libata.force=2.00:disable

i parametri di avvio del kernel nasconderanno il disco dal kernel di Linux. Ricontrolla che il numero sia corretto; la ricerca del nome del dispositivo può aiutare (ovviamente, è necessario controllare i messaggi del kernel prima di aggiungere i parametri di avvio):

(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

Il numero importante è il ata2.00nella prima riga sopra.


Molte grazie. Proverò a controllarlo non appena potrò ricordare come compilare e installare un kernel sul mio Ubuntu. Purtroppo avrò una settimana molto complessa in avanti ...
Rmano,

1
+1 È chiaramente meglio del trucco che ho pubblicato. Spero che diventerà ufficiale.
Emmanuel,

1
Ok, ho provato la patch. Funziona. Se devi spingerlo a monte, posso aggiungere il mio Tested-by: alla patch --- hai la mia vera e-mail nel mio profilo. L'ho installato seguendo (con stranezze) le istruzioni in wiki.ubuntu.com/Kernel/BuildYourOwnKernel .
Rmano,

1
@ illuminÉ --- ho appena modificato la risposta in tal senso --- attendi che venga approvata.
Rmano,

1
Un altro motivo per ADORARE GENTOO !!
eyoung100,

15

I problemi hardware hanno una soluzione hardware fisica. Hai considerato di dissaldare o tagliare l'alimentazione dell'unità?

EDIT: Ok se non è un'opzione che le persone usano prima per collegare a caldo un disco rigido. Potresti usarlo per disabilitare il tuo disco.

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

Si noti che qualsiasi altro processo può forzare una scansione del bus SATA e quindi ripristinarlo. Prova a farlo poco prima di ibernare il laptop.

A cura di OP: ha funzionato . Ho aggiunto il seguente file:

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

con contenuto:

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

... e ora il sistema sospende (e riprende) correttamente.


1
Se solo fosse vero. Non posso nemmeno dire quale chip (o chip) sono l'unità SSD --- la maggior parte non è contrassegnata. E non alimentare un chip non è sicuro --- che dire dei pin a tre stati non pilotati? Ho aperto il portatile sperando che l'unità SSD fosse collegata su una sorta di scheda figlia. Senza fortuna. (E inoltre, la maggior parte della difficoltà nello scrivere i driver del kernel è di aggirare hw progettato male).
Rmano,

@Rmano Come funziona il trucco "elimina"?
Emmanuel,

IT WORKS --- posso sospendere dopo il trucco "elimina". Molte grazie. (Ritarda ancora l'avvio, ma beh --- non è un problema).
Rmano,

Grazie mille per avermelo ricordato delete.
Michael Shigorin,

3

BIOS

Questo dispositivo non viene visualizzato in alcun modo tramite il BIOS?

Spesso le unità HDD sono configurate in modalità "auto", passerei attraverso e mi assicurerei che questi dispositivi siano in uno stato disabilitato e arriverei persino al punto di abilitare esplicitamente solo un HDD e disabilitare tutto il resto.

Opzioni di avvio del kernel

Spesso è possibile disabilitare il rilevamento automatico di vari sottosistemi da parte del kernel Linux di avvio attraverso l'uso di diverse opzioni di avvio che possono essere passate ad esso come switch.

La maggior parte se non tutte le opzioni sono elencate qui:

Linux in un libro Nutshell

Potresti voler scorrere il libro di O'Reilly, Linux Kernel in a Nutshell , in particolare, Capitolo 7: Personalizzare un Kernel .

Questo libro è reso disponibile gratuitamente dal suo autore, Greg Kroah-Hartman, sul suo sito web personale. È possibile scaricare anche l'intero libro.


No, il BIOS non ha alcuna traccia di questo disco; Posso vedere l'HDD e il DVD e non di più. Prima di fallire, in Windows (ora non ci sono più finestre nel sistema) è stato usato come cache di accelerazione per il disco principale. Ho provato a impostare la modalità AHCI su legacy, off, yes o auto (per tutti i dischi) ma questo non ha cambiato nulla o (per off) ha semplicemente impedito l'avvio del sistema.
Rmano,

L'altro metodo che ho usato in passato è quando il kernel si sta avviando per dirlo tramite Grub (opzioni di avvio del kernel) a noide=..... Esistono molte altre opzioni che è possibile fornire al kernel di avvio per disabilitare il rilevamento automatico dell'hardware.
slm

il disco è SATA (scsi), nessun IDE. E le hdb=noprobeopzioni non sono state raccolte su scsi (penso che sia stato eliminato intorno a 2.6.x), quindi non esiste (non appena ne sono a conoscenza) a sdb=noprobeo ata:2=noprobeun'opzione. Ho letto (quasi) tutto il kernel-parameters.txtfile nel sorgente del kernel e non riesco a trovare il parametro corretto. Se conosci qualcuno, per favore dillo in una risposta --- Sarò davvero grato.
Rmano,

@Rmano - Dovrò scavare di più per trovarlo, ricordo diverse opzioni relative all'HDD e al rilevamento del bus, ma non dalla parte superiore della mia testa.
slm

@Rmano - che dire dell'opzione:libata.dma=
slm

0

Modo Linux per verificare il blocco: sudo hdparm -I /dev/sdX(con X = a..z; ovviamente devi sapere quale dispositivo è il tuo disco). Alla fine del (grande) in uscita, è necessario essere in grado di leggere a negli ultimi 10 righe: *not* locked.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.