/ boot의 디스크 공간이 부족하여 업그레이드 할 수 없습니다


123

나는 노력하려고 do-release-upgrade 하지만 나는 얻는다 :

디스크 여유 공간이 부족합니다

업그레이드가 중단되었습니다. 업그레이드에는 디스크 '/ boot'에 총 25.7M의 여유 공간이 필요합니다. '/ boot'에 최소 25.7M의 디스크 공간을 추가로 확보하십시오. 휴지통을 비우고 'sudo apt-get clean'을 사용하여 이전 설치의 임시 패키지를 제거하십시오.

출력 df:

                    237251272 214797108  10402504  96% /
udev                    488120         4    488116   1% /dev
tmpfs                   198676       668    198008   1% /run
none                      5120         0      5120   0% /run/lock
none                    496684         0    496684   0% /run/shm
/dev/sda1               233191    225867         0 100% /boot

부팅 할 때 공간이 없습니까? 출력은 다음과 같습니다 ls -as /boot.

total 221839
    4 .
    4 ..
  645 abi-2.6.32-34-generic-pae
  698 abi-2.6.35-30-generic-pae
  727 abi-2.6.38-12-generic-pae
  727 abi-3.0.0-12-generic-pae
  727 abi-3.0.0-13-generic-pae
  727 abi-3.0.0-14-generic-pae
  727 abi-3.0.0-15-generic-pae
  727 abi-3.0.0-16-generic-pae
  727 abi-3.0.0-17-generic-pae
  727 abi-3.0.0-19-generic-pae
  761 abi-3.0.0-20-generic-pae
  115 config-2.6.32-34-generic-pae
  128 config-2.6.35-30-generic-pae
  136 config-2.6.38-12-generic-pae
  140 config-3.0.0-12-generic-pae
  140 config-3.0.0-13-generic-pae
  140 config-3.0.0-14-generic-pae
  140 config-3.0.0-15-generic-pae
  140 config-3.0.0-16-generic-pae
  140 config-3.0.0-17-generic-pae
  140 config-3.0.0-19-generic-pae
  140 config-3.0.0-20-generic-pae
    5 grub
10773 initrd.img-2.6.32-34-generic-pae
13619 initrd.img-2.6.35-30-generic-pae
15365 initrd.img-2.6.38-12-generic-pae
16481 initrd.img-3.0.0-12-generic-pae
16487 initrd.img-3.0.0-13-generic-pae
16501 initrd.img-3.0.0-14-generic-pae
16476 initrd.img-3.0.0-15-generic-pae
16481 initrd.img-3.0.0-16-generic-pae
16478 initrd.img-3.0.0-17-generic-pae
   12 lost+found
  174 memtest86+.bin
  176 memtest86+_multiboot.bin
 1700 System.map-2.6.32-34-generic-pae
 1841 System.map-2.6.35-30-generic-pae
 2115 System.map-2.6.38-12-generic-pae
 2141 System.map-3.0.0-12-generic-pae
 2141 System.map-3.0.0-13-generic-pae
 2143 System.map-3.0.0-14-generic-pae
 2146 System.map-3.0.0-15-generic-pae
 2147 System.map-3.0.0-16-generic-pae
 2147 System.map-3.0.0-17-generic-pae
 2148 System.map-3.0.0-19-generic-pae
 2149 System.map-3.0.0-20-generic-pae
    2 vmcoreinfo-2.6.32-34-generic-pae
    2 vmcoreinfo-2.6.35-30-generic-pae
    2 vmcoreinfo-2.6.38-12-generic-pae
    2 vmcoreinfo-3.0.0-12-generic-pae
    2 vmcoreinfo-3.0.0-13-generic-pae
    2 vmcoreinfo-3.0.0-14-generic-pae
    2 vmcoreinfo-3.0.0-15-generic-pae
    2 vmcoreinfo-3.0.0-16-generic-pae
    2 vmcoreinfo-3.0.0-17-generic-pae
    2 vmcoreinfo-3.0.0-19-generic-pae
    2 vmcoreinfo-3.0.0-20-generic-pae
 4092 vmlinuz-2.6.32-34-generic-pae
 4347 vmlinuz-2.6.35-30-generic-pae
 4567 vmlinuz-2.6.38-12-generic-pae
 4675 vmlinuz-3.0.0-12-generic-pae
 4676 vmlinuz-3.0.0-13-generic-pae
 4681 vmlinuz-3.0.0-14-generic-pae
 4698 vmlinuz-3.0.0-15-generic-pae
 4700 vmlinuz-3.0.0-16-generic-pae
 4700 vmlinuz-3.0.0-17-generic-pae
 4703 vmlinuz-3.0.0-19-generic-pae
 4705 vmlinuz-3.0.0-20-generic-pae

출력 uname -a:

 Linux kitsch 3.0.0-17-generic-pae #30-Ubuntu SMP Thu Mar 8 17:53:35 UTC 2012 i686 i686 i386 GNU/Linux

출력을 추가 ls -l /boot하고 uname -a당신의 질문에.
jippie

또한 출력을 dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'질문에 추가하십시오 .
jippie

ls -as /boot대신 유용 할 수 있습니다. 파일 크기 만 포함됩니다.
adempewolff

ls -l / boot의 출력은 너무 길어서 여기에 게시하십시오. pastebin pastebin.com/yM1aEJUx
clamp

5
전혀 그렇지 않다. 문제의 원인입니다. 질문이 실제로 너무 오래 걸리면 누군가 편집 할 것입니다. pastebin과 같은 외부 서비스를 사용하면 나중에 참조 할 수 있도록 질문의 가치가 손상됩니다.
jippie

답변:


160

/ boot 파티션은 오래된 커널로 채워져 있습니다. 때로는 왜 고정되지 않는지 확실하지 않습니다. 어떤 패키지가 들어 있는지 알고 있으면 이전 커널을 쉽게 제거 할 수 있습니다.

먼저 uname -a현재 버전을 확인하십시오.

그런 다음 다음 명령을 실행하십시오.

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

이 명령은 더 이상 필요없는 모든 패키지를 나열합니다. 나는 그것들을 자동으로 제거하는 것을 좋아하지 않으며, 커널을 제거 할 때 제어하는 ​​것을 좋아합니다. 따라서 나열된 모든 패키지에 대해 다음을 수행하십시오.

sudo apt-get -y purge some-kernel-package

인터메조

이 intermezzo는 명령의 작동 방식을 자세히 설명하고로 문제를 해결하려고 시도합니다 linux-libc-dev:amd64. 대부분의 사용자는이 단락을 건너 뛸 수 있습니다.

  • dpkg -l 'linux-*' 'linux-'로 시작하는 이름을 가진 모든 패키지를 나열하십시오.
  • sed '/^ii/!d; remove all lines that do *not* start withii`
  • uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/" 현재 실행중인 커널 버전을 찾으십시오
  • /'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d 현재 실행중인 커널 버전 번호를 포함하는 행을 제외한 모든 행을 제거하십시오.
  • s/^[^ ]* [^ ]* \([^ ]*\).*/\1/ 각 줄 목록에 대해 패키지 이름 만
  • /[0-9]/!d 숫자가없는 줄을 제거하십시오.

Frederick Nord의 문제 를 해결하기 위해 다음과 같이 명령을 수정할 수 있다고 생각합니다.

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

기본적으로 추가 필터를 추가합니다.

  • / ^ linux- (headers \ | image) /! d linux-headers또는로 시작하지 않는 모든 행을 삭제합니다linux-image

/ 인터메조

어디 some-kernel-package목록에 포함 된 패키지로 교체 할 수 있습니다. 현재 사용중인 커널 패키지를 제거하지 마십시오 ( uname -a예 :). sudo apt-get purge -y linux-headers-3.0.0-12기타

xargs 명령을 사용하여 더 자동화 할 수 있지만 마음에 들지는 않습니다. 개인적인 것입니다. 그러나 다음과 같은 명령이 있습니다.

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

이것은 내가 /boot보기에 하나의 여분의 커널 (2.6.38-11)과 3.2.0-24가 현재의 경우입니다.

$ ls -l /boot
total 59388
-rw-r--r-- 1 root root   730545 Sep 13  2011 abi-2.6.38-11-generic
-rw-r--r-- 1 root root   791023 Apr 25 13:51 abi-3.2.0-24-generic
-rw-r--r-- 1 root root   130326 Sep 13  2011 config-2.6.38-11-generic
-rw-r--r-- 1 root root   140341 Apr 25 13:51 config-3.2.0-24-generic
drwxr-xr-x 3 root root     5120 May 27 17:46 grub
-rw-r--r-- 1 root root 20883146 Oct  1  2011 initrd.img-2.6.38-11-generic
-rw-r--r-- 1 root root 22474219 May  5 09:04 initrd.img-3.2.0-24-generic
drwxr-xr-x 2 root root    12288 Apr 16  2009 lost+found
-rw-r--r-- 1 root root   176764 Nov 27 11:00 memtest86+.bin
-rw-r--r-- 1 root root   178944 Nov 27 11:00 memtest86+_multiboot.bin
-rw------- 1 root root  2656297 Sep 13  2011 System.map-2.6.38-11-generic
-rw------- 1 root root  2884358 Apr 25 13:51 System.map-3.2.0-24-generic
-rw------- 1 root root     1369 Sep 13  2011 vmcoreinfo-2.6.38-11-generic
-rw------- 1 root root  4526784 Sep 13  2011 vmlinuz-2.6.38-11-generic
-rw------- 1 root root  4965776 Apr 25 13:51 vmlinuz-3.2.0-24-generic

그리고 파일 시스템 사용법 :

$ df -h /boot
Filesystem Size Used Avail Use% Mounted
/dev/sda5  228M  63M  154M  29% /boot

2
이 솔루션은 ubuntugenius.wordpress.com/2011/01/08/의 OzzyFrank
jippie

6
예, 왜 이것이 문제입니까? 사용자가 처리해서는 안됩니다.
Elijah Lynn

2
FWIW : 이것은 linux-libc-dev : amd64 와도 일치합니다. 따라서 너무 관대 할 수 있습니다.
Frederick Nord

4
It does that sometimes, not sure why it is never fixed우분투는 기존 패키지를 업그레이드하는 대신 정기적으로 새로운 커널을 새로운 패키지로 제공하기로 결정했으며, 여러 커널을 설치하고 원하는대로 전환 할 수있는 옵션을 제공했습니다. 나는이 가정이 최신 커널을 원하고 (그리고 새로운 부팅 문제가 발생할 경우 하나의 폴백), 설치된 커널을 스스로 관리하고 싶지 않은 사람들의 95 %에게는 적합하지 않다는 데 동의합니다. 아마도 우분투는 미래 에이 행동을 바꿀 것입니다. 지금은 / boot가 큰지 확인하십시오.
thomasrutter

1
@thomasrutter 나와 나와 이야기하는 사람들의 95 %가이 버그가 중요하다고 생각되면 여기에서 투표하십시오 : bugs.launchpad.net/ubuntu/+source/update-manager/+bug/1183692
FriendFX

46

sudo apt-get autoremove

나를 위해 속임수를 사용하여 사용하지 않는 모든 커널 패키지를 성공적으로 정리했습니다.


3
이것은 정확하지 않습니다. from man apt-getautoremove는 일부 패키지의 종속성을 충족시키기 위해 자동으로 설치되고 더 이상 필요하지 않은 패키지를 제거하는 데 사용됩니다. 커널은 종속성을 충족시키기 위해 설치되지 않으며 업그레이드 중에 설치됩니다.
dward

5
@neon_overload 트릭을했기 때문에 방금 게시했습니다.
토플리스

1
@dward 그것은 나를 위해 약간의 공간을 확보했습니다 : autremove 전 : /dev/sda1, 240M total, 171M used, 57M free, 75% used /boot 후에 : /dev/sda1, 240M total, 129M used, 98M free, 57% used /boot
Stefan Rogin

6
"사용 가능한 디스크 공간이 부족합니다"대화 상자에이 작업을 수행 할 수있는 버튼이 있어야합니다. 이는 특히 명령 줄에 익숙하지 않은 초보자 사용자에게 도움이됩니다.
Martin R.

1
내 OS를 파괴하지 않고 속임수
Ruthvik Vaila

8

허용되는 답변과 동일합니다. ubuntu-tweak도구 를 설치하는 또 다른 쉬운 방법은 여기 에서 다운로드 할 수 있습니다 . "Janitor"로 이동하여 "Old Kernel"을 선택하여 정리하십시오. 몇 번의 클릭만으로 수행 할 수 있습니다. (14.04 데스크탑에서 테스트)

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


공간이 부족한 상황은 /boot항상 발생하므로 이것이 내가 가장 좋아하는 솔루션입니다. 한 번의 클릭으로 작업을 수행하는 응용 프로그램을 쉽게 실행할 수 있습니다.
s3m3n

2

다른 GUI 답변과 비교 하여이 답변의 이점은 타사 응용 프로그램을 설치하지 않고 기본 Ubuntu Bash가 사용된다는 것입니다.

Zenity 및 Bash 기반 솔루션

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

참고 : 이 스크립트의 서버 (GUI가 아닌 텍스트 기반) 버전은 부팅 메뉴를 정리하기 위해 이전 커널 버전을 제거하는 방법을 참조하십시오.


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스크립트에 매개 변수를 전달하십시오.

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

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


당신 정말 대단하네요! 정말 감사합니다! 당신은 나를 행복하게 만들었습니다!
zhartaunik

0

시냅틱 패키지 관리자를 통해 커널을 쉽게 처리 할 수 ​​있습니다. 그러나 먼저 터미널 프롬프트에서 현재 사용되는 커널 릴리스 이름을 알아야합니다.

linux@linux-desktop:~$ uname -r 4.4.0-75-generic 따라서 최소한이 버전은 그대로 유지해야합니다. 다음과 같이 시냅틱을 열고 빠른 필터 자리 표시자를 채우십시오. 여기에 이미지 설명을 입력하십시오 이제 삭제할 모든 패키지를 선택하고 다음을 수행 할 수 있습니다 . 완전히 제거 표시-> 적용 . 최소한 최신 현재 커널 패키지와 하나의 이전 커널을 유지하는 것이 좋습니다. 이 경우 예를 들어 안전하게 제거 할 수 리눅스 이미지-4.4.0-66 제네릭리눅스 이미지 추가-4.4.0-66-일반 하지만 좋은 유지 4.4.0-72 물론을 4.4.0-75 .



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.