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

tru*_*ktr 43 command-line filesystems partition

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

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

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

pie*_*rop 24

我回答这个问题是为了防止你遇到和我类似的情况。我必须在以 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!
Run Code Online (Sandbox Code Playgroud)

而且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.
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你,我不知道growpart实用程序,哇,这是迄今为止最简单的方法! (2认同)
  • +1谢谢!我必须在 Ubuntu 22 上添加 `cloud-guest-utils` 软件包(`sudo apt install cloud-guest-utils`)才能获得 `growpart`。另外, `resize2fs` 在运行之前需要 `e2fsck`: ``` $ sudo Growthpart /dev/sdb 1 CHANGED:partition=1 start=2048 old: size=58591232 end=58593280 new: size=209713119 end=209715167 $ sudo resize2fs /dev/sdb1 .. 请先运行“e2fsck -f /dev/sdb1”。$ sudo e2fsck -f /dev/sdb1 ... $ sudo resize2fs /dev/sdb1 .. 将 /dev/sdb1 上的文件系统大小调整为 26214139 (4k) 块。/dev/sdb1 上的文件系统现在是 26214139 (4k) 块长```` (2认同)

Thu*_*shi 12

您可以fdisk在运行时使用更改分区表。请参阅Linuxext4 文件系统的实时调整大小(在代码博客的沉默中):

免责声明: 如果您犯了错误,以下说明很容易弄乱您的数据。我在执行以下操作之前备份的 VM 上执行此操作。如果您因为没有执行备份而丢失数据,请不要抱怨。

...

第一:增加磁盘大小。

在 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 
    
    Run Code Online (Sandbox Code Playgroud)

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

第三:扩大文件系统。

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

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
Run Code Online (Sandbox Code Playgroud)

小问题:重新启动后交换空间不活动。原来你需要运行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
Run Code Online (Sandbox Code Playgroud)

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

  • 由于链接失效,您应该将链接中的相关信息放入您的答案中。此外,wordpress.com 目前在我居住的地方(中国)被封锁,所以我什至看不到“答案”。 (33认同)

Ken*_*itt 12

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

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


use*_*145 7

gparted用于resize2fs更改分区的大小。它不需要很多参数。下面是我发现有用的。

-M 缩小到文件系统的最小大小。

-p 显示百分比指示器。

-P 打印文件系统的最小大小并退出。

  • `resize2fs` 根本不改变分区表,它改变了*文件系统*的大小。使用它后,您必须相应地调整文件系统所在分区的大小。 (3认同)

Dys*_*as 7

noalo 的解决方案显然是最好的;\n比其他解决方案简单得多:

\n
\necho "- +" | sfdisk -N <partnum> /dev/sd X \n
\n

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

\n

它的限制是紧接着必须有可用空间。如果分区调整大小后,存在交换分区(即里面没有真实数据),也可以通过 轻松解决sfdisk。使用上面的语法,假设要更改的\xc2\xa0分区处于打开状态sda1并且交换打开sda2,我们有一个128\xe2\x80\xafG磁盘,并且我们需要6\xe2\x80\xafG交换:\nThe\xc2\xa0first步骤是将\xc2\xa0移动交换分区到最后:

\n
echo "122G +" | sfdisk -N2 /dev/sda\n
Run Code Online (Sandbox Code Playgroud)\n

现在展开第一个分区:

\n
echo "- +"    | sfdisk -N1 /dev/sda\n
Run Code Online (Sandbox Code Playgroud)\n

并使用 调整其大小resize2fs。您可能必须确保新的交换被识别。\xc2\xa0\n请参阅swapoffmkswapswapon文件fstab。\xc2\xa0\n这个\xc2\xa0 不在这个问题的范围内。

\n

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

\n

谢谢你@noalo

\n


小智 6

一种可脚本化的方法,假设要调整大小的分区后直接有可用空间:

echo "- +" | sfdisk -N <partnum> /dev/sdX
Run Code Online (Sandbox Code Playgroud)

...紧随其后resize2fs /dev/sdX<partnum>

-讲述了sfdisk重用现有的start部门,并+告诉它使size尽可能大给出的可用空间。

  • 虽然奇怪地可怕,但这正是我在将文件系统从“ddrescue”映像“dd”到恰好更大的新驱动器之后所做的事情。谢谢。 (2认同)

Nab*_*.Z. 5

无需重新启动即可调整 Linux 根分区大小

介绍

从 ProfitBricks 提供的映像部署的典型 Linux 服务器具有单个存储卷/dev/vda. 如果我们查看一下使用情况,fdisk我们会看到磁盘分为两个分区。第一个分区/dev/vda1是操作系统所在的引导分区。第二个分区/dev/vda2被配置为交换空间。

root@debian:~# fdisk -l /dev/vda

Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 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 Disklabel type: dos Disk identifier: 0x0041f8a8

Device Boot Start End Sectors Size Id Type /dev/vda1 2048 96471039 96468992 46G 83 Linux /dev/vda2 96471040 104857599 8386560 4G 82 Linux swap / Solaris

在上面的示例中,总 50 GB 存储卷被分为 46 GB 可用空间和 4 GB 用于交换空间。如果配置后我们发现 46 GB 磁盘空间不够,但我们不想添加额外的存储卷怎么办?目标是增加根文件系统上的可用磁盘空间量。这可以在最小的干扰下完成。我们不需要重新启动服务器!

要求

  • 从 ProfitBricks 提供的映像创建的 Linux 服务器。
  • 通过 SSH 或控制台访问(通过 DCD)Linux 服务器。
  • 命令partprobe。可以从parted大多数 Linux 发行版上的软件包安装。
  • fdiskswapoffmkswapswapon和命令resize2fs。可能默认可用。
  • 您正在使用的系统的当前快照或其他备份。只是为了安全!

提供额外空间

要增加硬盘驱动器的大小,请进入 DCD(数据中心设计器)并升级驱动器。

增加驱动器空间量后,单击“配置”以处理更改。大约需要一分钟,您的硬盘就会更大。

然后我们需要关闭交换 - 因此请确保您可以在没有交换空间的情况下生存几分钟:

root@debian:~# swapoff -a
Run Code Online (Sandbox Code Playgroud)

禁用交换后,我们需要使用以下命令重新配置分区fdisk

我们将首先删除两个现有分区。我们运行fdisk /dev/vda然后使用d命令删除分区2,然后删除分区1。如下示例:

root@debian:~# fdisk /dev/vda

Command (m for help): d Partition number (1,2, default 2):

Partition 2 has been deleted.

Command (m for help): d Selected partition 1 Partition 1 has been deleted.

现在我们重新创建分区。在示例中,我们有 4 GB 交换空间。因此,我们需要至少为新的交换分区保留那么多的可用空间。

先重新创建/dev/vda1。按n创建一个新分区。输入p创建主分区。我们可以按Enter键接受第一个扇区的默认值2048 。然后输入分区的大小。您可以输入一个以 GB 为单位的值,因此,如果我们将磁盘增加到 100 GB,我们会减去 4 GB 的交换空间,然后输入+96G表示 96 GB。

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-209715199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): +96G

Created a new partition 1 of type 'Linux' and of size 96 GiB.

现在我们按照类似的过程重新创建交换分区。按n,然后按p创建新的主分区。按Enter接受“第一扇区”的默认值。我们还可以再次按Enter键接受“最后一个扇区”的默认值。

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (201328640-209715199, default 201328640):
Last sector, +sectors or +size{K,M,G,T,P} (201328640-209715199, default 209715199):

Created a new partition 2 of type 'Linux' and of size 4 GiB.

由于第二个分区将用于交换空间,因此我们需要更改分区类型。这可以通过在提示符下按t来完成fdisk。然后我们按2选择第二个分区。如果您想查看可用分区类型的列表,请按L,否则输入82以选择“Linux swap / Solaris”。

Command (m for help): t
Partition number (1,2, default 2): 2
Partition type (type L to list all types): L

0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT 10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/ 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto 1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep 1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT Partition type (type L to list all types): 82

fdisk有用的消息通知我们我们已经更改了分区类型:

Changed type of partition 'Linux' to 'Linux swap / Solaris'.
Run Code Online (Sandbox Code Playgroud)

之后,我们使用w命令保存并返回到 shell 提示符:

Command (m for help): w
Run Code Online (Sandbox Code Playgroud)

在 shell 提示符之前您可能会收到如下消息:

The partition table has been altered.
Calling ioctl() to re-read partition table.
Re-reading the partition table failed.: 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).

让我们放弃重新启动,而是使用以下命令告诉内核有关新分区的信息partprobe

root@debian:~# partprobe
Run Code Online (Sandbox Code Playgroud)

我们应该返回到 shell 提示符,并且没有任何输出partprobe

现在我们需要调整文件系统的大小/dev/vda1

root@debian:~# resize2fs /dev/vda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/vda1 is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 3
Run Code Online (Sandbox Code Playgroud)

文件系统/dev/vda1现在的长度为 25165824 (4k) 块。

初始化新的交换位置/dev/vda2

root@debian:~# mkswap /dev/vda2
Setting up swapspace version 1, size = 4193276 KiB
no label, UUID=c55c25a2-a386-4653-8455-4d9030586dd2
Run Code Online (Sandbox Code Playgroud)

最后,我们编辑/etc/fstab旧的 UUID 并将其替换为命令输出中返回的新 UUID mkswap。要更改的行没有“挂载点”值,并且“类型”设置为swap

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID=332f8fb5-ff1f-4297-b512-f2c93a277296 /               ext4    errors=remount-ro 0       1
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
UUID=c55c25a2-a386-4653-8455-4d9030586dd2       none    swap    sw      0       0
Run Code Online (Sandbox Code Playgroud)

编辑后/etc/fstab,我们需要再次启用交换:

root@debian:~# swapon -a
Run Code Online (Sandbox Code Playgroud)

核实

df我们可以使用和/或来验证新的较大磁盘大小fdisk

Device     Boot     Start       End   Sectors Size Id Type
/dev/vda1            2048 201328639 201326592  96G 83 Linux
/dev/vda2       201328640 209715199   8386560   4G 82 Linux swap / Solaris
Run Code Online (Sandbox Code Playgroud)

我们还可以通过查看以下输出来确认服务器没有重新uptime启动:

$ uptime
 23:54:21 up 7 days,  1:15,  1 user,  load average: 0.00, 0.01, 0.05
Run Code Online (Sandbox Code Playgroud)

概括

我们已经成功增加了 Linux 服务器上的可用磁盘空间量。

参考

https://devops.ionos.com/tutorials/increase-the-size-of-a-linux-root-partition-without-rebooting/

或者

https://web.archive.org/web/20201113021238/https://devops.ionos.com/tutorials/increase-the-size-of-a-linux-root-partition-without-rebooting/