apt-get autoremoveで古いカーネルが削除されないのはなぜですか?


53

私のブートパーティションはSSD上にあるため、インストールされているカーネルバージョンが約8を超えるスペースはありません。ブートパーティションが古いバージョンでいっぱいであるため、最終的に一部のカーネルアップデートのインストールが失敗します。古いバージョンを削除する方法(プロセスを自動化する方法も含めて)については多くの質問がありますが、私の質問はこれだけです。なぜapt-get autoremoveそれらを自動的に検出して削除しないのか、そうする方法はありますか?私が意味する、apt-getそれがそれらについて知っているので、とにかくそれらを設置するものであるので、なぜそれが周りのすべての古いバージョンを残すことを選択しますか?



1
Autoremove 、ほとんどの状況で古いカーネルを削除します。システムはデフォルトで自動削除を自動的に実行しないため、カーネルは蓄積されます。これは無人アップグレードの設定であり、変更できます。Autoremoveは、以前にキューに入れられたaptアクション(新しいカーネルのインストールなど)が失敗した場合(スペース不足のため)、古いカーネルを削除できません。古いカーネルの自動削除開始する無人アップグレードのパッチについては、bugs.launchpad.net / bugs / 1357093を参照してください。
user535733

回答:


36

理由を答えるには、ファイルを参照してください /etc/apt/apt.conf.d/01autoremove-kernels

ここに画像の説明を入力してください

ご覧のとおり、aptは別の(スクリプト)ファイルで指示されているように、カーネルを自動削除しないように指示されています/etc/kernel/postinst.d/apt-auto-removal。そして、ここにあります:

ここに画像の説明を入力してください

選択した2つのカーネル、つまり最初と現在のカーネルを手動でインストールする場合、apt-autoremoveは手動でインストールしなかった古いバージョンのみを削除するため、常にこれら2つのオプションと最新のものがあります。

更新:

/etc/kernel/postinst.d/apt-auto-removalこの部分があります:

if [ "$latest_version" != "$installed_version" ] \
   || [ "$latest_version" != "$running_version" ] \
   || [ "$installed_version" != "$running_version" ]
then
        # We have at least two kernels that we have reason to think the
        # user wants, so don't save the second-newest version.
        previous_version=
fi

したがって、01autoremove-kernelsfile の出力を比較uname -rすると、現在実行中のカーネルとその直前の最新のカーネルが、そのスクリプトによって削除されないことがわかります。行が存在する別のファイル/etc/apt/apt.conf.d/01autoremoveがあります:

    APT
    {
      NeverAutoRemove
      {
            "^firmware-linux.*";
            "^linux-firmware$";
      };
  VersionedKernelPackages
  {
        # linux kernels
        "linux-image";
        "linux-headers";
        "linux-image-extra";
        "linux-signed-image";
        # kfreebsd kernels
        "kfreebsd-image";
        "kfreebsd-headers";
        # hurd kernels
        "gnumach-image";
        # (out-of-tree) modules
        ".*-modules";
        ".*-kernel";
        "linux-backports-modules-.*";
        # tools
        "linux-tools";
  };

したがって、これらをコメントアウトすることができ、カーネルを自動で削除できますがapt-autoremove、覚えておいてください-あなた自身の責任でこれを実行してください


1
とても興味深い!Myに/etc/apt/apt.conf.d/01autoremove-kernelsは多くの行がありますが、それらのすべてのうち2つのバージョンのみ:3.13.0。{39,43}。しかしdpkg -l linux-*、3.13.0。{39,40,41,43}の4つのバージョンがリストされているので、/etc/apt/apt.conf.d/01autoremove-kernelsこれらの中間バージョンを保持している以外の何かが正しいでしょうか?
BlueBomber 14

1
TL:DR:01autoremove必要なファイルで01autoremove-kernelsあり、おそらく単なる保護です。そのため、aptは現在インストールされているカーネルと最新のカーネルを削除しません(最新の場合)
Sergiy Kolodyazhnyy 14

1
誤解していない限り01autoremove、それは依存パッケージの自動削除から保護しているだけlinux-image-extraです。変更してもlinux-image-3.16.0-31-generic、自動削除されるかどうかには影響しません。その中のどのパターンも、自動削除したいパッケージ名に一致しません。
ピーターコーデス

1
@PeterCordesの行を削除またはコメントしないでください/etc/apt/apt.conf.d/01autoremove。これは、古いバージョンのカーネルパッケージの自動削除には役立ちませんが、望ましくない効果が生じる可能性があります。ファイルは自動削除から保護しませんlinux-image-extraが、NeverAutoRemoveセクション内の正規表現に一致するパッケージです。
jarno

2
@BlueBomber、apt-get autoremoveリストされていないカーネルを削除しない理由/etc/apt/apt.conf.d/01autoremove-kernelsは、それらのカーネルが手動でインストールされているとマークされているためです。私の答えをご覧ください。
ジャルノ

8

私にとっては、最新の(X)ubuntu(15.10)のインストールに役立ちました。以前のリリースでは、少なくともSoftware Updaterを使用してインストールした場合、カーネルパッケージは手動でインストールされたとマークされるため、sudo apt-get autoremove --purge削除できません。問題に関するバグレポートがあります:Bug#1175637Bug#1439769

以前のリリースでは、自動的にインストールされるカーネルパッケージをマークしsudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")sudo apt-get autoremove --purgeその後実行して、違いがあるかどうかを確認することができました。コマンドはまだ/etc/apt/apt.conf.d/01autoremove-kernelsに示したカーネルパッケージを削除するべきではありませんが、それは実行するのが最も安全であるapt-get autoremoveとの--dry-run最初のオプション。


ああ、autoremoveコマンドは多くのカーネルを削除する傾向があります。バグ#1440608
jarno

1
apt-markP:私は10回upvoteことがしたい、私のためのトリックをやった
マイク・グリーソンJRクチュリエ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.