/ bootパーティションの空き領域を確保する方法について多くのスレッドを見てきましたが、それも私の目標です。しかし、私はoldカーネルを削除することにのみ興味があり、カーネルのそれぞれではなく現在のものを削除します。
Puppetからスクリプトを実行し、余分なファイルを置きたくないので、このソリューションがワンライナーである必要があります。これまでのところ、私は次のものを得ました:
dpkg -l linux-* | awk '/^ii/{print $2}' | egrep [0-9] | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | xargs Sudo apt-get -y purge
より正確に言うと、現時点で行われていることは次のとおりです。
これは機能しますが、少なくとも20台のサーバーがUbuntuを実行しているため、ソリューションはよりエレガントになり、運用環境にとって安全であると確信しています。
お時間をありがとう、アレハンドロ。
ほんの少しのコメントで十分に見えます。最初の2つのコメントによりコマンドが安全になり、3番目と4番目のコメントによりコマンドが少し短くなります。それらのいずれかを自由にフォローまたは無視してください。最初の2つに従うことを強くお勧めしますが。あなたはそれが可能な限り安全であることを確認したい。私は真剣に意味します。自動的に生成されたパッケージリストにSudo apt-get -y purge
を投げています。そうですevil! :)
すべてのlinux-*
をリストすると、(私の出力の例)linux-sound-base
など、多くの誤検知が発生します。これらはコマンドの残りの部分で後で除外される可能性がありますが、個人的にはそもそもそれらをリストしない方が安全だと感じます。削除するパッケージをより適切に制御します。予期しない結果が生じる可能性のあることをしないでください。だから私はで始めます
dpkg -l linux-{image,headers}-*
「数字のあるもののみをリストする」という正規表現は、私の意見では少し単純すぎます。たとえば、64ビットシステムを使用している場合は、linux-libc-dev:AMD64
パッケージがあります。正規表現が一致します。一致させたくない。確かに、あなたが私の最初のアドバイスに従えば、linux-libc-dev:AMD64
はリストに表示されませんが、それでも表示されます。バージョン番号の構造については、「番号があります」という単純な事実よりも多くのことを知っています。さらに、シェルによる潜在的な誤解を防止するためだけに、一般的に正規表現を引用することをお勧めします。だから私はそのegrepコマンドを作成します
egrep '[0-9]+\.[0-9]+\.[0-9]+'
次に、このソート処理があります。なぜソートするのですか?とにかくすべてのカーネル(現在のカーネルを除く)を削除するので、新しいカーネルの前に古いカーネルを削除することが重要ですか?違いはないと思います。または、sed
を使用して「現在のカーネルの後にある結果のみを印刷する」ことができるようにするだけですか?しかし、IMOは非常に複雑に感じます。とにかくgrep -v
で既にやっているように、あなたの現在のカーネルに対応する結果を単純に除外しないのはなぜですか?正直なところ、あなたのコマンドの最初の部分を取り込んだ場合(以前の2つの提案を統合して)、私のマシンで
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | sort -t- -k3,4 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
linux-image-3.8.0-34-generic
linux-image-3.5.0-44-generic
そのソート/セッドのものを削除すると、私は得る
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v -e `uname -r | cut -f1,2 -d"-"`
linux-image-3.5.0-44-generic
linux-image-3.8.0-34-generic
linux-image-extra-3.5.0-44-generic
linux-image-extra-3.8.0-34-generic
したがって、あなたのより複雑なコマンドは実際に私のマシン上の2つのパッケージを見逃します、私は削除したいでしょう(それらのlinux-image-extra-*
thingysはlinux-image-*
thingysに依存するため、とにかく削除される可能性がありますが、明示的にすることはできません)。とにかく、あなたのソートのポイントはわかりません。単純なgrep -v
は、派手な前処理をせずに、おそらくさらに良くなるはずです。私はKISS原則の支持者です。後で理解したりデバッグしたりしやすくなります。また、並べ替えをせずにわずかに効率的です;)
これは純粋に審美的ですが、このわずかに短いバリアントでも同じ出力が得られます。 :-)
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v $(uname -r | cut -d- -f-2)
linux-image-3.5.0-44-generic
linux-image-3.8.0-34-generic
linux-image-extra-3.5.0-44-generic
linux-image-extra-3.8.0-34-generic
その結果、よりシンプルで安全なコマンドになります
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | grep -v $(uname -r | cut -d- -f-2) | xargs Sudo apt-get -y purge
実際に/boot
パーティションをクリーンアップしたいので、/boot
のコンテンツをリストし、dpkg -S
を使用して個々のファイルが属するパッケージを判別し、フィルターをかけることはまったく異なる方法です。現在のカーネルに属するものを削除し、結果のパッケージを削除します。しかし、linux-headers-*
ではなく/boot
にインストールされない/usr/src
などの古いパッケージも検出するため、あなたのアプローチの方が好きです。
現在起動しているものよりもバージョンが低い「linux- *」パッケージを削除するこのスクリプトを書きました。パッケージの状態をテストする必要はないと思います。このコマンドは、パッケージをパージする前に確認を求めます。必要ない場合は、apt-getコマンドに-yオプションを追加します。
Sudo apt-get purge $(dpkg-query -W -f'${Package}\n' 'linux-*' |
sed -nr 's/.*-([0-9]+(\.[0-9]+){2}-[^-]+).*/\1 &/p' | sort -k 1,1V |
awk '($1==c){exit} {print $2}' c=$(uname -r | cut -f1,2 -d-))
ただし、構成可能な量のスペアカーネルを残すには、linux-purge
スクリプトを--keep
オプションと共に使用することをお勧めします。スクリプトの詳細については、 here を参照してください。
TL; DR:一番下までスキップ
ただし、ISはもう少し長くなります。分解します。
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
Malteが提案したように。関連するカーネルファイルをリストします。egrep '[0-9]+\.[0-9]+\.[0-9]+'
また、バージョン番号を検索してカーネルファイルのみを選択するより安全な方法としてMalteから提案されました。現在、画像とヘッダーパッケージの両方をリストしている可能性があるため、パッケージの名前は異なる可能性があるため、ソートに必要なこのawkの回避策がありますawk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
結果は、元のパッケージの前のバージョン番号を持つ新しい列です以下のような名前:
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
3.11.0-23 linux-headers-3.11.0-23
3.11.0-23 linux-headers-3.11.0-23-generic
3.11.0-24 linux-headers-3.11.0-24
3.11.0-24 linux-headers-3.11.0-24-generic
3.11.0-26 linux-headers-3.11.0-26
3.11.0-26 linux-headers-3.11.0-26-generic
3.11.0-23 linux-image-3.11.0-23-generic
3.11.0-24 linux-image-3.11.0-24-generic
3.11.0-26 linux-image-3.11.0-26-generic
3.8.0-35 linux-image-3.8.0-35-generic
3.11.0-23 linux-image-extra-3.11.0-23-generic
3.11.0-24 linux-image-extra-3.11.0-24-generic
3.11.0-26 linux-image-extra-3.11.0-26-generic
3.8.0-35 linux-image-extra-3.8.0-35-generic
次に、現在実行中のイメージよりも新しいイメージがアンインストールされないように、リストを並べ替える必要があります。 sort -k1,1 --version-sort -r
は以下を提供します:
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r
3.11.0-26 linux-image-extra-3.11.0-26-generic
3.11.0-26 linux-image-3.11.0-26-generic
3.11.0-26 linux-headers-3.11.0-26-generic
3.11.0-26 linux-headers-3.11.0-26
3.11.0-24 linux-image-extra-3.11.0-24-generic
3.11.0-24 linux-image-3.11.0-24-generic
3.11.0-24 linux-headers-3.11.0-24-generic
3.11.0-24 linux-headers-3.11.0-24
3.11.0-23 linux-image-extra-3.11.0-23-generic
3.11.0-23 linux-image-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23
3.8.0-35 linux-image-extra-3.8.0-35-generic
3.8.0-35 linux-image-3.8.0-35-generic
次に、現在および新しいカーネルファイルsed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
を削除して、次のようにします。
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
3.11.0-23 linux-image-extra-3.11.0-23-generic
3.11.0-23 linux-image-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23
3.8.0-35 linux-image-extra-3.8.0-35-generic
3.8.0-35 linux-image-3.8.0-35-generic
awk '{print $2}'
で追加した最初の列を削除して、必要なものを正確に取得します。
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | awk '{print $2}'
linux-image-extra-3.11.0-23-generic
linux-image-3.11.0-23-generic
linux-headers-3.11.0-23-generic
linux-headers-3.11.0-23
linux-image-extra-3.8.0-35-generic
linux-image-3.8.0-35-generic
これをパッケージマネージャーにフィードして、すべてを自動的に削除し、grubを再構成できます。
最初にドライランを行うことをお勧めします(ただし、スクリプト作成の目的では、大規模な環境がある場合、これは実用的ではない可能性があります)
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | awk '{print $2}' | xargs Sudo apt-get --dry-run remove
すべてがよさそうであれば、実際に削除してください:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | awk '{print $2}' | xargs Sudo apt-get -y purge
繰り返しますが、この「ワンライナー」のポイントは、現在実行中のカーネルよりも古いカーネルのみを削除することです(新しくインストールされたカーネルはまだ利用可能です)
これがどのようにあなたのために働くか、そしてあなたがそれを改善できるかどうかを私に知らせてください!
bikeshed
(apt install bikeshed
)をインストールし、purge-old-kernels
をルートとして呼び出します。
$ Sudo purge-old-kernels
/ lsディレクトリをリストするだけで、「ls」コマンドを使用して、使用しているカーネルのバージョンを確認できます。次に、「Sudo apt-get -y purge "xxx"」を使用します。「xxx」は、削除するバージョン番号に置き換えられます。現在実行しているバージョンではないことに注意してください!!。
簡単な回答、リクエストに応じた説明:
dpkg -l 'linux-image-[0-9]*' |
awk -v current="$(uname -r)" '!/^i/ || $2~current {next} {print $2}' |
sed '$d' |
xargs echo Sudo apt-get autoremove
Sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs Sudo apt-get -y purge
常に動作し、ubuntu 17.10でも動作します
この不必要な複雑さに本当に飽きて、ワンライナーを簡単にするPythonパッケージを作成しました。
ubuntu-old-kernel-cleanup | xargs Sudo apt-get -y purge
でインストール
Sudo pip install git+http://github.com/mrts/ubuntu-old-kernel-cleanup.git
詳細は https://github.com/mrts/ubuntu-old-kernel-cleanup をご覧ください。
これが他の人にも役立つことを願っています。