Usando o udevadm para esperar que a varredura scsi seja concluída dentro do initramfs?

2

Onde está o problema: Estou usando o ArchLinux com o archzfs, e o zfs hook no meu initramfs ocasionalmente tentará (e falhará) importar pools muito cedo, antes que a varredura do scsi de todos os discos usados pelo ZFS fosse concluída. Isso resulta em falha de inicialização, já que o zfs é usado em meu sistema também como um sistema de arquivos raiz. Para resolver esse problema, estou procurando um comando que bloqueie a execução do zfs hook (é simplesmente um script ash , armazenado e executado dentro da imagem initramfs) até que a varredura scsi tenha sido concluída.

Como isso é relevante para o udevadm: Se eu estivesse usando o kernel do linux antes do 3.6, eu teria simplesmente adicionado modprobe scsi_wait_scan ; rmmod scsi_wait_scan ; para bloquear a execução do zfs hook até que a varredura do scsi fosse concluída. No entanto, estou usando o kernel 4.4 e este módulo não está disponível. Estou pensando em usar udevadm settle , mas não tenho certeza se é realmente bom para esse tipo de uso. Isso porque no ArchLinux já existe o udev hook, que é executado antes do zfs hook e faz o seguinte:

run_hook() { msg ":: Triggering uevents..." udevadm trigger --action=add --type=subsystems udevadm trigger --action=add --type=devices udevadm settle }

Então, seguindo o link eu decidi adicionar duas linhas ao zfs hook (antes zfs import)

# Force udev to list all devices, will block until scsi scan is completed udevadm trigger --verbose --dry-run --type=devices --subsystem-match=scsi_disk udevadm settle

Isso faz sentido? Ou devo tentar algo diferente? O problema com o teste da solução é que o problema é acionado apenas ocasionalmente, o que significa que mesmo que eu reinicie o computador várias vezes sem vê-lo novamente, não é uma garantia de que o problema foi corrigido. Então, a pergunta aqui não é para corrigir meu initramfs para mim, mas para confirmar (ou negar) se udevadm pode ser usado para esperar que a varredura scsi seja concluída e, em caso afirmativo, como.

    
por bronekk 28.11.2016 / 16:07

1 resposta

1

Curiosamente, parece que o udevadm settle não impede que o zfs seja carregado antes que a varredura de dispositivos scsi seja concluída. Eu finalmente consertei o problema, forçando a varredura scsi síncrona, como esta

bronek@gdansk ~ % cat /etc/modprobe.d/zfs.conf
# Enforce synchronous scsi scan, to prevent zfs driver loading before disks are available
options scsi_mod scan=sync
    
por 02.01.2017 / 21:54