Ubuntuでpython3を消したら痛い目を見た

現在サブのコンピュータとしてUbuntuを使用しているが、基本的にプログラムはDockerで管理するからpython3要らんやろ、と適当にアンインストールしたら痛い目を見た。

実行したコマンド

$ sudo apt remove python3
$ sudo apt autoremove

Debian系なのでaptでパッケージ管理をしている。 そこからpython3を削除して、autoremoveでクリーンアップした。

発生した問題

再起動したらネットワークが壊れた。

インターネットはもちろん、LANからも接続できない。

トラブルシューティング

  1. 放電してから再起動 - 結果:×
  2. Ethernetポート、ケーブルの変更 - 結果:×
  3. ディスプレイに接続 - 結果: OSには問題なし。
  4. ログインして内側からping - 結果: ping通らず
  5. /etc/netplanディレクトリ・ファイルを確認 - 結果: 問題なし
  6. netplan apply - 結果: 「netplan コマンドが存在しません」

ということで、netplanpython3に依存していたせいでapt autoremoveで削除されてしまいましたとさ。

apt autoremove中にそんな感じのログが出ていたので、なんとなくそんな感じはしていた。

解決方法

全く同じアーキテクチャで全く同じOSのマシンをもう一台持っていたので、そのマシンでnetplanの依存関係を確認。

$ apt show netplan
Package: netplan
State: not a real package (virtual)
N: Can't select candidate version from package netplan as it has no candidate
N: Can't select versions from package 'netplan' as it is purely virtual
N: No packages found

どうやらnetplan自体はnetplan.ioからインストールされているらしい。

$ apt show netplan.io
Package: netplan.io
Version: 0.103-0ubuntu5~20.04.2
Priority: important
Section: net
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian netplan Maintainers <team+netplan@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 487 kB
Provides: nplan
Depends: libc6 (>= 2.27), libglib2.0-0 (>= 2.39.4), libnetplan0 (>= 0.103-0ubuntu5~20.04.2), libsystemd0 (>= 243), libuuid1 (>= 2.16), libyaml-0-2, iproute2, python3, python3-yaml, python3-netifaces, systemd (>= 245.4-4ubuntu3.8)
Suggests: network-manager | wpasupplicant, openvswitch-switch
Conflicts: netplan
Breaks: network-manager (<< 1.2.2-1), nplan (<< 0.34~)
Replaces: nplan (<< 0.34~)
Homepage: https://netplan.io/
Task: minimal, ubuntu-core
Download-Size: 121 kB
APT-Manual-Installed: no
APT-Sources: http://ports.ubuntu.com/ubuntu-ports focal-updates/main arm64 Packages
Description: YAML network configuration abstraction for various backends
 netplan reads YAML network configuration files which are written
 by administrators, installers, cloud image instantiations, or other OS
 deployments. During early boot it then generates backend specific
 configuration files in /run to hand off control of devices to a particular
 networking daemon.
 .
 Currently supported backends are networkd and NetworkManager.

N: There is 1 additional record. Please use the '-a' switch to see it

問題のマシンで入っていないパッケージを調べて、それらの.debをダウンロードする。

$ mkdir netplan.io && cd netplan.io
$ sudo apt download netplan.io netplanlib0 python3-yaml python3-netifaces

USBフラッシュドライブで問題のマシンに移してインストール、再起動。

$ sudo apt install <downloaded>.deb
$ sudo reboot

pingが通って問題解決。

反省

python3を消してから、「そういえばLinuxではPythonをシステムが使ってるってどこかで見たな」と思い出してすぐに再インストールしたが、依存パッケージまで気が回っていなかった。

再起動しなければこの問題は発覚しなかったため、たまたま再起動して早期に問題が発覚したのは不幸中の幸いだった。 とはいえトラブルシューティング&問題解決に3時間要したため、今度からは慎重にパッケージをアンインストールしようと思う。

しかも今回は「以前Wi-Fi設定でnetplanを使用したことがある」から運良くトラブルシューティングすることができた。 これがもし使ったこともないUbuntuのデフォルトパッケージだったら、もっと時間がかかっただろう。

まあ反省はこの程度にして、中断していたDockerリポジトリの構築の続きを再開しよう。

(実はサーバーにUSBを接続するのも初めてだったので、そこでも手間取った。。。)

別の方法

noffさんがコメントで教えてくれたので紹介する。

自分も消してしまって、やらかしてしまったサーバー1台だけで復旧できたので共有させてもらいます。

  1. 削除されたパッケージを取得 /var/log/apt/history.log を開き、apt-get remove した時刻の行を探します。 その行に、Remove: <package name> (<version>), ... というフォーマットで削除されたパッケージの情報が書かれているため、これをコピーして別ファイルに保存しておきます。

  2. ネットワークの復旧 次のコマンドで、ネットワークインタフェースを設定します。

# ネットワークデバイス名の確認(enp3s0 とかそんな感じの名前)
sudo ip link show

# IPアドレスの静的割り当て
sudo ip addr add <ip address>/<cidr> dev <network device name>

# ネットワークデバイスの有効化
sudo ip link set <network device name> up

# デフォルトゲートウェイの設定
sudo ip route add default via <default gateway's ip address>

ここまで設定すれば、デフォルトゲートウェイへの ping に成功するはずですので確認します。 sh ping <default gateway's ip address>

  1. DNSの設定 次のコマンドで、dns_servers.conf を作成して設定を保存します。 sh sudo mkdir /etc/systemd/resolved.conf.d/ sudo vim /etc/systemd/resolved.conf.d/dns_servers.conf

dns_servers.conf [Resolve] DNS=8.8.8.8 1.1.1.1

保存したのちに、systemd-resolved サービスを再起動します。 sh sudo systemctl restart systemd-resolved

これで、ドメイン名を利用したインターネットアクセスが可能になっているはずですので、googleping を打って確認します。 sh ping www.google.com

  1. 削除されたパッケージの再インストール 手順 1. で保存したファイルに対し、バージョン番号とカンマを削除してから先頭へ sudo apt install と入力します。 vimコマンドラインモードで :s/([^)]\+),//g と入力するとバージョン名とカンマが消えます。 編集が終わったら chmod で実行権限を付与して実行します。 これで削除されたパッケージがすべてインストールできます。

  2. netplan の設定 ネットワーク情報が消えているため、必要に応じて /etc/netplan/00-installer-config.yaml を編集します。 DHCPにお任せな設定の場合は不要かもしれません。 sh cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak sudo vim /etc/netplan/00-installer-config.yaml 編集する場合は https://rohhie.net/ubuntu22-04-netplan-gateway4-has-been-deprecated/ あたりを参考にしてください。

  3. 再起動 復旧作業はこれで終了です。 再起動すると元通り!

参考: https://serverfault.com/questions/380856/how-to-undo-apt-get-remove https://askubuntu.com/questions/1208859/cannot-connect-to-the-internet-after-removing-python3-from-xubuntu https://serverok.in/systemd-resolved