在使用 resize2fs 缩小文件系统后,如何立即缩小分区?

在使用 resize2fs 缩小文件系统后,如何立即缩小分区?

/home这是缩小分区文件系统的方法:

e2fsck /dev/sda1

resize2fs /dev/sda1 150G

截至目前,如果我运行df它,它将显示分区已从 210G 缩小到 150G(即不对)。

由于我只减小了文件系统大小,如何使用fdisk或缩小分区大小parted

答案1

首先,通常的警告:备份数据。调整分区和文件系统的大小从来都不是 100% 安全的操作。

如果您可以使用带有 GParted 的图形环境,最简单的解决方案是:

  1. 将分区重新增长/dev/sda1到其包含的文件系统的大小:右键单击它,选择“检查”并应用所有操作;然后

  2. 将分区缩小到所需大小:右键单击分区,选择“调整大小/移动”,设置所需的“新大小”,确认并应用所有操作; GParted 还负责调整文件系统的大小。

或者,使用命令行工具,您可以使用dumpe2fstune2fs来获取文件系统的块大小和块计数,并重新创建要收缩的分区,使新分区以与原始分区相同的字节开始,并以该偏移量加上结束收缩的文件系统的大小(以字节为单位)。

parted这是一个完整的示例,可用于使用 GNU和由常规文件支持的循环设备来操作相关命令:

  • 我们首先创建一个块设备,对其进行分区,并在第一个(也是唯一的)分区上创建一个 210 MiB 文件系统:

    $ fallocate -l 211MiB testfile
    $ sudo losetup -f testfile
    $ sudo parted /dev/loop0 unit MiB mklabel msdos mkpart primary 1 100%FREE
    $ lsblk /dev/loop0
    NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
    loop0       7:0    0  211M  0 loop 
    └─loop0p1 259:0    0  210M  0 part
    $ sudo mkfs.ext4 -L test -v /dev/loop0p1 210M
    $ sudo mount /dev/loop0p1 /mnt/temp
    $ df /mnt/temp
    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/loop0p1      202353    14    187491   1% /mnt/temp
    
  • 然后我们将文件系统大小调整为 150 MiB,最终处于类似于您问题中描述的状态:

    $ sudo umount /mnt/temp
    $ sudo e2fsck -f /dev/loop0p1
    $ sudo resize2fs /dev/loop0p1 150M
    $ sudo mount /dev/loop0p1 /mnt/temp
    $ df /mnt/temp
    Filesystem     1K-blocks  Used Available Use% Mounted on
    /dev/loop0p1      144716  1550    132414   2% /mnt/temp
    $ sudo umount /mnt/temp
    
  • 现在,我们根据分区所托管的文件系统的当前大小来获取分区的目标大小:

    $ sudo dumpe2fs -h /dev/loop0p1
    

    或者

    $ sudo tune2fs -l /dev/loop0p1
    

    相关行是:

    Block count:              153600
    First block:              1
    Block size:               1024
    

    允许我们计算新的分区大小(以字节为单位),如下所示:

    153600 * 1024 = 157286400
    

    然后我们需要分区的当前起始字节(假装我们还不知道):

    $ sudo parted /dev/loop0 unit b print
    Number  Start     End         Size        Type     File system  Flags
     1      1048576B  221249535B  220200960B  primary  ext4
    

    现在我们知道新分区将从字节 1048576 开始并在字节结束

    1048576 + 157286400 -1 = 158334975
    

    注意parted从0开始计数并使用包含区间;因此,必须从分区的大小中减去一个字节才能计算其结束字节。

    我们现在可以重新创建分区并检查结果:

    $ sudo parted /dev/loop0 unit b rm 1 mkpart primary 1048576 158334975
    $ lsblk /dev/loop0
    NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
    loop0       7:0    0  211M  0 loop 
    └─loop0p1 259:0    0  150M  0 part
    

    sudo e2fsck -f /dev/loop0p1如果您碰巧将分区缩小太多,重新运行会提醒您,以便您在损坏文件系统之前修复它。

答案2

您知道收缩 fs 后,
 必须计算新的分区大小并调整分区表大小。
 还有mbr/gpt分区表..


如果没有命令行爱好,在 GUI 中执行起来很简单:

gnome 磁盘实用程序

gnome-disk-unitily_resize.png

gparted

gparted_resize.png


特别是,gparted还显示 fs 大小(如果它不等于零件大小)

gparted_信息

相关内容