我错误地遇到了这个答案,但是如果有人好奇,这是实验支持的答案。
短版
奖励问题:我可以使用md(4)
大小不等的块设备创建RAID阵列吗?是的,但是RAID阵列将具有最小块设备的大小(加上一些内部管理开销)。如果设备大小彼此之间的误差不超过1%,则会收到警告。
问题1:我可以md(4)
将比当前最小成员小的设备添加到现有RAID阵列吗?不,谢谢。mdadm
会拒绝这样做以保护您的数据。
问题2:您可以调整现有md数组的大小吗?是的(请阅读mdadm
手册!),但是这样做可能不值得。您必须备份所有内容,然后重新调整RAID设备的内容大小,然后重新调整设备本身的大小-所有这些都非常容易出错,计算错误以及其他会浪费您数据的事情(痛苦的谈话经验) 。
这不值得冒险和付出。如果您有一个新的空白磁盘,请执行以下操作以调整其大小,并始终保持所有数据的一到两个副本不变(假设您拥有2磁盘RAID1):
md(4)
在上面创建一个新阵列(缺少一个磁盘)。
- 重新创建数组内容的结构(Crypto,LVM,分区表,它们的任意组合,无论浮出水面)。
- 将数据从现有磁盘复制到新磁盘。
- 使用新磁盘重新启动。
- 擦除旧磁盘的分区表(或将
md(4)
超级块清零)。如有必要,请创建所需的分区以匹配新磁盘上的方案。
- 将旧磁盘添加到新阵列。
- 等待阵列成员同步。喝杯咖啡 为此,飞往拉丁美洲,并选择自己的咖啡豆。:)(如果您居住在拉丁美洲,请飞往非洲)。
注意:是的,这与他的答案中描述的技术0xC0000022L相同。
问题3.如果驱动器短1G,该怎么办?:)不用担心。您的替换驱动器可能会更大。实际上,采用上述策略后,每当发生故障时(或更便宜的升级),都可以获得便宜的大型驱动器。您可以逐步升级。
实验证明
实验装置
首先,让我们伪造一些块设备。我们将使用/tmp/sdx
和/tmp/sdy
(每个100M)和/tmp/sdz
(99M)。
cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99 # Here's a smaller one!
sudo losetup -f sdz
这就建立了三个文件三个环回块设备:/dev/loop0
,/dev/loop1
和/dev/loop2
,映射sdx
,sdy
和sdz
分别。让我们检查一下大小:
sudo grep loop[012] /proc/partitions
7 0 102400 loop0
7 1 102400 loop1
7 2 101376 loop2
如预期的那样,我们有两个正好为100M(102400 KiB = 100 MiB)的环路设备和一个99M(恰好是99×1024 1K块)的环路设备。
使用大小相同的设备制作RAID阵列
开始:
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.
检查尺寸:
sudo grep md100 /proc/partitions
9 100 102272 md100
这恰好是我们所期望的:一看mdadm手册,便会提醒我们1.2版元数据占用了128K:128 + 102272 =102400。现在我们将其销毁以准备第二个实验。
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1
利用大小不均的设备制作RAID阵列
这次,我们将使用小型块设备。
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.
好吧,我们被警告了,但是阵列已经制作好了。让我们检查一下大小:
sudo grep md100 /proc/partitions
9 100 101248 md100
我们得到的是101,248个区块。101248 + 128 = 101376 = 99×1024。可用空间是最小设备的空间(加上128K RAID元数据)。让我们在上一个实验中再次将其归结为:
sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2
最后:将较小的设备添加到正在运行的阵列
首先,让我们制作一个仅包含100M磁盘之一的RAID1阵列。阵列将降级,但我们并不在乎。我们只想要一个开始的数组。该missing
关键字是一个占位符,上面写着“我没有为你的设备还没有,现在就开始他阵列,我会以后再添加一个”。
sudo mdadm --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing
再次,让我们检查一下大小:
sudo grep md100 /proc/partitions
9 100 102272 md100
果然,它比102400块少128K。添加较小的磁盘:
sudo mdadm --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array
繁荣!它不会让我们这样做,而且错误非常明显。