如何在运行时调整ext根分区的大小?


236

如何在运行时增加系统根分区的大小?

我有一个未在根分区(也是ext4)之后分配的分区,如何在不关闭服务器的情况下将未分配的空间添加到分配给根分区的空间中?


3
我讨厌听起来像泥泞中的棍子,但这会带来很大的风险吗?为什么需要发生这种情况?正常运行时间是主要限制因素吗?
2013年

您不能在左侧调整分区的大小,因为实际上这是一个举动。
Zaz

5
在线增加ext4分区的大小很容易。困难的部分将是缩小(您的标题是“调整大小”)。对于在运行时对根分区(移动,收缩,更改文件系统,设备)进行任何操作感兴趣的人,请咨询我的答案:askubuntu.com/a/728141/21888
vaab 2016年

Answers:


214

GUI(Ubuntu 14.04和更高版本):GParted v0.17和更高版本为此提供了一个不错的GUI。(较旧的版本将拒绝调整已安装分区的大小)。

命令行(任何Ubuntu版本): 为此,需要执行三个步骤。

步骤1. 必须首先调整分区的大小。如果您使用的是LVM,这很简单,并且大概知道如何进行。如果您使用的是经典分区,则要复杂一些,并且可能需要重新启动(尽管您不必引导另一个系统或实时CD)。

我是这样做的:fdisk首先删除分区(其想法是保留磁盘上的数据),然后在相同位置小心地以更大的大小重新创建该分区。

例:

$ sudo fdisk /dev/sda

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     9437183     4717568   83  Linux

Command (m for help): d
Selected partition 1

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-10485759, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-10485759, default 10485759):
Using default value 10485759

Command (m for help): p

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048    10485759     5241856   83  Linux

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.

同样,至关重要的是,新分区必须与旧分区在同一块处开始。该ID也应匹配(对于Linux系统,该ID为83)。准备一点点错字就丢失所有数据。

为了安全起见,您还可以通过按来恢复引导标志(根据Wikipedia,在某些计算机上仍然需要该标志)a

请参阅注释部分,以了解如果您的交换分区受阻该怎么办。

到现在为止,人们为什么建议使用实时CD应该已经很明显了。;-)

第2步: 作为fdisk有益提醒你,你必须继续之前重新加载分区表。最安全的方法是简单地重新启动。但您也可以使用partprobekpartx (更多信息)

步骤3. 调整分区大小并重新加载分区表后,resize2fs在文件系统上运行很简单,即使将其安装为根分区也可以执行此操作。

例:

$ sudo resize2fs /dev/sda1

16
这对我来说非常有效。但是,我确实另外确保了引导标志保留为原始状态。
奥古斯都·克林

4
@ jbo5112:如前所述fdiskpartprobe或者kpartx可以工作而不是重新启动;另见这个问题。即使您重新启动,在停机时,该解决方案仍然比使用实时CD更为可取,因为对于虚拟机而言,一次简单的重新启动可以少于10秒。操作员时间也更快,这就是为什么我通常自己使用这种方法。:)
索伦Løvborg

1
@Raymond:如果内存压力允许(请参阅参考资料free -h),请禁用交换(swapoff /dev/sda2),更改分区表(包括删除和重新创建交换分区),然后1)重新启动或2)重新加载分区表swapon。(如果内存太紧而无法临时禁用交换,则仍然可以创建并启用新的交换分区(/dev/sda3),然后进行swapoff sda2;但是随后必须/etc/fstab使用新的交换设备名称进行更新。)
SørenLøvborg15年

1
如果使用的是vmware,并已扩展了磁盘的大小,则必须运行sudo lshw -C disk重新扫描文件系统,以便vm识别更大的驱动器。然后按照上面的说明进行操作。
Guy 2016年

2
缩小呢?
亚伦·弗兰克

114

可以对ext4文件系统进行在线调整大小,即使它是您的根分区也是如此。使用resize2fs命令。

sudo resize2fs /dev/sda1

编辑:不允许在线收缩:

root@brunojcm-htpc:/home# resize2fs /dev/sda5 2654693
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/sda5 is mounted on /; on-line resizing required
resize2fs: On-line shrinking not supported

55
来自man resize2fsThe resize2fs program does not manipulate the size of partitions. If you wish to enlarge a filesystem, you must make sure you can expand the size of the underlying partition first. This can be done using fdisk(8) by deleting the partition and recreating it with a larger size or using lvextend(8),if you're using the logical volume manager lvm(8).此问题是有关调整分区大小,而不是文件系统大小。区别是微妙的,但非常重要。
卡根

8
您可以使用fdisk删除根分区,然后在同一起始块处重新创建它。fdisk会写出更改,但要等到重启后才能生效。重新引导后,您可以使用resize2fs程序发送磁盘以填充分区。
James Becwar

3
我刚刚在线调整了ext4根分区的大小。因此,我可以确认这是可能的。但是,您无需传递/ dev / sda *作为resize2fs的参数,而是需要传递逻辑卷名称。
CDR

10
对于第一个问题,我发现resize2fs联机帮助页的第一段最有趣:The resize2fs program will resize ext2, ext3, or ext4 file systems. It can be used to enlarge or shrink an unmounted file system located on device. If the filesystem is mounted, it can be used to expand the size of the mounted filesystem, assuming the kernel supports on-line resizing. (As of this writing, the Linux 2.6 kernel supports on-line resize for filesystems mounted using ext3 and ext4.).
mo'12年

5
请不要浪费时间,fdisk何时growpart才能为您轻松做到这一点。
STRML

54

一个更简单的解决方案-使用growpart <device> <partition>

growpart /dev/xvda 1  # Grows the partition; note the space
resize2fs /dev/xvda1  # Grows the filesystem

与往常一样,备份分区表(sfdisk -d /dev/xvda > partition_bak.dmp)以防万一。


缩小呢?
亚伦·弗兰克

希望使用此方法,但是sfdisk: /dev/nvme0n1p5: does not contain a recognized partition table(在Windows中使用双启动)
monkut18年

在线缩水是不可能的。我建议使用gparted它。
STRML

4
growpart是cloud-utils的一部分。如果您尚未安装,则可以使用apt-get install cloud-utils
klor,

1
@monkut晚了聚会,但是您的磁盘很可能会出现/dev/nvme0n1。p5是该磁盘上的分区5。与传统的BSD磁盘片相比,它们使用类似的编号方案。
Per Lundberg

12

是的,您可以收缩/移动/增长在线根分区,而无需任何重新引导(无论是livecd还是usbkey):请参阅此答案。它写得很好并且易于遵循,尽管时间很长而且有点冒险。因此,如果您只想扩展ext4分区,则可以坚持使用常规的工作resize2fs解决方案。

我所寻求的通用解决方案将适用于任何类型的专用或VPS解决方案。

TLDR;该解决方案暗示了这一点pivot_roottmpfs因此您可以umount安全地对根分区进行实时处理。完成后,您将pivot_root回到新的根分区。

这几乎允许对根文件系统进行任何操作(移动它,更改文件系统,更改它的物理设备...)。

没有重新启动是必需的过程中,这允许绕过限制resize2fs 不能够收缩 ext4分区。

我个人使用过它,它在debian系统上也很好用,因此它应该在Ubuntu上也可以。令我惊讶的是,没有看到这种深入的解决方案与处理相同问题的stackexchange网站上的许多问题有更多联系。

注意:当然,如果要扩展分区,只需resize2fs在许多地方和此处的其他答案中说明的简单即可。


4
我认为对于大多数人来说,一旦停止了所有访问根分区的程序和服务,您也可能会重新启动计算机。对于缩小/移动,它可能仍然比使用实时CD快,但是对于增长/扩展(到目前为止,最常见的任务以及OP提出的要求),有些方法不涉及临时关闭大多数系统。
索伦·洛夫堡

2
@SørenLøvborg:您可以在完成整个过程的同时重新启动需要连续生产的核心服务。在许多配置中,您不能放置LiveCD(VPS实例,专用服务器...),或者在某些情况下由于特定原因想要避免重新启动。原始问题的标题提到“调整大小”,这吸引了人们在网上寻找缩小的分区。**没有其他解决方案允许在线收缩ext4。**此解决方案具有风险,复杂,但是功能最强大,并且可以弥补其他缺点。
vaab

1
请不要根据外部链接发布答案。将相关部分放入答案中或发布链接作为对问题的评论。有关详细信息,请参见如何回答
Melebius

10

您也可以只使用GParted-只要要调整大小的分区不是您要从中引导的分区,否则我建议live CD选项对于新手来说会更容易。

GParted基本上完成了所有步骤-仅基于前面的GUI。


我使用Ubuntu 12.04 Live CD启动了系统,并使用GParted调整了ext4分区的大小。对我有好处。无论如何,在执行此操作之前,我已备份了所有重要数据。
StandDuPp

我认为,gparted需要卸载分区。但是我可能是错的。
尼克

问题显然与他们从中引导的分区有关,而引导活动CD则需要重新启动计算机。-1
wjandrea '17

5

刚刚在挂载根系统时,调整了实时系统上ext4根分区的大小。

[root@habib i686]# resize2fs /dev/vg_habib/lv_root
resize2fs 1.42 (29-Nov-2011)
Filesystem at /dev/vg_habib/lv_root is mounted on /; on-line resizing required
old_desc_blocks = 4, new_desc_blocks = 10
Performing an on-line resize of /dev/vg_habib/lv_root to 38427648 (4k) blocks.
The filesystem on /dev/vg_habib/lv_root is now 38427648 blocks long.

[root@habib i686]# 

5

我想对@SørenLøvborg的答案进行扩展:使用当前交换分区扩展该分区。

扩展磁盘后,首先布局磁盘:

$sudo parted /dev/sda 'unit s print' free
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 14336000s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start      End        Size       Type      File system     Flags
        63s        2047s      1985s                Free Space
 1      2048s      10485759s  10483712s  primary   ext4            boot
        10485760s  10487805s  2046s                Free Space
 2      10487806s  12580863s  2093058s   extended
 5      10487808s  12580863s  2093056s   logical   linux-swap(v1)
        12580864s  14335999s  1755136s             Free Space

因此,需要使用磁盘末尾的可用空间来扩展sda1,但是交换分区位于它们之间。这是您可以执行的操作:

首先,我们需要禁用交换。检查它的使用量以及是否可以将其关闭。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           992M         52M        464M        3.2M        475M        784M
Swap:          1.0G          0B        1.0G

交换未在此处使用,因此我们可以将其关闭

$sudo swapoff /dev/sda5

现在我们将更改分区表:

$sudo fdisk /dev/sda

(注意:如果您碰巧第一个分区从扇区63开始而不是从2048开始,则需要添加该选项-c=dos

Welcome to fdisk (util-linux 2.27.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 6.9 GiB, 7340032000 bytes, 14336000 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: 0x9e11c6df

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1  *        2048 10485759 10483712    5G 83 Linux
/dev/sda2       10487806 12580863  2093058 1022M  5 Extended
/dev/sda5       10487808 12580863  2093056 1022M 82 Linux swap / Solaris

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

Partition 2 has been deleted.

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

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-14335999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-14335999, default 14335999): 12242941

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

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 (12242942-14335999, default 12242944):
Last sector, +sectors or +size{K,M,G,T,P} (12242944-14335999, default 14335999):

Created a new partition 2 of type 'Linux' and of size 1022 MiB.

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

The bootable flag on partition 1 is enabled now.

Command (m for help): w
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).

注意:sda1的大小是扇区总数减去交换分区的扇区大小:14335999-2093058 = 12242941

正如fdisk提到的那样:内核仍在使用旧的分区表,因此我们需要重新加载它。

$partprobe

现在我们需要在sda1上运行resize2fs(不要忘记这一点!)

$resize2fs /dev/sda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 10
The filesystem on /dev/sda1 is now 38833617 (4k) blocks long.

现在,事情还没有结束。您可能已经注意到sda2被分区为Linux(Ext4)类型。由于某种原因,fdisk中无法选择类型。所以我们必须使用cfdisk

$ sudo cfdisk

选择sda2并将类型更改为82 Linux swap / Solaris并确保将其写入(键入yes确认)。

现在我们可以重新激活交换

$mkswap /dev/sda2
/dev/sda2
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none swap sw 0 0

最后打开它:

$swapon /dev/sda2

我们唯一需要做的就是在启动时更新fstab以自动安装交换分区

$sudo nano /etc/fstab

并将交换分区的UUID更改为上面的输出:

# swap was on /dev/sda5 during installation
UUID=d58bf1cb-d27a-487d-b337-056767fd5ad6 none            swap    sw              0       0

现在一切正常,您可以重新启动而不会出现问题。


至于交替交换分区类型,可以在fdisk购买中选择t然后选择5(分区5)然后选择82(类型Linux swap / Solaris)
Oz Edri

分区2不应该扩展吗?(然后在fdisk中,我们应该选择e而不是p)另外,mkswap和swapon命令是否应该在/ dev / sda5而不是sda2上运行?
奥兹·埃德里

1
对于交换分区类型:在其他说明中,我发现您确实可以在fdisk中选择类型,但是由于某种原因,它在我的版本中不起作用。无论如何,它将始终与cfdisk一起使用
wouter205 '18

1
对于交换分区:您可以使用扩展分区,但是需要添加两个分区:扩展分区和逻辑分区(请参阅我的初始分区布局)。在我的示例中,最终得到2个主分区:sda1-ext4-根分区和sda2-交换分区。因此,mkswapswapon命令需要在sda2上运行。我在帖子开头确实犯了一个错误:swapoff需要在sda5上执行。评论总是受欢迎的,很难记下来。
wouter205 '18

1
对交换分区进行加密后,必须先使用停止加密磁盘cryptdisks_stop,然后更新/ etc / crypttab而不是使用,然后使用/etc/fstab重启加密磁盘cryptdisks_start
Dmitri Chubarov

1

我只是在不使用umountpivot_root或临时删除主分区的情况下成功地做到了这一点,在Ubuntu 16.04、4.4.0内核上使用parted 3.2。为谨慎起见,我在禁用网络的虚拟控制台上进行了所有操作,并预先拍摄了快照,以防万一,但是不需要快照,因此我可以通过SSH并无需更改运行级别就可以完成快照。

确定分区大小: parted /dev/sda1 print | egrep "Disk.*GB"

(可选)在不联网的情况下切换到多用户模式(必须从控制台而不是SSH完成):

runlevel     # remember the original runlevel
init 2

(可选)制作VM快照以保持谨慎。

调整分区大小:

parted
p
resizepart NUMBER SIZE
# answer "Yes" when asked about resizing a live partition.
q

调整文件系统大小: resize2fs /dev/sda1

如果出现任何问题,您可以在此处还原快照。如果一切正常,恢复正常运行级别(上面获得的) -通常为5: init 5。此时最好进行完全重新启动,以确保一切都恢复正常(此后,我发生了date / ntp问题)。


1

跟着这些步骤。

  1. 以超级用户身份打开终端 su
  2. parted
  3. 键入p以查看可用分区
  4. 确定您的根分区号(例如:“ sda 3”表示数字3),并通过使用rm PARTITION NUMBER创建可用空间来删除相邻分区。
  5. 现在可以通过键入resizepart ROOT NUMBER并重新引导系统来增加根大小
  6. parted通过键入exit和在终端类型中退出,然后按partprobeEnter键(即使在重新启动后也可以完成)
  7. 最终运行resize2fs /dev/sda PARTITION NUMBER并享受宽敞的根分区。

0

如前所述:

  • 可以从根系统实时扩展(没有困难,因为引导部分不会移动)

  • 收缩活动根分区需要从外部引导设备(从活动系统cd / usb-stick引导)完成,好像有任何故障,不匹配..无论如何..您的系统挂起,需要重新启动,最终不会能够正确启动。

任何形式的“但是我做到了,它都能奏效”纯属好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.