Causa
Na versão 23, a função mkinitcpio resolve_device () é chamada apenas uma vez. Quando, no momento da execução, os rótulos da unidade ainda não foram lidos, blkid
não pode pesquisar nome da unidade do kernel ( /dev/...
) para o rótulo solicitado.
Solução
Adicionando o gancho "sem-udev", conforme listado abaixo, a função resolve_dispositivo é deixada intacta. Embora a funcionalidade padrão do mkinitcpio disponível para substituir o mount_handler adicione um run_hook é usada para pesquisar até que blkid
retorne um valor ou (um tempo limite de) 10 segundos tenham passado. Assim, o gancho "udev" pode ser removido da configuração do mkinitcpio.
Notas
- Esta solução foi criada com a ajuda de falconindy .
- Houve uma mensagem de erro na fase inicial de inicialização envolvendo fsck. Para remover essa mensagem, o gancho sem udev foi reescrito para usar um
run_hook
em vez de ummount_handler
$ cat /usr/lib/initcpio/hooks/without-udev
#!/bin/ash
# Minimal initramfs files are created without udev.
# This hooks provides a polling disk mount replacement for udev.
# Udev hook can be removed, resulting in smaller initramfs files.
run_hook () {
local dev timeout sleepval device=$root
# if udev is running then exit
[ "$udevd_running" -eq 1 ] && return
# try for (timeout * sleepval =) 10 seconds to handle slow (USB) devices
timeout=1000
sleepval=0.01
case $device in
# label to resolve, when resolved the kernel block device also exists
UUID=*|LABEL=*|PARTUUID=*|PARTLABEL=*)
while [ $timeout -gt 0 ]; do
timeout=$((timeout - 1))
dev=$(blkid -lt "$device" -o device)
[ -n "$dev" ] && timeout=0 || sleep $sleepval
done
;;
# kernel named block device, poll for existence
/dev/*)
while [ $timeout -gt 0 ]; do
timeout=$((timeout -1))
if [ -b "$device" ]; then
dev=$device
timeout=0
else
sleep $sleepval
fi
done
;;
esac
}
# vim:set syntax=sh:
$ cat /usr/lib/initcpio/install/without-udev
#!/bin/bash
build() {
add_runscript
}
help() {
cat <<HELPEOF
This hook provides support for booting without the "udev" hook,
including support for UUID, LABEL, PARTUUID, PARTLABEL.
HELPEOF
}
# vim: set ft=sh ts=4 sw=4 et: