오래된 커널을 안전하게 제거하는 명령입니까?


21

우분투 기사를 인터넷에서 탐색하는 동안이 명령을 보았습니다.

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

저자는 이것이 한 줄 명령으로 , 이전의 모든 Linux 버전을 삭제하고 현재 버전 만 남겨 둔다고 말했다 .

실제로 그러한 명령을 찾고 있지만 이것이 얼마나 안전한지 잘 모르겠습니다. 알고 싶습니다 :

  • 이 명령을 실행해도 안전한지 여부
  • 이 명령은 어떻게 작동합니까? 즉 큰 명령의 작은 부분에 대한 설명
  • 이 명령이 다른 목적으로 사용된다면 저자가 주장하는 바를 달성하기위한 올바른 명령은 무엇입니까?

나는 혼자서 모든 것을 추론하려고 할 때 매우 혼란스럽고 좌절합니다. 포함 된이 명령의 작업을 수행하는 방법 많은 /, |, \, *, 그리고 ^구글에 어려운 문자.

내가 찾고 있어요 단계 번역 및 설명에 의해 단계 나 인터넷을 통해 찾을 수 없습니다이 명령!


1
이것은 당신이 인용 한 것과 같은 명령으로 보이지는 않지만 tuxtweaks.com/2010/10/… 의 명령을 사용하여 문제없이 오래된 커널을 제거했습니다. 이 페이지는 명령의 기능에 대해서도 설명합니다.
user68186

4
@UriHerrera apt-get autoremove는 이전 커널을 제거하지 않아도됩니다. 삭제하지 않으면 /boot공간이 부족하고 업데이트가 실패 할 때까지 쌓 입니다. 이 작업을 수행해야한다는 것에 대한 참조가 있습니까?
gertvdijk

1
커널에 대한 새로운 업데이트가있을 때마다 다음 패키지 등이 더 이상 필요하지 않으며 이전의 커널을 나열합니다.
Uri Herrera

내 답변은 중재자에 의해 삭제되었으므로 여기에 의견을 보내 주십시오. 스크립트에 대한 설명은 이 기사 를 참조하십시오 . 왜 스크립트의 한 부분 s/^[^ ]* [^ ]* \([^ ]*\).*/\1/이 간단 하지 않은지 모르겠습니다 s/^[^ ]* \([^ ]*\).*/\1/. 스크립트는 매우 강력하거나 우아하지 않습니다. 예를 들어 출력에서 ​​패키지 이름을 추출하기 전에 현재 커널을 확인하는 이유는 무엇입니까? 대안으로, sudo apt-get autoremove --purgeXubuntu 15.10과 같은 최신 Ubuntu 릴리스에서 대부분의 오래된 커널을 제거합니다.
jarno

답변:


27

나는 말할 것입니다 : 현재 형태로 사용하지 마십시오

  1. 묻지 않고 변경합니다. 이 apt-get -y purge부품을 사용하면 원 라이너가 확인없이 패키지 제거를 시작할 수 있습니다. 스크립트에 오류가 있으면 문제가 생길 수 있습니다 .

  2. 출처도없고 저자도 없습니다. 그것의 근원은 여기서 차이를 만듭니다. 철저히 테스트 된 시스템 패키지에서 나온 경우 테스트를 추적 할 수 있습니다. 임의의 출처에서 신뢰할 수 없습니다.

  3. dpkg -l없이 잘 실행됩니다 sudo. 원저자가 왜 이것이 필요하다고 생각하는지 모르겠습니다.

상식을 사용하십시오

유해한 부분을 치우고 뿌리로 나오는 것을 제거하십시오.

예를 들어 다음과 같이 잘라내십시오.

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

이는 단지 출력 만 물건 및 실행 일반 사용자 권한으로 . 이러한 커널을 제거하는 데 동의하면 자신 을 추가 할 수 있습니다 | xargs sudo apt-get purge. 그것은없이의 -y당신이 당신의 시스템으로 만들기에 대한 변경 사항에 대한 확인을 묻는 메시지가 표시됩니다, 그래서 의도적으로, 옵션을 선택합니다.

설명

  • dpkg -l모든 패키지 목록을 출력합니다. 이 경우 이름으로 시작 하는 패키지 만 나열합니다 linux-.
  • |(파이프)는 왼쪽의 명령 출력을 (오른쪽이라고 함) 파이프를 stdout오른쪽의 명령 입력에 (오른쪽 이라고 함) 파이프합니다 stdin.
  • sed정규 표현식을 사용하여 문자열을 조작하는 도구 입니다. 이 경우 파이프 왼쪽에있는 명령의 출력을 조작하고 설치된 패키지를 필터링합니다 (에 ii지정된대로 dpkg). 이 경우에도 중첩됩니다. sed복잡한 정규 표현식으로 사용이 매우 복잡하므로 여기 에서 전체 사용법을 설명하기가 너무 어려울 수 있습니다 . ( \(.*\)-\([^0-9]\+\)"정규 표현식의 예입니다.
  • 정규 표현식표현 하는 표현을 기반으로 일치 항목을 찾는 데 매우 널리 사용됩니다. \1는 일종의 범용 검색 및 교체를 수행하기위한 대체 참조입니다 (로 첫 번째 'hit'참조 1). 정규 표현식 자체는 해를 끼칠 수 없습니다. 그러나 입력을 잘못 조작하면 잘못된 패키지를 제거하거나 쉘 주입을 수행 할 수 있습니다. 이 경우에는에서 제공하는 버전을 기반으로 커널 패키지의 이름을 찾는 방법처럼 보입니다 uname -r.
  • uname -r 실행중인 커널의 현재 버전을 출력합니다.
  • xargs파이프의 왼쪽 입력 행을 명령의 인수로 추가합니다. 이 경우 각 줄의 커널 버전은 수평으로 구분 된 목록으로 변환되어 sudo apt-get명령에 추가됩니다 .
  • sudo apt-get -y purge [packagename] 주어진 패키지의 인수를 제거합니다 (모든 것을 제거합니다).

대안

아마도 이것에 대해 아마도 약간의 질문이있을 것입니다. 내가 지금까지 찾은 관련 것들 :


1
이 명령의 무서운 노드의 해체는 다음과 같습니다. /(.*)-([^0-9]\+)/\1/")"'/d;s/^[^ ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan

이 답변에서 위의 명령이 이전 커널을 정상적으로 지울 수 있습니까 ?? 또는 여전히 apt-get autoremove가 더 낫습니다 ??
Bhavesh Diwan

4
@ Z9iT 정규 표현식입니다. 그것들은 그들이 나타내는 표현에 기초하여 일치를 찾는 데 사용되며 \1일종의 보편적 인 검색 및 교체를 수행하는 대체 컨트롤입니다. 패키지를 제거하려면 내 대답 (명백)에서 명확하게 표현했습니다. 상식을 사용하십시오. 스크립트가 시스템을 자동으로 변경하게하지 마십시오. 그것이 무엇을하는지 확인하십시오. 항상.
gertvdijk

대안으로 제공하는 기능은 해당 Linux 헤더 패키지를 제거하지 않습니다.
jarno

그런 다음 apt-get 자동 제거를 수행하면 해당 헤더가 더 이상 필요하지 않습니다.
ben-Nabiy Derush

7

단계별 설명을 요청하면 다음과 같습니다.

sudo dpkg -l 'linux-*'

linux-패키지 이름으로 시작하는 패키지를 나열합니다.

| sed

목록을 파이프 sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

매우 복잡한 정규식을 사용하여 목록을 편집합니다.

| xargs

새 목록을에 파이프하여 xargs인수로 보냅니다.

sudo apt-get -y purge

마음을 바꿀 기회를주지 않으면 서 패키지를 제거합니다.

또는 해당 목록을 제거 명령으로 보내서 그대로 두겠다고 말하는 것이 더 정확할 수도 있습니다. 어떤 것이 퍼지되는지, 그리고 중요한 것은 정확히 무엇을 퍼지하는지는 이전 명령의 출력에 달려 있습니다.

안전 해요? 이 경우 게시물의 작성자가 정규 표현식과 sed구문 을 얼마나 잘 이해하는지에 따라 달라집니다 . 그리고이 두 가지 주제에 관한 책이 많이 있습니다.


6

나는 명령을 해부하고 man각 페이지를 읽으면서 시작했습니다 .

  • dpkg -l: list pacakges 따라서 dpkg -l linux-*시작된 모든 패키지 linux-(보통 커널)를 나열합니다 .

  • sed:의 출력은 디코딩 하는 몇 가지 정규 표현식으로 dpkg -l linux-*파이프됩니다 .sedsed

  • uname -r uname시스템 정보를 인쇄합니다

uname-시스템 정보 인쇄

-r핸들은 커널 릴리스를 구체적으로 인쇄합니다.

-r, --kernel-release 커널 릴리스를 인쇄

uname -r그런 다음 의 출력은 sed보다 정규 표현식으로 파이프되고 출력은xargs

따라서 출력을 패키지 이름으로 xargs변환하고 모든 프롬프트에 자동으로 'yes'로 응답 하는 sed결과를 전달합니다 sudo apt-get purge -y.

-y, --yes, --assume-yes 프롬프트에서 자동 예; "yes"를 모든 프롬프트에 대한 응답으로 가정하고 비 대화식으로 실행하십시오. 보류 된 패키지 변경, 인증되지 않은 패키지 설치 또는 필수 패키지 제거와 같은 바람직하지 않은 상황이 발생하면 apt-get이 중단됩니다. 구성 항목 : APT :: Get :: Assume-Yes.

이 명령 원하는 것을 수행하는 것처럼 보이지만 반드시 sed정규 표현식 을 번역해야한다는 것을 알아야합니다 .

방금 달렸다 :

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'  

다음은 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

모든 이전 커널 버전 iirc.


이 sed의 표현을 번역하는 운동은 무엇입니까?
Bhavesh Diwan

2
지금 이해하려고 노력하고 있습니다. 시간이 좀 걸릴 수 있습니다.)
Seth

내 답변을 참조하십시오 .
jarno

@ Z9iT 링크 된 기사에서 답변으로 스크립트 설명을 복사하기에는 너무 게으 르기 때문에 Seth가 내 답변을 삭제 한 것 같습니다. 그러나 나는 연결된 기사가 인터넷에서 찾고있는 것이라고 생각합니다. 또한 이전 커널을 제거하는 더 안전한 방법을 알려주었습니다. 만일을 대비하여 2-3 개의 커널을 유지하고 있지만 현재 모든 우분투 릴리스에서는 작동하지 않을 수 있습니다.
jarno

@jarno Z9iT가 오래된 커널을 제거하는 안전한 방법이 아니라 특정 명령을 요구했기 때문에 삭제했습니다 . 그것은 여전히 ​​관련이있을 수 있지만, 주석에서는 대답이 아닙니다 :) (당신처럼)
Seth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.