Debian trixieにアップグレードしてみた

Geminiと協力しながらアップグレード時のトラブルシューティングをしていった。
はじめに
軽い気持ちで sudo apt full-upgrade
を実行したら、見たこともないエラーが次々と表示された。この記事は、そんな apt
の「依存関係地獄」に陥った際の、トラブルシューティング記録です。また次のアップグレードのときに役に立つんじゃないかな。
-
libdvd-pkg
のアップグレード失敗 -
libodbc1
とlibodbc2
のファイル競合 - 「未解決の依存関係です」のエラー

libdvd-pkg
のアップグレードが失敗
sudo apt full-upgrade
を実行すると、libdvd-pkg
の処理でエラーが発生し、アップグレードが中断してしまいました。libdvd-pkg
は、暗号化されたDVDを再生するためのライブラリ libdvdcss2
を外部からダウンロードし、コンパイル・インストールするためのヘルパーパッケージです。この「コンパイル」の過程で問題が起きていたようでした。
エラーメッセージ
dpkg-deb: エラー: ペースト subprocess was killed by signal (Broken pipe)
処理中にエラーが発生しました:
/tmp/apt-dpkg-install-fAoJIx/5-libodbc1_2.3.11-3_amd64.deb
libdvd-pkg: Checking orig.tar integrity...
/usr/src/libdvd-pkg/libdvdcss_1.4.3.orig.tar.bz2: 完了
libdvd-pkg: `apt-get check` failed, you may have broken packages. Aborting...
E: Sub-process /usr/bin/dpkg returned an error code (1)
Gemini曰く、このようなパッケージ固有のスクリプトが失敗した場合、まずは再設定コマンドを試すのが定石のようです。
sudo dpkg-reconfigure libdvd-pkg
実行時の選択肢で、ソースコードのDL等をスキップするオプションがあったのでそれを選択。もう1つの選択は忘れたがYesかNoのどっちかで進められた。

libodbc1 vs libodbc2 ファイル競合
エラーメッセージ
trying to overwrite '/usr/lib/x86_64-linux-gnu/libodbc.so.2.0.0', which is also in package libodbc2:amd64 (2.3.12-2)
dpkg-deb: エラー: ペースト subprocess was killed by signal (Broken pipe)
Gemini曰く、これは典型的なファイル競合エラーです。
要するに、「libodbc1 をインストールしようとしたら、その中身のファイルが、既にインストール済みの libodbc2 のファイルと全く同じ名前・場所で被ってしまった」という状況です。
これはなかなか骨が折れました。普通は下記2つの方法で解決できるらしい。
・sudo apt purge libodbc1
・sudo apt --fix-broken install
しかしどちらも失敗に終わりました。
最終的にどう見ても要らないlibodbc1を強制削除しました。
sudo dpkg --remove --force-depends libodbc1

grub復旧
この後やらかしました。grubのインストール先選択で、インストールにチェックはつけたけどescキーで抜けてそのままインストール続行。
↓
結果、起動しない文鎮ができあがりました。泣ける。
対処
- Debian linux live isoをUSBにインストールして起動
- chrootでブートするディスクをマウントしてgrubをインストール
これは前回正当な手順でやっていたのでコマンドを記録していて助かりました。
live isoで起動すると、grub-installは/usr/sbin/grub-installに存在するようです。
コマンド
// grub2の準備
# apt-get install grub2 grub-efi-amd64-bin
// chrootする(rootで実行していく)
# sudo su
// データ用の領域をマウントする
# mkdir /chroot
# mount /dev/nvme0n1p2 /chroot
// プログラム実行に必要なものをbind
# mount --bind /dev /chroot/dev
# mount --bind /dev/pts /chroot/dev/pts
# mount --bind /proc /chroot/proc
# mount --bind /sys /chroot/sys
# mount --bind /run /chroot/run
# chroot /chroot
# mkdir -p /boot/efi
# mount /dev/nvme0n1p1 /boot/efi
// grub-installと確認
# /usr/sbin/grub-install --target=x86_64-efi --efi-directory=/boot/efi --recheck
# ls -l /boot/efi/EFI/debian
// 特にパス指定とかはいらなかった
# update-grub
// 電源停止
# poweroff

最後に、Linuxがdkmsの起動でコケていた。エラー文から原因はカーネルのソースコードがないという内容だった。そもそもパッケージ入れてなかったことに気づきインストール実施。
$ sudo apt-get install linux-headers-amd64
$ sudo poweroff