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

sur*_*und 5 filesystems partition fdisk parted resize2fs

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

e2fsck /dev/sda1

resize2fs /dev/sda1 150G
Run Code Online (Sandbox Code Playgroud)

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

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

fra*_*san 4

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

\n

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

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

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

    \n
  4. \n
\n

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

\n

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

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

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

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

    \n
    $ sudo dumpe2fs -h /dev/loop0p1\n
    Run Code Online (Sandbox Code Playgroud)\n

    或者

    \n
    $ sudo tune2fs -l /dev/loop0p1\n
    Run Code Online (Sandbox Code Playgroud)\n

    相关行是:

    \n
    Block count:              153600\nFirst block:              1\nBlock size:               1024\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n
    153600 * 1024 = 157286400\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n
    $ sudo parted /dev/loop0 unit b print\nNumber  Start     End         Size        Type     File system  Flags\n 1      1048576B  221249535B  220200960B  primary  ext4\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n
    1048576 + 157286400 -1 = 158334975\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n

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

    \n
    $ sudo parted /dev/loop0 unit b rm 1 mkpart primary 1048576 158334975\n$ lsblk /dev/loop0\nNAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS\nloop0       7:0    0  211M  0 loop \n\xe2\x94\x94\xe2\x94\x80loop0p1 259:0    0  150M  0 part\n
    Run Code Online (Sandbox Code Playgroud)\n

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

    \n
  • \n
\n