![如何使用 mdadm 调整 RAID1 阵列的大小?](https://linux22.com/image/563990/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20mdadm%20%E8%B0%83%E6%95%B4%20RAID1%20%E9%98%B5%E5%88%97%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
我正在运行 Ubuntu 11.04(内核 2.6.38-11)。我用 2x500GB 驱动器替换了 2x160GB。它们配置为 RAID1。
分区表显示正确的大小。这是 sfdisk:
# sfdisk -d /dev/sdb
# partition table of /dev/sdb
unit: sectors
/dev/sdb1 : start= 63, size= 192717, Id=fd, bootable
/dev/sdb2 : start= 192780, size= 7807590, Id=fd
/dev/sdb3 : start= 8000370, size=968767695, Id=fd
/dev/sdb4 : start= 0, size= 0, Id= 0
以及 fdisk:
# fdisk -l /dev/sdb
Disk /dev/sdb: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006c78f
Device Boot Start End Blocks Id System
/dev/sdb1 * 1 12 96358+ fd Linux raid autodetect
/dev/sdb2 13 498 3903795 fd Linux raid autodetect
/dev/sdb3 499 60801 484383847+ fd Linux raid autodetect
但我没有看到新的空间:
root@green:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md2 143G 134G 8.3G 95% /
root@green:~# mdadm --examine /dev/sdb3
/dev/sdb3:
Magic : a92b4efc
Version : 0.90.00
UUID : b8f83980:f60d820c:74c46fbf:0baa68bc
Creation Time : Sun Mar 29 18:48:46 2009
Raid Level : raid1
Used Dev Size : 152247936 (145.19 GiB 155.90 GB)
Array Size : 152247936 (145.19 GiB 155.90 GB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 2
Update Time : Mon Oct 10 19:22:36 2011
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Checksum : 7b5debb7 - correct
Events : 10729526
Number Major Minor RaidDevice State
this 0 8 19 0 active sync /dev/sdb3
0 0 8 19 0 active sync /dev/sdb3
1 1 8 3 1 active sync /dev/sda3
我尝试了 mdadm 和 resize2fs:
# mdadm --grow /dev/md2 --size=max
mdadm: component size of /dev/md2 has been set to 152247936K
# resize2fs /dev/md2
resize2fs 1.41.14 (22-Dec-2010)
The filesystem is already 38061984 blocks long. Nothing to do!
有任何想法吗?
根据请求添加
# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[0] sda3[1]
152247936 blocks [2/2] [UU]
md0 : active raid1 sdb1[0] sda1[1]
96256 blocks [2/2] [UU]
md1 : active raid1 sdb2[0] sda2[1]
3903680 blocks [2/2] [UU]
unused devices: <none>
分区
# cat /proc/partitions
major minor #blocks name
8 0 488386584 sda
8 1 96358 sda1
8 2 3903795 sda2
8 3 152248005 sda3
8 16 488386584 sdb
8 17 96358 sdb1
8 18 3903795 sdb2
8 19 152248005 sdb3
9 1 3903680 md1
9 0 96256 md0
9 2 152247936 md2
分手:
# parted
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print all
Model: ATA WDC WD5000AAKX-0 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32.3kB 98.7MB 98.7MB primary ext3 boot, raid
2 98.7MB 4096MB 3997MB primary linux-swap(v1) raid
3 4096MB 500GB 496GB primary ext3 raid
Model: ATA WDC WD5000AAKS-4 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32.3kB 98.7MB 98.7MB primary ext3 boot, raid
2 98.7MB 4096MB 3997MB primary linux-swap(v1) raid
3 4096MB 500GB 496GB primary ext3 raid
Model: Linux Software RAID Array (md)
Disk /dev/md1: 3997MB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Number Start End Size File system Flags
1 0.00B 3997MB 3997MB linux-swap(v1)
Model: Linux Software RAID Array (md)
Disk /dev/md0: 98.6MB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Number Start End Size File system Flags
1 0.00B 98.6MB 98.6MB ext3
Model: Linux Software RAID Array (md)
Disk /dev/md2: 156GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Number Start End Size File system Flags
1 0.00B 156GB 156GB ext3
通过电子邮件发表评论:
问题出在元数据中,你只需要使用参数--update devicesize组装raid阵列
之后 -G /dev/md? -z max 就完成了:)
答案1
只需使用
mdadm --grow --size max /dev/md2
然后你就可以使用
resize2fs /dev/md2
让文件系统与 raid 大小匹配。所有这些都是在线完成的,甚至无需卸载 md2。
答案2
从看/proc/分区,很明显,Linux 认为sda3和sdb3比它们小。
计算分区大小总和
8 17 96358 sdb1
8 18 3903795 sdb2
8 19 152248005 sdb3
您将得到一个比磁盘大小小得多的数字。
8 16 488386584 sdb
152248005 个 1024 字节的块与大小一致mdadm --grow
,并且resize2fs
正在报告MD2 的。
您是否最初创建了这些较小大小的分区,然后后来重新创建它们以利用其余磁盘?如果是这样,重新启动应该允许内核重新读取分区表。之后,扩大 RAID 设备并调整文件系统大小应该可以正常工作。
答案3
我经常使用 mdadm,认为它是最危险的 Linux 实用程序之一。但是,如果您采取正确的安全预防措施,则可以避免大多数潜在的数据丢失情况备份所有数据!!! 我以前曾两次被 mdadm 攻击过,丢失了超过 700GB 的数据,而且只有极少数数据能够恢复,我已警告过你。
您很有可能需要再次创建 RAID 阵列,因为 mdadm 不会预期或补偿驱动器突然增大的大小。它将使用 raid 超级块中规定的大小,而不是驱动器本身。如果驱动器已经同步,您不应该遇到太多问题。
请记住,如果您想启动它,请使用超级块版本 0.9。
编辑
我会这样做,未经测试!
创建一个缺少驱动器的 RAID1,这样我们就可以快速测试数据是否保留,同时仍有另一个驱动器包含数据的副本,您的旧元数据是 0.90,因此我们将在此处保留相同的版本。
mdadm --create /dev/md2 --level=mirror --metadata=0.90 --raid-devices=2 missing /dev/sdb3
安装以测试一切是否正常
mkdir /mnt/test
mount /dev/md2 /mnt/test
检查你的数据
ls -l /mnt/test
如果一切正常则卸载驱动器并调整大小。
unmount /mnt/md2
resize2fs /dev/md2
一旦一切正常,您就可以将另一个驱动器添加到阵列中。
mdadm --add /dev/md2 /dev/sdb3
并等待驱动器重新同步
猫/proc/mdstat
答案4
让我添加自己的日志,以作记录。我发现自己处于这样一种情况:多年来,在更换了古老的 MD 镜像中的两个驱动器后,我最终拥有的两个驱动器都比镜像原来的大小要大 :-) 我已经有了更大的物理驱动器,但 Linux RAID 分区仍然是原始的(= 较小)大小。而且,MD 镜像上的空间快用完了。幸运的是,每个驱动器只有一个 0xFD 分区,这使得扩展相对简单。
以下是我的“内部剪贴簿条目”的副本:
首先,我们来大致了解一下初始情况:
df
cat /proc/partitions
cat /proc/mdstat
cat /etc/mdadm/mdadm.conf
分区表是否相同?
sfdisk -d /dev/sdh
sfdisk -d /dev/sdi
为了以防万一,我们应该“停留”在安全的地方:
cd ~
您可能希望停止任何依赖于挂载点的服务。例如,如果该卷由 Samba 提供服务:
systemctl stop nmbd
systemctl stop smbd
如果您选择在线调整 FS 大小(这应该是更快的选项),显然甚至不需要卸载:
umount /array/mountpoint
现在,无论您是选择在线还是离线调整 FS 的大小,我都已经证实,为了调整 MD 设备的大小,您实际上必须不是停下来!
#mdadm --stop /dev/md3
您最好备份分区表 - 以防万一。显然,这不能替代完整备份所有数据,但如果由于某种原因您在修改分区表时犯了错误,它可以为您提供一条退路。
如果两个驱动器相同,则只需选择一个驱动器。
sfdisk -d /dev/sdh > sdh.bak
您的第一个也是唯一的分区可能从第 63 扇区开始。或者在现代大约是 2048。请注意以下命令中的数字 63。无论它是什么,只要保留它即可。
标记为 0xFD(= Linux RAID Autodetect)的分区正在被活动 MD 阵列使用。这是故意的,您只需强制 fdisk 进行更改即可。我使用的是“可编写脚本的”sfdisk,但如果这让您感到不安,您可能只需使用交互式版本:
echo -en "unit: sectors\n63,,fd,\n" | sfdisk --force /dev/sdh
echo -en "unit: sectors\n63,,fd,\n" | sfdisk --force /dev/sdi
请注意,在指定起始扇区(第二条磁道的起始位置)后,我们未指定分区大小 - 这表明 sfdisk 将使用所有可用空间。“fd”是分区标签(Linux RAID 自动检测)。尾随的逗号表示另一个字段保留为默认值 - 此处放置的星号表示活动=可引导分区。是\n
换行符的转义序列。因为 sfdisk 的输入实际上是一个多行文件。请参阅 sfdisk -d 的输出。请注意,我之前使用此事实备份分区表,并通过简单的重定向将备份存储在文件中。该备份文件可以简单地通过管道传输到另一个 sfisk 的标准输入中,以重新创建该分区表。您还可以编辑文件以更改分区布局,然后再次将其通过管道传输到 sfdisk 中以实现更改...
在 fdisk 的输出跟踪中,您应该看到 fdisk 增加了分区大小,并报告有将新的分区表写入磁盘(因为我们强制这样做),但仍然没有告诉内核从磁盘重新读取分区表。也就是说,内核没有重新解释/更新其分区大小的概念,另请参阅:
cat /proc/partitions
然而,为了后续操作 mdadm --grow --size max
成功,我们需要执行 parttable 重新读取操作。无需停止 MD 阵列!有几种工具可以为我们调用所需的 ioctl(),例如:
partprobe /dev/sdh
partprobe /dev/sdi
使用以下方法可能可以达到相同的效果:
blockdev --rereadpt /dev/sdh
blockdev --rereadpt /dev/sdi
重新检查结果:
cat /proc/partitions
最后,调整 MD 设备的大小:
mdadm --grow --size max /dev/md3
您最好等待数组完成同步增长的空间:
watch -n 5 cat /proc/mdstat
重新同步完成后,您可能需要检查阵列是否可以停止并重新启动:
mdadm --stop /dev/md3
mdadm --assemble scan --uuid=<check out the mdadm.conf>
或者
mdadm --assemble /dev/md3 /dev/sdh1 /dev/sdi1
这一步 = 数组停止/启动不是必需的 - 但如果成功,您就知道您可能(可能?)还没有丢失数据:-)
下面的示例针对 EXT2/3/4 FS 进行定制。
您可以尝试立即安装 MD 卷,然后在线执行 FS 大小调整。或者,您可以保持 MD 卷未安装,然后离线调整 FS 大小。resize2fs 根据条件的不同而采取的各种行为已之前曾在这里讨论过。
如果您尝试离线运行 resize2fs,即未安装 MD 卷时,它可能会要求您e2fsck -f
先运行。
e2fsck -f -v /dev/md3
这需要很长时间!“-v”应该会给你更多关于进度的线索。并且,在 MD 同步完成之前不要运行 fsck!如果你这样做,它们会争夺 IOps,并且可能比按顺序执行花费更长的时间!
最后:
resize2fs -p /dev/md3
“-p”选项打开进度指示器。然后,是时候挂载
mount /array/mountpoint
并检查可用空间:
df
并开始您的服务...
实际上,您可以在挂载 FS 时调整大小 - 但旧版本的 ext3 不支持此功能。也就是说,此在线调整大小操作在后台运行。离线调整大小操作在前台运行,可能需要几十分钟(扩展。缩小可能需要几个小时)。这时 -p 参数(进度指示器)就派上用场了 :-)
在执行所有这些 resync / fsck / resize2fs 时,您可能会喜欢 IOps 监视器。我最喜欢的是 sysstat 包中的 iostat。例如,要每 2 秒自动刷新视图,请使用:
iostat 2
您可以在另一个终端窗口中继续运行此程序,除了您发出黑色诅咒的那个窗口之外。我在文件系统级别发现了另一个有用的“自动刷新监视器”,调用方式如下:
watch -n 10 df
我在将文件从一个磁盘复制到另一个磁盘时会用到它,例如将卷移到另一个文件系统时。如果您的情况如此,还请留意noatime
mount 选项。