1. 程式人生 > >ubuntu由於/boot空間不足導致升級失敗解決辦法

ubuntu由於/boot空間不足導致升級失敗解決辦法

問題描述

很多人可能像我一樣,預設允許ubuntu自動升級,一般來說是不會出現問題的。

但linux核心的升級一般來說都是升級到/boot下的,/boot多數的使用者設定的都不太大,大概200M左右,而一次升級核心大概也只會佔用50M左右,這樣,每次升級如果都成功,那麼只需要定期清理已經不打算使用的核心即可。

但是,如果事情都這麼順利的話也就不會有這篇部落格產生了,我們做一個簡單的設想(其實就發生在我身上…),假如你某次升級的過程中發生了錯誤,沒能成功的升級到新核心,這樣你的/boot下就會有這樣一些東西:
1. 已經不打算使用的舊核心。
2. 正在使用的中間核心。
3. 比當前正在使用的版本更高的核心。

那麼之後的升級就可能因為這個錯誤而無法升級,這裡我們簡單的據一個例子,假如說你生在升級63的時候出錯,那麼此時你的系統內就可能會有一下幾個核心,61, 62 63, 64,而且還有可能在後續升級中繼續出錯,導致你使用的是62,而實際該升級66,我這裡遇到的就是這種情況。

此時,若66因為磁碟不足再次升級失敗。
那麼尷尬了,你在執行sudo apt-get autoremove的時候很可能會遇到報錯,說linux-image-extra-x.x.x-66-generic依賴linux-image-x.x.x-66-generic,而linux-image-x.x.x-66-generic

不存在,讓你使用sudo apt-get -f install解決依賴關係,而當你執行sudo apt-get -f install時,又發現/boot空間不足。

這時,就會發生這樣尷尬的情況,解除安裝的時候卸不掉,安裝新的又安裝不上,搞得頭都大了,直想重做系統。

綜上,就是我寫這篇博文時遇到的情形。

解決辦法

其實,ubuntu的報錯已經把問題說的很明確了,只不過可能是中間依賴關係的限制過於強大,導致可能相關不大的軟體也無法解除安裝,而想要把新核心安裝時,磁碟又確確實實的沒有空間安裝,這就是上面的問題。

那麼解決這個問題就有兩種思路:

一種是如果讓這種依賴關係不阻礙其他軟體的解除安裝,從而達到將不需要的核心解除安裝,空出部分空間,將新核心安裝並升級。然後將之前所有不需要的核心全部清理掉,就完成任務了。這個方案可以自行百度,但並不推薦這個方法,因為這樣可能會破壞軟體的依賴環境,然後可能又要花費很長時間去解決依賴關係的問題。

另外一種是想辦法讓/boot空間變大,變得足夠升級所需,這裡的方式是將/boot下的所有內容備份到一個足夠大的位置,我們假設/home/xxxx/backup,建議使用rsync這個命令,具體命令如下:
rsync -arv /boot /home/xxxx/backup–這一步如果出錯,後面就不要繼續了,因為備份過程如果失敗,可能會導致中間的檔案不全,依賴關係可能會被破壞。

然後,通過軟連線讓作業系統認為/home/xxxx/backup就是你的/boot,這樣就不會因為升級空間不足而導致升級失敗。具體命令如下:
1.umount /boot–取消當前的/boot的掛載,當然,這需要root許可權

2.rm -rf /boot–取消掛載以後,boot已經沒有掛載到/下了,但資料夾仍然存在,這裡將其刪除。

這兩步結束,後面操作沒有做完的時候千萬不要隨便重啟,因為軟連線在系統正在執行的情況下,作業系統認識,但重新啟動作業系統將核心丟入記憶體的時候,不能保證也認識軟連線,比較嚴重的後果就是可能導致你的電腦無法啟動,可能需要用啟動盤進行修復。

3.ln -s /home/xxxx/backup /boot接下來要做的是告訴作業系統,你的boot實際上是/home/xxxx/backup了。

4.這時,理論上來說,你的空間就足夠了,繼續執行剛才那些因為空間不足而無法操作的命令即可。比如sudo apt-get -f installsudo apt-get autoremovesudo apt-get autocleanauto apt-get updatesudo apt-get upgrade等等。

擴充套件小技巧

這裡有一些從網上整理來的命令方便你在刪除就核心的時候提供一些有用的資訊。
1. sudo dpkg --get-selections | grep linux – 這裡會將你作業系統中安裝一些包含linux的軟體顯示出來,包括一些解除安裝不完全的。
console-setup-linux install
libselinux1:amd64 install
libselinux1:i386 install
linux-base install
linux-firmware install
linux-generic install
linux-headers-4.4.0-66 install
linux-headers-4.4.0-66-generic install
linux-headers-generic install
linux-image-4.4.0-66-generic install
linux-image-extra-4.4.0-66-generic install
linux-image-generic install
linux-libc-dev:amd64 install
linux-sound-base install
pptp-linux install
syslinux install
syslinux-common install
syslinux-legacy install
util-linux install
可以看到,諸如7, 8, 10, 11這些都是核心相關的內容,注意,我這裡顯示的已經清理完畢的,所以只有* 4.4.0-66 * 這幾個檔案,而且這幾個是有關聯性的,在你決定要解除安裝的時候要注意將這些一同解除安裝,避免解除安裝不完全。有時候使用sudo apt-get remove xxxx 解除安裝的軟體會在這裡留下一些殘留,顯示的是deinstall 狀態,可以使用sudo apt-get purge xxxx 來徹底刪除這些殘留。
2. uname -a–可以檢查你當前正在使用的核心版本,注意不要把正在使用的核心版本給解除安裝掉了。。。
3. sudo dpkg -P xxxx 可以使你對核心的解除安裝更乾淨,或者也可以選擇使用sudo apt-get purge xxxx。至於解除安裝的是否乾淨,可以參考第一個小命令。

說明:這裡感謝我的同事,問題是我遇到的,沒有想到合理的解決辦法,是同事給出的解決辦法,我覺得以後可能會經常用到,所以在這裡進行了整理和記錄。