语境:
- 一些远程 Debian 7 32 位服务器
- 仅可通过 SSH 访问
- 超过一半的磁盘是空的
- 每台服务器 1 个完整的磁盘分区
- 维护窗口小,不能长时间停机
- ext4 文件系统
- 注意:我正在使用 VirtualBox VM 开发我的解决方案,但服务器是裸机。
目标: 以非破坏性的方式将操作系统升级到 debian 9+,因为理想情况下机器需要保持运行直到重新启动进入新操作系统。
因此,对于每台服务器,我计划(欢迎其他建议)执行以下操作:
- 使用 resize2fs 将当前的 deb 7 rootfs 缩小到略小于分区大小的 1/2
- 缩小分区以清除 1/2 磁盘
- 对新释放的空间进行分区 (/、/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
。