Comment dire à Linux Kernel> 3.0 d'ignorer complètement un disque défaillant?

23

Je Samsung un ordinateur portable (chronos s7) avec un disque dur SATA sur le bus ata:1, ce qui est détecté comme /dev/sda, un 8G SSD ata:2, /dev/sdbet divers autres dispositifs sur le reste de l' interface SATA.

Le problème est que le disque SSD est

  • soudé à la carte principale (inamovible)
  • éclaté (il donne juste des erreurs d'E / S pour toute opération)
  • il n'apparaît pas dans le bios (probablement parce qu'il est cassé)

Maintenant ce disque:

  • retarde le démarrage de trois à cinq minutes en essayant de sonder le disque défaillant, ce qui est ennuyeux;
  • mais le plus ennuyeux est que le système ne parvient pas à suspendre en raison d'une /dev/sdbdéfaillance.

Notez que je peux vivre avec le retard au démarrage --- ce qui m'inquiète, c'est la reprise / suspension.


La question est donc: puis-je dire au noyau d'éviter même de sonder le périphérique sur ata: 2?

Dans un noyau plus ancien (<3.0), quand j'étais encore capable de creuser un peu dans la source, il y avait un paramètre de ligne de commande du style hdb=ignorequi aurait fait l'affaire.

J'ai essayé toutes les astuces proposées ci-dessous avec udevet libata:forceles paramètres du noyau, en vain. Plus précisément, les éléments suivants ne fonctionnent pas:

  1. Ajout à l'un des /etc/udev/rules.d/fichiers suivants (en début d'exécution comme 00-ignoredisk.rulesou tardivement 99-ignoredisk.rulesou aux deux endroits)

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

    ni

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

    ni beaucoup de solutions intermédiaires --- cela rend le disque inaccessible après le démarrage, mais il est testé au démarrage, et toujours vérifié lors de la suspension --- provoquant l'échec de la suspension.

  2. Modification des fichiers système /lib/udev/rules.d/60-persistent-storage.rules(et udisks, udisks2) modification

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

    à

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

    encore une fois, cela a un certain effet, masquant le disque de l'espace utilisateur, mais le disque est toujours visible pour le noyau.

  3. Le démarrage avec toutes les combinaisons possibles (enfin, beaucoup d'entre elles) des libata:forceparamètres (trouvés par exemple ici ) afin de désactiver le DMA, la vitesse inférieure ou quoi que ce soit sur le disque défaillant --- ne fonctionne pas. Le paramètre est utilisé, mais le disque est toujours sondé et échoue.

    udevadm info -a -n /dev/sdbCollé complet sur http://paste.ubuntu.com/6186145/

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

    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
    

    ce qui est clairement faux. Cependant:

    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
    

(Données SSD de http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579 ).

Rmano
la source
Désolé si cela est trop évident, mais puisque vous n'avez pas inclus dans votre question: avez-vous vérifié que le nom de l'appareil ou l'UUID n'est pas répertorié dans /etc/fstab? Parce que le retard au démarrage pourrait être causé plus tôt par le noyau ou udev, ce qui semble être le cas, mais aussi plus tard par fsck, lors de la lecture fstab.
Teresa e Junior
Oui, il n'y a aucune mention de / dev / sdb (ou de ses partitions) dans les fichiers système. Le délai est même avant le démarrage d'init ... il est dans un kthread (car le démarrage continue en parallèle), mais c'est à un niveau plus fondamental. Mais vraiment le délai de démarrage est le moindre du problème --- si seulement je pouvais ignorer le disque pendant la suspension / reprise pour que la suspension fonctionne, je serais heureux. (Merci quand même).
Rmano
Utilisez-vous dans initrd? si oui, qui?
hildred
@hildred: J'utilise le noyau de stock et les initramfs d'Ubuntu 13.04. Je peux désactiver AHCI ou tous les SATA là-bas, mais mon système est mort --- pas de disques du tout.
Rmano
Debian (et Umbutu) compilent le sous-système ata en tant que module. Avez-vous essayé de définir des paramètres sur le module lorsqu'il est chargé par l'initrd?
hildred

Réponses:

26

libatan'a pas du tout d'option noprobe; c'était une option IDE héritée ...

Mais je suis allé et j'ai écrit un correctif de noyau pour vous qui l'implémente. Il devrait s'appliquer à de nombreux noyaux très facilement (la ligne ci-dessus a été ajoutée le 2013-05-21 / v3.10-rc1 *, mais peut être appliquée manuellement en toute sécurité sans cette ligne).

Mise à jour Le correctif est maintenant en amont (au moins dans le noyau stable 3.12.7). Il se trouve dans le noyau standard distribué avec Ubuntu 14.04 (qui est basé sur 3.13-stable).

Une fois le patch installé, ajouter

 libata.force=2.00:disable

aux paramètres de démarrage du noyau masquera le disque du noyau Linux. Vérifiez que le numéro est correct; la recherche du nom du périphérique peut aider (évidemment, vous devez vérifier les messages du noyau avant d' ajouter les paramètres de démarrage):

(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

Le nombre important est le ata2.00dans la première ligne ci-dessus.

robbat2
la source
Merci beaucoup. Je vais essayer de le vérifier dès que je me souviendrai comment compiler et installer un noyau sur mon Ubuntu. Malheureusement, je vais avoir une semaine très complexe à suivre ...
Rmano
1
+1 C'est clairement mieux que l'astuce que j'ai publiée. J'espère que cela deviendra officiel.
Emmanuel
1
Ok, testé le patch. Ça marche. Si vous devez le pousser en amont, je peux ajouter mon Tested-by: au patch --- vous avez mon vrai email dans mon profil. Je l'ai installé en suivant (avec bizarreries) les instructions de wiki.ubuntu.com/Kernel/BuildYourOwnKernel .
Rmano
1
@ illuminÉ --- vient d'éditer la réponse dans ce sens --- attendez qu'elle soit approuvée.
Rmano
1
Une autre raison d'aimer GENTOO !!
eyoung100
15

Les problèmes matériels ont une solution matérielle physique. Avez-vous envisagé de dessouder ou de couper l'alimentation du lecteur?

EDIT: Ok si ce n'est pas une option que les gens utilisent avant de connecter à chaud un disque dur. Vous pouvez l'utiliser pour désactiver votre lecteur.

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

Notez que tout autre processus peut forcer une analyse du bus SATA, puis le faire revenir. Essayez de le faire juste avant d'hiberner l'ordinateur portable.

Édité par OP: cela a fonctionné . J'ai ajouté le fichier suivant:

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

avec contenu:

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

... et maintenant le système se suspend (et reprend) correctement.

Emmanuel
la source
1
Si seulement c'était vrai. Je ne peux même pas dire quelle puce (ou puces) sont le lecteur SSD --- la plupart ne sont pas marquées. Et ne pas alimenter une puce n'est pas sûr --- qu'en est-il des broches à trois états non entraînées? J'ai ouvert l'ordinateur portable en espérant que le disque SSD était connecté sur une sorte de carte fille. Pas de chance. (Et d'ailleurs, la plupart de la difficulté d'écrire des pilotes de noyau est de contourner un matériel mal conçu).
Rmano
@Rmano Comment effectue l'astuce "supprimer"?
Emmanuel
ÇA MARCHE --- Je peux suspendre après l'astuce "supprimer". Merci beaucoup. (Cela retarde toujours le démarrage, mais bon --- pas de problème).
Rmano
Merci beaucoup de l'avoir rappelé delete.
Michael Shigorin
3

BIOS

Cet appareil n'apparaît-il d'aucune façon via votre BIOS?

Souvent, les disques durs sont configurés en mode "auto", je vérifie que ces appareils sont désactivés et vont même jusqu'à autoriser explicitement le seul disque dur et désactiver tout le reste.

Options de démarrage du noyau

Souvent, vous pouvez désactiver la détection automatique de divers sous-systèmes par le noyau Linux de démarrage en utilisant différentes options de démarrage qui peuvent lui être transmises en tant que commutateurs.

La plupart des options, sinon toutes, sont répertoriées ici:

Linux dans un livre bref

Vous voudrez peut-être parcourir le livre O'Reilly, Linux Kernel in a Nutshell , en particulier le chapitre 7: Personnalisation d'un noyau .

Ce livre est mis à disposition gratuitement par son auteur, Greg Kroah-Hartman, sur son site personnel. Le livre entier peut également être téléchargé.

slm
la source
Non, le BIOS n'a aucune trace de ce disque; Je peux voir le disque dur et le DVD et pas plus. Avant d'échouer, dans Windows (maintenant il n'y a plus de fenêtres dans le système), il était utilisé comme cache d'accélération pour le disque principal. J'ai essayé de régler le mode AHCI sur hérité, désactivé, oui ou automatique (pour tous les disques) mais cela n'a rien changé ou (pour désactivé) a simplement empêché le système de démarrer.
Rmano
L'autre méthode que j'ai utilisée dans le passé est lorsque le noyau démarre pour le dire via Grub (options de démarrage du noyau) à noide=..... Il existe de nombreuses autres options que vous pouvez fournir au noyau de démarrage pour désactiver la détection automatique du matériel.
slm
le disque est SATA (scsi), pas d'IDE. Et lehdb=noprobe options ne sont pas passées en revue à scsi (je pense qu'elles ont été éliminées autour de 2.6.x), donc il n'existe pas (dès que je sais) une option sdb=noprobeou ata:2=noprobe. J'ai lu (presque) tout le kernel-parameters.txtfichier dans la source du noyau et je ne trouve pas le bon paramètre. Si vous connaissez quelqu'un, veuillez le dire dans une réponse --- je vous en serai très reconnaissant.
Rmano
@Rmano - Je vais devoir creuser plus pour le trouver, je me souviens de plusieurs options liées à la détection de disque dur et de bus, mais pas du haut de ma tête.
slm
@Rmano - qu'en est-il de l'option:libata.dma=
slm
0

sudo hdparm -I /dev/sdXMéthode Linux pour vérifier le verrouillage: (avec X = a..z; vous devez bien sûr savoir quel périphérique est votre lecteur). A la fin de la (grande) sortie, vous devez être en mesure de lire au cours des 10 dernières lignes: *not* locked.

erreur de syntaxe
la source