Como dizer ao Linux Kernel 3.0 para ignorar completamente um disco com falha?

21

Estou fazendo esta pergunta aqui, na esperança de que algum guru do Linux possa ter uma resposta. Esta pergunta foi feita em AskUbuntu e em SuperUser sem respostas: pensando melhor, é realmente específico para o kernel do Linux, então acho que o seu lugar natural é neste fórum.

Eu tenho um laptop Samsung (Chronos s7) com um disco rígido SATA no barramento ata:1 , que é detectado como /dev/sda , um SSD 8G em ata:2 , /dev/sdb e vários outros dispositivos no restante da interface SATA.

O problema é que o disco SSD é

  • soldado na placa principal (imóvel)
  • bloqueado (apenas erros de E / S em qualquer operação)
  • ele não aparece no BIOS (provavelmente porque está quebrado)

Agora este disco:

  • atrasa a inicialização de três a cinco minutos tentando sondar o disco com falha, o que é irritante;
  • mas o mais irritante é que o sistema não consegue suspender devido a /dev/sdb falhar.

Repare que eu posso viver com o atraso na inicialização - o que me preocupa é o currículo / suspensão.

Então a questão é: posso dizer ao kernel para evitar a possibilidade de testar o dispositivo em ata: 2?

No kernel antigo (< 3.0), quando ainda consegui cavar um pouco na origem, havia um parâmetro de linha de comando do estilo hdb=ignore que teria feito o truque.

Eu tentei todos os truques propostos abaixo com udev e libata:force parâmetros do kernel, sem sucesso. Especificamente, o seguinte não funciona:

  1. Adicionando a um dos seguintes /etc/udev/rules.d/ a um arquivo (em execução anterior como 00-ignoredisk.rules ou tardio como 99-ignoredisk.rules ou em ambos os lugares)

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

    nem

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

    nem muitas soluções intermediárias --- isso torna o disco não acessível após a inicialização, mas é testado na inicialização e ainda verificado ao suspender --- fazendo com que a suspensão falhe.

  2. Editando os arquivos do sistema /lib/udev/rules.d/60-persistent-storage.rules (e udisks , udisks2 ) mudando

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

    para

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

    novamente, isso tem algum efeito, mascarando o disco do userspace, mas o disco ainda está visível para o kernel.

  3. Inicializando com todas as combinações possíveis (bem, muitas delas) dos parâmetros libata:force (encontrado, por exemplo, aqui ) para desabilitar DMA, baixa velocidade ou o que quer que seja sobre o disco com falha --- não funciona. O parâmetro é usado, mas o disco ainda está sendo testado e falha.

    Completa udevadm info -a -n /dev/sdb colada ao link

    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
    

    que está claramente errado. No entanto:

    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
    

(dados SSD do link ).

    
por Rmano 26.11.2013 / 17:20

4 respostas

22

libata não possui nenhuma opção noprobe; que era uma opção de legado do IDE ...

Mas eu fui e escrevi um patch do kernel para você que o implementa. Deve se aplicar a muitos kernels com muita facilidade (a linha acima foi adicionada 2013-05-21 / v3.10-rc1 *, mas pode ser aplicada com segurança manualmente sem essa linha).

Atualizar O patch agora é upstream (pelo menos no kernel estável 3.12.7). Está no kernel padrão distribuído com o Ubuntu 14.04 (que é baseado no 3.13-stable).

Quando o patch estiver instalado, adicione

 libata.force=2.00:disable

para os parâmetros de inicialização do kernel irá esconder o disco do kernel do Linux. Verifique novamente se o número está correto; pesquisar pelo nome do dispositivo pode ajudar (obviamente, você precisa verificar as mensagens do kernel antes adicionando os parâmetros de inicialização):

(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

O número importante é o ata2.00 na primeira linha acima.

    
por 08.12.2013 / 01:58
12

Problemas de hardware possuem solução de hardware físico. Você considerou desoldar ou cortar a fonte de alimentação da unidade?

EDIT: Ok, se isso não é uma opção, as pessoas estão usando isso antes para ligar um disco rígido. Você poderia usar isso para desativar sua unidade.

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

Observe que qualquer outro processo pode forçar uma varredura do barramento SATA e, em seguida, faz com que esteja de volta. Tente fazer isso antes de hibernar o laptop.

Editado por OP: funcionou . Eu adicionei o seguinte arquivo:

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

com conteúdo:

#!/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 agora o sistema suspende (e continua) corretamente.

    
por 04.12.2013 / 22:58
3

BIOS

Esse dispositivo não é exibido de qualquer maneira por meio do seu BIOS?

Muitas vezes, os HDDs são configurados em um modo "automático", eu verifico se esses dispositivos estão em um estado desativado e até mesmo explicitamente habilito somente o disco rígido e desabilitando tudo o mais.

Opções de inicialização do kernel

Muitas vezes você pode desativar vários subsistemas de serem detectados automaticamente pelo kernel Linux de inicialização através do uso de diferentes opções de inicialização que podem ser passadas para ele como switches.

A maioria, se não todas, as opções estão listadas aqui:

Linux em um livro resumido

Você pode querer folhear o livro da O'Reilly, Kernel do Linux em poucas palavras , especificamente, Capítulo 7: Personalização de um Kernel .

Este livro é disponibilizado gratuitamente por seu autor, Greg Kroah-Hartman, em seu site pessoal. O livro inteiro também pode ser baixado.

    
por 26.11.2013 / 20:14
0

Maneira do Linux para verificar o bloqueio: sudo hdparm -I /dev/sdX (com X = a..z; você deve saber qual é o seu dispositivo, é claro). No final da saída (grande), você DEVE ler as últimas 10 linhas: *not* locked .

    
por 16.01.2016 / 19:04