如何从命令行调整 ext4 分区的大小?

如何从命令行调整 ext4 分区的大小?

从命令行调整 ext4 分区(或任何类型分区,具体取决于方法)大小的最简单方法是什么(可能使用最少的命令,但也是最容易理解的)?

在 GUI 中使用像 Gparted 这样的工具显然很容易,但是在命令行中呢?我想基于文本的 GUI 也可以算作答案,因为它在技术上仍然在命令行中。它只需要简单即可。

我所说的分区是指个人计算机(例如笔记本电脑)的单个磁盘上的简单分区。例如,我想调整大小/dev/sda4。没有 RAID,只有一个磁盘驱动器,这里没有任何复杂的事情。只是单个磁盘上的简单分区(/dev/sda 上的 /dev/sdaX)。

答案1

您可以fdisk在运行时更改分区表。参考在 Linux 上实时调整 ext4 文件系统的大小 (在代码的沉默博客):

免责声明: 如果您犯了错误,以下说明很容易毁掉您的数据。我在执行以下操作之前备份的虚拟机上执行此操作。如果您因未执行备份而丢失数据,请不要过来抱怨。

...

第一:增加磁盘大小。

在 ESXi 中这很简单,只需增加虚拟磁盘的大小即可。现在您有了更大的硬盘,但您仍然需要 a) 增加分区大小和 b) 调整文件系统大小。

第二:增加分区大小。

您可以fdisk在运行时更改分区表。原生 Ubuntu 安装创建了 3 个分区:一个主分区 (sda1),一个扩展分区 (sda2),其中有一个逻辑分区 (sda5)。扩展分区仅用于交换,因此我可以轻松移动它而不会丢失任何数据。

  1. 删除主分区

  2. 删除扩展分区

  3. 创建一个新的主分区,从与原始分区相同的扇区开始,只是大小更大(留一些用于交换)

  4. 创建一个新的扩展分区,其中包含逻辑分区以保存交换空间

    me@ubuntu:~$ sudo fdisk /dev/sda
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048   192940031    96468992   83  Linux
    /dev/sda2       192942078   209713151     8385537    5  Extended
    /dev/sda5       192942080   209713151     8385536   82  Linux swap / Solaris
    
    Command (m for help): d
    Partition number (1-5): 1
    
    Command (m for help): d
    Partition number (1-5): 2
    
    Command (m for help): n
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p
    Partition number (1-4, default 1):
    Using default value 1
    First sector (2048-524287999, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-524287999, default 524287999): 507516925
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): e
    Partition number (1-4, default 2): 2
    First sector (507516926-524287999, default 507516926):
    Using default value 507516926
    Last sector, +sectors or +size{K,M,G} (507516926-524287999, default 524287999):
    Using default value 524287999
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    
    Command (m for help): n
    Partition type:
       p   primary (1 primary, 1 extended, 2 free)
       l   logical (numbered from 5)
    Select (default p): l
    Adding logical partition 5
    First sector (507518974-524287999, default 507518974):
    Using default value 507518974
    Last sector, +sectors or +size{K,M,G} (507518974-524287999, default 524287999):
    Using default value 524287999
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    /dev/sda5       507518974   524287999     8384513   83  Linux
    
    Command (m for help): t
    Partition number (1-5): 5
    
    Hex code (type L to list codes): 82
    Changed system type of partition 5 to 82 (Linux swap / Solaris)
    
    Command (m for help): p
    
    Disk /dev/sda: 268.4 GB, 268435456000 bytes
    255 heads, 63 sectors/track, 32635 cylinders, total 524288000 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x000e49fa
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1            2048   507516925   253757439   83  Linux
    /dev/sda2       507516926   524287999     8385537    5  Extended
    /dev/sda5       507518974   524287999     8384513   82  Linux swap / Solaris
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.
    
    me@ubuntu:~$ sudo reboot 
    

后来我注意到我没有设置可启动标志,但显然你并不真的需要它

第三:扩大文件系统。

您可以resize2fs在已安装的分区上在线执行此操作。

me@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        91G   86G   12M 100% /
udev            3.9G  4.0K  3.9G   1% /dev
tmpfs           1.6G  696K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G  144K  3.9G   1% /run/shm
none            100M   16K  100M   1% /run/user

me@ubuntu:~$ sudo resize2fs /dev/sda1
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 6, new_desc_blocks = 16
The filesystem on /dev/sda1 is now 63439359 blocks long.

me@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       239G   86G  142G  38% /
udev            3.9G   12K  3.9G   1% /dev
tmpfs           1.6G  696K  1.6G   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.9G  152K  3.9G   1% /run/shm
none            100M   36K  100M   1% /run/user

轻微的问题:重新启动后,交换空间不活动。结果你需要运行mkswap,调整/etc/fstab到新的 UUID 并打开交换

me@ubuntu:~$ sudo mkswap /dev/sda5 
Setting up swapspace version 1, size = 8384508 KiB
no label, UUID=141d401a-b49d-4a96-9b85-c130cb0de40a

me@ubuntu:~$ sudo swapon --all --verbose
swapon on /dev/sda5
swapon: /dev/sda5: found swap signature: version 1, page-size 4, same byte order
swapon: /dev/sda5: pagesize=4096, swapsize=8585740288, devsize=8585741312

编辑/etc/fstab以将旧交换分区的 UUID 替换为mkswap.

答案2

我回答这个问题是为了防止你遇到和我类似的情况。我必须在以 Guest 身份运行 Ubuntu 18.0.4 LTS 的动态磁盘上调整文件系统 (Ext4) 的大小。我设法从主机调整磁盘大小,然后调整文件系统大小。

无法运行常用命令。例如:

$ resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
The filesystem is already 13180160 (4k) blocks long.  Nothing to do!

而且fdisk相当复杂,可能我还必须运行 LiveCD 才能在未安装的磁盘上工作。

这两个命令轻松快速地解决了我的问题:

$ growpart /dev/sda 2
CHANGED: partition=2 start=4096 old: size=105441280 end=105445376 new: size=409595871,end=409599967

$ resize2fs /dev/sda2
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/sda2 is mounted on /; on-line resizing required
old_desc_blocks = 7, new_desc_blocks = 25
The filesystem on /dev/sda2 is now 51199483 (4k) blocks long.

注意:2第一个命令中表示设备上的分区号/dev/sda

答案3

如果要增加分区和文件系统的大小,请首先运行fdisk以增加分区的大小,然后运行resize2fs以增加文件系统的大小。

如果您要缩小两者的大小,请先运行resize2fs,然后运行fdisk​​。

答案4

诺阿洛的解决方案显然是最好的;比其他的简单得多:

回声“-+”| sfdisk-N<零件号>/dev/sdX

关于其工作原理的简短说明:-N意味着sfdisk将在单个分区上工作。当像这样开始时,sfdisk将是交互式的并等待开始位置、大小和可选的分区类型。 “ -”表示起始位置不改变,“ +”表示结束位置将使用尽可能多的空间。之后您将必须使用printwrite命令。领先者echo "- +" |在一行中做到了这一点。

它的局限性是必须有可用空间紧接着。如果分区调整大小后,存在交换分区(即里面没有真实数据),也可以通过 轻松解决sfdisk。使用上面的语法,假设要更改的分区是 onsda1且 swap on sda2,我们有一个 128 G 的磁盘,我们需要 6 G 的交换: 第一步是将交换分区移到末尾:

echo "122G +" | sfdisk -N2 /dev/sda

现在展开第一个分区:

echo "- +"    | sfdisk -N1 /dev/sda

并使用 调整其大小resize2fs。您可能必须确保您的新交换得到认可。请参阅swapoffmkswapswapon文件fstab。这不在这个问题的讨论范围之内。

关于命令sda2不要以这种方式移动带有数据的分区!  您将丢失所有数据。该命令不移动数据;只是分区边界。用于 sda1 ( ) 的命令没有危险,- +因为分区的起始位置没有改变;这就是-用于单个分区时“ ”的含义。

谢谢你@noalo

相关内容