迁移系统至软RAID阵列

  背景故事:去年装R7515的时候使用的是1块512GB的英睿达MX500作为系统盘,另一块512GB的英睿达MX500作为虚拟机的数据盘。原先设想后续改造将两块MX500改成RAID1阵列作为系统盘,另外再购置大容量数据盘。不料618致钛7100价格太美丽,一口气入了4块2TB,挑了2块不同批次的组RAID1,用于系统盘+数据盘,另外2块专门作为数据库或云游戏的高性能存储。所以目标就是将单块MX500上的系统迁移的MD软RAID阵列上。

整体规划

  • 请一定注意你知道每条命令在干什么,数据不是儿戏!
  • EFI分区放在阵列中也是可行的,但是我并没有使用
  • EFI分区都同步到两个硬盘,这样挂掉任何一块,都还能引导
  • 拆分卡上面的顺序标号和系统里看到的是相反的,但是在iDRAC中看到又相同
1
2
3
4
5
6
7
8
9
10
11
lsblk
# 旧硬盘结构
sda 259:0 0 465.8G 0 disk
├─sda1 259:1 0 512M 0 part
└─sda2 259:8 0 465.3G 0 part
├─pve-swap 253:5 0 16G 0 lvm [SWAP]
├─pve-root 253:6 0 96G 0 lvm /
├─pve-data_tmeta 253:7 0 3.4G 0 lvm
│ └─pve-data 253:9 0 330.5G 0 lvm
└─pve-data_tdata 253:8 0 330.5G 0 lvm
└─pve-data 253:9 0 330.5G 0 lvm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
lsblk
# 新硬盘结构
nvme0n1 259:0 0 1.9T 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /boot/efi
└─nvme0n1p2 259:2 0 1.8T 0 part
└─md127 9:127 0 1.8T 0 raid1
└─md127p1 259:8 0 1.8T 0 part
├─pve-swap 253:5 0 16G 0 lvm [SWAP]
├─pve-root 253:6 0 96G 0 lvm /
├─pve-data_tmeta 253:7 0 3.4G 0 lvm
│ └─pve-data 253:9 0 330.5G 0 lvm
└─pve-data_tdata 253:8 0 330.5G 0 lvm
└─pve-data 253:9 0 330.5G 0 lvm
nvme1n1 259:3 0 1.9T 0 disk
├─nvme1n1p1 259:5 0 512M 0 part
└─nvme1n1p2 259:6 0 1.8T 0 part
└─md127 9:127 0 1.8T 0 raid1
└─md127p1 259:8 0 1.8T 0 part
├─pve-swap 253:5 0 16G 0 lvm [SWAP]
├─pve-root 253:6 0 96G 0 lvm /
├─pve-data_tmeta 253:7 0 3.4G 0 lvm
│ └─pve-data 253:9 0 330.5G 0 lvm
└─pve-data_tdata 253:8 0 330.5G 0 lvm
└─pve-data 253:9 0 330.5G 0 lvm

硬件安装

  拆分卡地址就不贴了,支持PCIe 4.0的,吳真从来不拐弯抹角,但是我好像买贵了好多,就请直接按图搜吧。屁股后面还有4个指示灯,标识对应硬盘是否在线.

BIOS设置

  • NVMe Settings -> BIOS NVMe Driver:选择All Drives
  • Integrated Devices -> Slot Bifurcation
    • Auto Discovery Bifurcation Settings:选择Manual Bifurcation Control
    • Slot 4 Bifurcation:选择x4 Bifurcation,因为只有这个槽支持PCIe 4.0

实施

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 为新硬盘分区
# 关机重启进入Live CD模式,Ubuntu即可
sudo -i

fdisk /dev/nvme0n1
g # 新建GPT分区表
n # 新建分区
# 直接回车,默认分区1
# 直接回车,默认起始位置2048
+1048575 # 分区大小,自行调整,和原来一样为512M
n # 新建分区
# 直接回车,默认分区2
# 直接回车,紧接着分区1
+3879731199 # 分区大小,这个数据的解释见后问
t # 修改分区类型
1 # 修改分区1类型
uefi # 分区1设置为UEFI分区
t
2
raid # 分区2设置为RAID分区
p # 查看下最终效果
w # 保存分区表

# 第2块硬盘执行相同操作
fdisk /dev/nvme1n1

关于分区2的大小,3879731199,考虑到若阵列中某块物理硬盘损坏,更换的新硬盘大小和原始大小不同,因此应尽量不使用全部的硬盘空间作为分区,而是选择一个略微小一点的大小。这里的取值为,按照硬盘标定容量2 * 10^12计算,-512MB EFI分区,大约1862GB左右,向下取整到1850GB,每个扇区为512B,折合3879731200扇区。

1
2
3
4
5
6
7
8
9
# 建立MD软RAID阵列
apt update && apt install mdadm
mdadm --create /dev/md0 --name system --level=mirror --raid-devices=2 /dev/nvme0n1p2 /dev/nvme1n1p2
cat /proc/mdstat # 应该能观察到已开始重建

# 加快重建速度
echo 6000000 > /proc/sys/dev/raid/speed_limit_min
echo 6000000 > /proc/sys/dev/raid/speed_limit_max
cat /proc/mdstat # 应该能观察到重建速度加快
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 同步数据
# 同步EFI分区
dd if=/dev/sda2 of=/dev/nvme0n1p1
dd if=/dev/sda2 of=/dev/nvme1n1p1 #这个其实可有可无

# 为MD阵列分区
fdisk /dev/md0
g
n
# 直接回车
# 直接回车
# 直接回车,阵列直接用全部空间就好
t
1
lvm
p
w

# 同步LVM分区
dd if=/dev/sda3 of=/dev/md0p1 bs=64M # batch size调大点,速度可以快很多
# 可以再开一个窗口观察进度
apt update && apt install libncurses6
# 不知道为什么apt找不到progress,可以去https://pkgs.org/download/progress找
wget http://archive.ubuntu.com/ubuntu/pool/universe/p/progress/progress_0.16-1_amd64.deb
dpkg -i progress_0.16-1_amd64.deb
progress -m # 观察dd进度及速度

  这一步很重要,关机将原硬盘拔掉,然后重新进入Live CD模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apt update && apt install mdadm
mdadm --assemble /dev/md0 /dev/nvme0n1p2 /dev/nvme1n1p2 # 重建MD阵列

# 重新安装grub
mkdir /mnt/root
mount /dev/mapper/pve-root /mnt/root
mount /dev/nvme0n1p1 /mnt/root/boot/efi/
mount --bind /proc/ /mnt/root/proc/
mount --bind /sys/ /mnt/root/sys/
mount --bind /run/ /mnt/root/run/
mount --bind /dev/ /mnt/root/dev/
chroot /mnt/root
apt update && apt install mdadm # 如果原来系统里没装md

grub-install --efi-directory=/boot/efi --recheck
update-grub
# 确保grub.cfg中已加载RAID模块
cat /boot/grub/grub.cfg | grep "insmod mdraid1x"

  关机重启,理论上应该能够自动进入系统,R7515记得选择PCIe SSD in Slot 4: proxmox。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 分区扩容
lvm

pvdisplay # 查看PV情况
pvresize /dev/md127p1 # 扩容PV
pvdisplay

vgdisplay # 查看VG情况,应该已经自动扩容

lvextend -l +100%FREE /dev/pve/data # 扩容LV
lvdisplay # 查看LV情况,应该已扩容

# 若果你扩容的分区存在文件系统,那么还需要resize2fs或xfs_growfs等命令扩容文件系统