Fedora 31から32へのアップグレード中にPC側の事情でdnfが壊れたので、復旧方法について雑にまとめてみた。

By | 2020年5月26日 , Last update: 2020年12月30日

はじめに

半年に一度の恒例行事となりましたFedoraのアップグレードですが、Fedora 31から32へのアップグレード中に大量のエラーが発生し、やむなく電源を切ったところ、dnfが実行できなくなってしまいました。dnfのフロントエンドプログラム自体はPython3で記述されていますが、dnfが使用するパッケージがないので実行できない旨のエラーメッセージが表示されます。

ただし、この現象はFedora 31から32へのアップグレード時に必ず発生するというものではないようです。アップグレードを試みたPCに接続されているHDDで寿命が近いものがあるようで、それが悪さをしている可能性がありそうです。

dnfが動かないというのは一大事で、その解決が最優先になってしまい、詳細な記録を取ることができなくなりがちです。今回のケースでも詳細な記録を取っていません。

そこで、この記事ではhistoryコマンドの記録を元にして、試してみてよかったこと、試してはいけないことを雑にまとめます。

スポンサーリンク

試してみてよかった(と思われる)コマンド

以下のコマンドは試してみてよかった(と思われる)コマンドです。

どのコマンドもダウンロードされたパッケージが格納されているディレクトリ上で実行します(Fedoraの場合は/var/cache/dnf/の下あたりにあります)。dnfコマンドはこの時点では壊れた状態でしたが、幸いFedora 32へのアップグレードに必要なパッケージ(rpmファイル)はダウンロードされていたので、rpmコマンドを駆使して思いあたるパッケージをインストールしていきます。

--nodepsオプション最強です。

また、同名のパッケージでアップグレード元のバージョンのものがインストールされていることが原因で依存パッケージを見つけられない状況になっている場合には、そのパッケージを削除後にアップグレード先のバージョンのパッケージをインストールします。

rpm -e dnf-4.2.21-1.fc31
rpm -e yum-4.2.21-1.fc31
rpm -e dnf-4.2.21-1.fc31
rpm --install dnf-4.2.21-1.fc32.noarch.rpm
rpm -e libdnf-0.47.0-1.fc31
rpm --upgrade libdnf-0.47.0-1.fc32.x86_64.rpm
rpm -e python3-dnf-plugin-extras-common-4.0.10-1.fc31
rpm --erase --nodeps libdnf-0.47.0-1.fc31.x86_64
rpm --install --nodeps libdnf-0.47.0-1.fc32.x86_64.rpm
rpm --install --nodeps python3-libdnf-0.47.0-1.fc32.x86_64.rpm
rpm --install --nodeps python3-gpgme-1.13.1-7.fc32.x86_64.rpm
rpm --install --nodeps python3-hawkey-0.47.0-1.fc32.x86_64.rpm
rpm --install --nodeps python3-rpm-4.15.1-3.fc32.1.x86_64.rpm
rpm -e python3-dnf-plugins-extras-common
rpm --install --nodeps python3-dnf-plugins-extras-common-4.0.10-1.fc32.noarch.rpm

 

ここまでの作業で何とかdnfが復活したので、root権限で以下のコマンドを実行します。

# dnf system-upgrade download --releasever=32
# dnf system-upgrade reboot

 

PCを再起動すると、インストールが実行されます。インストールが終了するとFedora 32のカーネルを利用してPCが再起動されます。

試してはいけない(と思われる)コマンド

以下のコマンドをroot権限で片っ端から実行してみたのですが、怪しいダミーパッケージがインストールされたり(dnf及びyum)、そもそもパッケージがなかったりして、先に進むことができませんでした。

pip install dnf
pip install yum
pip install python3-dnf
pip install python2-dnf
dnf install dnf.cli

スポンサーリンク

 

特にdnf及びyumのダミーパッケージっぽいパッケージをインストールしてしまった場合には、以下のコマンドを実行して当該のパッケージを削除します。

pip uninstall dnf
pip uninstall rpm

 

まとめ

dnfコマンドの復旧後はFedora 32へのアップグレードが無事完了しました。

なお、この記事を書きながら別のPCにインストールされているFedora 31を32にアップグレードしてみましたが、この記事の冒頭に書いたような現象は発生しませんでした。上記の現象はアップグレードの作業内容の問題ではなさそうであることが確認できたので、他のFedora 31についても順次Fedora 32にアップグレードしていきます。

アップグレードの完了後にuname -aコマンドを実行すると、以下のような表示になります。カーネルのバージョンは5.6.13のようです。

[panda@pandanote.info ~]$ uname -a
Linux pandanote.info 5.6.13-300.fc32.x86_64 #1 SMP Thu May 14 22:51:37 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

 

今回はhistoryコマンドの記録を元に実行してよいコマンドと実行してはいけないコマンドを雑に分類しましたが、次回dnfコマンドが壊れたときにはエラーメッセージもしっかり回収しておきたいと思います。(`・ω・´)

この記事は以上です。