web-dev-qa-db-ja.com

initramfs、LUKS、およびdm_modはアップグレード後に起動できません

私のRaspberryPi(現在私から10,000 km離れています)は次のように機能します。

  • Raspbian(2016年7月版)を実行しています
  • SDカードには/bootが含まれています
  • 暗号化されたハードディスクドライブ(LUKS cryptsetupを使用)には/が含まれています
  • Piが起動したら、SSH経由でdropbearを使用してリモートでHDDのロックを解除できます。 HDDのパスワードを要求すると、起動シーケンスは正常に続行されます。

私がこれらすべてをどのように行ったかについての詳細は、 http://blog.romainpellerin.eu/raspberry-pi-the-ultimate-guide.html をお読みください。
TL; DRここに短縮バージョンがあります:

apt-get install busybox cryptsetup rsync
echo "initramfs initramfs.gz 0x00f00000" >> /boot/config.txt
sed -e "s|root=/dev/mmcblk0p2|root=/dev/mapper/hddcrypt cryptdevice=/dev/sda1:hddcrypt|" -i /boot/cmdline.txt
sed -e "s|/dev/mmcblk0p2|/dev/mapper/hddcrypt|" -i /etc/fstab
echo -e "hddcrypt\t/dev/sda1\tnone\tluks" >> /etc/crypttab
cryptsetup --verify-passphrase -c aes-xts-plain64 -s 512 -h sha256 luksFormat /dev/sda1
mkinitramfs -o /boot/initramfs.gz $(uname -r)
aptitude install dropbear
// Configuring the SSH access here...
mkinitramfs -o /boot/initramfs.gz $(uname -r)
update-initramfs -u

問題

昨日まで、すべてが正常に機能していました。再起動して、SSH経由でHDDのロックを解除できます。しかし、昨日はaptitude update && aptitude upgradeをしました。私の知る限り、これはカーネルをアップグレードしません。とにかく、再起動しました。今、私はロック解除のステップで立ち往生しています。正しいパスワードを入力しても、すぐにCan't change directory to <something/a kernel version>Cannot initialize device-mapper. Is dm_mod kernel module loaded?と表示され、パスワードを再度要求され続けます。

少し前にセットアップしたので、どのカーネルが実行されているのかわかりません。あまり使用していません。

詳細が不足して申し訳ありませんが、ラズベリーに物理的にアクセスできず、昨日オフにしたので、覚えていることからわかります。

仮定

/boot/initramfs.gzを微調整することで修正できると確信していますが、方法がわかりません。手伝ってくれませんか。どうもありがとうございました。

3
Romain Pellerin

aptitude upgradeがカーネルに影響を与えないという印象を与えた理由はわかりませんが、単にそうではありません。暗号化されたpiのカーネルを更新した後、同じ問題が発生しました。問題は、initramfsを再構築する必要があることです。これが外部マシンでそれを行う方法です。

まず、暗号化されたラズビアンが入ったSDカードを外部コンピューターに接続し、次のようにすべてをマウントします。

cryptsetup -v luksOpen /dev/mmcblk0p2 thunderdome
mount /dev/mapper/thunderdome /mnt
mount /dev/mmcblk0p1 /mnt/boot
mount -o bind /dev /mnt/dev
mount -t sysfs none /mnt/sys
mount -t proc  none /mnt/proc

Qemuをインストールして、RaspberryPiバイナリをエミュレートします。

apt-get install qemu qemu-user-static binfmt-support

this Gist に従って、続行する前に/mnt/etc/ld.so.preloadからすべての行を削除することをお勧めします。これはsedコマンドが次のように行うことです。

# comment out ld.so.preload
sed -i 's/^/#/g' /mnt/etc/ld.so.preload
# copy qemu binary
cp /usr/bin/qemu-arm-static /mnt/usr/bin/

# chroot to raspbian and rebuild initramfs
chroot /mnt /bin/bash
    mkinitramfs -o /boot/initramfs.gz [NEW RASPBIAN KERNEL VERSION]
    exit

# undo damage
sed -i 's/^#//g' /mnt/etc/ld.so.preload
umount /mnt/{dev,sys,proc,boot}

chroot内の/lib/modulesをチェックすると、新しいラズビアンカーネルバージョンを見つけることができます。

それを行った後、私のRaspberryPiは再び正常に起動しました。

3