ことの発端
研究室の PC には Ubuntu がインストールされており,家から SSH をつないで使うことが多いので普段からシャットダウンはしていない.
ある日,研究室で Ubuntu にログインすると,画面に /root の容量がいっぱいです.ゴミ箱を空にしますか?
というような表示が出ていた.(正確な文言は覚えていないです.すみません.)
とりあえずゴミ箱を空にし,検索をするため Chrome を起動しようとしたが,起動しない.
shell から google-chrome を実行すると,socket 関連のエラーを吐いていた.
安直な気持ちで再起動すれば治るだろうと思い,再起動したら grub shell しか起動しなくなるという状況に...
Ubuntu が起動しなくなった原因
Ubuntu がインストールされている /dev/sda5
の容量がいっぱい (100%) になったことによる boot の失敗
対処法
なんとかして /dev/sda5
にあるファイルを削除し,boot に必要な空き容量を確保します.
※環境が限定的,スクリーンショット無し,筆者のカーネル周りの知識が乏しいため以下の例は参考にならないかもしれません.
まずは PC の電源を入れ,F2 や del キーを長押しすることで UEFI を起動します.
Ubuntu を起動しようとするとフリーズするので,ブートの選択から GRUB を指定します.
起動すると下記のようなプロンプトが表示されるはずです.(GRUB メニューが起動し,Ubuntuのリカバリーモードが選択できる場合はリカバリーモードで起動してみてください)
GNU GRUB version 2.02
grub>
下記のフォーラムを参考に手動で Ubuntu を boot します.
https://unix.stackexchange.com/questions/418401/grub-error-you-need-to-load-kernel-first
https://askubuntu.com/questions/883992/stuck-at-grub-command-line
grub> insmod linux
grub> linux (hd0,msdos5)/boot/vmlinuz root=/dev/sda2
grub> initrd (hd0,msdos5)/boot/initrd.img
grub> boot
(hd0,msdos5)
というのは Ubuntu がインストールされているパーティションです.
root=/dev/sda2
とありますが,トラブルシューティングしている時は Ubuntu がインストールされているデバイス名を覚えていなかったので /dev/sda5
とするところを間違えて /dev/sda2
としています.追記: root=(hd0,msdos5)
と指定しても良さそうです.
boot
が始まりますが,途中でエラーを吐いて Ubuntu の代わりに ash
が起動しました.
> ls
bin dev lib libx32 root snap sys var
boot etc lib32 lost+found opt run srv tmp
cdrom home lib64 media proc sbin swapfile usr
> ls /home
Ubuntu BOOT
間違えて /dev/sda2
を指定したせいか,まっさらなルートディレクトリが表示され,/home
の中には Ubuntu
, BOOT
というディレクトリがありました.
help
コマンドを実行すると,mount
, rm
が使えるようなので /dev/sda5
をマウントしてファイルを削除します.
> mkdir /sda5
> mount /dev/sda5 /sda5
> cd /sda5
<不要なファイルを削除する>
> df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 959862832 696352476 214682196 77% /sda5
とりあえず 100% から 77% までファイルを削除し,reboot
コマンドが機能しなかったので電源ボタンから再起動します.(UEFI でブートの順番を変更した場合は元に戻すのを忘れずに.)
これで正常に起動するようになりました.
おわりに
SSH で PC を使っていると,知らないうちにディスクが容量不足になっていたりします.
大きなファイルをダウンロードしたり,プログラムの出力で大きなファイルを出力する場合は,df
コマンドを叩いて容量を確認する癖を付けると良いかもしれません.