부팅 메뉴를 정리하기 위해 이전 커널 버전을 어떻게 제거합니까?


701

새 Linux 커널을 설치할 때마다 grub_config에 남겨져 부팅 메뉴가 더 길어집니다.

설치된 패키지를 수동으로 검색하여 제거 할 수 있다는 것을 알고 있습니다.

Ubuntu는 정리 또는 부팅 목록에 표시되지 않는 쉬운 방법을 제공합니까?


10
purge-old-kernels라는 우분투 명령이 작업을 수행합니다. 자세한 내용은 내 답변 을 참조하십시오.
jarno

29
sudo apt-get autoremoveUbuntu 14.04+에서 트릭을 수행해야합니다.
호브

1
오래된 커널의 축적은 버그이며 버그가 수정되었습니다 : bugs.launchpad.net/bugs/1357093 . 수정 사항이 릴리스되면 기본적으로 이전 커널이 자동 제거됩니다.
user535733

1
@hobs 커널이 자동으로 설치되지 않았지만 Software Updater에 의해 커널이 설치되지 않은 경우 명령이 Ubuntu Studio 14.04에서 나에게 속임수를 쓰지 않습니다.
jarno

1
나는이 페이지로 돌아 계속 ... @hobs에 의해 코멘트 만 커널 인 경우에 작동하는 자동 설치 - 당신이 만드는 그러나 sudo apt-get autoremove --purge 답을 다음으로 apt-mark조언 https://help.ubuntu.com/community/RemoveOldKernels을
earcam

답변:


602

16.04 및 최신 버전의 우분투

sudo apt autoremove

이 명령은 종속성을 해결하기 위해 자동으로 설치되었지만 더 이상 의존하지 않는 패키지를 제거합니다. linux-headers-*및 이전 버전이 포함되어 있습니다 linux-image-*. (이 과정에 대해서도 똑똑하여 예비 버전의 커널을 폴백으로 남겨 둡니다!)

우분투 11.10 이상

GRUB2 및 모든 커널 표시

Ubuntu에 설치된 최신 버전의 Grub2 는 자동으로 최신 커널을 표시하고 설치 한 이전 커널을 숨 깁니다.

GNU GRUB

그럽 이 보이지 않으면 Shift부팅하는 동안 누르는 것을 잊지 마십시오 .

보시다시피 최신 커널 만 표시됩니다.

표시된 옵션을 선택하면 (을 누름 Enter) 이전의 모든 커널이 표시되고 부팅 할 수있게됩니다.

GNU GRUB 이전 버전

오래된 커널을 영구적으로 삭제하는 방법

사용 가능한 최신 커널로 먼저 부팅하십시오.

오래된 커널을 삭제하는 방법에는 여러 가지가 있습니다. 개인적으로, 나는 컴퓨터 관리인을 만지지 않을 것 입니다. 이것은 제안으로 컴퓨터를 깨뜨린 것으로 인정되기 때문에.

시냅스

대안은 시냅틱입니다 ( sudo apt install synaptic)

linux-image를 검색 하고 커널을 마우스 오른쪽 버튼으로 클릭하고 완전 제거를 선택한 다음 적용 버튼을 클릭 하여 커널을 삭제하십시오.

시냅틱 패키지 관리자

검색을 반복하지만 이번에는 linux-header에 대해 -이전에 선택한 커널 이미지의 관련 헤더를 삭제할 수 있습니다.

시냅틱 은 제거하려는 대상을 확인하려고 시도하지 않습니다 ... 실제로 최신 커널을 삭제 하거나이 도구를 통해 모든 커널을 삭제하여 부팅 할 수없는 Ubuntu !

어떤 커널을 사용하고 있는지 확인하십시오 :

uname -r

결과는 다음과 유사합니다.

터미널 <uname -r>

결과와 숫자를 기억하십시오-해당 이미지 나 헤더를 삭제하지 마십시오.

추천

내 권장 사항은 최신을 포함하여 적어도 두 개 또는 바람직하게 세 개의 커널을 유지하는 것입니다. 권장 이유는 최신 커널로 부팅 할 수 없거나 무선 연결 끊김과 같은 회귀 된 기능을 도입 할 수없는 최신 커널이있는 경우 부팅 할 다른 커널이 하나 이상 있어야하기 때문입니다.


3
시냅틱을 사용하여 오래된 "linux-image *"패키지를 제거하면 10.04에서도 잘 작동했습니다. (제목이 11.10
이상일

4
라인 -y의 끝에 있는 스위치 apt-get가 필요합니다. 그렇지 않으면 apt-get은 확인을 요청하고 입력은 파이프이므로 중단됩니다. 그래서 그것은 끝나야한다 :| xargs sudo apt-get purge -y
Josh

37
내 컴퓨터에서 약 20 개의 이전 버전 linux-imagelinux-headers4.5GB의 여유 공간을 제거 합니다.
Andrew Mao

16
이 방법은 잘 작동하지만 모든 커널을 삭제하면 grub.cfg가 과도하게 재생되며 시간이 걸립니다. 일괄 삭제를 위해 이것을 비활성화하고 한 번 재생성하는 방법이 있습니까?
spacediver

15
나는 @spacediver의 질문을 두 번째로-이것은 불필요한 커널 38 개가있을 때 미친 속도가 느린 프로세스입니다. 각 커널이 제거 될 때마다 새로운 grub.cfg를 생성하면서 나머지 모든 커널을 통과하기 때문입니다. 이것이 우리가 N ^ 2 연산이라고 부르는 것입니다. 커널은 (38 ^ 2 / 2) = 722 번 정도 커널을 처리하며 매우 느립니다. 확실히 우분투는 더 나은 것을 내놓을 수있다 ....
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 업그레이드를 수행 했습니까?)
Ricket

4
linux-signed-imageUEFI 시스템에 설치 될 수 있는 패키지 를 제거 할 수도 있습니다 : sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic12, 14 및 24를 제거합니다
devius

1
@jarno 서명 된 커널을 사용하고 있는지는 모르지만 시스템에 문자열 uname -r이 없습니다 signed. 서명 된 이미지가 설치되어 있고 해당 ls명령 의 출력 은 다음과 같습니다 /boot/vmlinuz-3.19.0-16-generic.efi.signed.
devius

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 설치된 리눅스 이미지를 찾습니다
  • awk '{ print $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) 과 일치 할 때 stop이라고합니다 - /서라운드 정규 표현식
  • p 인쇄
  • ;명령 separtor입니다, 그래서 /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


이미지와 헤더를 제거하는 올인원 버전 (위의 두 버전을 결합) :

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와 일치합니다 (또는 다른 방법으로). 현재 커널 버전을 정규 표현식으로 일치시키는 것은 약간 위험합니다. 내 답변 도 참조하십시오 .
jarno 1

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)답변 도 참조하십시오 .
jarno

1
매우 큰 저를 도와 @jarno는 확장 ... 명예를 당신의 하나 라이너
Clain Dsilva에게

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
Sebastian Sastre

3
이 작업을 수행하지 마십시오! "그 일 라이너는 약간 위험 해 보이지만 확실히 220 명의 지지자들이 틀릴 수는 없습니다!" 나는 나 자신에게 생각하고 맹목적으로 복사하여 붙여 넣었다. GRUB으로 바로 재부팅했습니다. 이 명령은 내가 사용했던 커널을 포함하여 모든 커널을 지 웠습니다. 어쩌면 나는 실시간 커널을 실행 중일 수도 있습니다. 현재 :( 우분투 라이브 CD를 설치하려면 USB 스틱 내 집 주위를 찾고
안드레아스 얀손

60

우분투 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

우분투 15.10 이하 :

나는 이것이 가장 쉽고 빠른 방법이라고 생각합니다. 최신 커널과 두 가지를 더 유지합니다.

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

유지되는 추가 커널 수를 변경하려면 다음을 수행하십시오.

sudo purge-old-kernels --keep 3

1
이 명령은 쉘 스크립트이며 위치는에서 찾을 수 있습니다 which purge-old-kernels.
jarno

그들이 16.04에서 이것을 훨씬 쉽게 만들어서 다행입니다! 이 답변이 계속 발전하기를 바랍니다 ...
Toby J

우분투 16.04에서는 purge-old-kernels자전거 타기 ( 영구적 인 집이없는 임의의 유용한 도구 ) 패키지 또는 특정 패키지 가 없습니다.apt-get -y 옵션을 사용 하지 않는 것은 눈을 감고 모든 것이 잘되기를 바라고 있습니다. 또한 autoremove 가 유지할 커널 수를 결정하는 방법 도 있습니다 .
Pablo A

2
16.04에서는 퍼지-오래된 커널이 byobu 패키지에 의해 제공됩니다 (힌트 :) apt-file search purge-old-kernels. 에 동의하면 apt-get -y제거하겠습니다.
bmaupin

1
@Lan 비 LTS 버전을 사용하지 않았으므로 언제 시작했는지 확실하지 않았습니다. 그러나 sudo apt-get autoremove14.04에서 커널이 제거되지 않는다고 확신 할 수 있습니다 . 답을 알고 있다면 특정 버전으로 답변을 업데이트하십시오!
bmaupin

43

Grub에서 항목 제거 2 /etc/grub.d 폴더의 파일을 편집하거나 제거하여 항목을 제거해야합니다. /boot/grub/grub.cfg 파일은 읽기 전용이므로 일반적으로 편집 할 필요가 없습니다.

너무 많은 커널?

  • 현재 사용중인 커널을 잘 모르면 터미널에서 uname -r을 입력하십시오 .

  • APT를 통해 제거 된 커널 (Synaptic, "apt-get remove"등)은 grub.cfg를 자동으로 업데이트하므로 사용자 조치가 필요하지 않습니다.

  • 커널 (및 메뉴 항목)을 제거하기위한 훌륭한 도구는 안전하고 사용하기 쉬운 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 메뉴에 새 항목이 추가됩니다. 원하는 경우 이전 항목을 제거 할 수 있습니다. 문제 해결을 위해 이전 커널 버전을 부팅해야합니다.

커널 항목을 제거하는 다른 방법 (10.04 이전)

GRUB2가 아닌 GRUB 용

스타트 업 매니저 시작 관리자 설치

시스템 >> 관리 >>에서 찾을 수 있습니다 대체 텍스트
대체 텍스트
. 두 번째 스크린 샷에서 표시 할 커널 수를 선택할 수 있습니까? 나는 일반적으로 1로 유지하지만 커널 업그레이드를 받으면 다시 시작하기 전에 항상 2로 변경하여 새 커널에 내 하드웨어에 문제가있는 경우 이전 커널을 선택할 수 있습니다. 새 커널이 제대로 작동하는 것을 알고 나면 다시 1로 변경합니다.


2
사실, startupmanager dint는 Ubuntu 10.04에서 이와 같은 창을 제공합니다. 대신 두 가지 탭-> 부팅 옵션 및 고급.이있는 창을 제공했으며 고급에서는 dint에 커널 수를 제한하는 옵션이 있습니다. . 그래서 우분투 10.04에 대한 답을 갱신 (그리고 난이를 다운 선정 이유를 먹으 렴 ..)하시기 바랍니다

GUI가 설치되지 않은 시스템 (서버)에서 "보존 할 커널 수"를 어떻게 정의 할 수 있습니까?
sylvainulg

startupmanager가 오래되었습니다.
muhasturk를

39

순전히 커맨드 라인, 이것은 현재 및 두 번째로 가장 많은 전류를 제외한 모든 것을 제거합니다 (아래 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
드미트리 Verkhoturov

@DmitryPaskal, 이것을 새로운 답변으로 추가해야합니다.
saji89

10
@DmitryPaskal 항상 그렇듯이 이해하지 않고 복사하여 붙여 넣지 마십시오. 내 컴퓨터 에서이 하나의 라이너도 linux-libc-dev:amd64제거하면 안되는 것과 일치 합니다.
jamesadney

1
@ Kies Cook, awk 인수는 작은 따옴표로 묶어서는 안됩니까? 파이프 라인 앞에 "linux-image-"를 추가하려는 의도라면을 사용하는 경우에만 작동하는 것 같습니다 awk '{print "linux-image-" $0}'.
Mark

이 기능은 작동하지 않습니다. 여기에는 사용자 정의 설치 커널 (Ubuntu 14.04 with 3.17)이 포함되어 있습니다
Alex R

35

업데이트 : purge-old-kernels되어 사용되지 않는 요즘.

까다로운 조건에서도 커널을 제거하는 스크립트를 만들었습니다. 그것은 호출 linux-purge되며 여기에서 찾을 수 있습니다 .

현재 사용중인 커널보다 오래된 커널 (및 관련 패키지)을 제거하려는 경우 시스템이 손상되지 않은 경우이 스크립트를 사용할 수 있습니다 .

여기에 오래된 커널을 제거하는 데 기여한 Ubuntu 문서 페이지도 있습니다 .


처럼 보이는 purge-old-kernelsbikeshed의 정확한 버전 (1.22)에 있지 않습니다. 정확한 최신 자전거를 생산할 수있는 합리적이고 안전한 방법이 있습니까? 아니면 그냥 스크립트를 설치하는 것이 더 간단합니까? 긴 의존성 목록에도 불구하고 repo를 사용하고 싶습니다 ..
drevicko

1
@drevicko 여기를 참조 하십시오 .
jarno

1
@drevicko, sure,dlocate -lsbin bikeshed
jarno

1

1
@ChrisW 네 있습니다. 방금 스크립트를 약간 개선 했으므로 최신 버전을 사용하는 것이 가장 좋습니다.
jarno

29

당신은 따를 수 있습니다 은 "무인 업그레이드"패키지 섹션 사용자동 보안 업데이트 이 작업을 수행하기 위해 우분투 위키에 기사를.

/etc/apt/apt.conf.d/50unttended-upgrades 파일 에서 다음 줄을 변경해야 합니다.

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

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

커널을 포함한 이전 패키지를 자동으로 제거합니다.

또한 줄을 제거하거나 주석 처리하십시오.

"^linux-image.*"; 

/etc/apt/apt.conf.d/01autoremove 파일의 "NeverAutoRemove"섹션에 있습니다.


2
나는 이것을했지만 여전히 100 MB를 소비하는 3 + 오래된 커널을 수집하고있었습니다. 그래서 apt-get autoremove항상 내장 업데이트 관리자를 거치지 않기 때문에 실제로 업그레이드를 수행하는 일일 cron 작업에 추가 했습니다.
Marcos

이것이 자동으로 설치된 커널에 대해서만 Trusty에서 작동한다고 생각합니다.
jarno

예를 들어 무인 업그레이드와 같이 패키지를 자동 업그레이드 할 때 이전 커널이 빌드되지 않도록하는 것이 좋습니다. 그러나 재부팅하지 않으면 현재 실행중인 커널에 대한 패키지 가 제거 된 것입니다! 한 가지 문제가 발생할 수 있습니다. 플러그인하는 새 장치는 더 이상 디스크에 없기 때문에 해당 장치에 대한 모듈을 핫로드 할 수 없기 때문에 작동하지 않을 수 있습니다. (이것에 대한 빠른 수정은 커널 패키지를 다시 설치 한 다음 장치를 분리했다가 다시 연결하는 것입니다.)
joeytwiddle

위에서 언급 한 문제에 대한 자동화 된 솔루션 을 만들었습니다 . 이것이 좋은 접근 방식이라고 생각하면 Qwerty의 답변에 자유롭게 추가하십시오.
joeytwiddle

27

이미 우분투와 함께 제공되는 가장 빠르고 간단한 방법 (적어도 12.04 이후 적용 가능)은 apt-get입니다. 사용하지 않는 모든 이전 커널 버전을 제거하려면 다음을 수행하십시오 (사용하지 않는 이전 커널 버전 제외). 현재 커널 버전이 어떤 방식 으로든 실패한 경우 진행할 수있는 방법이 있습니다. 이전 상태로 돌아 가기). 다음을 수행하십시오.

sudo apt-get autoclean

이렇게하면 커널 파일을 포함하여 이전 파일이 제거됩니다. 이전 버전이 많은 경우 커널 버전을 제거해도 문제가 없는지 확인하는 데 시간이 오래 걸립니다. 저에게는 마지막 12 개의 커널 버전을 제거하는 데 약 2 분이 걸렸습니다. 다음을 수행 할 수도 있습니다.

sudo apt-get clean

apt의 캐시 폴더에 다운로드하여 저장된 모든 것을 제거합니다. 마지막으로 당신은 :

sudo apt-get autoremove

사용하지 않는 패키지가 있는지 확인하고 필요한 경우 제거합니다. 이것은 더 이상 설치된 앱에 필요하지 않은 라이브러리 및 종속성 패키지에 유용합니다.


1
14.04에서와 같이 이것이 최신 릴리스에서 변경되었다고 가정하면 패키지 캐시를 정리하고 설치된 패키지 또는 grub에 영향을 미치지 않습니다.
jarno

2
sudo apt-get autoremove14.04에서 이전 (두 개 이상의 버전 이전) 커널을 제거 한다는 것을 확인할 수 있습니다 . 커널 업그레이드 전후에 커널을 실행해야 할 수도 있습니다. 업그레이드하기 전에 실행했을 때 이전 커널의 일반 버전 만 제거했습니다. 그런 다음 커널을 업그레이드 한 후 이전 커널의 저 지연 버전도 제거했습니다.
tekNorah

나는 sudo apt-get autoclean명령을 의미했다 . @tekNorah 나는 몇 가지 오래된 커널을 설치 한 후 sudo apt-get autoremoveUbuntu Studio 14.04에서 실행 했습니다. 커널을 제거하지 않았습니다. 지연 시간이 짧은 커널 만 설치했습니다. 왜 -generic 및 -lowlatency 커널이 모두 설치되어 있습니까?
jarno

5
예, 이것은 저에게 아름답게 작동하고 모든 오래된 커널을 올바르게 정리했으며 미친 한 줄짜리 스크립트에 의존하지 않습니다! 추천합니다. 이것을 두 번 이상 공표 할 수 있기를 바랍니다!
Jeff Atwood

1
@JeffAtwood는 안전한 커널을 더 많이 제거 할 수 있습니다. 버그 리포트
jarno

25

10.04 GUI 방법

컴퓨터 관리인은 오래된 커널을 정리할 수 있으며 기본적으로 우분투 (구분 투는 아님)에 설치되어 있다고 생각합니다.

GRUB 1 /boot/grub/menu.lst을 사용하는 경우 최대 커널 수를 지정하는 옵션이 있습니다. 내가 알 수있는 한 GRUB 2는 그렇지 않습니다.


4
컴퓨터 관리인은 사용해서는 안됩니다 -버그가 많으며 이제 natty / oneiric / precise의 기본 응용 프로그램으로 삭제되었습니다.
fossfreedom

2
그보다는 자체 "컴퓨터 관리인"(이전의 우분투 버전에서 일시적으로 사용 가능한 "컴퓨터 관리인"과 혼동하지 말 것)이있는 다른 답변 (자신의 ppa)에 설명 된대로 "Ubuntu Tweak"을 설치하십시오.
마이클

25

어떤 커널과 헤더가 설치되어 있는지 알아 내려면

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

그런 다음 하나씩 또는 함께 제거 할 수 있으며 가장 최신 상태로 유지하십시오.

제거를 자동화하는 편리한 명령과 스크립트도 있습니다.

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 커널을 사용하는 경우) 유지하려는 패키지를 제거 할 수도 있습니다.
jarno

의견 감사합니다. 이 스크립트는 완벽하지는 않지만 주로 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-imageupper 명령으로 표시된 버전을 제외한 이전 버전을 검색 하고 제거하십시오. 일반적으로 최신 버전을 선호합니다.

이제 다시 시작하면 더 깨끗한 그럽 메뉴가 나타납니다.


이것은 아마도 Computer Janitor없이 설치 한 사용자에게 가장 기본적인 방법 일 것입니다.
Broam

1
Ubuntu 11.04부터 grub 메뉴에는 기본적으로 현재 커널 만 표시되며 이전 커널은 'Previous kernels'메뉴에 숨겨져 있습니다. 이 방법은 여전히 ​​오래된 방법을 청소하는 데 효과적입니다.
Andy

14

ubuntu-tweak을 설치 한 다음 Applications-> System tool-> ubuntu tweak로 이동하여

여기에 이미지 설명을 입력하십시오패키지 클리너를 클릭하고 커널을 정리하십시오. 현재 사용중인 커널을 표시하지 않으므로 항상 안전합니다.


8

개인적으로 나는을 사용하는 것을 좋아 Synaptic합니다. 진행 상황에 대해 더 안전하다고 느끼게합니다. 오래된 커널을 제거하는 옵션이있는 유일한 앱은 Ubuntu Tweak 입니다.

사용하지 않는 커널을 제거하는 방법 :

  • 오픈 우분투
  • 왼쪽 창의 '응용 프로그램'에서 '패키지 클리너'를 클릭하십시오.
  • '세척보기'오른쪽에서 '청정 커널'을 누릅니다.
  • 모든 커널을 선택하십시오-사용중인 커널이 나열되어 있지 않지만 uname -a터미널에서 검사가 실행 되는 경우를 대비하여 생각하십시오

Synaptic에서는 모든 커널을 포함하는 'Components'-> 'Kernel and modules'을 필터링 할 수 있습니다. 그리고 첫 번째 열 'S'(상태)로 정렬하면 설치된 모든 커널이 맨 위에 나타납니다. 실제로 update-grub조언합니다.
danger89

6

linux-image-...Synaptic을 사용하여 이전 커널 ( 패키지)을 제거하면 부팅 메뉴에서 제거됩니다. 실행중인 커널을 제거하지 않도록주의하십시오 (로 버전을 확인할 수 있음 uname -r).

하나 또는 두 개의 이전 버전을 사용하면 문제가 발생할 경우 문제를 해결하는 데 도움이 될 수 있습니다.

또는 항목을 수동으로 편집 / 제거 할 수 gksu gedit /boot/grub/grub.cfg있지만 ( ) 새로운 커널로 업데이트 하면 항목 이 다시 생성됩니다. recovery mode옵션을 제거 할 생각이라면 하지 마십시오. 부팅을 방해하는 무언가를 깰 경우 편리합니다.


을 참조하십시오 이 페이지.


Grub2는 새로운 커널이 설치 될 때마다 grub 항목을 빌드합니다. 이것으로 update-grub모든 커널을 다시 작성합니다.
Marco Ceppi

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))

또는 마지막 두 버전을 제외한 설치된 모든 커널 버전의 목록을 생성하십시오.

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 명령 줄을 결합하고 최적화하려는 여러분의 노력에 감사드립니다. 가독성과 단순성을 선호하기 때문에 명령 줄을 제거했습니다. 나는 가독성과 단순성에 대한 내 명령을 일부러 조정했다. 적어도 내 뇌에는 읽기 쉽고 간단합니다. 명령 줄을 의견이나 답변으로 게시하십시오.
lesmana

1
이것은 두 가지 목표를 결합합니다. 마지막 두 커널을 유지하고 커널을 현재 커널보다 최신으로 유지하십시오 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정규 표현식을 처리 할 수는. 점을 이스케이프하고 정규식에 접두사와 접미사를 추가하는 방법에 유의하십시오. 내 대답에 스크립트를 사용하면 현재 커널보다 오래된 커널을 유지할 수도 있습니다.
jarno

4

이 답변의 장점은 타사 응용 프로그램을 설치하지 않고 네이티브 Ubuntu Bash가 사용된다는 것입니다. 사용하지 않은 사용자 정의 커널의 사용자 apt또는 dpkg자신의 필요에 따라이 bash는 스크립트를 변경할 수 있습니다. 이 답변은 ( 오래된 커널을 한 번에 선택적으로 제거하는 방법)을 기반으로 합니다.

Zenity 기반 솔루션

Zenity는 터미널에 멋진 GUI 인터페이스를 제공하여 목록을 처리하고 라디오 버튼으로 항목을 선택 합니다 .

rm- 커널 1

제목에서 알 수 있듯이 부팅 한 현재 커널을 제거 할 수 없으며 목록에 포함되지 않습니다. 보고 된 크기는 /boot디렉토리에 얼마나 저장 될 것인가 입니다. 커널 바이너리는 다른 영역에도 있기 때문에 디스크에 더 많은 것이 저장됩니다. 2017 년 7 월 27 일 참고 : 디렉토리 /usr/src/*kernel_version*/lib/modules/*kernel_version*이제 포함됩니다.

수정 한 날짜는 사용하여 발견 stat명령을 사용합니다. 내 시스템 에서이 날짜를 사용하여 커널을 부팅 할 때마다 해당 날짜가 "만져집니다" ( 특정 커널 버전이 마지막으로 부팅 된 시간을 어떻게 알 수 있습니까? ) cron reboot 스크립트. 그러나 시스템에서 날짜는 마지막으로 부팅 한 날짜가 아니라 커널 릴리스 날짜입니다.

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 Desktop 설치에 있지만 Ubuntu Server에는 없습니다.

샘플 화면

rm- 커널 서버 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*총 50MB 인 5 개 파일 에서 가져 왔습니다 . /usr/src/*kernel_version*및에 파일을 포함하도록 수식이 변경되었습니다 /lib/modules/*kernel_version*. 각 커널의 계산 크기는 이제 ~ 400MB입니다. 에 대한 위의 코드 rm-kernels와이 rm-kernels-server업데이트되었습니다. 그러나 위의 샘플 화면에는 이러한 변경 내용이 아직 반영되지 않았습니다.

기본값은 du파일이 캐시에 있지 않으면 고통스럽게 느려질 수 있으므로 Linux 헤더의 파일 크기는 125MB, linux-image는 220MB 입니다. 사용하여 실제 크기를 얻으려면 du스크립트에 매개 변수를 전달하십시오.

제거 할 수없는 현재 실행중인 버전을 제외한 모든 커널 크기의 총계가 제목 표시 줄에 표시됩니다.

대화 상자는 각 커널의 마지막 액세스 날짜 를 표시하는 데 사용됩니다 . 이 날짜는 백업 또는 유사한 작업 중에 모든 커널에 대해 대량으로 덮어 쓸 수 있습니다. 대화 상자에 수정 날짜가 대신 표시 됩니다.


2

더 이상 사용되지 않는 패키지, 더 이상 패키지 목록에없는 패키지 및 더 이상 사용되지 않는 커널을 제거하는 쉬운 방법은 다음 중 하나를 수행하는 것입니다.

dpkg --purge $(aptitude search ?obsolete)

그러나 다른 패키지에서 여전히 권장하는 패키지가 누락되며 -R /-with-recommends 인수로이 문제를 해결할 수 없습니다.

정렬 모드를 'o'로 전환 한 후 dselect는 적성 누락을 포함하여 더 이상 사용되지 않는 패키지를 표시하지만 일부 사람들은 사용을 좋아하지 않습니다.


주어진 명령은 오래된 커널을 제거하거나 경험상 grub 메뉴에 영향을 미치지 않습니다.
jarno

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

@jarno : 어떻게 교체에 대한 grep -Po "^linux-image-[^-]+-[^-]+-generic\b"grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"grep -Po ".*(?=-[a-z]*$)"grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"grep -Po "[0-9].*(?=-[a-z]*)"grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi

@Sadi, wel, l 지연 시간이 적은 커널도 찾지 못했습니다.
jarno

1
감사. 다른 방법으로는 효과가 없었습니다. 너의 일을했다.
Philippe Delteil

1

ailurus 는 사용하지 않는 구성뿐만 아니라 오래된 커널을 제거하는 기능이 있습니다. 나는 시냅틱에서 직접 수동으로 제거합니다. getdebppa 에서 ailurus 를 설치할 수 있습니다


"Ailurus는 설치된 소프트웨어의 이름 목록을 백업하기위한 도구입니다. ... 과거 Ailurus에는 많은 기능이 있습니다. 이제는 하나의 기능 만 있습니다. 실제로 유용한 기능 하나가 수십 가지 덜 유용한 기능보다 낫다고 생각하기 때문입니다."
jarno

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 개를 설치하고 분명히 '실행중인'커널을 남겨 두십시오.

메인 커널, 심지어 RC 커널, 은신처 릴리스 만 보이도록 ukuu를 설정할 수 있습니다.

우 쿠우

시냅틱에서 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질문없이 제거 하는 데 사용 )


이것이 다운 보트 된 이유는 무엇입니까? 누군가에게 효과가 없었습니까? 복사 / 붙여 넣기시 붙여 넣을 때 긴 줄을 감싸지 않아야합니다. 나는 그것이 작동하는 데 아무런 문제가 없었습니다.
Mark

내 컴퓨터의 최신 커널 릴리스는 3.13.0-43-low-latency입니다. 이 스크립트는 linux-headers-3.13.0-43-lowlatency를 제거합니다.
jarno

@jarno 어떻게 결정 했습니까? 실제로 아무 것도하지 않고 시도하려면 apt-get 명령에 "-s"플래그를 추가하십시오 (또는 | xargs sudo apt-get -y purge완전히 제거하십시오 ). 지연 시간이 3.13.0-43으로 인쇄되면 시스템에 설치된 것보다 최신 버전이있을 수 있습니다.
Mark

나는 시뮬레이션을 시도했다. 아니요, 그러나 이전 커널 버전을 제거했지만 제거하지 않았으며 해당 헤더 패키지를 제거했습니다.
jarno

어쨌든, 나는 Sankalp의 대답에 대한 아이디어를 기반으로 스크립트를 개발했습니다.
jarno

0

리눅스에 전문가가 아니기 때문에 내가 한 일에 대한 대략적인 개요는 다음과 같습니다.

gedit /boot/grub/grub.cfg

보관하려는 항목을 찾으면 강조 표시하고 복사합니다.

cd /etc/grub.d
ls

10_linux 및 30_os-prober와 같은 파일 목록이 표시됩니다

sudo chmod -x 10_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.cfg 파일을 변경하는 grub을 업데이트합니다 :

sudo update-grub

이제 커널이나 OS를 업데이트하면 부팅 메뉴가 업데이트되지 않을 것입니다. 수동으로해야합니다. 그러나이 절차를 수행하면 커널 버전을 제거하고 우분투 이름 (예 : 우분투 루시드 10.04 등)을 넣는 것과 같이 부팅 메뉴를 조금 더 사용자 정의 할 수 있습니다.

누군가 알아내는 데 시간이 걸렸으므로 도움이되기를 바랍니다 ... 어디에서 나이 솔루션을 보지 못했습니다 ...


3
이 답변은 과잉 인 것 같습니다. 오래된 커널 만 제거하는 것이 좋습니다.
Scott Severance

복구 상황에서 여분의 커널이 유용 할 수 있다는 것을 읽었습니다. 또한 부팅 항목의 텍스트를 편집하는 간단한 방법입니다. 따라서 "우분투, Linux 커널 xxxx-yy --text1 -text2 -t3 -t4 --t5 등"(--text 항목은 이해할 수없는 일부 옵션 / 매개 변수를 나타냄) 등을 말할 수 있습니다. 제거 할 수없는 "{"괄호가 있지만 "Ubuntu xx.yy"로 전달됩니다.
Joe

1
최신 커널이 제대로 작동하는지 확인할 때까지 바로 이전 커널을 유지합니다. 작동해도 작동을 멈추지 않습니다. 따라서 가장 최근의 커널을 확인한 후 (1 주일 정도 지나면) 이전 커널을 유지할 이유가 없습니다. 그래도 작동하지 않으면 알려진 최신 커널이 있습니다. 사실, 현재 커널의 showtopper 버그로 인해 현재 이전 커널을 실행하고 있습니다. 그러나 그것은 나의 전반적인 정책을 바꾸지 않습니다. 알려진 좋은 커널은 하나만 필요합니다.
Scott Severance 5

0

시냅틱 패키지 관리자를 설치하고 필터 탭으로 내려가 (필터를 모두 시도하지 않으면 필터라고 생각) 5 "로컬"을 선택하십시오. 그러면 커널과 같은 시스템에서 분리 된 패키지가 표시됩니다. 제거한 후을 실행하십시오 update-grub. 이 명령은 grub의 부팅 옵션 목록을 업데이트합니다.

이것이 실패하면, 당신은 항상 시도 할 수 있습니다 apt-get remove linux-image-version-generic.


Synaptic에서는 모든 커널을 포함하는 'Components'-> 'Kernel and modules'을 필터링 할 수 있습니다. 그리고 첫 번째 열 '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
#은 각 줄에 하나씩 버전 번호를 제공합니다.
# 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}"
끝난

$ 명령

샘플 사용법 :

# ./keep-n-kernels.sh 4 # apt-get 명령을 실행하여 가장 최근의 4 개의 커널을 제외한 모든 커널을 제거하십시오

[및 자신의 위험에] 원하는 경우 apt-get 명령에 -y (또는 force 플래그)를 추가하고 비 대화식으로 만들 수 있습니다.


./keep-n-kernels.sh 0을 실행하면 모든 커널이 제거됩니다. 접미사 문자열 감지가 작동하지 않습니다. suffix = $ (uname -r | sed -r 's / ^ [0-9.] * (-[0-9.] +) * //') 또는 suffix = $ (uname -r | egrep- -only-matching- '-[[: alpha :]-] + $') 할 것입니다.
jarno

그러나 나는 그 아이디어가 훌륭하다고 생각합니다. 나는 스크립트를 개선하기 위해 노력해 왔으며 아마도 충분히 준비되었다고 생각되면 여기에 게시 할 것입니다.
jarno

@jarno 공유하십시오. 이 아이디어가 유용하다는 것을 알게되어 기쁘다.
Sankalp

좋아, 거기있다 : link
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.