前言
最近打算转用fnOS,发现了几个用着不太满意的点,一部分看看怎么克服,如果不能克服则看看能不能反馈给官方解决。
目前的测试清单:
- 系统盘raid1(本次)
- 通过btrfs文件系统快照实现Windows"过去版本(previous version)"
- 存储空间的导入导出
本篇只是一个探索,或者可行性验证,任何情况下不要用在生产/主力环境!!!
如果没有相关技术基础,请勿尝试模仿!!!
可行性分析
看了一下,fnOS是基于开发的,按理来说把系统装到raid不是问题。
cat /etc/os-release
那能不能在装系统的时候添加grub参数,直接把raid1建出来呢?
看了一下,fnOS装完后对raid的支持是通过grub模块实现的
grep CONFI**D_RAID1 /boot/config-$(uname -r)
CONFI**D_RAID1=m
在安装阶段,grub没有加载mdraid/mdadm相关的模块,也没有mdraid/mdadm相关外围文件手动修改grub.cfg,所以确实在装机阶段认不到软raid。
即使fnOS本身是支持os层面的raid,也没有相关的模块提供驱动上的支撑。
所以只能通过较为不优雅的方式:
硬盘A安装OS -> 硬盘B创建raid -> 把A的数据拷到B -> 更新引导 -> 重启进入raid上的系统 -> 把硬盘A加入B
前期准备
首先,无论是BIOS引导还是EFI引导,我们都要做一些前期准备:
1. 提权,打开ssh
sudo passwd root
su - root
systemctl enable --now ssh.service
2. grub加载raid相关模块
vi /etc/defualt/grub
GRUB_PRELOAD_MODULES="mdraid09 mdraid1x diskfilter lvm"
grub-mkconfig
3. sfdisk复制分区结构
sfdisk -d /dev/sda|sfdisk /dev/sdb
For BIOS 引导
创建raid
mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb2
mkfs.ext4 /dev/md0
mount /dev/md1 /mnt
rsync -avxHAX / /mnt
更新fstab和mdadm.conf
瞄一眼uuid
blkid
vi /mnt/etc/fstab
mdadm --detail --scan | sudo tee /mnt/etc/mdadm/mdadm.conf
更新引导
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
chroot /mnt
mount -t efivarfs efivarfs /sys/firmware/efi/efivars
grub-install /dev/sda
grub-install /dev/sdb
update-grub
reboot
mdadm --add /dev/md0 /dev/sda2
For EFI 引导
EFI的引导比较麻烦,如果fnOS打算搞系统RAID,更简易不对EFI分区进行raid,而是进行failover,这一块涉及的工作量比较大,论证可行性就没做了。
vi /etc/default/grub;GRUB_PRELOAD_MODULES="mdraid1x diskfilter lvm"
update-grub
sfdisk -d /dev/sda | sudo sfdisk /dev/sdb
mdadm --create /dev/md0 --level 1 --raid-devices=2 missing /dev/sdb2
mkfs.ext4 /dev/md0
mount /dev/md0 /mnt;rsync -avxHAX / /mnt
blkid /dev/md0;vi /mnt/etc/fstab
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /dev/pts /mnt/dev/pts
mount --bind /boot/efi /mnt/boot/efi
chroot /mnt
grub-install /dev/sda
grub-install /dev/sdb
grub-update
reboot
df -Th
umount /dev/sda2
mdadm --manage /dev/md127 --add /dev/sda2
cat /proc/mdstat
mount | grep '/boot/efi'
dd if=/dev/sda1 of=/dev/sdb1
efibootmgr -v | grep -i debian
efibootmgr --create --disk /dev/sdb --part 1 --label "debian2" --loader "\\EFI\\debian\\shimx64.efi"
ls -l /dev/disk/by-partuuid/
mdadm --create /dev/md100 --level 1 --raid-disks 2 --metadata 1.0 missing /dev/sdb1
mkfs.fat -F32 /dev/md100
mkdir /tmp/RAID; mount /dev/md100 /tmp/RAID
rsync -av --progress /boot/efi/ /tmp/RAID/
umount /dev/sda1
mdadm --manage /dev/md100 --add /dev/sda1
cat /proc/mdstat
mount -a
vi /etc/fstab
UUID=0B14-8E3E /boot/efi vfat umask=0077 0 1
/dev/md100 /boot/efi vfat umask=0077 0 1
mdadm --detail --scan | grep 100 >> /etc/mdadm/mdadm.conf
cat /proc/mdstat
vi /etc/fstab
/dev/md100 /boot/efi vfat umask=0077 0 1
UUID=0B14-8E3E /boot/efi vfat umask=0077,noauto,defaults 0 0
vi /etc/mdadm/mdadm.conf
ARRAY /dev/md100 metadata=1.0 name=vault:100 UUID=11111111:22222222:3333333:44444444
ARRAY <ignore> /dev/md100 metadata=1.0 name=vault:100 UUID=11111111:22222222:3333333:44444444
touch /etc/systemd/system/mdadm_esp.service
[Unit]
Description=Resync /boot/efi RAID
DefaultDependencies=no
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/sbin/mdadm -A /dev/md100 --uuid=11111111:22222222:3333333:44444444 --update=resync
ExecStart=/bin/mount /boot/efi
RemainAfterExit=yes
[Install]
WantedBy=sysinit.target
systemctl enable mdadm_esp.service
update-initramfs -u
总结
做完raid后fnOS中显示的硬盘类型为未知,操作的时候注意不要把硬盘划到存储空间里,当然理论上会报错device is busy,无法操作成功。


EFI的raid配置会比较麻烦,建议官方做raid支持的时候能够对两个或多个硬盘的efi分区做failover,而非直接raid