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

23

Eu tenho um laptop Samsung (Chronos S7) com um disco rígido SATA de ônibus ata:1, que é detectado como /dev/sda, um SSD de 8GB on ata:2, /dev/sdbe vários outros dispositivos no resto da interface SATA.

O problema é que o disco SSD é

  • soldado à placa principal (imóvel)
  • interrompido (apenas fornece erros de E / S para 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 detectar o disco com falha, o que é irritante;
  • mas a coisa mais irritante é que o sistema falha ao suspender devido a /dev/sdbfalha.

Observe que eu posso viver com o atraso na inicialização - o que me preocupa é a coisa de retomar / suspender.


Portanto, a pergunta é: posso dizer ao kernel para evitar mesmo investigar o dispositivo no ata: 2?

No kernel mais antigo (<3.0), quando eu ainda era capaz de cavar um pouco a fonte, havia um parâmetro de linha de comando do estilo hdb=ignoreque teria feito o truque.

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

  1. Adicionando a um dos seguintes /etc/udev/rules.d/arquivos (em execução inicial como 00-ignoredisk.rulesou atrasada como 99-ignoredisk.rulesou nos dois locais)

    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 é analisado na inicialização e ainda é verificado durante a suspensão - causando falha na suspensão.

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

    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 espaço do usuário, mas o disco ainda está visível para o kernel.

  3. A inicialização com todas as combinações possíveis (bem, muitas delas) dos libata:forceparâmetros (encontrados por exemplo aqui ) para desativar o DMA, a velocidade mais baixa ou qualquer outra coisa sobre o disco com falha - não funciona. O parâmetro é usado, mas o disco ainda é analisado e falha.

    Completo udevadm info -a -n /dev/sdbcolado em 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
    

    o que está claramente errado. Mesmo assim:

    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 de http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579 ).

Rmano
fonte
Desculpe se isso é óbvio demais, mas como você não incluiu na sua pergunta: você certificou-se de que o nome do dispositivo ou o UUID não esteja listado /etc/fstab? Porque o atraso na inicialização pode ser causado anteriormente pelo kernel ou pelo udev, que parece ser o caso, mas também mais tarde pelo fsck, ao ler fstab.
Teresa e Junior
Sim, não há menção de / dev / sdb (ou de suas partições) nos arquivos do sistema. O atraso ocorre antes do início do init ... está em um kthread (porque a inicialização continua em paralelo), mas é em um nível mais fundamental. Mas, na verdade, o atraso na inicialização é o menor dos problemas - se eu pudesse ignorar o disco durante a suspensão / retomada, para que a suspensão funcione, ficarei feliz. (obrigado mesmo assim).
Rmano
Você está usando no initrd? se sim de quem?
Hildred
@ildred: Estou usando o kernel padrão e o initramfs do Ubuntu 13.04. Posso desativar o AHCI ou todos os SATA lá, mas meu sistema está inoperante - nenhum disco.
Rmano
O Debian (e Umbutu) compila o subsistema ata como módulo. Você já tentou configurar parâmetros para o módulo quando ele é carregado pelo initrd?
Hildred 26/11/13

Respostas:

26

libatanão possui uma opção noprobe; essa era uma opção IDE herdada ...

Mas eu escrevi um patch do kernel para você que o implementa. Deve aplicar-se 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).

Atualização O patch está 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).

Após a instalação do patch, adicionar

 libata.force=2.00:disable

para os parâmetros de inicialização do kernel ocultará o disco do kernel do Linux. Verifique se o número está correto; procurar pelo nome do dispositivo pode ajudar (obviamente, você deve verificar as mensagens do kernel antes de adicionar 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.00da primeira linha acima.

robbat2
fonte
Muito obrigado. Vou tentar verificá-lo assim que me lembrar de como compilar e instalar um kernel no meu Ubuntu. Infelizmente, terei uma semana muito complexa pela frente ...
Rmano
1
+1 É claramente melhor do que o truque que publiquei. Espero que se torne oficial.
Emmanuel
1
Ok, testei o patch. Funciona. Se você precisar enviá-lo a montante, posso adicionar meu Testado por: ao patch --- você tem meu e-mail verdadeiro no meu perfil. Eu o instalei seguindo (com peculiaridades) as instruções em wiki.ubuntu.com/Kernel/BuildYourOwnKernel .
Rmano
1
@ illuminÉ --- acabou de editar a resposta nesse sentido --- aguarde que ela seja aprovada.
Rmano
1
Outra razão para amar GENTOO !!
eyoung100
15

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

Edição: Ok, se isso não é uma opção que as pessoas estão usando isso antes para hot-plug um disco rígido. Você pode 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 ele volte. Tente fazer isso antes de hibernar o laptop.

Editado pelo 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.

Emmanuel
fonte
1
Se ao menos fosse verdade. Eu não posso nem dizer qual chip (ou chips) é a unidade SSD - a maioria não está marcada. E desligar um chip não é seguro - e os pinos de três estados não acionados? Abri o laptop esperando que a unidade SSD estivesse conectada a algum tipo de placa-filha. Sem sorte (Além disso, a maior parte da dificuldade em escrever drivers de kernel é contornar hw mal projetado).
Rmano
@Rmano Como executa o truque de "exclusão"?
Emmanuel
TI FUNCIONA --- posso suspender após o truque "delete". Muito obrigado. (Ele ainda atrasa a inicialização, mas bem - não é um problema).
Rmano
Muito obrigado por lembrar delete.
Michael Shigorin
3

BIOS

Este dispositivo não aparece de forma alguma através do BIOS?

Muitas vezes, os HDDs são configurados no modo "automático". Eu procurava garantir que esses dispositivos estivessem desabilitados e chegasse ao ponto de explicitamente ativar apenas um HDD e desativar todo o resto.

Opções de inicialização do kernel

Muitas vezes, você pode impedir que vários subsistemas sejam detectados automaticamente pelo Linux Kernel de inicialização através do uso de diferentes opções de inicialização que podem ser transmitidas a ele como comutadores.

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

Linux em um livro Nutshell

Você pode examinar o livro O'Reilly, Linux Kernel in a Nutshell , especificamente o Capítulo 7: Personalizando um Kernel .

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

slm
fonte
Não, o BIOS não possui nenhum vestígio desse disco; Eu posso ver o HDD e o DVD e nada mais. Antes de falhar, no Windows (agora não há mais janelas no sistema), ele era usado como um cache de aceleração para o disco principal. Tentei definir o modo AHCI como legado, desativado, sim ou automático (para todos os discos), mas isso não mudou nada ou (desativado) simplesmente fez o sistema não inicializar.
Rmano 26/11
O outro método que eu usei no passado é quando o Kernel é inicializado para informar via Grub (opções de inicialização do kernel) para noide=..... Existem várias outras opções que você pode fornecer ao kernel de inicialização para desativar a detecção automática de hardware.
slm
o disco é SATA (SCSI), sem IDE. E as hdb=noprobeopções não passaram o agrupamento para o scsi (acho que foi eliminado em torno do 2.6.x), por isso não existe (assim que eu sei) uma sdb=noprobeou ata:2=noprobeopção. Eu li (quase) todo o kernel-parameters.txtarquivo na fonte do kernel e não consigo encontrar o parâmetro correto. Se você conhece alguém, diga-o em uma resposta - ficarei muito agradecido.
Rmano
@Rmano - Vou ter que cavar mais para encontrá-lo, lembro-me de várias opções relacionadas ao HDD e à detecção de ônibus, mas não em cima da minha cabeça.
slm
@Rmano - que tal a opção:libata.dma=
slm
0

Maneira do Linux de verificar o bloqueio: sudo hdparm -I /dev/sdX(com X = a..z; você deve saber qual é o dispositivo da sua unidade, é claro). No final do (grande) de saída, você deve ser capaz de ler no nos últimos 10 linhas: *not* locked.

erro de sintaxe
fonte