使用 grub2 调整/缩小根文件系统(即在挂载之前)

使用 grub2 调整/缩小根文件系统(即在挂载之前)

语境:

  • 一些远程 Debian 7 32 位服务器
  • 仅可通过 SSH 访问
  • 超过一半的磁盘是空的
  • 每台服务器 1 个完整的磁盘分区
  • 维护窗口小,不能长时间停机
  • ext4 文件系统
  • 注意:我正在使用 VirtualBox VM 开发我的解决方案,但服务器是裸机。

目标: 以非破坏性的方式将操作系统升级到 debian 9+,因为理想情况下机器需要保持运行直到重新启动进入新操作系统。


因此,对于每台服务器,我计划(欢迎其他建议)执行以下操作:

  1. 使用 resize2fs 将当前的 deb 7 rootfs 缩小到略小于分区大小的 1/2
  2. 缩小分区以清除 1/2 磁盘
  3. 对新释放的空间进行分区 (/、/home、swap) 并安装 LVM2
    (创建 VG、LV 等) 和 Debian 9

我的问题resize2fs 只能收缩如果未挂载,则为 ext4 fs。因此,想法是在 GRUB2 引导加载序列期间使用 initrd 映像或 initramfs 在未挂载的 /dev/sda1 上调用 resize2fs。

我已经构建了自己的 initrd 映像,其中包含一个静态 resize2fs 二进制文件和一个调用它的 shell 脚本(并执行其他验证等),但我似乎在尝试在 grub.cfg 文件中写入正确的条目以使其挂载我的 initrd 映像并在未挂载的 /dev/sda1 上执行我的调整大小脚本时遇到了障碍。

所以我的问题是:

为了加载包含我的 /bin/resize.sh 脚本的自定义 initrd 映像并执行它(/bin/resize.sh),我需要编写什么 grub.cfg 菜单项?

答案1

(@All:抱歉,刚刚意识到我再也没有回来回答我的问题,所以迟到总比回来好,现在就回答吧。)再次感谢鲍勃顺便说一句,感谢你的帮助。

因此,我的解决方案是:

我设法使用 initrd 使其工作,大致步骤如下:

1.创建initrd映像文件(在 ~/initrd 中解压一个现有的,添加一些文件)然后重新压缩:

debian7-32bits:~/initrd# find . | cpio -o -H newc | gzip -9 > /boot/initrd.img-3.2.0-5-486-resize2fs

2.创建条目在 /boot/grub/grub.cfg 中如下:

debian7-32bits:~/initrd# menuentry "run_once_resize_fs" { set root='(hd0,msdos1)'; insmod linux grub help kernel initrd; linux  /boot/vmlinuz-3.2.0-5-486; initrd /boot/initrd.img-3.2.0-5-486-resize2fs; } 

2.创建条目在 /boot/grub/grub.cfg 中如下:

遗憾的是,我没有在启动时调用菜单项的脚本(步骤 3.?),这可能是 2 年前的事了,而且是在不同的工作场所。希望这仍然能帮助到某些人。

答案2

方法略有不同,但这对我有用:https://wiki.luniel.com/wiki/Shrink_root_partition

钩住 initramfs

您可以在重启时使用 initramfs 缩小文件系统。您需要将 resize2fs 添加到 initramfs 并在挂载 root 之前运行它。

我们定义钩子:

cat /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

我们使其可执行

chmod +x /etc/initramfs-tools/hooks/resizefs

脚本要缩小,我们将其设置为小于最终大小:

cat /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/mapper/vg-root
/sbin/resize2fs /dev/mapper/vg-root 9G
/sbin/e2fsck -yf /dev/mapper/vg-root

我们使其可执行:

chmod +x /etc/initramfs-tools/scripts/local-premount/resizefs

更新 initramfs

update-initramfs -u

重启服务器:

reboot

您只需/dev/mapper/vg-root用您的驱动器(例如/dev/sda)和 9G 替换为所需的大小。运行后,您会发现df显示新大小,但fdisk仍显示原始大小(请参阅https://unix.stackexchange.com/questions/740307/why-does-free-space-differ-when-shown-by-fdisk-and-df)。您需要使用类似parted来缩小fdisk

相关内容