新しいLinuxカーネルをインストールするたびに、grub_configに残り、ブートメニューが長くなります。
インストール済みのパッケージを手動で検索して削除できることは知っています。
Ubuntuは、それらをクリーンアップする、またはブートリストに表示されないようにする簡単な方法を提供しますか?
Sudo apt autoremove
このコマンドは、依存関係を解決するために自動的にインストールされたパッケージを削除しますが、現在は依存していません。これには、linux-headers-*
およびlinux-image-*
の古いバージョンが含まれます。 (このプロセスについても賢明であり、予備のカーネルをフォールバックとして残します!)
UbuntuにインストールされているGrub2の最新バージョンは、最新のカーネルを自動的に表示し、あなたがインストールしたかもしれない古いカーネルを隠します。
grubが表示されない場合は、忘れずに Shift 起動中。
ご覧のとおり、最新のカーネルのみが表示されます。
表示されたオプションを選択した場合(を押します Enter)その後、すべての古いカーネルが表示され、ブート可能になります。
利用可能な最新のカーネルで最初に起動します。
古いカーネルを削除する方法はいくつかあります。個人的には、Computer Janitorには触れません。これは、その提案でコンピューターを破壊することが認められているためです。
シナプス
代替手段はSynaptic(Sudo apt install synaptic
)
linux-imageを検索し、カーネルを右クリックして完全な削除を選択し、最後にApplyカーネルを削除するボタン。
検索を繰り返しますが、今回はlinux-header-以前に選択したカーネルイメージの関連ヘッダーを削除できます。
Synapticただし、削除しようとしているものを確認しようとはしません...最新のカーネルを誤って削除したり、すべてのカーネルをこのツールを使用すると、起動できないUbuntu!.
使用しているカーネルのタイプを必ず確認してください:
uname -r
結果は次のようになります。
結果と番号を覚えておいてください-対応する画像やヘッダーを削除しないでください。
私の推奨は、最新のものを含む少なくとも2つ、できれば3つのカーネルを保持することです。推奨される理由は、何らかの理由で最新のカーネルで起動できない場合、または壊れたワイヤレスなどの退行する機能を導入する場合、少なくとも1つまたは2つの他のカーネルで起動することです。
まず、システムを再起動して、最新のカーネルを使用していることを確認します。次に、ターミナルを開き、現在のカーネルを確認します。
uname -r
このカーネルを削除しないでください!
次に、以下のコマンドを入力して、システムにインストールされているすべてのカーネルを表示/一覧表示します。
dpkg --list 'linux-image-*'
現在のカーネルよりも低いすべてのカーネルを見つけます。削除するカーネルがわかったら、以下に進んで削除します。以下のコマンドを実行して、選択したカーネルを削除します。
Sudo apt-get purge linux-image-x.x.x-x-generic
最後に、以下のコマンドを実行してgrub2を更新します
Sudo update-grub2
システムを再起動します。
古いカーネルを削除するためのワンライナー(これによりディスク領域も解放されます)
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
は印刷;
はコマンドセパレーターです。したがって、/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
$ 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
これが最も簡単で迅速な方法だと思います。最新のカーネルと、さらに2つのカーネルを保持します。
Sudo apt-get install bikeshed
Sudo purge-old-kernels
保持する追加のカーネルの数を変更するには:
Sudo purge-old-kernels --keep 3
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+
注:カーネルの更新後、GRUBメニューに新しいエントリが追加されます。必要に応じて古いエントリを削除できます。ただし、 、ほとんどの経験豊富なユーザーは、アップグレードで何か問題が発生し、トラブルシューティングのために古いカーネルバージョンを起動する必要がある場合に備えて、少なくとも1つのスペアエントリを保持することをお勧めします。
カーネルエントリを削除する別の方法(10.04より前)
for GRUB not GRUB2
システム>>管理>>で見つけることができます
2番目のスクリーンショットでは、表示するカーネルの数を選択できますか?通常は1のままにしますが、カーネルのアップグレードを取得するときは、再起動する前に常に2に変更し、新しいカーネルにハードウェアに問題がある場合は古いカーネルを選択できるようにします。新しいカーネルが正常に機能していることがわかったら、それを1に戻します。
純粋にコマンドラインで、これは現在および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
更新:purge-old-kernels
は 非推奨 最近です。
トリッキーな状況でもカーネルをパージするスクリプトを作成しました。それはlinux-purge
と呼ばれ、あなたはそれを見つけることができます ここ 。
現在使用されているカーネルよりも古いカーネル(および関連パッケージ)を削除するだけの場合、システムが破損していないときに this script を使用できます。
古いカーネルの削除に関して私が貢献したUbuntuのドキュメントページもあります here 。
これを実行するには、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。
すでにUbuntuに付属している可能な最速/簡単な方法(少なくとも12.04以降に適用可能)はapt-get
です。使用していない古いカーネルバージョンをすべて削除する場合は、次の手順を実行します(使用していない以前のバージョンを除く。これは、現在のカーネルバージョンが何らかの方法で失敗した場合に、前の状態に戻ります)。以下をせよ:
Sudo apt-get autoclean
これにより、古いファイル(カーネルバージョンを含む)が削除されます。古いバージョンが多数ある場合は、カーネルバージョンを削除しても問題がないことを確認する必要があるため、時間がかかることに注意してください。私にとって、最後の12カーネルバージョンの削除には約2分かかりました。次のこともできます。
Sudo apt-get clean
これにより、aptのキャッシュフォルダーにダウンロードおよび保存されたすべてのものが削除されます。最後に:
Sudo apt-get autoremove
使用されていないパッケージをチェックし、必要に応じて削除します。これは、インストールされているアプリで不要になったライブラリおよび依存パッケージに最適です。
インストールされているカーネルとヘッダーを把握するには
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
Computer Janitorは古いカーネルをクリーンアップでき、Ubuntuにはデフォルトでインストールされていると信じています(Kubuntuではありません)。
GRUB 1を使用している場合、/boot/grub/menu.lst
には、最大で表示するカーネルの数を指定するオプションがあります。 GRUB 2は、私が知る限り、そうではありません。
古いLinuxイメージカーネルを削除するには、保持するカーネルで最初に起動します。
コマンドuname -r
を使用してカーネルバージョンをチェックすることもできます。これにより、誤って間違ったバージョンを削除しないようにすることができます。
次に、シナプスパッケージマネージャーに移動してlinux-image
を検索し、上部のコマンドで表示されるバージョンを除く古いバージョンを削除します。一般的に、最新のものを使用することを好みます。
再起動すると、よりクリーンなgrubメニューが表示されます。
buntu-Tweak をインストールしてから、アプリケーション->システムツール-> ubuntu Tweakに移動し、
パッケージクリーナーをクリックし、カーネルをクリーンアップします。現在使用されているカーネルは表示されないため、常に安全です。
個人的には、Synaptic
を使用するのが好きです。何が起こっているのかをより安全に感じることができます。古いカーネルを削除するオプションがある唯一のアプリは、 buntu Tweak です。
使用していないカーネルを削除する方法:
uname -a
を実行してくださいSynapticを使用して古いカーネル(linux-image-...
パッケージ)をアンインストールすると、ブートメニューからそれらが削除されます。実行中のカーネルを削除しないように注意してください(uname -r
でバージョンを確認できます)。
1つまたは2つの古いバージョンを使用すると、問題が発生した場合のトラブルシューティングに役立ちます。
または、エントリを手動で編集/削除することもできます(gksu gedit /boot/grub/grub.cfg
)が、新しいカーネルに更新すると再生成されます。 recovery mode
オプションの削除を検討している場合は、しないでください。起動できないような何かを壊した場合に便利です。
このページ を参照してください
これは純粋なコマンドラインソリューションです。
まず、現在実行中のカーネルを除く、インストールされているすべてのカーネルバージョンのリストを生成します。
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 $(
...)
この回答の利点は、サードパーティのアプリケーションをインストールせずにネイティブのUbuntu Bashが使用されることです。 apt
またはdpkg
を使用しなかったカスタムカーネルのユーザーは、ニーズに合わせてこのbashスクリプトを変更できます。この答えは( 古いカーネルを一度に選択的にパージする方法 )に基づいています。
Zenityは、端末にNice GUIインターフェイスを提供して、リストを処理し、radio-buttonsでアイテムを選択します
タイトルは現在起動しているカーネルを削除できないため、リストに含まれていないことを示しています。報告されるサイズは、/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
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
ディレクティブをボックスなしで使用できます。
計算された各カーネルのサイズは、/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が表示されます。
古いカーネルを永久に削除するために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
現在のバージョンよりも新しいバージョンがある場合、最初にコンピューターを再起動するよう警告が表示されます。また、何らかの理由で現在のカーネルを台無しにしてシステムを不安定にすると、古いカーネルで起動できるようになるという理由で、古いカーネルが保持されることに注意してください。
廃止されたカーネルとともに、ほとんどすべての廃止されたパッケージ、パッケージリストにないパッケージを削除する簡単な方法は、次のいずれかを実行することです。
dpkg --purge $(aptitude search ?obsolete)
ただし、他のパッケージでまだ推奨されているパッケージを見逃すことになり、-R /-without-recommends引数はこの問題を解決しません。
'o'でソートモードを切り替えた後のdselectは、aptitudeがミスしたパッケージを含むすべての古いパッケージを表示しますが、一部の人々はそれを使用したくない場合があります。
私はこのために、非常に派手な文字列解析を必要としないスクリプトを持っています。
現在のもの以外のヘッダーと画像を削除して、スペースを解放します
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)+
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
を使用して問題なく削除します)
古いカーネルを更新および削除するには、ukuu(すべてGUIです)を使用できます。私のために働く!
最後の2つと、明らかに「実行中の」カーネルをインストールしたままにしてください。
メインラインリリースのみを表示するようにukuuを設定することもできます。RCカーネルも、ポイントリリースを非表示にします。
Synapticでukuuを見つけることができます。または、手順は次のとおりです。
他の回答では、2つのより安全な方法のバリエーションを示します。1つはsynaptic managerを使用し、もう1つはterminalを使用します。
これらのバリエーションでは、システムがリムーバブルと識別したパッケージのみを削除します。数週間前に起こったように、現在使用されているLinuxカーネルを削除してもリスクはありません;
linux-image
をallインストール済みパッケージで検索する代わりに、autoremovableパッケージを選択します(赤を参照下の写真の楕円)。ここで、このリストからlinux-imageを削除します。
---(
同様に、ターミナルでカーネルを削除する場合は、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
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
これで、実行中のカーネルパッケージがアンインストールされることはありません!
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
次回、古いカーネルを削除するときにターミナルを開き、次のコマンドを使用します。
Sudo apt-get autoremove linux-headers-2.6.38-10-generic
Synapticを使用して、削除する予定のカーネルの正確な名前を取得できます。 Synapticを開いて「linux-headers」を検索し、削除するカーネルエントリを選択するだけです。関連するエントリには、最後に「-generic」のタグが付けられます。
システム全体で未使用の(残った)依存関係をクリアするには、次のコマンドを単独で使用します。
Sudo apt-get autoremove
私はKDEデスクトップを使用しており、私が見つけた最も簡単なオプションは、ここで提案されているようにkde-config-grub2アプリケーションを使用することでした: https://www.kubuntuforums.net/showthread.php?58075-remove-old -linux-versions (背景画像、デフォルトの起動オプションなどを設定するためにすでにインストールしていた)。デフォルトのエントリを選択できるドロップダウンボックスの隣に、「古いエントリを削除」ボタンがあります。このボタンをクリックすると、インストールされているすべてのカーネルのリストが表示され、削除するカーネルを選択できます。変更を適用すると、dpkgを使用して、システムおよびGRUBメニューから実際にそれらを削除します。
次のコマンド文字列は、現在実行中のカーネル(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
これを試して。ルートとして実行します。
このスクリプトを./ 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(または強制フラグ)を追加して、非対話型にすることができます。
synaptic package managerをインストールし、フィルタータブ(フィルター、5つすべてを試さないと思う)に移動し、「ローカル」を選択します。これにより、カーネルなどのシステム上の孤立パッケージが表示されます。それらをアンインストールした後、update-grub
を実行します。このコマンドは、grubのブートオプションのリストを更新します。
これが失敗した場合、いつでもapt-get remove linux-image-version-generic
を試すことができます。
通常のシステム更新で自動的にインストールされたカーネルを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/ をご覧ください
チャイムするだけで、あなたも発行することができます
apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}
ルートとして、ジョブが行われます。
ここに私がやったことの大まかな概要があります。私は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などです。
誰かがこれが役に立つと思うことを願っています、それが理解するのに私がしばらく時間がかかったので...
古いカーネルイメージを削除するには、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*
保持するバージョンをもう少し制御するには、削除するバージョンを明示的に選択します。たとえば、カーネルバージョン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
カーネルバージョンのリストを調整して調整します。