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

Ali*_*cia 55 linux ext4 hard-drive lvm

今天我在我的机器上用 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
Run Code Online (Sandbox Code Playgroud)

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

它真的不受支持还是我遗漏了什么?

Mic*_*ton 84

正如消息所说,您只能在线增长ext4 文件系统。如果你想缩小它,你需要先卸载它。

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

抱歉,不支持在线收缩。

  • @MichaelHampton - 一些白痴射击信使?:D (25认同)
  • 太可惜了... (12认同)
  • 投反对票是怎么回事? (6认同)
  • 那是10年前。这已经实施了吗? (3认同)
  • @duane 不,还没有。也不可能永远如此。 (3认同)

uru*_*sha 29

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

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

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

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

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

# simple device example
/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 5G # see size info below
/sbin/e2fsck -yf /dev/sda1

# complex device example
# activate md-raid containing FS/PV
#/sbin/mdadm -A /dev/md0
# activate VG containing FS
#/sbin/lvm vgchange -ay vg0
# resize
#/sbin/e2fsck -yf /dev/vg0/root # or /dev/md0
#/sbin/resize2fs /dev/vg0/root 5G
#/sbin/e2fsck -yf /dev/vg0/root
Run Code Online (Sandbox Code Playgroud)

现在运行update-initramfs -u -k kernel-name以更新kernel-name在引导加载程序 (grub) 中设置为默认值的内核的 initramfs 。如果启动失败 - 您可以使用另一个未修改的健康内核/initramfs 启动。或者你可以用它all来更新所有内核,但是你没有办法回来。

检查你没有任何工具在您的系统可以自动增长文件系统(例如云初始化-注释resizefs/etc/cloud/cloud.cfg)。

重启。检查文件系统大小。删除 initramfs 脚本并update-intiramfs -u -k kernel-name再次运行。

现在,您可以缩小与底层设备parted resizepart/ mdadm --grow --size=/ lvresize -L。设备的大小应该大于脚本中文件系统的大小。不出错的最简单方法:如果计划的设备大小 - 6G。将脚本中的 fs 大小设置为 5G。调整 fs 大小后 - 将设备大小调整为 6G,然后使用resize2fs /dev/sda1. 现在您的 fs 非常适合您的设备。

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

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

  • 这就像一个魅力。请注意,您需要使用 -u 选项运行 update-initramfs。 (4认同)

vaa*_*aab 22

是的,您可以在不重新启动的情况下缩小/移动/增长根分区(也不是 livecd,也不是 usbkey):请参阅此答案。它写得很好,很容易理解,虽然很长而且有点冒险。

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

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

例如,我链接的通用解决方案适用于任何类型的专用或 VPS 解决方案。

TLDR;这种解决方案意味着要pivot_roottmpfs这样你就可以umount放心地根分区的生活和摆弄它。完成后,您将pivot_root回到新的根分区。

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

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

  • 与“在线增长”相比,这不是“在线”。所有服务都必须关闭,您的根文件系统将无法访问。可能值得在此评论中将其与 livecd 或 initramfs/rdshell 方法进行对比。我讨厌人们对此感到困惑。 (13认同)
  • @BrianChrisman 这确实是一个值得澄清的问题,我希望我已经在我的帖子中进行了编辑。非常感谢您的反馈。 (3认同)