내 / boot 파티션이 100 %에 도달하여 업그레이드 할 수 없습니다. 공간을 만들기 위해 오래된 커널을 제거 할 수 없습니다


154

나의 첫 번째 문제는 apt-get update또는을 시도했을 때였습니다 apt-get upgrade. 업그레이드시 다음과 같은 오류가 발생합니다.

You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not installed
E: Unmet dependencies. Try using -f.

apt-get install -f를 실행하려고 시도했는데 출력이었습니다 (프롬프트에 예라고 말한 후)

(Reading database ... 186183 files and directories currently installed.)
Unpacking linux-image-3.2.0-27-generic (from .../linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb) ...
Done.
dpkg: error processing /var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb (--unpack):
 failed in write on buffer copy for backend dpkg-deb during `./boot/System.map-3.2.0-27-generic': No space left on device
 No apport report written because the error message indicates a disk full error
                                                                          dpkg-deb:    error: subprocess paste was killed by signal (Broken pipe)
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.2.0-27-generic   /boot/vmlinuz-3.2.0-27-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.2.0-27-generic /boot/vmlinuz-3.2.0-27-generic
Errors were encountered while processing:
/var/cache/apt/archives/linux-image-3.2.0-27-generic_3.2.0-27.43_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

나는 달리기를 시도했지만와 apt-get autoremove같은 오류가 발생합니다 apt-get upgrade.

내가 실행하면 다음 df과 같은 결과를 얻습니다 /boot.

/dev/sda1                    233191     230297         0 100% /boot

그래서 나는 다른 곳에서 오래된 커널을 제거하려고 노력했습니다. 내가 가지고있는 커널을 확인했습니다.

$ dpkg -l linux-image-\* | grep ^ii
ii  linux-image-2.6.38-13-server  2.6.38-13.52  Linux kernel image for version 2.6.38 on x86_64
ii  linux-image-3.0.0-13-server   3.0.0-13.22   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-14-server   3.0.0-14.23   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-15-server   3.0.0-15.26   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-16-server   3.0.0-16.29   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.0.0-17-server   3.0.0-17.30   Linux kernel image for version 3.0.0  on x86_64
ii  linux-image-3.2.0-24-generic  3.2.0-24.39   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-25-generic  3.2.0-25.40   Linux kernel image for version 3.2.0  on 64 bit x86 SMP
ii  linux-image-3.2.0-26-generic  3.2.0-26.41   Linux kernel image for version 3.2.0  on 64 bit x86 SMP

이것으로 가장 오래된 것을 제거하려고하면 :

$ sudo apt-get purge linux-image-2.6.38-13-server
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
linux-image-server : Depends: linux-image-3.2.0-27-generic but it is not going to be     installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

설치를 엉망으로 만들지 않고 어떻게 부팅을 해제하거나 확장 할 수 있습니까?


이 패키지 관리자를 사용하고 다른 패키지 관리자 명령은 적어도 나를 위해, 실패했을 때 그것은 일 : 나는 mreiter의 대답은 최고의 수 있습니다 @ 생각 askubuntu.com/a/205776/247661
아론 홀


1
@dskrvk 예! 왜 Remove-Unused-Dependencies기본값이 아닌가?
Steven R. Loomis

답변:


129

루트 파일 시스템에서 공간 확보

루트 파일 시스템의 공간을 확보하기 위해 실행을 시도 할 수 apt-get clean있습니다.

그래도 작동하지 않으면 /var/cache/apt/archives캐시에서 몇 개의 파일을 수동으로 제거하여 약간의 공간을 확보하십시오.

sudo rm linux-headers-*

.deb필요한 경우 여기 에있는 모든 파일 을 제거해도 문제가되지 apt-get clean않습니다. apt다시 필요한 경우 자동으로 다시 다운로드됩니다 .

/ boot 파일 시스템에서 공간 확보

원본 포스터에는 별도의 /boot파티션이 있으므로 apt시스템 이 가득 차서 시스템이 작동하지 않습니다. 그곳에 여유 공간을 확보해야합니다.

공간이 거의 있으면 /boot구성 파일 로 이동하여 두세 개를 제거하십시오.

sudo rm config-3.2.0-19-generic-pae

예를 들어, 커널 버전 중 하나의 이름을 사용하여 제거하려고합니다. 이것은 약간의 공간을 확보합니다 (약 144K).

공간이 더 필요한 경우 개별적으로 오래된 제거 vmlinuz, initrd, abi그리고 System.map당신이 (내 I386 커널 버전 중 하나 22M에 대한) 충분한 공간이 될 때까지 파일을.

무엇을하든 모두 제거하지 마십시오 . 사용하는 각 커널 종류에 대해 최소한 각 파일 종류의 일치하는 최신 두 버전을 유지해야합니다.

그런 다음 apt-get 설치 명령을 진행하십시오. 위에서 언급했듯이 삭제 한 뎁의 일부를 다시 다운로드해야 할 수도 있지만 자동으로 발생합니다. apt가 다시 작동하면 apt-get을 사용하여 제거한 파일에 해당하는 패키지를 제거하여 정리하십시오.


설정 파일 은 커널 팀 이 같은 이름의 커널 을 빌드 하기 위해 사용/boot 했던 커널 설정입니다 . 참조하거나 원치 않는 커널을 만드는 데 도움이되지 않는 한 제거하는 것은 무해해야합니다.

마지막으로 /boot파티션 에서 오래된 커널 패키지를 수동으로 제거하여 새로운 커널 을위한 더 많은 공간을 확보합니다.


거의 모든 구성을 제거하려고했습니다. 아직 충분한 공간이없는 것 같습니다. 다른 어떤 파일을 제거해도 안전한가요? 내 루트 파일 시스템이 거의 꽉 차지 않았으므로 걱정하지 않아도됩니다.
Strifey16

직접 제거 할 추가 파일로 답변을 업데이트했습니다. 3.0.0.13 및 3.0.0.14 세트 (abi 파일을 포함하여 세트에 5 개의 파일)를 제거하면 충분할 것 같습니다.
John S Gruber

2
이것은 그것을 고쳤다. 손으로 파일을 제거하는 것이 가능하다는 것을 깨달았지만 항상 apt가 설치 한 모든 것을 사용하는 것이 주저합니다. 그래서 먼저 여기에 물어볼 것이라고 생각했습니다.
Strifey16

9
sudo rm/ boot에서 제거 하는 데 사용하지 마십시오 . 대신 sudo dpkg --purge오래된 linux-image 패키지를 제거하십시오. 그런 sudo apt-get -f install다음 깨진 종속성을 수정하는 데 사용 하십시오.
jarno

4
때때로 시스템이 가득 차서 dpkg조차도 작동하지 않을 수 있습니다. 그러나 rm그때 사용할 수 있습니다.
jarno

66

제 경우에는 apt명령과 dpkg명령을 완료하지 못하여 제거 할 수 없었습니다. 자동 업데이트 설치에 실패했습니다 2.6.32-56-server.

첫 번째 단계는 사용할 공간을 식별하는 것이 었습니다.

cd /boot
du -sk *|sort -n

약 30 개의 커널과 지원 파일이있었습니다.

나는 uname -a실행중인 커널을 얻기 위해 리눅스 대안을 사용 2.6.32-43-server하고 tar있었고 실행되지 않았고 오래된 6 가지 버전 중 하나를 수행했음을 알았습니다 .

tar -cvf ~username/boot.tar *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

그런 다음 rm -rf백업 한 작업을 수행했습니다.

rm -rf *2.6.32-44-server *2.6.32-45-server *2.6.32-46-server *2.6.32-47-server *2.6.32-48-server *2.6.32-49-server

이러한 명령을 예로 들어 설명하면 상황에 맞는 작업을 결정해야합니다.

에 약간의 공간이 있었으므로 이제 /boot달릴 수있었습니다.

apt-get -f install 

실패한 설치를 정리합니다 2.6.32-56-server.

그런 다음

apt-get remove linux-headers-2.6.32-38 linux-headers-2.6.32-38-server linux-image-2.6.32-38-server
apt-get remove linux-headers-2.6.32-39 linux-headers-2.6.32-39-server linux-image-2.6.32-39-server

이것은 내가 백업 한 것을 되돌려 놓을 공간을 주었다.

tar -xf ~username/boot.tar
rm  ~username/boot.tar    

정리하기 위해 다음을 실행할 수 있습니다.

apt-get autoremove

나는 다시 부팅했고 지금은 4 %를 사용하고있다 /boot.


이것은 모든 제안 중에서 가장 도움이되었습니다. 대단히 감사합니다!
Joshua F. Rountree 1

/ boot에서 파일을 제거하면 파일이 없을 때 설치 및 제거 스크립트가 실패하기 때문에 apt 및 dpkg가 끔찍하게 중단됩니다. 어떻게 작동하는지 모르겠습니다.
FizxMike 2016 년

20

이전 커널을 제거 하는 dpkg대신 사용할 수 있습니다 apt-get.

sudo dpkg -r linux-image-3.2.0-29-generic

어쩌면 이것을 사용하여 플러스가있을 수 있지만 @mreiter의 제안은 이것이 없었을 때 나를 위해 일했습니다 (이것은 우분투의 IRC 지원 채널에서 제안되었습니다)
Aaron Hall

3
@AaronHall이 답변은 mreiter의 답변 의 핵심 부분 (마지막 줄)을 포함하며 헤더 정리를 다루지 않기 때문에 훨씬 짧습니다 (별도의 /boot파티션 의 경우에는 도움이되지 않음 ).
Melebius

9

부트 디렉토리에 이전 버전의 파일이 여전히 있음을 알았습니다.

$ ls /boot
vmcoreinfo-2.6.31-17-server

그리고 패키지 관리자는 이전 버전을 나열합니다.

dpkg -l | grep linux-image

따라서이 명령을 사용했습니다 ( autoremove제거하고 싶지 않은 최신 이미지도 제거합니다)

sudo apt-get purge linux-image-2.6.31-17-server

나는 여전히 몇 가지 헤더를 남겼습니다.

dpkg -l | grep linux-headers

그래서 나는 이것을했다 :

sudo apt-get purge linux-headers-2.6.32-34

마지막으로 apt-get purge로 제거 할 수없는 패키지가 하나 남았습니다.

$ dpkg -l | grep linux-image
rc  linux-image-2.6.28-11-server

출처 : dpkg에서 rc로 표시된 패키지 제거

sudo dpkg --purge linux-image-2.6.28-11-server

3

의 사용 확인 /var/tmp과를 du -sh /var/tmp/. 해당 폴더의 모든 파일을 삭제하여 공간을 확보 할 수 있습니다.

그런 다음 다음을 실행하여 이전 커널을 제거 할 수 있습니다.

sudo apt-get clean
sudo apt install byobu
sudo purge-old-kernels
sudo apt autoremove
sudo update-grub

/var/tmp오래된 커널과는 어떤 관계가 있습니까? 그리고 모든 것을 삭제하는 것이 항상 안전하지는 않습니다 /var/tmp.
fosslinux

3

이것이 내가 사용한 것입니다 :

sudo apt-get autoremove linux-image-xxxx

모든 오래된 커널에 대해이 작업을 수행하고 최신 커널 만 유지하십시오.

이전 커널을 자동으로 제거하고 GRUB을 업데이트하려면 다음을 참조하십시오 : Ubuntu Documentation


2
이것이 정답입니다. 모든 것을 정리하지 않아도 Linux 이미지를 지정할 필요조차 없습니다.
CyberEd

2

나는 나를 위해 일한 유일한 것이 Aptitude를 사용한다는 것을 알았습니다.

sudo aptitude

그런 다음 열릴 때 일반적으로 바닥에 충족되지 않은 종속성에 대해 말합니다. g제안 된 제거를 진행하기 위해 편지 를 칠 수 있습니다 . 무슨 일이 일어날 지 알려주는 페이지로 연결됩니다.

-깨진 커널 옆에 마이너스가 있어야합니다 . g다시 누르면 깨진 커널이 제거됩니다. q종료하려면 누르십시오 . 그런 다음 sudo apt-get autoremove이전 커널을 제거하고 공간을 확보하는 데 사용할 수 있어야 합니다.


1
이것은 유일하게 유효한 답변입니다. 패키지 관리자는 아무것도 제거하기 전에 패키지를 설치하려고했기 때문에 다른 모든 답변은 효과가 없었습니다.
machineaddict

2

패키지에는 작용할 수 없지만 다른 파일에는 작용할 있습니다. 첫째, 홈 폴더 통해 이동이 있는지 여부를 확인 아무것도 삭제할 수는. 그렇지 않은 경우, 많은 양의 파일을 다른 파티션 (또는 플래시 드라이브)으로 옮긴 다음 sudo apt-get install -f패키지 종속성 문제 (대부분 .deb 파일을 통해 설치 dpkg)를 정리 한 다음 이전 커널을 제거하십시오. 10MB 이상을 안전하게 확보 한 후 불필요한 소프트웨어 나 파일을 제거하십시오.


5
홈 폴더가 / boot에 없습니다
Thorbjørn Ravn Andersen 님이

1

시냅틱 패키지 관리자를 사용하십시오. 제거 할 패키지를 선택하기 만하면 해당 패키지를 제거하라는 메시지가 표시됩니다. 필자의 경험에 따르면 커널 패키지는 항상 상호 의존적 인 두 개 이상의 그룹으로 나옵니다. 일반적으로 "local / obsolete"필터를 사용하여 오래된 필터를 빠르게 찾을 수 있습니다.


2
예를 들어 (텍스트 전용) 서버에는 시냅틱이 없습니다. 따라서 실제로 서버에 적합한 솔루션은 아닙니다.
nerdoc

1

나는 때때로이 문제와 싸우고 있었고 실제로 실제로 전체 작업을 수행하는 솔루션을 보지 못했습니다. 어떤 경우에는 오래된 커널을 제거하면 종속성이 없어져 아무것도 제거되지 않으며 / boot에서 커널을 수동으로 제거해야했습니다. 그러나 수동으로 삭제 된 커널이 어딘가에 기록되어 파일에서 rm -rf를 수행하여 파일이 누락되어 파일이 누락되었다고보고하면 향후 문제가 발생할 수 있다고 상상하면서 전체 작업을 수행하기를 원했습니다.

그래서 여기에 더 이상의 설치가 필요없는 많은 Google 제안에 따라이 스크립트를 작성했습니다. 이 스크립트는 내 자신의 "예기치 않은"상황을 지원하기 위해 몇 번 수정되었습니다. 예를 들어, 이것을 raspberry pi에서 실행하면 update-grub이 존재하지 않을 수 있습니다. 그리고 마지막 업데이트 프로그램을 실행할 때 일부 사이트에 접근 할 수없는 IPv6이 서버에 멈췄습니다.

스크립트는 의존성 빌드로 인해 완전히 멈춰있는 커널을 강제로 제거해야하는지 여부를 알아냅니다.

#!/bin/bash

ipv4="-o Acquire::ForceIPv4=true"

if [ "$1" = "4" ] ; then
    withip=$ipv4
    echo "Going IPv4 ($withip)"
fi

echo "Autoremove+Purge."
apt-get $withip -y -f autoremove --purge >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "Auto Removal Failed!"
fi

echo "Old dependency fix."
apt-get $withip -f -y install >/dev/null 2>&1

if [ "$?" != "0" ] ; then
    echo "That failed. So we'll try to make up to it during this process."
fi

echo "Now, going old kernel cleanup!"
kern=$(dpkg --list 'linux-image*'|awk '{ if ($1=="ii") print $2}'|grep -v `uname -r`)
hadErrors=0

for k in $kern
do
    echo apt-get -y purge $k
    apt-get $withip -y purge $k >/dev/null 2>&1

    if [ "$?" != "0" ] ; then
        echo "Failed apt-purge... Using plan B (--force-all -P)..."
        dpkg --force-all -P $k >/dev/null 2>&1
        echo "Rerunning stuff (apt-get -f -y install) for dependencies..."
        apt-get $withip -f -y install >/dev/null 2>&1
        if [ "$?" != "0" ] ; then
            echo "Still failing..."
            hadErrors=1
        fi
    fi
done

if [ "$hadErrors" = "1" ] ; then
    echo "I had errors. I should rerun this process, to see if there are more kernels that were left out after cleanup..."
    /usr/local/tornevall/cleankernel
fi

apt-get $withip autoremove
apt-get $withip update
apt-get $withip upgrade
apt-get $withip dist-upgrade

grb=$(which update-grub)
if [ "" != "$grb" ] ; then
    update-grub
else
    echo "Can't upgrade grub since update-grub is missing..."
fi

리눅스 퍼지 시도 했습니까 ? 그러나 현재 IPv4 강제 설정이 없습니다.
jarno

귀하의 스크립트는 내 시스템에서 linux-image-generic을 제거합니다.
jarno

오래된 커널이 정리되었을 때 어떤 이유로 되돌려 져 있습니다. 이 스크립트를 작성한 이후로 적어도 이것이 사실이었습니다. 그러나이 스크립트는 진행할 다른 옵션이 없을 때 사용하는 것입니다. 일반적으로, 업그레이드는이 문제를 스스로 해결하지만, 지금이 순간, 아무 것도 효과가없는 경우, 정리 후에 설정 될 커널이 더 많기 때문에 이것은 좋은 옵션이 될 수 있습니다. 이것이 좋든 나쁘 든 토론 가능할 것입니다.
Tomas Tornevall

0

단순히 실행하면 sudo apt-get -f autoremove내 문제가 해결되었습니다.


2
100 % 디스크 공간 / 부팅 사용량이 있습니까?
fosslinux

모니터링 기록을 살펴보면 보이지 않는 것 같습니다. 추신 : 저는 Vagrant xenial을 사용하고 있으며 부트 파일 시스템 /dev/sda1이 마운트되어 있습니다/
forzagreen

0

이것을 실행하십시오 :

sudo apt-get autoremove
sudo apt-get --purge remove && sudo apt-get autoclean
sudo apt-get -f install
sudo dpkg-reconfigure -a

출처 : upgade 후이 오류가 발생합니다. 도와주세요


sudo dpkg-reconfigure는 무엇입니까? 우분투 16 일의 알 수없는 옵션 -a는 말한다
Shivam Kotwalia

이 질문의 apt경우 제거 프로세스 자체 /boot가 이미 가득 찬 파일을 생성하기 때문에 커널 패키지를 제거하지 못합니다 . 이것이 apt-get autoremove실패하는 이유 입니다. 찾고있는 질문은 이미 askubuntu.com/q/142926/158442autoremove 입니다.
muru

@muru 나는 ​​그것을 위해 트릭을했기 때문에 방금 게시했습니다 : D
Ardi Nusawan

나는 그것이 당신의 문제 가이 질문이 아닌 다른 질문이었을 것이라고 확신합니다.
muru

@muru oh ok got it : D
Ardi Nusawan

0

apt-get -f install 또는 apt-get -f autoremov e가 커널을 다시 설치 하기 때문에 dpkg가 이전 Linux 커널을 제거해도 해결되지 않는 / boot에 대한 몇 가지 기사가 있습니다.

필자의 경우 최소한 서명 및 추가 패키지도 제거해야했습니다. 커널은 이러한 패키지의 종속성이므로 적절하게 다시 설치했습니다. 일반적으로 관련 커널 패키지는 'install'을 호출하기 전에 제거해야합니다. 제거 직후 업그레이드apt-get 하려한다면 , 어떤 패키지가 방금 제거한 커널에 의존하지 않는 패키지인지를 알려 주어야합니다.

제 경우에는 다음과 같은 전술이 효과적이었습니다.

#as sudo, repeat 1-3 for any old kernels; can be scripted
dpkg --force-all -P linux-image-4.4.0-112-generic 
dpkg --purge linux-image-extra-4.4.0-112-generic
dpkg --purge linux-signed-image-4.4.0-112-generic
apt-get -f install #dependency resolution didn't have work to do for kernel packages
apt-get autoremove --purge -f 
apt-get autoclean
apt-get upgrade

0

linux-purge 도구를 다음과 같이 설치 하십시오 .

그런 다음 터미널에서 실행하십시오.

sudo linux-purge --clear-boot --fix

그런 다음 예를 들어 커널을 제거하십시오.

sudo linux-purge --keep 1 --choose

특별한:

무인 업그레이드를 사용하는 대신 무인 커널 제거를 위해 linux-purge를 사용하려면 /etc/apt/apt.conf.d/50unttended-upgrades를 편집하여 사용하지 않는 항목 제거를 비활성화하고 시스템화 된 서비스를 설정해야합니다 실행

/usr/local/bin/linux-purge --auto-only --keep 1 --yes

당신이 원할 때마다.

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