几年前,当我按照本指南设置 arch 安装时,我设置了 Raid-0 mdadm raid 阵列https://wiki.archlinux.org/title/RAID#Installation同时也在其他地方进行谷歌搜索和提问,以使其适合我的确切设置。
我想缩小分配给我的操作系统的 raid-0 阵列部分,并使用可用空间创建一个新分区,并在该分区上安装不同的 Linux 操作系统。
在安装该操作系统期间我是否需要重新设置阵列?据我了解,这是一次软件袭击,我相信我记得我的操作系统分区有一些用于加载阵列的配置。
我尝试使用 mdadm --grow /dev/md127 --size=3T (从 3.4T 缩小到 3T,这样我就可以在其他 400GB 上安装操作系统)。这会产生以下错误:mdadm: Cannot set device size in this type of array.
我尝试过使用 fdisk 等其他软件,但不想编写会意外损坏我的阵列的操作。
答案1
我不太使用 RAID-0(根本不使用),所以我实际上不确定为什么 mdadm 不支持收缩 RAID-0。另一种方法似乎是重新创建数组,但是为了mdadm --create
工作,你必须正确指定磁盘顺序、数据偏移、级别、布局等。
错误消息本身是一条通用消息,它根本没有具体提及 RAID-0(代码中实际上还有另一条消息Component size change is not supported for RAID0
,此处未提及)。手册页确实提到了这一点RAID 0 array size cannot be changed
。
仍然可以间接地完成此操作,方法是临时将 RAID-0 转换为 RAID-4(或使用 转换为 RAID-5 --layout=parity-last
)。此转换应立即发生,而不会更改磁盘上的数据,因为 RAID-0 和 RAID-4(缺少奇偶校验磁盘)恰好相同。然后收缩即可工作,因为 md RAID-4/5/6 支持它。
然而,我确信几乎没有人测试过这样做,所以......可能仍然存在一些风险。
这是一个级别和布局更改的示例。
设置 RAID-0:
# head -c 100M /dev/urandom > a.img
# losetup --find --show a.img
/dev/loop0
# head -c 100M /dev/urandom > b.img
# losetup --find --show b.img
/dev/loop1
# mdadm --create /dev/md42 --level=0 --raid-devices=2 /dev/loop0 /dev/loop1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md42 started.
# head -c 42M /dev/md42 | md5sum
fff6e815ae3979b190e1a84f1b9fd776 -
通过 RAID-4 缩小 RAID-0:
# mdadm --grow /dev/md42 --size=21M
mdadm: Cannot set device size in this type of array.
# mdadm --grow /dev/md42 --level=4
mdadm: level of /dev/md42 changed to raid4
# mdadm --grow /dev/md42 --size=21M
mdadm: component size of /dev/md42 has been set to 21504K
# mdadm --grow /dev/md42 --level=0
mdadm: level of /dev/md42 changed to raid0
# echo 3 > /proc/sys/vm/drop_caches
# md5sum /dev/md42
fff6e815ae3979b190e1a84f1b9fd776 /dev/md42
请注意,它--size
不考虑数据偏移量,因此每个组件必须至少保持组件大小加上数据偏移量大。
# mdadm --examine /dev/loop0
[…]
Avail Dev Size : 43008 sectors (21.00 MiB 22.02 MB)
Data Offset : 4096 sectors
因此,在此示例中,设备大小必须至少为 43008 + 4096 = 47104 个扇区。如果您的数组较大,则 mdadm 选择的默认数据偏移量也可能会大得多,因此请注意不要将分区缩小太多。
另请注意,raid0 有一些特殊情况(具有不同大小的设备),此方法可能不起作用。此答案假设您使用具有 mdadm 1.2 元数据的相同大小的驱动器。