如何在运行时增加系统根分区的大小?
我有一个未在根分区(也是ext4)之后分配的分区,如何在不关闭服务器的情况下将未分配的空间添加到分配给根分区的空间中?
如何在运行时增加系统根分区的大小?
我有一个未在根分区(也是ext4)之后分配的分区,如何在不关闭服务器的情况下将未分配的空间添加到分配给根分区的空间中?
Answers:
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
有益提醒你,你必须继续之前重新加载分区表。最安全的方法是简单地重新启动。但您也可以使用partprobe
或kpartx
(更多信息)。
步骤3.
调整分区大小并重新加载分区表后,resize2fs
在文件系统上运行很简单,即使将其安装为根分区也可以执行此操作。
例:
$ sudo resize2fs /dev/sda1
free -h
),请禁用交换(swapoff /dev/sda2
),更改分区表(包括删除和重新创建交换分区),然后1)重新启动或2)重新加载分区表swapon
。(如果内存太紧而无法临时禁用交换,则仍然可以创建并启用新的交换分区(/dev/sda3
),然后进行swapoff sda2
;但是随后必须/etc/fstab
使用新的交换设备名称进行更新。)
可以对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
man resize2fs
:The 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).
此问题是有关调整分区大小,而不是文件系统大小。区别是微妙的,但非常重要。
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.).
fdisk
何时growpart
才能为您轻松做到这一点。
一个更简单的解决方案-使用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中使用双启动)
gparted
它。
apt-get install cloud-utils
/dev/nvme0n1
。p5是该磁盘上的分区5。与传统的BSD磁盘片相比,它们使用类似的编号方案。
是的,您可以收缩/移动/增长在线根分区,而无需任何重新引导(无论是livecd还是usbkey):请参阅此答案。它写得很好并且易于遵循,尽管时间很长而且有点冒险。因此,如果您只想扩展ext4分区,则可以坚持使用常规的工作resize2fs
解决方案。
我所寻求的通用解决方案将适用于任何类型的专用或VPS解决方案。
TLDR;该解决方案暗示了这一点pivot_root
,tmpfs
因此您可以umount
安全地对根分区进行实时处理。完成后,您将pivot_root
回到新的根分区。
这几乎允许对根文件系统进行任何操作(移动它,更改文件系统,更改它的物理设备...)。
没有重新启动是必需的过程中,这允许绕过限制的resize2fs
不能够收缩 ext4
分区。
我个人使用过它,它在debian系统上也很好用,因此它应该在Ubuntu上也可以。令我惊讶的是,没有看到这种深入的解决方案与处理相同问题的stackexchange网站上的许多问题有更多联系。
注意:当然,如果要扩展分区,只需resize2fs
在许多地方和此处的其他答案中说明的简单即可。
您也可以只使用GParted-只要要调整大小的分区不是您要从中引导的分区,否则我建议live CD选项对于新手来说会更容易。
GParted基本上完成了所有步骤-仅基于前面的GUI。
刚刚在挂载根系统时,调整了实时系统上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]#
我想对@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
现在一切正常,您可以重新启动而不会出现问题。
mkswap
&swapon
命令需要在sda2上运行。我在帖子开头确实犯了一个错误:swapoff
需要在sda5上执行。评论总是受欢迎的,很难记下来。
cryptdisks_stop
,然后更新/ etc / crypttab而不是使用,然后使用/etc/fstab
重启加密磁盘cryptdisks_start
。
我只是在不使用umount
,pivot_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问题)。
跟着这些步骤。
su
parted
p
以查看可用分区rm PARTITION NUMBER
创建可用空间来删除相邻分区。resizepart ROOT NUMBER
并重新引导系统来增加根大小parted
通过键入exit
和在终端类型中退出,然后按partprobe
Enter键(即使在重新启动后也可以完成)resize2fs /dev/sda PARTITION NUMBER
并享受宽敞的根分区。