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.