是否可以使用LVM在线压缩EXT4卷?


47

今天,我在使用OpenSUSE 12.3(内核3.7)的计算机上尝试了此操作:

# resize2fs /dev/mapper/system-srv 2G
resize2fs 1.42.6 (21-Sep-2012)
Filesystem at /dev/mapper/system-srv is mounted on /srv; on-line resizing required
resize2fs: On-line shrinking not supported

/dev/mapper/system-srv 是EXT4卷。

真的不受支持吗?或者我缺少什么?

Answers:


67

如消息所述,您只能在线扩展文件系统。如果要缩小它,则需要先将其卸下。

根据ext4文件系统维护者 Ted Ts'o的说法

抱歉,不支持在线缩小。


11
真可惜...
艾丽西亚(Alicia)

5
下票是什么?
迈克尔·汉普顿

15
@MichaelHampton-一些傻瓜射击信使?:D
修补程式

1
那是十年前。这已经实施了吗?
杜安

@duane不,没有。也不可能。
迈克尔·汉普顿

16

是的,您可以收缩/移动/增长根分区,而无需任何重新引导无论是livecd还是usbkey):请参阅此答案。它写得很好并且易于遵循,尽管时间很长而且有点冒险。

resize2fs 无法缩小在线ext4分区。在根分区上应用此限制后,您可能会认为您无法避免重新引导主机以缩小root分区,而这可能是您要避免的事情。链接的过程将使您无需重新启动即可卸载根分区。所以从这个角度它不是严格意义上讲网上的问候分区的安装状态调整大小,但它仍然是关于主机的网络在线状态或可达性的联机调整大小。

当然,如果您只想扩展ext4分区,则应该坚持使用常规的工作resize2fs解决方案。

我链接的一般解决方案可以在任何类型的专用或VPS解决方案上使用。

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

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

我个人使用过它,它在debian系统上也很好用,但是该指南最初是在2007年为redhat编写的,我链接的答案针对CentOS7进行了更新。尽管可能会进行一些调整,但很有可能在您的OpenSUSE上运行。


3
与“在线增长”相比,这不是“在线”。所有服务都必须关闭,并且您的根文件系统不可访问。在此注释中,可能有必要将其与livecd或initramfs / rdshell方法进行对比。我希望人们对此感到困惑。
布莱恩·克里斯曼

1
@BrianChrisman这确实是一个值得澄清的陷阱,我希望我已经对自己的帖子进行了编辑。非常感谢您的反馈。
vaab

我喜欢引用的解决方案,因为它几乎是在线的。我通过将一个小的脚本和工具编码到dracut命令中并通过从kexec启动生成的initramfs来完成此特定操作。如果这样做可以在整个过程中使ssh会话保持打开状态,那将是最佳选择。我想,如果您使用sshd和所需的文件构建伪造的根,在另一个端口上启动另一个sshd(因为您已经被ssh'了),那么您可以ssh到另一个端口并验证连接性,然后继续使系统正常运行。
Brian Chrisman

13

如果情况是没有控制台的远程服务器,则可以在重新引导时使用initramfs收缩文件系统。您需要在挂载root之前将resize2fs添加到initramfs并运行它。

Debian / Ubuntu示例:

/ etc / initramfs-tools / hooks / resizefs(可执行):

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case $1 in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/e2fsck
copy_exec /sbin/resize2fs

exit 0

/ etc / initramfs-tools / scripts / local-premount / resizefs(可执行)

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 5G
/sbin/e2fsck -yf /dev/sda1

现在运行update-initramfs,重新启动,检查大小,删除这些脚本,然后再次执行update-intiramfs。

对于dracut(Fedora,CentOS),请使用相同的逻辑(/usr/lib/dracut/modules.d)。

这对于加密或移动rootfs非常有用,没有可用空间用于新分区。


2
这就像一个魅力。请注意,您需要使用-u选项运行update-initramfs。
Diomidis Spinellis

凉。就我而言,我也需要update-grub
Wojciech Kaczmarek '18年
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.