컴퓨터에 Arch Linux를 설치했습니다USB 드라이브그리고시스템 전체 암호화LUKS를 사용하세요. Arch 위키는 평소처럼 거의 모든 것을 안내해 주었습니다. 내가 가진 유일한 문제는 mkinitcpio
.Arch 위키에서 USB 설치의 경우 block
후크가 udev
후크 바로 뒤에 와야 한다고 말합니다. Wikipedia에서는 또한 암호화를 위해 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
둘 다 쉘 스크립트입니다.
% 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
편리하지만 다른 기능과 마찬가지로 도우미 쉘 기능에 지나지 않습니다. 디스크 이미지를 보면 실제로는 그 이상 아무것도 아니라는 것을 알 수 있습니다. 결국 일반 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/
실제로 실행 중인 내용을 확인할 수도 있습니다.
아치 개발자 mkinitcpio
Dave Reisner는 다음과 같습니다.mkinitcpio 최적화서로 어떻게 결합되는지 자세히 설명합니다.
base
1. Archwiki mkinitcpio 페이지에는 "무슨 일을 하고 있는지 알지 않는 한" 항상 후크를 먼저 포함해야 한다고 명시되어 있습니다 .강사에게 경고하다...