古いカーネルバージョンを削除してブートメニューをクリーンアップするにはどうすればよいですか?


701

新しいLinuxカーネルをインストールするたびに、grub_configに残り、ブートメニューが長くなります。

インストール済みのパッケージを手動で検索して削除できることは知っています。

Ubuntuは、それらをクリーンアップする簡単な方法を提供していますか、またはブートリストに表示されないようにしていますか?


10
ジョブを実行するためのpurge-old-kernelsと呼ばれるubuntuコマンドがあります。詳細については私の答えをご覧ください。
ジャルノ

29
sudo apt-get autoremoveUbuntu 14.04+でトリックを実行する必要があります
ホブ

1
古いカーネルの蓄積はバグであり、修正中です:bugs.launchpad.net/bugs/1357093。修正がリリースされると、古いカーネルはデフォルトで自動削除されます。
user535733

1
@hobs Ubuntu Studio 14.04では、カーネルが自動的にインストールされておらず、ソフトウェアアップデーターによってインストールされている場合、このコマンドは私にとってはうまくいきません。
ヤルノ

1
私はこのページに戻り続けます... @hobsによるコメントは、カーネルが自動インストールされた場合にのみ機能します-ただし、https:sudo apt-get autoremove --purge apt-mark
//help.ubuntu.com/community/RemoveOldKernels

回答:


602

16.04以降のUbuntuバージョン

sudo apt autoremove

このコマンドは、依存関係を解決するために自動的にインストールされたパッケージを削除しますが、現在は依存していません。これには、linux-headers-*との古いバージョンが含まれますlinux-image-*。(このプロセスについても賢明であり、予備のカーネルをフォールバックとして残します!)

11.10以降のUbuntuバージョン

GRUB2とすべてのカーネルの表示

UbuntuにインストールされているGrub2の最新バージョンは、自動的に最新のカーネルを表示し、インストールした古いカーネルを隠します。

GNU GRUB

grubが表示されない場合はShift、起動中に忘れずに押してください。

ご覧のとおり、最新のカーネルのみが表示されます。

表示されたオプションを選択すると(を押すEnter)、すべての古いカーネルが表示され、ブート可能になります。

GNU GRUB以前のバージョン

古いカーネルを完全に削除する方法

利用可能な最新のカーネルで最初に起動します。

古いカーネルを削除する方法はいくつかあります。個人的には、これがあなたのコンピューターをその提案で破壊することは認められているので、私はComputer Janitorには触れません。

シナプス

代替手段はSynapticsudo apt install synaptic)です

linux-imageを検索し、カーネルを右クリックして完全な削除を選択し、最後に[ 適用 ]ボタンをクリックしてカーネルを削除します。

シナプスパッケージマネージャー

今回はlinux-headerに対して検索を繰り返します-以前に選択したカーネルイメージの関連ヘッダーを削除できます。

シナプスは、さらにブート不能であなたを残して、このツールを使用して、あなたのカーネルをすべて削除する-しかし、あなたがうっかり自分の最新のカーネルを削除することができ...削除しようとしているものを検証しようとしませんUbuntuで!。

使用しているカーネルのタイプを必ず確認してください:

uname -r

結果は次のようになります。

ターミナル<uname -r>

結果と数字を覚えておいてください-対応する画像やヘッダーを削除しないでください。

勧告

私の推奨は、最新のものを含めて少なくとも2つ、できれば3つのカーネルを保持することです。推奨される理由は、何らかの理由で最新のカーネルで起動できない場合、または壊れたワイヤレスなどの退行機能を導入する場合、少なくとも1つまたは2つの他のカーネルで起動することです。


3
シナプスを使用して古い「linux-image *」パッケージを削除すると、10.04でもうまく機能しました。(タイトルが11.10以降のみの可能性を示唆しているため言及します)
-mivk

4
-y行末の切り替えapt-getが必要です。そうでない場合、apt-getは確認を求め、入力はパイプなので、中止します。終了する必要があります:| xargs sudo apt-get purge -y
ジョシュ

37
マシン上の古いバージョンlinux-imagelinux-headers解放された4.5GBのスペースの約20バージョンを削除します。
アンドリューマオ14年

16
この方法はうまく機能しますが、すべてのカーネルを削除するとgrub.cfgが過度に再生成され、時間がかかります。バッチ削除のためにこれを無効にしてから一度再生成する方法はありますか?
スペースダイバー14年

15
@spacediverから2番目の質問です。38個の不要なカーネルがある場合、これは非常に遅いプロセスです。これがN ^ 2操作と呼ばれるものです。カーネルを(38 ^ 2/2)= 722回処理し、非常に遅いです。確かにUbuntuは....何か良いを考え出すことができる
nealmcb

384

まず、システムを再起動して、最新のカーネルを使用していることを確認します。次に、ターミナルを開き、現在のカーネルを確認します。

uname -r 

このカーネルを削除しないでください!

次に、以下のコマンドを入力して、システムにインストールされているすべてのカーネルを表示/リストします。

dpkg --list 'linux-image-*'

現在のカーネルよりも低いすべてのカーネルを見つけます。削除するカーネルがわかったら、以下に進んで削除します。以下のコマンドを実行して、選択したカーネルを削除します。

sudo apt-get purge linux-image-x.x.x-x-generic 

最後に、以下のコマンドを実行してgrub2を更新します

sudo update-grub2 

システムを再起動します。


34
10.04および12.04でこれを行うと、パージプロセス中にupdate-grubが自動的に実行されました。
aidan

93
bashのブレース拡張を使用できます。たとえばsudo apt-get purge linux-image-3.2.0-3{0..5}-generic(30,31、..、35を削除)
ajo

12
後でシステムを再起動する必要はありません。実際には、システムを再起動する必要があります前に、あなたはおそらく、ダウンロード&インストールされた最新のカーネルのバージョンを使用していることを確認するために、これらの手順を実行します(やったapt-getを更新&& apt-getの??右、この前のアップグレードを)
リケット14

4
linux-signed-imageUEFIシステムにインストールされている可能性のあるパッケージをアンインストールすることもできますsudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic
。12、14

1
@jarno署名されたカーネルを使用しているかどうかはわかりuname -rませんがsigned、システムに文字列がありません。署名されたイメージがインストールされているようで、そのlsコマンドの出力は次のとおり/boot/vmlinuz-3.19.0-16-generic.efi.signedです。
デビウス

283

古いカーネルを削除するためのワンライナー(これによりディスク領域も解放されます)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

説明(|前のコマンドの出力を次のコマンドの入力として使用することを忘れないでください)

  • dpkg --list すべてのインストール済みパッケージをリストします
  • grep linux-image インストールされているLinuxイメージを探します
  • awk '{ print $2 }' 2列目(パッケージ名)を出力するだけです
  • sort -V バージョン番号順にアイテムを並べます
  • sed -n '/'`uname -r`'/q;p' 現在のカーネルの前の行を出力します
  • xargs sudo apt-get -y purge 見つかったカーネルをパージします

sed呼び出しをほどく:

  • -n伝えsed静かに
  • `uname -r` 現在インストールされているカーネルリリースを出力します-コマンドの一部として出力が含まれるように、バックティックにそれを含めます(これは $(uname -r)
  • /something/q'something'に一致すると停止する(この場合、何かがの出力ですuname -r)- /正規表現を囲む
  • p 印刷されます
  • これ;はコマンドsepartorであるため/something/q;p、何かに一致すると終了するように指示し、そうでない場合はprint

完全に、sed -n '/'`uname -r`'/q;p'現在のカーネル名と一致するまで行を出力します。

私のような妄想がある場合は、最後の部分を作成しxargs echo sudo apt-get -y purgeて古いカーネルをパージするコマンドを出力し、実行前に予期しないものが含まれていないことを確認できます。


ヘッダーを削除するように修正されたバージョン:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

注:sed呼び出しは変更されます。"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"「-generic」などのないバージョンのみを抽出します(「3.2.0-44」など)。uname -r


画像とヘッダーを削除するオールインワンバージョン(上記の2つのバージョンを組み合わせます):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

1
現在のカーネルバージョンを次のような正規表現として一致させることは少し危険であることに注意してください。ドットは任意の文字に一致し、3.1.2-23は3.1.2-2に一致します(または逆です)。私の答えもご覧ください。
ジャーノ

19
調整されたオールインワンバージョンは次のとおりです。sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)私の回答も参照してください。
ジャーノ

1
@jarnoは、私を非常に大きく助けてくれました...あなたの1つのライナーへの
称賛

5
依存関係が満たされていないため、dkpg -P代わりに使用する必要がありました。ここでフルバージョンは以下のとおりです。dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
セバスチャン・サストレ

3
これをしないでください!「そのワンライナーは少し危険に見えますが、確かに220のアップボーターは間違いではありません!」私は自分で考えて、盲目的にコピー&ペーストしました。GRUBに直接再起動しました。このコマンドは、私が使用していたものを含め、すべてのカーネルを消去しました。リアルタイムカーネルを実行していたのかもしれませんが、覚えていません。現在、自宅でUbuntu Live CDをインストールするUSB​​スティックを探しています:(
アンドレアス・ヤンソン

60

Ubuntu 16.04+:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10以下:

これが最も簡単で迅速な方法だと思います。最新のカーネルと、さらに2つのカーネルを保持します。

sudo apt-get install bikeshed
sudo purge-old-kernels

保持する追加のカーネルの数を変更するには:

sudo purge-old-kernels --keep 3

1
このコマンドはシェルスクリプトであり、その場所はで見つけることができますwhich purge-old-kernels
ジャーノ

16.04でこれが非常に簡単になったことを嬉しく思います!この答えはアップ...その方法を作る保つホープ
トビーJ

Ubuntu 16.04では、purge-old-kernels自転車置き場(まだ恒久的な家を持っていないランダムな便利なツール)パッケージまたは特定のものを持っていapt-get -yます。オプションを使用しないでください また、ここではそれがどのように自動的削除は、多くの古いカーネルを維持する方法を決定します。
パブロA

2
16.04では、purge-old-kernelsはbyobuパッケージによって提供されます(ヒント:)apt-file search purge-old-kernels。同意してapt-get -y、削除します。
bmaupin

1
@Danは非LTSバージョンを使用していないため、いつ開始されたのか正確にはわかりませんでした。しかしsudo apt-get autoremove、14.04でカーネルが削除されないことは確かです。それが何であるかを知っていれば、特定のバージョンで答えを自由に更新してください!
bmaupin

43

Grub 2からエントリを削除するエントリは、/ etc / grub.dフォルダ内のファイルを編集または削除して削除する必要があります。/boot/grub/grub.cfgファイルは読み取り専用であり、通常は編集する必要はありません。

カーネルが多すぎますか?

  • 現在使用しているカーネルが不明な場合は、ターミナルでuname -rと入力します。

  • APTを介して削除されたカーネル(Synaptic、「apt-get remove」など)は自動的にgrub.cfgを更新し、ユーザーの操作は必要ありません。

  • カーネル(およびメニューエントリ)を削除するための優れたツールは、Ubuntu-Tweak、安全で使いやすいGUIアプリです。

  • Ubuntu Tweakをインストールする

  • Ubuntu-Tweakは、[アプリケーション]> [システムツール]で利用できます。

古いカーネルエントリを削除する

  • 左側の「Package Cleaner」を選択し、右側のパネルから「Clean Kernel」を選択します。

  • 右下の「ロック解除」ボタンを押して、パスワードを入力します。

  • 表示されたリストから、削除するカーネルイメージとヘッダーを選択します。使用中のカーネルはリストされていません。

  • 選択したカーネルイメージとヘッダーを削除するには、右下の[クリーンアップ]ボタンを押します。

Grubメニューからオペレーティングシステムを削除する

  • 「update-grub」がrootとして実行されると、コンピューターから削除された他のオペレーティングシステムもメニューから削除されます。

  • メニュー項目は、スクリプトによってGrub2メニューに配置されます。メニューに他のオペレーティングシステムを入力したくない場合は、/ etc / grub.d / 30_osproberを無効にします

  • このコマンドを実行して、スクリプトの実行を停止します
    sudo chmod -x /etc/grub.d/30_os-prober

  • / etc / default / grubのDISABLE_30_OS-PROBER = 'true'

GrubメニューからMemtest86 +を削除します
sudo chmod -x /etc/grub.d/20_memtest86+

  • update-grubコマンドを実行して、変更がgrub.cfgに組み込まれるようにします

ソース

注: カーネルの更新後、GRUBメニューに新しいエントリが追加されますが、必要に応じて古いエントリを削除できますが、経験豊富なユーザーは、アップグレードで問題が発生した場合に備えて少なくとも1つのスペアエントリを保持することをお勧めしますトラブルシューティングのために古いカーネルバージョンを起動する必要があります。

カーネルエントリを削除する別の方法(10.04より前)

GRUB2ではなくGRUBの場合

スタートアップマネージャー startupmanagerをインストールする

System >> Administration >>で見つけること 代替テキスト
代替テキスト
ができます。2番目のスクリーンショットでは、表示するカーネルの数を選択できますか?通常は1のままにしておきますが、カーネルのアップグレードを取得するときは、再起動する前に常に2に変更するため、新しいカーネルにハードウェアに問題がある場合は古いカーネルを選択できます。新しいカーネルが正常に機能していることがわかったら、それを1に戻します。


2
実際、startupmanager dintはUbuntu 10.04でこのようなウィンドウを提供しますが、代わりに2つのタブ->ブートオプションと詳細設定を含むウィンドウを提供しました。。だから、Ubuntuの10.04のための答えを更新(そして、私はこれをダウン投票Thatsなぜ...)してください
セン

GUIがインストールされていないマシン(サーバー)で「保持するカーネルの数」をどのように定義できるか考えていますか?
シルヴァインウルグ

startupmanagerは時代遅れです。参照してくださいGRUP-カスタマイザー
muhasturk

39

純粋にコマンドラインで、これは現在および2番目に最新のものを除くすべてを削除します(以下のheadコマンドの「-2」を使用)。

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

9
そこからワンライナー:dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
ドミトリーヴェルホトゥロフ

@DmitryPaskal、これを新しい回答として追加する必要があります。
saji89

10
@DmitryPaskalいつものように、これらを理解せずに単にコピー&ペーストしないでください。私のマシンでは、このワンライナーもlinux-libc-dev:amd64削除すべきではないものと一致します。
ジェームズニー

1
@Kees Cook、awk引数は単一引用符で囲まれるだけではいけませんか?パイプラインに「linux-image-」を追加することが目的の場合、これはを使用しawk '{print "linux-image-" $0}'た場合にのみ機能するようです。
マーク

これは私のために動作しません、それは(3.17でのUbuntu 14.04)私のカスタムインストールされたカーネルが含まれて
アレックスR

35

更新:現在purge-old-kernels非推奨です

トリッキーな状況でもカーネルをパージするスクリプトを作成しました。それは呼ばれlinux-purgeここで見つけることができます。

現在使用されているカーネルよりも古いカーネル(および関連パッケージ)を単にパージしたい場合、システムが壊れていないときに、このスクリプトを使用できます。

古いカーネルの削除に関して私が貢献したUbuntuのドキュメントページもあります


purge-old-kernels自転車置き場の正確なバージョン(1.22)にはないようです。最新の自転車置き場を正確に取得する合理的で安全な方法はありますか?または、スクリプトをインストールする方が簡単/安全ですか?依存関係の長いリストにもかかわらず、私はレポを使用したいのですが。
drevicko15年

1
@drevickoこちらをご覧ください
ジャルノ

1
@drevicko、確かにdlocate -lsbin bikeshed
ジャルノ

1
@drevicko、別の質問
-jarno

1
@ChrisWはい、あります。スクリプトを少し改善しただけなので、最新バージョンを使用するのが最善です。
ジャーノ

29

あなたは従うことができます使用「を無人アップグレード」パッケージセクション自動セキュリティ更新これを実行するにはUbuntuのWikiに記事を。

/etc/apt/apt.conf.d/50unattended-upgradesファイルの次の行を変更する必要があります。

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

Unattended-Upgrade::Remove-Unused-Dependencies "true";

カーネルを含む古いパッケージを自動的に削除します。

また、行を削除またはコメント化します

"^linux-image.*"; 

ファイル/etc/apt/apt.conf.d/01autoremoveの「NeverAutoRemove」セクション


2
私はこれを行いましたが、まだ数百MBを消費する3つ以上の古いカーネルを収集していました。そこでapt-get autoremove、実際にアップグレードを行う日常のcronジョブに追加しました。これは、ビルトインのupdate-managerを経由しない場合があるためです。
マルコス

これは、Trustyで自動的にインストールされたカーネルに対してのみ機能すると思います。
ジャーノ

これは、パッケージを自動アップグレードする場合(無人アップグレードなど)に古いカーネルのビルドアップを防ぐのに最適です。ただし、再起動しないと、現在実行中のカーネルのパッケージがアンインストールされていることがあります!これが引き起こす可能性のある問題の1つは、プラグインしたディスクがディスク上にないため、それらのモジュールをホットロードできないため、プラグインした新しいデバイスが機能しない可能性があることです。(これに対する簡単な修正は、カーネルパッケージを再度インストールし、デバイスを取り外してから再接続することです。)
joeytwiddle

前述の問題に対する自動化されたソリューションを作成しまし。これが良いアプローチだと思うなら、Qwertyの答えに自由に追加してください。
-joeytwiddle

27

Ubuntuにすでに付属している最速/簡単な方法(少なくとも12.04以降に適用可能)はapt-getです。使用していない古いカーネルバージョンをすべて削除する場合は、次の手順を実行します(使用していない以前のバージョンを除く。これは、現在のカーネルバージョンが何らかの方法で失敗した場合に、前の状態に戻ります)。以下をせよ:

sudo apt-get autoclean

これにより、古いファイル(カーネルバージョンを含む)が削除されます。古いバージョンが多数ある場合は、カーネルバージョンを削除しても問題がないことを確認する必要があるため、時間がかかることに注意してください。私にとって、最後の12カーネルバージョンの削除には約2分かかりました。次のこともできます。

sudo apt-get clean

これにより、aptのキャッシュフォルダーにダウンロードおよび保存されたすべてのものが削除されます。最後に:

sudo apt-get autoremove

使用されていないパッケージをチェックし、必要に応じて削除します。これは、インストールされているアプリで不要になったライブラリおよび依存パッケージに最適です。


1
14.04のように、これはパッケージキャッシュを消去するだけで、インストールされたパッケージやgrubには影響しないため、新しいリリースでは変更されたと思われます。
ジャーノ

2
sudo apt-get autoremove14.04で古い(複数バージョン前の)カーネルが削除されることを確認できます。カーネルのアップグレードの前後に実行する必要がある場合があります。アップグレードする前に実行すると、古いカーネルの汎用バージョンのみが削除されました。次に、カーネルをアップグレードした後、古いカーネルの低遅延バージョンも削除しました。
tekNorah

私はsudo apt-get autocleanコマンドを意味しました。@tekNorah古いカーネルをいくつかインストールし、その後sudo apt-get autoremoveUbuntu Studio 14.04で実行しました。カーネルは削除されませんでした。低遅延カーネルのみがインストールされています。-genericカーネルと-lowlatencyカーネルの両方がインストールされているのはなぜですか?
ジャーノ

5
はい、これは私にとってはうまく機能し、すべての古いカーネルを適切にクリーンアップし、クレイジーな1行のスクリプトに依存しません!推奨、これを複数回支持できたらいいのに!
ジェフアトウッド

1
@JeffAtwoodは、安全なカーネルをさらに削除するかもしれません。バグレポートを
-jarno

25

10.04 GUIメソッド

Computer Janitorは古いカーネルをクリーンアップでき、デフォルトではUbuntuにインストールされていると信じています(Kubuntuではありません)。

GRUB 1を使用している場合/boot/grub/menu.lst、最大で表示するカーネルの数を指定するオプションがあります。GRUB 2は、私が知る限り、そうではありません。


4
Computer Janitorは使用すべきではありません。バグがあり、natty / oneiric / preciseのデフォルトアプリケーションとして削除されました。
fossfreedomの

2
独自の「コンピュータの管理人を」(一時的に古いUbuntuのバージョンで利用できた「コンピュータの管理人」と混同しないように)持っている別の答え(独自のPPA)、で説明したようにむしろ、「Ubuntuの微調整」をインストール
マイケル・

25

インストールされているカーネルとヘッダーを把握するには

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

その後、それらを1つずつまたは一緒に削除し、最新のものを保持するようにしてください。

削除を自動化するための便利なコマンドとスクリプトもいくつかあります。

http://ubuntuforums.org/showthread.php?t=1658648

以下は、未使用のカーネルとヘッダーをすべて削除すると主張しています。

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge

apt-get -y問題なく削除するために使用)

18.04.1で実行すると、次のようになります。

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic

フォーラムで見つけたスクリプトに欠陥があります。必要なヘッダーパッケージが削除されない場合があり(古い-paeカーネルを使用する場合)、一方で、保持する必要があるパッケージが削除される場合があります。
ジャルノ

コメントありがとうございます。スクリプトは完全ではないかもしれませんが、私は長年、主に12.04と14.04、32と64ビットで使用しており、問題はありませんでした。...そしてはい、linux-libc-devインストールされています。
mikewhatever

linux-libc-devのバージョン番号は、現在のカーネルのバージョン番号と一致すると思います。ここでdpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'は、linux-libc-dev:amd64
jarno

結果を再現することはできませんが、念のため、追加のフィルターを追加してコマンドを変更しました- grep -E "(image|headers)"
mikewhatever

1
最初に、-yフラグを消去せずにパージしてください。
-danger89

16

古いLinuxイメージカーネルを削除するには、保持するカーネルで最初に起動します。

また、コマンドを使用してカーネルのバージョンを確認しuname -r、誤って誤ったバージョンを削除しないようにすることもできます。

次に、シナプスパッケージマネージャーに移動しlinux-image、上のコマンドで表示されるバージョンを除く古いバージョンを検索して削除します。一般的に、最新のものを使用することを好みます。

再起動すると、よりクリーンなgrubメニューが表示されます。


これはおそらく、コンピューター管理ツールなしでインストールするユーザーにとって最も基本的な方法です。
ブラム

1
Ubuntu 11.04から、grubメニューはデフォルトで現在のカーネルのみを表示し、古いカーネルは「Previous kernels」メニューに表示されません。このメソッドは、古いものを削除するために引き続き機能します。
アンディ

14

あなたはubuntu-tweakをインストールしてから、アプリケーション->システムツール-> ubuntu tweakに移動し、

ここに画像の説明を入力してくださいパッケージクリーナーをクリックし、カーネルをクリーンアップします。現在使用されているカーネルは表示されないため、常に安全です。


8

個人的に、私はを使用するのが好きSynapticです。何が起こっているのかをより安全に感じることができます。古いカーネルを削除するオプションがある私が使用した唯一のアプリはUbuntu Tweakです。

使用していないカーネルを削除する方法:

  • UbuntuTweakを開きます
  • 左側のペインの「アプリケーション」の下にある「パッケージクリーナー」をクリックします。
  • 「クリーニングビュー」の右側で、「カーネルのクリーン」を押します。
  • すべてのカーネルを選択します-使用中のカーネルはリストされていないと思いますが、念のuname -aためターミナルで実行されていることを確認してください

Synapticでは、すべてのカーネルを含む「コンポーネント」->「カーネルとモジュール」でフィルタリングできます。そして、最初の列「S」(ステータス)で並べ替えます。これにより、インストールされているすべてのカーネルが先頭に表示されます。確かupdate-grubにお勧めです。
danger89

6

linux-image-...Synapticを使用して古いカーネル(パッケージ)をアンインストールできます。これにより、ブートメニューからそれらが削除されます。実行中のカーネルを削除しないように注意してください(そのバージョンはで確認できますuname -r)。

1つまたは2つの古いバージョンを使用すると、問題が発生した場合のトラブルシューティングに役立ちます。

または、エントリを手動で編集/削除することもできます(gksu gedit /boot/grub/grub.cfg)が、新しいカーネルに更新すると、エントリが再生成されます。recovery modeオプションの削除を検討している場合は、しないでください。起動できないような何かを壊した場合に便利です。


このページを参照してください。


Grub2は、新しいカーネルがインストールされるたびにgrubエントリを作成するようになりました。update-grubそのすべてのそれらのカーネルを再書き込みます。
マルコセッピ

4

これは純粋なコマンドラインソリューションです。

まず、現在実行中のカーネルを除く、インストールされているすべてのカーネルバージョンのリストを生成します。

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

または、最後の2つを除くインストールされているすべてのカーネルバージョンのリストを生成します。

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

リストを調べます。保持するカーネルのバージョンがリストに含まれていないことを確認してください。コマンドuname -rを使用して、現在実行中のカーネルのバージョンを確認します。

結果に満足している場合はapt-get、パッケージの削除に使用できます。

最初に空運転(例として最初の発電機を使用):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

次に、実際の実行:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

プロセスを自動化する場合は、--yesパラメーターを追加します。

sudo apt-get --yes purge $(
  ...)

@jarnoコマンドラインを組み合わせて最適化するための努力に感謝します。読みやすくシンプルにするため、コマンドラインを削除しました。読みやすさとシンプルさのために、意図的にコマンドを調整しました。少なくとも私の脳にとって読みやすくてシンプル。コマンドラインをコメントとして、または独自の回答として投稿してください。
レスマナ

1
これには2つの目的があります。最後の2つのカーネルを保持し、現在のカーネルよりも新しいカーネルを保持しますsudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/')。正規表現を処理できるためdpkg-query、必要はありませんapt-get。ドットをエスケープする方法に注意し、正規表現にプレフィックスとサフィックスを追加してください。私自身の答えでスクリプトを使用すると、現在のカーネルよりも古いカーネルを保持することもできます。
ジャーノ

4

この答えの利点は、サードパーティのアプリケーションをインストールせずにネイティブのUbuntu Bashが使用されることです。このbashスクリプトを使用していないaptdpkg、ニーズに合わせて変更できるカスタムカーネルのユーザー。この回答は、「古いカーネルを一度にすべて選択的にパージする方法」に基づいています。

Zenityベースのソリューション

Zenityは、リストを処理し、ラジオボタンで項目を選択するために、ターミナルに素敵なGUIインターフェイスを提供します

rm-kernels 1

タイトルが示すように、現在起動しているカーネルは削除できず、リストに含まれていません。報告されるサイズは、/bootディレクトリに保存される量です。カーネルバイナリは他の領域にも存在するため、ディスクにはさらに多くのデータが保存されます。2017年7月27日注:ディレクトリー/usr/src/*kernel_version*および/lib/modules/*kernel_version*も含まれるようになりました。

更新日を使用して発見されたstatコマンドを。私のシステムでは、これを使用してカーネルがブートされるたびにその日付が「タッチ」さます特定のカーネルバージョンが最後にブートされた時期を確認するにはどうすればよいですか?cronリブートスクリプト。ただし、システムでは、日付はカーネルのリリース日であり、最後にブートした日ではありません。

apt-get purge 中止する機会を与えます

パージされるすべてのものを表示し、回復されるディスクスペースの合計(やや誤解を招く)を確認する最後の機会が与えられます。

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

コード

名前の実行可能ファイルにこのコードをコピーrm-kernelsして/usr/local/bin

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

注:ファイルを作成するにはsudo権限が必要なので、次を使用します。

gksu gedit /usr/local/bin/rm-kernels

ファイルを実行可能にするには:

sudo chmod +x /usr/local/bin/rm-kernels

サーバーバージョン

rm-kernels-serverカーネルを一度に選択的に削除するサーバーバージョンです。GUI(グラフィカル)ダイアログボックスの代わりに、テキストベースのダイアログボックスを使用して、パージするカーネルを選択します。

  • スクリプトを実行する前に、次を使用してダイアログ関数をインストールする必要があります。

    sudo apt install dialog

ダイアログはデフォルトのUbuntuデスクトップインストールにありますが、Ubuntuサーバーにはありません。

サンプル画面

rm-kernels-server 1

rm-kernels-server バッシュコード

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

注:dialogディレクティブの呼び出し--ascii-linessshは、描画ボックスのライン描画拡張文字セット(これは気に入らない)を「+ ----- +」に置き換えるために渡されます。この外観が気に入らない場合--no-linesは、ボックスなしのディレクティブを使用できます。


2017年7月28日の更新

各カーネルの計算されたサイズは、/boot/*kernel_version*合計で最大50 MBの5つのファイルから取得されました。式が変更され、ファイルが/usr/src/*kernel_version*とに含まれるようになりました/lib/modules/*kernel_version*。各カーネルの計算サイズは約400 MBです。以下のための上記のコードrm-kernelsとは、rm-kernels-server更新されています。ただし、上記のサンプル画面はまだこれらの変更を反映していません。

デフォルトでは、duファイルがキャッシュにない場合は非常に遅くなる可能性があるため、linux-headersのファイルサイズを125 MB、linux-imageを220 MBに推定します。使用して実際のサイズを取得するduには、スクリプトにパラメーターを渡します。

すべてのカーネルサイズの合計(削除できない現在実行中のバージョンを除く)がタイトルバーに表示されるようになりました。

各カーネルの最終アクセス日を表示するために使用されるダイアログボックス。この日付は、バックアップまたは同様の操作中にすべてのカーネルに対して大量に上書きされる可能性があります。ダイアログボックスに変更日が代わりに表示されるようになりました。


2

ほぼすべての廃止されたパッケージを削除する簡単な方法は、廃止されたカーネルとともに、パッケージリストに含まれていないパッケージを削除することです。

dpkg --purge $(aptitude search ?obsolete)

ただし、これは他のパッケージによってまだ推奨されているパッケージを見逃し、-R /-without-recommends引数はこの問題を解決しません。

「o」でソートモードを切り替えた後のdselectは、aptitudeがミスしたパッケージを含むすべての廃止されたパッケージを表示しますが、一部の人々はそれを使用したくない場合があります。


私の経験では、指定されたコマンドは古いカーネルをパージしたり、grubメニューに影響を与えたりしません。
ジャーノ

2

sed古いカーネルを永久に削除するために使用する受け入れられた答えにはいくつかの欠陥があります。カーネルのアップグレード後に誰かがコンピューターを再起動しなかった場合、コマンドは新しいカーネルも削除します。

以下は、実際の古いカーネルのみを削除するすべての状況を考慮した代替ソリューションです。

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

現在のバージョンよりも新しいバージョンがある場合、最初にコンピューターを再起動するよう警告が表示されます。また、何らかの理由で現在のカーネルを台無しにしてシステムを不安定にすると、古いカーネルで起動できるようになるという理由により、古いカーネルが保持されることに注意してください。


これにより、低遅延カーネルまたはジェネリック以外のフレーバーのカーネルは削除されません。
jarno

この sedソリューションを参照すると思います。
ジャーノ

@jarno:grep -Po "^linux-image-[^-]+-[^-]+-generic\b"with grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"およびgrep -Po ".*(?=-[a-z]*$)"with grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"およびgrep -Po "[0-9].*(?=-[a-z]*)"withを置き換えてはどうgrep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"ですか?
サディ

@Sadi、wel、lそれは低レイテンシーカーネルも見つけられないでしょう。
ジャーノ

1
ありがとう。他の方法はうまくいきませんでした。あなたの仕事をしました。
フィリップデルテイユ

1

ailurusには、古いカーネルと未使用の構成を削除する機能があります。シナプスから手動で削除します。getdebおよびppaからailurusをインストールできます。


「Ailurusは、インストールされたソフトウェアの名前リストをバックアップするツールです。...過去には、Ailurusには多くの機能がありました。今では1つの機能しかありません。
ジャーノ

1

私はこのためのスクリプトを持っていますが、非常に派手な文字列解析は必要ありません。

現在のもの以外のヘッダーと画像を削除して、スペースを解放します

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+

1

古いカーネルを更新および削除するには、ukuu(すべてGUIです)を使用できます。私のために働く!

最後の2つと、明らかに「実行中の」カーネルをインストールしたままにしてください。

メインラインリリースのみを表示するようにukuuを設定することもできます。RCカーネルも、ポイントリリースを非表示にします。

ウクウ

Synapticでukuuを見つけることができます。または、手順は次のとおりです。

OMG!Ubuntu Ukuuのインストール手順


1

David Kempによる以前の回答に基づいて、次のスクリプトは最新の2つのバージョンを除くすべてのヘッダーと画像を削除します。

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge

apt-get -y問題なく削除するために使用)


これがダウン投票された理由は何ですか?それは誰かのために機能しませんでしたか?コピー/貼り付けの際は、貼り付けるときに長い行を折り返さないようにしてください。私はそれが動作することに何の問題もありませんでした。
マーク14年

私のマシンの最新のカーネルリリースは3.13.0-43-lowlatencyです。このスクリプトはlinux-headers-3.13.0-43-lowlatencyを削除します。
ジャルノ

@jarnoどうやってそれを決めたの?実際に何もせずに試してみるには、apt-getコマンドに「-s」フラグを追加します(または| xargs sudo apt-get -y purge完全に削除します)。3.13.0-43-lowlatencyと表示される場合は、システムにインストールされているバージョンよりも新しいバージョンがインストールされている可能性があります。
マーク

シミュレーションを試しました。いいえ。ただし、以前のバージョンのカーネルをいくつか削除しましたが、削除しませんでした。それぞれのヘッダーパッケージは削除しました。
ジャルノ

とにかく、私はSankalpの答えのアイデアに基づいてスクリプトを開発しています。
ジャルノ

0

ここに私がやったことの大まかな概要があります。私はLinuxの専門家ではないので、注意してください。

gedit /boot/grub/grub.cfg

保持したいエントリを見つけたら、ハイライトしてコピーします

cd /etc/grub.d
ls

10_linuxや30_os-proberなどのファイルのリストが表示されます

sudo chmod -x 10_linux

これにより、すべてのLinuxエントリがgrubブートメニューに自動的に追加されるのを停止します。

gksudo gedit 40_custom

カスタムブートメニューファイルを開き、grub.cfg(geditでまだ開いているはずです)に戻り、保持するエントリをコピーします。

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

に貼り付けてから40_custom保存します。

sudo chmod 755 40_custom

それを実行可能にし、最後にgrubを更新してgrub.cfgファイルを変更します:

sudo update-grub

さて、注意してください、カーネルまたはOSを更新しても、ブートメニューはおそらく更新されません...手動でそれを行う必要があります。ただし、この手順を実行すると、カーネルバージョンを削除してUbuntuの名前を入力するなど、ブートメニューをもう少しカスタマイズできます。つまり、Ubuntu Lucid 10.04などです。

誰かがこれが役立ってくれることを願っています、それを理解するのに時間がかかったので...この解決策がどこにもなかった...


3
この答えはやり過ぎのようです。古いカーネルを削除することをお勧めします。
スコットセベランス

回復状況が発生した場合、追加のカーネルが役立つ可能性があることを読みました。また、これはブートエントリのテキストを編集する簡単な方法です。したがって、「Ubuntu、Linuxカーネルxxxx-yy --text1 -text2 -t3 -t4 --t5などなど」(--textエントリは単に理解できないオプション/パラメータを示している)と言うのではなく、変更できます。 「Ubuntu xx.yy」に変更しましたが、「{」ブラケットを削除できませんでした。
ジョー

1
最新のカーネルが適切に動作することを確認するまで、直前のカーネルを保持します。動作する場合、動作を停止することはありません。そのため、最新のカーネルを検証した後(1週間程度)、古いカーネルを保持する理由はありません。動作しない場合は、フォールバックする最新の既知のカーネルがあります。実際、現在のカーネルのバグのせいで古いカーネルを実行しています。しかし、それは私の全体的なポリシーを変更しません。既知の正常なカーネルが1つだけ必要です。
スコットセブランス

0

シナプスパッケージマネージャーをインストールし、フィルタータブ(5つすべてを試していない場合はフィルターだと思います)に移動し、「ローカル」を選択します。これにより、システムのカーネルなどの孤立パッケージが表示されます。それらをアンインストールした後、を実行しupdate-grubます。このコマンドは、grubのブートオプションのリストを更新します。

これが失敗した場合、いつでも試すことができますapt-get remove linux-image-version-generic


Synapticでは、すべてのカーネルを含む「コンポーネント」->「カーネルとモジュール」でフィルタリングできます。そして、最初の列「S」(ステータス)で並べ替えます。これにより、インストールされているすべてのカーネルが先頭に表示されます。確かupdate-grubにお勧めです。
danger89

0

保持するバージョンをもう少し制御するには、削除するバージョンを明示的に選択します。たとえば、カーネルバージョン3.2.0。[49-53]を削除する場合は、単純なforループを使用します。

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

カーネルバージョンのリストを合わせて調整します。


0

これを試して。ルートとして実行します。

このスクリプトを、たとえば./keep-n-kernels.shとして保存します

保持する最新のカーネルの数をコマンドライン引数として渡します。

    
#!/ bin / bash

#コマンドライン引数としてnを渡すと、インストールされているすべての
#カーネルを作成し、最新のn個のみを保持する=>古いカーネルをすべてアンインストール

#dpkg -l 'linux- *' | sed '/ ^ ii /!d; /' "$(uname -r | sed" s /\(.*\)-\([^ 0-9] \ + \)/ \ 1 / ")" '/ d; s / ^ [^] * [^] * \([^] * \)。* / \ 1 /; / [0-9] /!d '
#このコマンドは、最新のカーネルを除くすべてのパッケージのリストを表示します。
#ソース:https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n = $ 1

#インストールされているカーネルのバージョンを見つける:
#dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep。| ソート-n
#各行に1つずつ、バージョン番号を示します
#dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *' | grep。| sed 's /\...$// g' | grep -v '\ ... $' | ソート-u
#linux-imageに表示されるもののみを提供

#サフィックス、たとえば-generic-pae
#起動するカーネルの種類
suffix = $(uname -r | sed 's:^ [0-9] \。[0-9] \。[0-9] \-[0-9] \ {2 \} :: g')

command = "apt-get purge"

$(dpkg-query -W -f = '$ {Version} \ n' 'linux-image- *'のバージョン| grep。| sed 's /\...$// g' | grep -v ' \ ... $ '| sort -u | head -n-$ {n})
行う
    command = $ {command} "^ linux-image-$ {version} $ {suffix}"
やった

$ command

サンプル使用法:

#./keep-n-kernels.sh 4#apt-getコマンドを起動して、最新の4つのカーネルを除くすべてを削除します

[そして自分の責任で]したい場合は、-y(または強制フラグ)をapt-getコマンドに追加して、非対話型にすることができます。


./keep-n-kernels.sh 0を実行すると、すべてのカーネルが削除されます。サフィックス文字列の検出は機能しません。サフィックス= $(uname -r | sed -r 's / ^ [0-9。] *(-[0-9。] +)* //')またはsuffix = $(uname -r | egrep- -only-matching-'-[[:alpha:]-] + $')でできます。
ジャルノ

しかし、私はそのアイデアは素晴らしいと思います。スクリプトの改善に取り組んでいますが、準備ができたと思うときに、いつかここに投稿するでしょう。
ジャルノ

@jarnoを共有してください。このアイデアが役に立つように思えてうれしいです。
Sankalp

OK、そこにあります:リンク
-jarno

0

私はKDEデスクトップを使用しており、見つけた最も簡単なオプションは、ここで提案されているようにkde-config-grub2アプリケーションを使用することでした:https ://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (背景画像、デフォルトの起動オプションなどを設定するためにすでにインストール済みです)。デフォルトのエントリを選択できるドロップダウンボックスの隣に、「古いエントリを削除」ボタンがあります。このボタンをクリックすると、インストールされているすべてのカーネルのリストが表示され、削除するカーネルを選択できます。変更を適用すると、dpkgを使用して実際にシステムおよびGRUBメニューからそれらを削除します。


0

チャイムするだけで、あなたも発行することができます

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

ルートとして、ジョブが行われます。


0

ansibleを使用してマシンを制御している場合は、このプレイブックが役立つ場合があります。

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.