我正在尝试添加两个新驱动器来扩展使用 mdadm v3.4 在使用内核 4.4.6-1 进行 debian 测试时创建的 raid10。问题是我的新驱动器只比用于创建阵列的最小驱动器少了几个扇区。有没有办法在不破坏阵列的情况下缩小分区?
root@debian-nas:~# mdadm /dev/md0 --add /dev/sdb1 /dev/sdd1
mdadm: /dev/sdb1 not large enough to join array
这是数组现在的样子。
root@debian-nas:~# mdadm --detail --verbose /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Sat Mar 26 21:13:23 2016
Raid Level : raid10
Array Size : 5860268032 (5588.79 GiB 6000.91 GB)
Used Dev Size : 2930134016 (2794.39 GiB 3000.46 GB)
Raid Devices : 4
Total Devices : 4
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Sun Mar 27 16:25:22 2016
State : active
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Layout : near=2
Chunk Size : 512K
Name : debian-nas:0 (local to host debian-nas)
UUID : 86266375:bf94ae93:d449a171:aa746159
Events : 13726
Number Major Minor RaidDevice State
0 8 1 0 active sync set-A /dev/sda1
1 8 33 1 active sync set-B /dev/sdc1
2 8 65 2 active sync set-A /dev/sde1
3 8 81 3 active sync set-B /dev/sdf1
我正在尝试将 /dev/sdb1 和 /dev/sdd1 添加到 /dev/md0
root@debian-nas:~# blockdev --report /dev/sda1
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 512 2048 3000591916544 /dev/sda1
root@debian-nas:~# blockdev --report /dev/sdb1
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 4096 2048 3000590934016 /dev/sdb1
root@debian-nas:~# blockdev --report /dev/sdc1
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 4096 2048 3000591450112 /dev/sdc1
root@debian-nas:~# blockdev --report /dev/sdd1
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 4096 2048 3000590934016 /dev/sdd1
root@debian-nas:~# blockdev --report /dev/sde1
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 4096 2048 3000591450112 /dev/sde1
root@debian-nas:~# blockdev --report /dev/sdf1
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 512 2048 3000591916544 /dev/sdf1
我是否最好将数据从阵列中移出,销毁它,然后用较小的分区创建它,以便我可以包含新驱动器?
答案1
如果您不需要分区表/dev/sd[bd]
(基本上,如果您不需要从任一驱动器启动),则可以将整个驱动器添加到阵列中;这应该提供足够的部门:
mdadm /dev/md0 --add /dev/sdb /dev/sdd
或者,您可以在新分区上创建一个新的降级阵列,将数据迁移到该阵列,然后逐步将驱动器从旧阵列移动到新阵列。
答案2
所以我想出了一种方法来做到这一点,使用/dev/sdb1
和/dev/sdd1
,无需重建数组,也不会丢失数据。
这仅适用于现代内核(3.5 或更高版本)和 mdadm 版本 3.3 或更高版本。
卸载阵列。
umount /dev/md0
运行文件系统检查。必须在下一步之前完成。
e2fsck -f /dev/md0
将文件系统大小调整为 5 TB。
resize2fs /dev/md0 5000G
对文件系统运行另一次检查。确保到目前为止我们没有搞砸。
e2fsck -f /dev/md0
将阵列缩小到 5 TB 多一点。这里的大小参数是阵列中每个磁盘上要使用多少空间。这应该是(size of fs / number of mirrors) + some small extra
。就我而言,我将文件系统设置为 5 TB,在 raid 10 中有 4 个磁盘,因此我有 2 个镜像的条带。这必须提供比您的文件系统更大的总大小,否则您将丢失数据。
mdadm --verbose --grow --size=2685403136 /dev/md0 # 2.5TB + 1MB
再次检查文件系统。
e2fsck -f /dev/md0
此时,我们可以将较小的驱动器添加到 raid 10,但首先,进行检查以确保数据良好。不要仅仅依赖于文件系统检查。实际验证一下你的数据是否良好。
现在我们可以添加新驱动器了!
mdadm --add /dev/md0 /dev/sdf1 /dev/sdg1
并增长数组以使用它们。
mdadm --verbose --grow --raid-devices=6 /dev/md0
此时,执行 acat /proc/mdstat
应显示如下内容:
Personalities : [raid6] [raid5] [raid4] [raid0] [raid10]
md0 : active raid10 sdd1[5] sdb1[4] sdf1[3] sde1[2] sdc1[1] sda1[0]
5370806272 blocks super 1.2 512K chunks 2 near-copies [6/6] [UUUUUU]
[>....................] reshape = 2.8% (151477952/5370806272) finish=458.7min speed=189604K/sec
bitmap: 11/31 pages [44KB], 131072KB chunk
unused devices: <none>
重塑完成后进行另一次文件系统检查。 (我很偏执,我会每一步都检查一下。)
e2fsck -f /dev/md0
现在将阵列的大小恢复到驱动器支持的最大值。
mdadm --verbose --grow --size=max /dev/md0
然后调整文件系统的大小。
resize2fs /dev/md0
并再次检查一次。
e2fsck -f /dev/md0
最后,我们可以挂载新扩展的文件系统。
mount /dev/md0 /mnt/raid10