如果我只有 ssh 访问权限,如何更改根分区的 casefold ext4 文件系统选项

如果我只有 ssh 访问权限,如何更改根分区的 casefold ext4 文件系统选项

我需要在 Debian 11 服务器的 ext4 上启用不区分大小写的文件系统功能(casefold),该服务器具有向后移植的 6.1 Linux 内核,并编译了所需的选项。

服务器有一个 2GB 的交换分区和一个用于文件系统的大 ext4 分区,它也从该分区启动。我只能以 root 身份进行 ssh 访问,无法访问物理/虚拟主机本身,因此我无法访问(虚拟)USB 棒或 CDROM 介质。

启用皮夹功能的最快方法是什么? une2fs 不想这样做,因为文件系统已安装。

想法:删除交换区,在其中安装一个小型救援系统,重新启动到所述救援系统,更改根分区的文件系统选项,重新启动到活动分区并恢复交换区。但为了实现这一点,我需要准备一个额外的 Linux 系统来执行所需的une2fs命令。

有没有更好的办法?我可以使用任何救援系统并在重新启动后预先配置所需的网络设置吗?

答案1

感谢@Marcus Müller,我能够做到这一点。诀窍是将tune2fs 添加到initrd 映像中并在引导期间调用它。

创建脚本initramfs-utils

cat > /usr/share/initramfs-tools/scripts/local-premount/ext4_casefold << 'EOF'
#
# ext4_casefold
#
# initrd script to add the casefold option to the root filesystem
#

DEVICE=/dev/sda2

prereqs()
{
    . /usr/share/initramfs-tools/hook-functions 
    copy_exec /usr/sbin/tune2fs usr/sbin/tune2fs
}

case $1 in
# get pre-requisites
prereqs)
        prereqs
        exit 0
        ;;
esac

echo "Adding casefold option to $DEVICE"
sleep 5
/usr/sbin/tune2fs -O casefold $DEVICE
echo "If everything went well, we added the casefold option to $DEVICE"
sleep 5

EOF

使其可执行:

chmod a+x /usr/share/initramfs-tools/scripts/local-premount/ext4_casefold

重建initrd:

update-initramfs -u

检查ramdisk的内容是否确实包含tune2fs(可选):

INIT_RD_IMAGE=initrd.img-6.1.0-0.deb11.7-amd64
rm -rf /root/initrd
mkdir /root/initrd
cp /boot/$INIT_RD_IMAGE /root/$INIT_RD_IMAGE.gz
gunzip /root/$INIT_RD_IMAGE.gz
cd /root/initrd
cpio -id < /root/$INIT_RD_IMAGE

重新启动并享受!

答案2

我喜欢你的做法;它很干净,因为它不需要修改主系统上的数据。

而且,是的,我认为如果你想tune2fs大幅运行,最简单的解决方案是从正在运行的 Linux 运行它,这样当主文件系统未安装时就没有真正的办法来运行它。

我认为你的网络设置没有任何意义——你确切地知道你想要你的系统做什么;预配置网络以向您提供 SSH shell 比仅tune2fs … /dev/disk/by-partuuid/…在自动执行的脚本中运行(然后继续执行启动正常系统所需的操作)更困难。

现在,有两个选择:

  1. 您的 Debian 当前使用初始化程序含有一个初始化文件系统(我希望如此)
  2. 事实并非如此。

在第一种情况下,修改 initrd 生成过程以仅包含必要的tune2fs调用,生成一个新的 initrd,并用它引导,这可能是最简单的。请注意,initrd 确实是您想要避免构建的内容:自定义的成熟 Linux 系统(这恰好是 Linux 发行版在挂载根文件系统并继续主引导过程之前初始化系统的方法)。不管怎样,debian 已经为你构建了这些:)
我必须承认,自从我为 debianoid Linux 做类似的事情以来已经有十年(或更长时间)了,所以我对如何;查看 debian 的(遗憾的是看起来有点稀疏/过时)文档,看看/etc/mkinitrd.

在第二种情况下,你的方法似乎是明智的。

答案3

我过去用于远程根文件系统修改的方法是在 ramdisk 中设置一个轻量级操作系统(例如通过安装 atmpfs然后debootstrapping 到它),然后使用pivot_root该 ramdisk 运行。通过一些清理,您就可以卸载根文件系统并继续进行更改。这一切都可以实时完成,无需在任何时候重新启动系统 - 当然,最后重新启动可能是使系统恢复到干净状态的好主意。

使用此方法的优点是您应该能够在此过程中保持远程连接并解决进行更改时可能出现的任何问题。您还可以在最终重新启动之前尝试安装修改后的文件系统。

有一个非常全面的使用pivot_root指南这个类似问题的答案。该答案将现有系统的核心部分复制到 ramdisk - 这使得保留 ssh 访问和其他工具变得更加容易。

相关内容