Como pular / excluir um barramento SCSI da varredura durante a inicialização?

2

Um sistema "Linux debian 3.2.0-0.bpo.3-amd64 # 1 SMP Qui Aug 23 07:41:30 UTC 2012 x86_64 GNU / Linux" tem pelo menos 5 hosts SCSI:

root@debian:~# ls /sys/class/scsi_host
host0  host1  host2  host3  host4

root@debian:~# cat /sys/class/scsi_host/host0/proc_name  
mpt2sas
root@debian:~# cat /sys/class/scsi_host/host1/proc_name
ata_piix
root@debian:~# cat /sys/class/scsi_host/host2/proc_name
ata_piix
root@debian:~# cat /sys/class/scsi_host/host3/proc_name
ata_piix
root@debian:~# cat /sys/class/scsi_host/host4/proc_name
ata_piix

O barramento SCSI mpt2sas tem 32 unidades conectadas. Na inicialização (depois de uma reinicialização), as unidades estão quase sempre no estado de espera (desativação). Isso faz com que cada unidade gire em uma ordem seqüencial. O tempo de rotação de uma unidade típica é de 8 a 9 segundos. Como resultado, a inicialização após uma reinicialização levará quase 5 minutos.

Tendo configurado para o kernel varrer o barramento scsi, o assincrono GRUB_CMDLINE_LINUX="scsi_mod.scan=async" não melhora a inicialização após o tempo de reinicialização. E definir scsi_mod.scan=none faz com que o sistema não inicialize de jeito nenhum.

O objetivo final é inicializar via USB, que é outro scsi_host:

# cat /sys/class/scsi_host/host5/proc_name
usb-storage

Como posso configurar este sistema para excluir o barramento mpt2sas ou (mpt2sas e ata_piix) de girar todas as unidades durante a inicialização após a reinicialização?

    
por Pro Backup 15.11.2012 / 20:25

1 resposta

2

Como o array grande está em um controlador de um tipo separado (marca e modelo, ou melhor: chipset), e nada nele é necessário para o processo de inicialização do sistema, você pode contornar isso forçando uma inicialização do controlador atrasada. A maneira mais fácil de fazer isso é simplesmente colocar na lista negra o módulo do kernel que faz a inicialização do kernel, depois carregá-lo manualmente muito tarde no processo de inicialização.

NOTA: É extremamente importante que isso seja feito apenas com controladores que não contêm nada que seja necessário para o sistema inicializar corretamente. Caso contrário, você se verá com uma falha de inicialização - qualquer coisa, desde serviços que falham ao iniciar ou ler / gravar arquivos no lugar errado, até um pânico do kernel. Tenha isso em mente antes de implementar um esquema como este.

Primeiro, descubra qual módulo do kernel manipula o controlador em questão. Uma rápida pesquisa no Google com base nas informações fornecidas na pergunta diz que provavelmente é o módulo mpt2sas . Segundo, certifique-se de que o código seja realmente compilado como um módulo; algo como find "/lib/modules/$(uname -r)" -name 'mpt2sas*' -print vai fazer bem. (Sim, eu sei que -print é o padrão, mas eu gosto de ser explícito ...) Verifique seu status como um módulo carregado usando lsmod | grep mpt2sas .

Em seguida, adicione o módulo ao arquivo de lista negra de módulos. Você pode adicioná-lo ao /etc/modprobe.d/blacklist.conf ou a um arquivo de configuração separado, como /etc/modprobe.d/mpt2sas.conf. Basta adicionar a seguinte linha a esse arquivo.

blacklist mpt2sas

Isso desativará o carregamento automático do módulo em questão. Vamos aproveitar o fato de que ainda pode ser carregado manualmente usando, e. modprobe - onde "manualmente" pode significar "de um script".

Abra /etc/rc.local (que é executado depois de todos os outros scripts rc) em um editor e adicione as seguintes linhas em algum lugar:

modprobe mpt2sas
mount -a

Você provavelmente quer colocar isso no final do arquivo, mas obviamente antes de qualquer exit ou diretivas similares. O mount -a pode ou não ser necessário dependendo se os sistemas de arquivos são realmente montados na inicialização e se eles são montados automaticamente quando forem encontrados pelo teste da partição de disco do kernel. Você pode tentar sem primeiro, se você quiser e se sentir seguro de que você pode obter acesso ao sistema se ele não funcionar. Se você precisar de algo especial para inicializar o RAID ou algo assim, isso vai entre modprobe e mount . Se algum serviço específico precisar que o grande array esteja disponível, você pode criar um script rc separado para iniciar o array e especificar que ele deve ser executado antes que qualquer serviço seja iniciado. Você pode fazê-lo executar em segundo plano, agrupando-o em um subshell com uma sintaxe como ( commands ) & , mas isso pode ou não ter qualquer efeito perceptível no resultado, pois a análise da partição é feita no kernel. Você pode usar hdparm para desativar as unidades após a partição ter sido montada, se elas forem acessadas raramente. Resumindo, esta é a parte que você pode querer personalizar para suas necessidades particulares .

Em seguida, atualize seu initramfs executando update-initramfs -u como root.

Se nada falhou, você agora deve ser capaz de reboot do seu sistema e aproveitar os benefícios do atraso no spin-up do disco e da análise da partição.

    
por 16.11.2012 / 10:11