Ubuntuでpython3を消したら痛い目を見た
現在サブのコンピュータとしてUbuntuを使用しているが、基本的にプログラムはDockerで管理するからpython3
要らんやろ、と適当にアンインストールしたら痛い目を見た。
実行したコマンド
$ sudo apt remove python3 $ sudo apt autoremove
Debian系なのでapt
でパッケージ管理をしている。
そこからpython3
を削除して、autoremove
でクリーンアップした。
発生した問題
再起動したらネットワークが壊れた。
インターネットはもちろん、LANからも接続できない。
トラブルシューティング
- 放電してから再起動 - 結果:×
- Ethernetポート、ケーブルの変更 - 結果:×
- ディスプレイに接続 - 結果: OSには問題なし。
- ログインして内側からping - 結果: ping通らず
- /etc/netplanディレクトリ・ファイルを確認 - 結果: 問題なし
netplan apply
- 結果: 「netplan コマンドが存在しません」
ということで、netplan
がpython3
に依存していたせいで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台だけで復旧できたので共有させてもらいます。
削除されたパッケージを取得
/var/log/apt/history.log
を開き、apt-get remove
した時刻の行を探します。 その行に、Remove: <package name> (<version>), ...
というフォーマットで削除されたパッケージの情報が書かれているため、これをコピーして別ファイルに保存しておきます。ネットワークの復旧 次のコマンドで、ネットワークインタフェースを設定します。
# ネットワークデバイス名の確認(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>
- 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
これで、ドメイン名を利用したインターネットアクセスが可能になっているはずですので、google に ping を打って確認します。
sh ping www.google.com
削除されたパッケージの再インストール 手順 1. で保存したファイルに対し、バージョン番号とカンマを削除してから先頭へ
sudo apt install
と入力します。 vim のコマンドラインモードで:s/([^)]\+),//g
と入力するとバージョン名とカンマが消えます。 編集が終わったら chmod で実行権限を付与して実行します。 これで削除されたパッケージがすべてインストールできます。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/ あたりを参考にしてください。再起動 復旧作業はこれで終了です。 再起動すると元通り!
参考: 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