我有一台典型的小型办公服务器,其中有两块硬盘配置为 RAID-1(镜像)。每块硬盘有多个分区:一个用于交换,其他分区配对成多个 /dev/mdX 阵列。
每隔几年,就会有一个磁盘坏掉并被替换。替换过程通常如下:
# copy partition table from the remaining good disk to the empty replacement disk
# (instead of /dev/good_disk and /dev/new_disk I use /dev/sda and /dev/sdb, as appropriate)
sfdisk -d /dev/good_disk | sfdisk /dev/new_disk
# install boot loader
grub-install /dev/new_disk
# create swap partition reusing the same UUID, so I don't need to edit /etc/fstab
mkswap /dev/new_disk1 -U xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# hot-add the new partitions to my RAID arrays
mdadm /dev/md0 -a /dev/new_disk2
mdadm /dev/md1 -a /dev/new_disk5
mdadm /dev/md2 -a /dev/new_disk6
mdadm /dev/md3 -a /dev/new_disk7
mdadm /dev/md4 -a /dev/new_disk8
这些磁盘最初是在 2009 年使用 cfdisk 进行分区的,因此分区表传统上与柱面边界对齐(255 个磁头 * 63 个扇区)。这不是新的 4K 扇区驱动器的最佳配置。
我的问题是:如何为新磁盘创建一组分区并确保它们正确对齐,并具有适合我的 RAID 阵列的正确大小(我认为向上舍入是可以接受的,但向下舍入肯定不行)?
答案1
我今天必须更换我的一个阵列中的镜像,我选择使用 fdisk 替换,而不是使用 sfdisk。因为我知道分区大小(在我的情况下只有一个),所以我选择了更大的驱动器进行替换。
原始是一对ST31500341AS的RAID1,替换磁盘是ST2000DL003。
因此,我所做的是:
mdadm /dev/md6 --fail /dev/sde1
mdadm /dev/md6 --remove /dev/sde1
- 替换 /dev/sde
fdisk /dev/sde
- C
- 你
- n
- 页
- 1
- 输入(2048)
- 3907028736
- 吨
- 自由度
- 瓦
这将产生一个新分区,其起始位置为 2048,结束位置为
3907029167 - 共 1953513560 个块(或 4k 块中的 244189195 个块),3907028904 - 共 1953513428 个块(4k 块中的 244189178 个块)。旧分区起始位置为 63,结束位置为 2930272064,共 1465136001 个块。我认为 lvm 会负责与空间对齐,因此一切都应该很好。忘记了我不能一直走到磁盘末尾,否则 mdadm 将在重启时切换为使用整个磁盘而不是分区。LVM 似乎可以容忍这种转变,但将文件系统直接放到 MD 上却不行。建议将分区缩短至少 256 个扇区,所以我输入了 (3907029167-256)/8*8
bc
得到 3907028904。结果分区是 mod 8 == 0,短了 263 个扇区。当我对另一个阵列执行此操作时,我遇到了这个问题 :(mdadm /dev/md6 --add /dev/sde1
观察阵列重建。重建速度似乎相当快,似乎比旧驱动器重建速度更快。
然后删除并重新添加另一侧,以便超级块匹配。
答案2
我将发布我的解决方案,但令我非常不满意的是:
sfdisk -d /dev/good_disk > /root/part.txt
vi /root/part.txt
增加分区起始数字,直到它们都是 8 的倍数(8 个 512 字节扇区 = 4K)。
增加扩展分区的大小,直到它覆盖整个新磁盘(新磁盘为 1 TB,而旧磁盘为 500 GB——当另一个磁盘损坏并被替换时,我将能够在剩余的可用空间中创建一个新的 RAID 阵列。)
sfdisk /dev/new_disk < /root/part.txt -L
(这-L
使得它接受未与柱面边界对齐的分区,否则 sfdisk 将中止而不进行任何更改)。
我不喜欢它,因为它容易出错而且很乏味。
答案3
正如您所说,您可以将其对齐为 8 的倍数,并且可以使用 GNU parted 执行此操作,但容易出错。我假设 /dev/sda 是旧的好磁盘,而 /dev/sdb 将是具有 4k 扇区大小的新磁盘。
sudo parted /dev/sda unit s print
写下分区大小。然后将其四舍五入为 8。我们在这里使用四舍五入的数字。
sudo parted --align minimal /dev/sdb
unit s
print
mktable msdos
mkpart primary 64s <64+sda1-1>s
align-check minimal 1
mkpart primary <64+sda1>s <64+sda1+sda2-1>s
align-check minimal 2
mkpart primary <64+sda1+sda2>s <64+sda1+sda2+sda3-1>s
align-check minimal 3
等等
如果您有超过 4 个分区,则必须将第四个分区设置为“扩展”,并将其余分区定义为“逻辑”。
使用标签 raid 标记您的 raid 分区
toggle 1 raid
toggle 2 raid
等等
print
quit