apt-get installが動かないときの解決方法

原因はいくつかあると思いますが,中でもストレージに起因する場合の解決方法を紹介します.

エラー詳細

apt-get install しようとしたときに,以下のような依存関係のあるパッケージが見つからないというエラーが出ることがあります.

E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

この場合には apt-get -f install すれば直りますが,このコマンド自体が動かないこともあります.

E: Sub-process /usr/bin/dpkg returned an error code (1)

私の場合,エラーをよく読んでみるとストレージが満杯になっており,ファイルが作成できないようでした.

terminal

Unpacking linux-modules-4.4.0-186-generic (4.4.0-186.216) ...
dpkg: error processing archive /var/cache/apt/archives/linux-modules-4.4.0-186-generic_4.4.0-186.216_amd64.deb (--unpack):
 cannot copy extracted data for './boot/System.map-4.4.0-186-generic' to '/boot/System.map-4.4.0-186-generic.dpkg-new': failed to write (No space left on device)
No apport report written because the error message indicates a disk full error

ストレージ使用状況の確認

terminal

$ df -H
Filesystem      Size  Used Avail Use% Mounted on
udev            136G     0  136G   0% /dev
tmpfs            28G   95M   27G   1% /run
/dev/sda3       166G   24G  134G  15% /
tmpfs           136G  316k  136G   1% /dev/shm
tmpfs           5.3M  4.1k  5.3M   1% /run/lock
tmpfs           136G     0  136G   0% /sys/fs/cgroup
/dev/sda1       487M  480M     0 100% /boot
/dev/sda4       811G  265G  505G  35% /home
/dev/sdb2       3.1T  1.2T  1.9T  40% /media/...
tmpfs            28G   74k   28G   1% /run/user/1002
tmpfs            28G     0   28G   0% /run/user/1007

確かに /boot が使用率 100% になっており,これが原因でエラーを起こしているようです.

不要なカーネルの削除方法

ここには今使っているもの以外のカーネルが保存されているらしく,以下のようにして検出できる不要なものを取り除くことで容量を空けることができます.

terminal

$ sudo dpkg --list 'linux-image*'| awk '{ if ($1=="ii") print $2}'| grep -v `uname -r`
linux-image-4.4.0-150-generic
linux-image-4.4.0-151-generic
linux-image-4.4.0-154-generic
linux-image-4.4.0-157-generic
linux-image-4.4.0-159-generic
linux-image-4.4.0-161-generic
linux-image-4.4.0-164-generic
linux-image-4.4.0-165-generic
linux-image-4.4.0-186-generic
linux-image-generic

apt-get が動くのであれば purge するべきですが,今は動かないので rm で消す準備をします.

terminal

$ sudo rm -rf /boot/*-4.4.0-1{5{0,1,4,7,9},6{1,4,5},86}-*                           
$ sudo rm -rf /boot/linux-image-generic

これで boot に余裕ができているはずです.

terminal

$ df -H
Filesystem      Size  Used Avail Use% Mounted on
udev            136G     0  136G   0% /dev
tmpfs            28G   95M   27G   1% /run
/dev/sda3       166G   24G  133G  16% /
tmpfs           136G  316k  136G   1% /dev/shm
tmpfs           5.3M  4.1k  5.3M   1% /run/lock
tmpfs           136G     0  136G   0% /sys/fs/cgroup
/dev/sda1       487M   86M  372M  19% /boot
/dev/sda4       811G  265G  505G  35% /home
/dev/sdb2       3.1T  1.2T  1.9T  40% /media/...
tmpfs            28G   82k   28G   1% /run/user/1002
tmpfs            28G     0   28G   0% /run/user/1007

あとは,先程同様に修正するためのコマンドを実行します.

terminal

$ sudo apt-get -f install

エラーが出ることなくすべて done であればひとまず必要なパッケージは全て入っており,ここから関連する不要なパッケージを取り除きます.

terminal

$ sudo apt-get autoremove

最後に GRUB とパッケージを更新します.

terminal

$ sudo update-grub
$ sudo apt-get update

これで動くようになりました!

参考

Safest way to clean up boot partition - Ubuntu 14.04LTS-x64, Ubuntu 16.04LTS-x64 | GitHub Gist