今天升级了搬瓦工的一台 VPS 的内核,想升级到最新内核安装 BBR,没想到升级完后启动不了了,进入 VNC 查看,是因为找不到 rootfs,然后选择 Ubuntu 的更多启动项,选择了从一个低版本内核进行启动,进入后看了看发现是因为 /boot 分区被占满,导致之前升级内核操作没能成功。记录一下怎么解决 /boot 分区被占满的问题。
解决步骤
0. 进入/boot 查看所有的版本文件
1. 查看当前使用内核版本号:
uname -a
2. 查看所有的版本:[1]
sudo dpkg --get-selections |grep linux
3. 把标记install的旧的版本都删掉:
sudo apt autoremove linux-headers-4.4.0-xx linux-image-4.4.0-xx-generic
注:这里的 linux-headers-4.4.0-xx-generic linux-image-extra-4.4.0-xx-generic 两个文件不需要写,会顺带被删除.
4. 再次运行步骤2命令,如果有标记为deinstall的内核文件,参考下面进行删除。[2]
sudo dpkg -P linux-image-3.5.0-4[2-9]-generic sudo dpkg -P linux-image-3.5.0-51-generic
这样就可以清理干净boot空间和旧的内核了。
5. 再检查/boot/下是否还存在对应旧版本文件
这时候多余的旧版本的各种文件都已经没有了。如果还有,可能会多出来一个 initrd.img-xxxxxxxxx-generic。千万不要再删除了!
如果误删,可能导致重启后无法正常进入系统。例如出现:
a. 大写锁定键一直闪烁,停留在空白(Ubuntu紫色)纯屏页面。
b. 或者黑屏终端,一堆代码,最后是 end Kernel panic xxxxxxxxxxxxxxxx
原因:”ubuntu升级的时候默认会保留多个内核,启动的时候选择旧的内核启动。如果只有一个内核的化,进恢复模式“[3]
解决方案:
这时候强制关机,不选第一项 Ubuntu 启动,而是选择下面的其他选项,然后选个低版本内核启动。
进入系统后,再 sudo apt-get upgrade一下,再查看 /boot,你会发现刚才删除的 initrd.img-xxxxxxxxx-generic 又回来了。问题解决。
sudo apt-get purge xxx
注意只需要删除 linux-image-4.4.0-66-generic这个格式的文件,就会同时删除linux-image-extra-4.4.0-66-generic文件。
只需要删除linux-headers-4.4.0-62这个格式的文件,就会同时删除linux-headers-4.4.0-62-generic 的文件。
这一步必须在boot空间释放后才可以,否则可能会因为boot没有足够空间而遇到错误。
其他的可能用到的老笨步骤
cd /boot 进入后,删除除这个版本号外的其他版本的 config-xxx,vmlinuz initrd,abi and System.map 等所有文件。个人建议如果boot空间很小的话,把高于当前使用内核版本的也删除掉,因为那些对应的文件虽然在 /boot 下,但是其实这个高的内核并没有安装完全(应该是之前旧版本太多,导致装更加新的版本时,装到一半 boot 满了,导致部分高版本相应的文件已经复制到 boot 下没能删除)。
只保留 uname -a 显示出来的使用版本的所有文件就好。
sudo rm xxx 删除后,
df -h 可以查看boot分区的空间已经不是全满,释放了很多。
参考文献
- http://blog.sciencenet.cn/blog-506416-1040221.html