如何调整磁盘上前后都有其他分区的某些分区的大小?
我在互联网上找到了大量有关如何调整分区大小的指南(例如使用parted
),但它们都只显示具有单个分区的磁盘。如何对多个分区执行此操作?
我的具体用例是基于云的网络磁盘,可以通过 WUI 神奇地调整大小。出于这个问题的目的,让我们抛弃这种复杂性,并让答案与云提供商无关。考虑使用以下命令来设置一个简化的示例:
# create 100 MB "disk" file
head -c 104857600 < /dev/urandom > my_disk
cryptsetup luksFormat my_disk
cryptsetup luksOpen my_disk my_disk
# parition disk with 8M, 4M, 1M, 32M, & 36M partitions
echo "label: dos
label-id: 0x34a96950
device: /dev/mapper/my_disk
unit: sectors
sector-size: 512
/dev/mapper/my_disk-part1 : start= 2048, size= 16384, type=83
/dev/mapper/my_disk-part2 : start= 18432, size= 8192, type=83
/dev/mapper/my_disk-part3 : start= 26624, size= 2048, type=83
/dev/mapper/my_disk-part4 : start= 28672, size= 143360, type=5
/dev/mapper/my_disk-part5 : start= 30720, size= 65536, type=83
/dev/mapper/my_disk-part6 : start= 98304, size= 73728, type=83
" | sfdisk /dev/mapper/my_disk
partprobe /dev/mapper/my_disk
# create ext4 filesystems
mkfs.ext4 /dev/mapper/my_disk1
mkfs.ext4 /dev/mapper/my_disk2
mkfs.ext4 /dev/mapper/my_disk3
mkfs.ext4 /dev/mapper/my_disk5
mkfs.ext4 /dev/mapper/my_disk6
上述命令创建一个 100 MB 的“磁盘”文件,该文件使用 LUKS 加密并分区为 5 个大小为 ext4 的文件系统:
- 8MB
- 4MB
- 1MB
- 32MB
- 36MB
现在让我们将磁盘大小加倍
head -c 104857600 < /dev/urandom >> my_disk
现在磁盘大小增加了一倍,我想调整磁盘分区的大小,如下所示:
- 8 MB -> 10 MB
- 4MB -> 5MB
- 1 MB -> 16 MB
- 32 MB -> 29 MB
- 36 MB ->(剩余空间可用)
假设倒数第二个分区有 10 MB 的可用空间,我该如何调整这些文件系统(&& LUKS 容器 && 分区)的大小,以免丢失数据?是否有任何 CLI 工具可以让我轻松完成此操作,而无需删除分区表并手动输入开始/结束值?理想情况下,我希望只需键入即可将+2M
分区大小增加 2 MB。
答案1
(就我个人而言,我认为现在创建多个小于 1 GB 的分区是“不必要的微观管理”,EFI 系统分区可能是个例外/boot
。但我相信您有自己的理由。)
既然你是加倍现有的磁盘大小,这将是过渡到 LVM 的好机会。
首先确保您的 LVM 工具可用。如果这是您的根文件系统,您可能需要重建 initramfs 才能将工具包含在其中。
扩展加密卷后:
head -c 104857600 < /dev/urandom >> my_disk
cryptsetup resize my_disk
您可以使用您喜欢的任何分区工具创建一个新分区来占用所有添加的空间。它应该显示为/dev/mapper/my_disk-part7
.将其类型设置为 8e (Linux LVM)。
初始化它以供 LVM 使用:
pvcreate /dev/mapper/my_disk-part7
创建新的LVM卷组(简称VG):
vgcreate my_vg /dev/mapper/my_disk-part7
现在创建 LVM 逻辑卷(简称 LV)以匹配您现有的分区。
lvcreate -L 8M -n my_lv1 my_vg
lvcreate -L 4M -n my_lv2 my_vg
lvcreate -L 1M -n my_lv3 my_vg
lvcreate -L 32M -n my_lv5 my_vg
lvcreate -l 100%FREE -n my_lv6 my_vg
-L
注意:在指定兆/千兆/太字节大小时使用大写字母,-l
在指定可用容量或总容量的百分比时使用小写字母。
创建文件系统:
for i in 1 2 3 5 6; do mkfs.ext4 /dev/mapper/my_vg-my_lv$i; done
您将能够使用该vgs
命令查看已分配给逻辑卷的总 VG 空间的大小,并lvs
显示各个逻辑卷的大小。
安排一些应用程序停机时间,并将所有内容从旧磁盘复制到新磁盘:
mkdir /old /new
mount /dev/mapper/my_disk-part1 /old
mount /dev/mapper/my_vg-my_lv1 /new
cp -a /old/* /new/
umount /new
umount /old
...并对所有 5 个分区重复此操作。
现在您可以更改/etc/fstab
条目以引用 LVM 逻辑卷而不是旧分区。如果这包括您的根文件系统,请记住编辑新的根文件系统,而不是旧的文件系统。您可能还想创建一个额外的引导选项,以便您可以明确选择使用旧的或新的根文件系统进行引导,从而验证所有内容都安装在它们应该安装的位置。仔细测试,尤其如果包含您的根文件系统。
一旦成功使用 LVM,就该拆除旧的设置了。删除旧分区 #1、#2、#3,并在其位置仅创建一个分区(以最大限度地减少开销)。也将其类型设置为 8e (Linux LVM)。这将是新的/dev/mapper/my_disk-part1
。将分区 #5 和 #6 的类型更改为 8e (Linux LVM)。
分区完成后,您可以恢复正常使用系统。
现在,初始化释放的分区以供 LVM 使用:
pvcreate /dev/mapper/my_disk-part1
pvcreate /dev/mapper/my_disk-part5
pvcreate /dev/mapper/my_disk-part6
将它们添加到现有卷组中:
vgextend my_vg /dev/mapper/my_disk-part1
vgextend my_vg /dev/mapper/my_disk-part5
vgextend my_vg /dev/mapper/my_disk-part6
vgs
如果此时运行,您应该会看到my_vg
现在大小约为 200M,还有大约 100M。事实上,现在的可用空间是身体上的现有 LV 的“左侧”不要紧: 你可以用它来扩展任何您认为合适的 LV。你可以做到当一切都已安装并使用时。
因此,您现在可以做您最初想做的事情:
lvextend -r -L 10M /dev/mapper/my_vg-my_lv1
lvextend -r -L +1MB /dev/mapper/my_vg-my_lv2
lvextend -r -L +15M /dev/mapper/my_vg-my_lv3
ext4
不幸的是,不支持收缩已安装的文件系统:
umount /dev/mapper/my_vg-my_lv5
lvreduce -r -L 29M /dev/mapper/my_vg-my_lv5
mount /dev/mapper/my_vg-my_lv5
最后,将所有剩余的未分配容量分配给最后一个 LV:
lvextend -r -l +100%FREE /dev/mapper/my_vg-my_lv6
为将来:
如果您需要再次增加磁盘文件的大小,您可以在不启动的情况下完成此操作,同时所有内容都已安装并运行:
head -c 104857600 < /dev/urandom >> my_disk # extend disk image
cryptsetup resize my_disk # tell the encryption layer to use it
growpart /dev/mapper/my_disk 7 # extend partition
pvresize /dev/mapper/my_disk-part7 # tell the LVM PV to use it
...然后您将有 100MB 的空间可以分配给您的 LV,lvextend
或者使用lvcreate
.
如果您需要迁移到全新的磁盘,让我告诉您您可以在安装所有内容的情况下执行此操作,这会让您感到惊讶:
vgextend my_vg /dev/mapper/my_new_disk # add new disk to the VG
pvmove /dev/mapper/my_disk # migrate everything away from the old PV
vgreduce my_vg /dev/mapper/my_disk
然后拆掉旧磁盘。
在工作中,我们已经将整个数据中心迁移到新的存储,基本上就是这样做......几次,每 5 年左右,因为对旧企业存储硬件的支持结束/变得比切换到新硬件更昂贵。