弄一台Ubuntu内网服务器,要跑一些服务,为了可用性,准备组RAID1。
安装
- 官网下载镜像,然后使用rufus制作启动盘。这里有个坑,不能使用rufus4.0,否则会报错。22.04需要使用rufus-3.22
- 设置u盘启动,启动主机进入安装程序。一路默认直到Storage Configuration。
- 我的主机只有两块硬盘,因此其中一个硬盘上需要有启动分区,这样也能组RAID 1。但是如果有启动分区的硬盘坏了,就不能启动了。所以目前的方案是两块硬盘都划分启动分区,其中一个是备用分区。另外我还划分了16G的交换区。将两块硬盘剩余空间划分出来,注意不要选择分区类型。
- 然后创建RAID1,选择两块硬盘的第三分区。
- 继续装系统。
安装完成后,可以看一下RAID的情况:
$ mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Tue May 30 08:58:17 2023
Raid Level : raid1
Array Size : 958801920 (914.38 GiB 981.81 GB)
Used Dev Size : 958801920 (914.38 GiB 981.81 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Tue May 30 09:37:51 2023
State : clean, resyncing
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : bitmap
Resync Status : 19% complete
Name : ubuntu-server:0
UUID : e4d05f4d:775b614e:7bcb35f0:20570b97
Events : 1672
Number Major Minor RaidDevice State
0 8 19 0 active sync /dev/sdb3
1 8 3 1 active sync /dev/sda3
RAID1成功,使用了sdb3和sda3
同步启动分区
以上安装完成之后,虽然两块硬盘都有启动分区,但只有一个启动分区是实际有作用的。我们需要将实际使用的启动分区的内容复制到另一个硬盘的备用分区上。
- 看一下硬盘分区情况
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 1G 0 part
├─sda2 8:2 0 16G 0 part [SWAP]
└─sda3 8:3 0 914.5G 0 part
└─md0 9:0 0 914.4G 0 raid1
└─md0p1 259:0 0 914.4G 0 part /
sdb 8:16 0 931.5G 0 disk
├─sdb1 8:17 0 1G 0 part /boot/efi
├─sdb2 8:18 0 16G 0 part [SWAP]
└─sdb3 8:19 0 914.5G 0 part
└─md0 9:0 0 914.4G 0 raid1
└─md0p1 259:0 0 914.4G 0 part /
可以看到,我有两块硬盘sda和sdb。每块硬盘上都有3个分区1,2,3。
sda1和sdb1就是启动分区,大小为1G。
sda2和sdb2是SWAP,大小为16G(和内存一样大)
sda3和sdb3就是组RAID1的分区了,他们组成了md0的p1分区。
- 确认一下当前boot分区
$ mount | grep boot
/dev/sdb1 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
没问题,和上面一样的。目前使用的是sdb1作为启动分区。
- 将sdb1复制到sda1
$ dd if=/dev/sdb1 of=/dev/sda1
这样sdb1就和sda1的内容完全一样了。注意这个命令比较危险,所以一定要经过上面的步骤确认,哪个是正在使用的启动分区,哪个是之前创建的备用启动分区。如果弄反了就坏了。
经过这个步骤,我们两个硬盘上都有有效的ESP了,都可以用来启动。但是我们还是要检查一下引导表。
- 首先显示所有分区的UUID,方便我们后面查看。
$ ls -la /dev/disk/by-partuuid/
total 0
drwxr-xr-x 2 root root 180 May 30 09:48 .
drwxr-xr-x 7 root root 140 May 30 09:24 ..
lrwxrwxrwx 1 root root 10 May 30 09:25 07d56e25-b13e-4864-bb59-493dc97243b8 -> ../../sdb3
lrwxrwxrwx 1 root root 10 May 30 09:25 19c9c16e-b2c0-4c89-9e81-b9dfb7e47f7f -> ../../sda3
lrwxrwxrwx 1 root root 11 May 30 09:25 2223f78b-ec95-469a-bd7d-4bc3c9b2c54c -> ../../md0p1
lrwxrwxrwx 1 root root 10 May 30 09:25 26901ebe-32cf-4562-b990-1fbf6cbd018a -> ../../sda2
lrwxrwxrwx 1 root root 10 May 30 09:25 35d376bb-eb7f-4052-b4eb-f1487c3d1be1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 May 30 09:25 5e434415-9273-4755-9a12-44a510007c03 -> ../../sdb2
lrwxrwxrwx 1 root root 10 May 30 09:48 8af85ef0-7207-4b19-aa81-cc62320db63a -> ../../sda1
- 使用efibootmgr查看引导信息
efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0004,0001
Boot0000* ubuntu HD(1,GPT,35d376bb-eb7f-4052-b4eb-f1487c3d1be1,0x800,0x200000)/File(\EFI\UBUNTU\SHIMX64.EFI)
Boot0001* Hard Drive BBS(HD,,0x0)..GO..NO........o.W.D.C. .W.D.1.0.J.P.L.X.-.0.0.M.B.P.T.0....................A...........................>..Gd-.;.A..MQ..L. . . . . . .R.J.0.1.0.0.M.4.J.3.Y.L.F.A........BO..NO........o.H.G.S.T. .H.T.S.7.2.1.0.1.0.A.9.E.6.3.0....................A...........................>..Gd-.;.A..MQ..L. . . . . . .R.J.0.1.0.0.3.D.J.0.H.0.E.Z........BO
Boot0004* ubuntu HD(1,GPT,8af85ef0-7207-4b19-aa81-cc62320db63a,0x800,0x200000)/File(\EFI\UBUNTU\SHIMX64.EFI)
看到了吗,这儿有两个ubuntu条目,对照一下之前查看的UUID,确认分别是sda1和sdb1。如果缺少条目,需要添加该条目。
比如sda1(8af85ef0开头的)不存在,则执行:
$ sudo efibootmgr --create --disk /dev/sda --part 1 --label "ubuntu" --loader "\EFI\ubuntu\shimx64.efi"
大功告成,两个硬盘可以随便拆下一个,另外一个都可以正常启动,且正常使用了。
更换新硬盘
如果硬盘坏了一个,需要更换新硬盘。操作如下:
- 首先,找到新的硬盘
$ sudo fdisk -l
假设新硬盘为/dev/sdb,而没有坏的那块是 /dev/sda。那么我们需要将分区表从/dev/sda复制到/dev/sdb。
- 为了方便,设置两个变量:
$ source=/dev/sda
$ dest=/dev/sdb
- 安全起见,备份一下分区表
$ sudo sgdisk --backup=backup-$(basename $source).sgdisk $source
$ sudo sgdisk --backup=backup-$(basename $dest).sgdisk $dest
- 创建源分区表的副本,并且为新驱动器生成新的UUID:
$ sudo sgdisk --replicate=$dest $source
$ sudo sgdisk -G $dest
- 开始同步raid, 将下面的X替换成正确的分区(我这儿是3,见上面的分区情况)
$ sudo mdadm --manage /dev/md0 -a $(echo "$dest"X)
- 现在开始复制ESP(用正确的分区替换X,我这儿是1)
$ sudo dd if=$(echo "$source"X) of=$(echo "$dest"X)
- 列出驱动器的UUID:
$ ls -la /dev/disk/by-partuuid/
- 显示引导记录:
$ efibootmgr -v
记下引导顺序,以防你想修改它。
- 修复引导记录:
如果任意一个ubuntu条目指向的UUID不存在(属于坏掉的硬盘),可以删除这个条目(XXXX代表UUID):
$ sudo efibootmgr -B -b XXXX
同样,如果缺少条目,可以手动添加:
$ sudo efibootmgr --create --disk /dev/sdX --part 1 --label "ubuntu" --loader "\EFI\ubuntu\shimx64.efi"
- 最后,验证一下结果是否正确:
$ efibootmgr -v
文章评论