本问题涉及Linux系统运维,特写此文档,方便将来处理类似问题参照,也为后人提供解决方案。
本人才疏学浅,文档难免有错漏与不妥之处,欢迎与本人进行交流。本人主页:http://35.234.31.208
项目硬件涉及若干个Linux工控板,早上到实验室上电后,发现使用Xshell无法连接上其中三块板卡,使用ping命令不通。使用nmap工具扫描目标ip也显示Host Down。于是怀疑是系统出了问题,即使用图形界面登录排查问题。
三块板卡症状相同,先对其中一块进行分析。上电后,设备首先进入GRUB界面。看到有很多GRUB项,共有29个,初步怀疑这可能是问题原因所在。为不同的Ubuntu16.04内核版本以及若干个Memory Check系统。
选择Ubuntu 16.04 4.15.0-112-generic的normal boot后,设备加载到[3.017529] platform serial8250: Resource
字段后,卡住不动。直接断电,再重新上电,再次进入GRUB界面,选择Ubuntu 16.04 4.15.0-112-generic的recovery mode后,设备继续加载,到读取USB设备(具体字段没保存,也忘了)的时候继续卡住不动。只能继续断电,寻找其他的解决方案。
再次重新上电,在GRUB界面选择最下面的Ubuntu 16.04 4.15.0-45-generic的normal boot,设备成功启动进入验证界面。弹出对话框“系统出现问题,是否发送问题报告”,且光标变成叉状。点击“否”后,光标恢复正常,再次弹出对话框“系统出现问题,是否发送问题报告”。于是查看了详细的日志报告。为/boot 目录已写满。
使用df -h
命令查看磁盘使用量,结果为
udev 3.9G 0 3.9G 0% /dev
tmpfs 787M 9.3M 778M 2% /run
/dev/sda5 36G 21G 13G 62% /
tmpfs 3.9G 168K 3.9G 1% /dev/shm
tmpfs 5.0M 8.0K 5.0M 1% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda6 93M 1.6M 85M 2% /d1
/dev/sda10 969M 1.3M 902M 1% /d5
/dev/sda8 380M 2.3M 354M 1% /d3
/dev/sda9 772M 808K 715M 1% /d4
/dev/sda7 190M 1.6M 175M 1% /d2
/dev/sda2 1.9G 1.4G 348M 81% /home
/dev/sda1 464M 453M 0 100% /boot
tmpfs 787M 44K 787M 1% /run/user/1000
overlay 36G 21G 13G 62% /var/lib/docker/overlay2/4bb03fc3532859aba272a19f7dc196a7cb78895e390b7b68a23611c5746643c4/merged
shm 64M 0 64M 0% /var/lib/docker/containers/5b4633ddc35f1caf1cf82532dbf4be70a589430104a2605ab3de4b74821385ca/mounts/shm
overlay 36G 21G 13G 62% /var/lib/docker/overlay2/e4412fc8db8bdf88265cfaa376f2f2793f04f216a04f9096ea35ccdaf012dbe2/merged
shm 64M 0 64M 0% /var/lib/docker/containers/969882567b3b87403667ec094723972a26e52e4cfafe9f2572d61224fa4a4d17/mounts/shm
tmpfs 787M 0 787M 0% /run/user/0
于是想到今天同时三块板卡出现了该情况,原因可能是系统自动更新内核开启,且/boot目录分配空间过少,导致该目录写满报错。在图形界面下查看右上角齿轮图标,选择“设置”->“软件与更新”选项,确认了系统的确启用了自动更新,且频率为每天,这使我倒吸一口冷气,在追求极致稳定性的生产环境下自动更新是绝对不允许的。经查阅资料,可以在控制台修改自动更新选项:
使用vim /etc/apt/apt.conf.d/10periodic
指令进入配置文件修改界面
默认配置文件为:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
将其修改为
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
可取消自动更新。
接下来处理无法新版本内核自动启动且/boot目录写满的问题。想到一个可行的解决方案:配置/etc/default/grub的启动项,将其设置为老版内核版本,同时删掉/boot目录下新版内核的内容。在/boot目录下使用指令ll
,查看到为以下内容:
root@pc-desktop:/boot# ll
总用量 454080
drwxr-xr-x 4 root root 3072 7月 28 15:48 ./
drwxr-xr-x 30 root root 4096 7月 26 15:02 ../
-rw-r--r-- 1 root root 217457 5月 11 22:08 config-4.15.0-101-generic
-rw-r--r-- 1 root root 217481 6月 5 00:56 config-4.15.0-106-generic
-rw-r--r-- 1 root root 217481 6月 12 13:11 config-4.15.0-107-generic
-rw-r--r-- 1 root root 217481 7月 10 13:51 config-4.15.0-112-generic
-rw-r--r-- 1 root root 217027 1月 30 2019 config-4.15.0-45-generic
-rw-r--r-- 1 root root 217468 11月 27 2019 config-4.15.0-72-generic
-rw-r--r-- 1 root root 217503 12月 18 2019 config-4.15.0-74-generic
-rw-r--r-- 1 root root 217503 2月 12 2020 config-4.15.0-88-generic
-rw-r--r-- 1 root root 217465 2月 29 01:24 config-4.15.0-91-generic
-rw-r--r-- 1 root root 217465 4月 1 13:44 config-4.15.0-96-generic
-rw-r--r-- 1 root root 217466 4月 23 10:36 config-4.15.0-99-generic
drwxr-xr-x 5 root root 1024 4月 15 08:54 grub/
-rw-r--r-- 1 root root 55855274 12月 17 2019 initrd.img-4.15.0-45-generic
-rw-r--r-- 1 root root 55894198 12月 17 2019 initrd.img-4.15.0-72-generic
-rw-r--r-- 1 root root 55898990 3月 6 09:47 initrd.img-4.15.0-74-generic
-rw-r--r-- 1 root root 55909404 3月 6 09:48 initrd.img-4.15.0-88-generic
-rw-r--r-- 1 root root 55909376 3月 27 09:49 initrd.img-4.15.0-91-generic
-rw-r--r-- 1 root root 55902357 4月 15 08:54 initrd.img-4.15.0-96-generic
drwx------ 2 root root 12288 8月 5 2019 lost+found/
-rw-r--r-- 1 root root 182704 1月 28 2016 memtest86+.bin
-rw-r--r-- 1 root root 184380 1月 28 2016 memtest86+.elf
-rw-r--r-- 1 root root 184840 1月 28 2016 memtest86+_multiboot.bin
-rw------- 1 root root 4070409 5月 11 22:08 System.map-4.15.0-101-generic
-rw------- 1 root root 4071267 6月 5 00:56 System.map-4.15.0-106-generic
-rw------- 1 root root 4071450 6月 12 13:11 System.map-4.15.0-107-generic
-rw------- 1 root root 4071496 7月 10 13:51 System.map-4.15.0-112-generic
-rw------- 1 root root 4048670 1月 30 2019 System.map-4.15.0-45-generic
-rw------- 1 root root 4064436 11月 27 2019 System.map-4.15.0-72-generic
-rw------- 1 root root 4066237 12月 18 2019 System.map-4.15.0-74-generic
-rw------- 1 root root 4067466 2月 12 2020 System.map-4.15.0-88-generic
-rw------- 1 root root 4067536 2月 29 01:24 System.map-4.15.0-91-generic
-rw------- 1 root root 4068326 4月 1 13:44 System.map-4.15.0-96-generic
-rw------- 1 root root 4069610 4月 23 10:36 System.map-4.15.0-99-generic
-rw------- 1 root root 8200672 5月 13 04:13 vmlinuz-4.15.0-101-generic
-rw------- 1 root root 8199584 6月 10 01:54 vmlinuz-4.15.0-106-generic
-rw------- 1 root root 8198944 6月 13 22:08 vmlinuz-4.15.0-107-generic
-rw-r--r-- 1 root root 8128088 8月 5 2019 vmlinuz-4.15.0-45-generic
-rw------- 1 root root 8185592 11月 27 2019 vmlinuz-4.15.0-72-generic
-rw------- 1 root root 8187192 12月 19 2019 vmlinuz-4.15.0-74-generic
-rw------- 1 root root 8193496 2月 12 2020 vmlinuz-4.15.0-88-generic
-rw------- 1 root root 8193432 3月 1 18:28 vmlinuz-4.15.0-91-generic
-rw------- 1 root root 8191544 4月 7 00:08 vmlinuz-4.15.0-96-generic
-rw------- 1 root root 8202744 4月 29 02:14 vmlinuz-4.15.0-99-generic
于是使用简单的rm命令分辨删除config文件,initrd.img文件,System.map文件和vmlinuz文件。(注意千万别删除了自己想保留的版本,否则只能重装系统了)
再使用grep menuentry /boot/grub/grub.cfg
指令来查看可使用的启动项,
输出如下:
root@pc-desktop:/boot# grep menuentry /boot/grub/grub.cfg
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
submenu 'Ubuntu 高级选项' $menuentry_id_option 'gnulinux-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu,Linux 4.15.0-96-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-96-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-96-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-96-generic-init-upstart-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-96-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-96-generic-recovery-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu,Linux 4.15.0-91-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-91-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-91-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-91-generic-init-upstart-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-91-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-91-generic-recovery-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu,Linux 4.15.0-88-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-88-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-88-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-88-generic-init-upstart-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-88-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-88-generic-recovery-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu,Linux 4.15.0-74-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-74-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-74-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-74-generic-init-upstart-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-74-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-74-generic-recovery-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu,Linux 4.15.0-72-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-72-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-72-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-72-generic-init-upstart-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-72-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-72-generic-recovery-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu,Linux 4.15.0-45-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-45-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-45-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-45-generic-init-upstart-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Ubuntu, with Linux 4.15.0-45-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-45-generic-recovery-b475d3af-b5ea-4caf-a539-b5b1778920fa' {
menuentry 'Memory test (memtest86+)' {
menuentry 'Memory test (memtest86+, serial console 115200)' {
将/etc/default/grub
下的GRUB_DEFAULT=0
修改为: GRUB_DEFAULT='gnulinux-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa>gnulinux-4.15.0-45-generic-advanced-b475d3af-b5ea-4caf-a539-b5b1778920fa'
其格式为GRUB_DEFAULT='%Ubuntu高级选项上一行的带uuid的内核序列号的字段内容>%下面menuentry表内欲设置启动的ubuntu内核版本带uuid的内核序列号的字段内容'
然后使用指令update-grub
指令来更新最新的grub配置。
重启动发现系统正常启动