由四条内存引起的事故
昨天新买的四条服务器内存到了,于是早上去安装一下。
很不幸的是,关机安装完内存条后,系统起不来。第一反应是内存没有插好。
拔下所有新装的内存,先试试能不能开机,结果不能。
系统一直卡在一个光标闪烁的状态。
由于一直就很想重做这个服务器的系统,当时装的时候,忘记做LVM了,
所以这次故障也懒得修了,直接开始重做系统。
花了2个小时,把基础系统做完,重启了几遍看看有没有什么问题,一切正常。
看到内存插满主板达到256G顶值后,心里美滋滋,心想这下可以大开杀戒了。

结果下午回到家,没安装几个服务,主机就挂了。
由于我的服务器电源连接在米家的电源开关上,所以我进行了远程重新断电上电操作。
通过米家可以看到机器自动启动成功了,但是一直连不上,怕是系统又进不去了。
折腾了半天没有成功后,不得不再回去看看是什么情况。
重新接上显示器后,发现跟早上的情况一个样,目测应该是硬盘有问题。打开 BIOS 看了下,果然

一共三块硬盘,只识别出来了两块,最关键的那块带这 grub 引导的硬盘没有识别出来。
考虑到新系统上了 LVM ,我这块没有识别出来的硬盘(金士顿)和另外一块东芝的做成了一个逻辑组,
所以在考虑能不能把金士顿这块从逻辑组里踢出去。
但是我重启引导进U盘里的系统后,发现并没有金士顿那个硬盘

有点慌!既然系统间歇性能启动起来,那看来硬盘坏的不严重。
估计重启几次,肯定会有一次能挂上。在重启了三四次后,终于检测出来了。

好,既然监测出来了,让我先理顺一下目前的情况。
1.当前是金士顿(/dev/sdb1)和东芝(/dev/sdc1)做了一个逻辑组 /dev/vssd

2.然后在 /dev/vssd 这个逻辑组上划分了两个逻辑卷 /dev/vssd/vboot 和 /dev/vssd/vmain

3.系统有两个分区,/ 挂在 /dev/vssd/vmain 上,/boot 挂在 /dev/vssd/vboot 上。
尝试了挂载 / 和 /boot ,发现 / 挂载成功,/boot 挂载失败,提示磁盘有错误。
系统目前不超过 7G 大。

情况理顺完,我们的思路也就有了。
- 把
/dev/vssd/vmain缩小到/dev/sdc1的大小以内, - 从
/dev/vssd中把/dev/vssd/vboot删除, - 把
/dev/sdb1这个pv从/dev/vssd逻辑组中删除,这个时候,逻辑组里就没有金士顿硬盘了, - 在逻辑组
/dev/vssd中再新建一个/dev/vssd/vboot逻辑卷, - 重新调整
/dev/vssd/vmain的大小,让其把剩余所有的空间占有, - 重新挂在
/dev/vssd/vmain和/dev/vssd/vboot,在/dev/vssd/vboot上安装内核, - 重新生成
fstab - 重新安装
Grub到/dev/sdc上,并生成新的grub.cfg存储到/dev/vssd/vboot上。
开始实施。
1.缩小 /dev/vssd/vmain,需要先监测才能缩小
1 | w2fsck -f /dev/vssd/vmain |
执行缩小,由于我的东芝是400多G,那么我只要缩小到400G内就好了,懒得计算,取了个整 300G
1 | # 先缩小文件系统 |
三步操作如下图

2.从 /dev/vssd 中把 /dev/vssd/vboot 删除,
1 | lvremove /dev/vssd/vboot |
3.从逻辑组中移除金士顿硬盘
1 | vgreduce vssd /dev/sdb1 |
操作完可以看到逻辑组(VG)里只有一个 PV 了,并且 VG 的容量跟东芝的硬盘一样大了

4.新建 /dev/vssd/vboot
1 | lvcreate -L 200M vssd -n vboot |
5.扩容 /dev/vssd/vmain
1 | # 注意这里参数是小写L |

6.格式化 /dev/vssd/vboot 后,重新挂载
1 | mkfs.ext2 /dev/vssd/vboot |

重新安装内核
1 | pacstrap /mnt linux linux-firmware |

7.生成新的 fstab
由于 /dev/vssd/vboot 是新创建的,所以原来分区的 UUID 也就不存在了,因此需要更新 fstab,
否则启动的时候会找不到分区。(通过截图可以看到原来的 UUID)
1 | genfstab -U /mnt > /mnt/etc/fstab |

8.重新安装 Grub ,生成新的 grub.cfg
1 | # 进入chroot |

9.所有操作结束后,退出 chroot,卸载所有已挂载分区,重启。