2019年7月28日日曜日

Debianで暗号化したroot fsを読めなくなりunbootableになった

Linux kernel 5.2.3のreleaseに伴ったupgradeを実施してrebootした所、LUKSで暗号化したroot filesystemが読めず (passphraseを尋ねてくるpromptも出ず)にunbootableに陥った。

原因は、dependencyの関連でcryptsetup-initramfsというpackageがuninstallされ、その後にregenerateされた/boot/initrd.imgにcryptsetup関連のbinaryが含まれなくなったことだった。


症状と対策



* Linux kernelがloadされboot processは進行するが、暗号化されたroot filesystemが開けずにretryを繰り返して何れgive upする
* 前回別のmachineでGRUB2関連のトラブルを経験していたので、GRUB2 (今回はx86_64-efi)を入れ直したのだが↑と同じ症状でbootできず
* 以前のkernel (v5.1.15)からbootできることに気付き、kernel optionなどの変更によるものかと疑いはじめる。また、他のinitrd.imgと比較した所、bootできないinitrd.imgは1MBほどsizeが小さくなっていると気付き、ここに問題が潜んでいると推定
* 通常の方法では中に含まれているものが見えないので、lsinitramfsという専用のprogramで中身を検めた所、cryptsetup関連のprogramなどが含まれていないと判明
* 最終的にcryptsetup-initramfsというpackageがuninstallされていたことに気付いて再びinstallし、initrd.imgをregenerate (update-initramfs)して解決した


蛇足


根本的な理由に辿り着くまで非常に時間が掛かったのだが、それは以下の要因のため。

* 数日前に別のmachine (Linux box)でGRUB2関連のトラブルに遭遇していた。今回もそれに類似する、或いは見た目は違っていても根本に同じ問題があるのではないかと推定し (結果的に外れていた)、そちらの問題の解消のため作業に取り掛かった
* 前回のmachineと今回のmachineでは使っているGRUB2の種類が違っており、作業に慣れていなかった。前回はDOS形式のdiskにi386-pc方式でMBRにGRUBをinstallしていたが、今回はGPT形式のdiskにx86_64-efi方式でEFI領域にGRUBをinstallしていた
* LVMの扱いに習熟していなかった

2019年7月24日水曜日

Apple iOS 12.4がreleaseされた

手持ちのiPad mini 2にてupgradeを実施。今の所は特に問題なく使えている。

WWDC 2019で発表されたiOS 13 iPadOSでは、残念ながらiPad mini 2が対象外となりそうだが。


2019年7月19日金曜日

Debian sid (unstable)でgrub2がおかしくなりunbootableになったのを修正した

Linux kernel 5.2.1がreleaseされたのでいつも通りにcustom kernelをbuildしてupdateした所、grub2 (bootloader)の設定がどこかの時点でおかしくなっていたらしくunbootableとなった。

色々と調べつつDebian liveからGRUB2を入れ直して復旧できたので手順を記録しておく。


症状と原因


...
symbol `grub_file_filters' not found
grub rescue>

lsすると(hd0,msdos1)みたいなのが表示される。環境依存だが、今回は(hd0,msdos1)が/dev/sda1で/bootに割り当ててあるpartition。

insmod normal.mod
を実行するとsymbol not foundが出る。insmod normal.modできないとnormalになれずbootもできない、と。

どうやらupgradeしたgrub2のpackageそのものか、grub2のinstallation processに問題があったようだ。

rebootのlogとaptitudeによるupgradeのlog


* grub2関連packagesがupgradeされたのは7/10 (2.02+dfsg1-20 → 2.04-1)
* それ以降のrebootは今回 (7/18)が初めてだった (`last reboot`で調べられる)


復旧の用意


正常に稼働するmachineでDebian liveのUSB flash memoryを作製する。今回は別のLinux boxを利用した。

Debian liveのUSB用imageをdownloadする


速度や負荷の面からrikenやjaistなど日本国内のmirror siteを使うと良いだろう。今回はrikenからdebian-live-10.0.0-amd64-standard.isoをdownloadした。GUIは不要との判断からstandardを選択したが、好みでXfceなどのdesktop environmentのflavorsも使える。

standardだとDEがないのでfilesizeが小さい、USB flash memoryへの書き込みが速く終わる、起動が速い、などの利点がある(ように思う)。boot後は自動loginですぐconsoleが使えるようになるので面倒がない点も良い。

USB flash memoryに書き込み


書き込み先のUSB flash memoryは/dev/sdbとして認識したが環境依存。危険なcommandなので必ず書き込み先を確認する。あとblocksize (bs)は適当なので最適値かどうかは不明。

% sudo dd if=debian-live-10.0.0-amd64-standard.iso of=/dev/sdb bs=10M


復旧の手順


ここから復旧対象のmachineでの作業。

BIOS/UEFIのmenuからboot deviceの順序を変更する


USB flash memoryを最優先にする。BIOS/UEFIによって様々だが、一通り眺めればわかるだろう。今時のUEFIだとどんなdevice(s)が接続されているかも表示されることが多いと思う。

Debian liveから起動


USB flash memoryからbootするとmenuが表示される。Installではなく、Debian liveを選ぶ。standardだとconsoleに自動loginなので面倒がなくて良い。

なお、Debian liveでは(次回のsessionには保存されないが)必要なDebian packagesを後付けでinstallできる。defaultではLUKSやGRUB2のpackagesが入っていないので、これを導入する。

packageを導入するにはまずnetworkをどうにかする必要がある。ここも環境依存なのだが、今回復旧対象のmachineはstaticにIPv4 addressを割り当てているのでip commandで関連の設定を行う。

IPv4 addressの割り当て


対象のnetwork interfaceはenp0s****として認識された。環境依存。

% ip addr show # どんなnetwork interface(s)があるか、どんなaddressが割り当てられているか
% sudo ip addr del 169.254.13.127/16 dev enp0s**** # 不要なaddress (多分autoで設定されているやつ)を削除しておく。不要だとは思うが念のため
% sudo ip addr add 192.168.11.2/24 dev enp0s**** # 普段machineに割り当てているaddressをassignする

routingの設定


このままだと外に出て行けないのでdefault gatewayを設定する。今回使うrouterのaddressは192.168.11.1。

% ip route show # 現在のrouting tableの確認
% sudo ip route add default via 192.168.11.1 # routerのaddressをdefault gatewayに指定

nameserverの設定


まだdomain nameのresolveができないのでnameserverを指定する。今回はdefault gatewayと同じaddress。

% sudoedit /etc/resolv.conf

> nameserver 192.168.11.1

aptのmirrorを設定


ここまででnetwork installが使えるようになったので、日本国内のmirror serverを設定する。今回はftp.jp.debian.orgを指定した。

% sudoedit /etc/apt/sources.list

> ftp.jp.debian.org

必要なDebian packageのinstallation (#1 LUKS)


前述の通り、Debian liveにはLUKSもGRUB2もdefaultでは入っていないので、別途installする必要がある。networkを設定したので導入可能な状態。

まずはcryptsetupを導入する。grub2は後で別にinstallする。

% sudo apt-get update
% sudo apt-get install cryptsetup

cryptsetupでLUKSの領域をmount


復旧対象machineのSSDは/dev/sdaとして認識されていて、/dev/sda1が/boot、/dev/sda5がroot (LUKSでencrypted)。

% sudo cryptsetup luksOpen /dev/sda5 secured_root # "secured_root"は何でも良いので適当な名前をつける
% sudo mount /dev/mapper/secured_root /mnt # ↑で適当に付けた名前が/dev/mapper/以下に現われるのでそれをmountする
% sudo mount /dev/sda1 /mnt/boot # LUKSで暗号化されたroot partitionに本来の (現在は壊れているので復旧対象の)/bootをmountする

必要なDebian packageのinstallation (#2 GRUB2)


% sudo apt-get install grub2

installationの最中に、grubの設定に関するgraphical menuが出るがcancel。

GRUB2をSSDへinstallし直す


あくまで対象はSSD (/dev/sda)であって、USB flash memoryではないことに注意。

% sudo grub-install --root-directory=/mnt /dev/sda

再起動してUSB flash memoryを引き抜く


% sudo shutdown -r now

reboot後、本来のGRUB menuが出れば復旧完了。

必要に応じて変更したBIOS/UEFIの設定(boot deviceの優先順位)を元に戻す。


参照したwebsites

* [Linux Set Up Routing with ip Command - nixCraft](https://www.cyberciti.biz/faq/howto-linux-configuring-default-route-with-ipcommand/)
* [grub rescueでnormal.modがnot foundですとか言われた話 - ひびっちぇ どっとこむ](http://hibitche.hatenablog.jp/entry/2015/07/17/012051)
* [WM×LI: grub rescue が表示されても慌てずに.](http://nort-wmli.blogspot.com/2013/06/grub-rescue.html)
* [#931896 - grub-efi-amd64: symbol `grub_file_filters` not found - Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=931896)


2019年7月18日木曜日

SwissMicros DM15Lのfirmware update (V29)

SwissMicros DM15Lのfirmware (V29)がreleaseされていたのでupdateした。

いつも通り、Linux boxからlpc21ipcを用いた。

firmware updateの手順については以前の記事で触れているので必要に応じて参照されたい。

cf. https://typeinf-memo.blogspot.com/2016/07/swissmicros-dm-15lfirmware-upgrade.html

SwissMicros DM42のfirmware update (DMCP v3.14)

SwissMicros DM42のfirmware (DMCP)のv3.14がreleaseされていたのでupgradeした。

今回はDM42のinternal storageのFAT領域にDMCP v3.14のfileをuploadして、DM42のmenuからupgradeを試みた (7/8)。

なおDMCPのみなので、upgradeが終了してDM42をresetするとDMCP menuで立ち上がって、そのままでは計算機として使えない状態となる。別途DM42-3.14.pgmをdownloadしてFAT areaのrootにinstallした後、DMCP menuのload programから実行する必要がある。

7/18現在ではfirmwareのdownload pageより、DMCP_flash_3.14_DM42-3.14.binをdownloadしてupgradeする方が楽だろう。

cf.

* [Index of /dm42/firmware](https://www.swissmicros.com/dm42/firmware/)