如何使用 mdadm 实用程序在 CentOS/RHEL 7 中对交换、引导和根分区进行镜像

当服务器没有可用的 RAID 控制器卡并且唯一的解决方案是软件 RAID 时,这是必需的。
这篇文章对分区进行了更改,因此如果用于此目的的任何磁盘上有任何现有数据,则应在根据标准最佳实践创建 RAID 数组之前对其进行备份。

  1. 要镜像磁盘,必须获取分区信息。
    这可以通过以下命令之一完成:
# parted /dev/sda u s p
# fdisk -l /dev/sda
  1. 必须使用以下命令克隆分区表:
# sgdisk -R /dev/sdb /dev/sda
  1. 克隆分区后,新驱动器需要一个 GUID:
# sgdisk -G /dev/sdb
  1. 所有要镜像的分区都需要有 RAID 标志:
# parted /dev/sda set  raid on
# parted /dev/sdb set  raid on
# parted /dev/sdb set  raid on
# parted /dev/sdb set  raid on
  1. 在新磁盘的等效引导分区上的新磁盘分区上创建一个新的 RAID 设备(因此,如果 /boot 挂载在 /dev/sda1 上,则在 RAID 设备上它需要在 /dev/sdb1 上)
# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb1 --metadata=1.0

注意:如果元数据不是 1.0,grub 将无法读取它。

  1. 创建与 /boot/efi 分区使用的文件系统相同的文件系统。
    通常,vfat 系统是默认的:
# mkfs.vfat /dev/md1
  1. 必须挂载新的 raid 数组,并且必须复制当前 /boot 分区中的文件:
# mkdir /mnt/md1/efi
# mount /dev/md1 /mnt/md1/efi
# rsync -a /boot/ /mnt/md1/
# sync
# umount /mnt/md1/efi
# rmdir /mnt/md1
  1. 当前的 /boot 分区必须被卸载,新分区必须取而代之:
# umount /boot/efi
# mount /dev/md1 /boot/efi
  1. 为了完成镜像过程,必须将旧磁盘添加到新数组中:
#mdadm /dev/md1 -a /dev/sda1
  1. 可以使用以下命令监控 RAID 状态:
# mdadm -D /dev/md1
  1. 为了从 RAID 磁盘启动,必须编辑 /etc/fstab 文件,但为此需要新设备的 UUID:
# blkid | grep md1
  1. 上一步获得的UUID 必须替换/etc/fstab 中的旧UUID。
    该文件可以使用 vi 进行编辑,最好注释当前行并在下面再次添加它,但当然 UUID 已更改:
# cat /etc/fstab
#UUID=6d36b3b0-0238-4c86-9368-f60b571fbab9 /boot xfs defaults 0 0
UUID="new UUID"                           /boot xfs defaults 0 0
www. On IT Road .com

对于单独分区上而非 LVM 下的 SWAP

1.对于swap,需要创建稍微不同的RAID数组,可以使用以下命令,假设swap在sda3下:

# mdadm --create swap --level=1 --raid-devices=2 missing /dev/sdb3
# mkswap /dev/md/swap
# mdadm /dev/md/swap -a /dev/sda3
  1. 可以使用以下命令监控 RAID 状态:
# mdadm -D /dev/md/swap
  1. 镜像boot、swap和root分区后,需要扫描元数据放在/etc/mdadm.conf文件中
# mdadm --examine --scan >/etc/mdadm.conf
  1. 然后,需要使用 GRUB_CMDLINE_LINUX 行上的新 UUID 更新 /etc/default/grub 文件:

可以使用以下命令获取 UUID:

# mdadm -D /dev/md* | grep UUID

通过添加新条目来编辑 grub 文件:

# vi /etc/default/grub
#GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.md.uuid=first uuid rd.md.uuid=second uuid rd.lvm.lv=ol/root rd.lvm.lv=ol/swap rhgb quiet"
  1. 然后,更新 grub2.cfg 文件:
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  1. 更新 EFI bootmgr。
    为此,必须删除旧的 EFI 引导条目:
# efibootmgr -v | grep Boot

输出(来自虚拟服务器的 efibootmgr 命令示例):

BootCurrent: 0001
BootOrder: 0001,0006,0008,0004,0000,0005
Boot0000* Windows Boot Manager Vendor(99e275e7-75a0-4b37-a2e6-c5385e6c00cb,)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...N...............
Boot0001* Oracle VM Server HD(1,800,3f800,91dfa48e-aad0-4a31-9ffe-e4356d8a36c6)File(\EFI\REDHAT\SHIM.EFI)
Boot0004* Generic Usb Device Vendor(99e275e7-75a0-4b37-a2e6-c5385e6c00cb,)
Boot0005* CD/DVD Device Vendor(99e275e7-75a0-4b37-a2e6-c5385e6c00cb,)
Boot0006* WDC WD10EZEX-08WN4A0 BIOS(2,0,00)..BO
Boot0008* IBA CL Slot 00FE v0113 BIOS(6,0,00)..BO

根据此命令的输出,必须使用以下命令删除 EFI 引导条目:

# efibootmgr -b 1 -B

在这种情况下只有一个条目,其编号为 1.
之后,需要将两个 EFI 分区添加到 bootmgr:

# efibootmgr -c -d /dev/sda -p1 -l \EFI\redhat\shimx64.efi -L "Oracle Linux RAID SDA"
# efibootmgr -c -d /dev/sdb -p1 -l \EFI\redhat\shimx64.efi -L "Oracle Linux RAID SDB"
  1. initramfs 镜像必须使用 mdadmconf 重建:
# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.$(date +%m-%d-%H%M%S).bak
# dracut -f --mdadmconf
  1. 重新启动机器以检查是否一切正常,以及是否正在使用新的 RAID 设备。

对于 LVM 分区(对新设备使用不同的索引)

  1. 必须在与当前索引相同的分区上创建 RAID 设备:
# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb2 --metadata=1.2

注意:metadata 1.2 在磁盘的开头创建了一个保留的元数据区域。
这可能会影响 PV 分配,因此 pvmove 命令可能会遇到错误,该命令将在下一步中使用。
因此,为了绕过此类错误,可以使用元数据 1.0。

  1. 这个新数组需要加入到当前lvm设备所在的同一个卷组中:
# vgextend vgname /dev/md2
  1. 物理盘区需要从旧分区移动到新数组(这需要一些时间才能完成):
# pvmove /dev/sda2 /dev/md2
  1. 之后,必须从卷组和 LVM 中删除旧分区:
# vgreduce vgname /dev/sda2
# pvremove /dev/sda2
  1. 为了不遇到任何与 LVM 相关的错误,必须将 /etc/lvm/lvm.conf 文件中的 use_lvmetad 参数值从 1 更改为 0:
# vi /etc/lvm/lvm.conf
...............
use_lvmetad = 0
...............

然后,需要停止、禁用和屏蔽 lvm2-lvmetad 服务:

# systemctl stop lvm2-lvmetad.service
# systemctl disable lvm2-lvmetad.service --now
# systemctl disable lvm2-lvmetad.socket --now
# systemctl mask lvm2-lvmetad.socket
  1. 为了完成镜像过程,必须将旧分区添加到数组中:
# mdadm /dev/md2 -a /dev/sda2
  1. 可以使用以下命令监控 RAID 状态:
# mdadm -D /dev/md2
日期:2020-09-17 00:12:35 来源:oir作者:oir