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

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

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

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

命令行(任何Ubuntu版本):这有三个步骤。

步骤1.必须首先调整分区大小。 如果你正在使用LVM,那很简单,你可能知道如何继续。 如果您使用的是经典分区,则会更复杂,并且可能需要重新启动(尽管您无需启动其他系统或Live 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系统为83)​​。 准备好在最轻微的错字中丢失所有数据。

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

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

到目前为止,人们应该建议使用现场CD。 😉

步骤2.正如fdisk提醒您的那样,您必须重新加载分区表才能继续。 最安全的方法是简单地重启; 但您也可以使用partprobekpartx (更多信息) 。

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

例:

 $ sudo resize2fs /dev/sda1 

即使它是你的根分区,也可以对ext4文件系统进行在线resize。 使用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 

更简单的解决方案 – 使用growpart

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

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

您也可以使用GParted – 只要您resize的分区不是您启动的分区 – 否则我建议实时CD选项对于新手来说更容易一些。

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

是的, 您可以缩小/移动/增长在线根分区而无需重新启动(也不是livecd,也不是usbkey): 请参阅此答案 。 它写得很好,很容易理解,虽然很长很危险。 因此,如果您只想扩展ext4分区,可以坚持使用传统的resize2fs解决方案。

我所理解的一般解决方案将适用于任何类型的专用或VPS解决方案。

TLDR; 这个解决方案意味着将pivot_roottmpfs这样你就可以安全地安装你的root分区,然后摆弄它。 完成后,您将回调新的根分区。

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

在此过程中不需要重新启动,这允许绕过 resize2fs 无法缩小 ext4分区的限制。

我亲自使用过它,它在debian系统上运行得非常好,所以它应该适用于Ubuntu。 我很惊讶没有看到这个深入的解决方案与stackexchange网站中处理相同问题的许多问题有关。

注意:当然,如果你想增长你的分区,一个简单的resize2fs就足够了,如许多地方和其他答案所述。

刚刚挂载root时,刚刚在活动系统上调整了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]# 

我刚刚在没有umountpivot_root或临时删除主分区的情况下成功完成了这一操作,在Ubuntu 16.04,4.4.0内核上使用了parted 3.2。 为了保持谨慎,我在禁用网络的虚拟控制台上做了所有事情,并事先拍了快照以防万一,但是不需要快照,所以我也可以通过SSH完成这项工作,而不需要更改运行级别。

确定分区大小: parted /dev/sda1 print | egrep "Disk.*GB" 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 。 在这一点上进行完全重启可能会更好,以确保所有内容都恢复正常(之后我有一个日期/ ntp问题)。

如前所述:

  • 从根系统扩展是可能的。(没有困难,因为引导部分不被移动)

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

任何forms的“但我做到了,它有效”是纯粹的运气。

跟着这些步骤。

  1. 以超级用户su开放终端
  2. parted
  3. 键入p以查看可用分区
  4. 识别您的根分区号(例如:’sda 3’表示3号)并使用rm PARTITION NUMBER删除相邻分区以创建可用空间。
  5. 现在通过键入resizepart ROOT NUMBER来增加根大小,并在需要时重启系统
  6. 通过键入exit并在终端类型partprobe exit并按Enter键(即使重启后也可以这样做)
  7. 最后运行resize2fs /dev/sda PARTITION NUMBER并享受宽敞的root分区。

我想对@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/sda2 

现在我们将更改分区表:

 $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): 122 42941 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 

现在一切都很好,你可以重启没有问题。