web-dev-qa-db-ja.com

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

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

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

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

698
ImaginaryRobots

16.04以降のUbuntuバージョン

Sudo apt autoremove

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

11.10以降のUbuntuバージョン

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

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

GNU GRUB

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

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

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

GNU GRUB Previous versions

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

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

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

シナプス

代替手段はSynapticSudo apt install synaptic

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

Synaptic Package Manager

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

Synapticただし、削除しようとしているものを確認しようとはしません...最新のカーネルを誤って削除したり、すべてのカーネルをこのツールを使用すると、起動できないUbuntu!.

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

uname -r

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

Terminal <uname -r>

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

勧告

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

600
fossfreedom

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

uname -r 

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

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

dpkg --list 'linux-image-*'

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

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

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

Sudo update-grub2 

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

382
penreturns

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

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呼び出しの巻き戻し:

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

完全に、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/")"は、バージョン(例:「3.2.0-44」)のみを抽出し、uname -rから「-generic」などを含まない


画像とヘッダーを削除するオールインワンバージョン(上記の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
283
David Kemp

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
60
bmaupin

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」がルートとして実行されると、コンピューターから削除された他のオペレーティングシステムもメニューから削除されます。

  • メニュー項目は、スクリプトによって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より前)

for GRUB not GRUB2

startupmanagerInstall startupmanager

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

43
karthick87

純粋にコマンドラインで、これは現在および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
39
Kees Cook

更新:purge-old-kernels非推奨 最近です。

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

現在使用されているカーネルよりも古いカーネル(および関連パッケージ)を削除するだけの場合、システムが破損していないときに this script を使用できます。

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

34
jarno

これを実行するには、Ubuntu Wikiの Automatic Security Updates の記事の「unattended-upgrades」パッケージセクションを使用します。

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

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

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

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

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

"^linux-image.*"; 

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

29
Qwerty

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

Sudo apt-get autoclean

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

Sudo apt-get clean

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

Sudo apt-get autoremove

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

27
Luis Alvarado

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

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
25
mikewhatever

10.04 GUIメソッド

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

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

25
maco

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

コマンドuname -rを使用してカーネルバージョンをチェックすることもできます。これにより、誤って間違ったバージョンを削除しないようにすることができます。

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

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

16
anurag-jain

buntu-Tweak をインストールしてから、アプリケーション->システムツール-> ubuntu Tweakに移動し、

enter image description here パッケージクリーナーをクリックし、カーネルをクリーンアップします。現在使用されているカーネルは表示されないため、常に安全です。

14
Lincity

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

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

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

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

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

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


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

6
evgeny

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

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

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 $(
  ...)
4
lesmana

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

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

Zenityは、端末にNice GUIインターフェイスを提供して、リストを処理し、radio-buttonsでアイテムを選択します

rm-kernels 1

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

Modified Dateは、statコマンドを使用して検出されます。私のシステムでは、この日付は "touched"で、これを使用してカーネルが起動されるたびに( 特定のカーネルバージョンが最後に起動されたときはどうすればわかりますか? =)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(グラフィカル)ダイアログボックスの代わりに、テキストベースのダイアログボックスを使用して、パージするカーネルを選択します。

  • スクリプトを実行する前に、次を使用してdialog functionをインストールする必要があります。

    Sudo apt install dialog

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

サンプル画面

rm-kernels-server 1

rm-kernels-server bashコード

#!/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-linesが渡されて、ライン描画拡張文字セット(_sshは、ボックスを描画するために「+ ----- +」を使用して好きではありません)。この外観が気に入らない場合は、--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を使用して実際のサイズを取得するには、スクリプトにパラメーターを渡します。

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

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

4

古いカーネルを永久に削除するために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

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

2
heemayl

廃止されたカーネルとともに、ほとんどすべての廃止されたパッケージ、パッケージリストにないパッケージを削除する簡単な方法は、次のいずれかを実行することです。

dpkg --purge $(aptitude search ?obsolete)

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

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

2
Chris Cheney

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

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

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
Paulo Santos

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

1
sagarchalise

David Kempによる以前の回答に基づいて、次のスクリプトはlast 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を使用して問題なく削除します)

1
Mark

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

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

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

ukuu

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

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

1
sprocketoctopus

他の回答では、2つのより安全な方法のバリエーションを示します。1つはsynaptic managerを使用し、もう1つはterminalを使用します。

これらのバリエーションでは、システムがリムーバブルと識別したパッケージのみを削除します。数週間前に起こったように、現在使用されているLinuxカーネルを削除してもリスクはありません;

Synaptic Managerを使用する

linux-imageallインストール済みパッケージで検索する代わりに、autoremovableパッケージを選択します(赤を参照下の写真の楕円)。ここで、このリストからlinux-imageを削除します。

---(enter image description here

ターミナルを使用する

同様に、ターミナルでカーネルを削除する場合は、autoremovableカーネルのみを実行して表示します

 Sudo apt-get -s autoremove | grep linux-image

そして、実行することにより、指定したリストから削除したいカーネルlinux-image-x.x.x-x-genericを削除します

 Sudo apt-get purge linux-image-x.x.x-x-generic 
0
loved.by.Jesus

unattended-upgradesを使用しているため、古いカーネルパッケージを自動的にアンインストールするように設定する Qwerty's answer がとても気に入りました。

ただし、1つの問題がありました。新しいカーネルがインストールされた後、このプロセスは現在実行中のカーネルのパッケージをアンインストールします。

OSを完全に破壊するわけではありません。実際、(USBデバイスを接続するなどして)モジュールをホットロードする必要があり、その後モジュールが見つからないまで、この問題が発生することはほとんどありませんでした。

これに対する解決策として、次のブートまで現在のカーネルパッケージを効果的に固定する仮想パッケージcurrently-installed-kernelを生成するスクリプトを作成しました。

このスクリプトはpin-current-kernel-with-package.shと呼ばれます。 最新バージョン (おそらく)および 最初のバージョン (間違いなく)です。

そのスクリプトをどこかに保存し、 起動プロセスに追加 します。たとえば、/root/bit/pin-current-kernel-with-package.shに保存してから/etc/rc.localを編集し、次の行を追加します。

bash /root/bin/pin-current-kernel-with-package.sh

これで、実行中のカーネルパッケージがアンインストールされることはありません!

0
joeytwiddle

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
0
flickerfly

次回、古いカーネルを削除するときにターミナルを開き、次のコマンドを使用します。

Sudo apt-get autoremove linux-headers-2.6.38-10-generic

Synapticを使用して、削除する予定のカーネルの正確な名前を取得できます。 Synapticを開いて「linux-headers」を検索し、削除するカーネルエントリを選択するだけです。関連するエントリには、最後に「-generic」のタグが付けられます。

システム全体で未使用の(残った)依存関係をクリアするには、次のコマンドを単独で使用します。

Sudo apt-get autoremove
0
Chad--24216

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

0
Ben

次のコマンド文字列は、現在実行中のカーネル(grep -v uname -r)および利用可能な最新のカーネル(dpkg -l | .... | tail -1)を除く、インストールされているすべてのLinuxカーネルをパージします。

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge

これを使用してデスクトップのブートボリュームを比較的クリーンに保ちますが、サーバーの状況では、おそらくロジックを拡張し、サーバーが最後に起動したXカーネルのリストを維持するための追加のスクリプトを記述したいでしょう。

起動スクリプトのようなもの:

uname -r >> /root/bootedkernels
cat /root/bootedkernels | sort -u | tail -3 > /root/bootedkernels # Keep the last 3 booted kernels

次に使用します:

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -vf /root/bootedkernels | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge
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 '
#このコマンドは、 
#source:https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n=$1
 
#インストールされているカーネルのバージョンを見つけます:
#dpkg-query -W -f = '$ {Version}\n' 'linux-image- *' | grep。 | sort -n 
#は、各行に1つのバージョン番号を提供します。
#dpkg-query -W -f = '$ {Version}\n' 'linux-image- *' | grep。 | sed 's /\...$// g' | grep -v '\ ... $' | sort -u 
#は、linux-image 
 
#接尾辞に現れるもののみを与えます。 -generic-pae 
#ブートするカーネルの種類
 suffix = $(uname -r | sed 's:^ [0-9] \。[0-9] \。[ 0-9] \-[0-9]\{2 \} :: g ')
 
 command = "apt-get purge" 
 
 for $(dpkg-query -W -f = '$ {Version}\n' 'linux-image- *'のバージョン| grep。| sed 's /\...$// g' | grep -v '\ ... $ '| sort -u | head -n-$ {n})
 do 
 command = $ {command} "^ linux-image-$ {version} $ {suffix} 「
 done 
 
 $ command 

サンプル使用法:

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

[AND AT YOUR OWN RISK]が必要な場合は、apt-getコマンドに-y(または強制フラグ)を追加して、非対話型にすることができます。

0
Sankalp

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

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

0
Relish

通常のシステム更新で自動的にインストールされたカーネルをremoveするには、ターミナルを開いて実行します:

Sudo apt autoremove --purge

現在のカーネルリリースを確認するには、uname -rを実行します。また、uname --helpを実行して、すべてのunameコマンドの詳細を確認できます。

df -hを実行してファイルシステムドライバーを表示することもできます。同様に、df --helpを実行して詳細を確認できます。

古いカーネルの自動削除を有効にするには:gksuを使用して設定ファイルを編集します

gksudo gedit /etc/apt/apt.conf.d/50unattended-upgrades

ファイルが開いたら、次の行のコメントを解除し、値をtrueに変更します。

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

gksuをインストールする必要がある場合は、Sudo apt install gksuを実行できます。

古いパッケージをクリアするには、Sudo apt-get cleanを使用できます

詳細については、 http://ubuntuhandbook.org/index.php/2016/05/remove-old-kernels-ubuntu-16-04/ をご覧ください

0
Abdallah Okasha

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

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

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

0
Severo Raz

@ jarno および @ earcam が質問に対するコメントで言及されているように、まず、すべてのLinuxカーネルパッケージが自動インストール済みとしてマークされていることを確認する必要があります。

Sudo apt-mark auto '^linux-.*-4\.12\.0-12(-generic)?$'

その後、通常のapt-get autoremoveコマンドが機能するはずです。

Sudo apt-get autoremove --purge

詳細については、 docs を参照してください。

0
hobs

ここに私がやったことの大まかな概要があります。私は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などです。

誰かがこれが役に立つと思うことを願っています、それが理解するのに私がしばらく時間がかかったので...

0
Joe

古いカーネルイメージを削除するには、apt-getではなく、apt(人間のcliフロントエンド)を使用します。

$ Sudo apt autoremove --purge
...
The following packages will be REMOVED:
  linux-headers-4.4.0-51* linux-headers-4.4.0-51-generic* linux-image-4.4.0-51-generic* linux-image-extra-4.4.0-51-generic*
0
k0pernikus

保持するバージョンをもう少し制御するには、削除するバージョンを明示的に選択します。たとえば、カーネルバージョン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
NeilNjae