在替换磁盘上创建正确对齐的分区

在替换磁盘上创建正确对齐的分区

我有一台典型的小型办公服务器,其中有两块硬盘配置为 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。

因此,我所做的是:

  1. mdadm /dev/md6 --fail /dev/sde1
  2. mdadm /dev/md6 --remove /dev/sde1
  3. 替换 /dev/sde
  4. fdisk /dev/sde

    1. C
    2. n
    3. 1
    4. 输入(2048)
    5. 3907028736
    6. 自由度

    这将产生一个新分区,其起始位置为 2048,结束位置为3907029167 - 共 1953513560 个块(或 4k 块中的 244189195 个块), 3907028904 - 共 1953513428 个块(4k 块中的 244189178 个块)。旧分区起始位置为 63,结束位置为 2930272064,共 1465136001 个块。我认为 lvm 会负责与空间对齐,因此一切都应该很好。

    忘记了我不能一直走到磁盘末尾,否则 mdadm 将在重启时切换为使用整个磁盘而不是分区。LVM 似乎可以容忍这种转变,但将文件系统直接放到 MD 上却不行。建议将分区缩短至少 256 个扇区,所以我输入了 (3907029167-256)/8*8bc得到 3907028904。结果分区是 mod 8 == 0,短了 263 个扇区。当我对另一个阵列执行此操作时,我遇到了这个问题 :(

  5. mdadm /dev/md6 --add /dev/sde1

  6. 观察阵列重建。重建速度似乎相当快,似乎比旧驱动器重建速度更快。

  7. 然后删除并重新添加另一侧,以便超级块匹配。

答案2

我将发布我的解决方案,但令我非常不满意的是:

  1. sfdisk -d /dev/good_disk > /root/part.txt

  2. vi /root/part.txt

  3. 增加分区起始数字,直到它们都是 8 的倍数(8 个 512 字节扇区 = 4K)。

  4. 增加扩展分区的大小,直到它覆盖整个新磁盘(新磁盘为 1 TB,而旧磁盘为 500 GB——当另一个磁盘损坏并被替换时,我将能够在剩余的可用空间中创建一个新的 RAID 阵列。)

  5. 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

相关内容