古いLinuxカーネルをクリーンアップする方法について、さまざまな質問を行ってきました。彼らはすべて異なる答えを持っているようで、彼らは古いので、誰かが質問が古すぎると言って新しい投稿を開始する必要がありますので、ここにあります:
次のすべてを行いたい:
私が望まないもの:
カーネルのビルドアップの問題に対する包括的な解決策を手に入れましょう。現在、アップグレードする前に古いバージョンのUbuntu(10.04)で遊んでいますが、Ubuntu 12.04でも同じ問題があります。ソリューションがバージョンごとに異なる場合は、ソリューションのテストに使用したバージョンを明記してください。
動作するもの:
uname -r
これは、現在使用しているカーネルバージョンを正しく返します。
機能しないもの:
Sudo apt-get autoremove
Sudo apt-get clean
Sudo apt-get autoremove linux-image-x.x.xx-xx-generic
私はうまくいくはずだと思ったが、しませんでした:
Sudo apt-get purge linux-image-x.x.xx-xx-generic
これは、dpkg -l | grep linux-image
によって生成されたリストを減らすために働きました:
Sudo dpkg --purge linux-image-x.x.xx-xx-generic
rc/ii
の問題のスタート地点もここにあります:
ii
は「インストールする必要があり、インストールする」ことを意味し、rc
は「削除/アンインストールするが、構成ファイルはまだ存在する」ことを意味します。
これは、端末リストと起動時のgrub2メニューの不一致の問題に対処していると思います。思い出すと、ii
リストはgrub2リストと一致します。ここでの質問は、最初にii
エントリがどのようにそこに到達したかです。
/ bootがいっぱいになるまで古いカーネルが蓄積し、aptが壊れるのはバグです。 LP#135709 。Ubuntu 16.04以降のすべてのフレーバーで修正が実装されています。
この問題に気付いたほとんどのユーザーは、 '暗号化されていない/ bootパーティションを作成する'ディスク全体暗号化 'をインストールしました。小さいため、パーティションはすぐにいっぱいになり、これらのユーザーは他のユーザーよりもずっと早く問題に気付きます。
新しいカーネルがインストールされると、/ etc/kernel/postinst.d/apt-auto-removalスクリプトは古いカーネルを自動削除のeligibleとしてマークしますが、実行されません自動削除。自動削除の欠如は、元々、人間が削除されたパッケージのリストを確認できるようにすることを目的としていました。
LP#135709 のバグ修正は、ほとんどのユーザーで機能します。機能しない場合は、古いカーネルパッケージが自動削除の対象として適切にマークされないようにする別の根本的な原因があります。 Ubuntuサポートチャネルで1対1のヘルプを求めてください。
Ubuntuの古いバージョンでは、スペースを手動で保持するために古いカーネルの雑草を修正する必要があります。手動で修正する方法は、/ bootがいっぱいかどうかによって異なります。ほとんどのユーザーは、/ bootがいっぱいになるまで問題に気付かないため、aptおよびdpkg no-space-left-on-deviceエラーが発生します。
/ bootが一杯ではない場合、aptが適切に動作する場合、単純な
Sudo apt-get autoremove ## Ubuntu 14.04 and older
Sudo apt autoremove ## Ubuntu 16.04 and newer
自動削除の対象となるすべてのカーネルパッケージを削除する必要があります。
/ bootがいっぱいで、aptアクションが「デバイスにスペースが残っていません」というdpkgエラーで失敗した場合、自動削除を使用するには遅すぎます。
Aptdaemonはパッケージアクションをキューに入れるため、手遅れです。自動削除はキューの最後にあり、アクションが失敗した場合(スペース不足など)、aptは残りのキュー全体を中止します。 (これはおそらくapt/aptdaemonのバグです)
ここでのベストプラクティスは、「uname」および「dpkg」を使用して1つまたは2つの古いカーネルを削除し、aptがキューに入れられたアクションを完了するためのスペースを解放することです。その後、自動削除が機能します。
例:
$ uname -r
3.16.0-36-generic ## This is kernel you MUST NOT remove.
$ dpkg -l | grep linux-image
rc linux-image-3.16.0-23-generic ## 'rc' means already removed
rc linux-image-3.16.0-28-generic ## 'rc' can be safely ignored
rc linux-image-3.16.0-29-generic
ii linux-image-3.16.0-30-generic ## 'ii' means installed. Removable
ii linux-image-3.16.0-31-generic ## Removable
ii linux-image-3.16.0-33-generic ## Removable
ii linux-image-3.16.0-34-generic ## Backup working kernel. Don't remove
ii linux-image-3.16.0-36-generic ## Current kernel. DO NOT REMOVE
## Use dpkg to remove one older kernel, freeing enough space for apt to work
$ Sudo dpkg --remove linux-image-3.16.0-30-generic
$ Sudo apt-get autoremove ## Ubuntu 14.04 and older
$ Sudo apt autoremove ## Ubuntu 16.04 and newer
長い間問題を無視していた場合、間違ったカーネルバージョンを指すlinux-image-genericのような二次効果があります、およびapt依存関係エラー。これらすべてを一度に修正する単一の方法はありません。
一般に、これらの問題のほとんどをクリーンアップする簡単な方法は、ローカルパッケージキャッシュから古いパッケージをクリーンアップし、パッケージデータベースを更新し、問題のパッケージを(ローカルキャッシュの代わりに)Ubuntuリポジトリから再インストールすることです。
$ Sudo apt-get update ## Refresh the package database (14.04 and older)
$ Sudo apt update ## (16.04 and newer)
$ Sudo apt-get autoclean ## Delete the obsolete packages from your local cache (14.04 and older)
$ Sudo apt autoclean ## (16.04 and newer)
$ Sudo apt-get install --reinstall <packagename> ## Reinstall the offending package with the latest version in the Ubuntu repositories (14.04 and older)
$ Sudo apt install --reinstall <packagename> ## (16.04 and newer)
それでもaptおよび/またはdpkgエラーが発生する場合は、Ubuntuサポートチャネルで1対1のヘルプを探してください。
これらのコマンドを試して、古い構成ファイルと古いカーネルを削除できます。
exec Sudo -i
CONFOLD=$(dpkg -l | grep '^rc' | awk '{print $2}')
KERNELCUR=$(uname -r | sed 's/-*[a-z]//g' | sed 's/-386//g')
PKGLINUX="linux-(image|headers|ubuntu-modules|restricted-modules)"
METAPKGLINUX="linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)"
KERNELSOLD=$(dpkg -l | awk '{print $2}' | grep -E "$PKGLINUX" | grep -vE "$METAPKGLINUX" | grep -v "$KERNELCUR")
apt-get purge "$CONFOLD"
apt-get purge "$KERNELSOLD"
update-grub
以下のコマンドを実行して、インストールされているカーネルのリストを見つけることができます。
rpm -qカーネル
カーネルのリストを見つけたら、以下のコマンドを実行してカーネルを削除します。
Sudo apt-get remove linux-image-x.x.x.x-generic