Phân vùng / boot của tôi đạt 100% và bây giờ tôi không thể nâng cấp. Không thể loại bỏ hạt cũ để làm phòng


154

Vấn đề đầu tiên của tôi là khi tôi cố gắng apt-get updatehoặc apt-get upgrade. Khi nâng cấp tôi gặp lỗi sau:

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.

Tôi đã thử chạy apt-get install -f và đây là đầu ra (sau khi nói có trên dấu nhắc)

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

Tôi đã thử chạy apt-get autoremovevà nó cho tôi lỗi tương tự apt-get upgrade.

Khi tôi chạy df, tôi nhận được điều này cho /boot:

/dev/sda1                    233191     230297         0 100% /boot

Vì vậy, tôi đọc ở nơi khác rằng tôi nên cố gắng thanh lọc hạt nhân cũ. Tôi đã kiểm tra những gì tôi đã có với:

$ 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

Khi tôi cố gắng loại bỏ cái cũ nhất bằng cái này:

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

Làm thế nào tôi có thể giải phóng hoặc mở rộng khởi động mà không làm hỏng cài đặt của tôi?


Tôi nghĩ rằng câu trả lời của @ mreiter có thể là tốt nhất: nó sử dụng trình quản lý gói và nó hoạt động khi các lệnh của trình quản lý gói khác không thành công, ít nhất là đối với tôi: Askubfox.com/a/205776/247661
Aaron Hall


1
@dskrvk Vâng! Tại sao Remove-Unused-Dependencieskhông phải là mặc định?
Steven R. Loomis

Câu trả lời:


130

Giải phóng không gian trên hệ thống tập tin gốc

Để giải phóng không gian trên hệ thống tập tin gốc, bạn có thể thử thực thi apt-get clean.

Nếu điều đó không hiệu quả, bạn có thể truy cập /var/cache/apt/archivesvà xóa thủ công một vài tệp khỏi bộ đệm để lấy lại dung lượng, ví dụ:

sudo rm linux-headers-*

Sẽ không hại khi xóa tất cả các .debtệp ở đây nếu bạn cần - đó là những gì apt-get clean. Chúng sẽ tự động được tải xuống lại aptnếu cần thiết một lần nữa.

Giải phóng không gian trên hệ thống tập tin / khởi động

Poster gốc có một /bootphân vùng riêng và đó là những gì đầy đủ và ngăn apthệ thống hoạt động. Nó sẽ là cần thiết cho anh ta để giải phóng không gian ở đó.

Nếu có đủ dung lượng, hãy truy cập /bootvà xóa một hoặc hai tệp cấu hình:

sudo rm config-3.2.0-19-generic-pae

ví dụ, nhưng sử dụng tên của một trong các phiên bản kernel mà bạn định loại bỏ bằng mọi cách. Điều này sẽ giải phóng một không gian nhỏ (khoảng 144K mỗi người).

Nếu bạn cần nhiều không gian hơn loại bỏ cá nhân cũ vmlinuz, initrd, abiSystem.mapcác file cho đến khi bạn có đủ không gian (khoảng 22M cho một trong những phiên bản kernel i386 của tôi).

Dù bạn làm gì, đừng loại bỏ tất cả . Ít nhất bạn nên giữ hai phiên bản phù hợp mới nhất của từng loại tệp cho từng loại hạt nhân bạn sử dụng.

Sau đó tiến hành các lệnh cài đặt apt-get của bạn. Như đã đề cập ở trên, họ có thể phải tải xuống lại một số lỗi bạn đã xóa, nhưng nếu vậy điều đó sẽ tự động xảy ra. Khi bạn có apt hoạt động trở lại, hãy dọn sạch bằng cách sử dụng apt-get để xóa các gói tương ứng với các tệp bạn đã xóa - để mọi thứ khớp với nhau.


Tệp cấu hình trong /bootlà cấu hình kernel được nhóm kernel sử dụng để xây dựng kernel cùng tên. Nó sẽ vô hại để loại bỏ trừ khi bạn muốn nó để tham khảo hoặc hỗ trợ bạn trong việc xây dựng hạt nhân của riêng bạn.

Cuối cùng, bạn sẽ tự gỡ bỏ một hoặc hai gói kernel cũ khỏi /bootphân vùng để có thêm chỗ cho cái mới.


Tôi đã cố gắng loại bỏ gần như tất cả các cấu hình. Nó dường như vẫn không có đủ không gian. Những tập tin khác trong đó sẽ được an toàn để loại bỏ? Hệ thống tập tin gốc của tôi không ở đâu gần đầy, vì vậy tôi không lo lắng về nó.
Strifey16

Tôi đã cập nhật câu trả lời của mình với các tệp khác để xóa bằng tay. Dường như với tôi, việc loại bỏ các bộ 3.0.0.13 và 3.0.0.14 (năm tệp cho bộ bao gồm tệp abi) sẽ đủ.
John S Gruber

2
Điều này đã sửa nó. Tôi nhận ra rằng có thể sẽ gỡ bỏ các tệp bằng tay, nhưng tôi luôn do dự để làm điều đó với bất cứ thứ gì được cài đặt bởi apt, vì vậy tôi nghĩ rằng tôi nên hỏi ở đây trước.
Strifey16

9
Không sử dụng sudo rmđể loại bỏ khỏi / boot. Thay vào đó, sử dụng sudo dpkg --purgeđể loại bỏ một số gói hình ảnh linux cũ. Sau đó sử dụng sudo apt-get -f installđể sửa chữa sự phụ thuộc bị hỏng.
jarno

4
Mặc dù đôi khi hệ thống có thể đầy đến mức ngay cả dpkg cũng không thể hoạt động. Nhưng rmcó thể dùng rồi.
jarno

66

Trong trường hợp của tôi, các aptlệnh và dpkglệnh không thể kết thúc và không thể xóa. Autoupdate đã thất bại khi cài đặt 2.6.32-56-server.

Bước đầu tiên của tôi, là xác định không gian sẽ được sử dụng,

cd /boot
du -sk *|sort -n

Tôi đã có khoảng 30 hạt nhân và các tập tin hỗ trợ.

Tôi đã làm một uname -ađể có được kernel đang chạy, tôi xác định rằng tôi đã sử dụng Linux thay thế 2.6.32-43-servervà đã thực hiện một tartrong số 6 phiên bản không chạy và đã cũ.

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

Sau đó tôi đã làm một rm -rftrong những gì tôi đã sao lưu:

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

Tôi đang hiển thị các lệnh này làm ví dụ, bạn sẽ phải quyết định những gì bạn sẽ làm việc với tình huống của bạn.

Bây giờ tôi đã có một số không gian trên /boot, tôi đã có thể chạy

apt-get -f install 

Để dọn dẹp cài đặt không thành công của 2.6.32-56-server.

Sau đó tôi đã làm một

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

Điều này đã cho tôi chỗ để đặt lại những gì tôi đã sao lưu.

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

Để dọn dẹp, sau đó tôi có thể chạy:

apt-get autoremove

Tôi đã khởi động lại và hiện đang sử dụng 4% /boot.


Đây là hữu ích nhất cho tôi trong số tất cả các đề xuất. Cảm ơn rât nhiều!
Joshua F. Rountree

xóa các tệp khỏi / boot chỉ phá vỡ khủng khiếp apt và dpkg kể từ khi các tập lệnh cài đặt và gỡ bỏ của chúng bị lỗi HARD khi các tệp bị thiếu. Tôi không thấy cách bạn làm việc này.
FizxMike

20

Bạn có thể sử dụng dpkgthay vì apt-getloại bỏ các hạt nhân cũ hơn:

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

Có thể có những cái kìm để sử dụng cái này, nhưng gợi ý của @ mreiter đã có hiệu quả với tôi khi cái này không (cái này được đề xuất trên kênh hỗ trợ IRC của ubfox.)
Aaron Hall

3
@AaronHall Câu trả lời này chỉ đơn giản chứa phần chính của câu trả lời của mreiter (dòng cuối cùng) và nó ngắn hơn nhiều vì nó không bao gồm việc làm sạch các tiêu đề (không giúp ích gì trong trường hợp /bootphân vùng riêng ).
Melebius

9

Tôi nhận thấy vẫn còn một số tệp của các phiên bản cũ trong thư mục khởi động:

$ ls /boot
vmcoreinfo-2.6.31-17-server

Và người quản lý gói sẽ liệt kê các phiên bản cũ:

dpkg -l | grep linux-image

Do đó, tôi đã sử dụng lệnh này ( autoremovecũng sẽ xóa các hình ảnh gần đây hơn mà tôi không muốn xóa)

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

Tôi vẫn còn một số tiêu đề:

dpkg -l | grep linux-headers

Vì vậy, tôi đã làm điều này:

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

Cuối cùng, có một gói còn lại tôi không thể xóa bằng apt-get purge:

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

Nguồn: Xóa gói được đánh dấu là RC bởi dpkg

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

3

Kiểm tra việc sử dụng /var/tmpvới du -sh /var/tmp/. Tất cả các tệp trong thư mục đó có thể bị xóa để tạo khoảng trống.

Sau đó, bạn có thể chạy các bước sau để loại bỏ các hạt nhân cũ:

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

Những gì /var/tmpphải làm với hạt nhân cũ? Và không phải lúc nào cũng an toàn để xóa mọi thứ trong /var/tmp...
fosslinux

3

Đây là những gì tôi đã sử dụng:

sudo apt-get autoremove linux-image-xxxx

Làm điều đó cho tất cả các hạt nhân cũ và chỉ giữ hai gần đây nhất.

Nếu bạn muốn tự động loại bỏ các hạt nhân cũ và cập nhật GRUB, hãy xem điều này: Tài liệu Ubuntu


2
Đây phải là câu trả lời được chấp nhận. Nếu bạn không nhớ dọn dẹp mọi thứ, bạn thậm chí không cần chỉ định hình ảnh Linux.
CyberEd

2

Tôi thấy rằng điều duy nhất phù hợp với tôi là sử dụng Aptitude.

sudo aptitude

Sau đó, khi nó mở ra, nó thường sẽ nói điều gì đó về sự phụ thuộc chưa được đáp ứng ở phía dưới. Bạn có thể nhấn thư gđể tiến hành xóa đề xuất. Nó sẽ đưa bạn đến một trang nơi nó liệt kê những gì sẽ xảy ra.

Cần có một điểm trừ -bên cạnh các hạt nhân bị hỏng. Nhấn gmột lần nữa và nó sẽ loại bỏ các hạt bị hỏng. Nhấn qđể thoát. Sau đó, bạn sẽ có thể sử dụng sudo apt-get autoremoveđể loại bỏ các hạt nhân cũ và giải phóng không gian.


1
đây là câu trả lời hợp lệ DUY NHẤT. tất cả các câu trả lời khác đều không hoạt động, vì người quản lý gói muốn cài đặt gói trước khi có thể xóa bất kỳ thứ gì.
máy móc

2

Bạn không thể hành động theo các gói, nhưng bạn có thể hành động theo các tệp khác. Đầu tiên, đi qua thư mục nhà của bạn và xem liệu có bất cứ điều gì bạn có thể xóa. Nếu không, hãy cố gắng di chuyển một lượng tệp tốt sang phân vùng khác (hoặc ổ đĩa flash) và sau đó cố gắng sudo apt-get install -fdọn sạch các vấn đề phụ thuộc gói (rất có thể bạn đã cài đặt tệp .deb qua dpkg), sau đó lọc bất kỳ hạt nhân cũ nào. Khi bạn có ít nhất 10 MB, hãy thử xóa phần mềm hoặc tệp không cần thiết.


5
Thư mục nhà không ở trong / boot
Thorbjørn Ravn Andersen

1

Sử dụng Trình quản lý gói Synaptic. Chỉ cần chọn gói bạn muốn loại bỏ và nó sẽ nhắc bạn cũng loại bỏ các gói phụ thuộc vào nó. Theo kinh nghiệm của tôi, các gói kernel luôn đi theo nhóm hai (hoặc nhiều hơn, tùy thuộc vào cách bạn đếm) phụ thuộc lẫn nhau. Bạn thường có thể tìm thấy những cái cũ một cách nhanh chóng bằng cách sử dụng bộ lọc "cục bộ / lỗi thời".


2
Ví dụ: trên máy chủ (chỉ có văn bản), không có Synaptic. Vì vậy, không thực sự là một giải pháp khả thi cho các máy chủ.
nerdoc

1

Thỉnh thoảng tôi vẫn chiến đấu với vấn đề này và vẫn chưa thấy giải pháp nào thực sự làm hết công việc. Trong một số trường hợp, việc loại bỏ các hạt nhân cũ kết thúc trong các phụ thuộc khiến tôi không thể loại bỏ bất cứ thứ gì và tôi phải loại bỏ các hạt nhân bằng tay khỏi / boot. Tuy nhiên, tôi vẫn muốn apt thực hiện toàn bộ công việc vì tôi tưởng tượng các hạt nhân bị xóa thủ công được ghi lại ở đâu đó và có thể gây ra sự cố trong tương lai, khi một cái gì đó báo cáo các tệp bị thiếu do tôi ngồi làm rm -rf trên các tệp.

Vì vậy, tôi đã viết kịch bản này, dựa trên nhiều đề xuất được nêu ra ở đây mà không yêu cầu cài đặt thêm một cái gì đó. Kịch bản đã được sửa đổi một vài lần để hỗ trợ một số tình huống "bất ngờ" của riêng tôi. Ví dụ: chạy cái này trên pi mâm xôi, update-grub có thể không tồn tại. Và trong một số trường hợp khi chạy các trình cập nhật cuối cùng, các máy chủ đã bị kẹt với IPv6 trong đó một số trang web không thể truy cập được.

Kịch bản chỉ ra liệu nó có phải loại bỏ mạnh mẽ các hạt nhân bị kẹt hoàn toàn do các bản dựng phụ thuộc hay không, nếu nó có thể làm theo cách "đúng".

#!/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

Bạn đã thử dùng linux-purge chưa? Mặc dù vậy, hiện tại nó không có điều bắt buộc IPv4.
jarno

Kịch bản của bạn sẽ lọc Linux-image-generic trong hệ thống của tôi, điều này thật tệ.
jarno

Chúng là vì một số lý do được đưa trở lại khi hạt nhân cũ đã được làm sạch. Ít nhất đây là trường hợp của tôi kể từ khi tôi xây dựng kịch bản này. Tuy nhiên, kịch bản này là thứ tôi sử dụng khi không có lựa chọn nào khác để tiếp tục. Thông thường, các bản nâng cấp tự chăm sóc điều này, nhưng khi đến thời điểm này, khi không có gì khác hoạt động, đây có thể là một lựa chọn tốt vì thường sẽ có nhiều hạt nhân sẽ được thiết lập sau khi dọn dẹp. Nếu điều này tốt hay xấu có lẽ là có thể thảo luận.
Tomas Tornevall

0

Đơn giản chỉ cần chạy sudo apt-get -f autoremovegiải quyết vấn đề của tôi.


2
Bạn đã có 100% dung lượng đĩa / sử dụng khởi động chưa?
fosslinux

Nhìn vào lịch sử theo dõi của tôi, nó dường như không. Tái bút: Tôi đang sử dụng xen kẽ Vagrant và hệ thống tệp khởi động của tôi /dev/sda1được gắn kết/
forzagreen

0

Chạy này:

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

Nguồn: Tôi nhận được lỗi này sau khi upgade. xin vui lòng giúp đỡ


sudo dpkg-cấu hình lại - cái này làm gì? Trên Ubuntu 16, tùy chọn chưa biết -a
Shivam Kotwalia

Đối với câu hỏi này, aptsẽ không thể loại bỏ các gói kernel vì quá trình loại bỏ tự tạo các tệp trong /bootđó đã đầy. Đó là lý do apt-get autoremovethất bại. Câu hỏi mà bạn đang tìm kiếm là Askubfox.com/q/142926/158442 , đã có autoremove, được liệt kê.
muru

@muru Tôi vừa đăng nó vì nó đã lừa, đối với tôi: D
Ardi Nusawan

Tôi chắc chắn rằng nó đã làm, điều tôi đang nói là vấn đề của bạn sẽ là câu hỏi khác, không phải câu hỏi này.
muru

@muru oh ok hiểu rồi: D
Ardi Nusawan

0

Tôi đã thấy một vài bài viết về / boot đã đầy chưa được giải quyết bằng cách dpkg thanh lọc các nhân linux cũ, bởi vì apt-get -f cài đặt hoặc apt-get -f autoremov e cài đặt lại các kernel.

Trong trường hợp của tôi, ít nhất, các gói đã ký và thêm cũng cần phải được gỡ bỏ - các hạt nhân là phụ thuộc cho các gói này vì vậy apt đã cài đặt lại chúng. Nói chung, các gói kernel liên quan nên được xóa trước khi gọi 'install'. Nếu bạn đã cố gắng nâng cấp apt-get ngay sau khi xóa, thông báo lỗi sẽ cho biết gói nào có sự phụ thuộc chưa được đáp ứng của kernel mà bạn vừa xóa.

Trong trường hợp của tôi, chiến thuật sau đây có hiệu quả:

#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

Cài đặt công cụ thanh lọc linux như thế này .

Sau đó chạy trong thiết bị đầu cuối:

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

Sau đó tiếp tục loại bỏ hạt nhân

sudo linux-purge --keep 1 --choose

Thêm:

Nếu bạn muốn sử dụng linux-purge để loại bỏ kernel không giám sát thay vì sử dụng các nâng cấp không giám sát cho điều đó, bạn nên vô hiệu hóa loại bỏ những thứ không sử dụng bằng cách chỉnh sửa /etc/apt/apt.conf.d/50unattends-upgrades và thiết lập dịch vụ systemd thi hành

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

bất cứ khi nào bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.