Encrypt hook in mkinitcpio.conf para criptografia de sistema completo USB drive Arch install

6

Instalei o Arch Linux em uma unidade USB com Replicação completa do sistema usando o LUKS. O wiki do Arch, como de costume, me acompanhou em quase tudo. O único problema que encontrei foi usar a configuração dos ganchos em mkinitcpio . O wiki do Arch diz que, para uma instalação USB, o gancho block deve vir imediatamente após o gancho udev . O wiki também diz para criptografia que o encrypt hook deve vir antes, mas não necessariamente imediatamente, o filesystem hook. Seguindo essas regras eu tentei primeiro:

HOOKS="encrypt base udev block autodetect modconf filesystems keyboard fsck"

mas não funcionou, movi encrypt para mais tarde:

HOOKS="base udev block autodetect modconf encrypt filesystems keyboard fsck"

e funciona bem. Isso leva à minha pergunta. Quais são as dependências para o encrypt hook e onde posso encontrar detalhes sobre dependências de hook?

    
por StrongBad 05.04.2014 / 21:16

2 respostas

10

Seus ganchos estão todos aqui:

% ls /usr/lib/initcpio/{hooks,install}
/usr/lib/initcpio/hooks:
btrfs        dmraid   keymap  mdadm    mhwd-fb  miso_loop_mnt  net     shutdown  udev  v86d
consolefont  encrypt  lvm2    memdisk  miso     miso_pxe_nbd   resume  sleep     usr

/usr/lib/initcpio/install:
autodetect  consolefont  fw        mdadm_udev  miso_loop_mnt  pata    sd-encrypt   sleep    usbinput
base        dmraid       keyboard  memdisk     miso_pxe_nbd   pcmcia  sd-lvm2      strip    usr
bcache      encrypt      keymap    mhwd-fb     mmc            resume  sd-shutdown  systemd  v86d
block       filesystems  lvm2      miso        modconf        sata    sd-vconsole  udev     virtio
btrfs       fsck         mdadm     miso_kms    net            scsi    shutdown     usb

Eles são todos scripts de shell:

% cat /usr/lib/initcpio/{hooks,install}/encrypt
#!/usr/bin/ash
run_hook() {
    modprobe -a -q dm-crypt >/dev/null 2>&1
    [ "${quiet}" = "y" ] && CSQUIET=">/dev/null"
    # Get keyfile if specified
    ckeyfile="/crypto_keyfile.bin"
    if [ -n "$cryptkey" ]; then
        IFS=: read ckdev ckarg1 ckarg2 <<EOF
...

Isso é algo que você já conhece - é muito familiar.

Basicamente, se você quer que algo aconteça no início do espaço do usuário, você só precisa carregar os módulos do kernel necessários e agir de acordo - isso é tudo o que esses ganchos estão fazendo.

Se você quiser saber o que está acontecendo na imagem initramfs , dê uma olhada:

% lsinitcpio --help lsinitcpio 17 usage: lsinitcpio [action] [options] 
usage: lsinitcpio [action] [options] <initramfs>

  Actions:
   -a, --analyze        analyze contents of image
   -c, --config         show configuration file image was built with
   -l, --list           list contents of the image (default)
   -x, --extract        extract image to disk

  Options:
   -h, --help           display this help
   -n, --nocolor        disable colorized output
   -V, --version        display version information
   -v, --verbose        more verbose output

lsinitcpio é útil, mas nada mais é do que uma função auxiliar de shell - assim como o restante deles. Quando você olha para a imagem do seu disco, percebe que não é nada mais do que isso - apenas uma imagem raiz comum do Linux depois de tudo:

% mkdir /tmp/init ; cd $_
% lsinitcpio $(printf /boot/*.img | head -n1) | grep -Eo '^./[^/]*' | sort -u
./VERSION
./bin
./buildconfig
./config
./dev
./etc
./init
./init_functions
./lib
./lib64
./new_root
./proc
./run
./sbin
./sys
./tmp
./usr

Você pode extraí-lo:

% lsinitcpio --extract $(printf /boot/*.img | head -n1)
% ls
dev
etc
new_root
proc
run
sys
tmp
usr
VERSION
bin
buildconfig
config
init
init_functions
lib
lib64
sbin

E dê uma olhada:

% cat ./init_functions
...
default_mount_handler() {
    if [ ! -b "$root" ]; then
        err "Unable to find root device '$root'."
        echo "You are being dropped to a recovery shell"
        echo "    Type 'exit' to try and continue booting"
        launch_interactive_shell
        msg "Trying to continue (this will most likely fail) ..."
    fi
    msg ":: mounting '$root' on real root"
    if ! mount ${fstype:+-t $fstype} -o ${rwopt:-ro}${rootflags:+,$rootflags} "$root" "$1"; then
        echo "You are now being dropped into an emergency shell."
        launch_interactive_shell
        msg "Trying to continue (this will most likely fail) ..."
    fi
}
...
    
por 05.04.2014 / 21:33
4

Seu problema é que os ganchos são executados na ordem em que estão listados na linha HOOKS (que é apenas uma matriz) em /etc/mkinitcpio.conf . Essencialmente, você estava tentando executar o script de criptografia antes do base hook, que fornece as necessidades de tempo de execução para inicializar 1 .

Você pode ler sobre cada um dos ganchos emitindo mkinitcpio -H $hook .

A página do Mckinitcpio do Arch Wiki tem uma boa explicação. Você também pode ler cada um dos ganchos em /usr/lib/initcpio/hooks/ para ver o que realmente está sendo executado.

O desenvolvedor mkinitcpio do Arch, Dave Reisner, também tem uma boa postagem sobre otimização do mkinitcpio que tem uma explicação mais detalhada de como tudo se encaixa.


1. A página Archkiniki mkinitcpio deixa claro que você deve sempre incluir o base hook primeiro, "a menos que você saiba o que está fazendo." Leitor de advertências ...

    
por 05.04.2014 / 21:41