mkinitcpio.conf 中的加密钩子用于完整系统加密 USB 驱动器 Arch 安装

mkinitcpio.conf 中的加密钩子用于完整系统加密 USB 驱动器 Arch 安装

我已经在一台机器上安装了 Arch LinuxUSB驱动器全系统加密使用LUKS。 Arch wiki 像往常一样引导我完成了几乎所有内容。我遇到的唯一问题是在mkinitcpio. Arch wiki 说,对于 USB 安装,block挂钩必须紧接在udev挂钩之后。维基百科还表示,对于加密,encrypt钩子必须位于钩子之前,但不一定紧邻filesystem钩子。遵循这些规则我首先尝试:

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

但它不起作用,所以我搬到encrypt了后面:

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

而且效果很好。这引出了我的问题。挂钩的依赖项是什么encrypt?在哪里可以找到有关挂钩依赖项的详细信息?

答案1

你的钩子都在这里:

% 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

它们都是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
...

这是你已经知道的东西——非常熟悉。

基本上,如果您希望在早期用户空间中发生某些事情,您只需要加载必要的内核模块并采取相应的操作 - 这就是所有这些钩子正在做的事情。

如果您想知道图像中发生了什么initramfs,请看一下:

% 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很方便,但它只不过是一个辅助 shell 函数 - 就像其他函数一样。当您查看磁盘映像时,您会发现它实际上仅此而已 - 毕竟只是一个常规的 Linux 根映像:

% 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

您可以提取它:

% 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

并四处看看:

% 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
}
...

答案2

您的问题是钩子按照它们在 中的 HOOKS 行(这只是一个数组)中列出的顺序执行/etc/mkinitcpio.conf。本质上,您试图运行加密脚本钩子base,它提供启动所需的运行时1

您可以通过发出 来阅读有关每个钩子的信息mkinitcpio -H $hook

Arch Wiki mkinitcpio 页面有一个很好的解释。您还可以读取每个挂钩/usr/lib/initcpio/hooks/以查看实际正在运行的内容。

Arch 的开发mkinitcpio者 Dave Reisner 在优化 mkinitcpio其中更详细地解释了它们如何组合在一起。


1. Archwiki mkinitcpio 页面明确指出,您应该始终base首先包含钩子,“除非您知道自己在做什么”。警告讲师...

相关内容