私はArchLinuxを SBドライブ に 完全なシステム暗号化 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
フックの依存関係は何ですか?フックの依存関係の詳細はどこにありますか?
あなたのフックはすべてここにあります:
% 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
}
...
あなたの問題は、フックが/etc/mkinitcpio.conf
のHOOKS行(単なる配列)にリストされている順序で実行されることでした。基本的に、暗号化スクリプトbeforebase
フックを実行しようとしていました。これは、起動に必要なランタイムを提供します。1。
mkinitcpio -H $hook
を発行すると、各フックについて読むことができます。
Arch Wiki mkinitcpioページ には良い説明があります。 /usr/lib/initcpio/hooks/
の各フックを読み取って、実際に実行されているものを確認することもできます。
Archのmkinitcpio
開発者であるDaveReisnerも、 mkinitcpioの最適化 に関する優れた投稿をしており、すべてがどのように組み合わされているかについてより詳細に説明しています。
1. Archwiki mkinitcpioページは、「何をしているのかわからない限り」、常に最初にbase
フックを含める必要があることを明確にしています。 警告レクター.。