WUBI 如何在关机时处理分区?

Ani*_*mus 10 ntfs gentoo wubi loopback ubuntu

好吧,基本上,我正在尝试以类似于 WUBI 的方式启动 Gentoo;我在 ext4 格式的环回文件上安装了 BURG,安装在 Windows 引导加载程序下,内核/initramfs 可用于引导。启动仍然存在一些问题(我认为我可以解决这些问题,它们主要是由于程序本身的小问题)但我有基本的想法:

  1. 设置busybox并使用mdev获取设备
  2. 解析命令行选项,确定是否要求真正的根或循环根
  3. 如果是真正的 root,则挂载它/root并切换 root,执行/sbin/init.
  4. 如果循环 root,则将主机分区挂载到/host.
  5. 安装环回 ( /host/${LOOP})/root
  6. 移动主机的挂载点(mount -o move /host /root/host对于busybox)
  7. 切换到 root/root并执行/sbin/init

init这里有脚本:

#!/bin/sh

# Rescue shell in case of error.
rescue_shell() {
     echo "Something went wrong. Dropping you to a shell."
     exec /bin/sh
 }

parse_opt() {
        case "$1" in
                *\=*)
                        echo "$1" | cut -d= -f2-
                ;;
        esac
}

# Set up BusyBox...
busybox --install -s

# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys

# Populate /dev
echo ":: Populating /dev..."
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

# Get command line options...
for x in ${CMDLINE}
do
        case "${x}" in
                root\=*)
                        ROOT=`parse_opt "${x}"`
                ;;
                # Loadloop
                loop\=*)
                        LOOP=`parse_opt "${x}"`
                ;;
                ntfsroot)
                        NTFSROOT=1
  ;;
 esac
done


if [ "${NTFSROOT}" != 1 ]
then
 # Mount the root filesystem, plain and simple.
 echo ":: Mounting real root..."
 mount -o ro "${ROOT}" /mnt/root || rescue_shell
else
 # Load up an NTFS-based root.
 echo ":: NTFS Root mount requested. Mounting..."
 ntfs-3g "${ROOT}" /host

 if [ -f "/host/${LOOP}" ]
 then
  mount -o loop,ro  "/host/${LOOP}" /root || rescue_shell
  echo ":: Mounted. Moving host..."
  mount -o move /host /root/host || rescue_shell
  echo ":: Mounted."
 else
  "!! ERROR: Invalid/nonexistant loop given!"
  rescue_shell
 fi
fi

# Clean up.
umount /proc
umount /sys

# Boot the real thing.
echo ":: Switching to root and calling init..."
exec switch_root /root /sbin/init
Run Code Online (Sandbox Code Playgroud)

没什么复杂的,真的。NTFS-3G 显然不同意 busybox 实现mount和东西(它出于某种原因添加了参数 -i,然后ntfs-3g胡说八道),所以我正在考虑只是复制coreutils实现或其他东西。那,我需要检查挂载环回分区需要什么(当我尝试手动挂载环回时,它给了我一个类似“找不到文件”的错误)。不过,我认为这些很容易让我自己弄清楚。

但是,我有点想知道是关机。一旦switch_root完成后,系统会留下一个/回送挂载文件/dev/sda2(这是Windows 7安装)上/host。现在,无法卸载/host,因为它正在使用中。但是,/当根目录中的文件系统挂载在子目录中时,无法卸载。基于 WUBI 的 Ubuntu 安装必须面临同样的困境。如何克服这个问题?这是一个先有鸡还是先有蛋的问题,这真的让我很烦。

我正在考虑一些类似于引导脚本的内容,该脚本为基本的基本根目录(如 initramfs,但反过来)保存文件的临时缓存。它会最后运行,将文件复制到 tmpfs,旋转根目录,也许让它回到 initramfs 的原始布局。我基本上会这样做:

  1. 挂载一个tmpfsat/tmp/shutdown/什么的。
  2. 复制关闭文件(也许/usr/share/shutdown/或什么)
  3. pivot_root将根移至/looptmpfs 并将 chroot 移入 tmpfs。
  4. mount --move/loop/host/host
  5. 卸载 /loop
  6. 卸载 /host
  7. 干净地关闭,因为所有分区都已卸载。

但是,我从未对 Gentoo 进行过如此多的修改。这可以用 initscript 实现吗?我不希望它被 baselayout 的任何更新或任何 ebuild 覆盖,因为这会让我的关机功能中断(而且我真的不想丢失主机分区)。还有一个问题是要弄清楚 Gentoo 的 init 系统是否甚至支持这样的东西。它看起来足够干净(如果有点hackish),但我不太确定。我想知道 Ubuntu 是否有不同的做法,如果有,如何做?任何的意见都将会有帮助。

编辑

我让引导工作。就像我想的那样,只是使用 的coreutils版本的问题mount。但是,我在关机时遇到了预期的错误;无法卸载文件系统的错误和环回 FS 的日志错误。我仍然不知道如何解决这个问题。

编辑2:

好吧,好吧,我有一些事情要做......有点工作。我基本上编辑/etc/init.d/{halt.sh,reboot.sh,shutdown.sh}并执行了以下操作:

  • 添加/hostRC_NO_UMOUNTS变量中,这会阻止 EXT4 模块因日志错误而窒息
  • 添加-o `pidof ntfs-3g`到 opts for killall5(以确保它没有杀死 ntfs-3g)
  • 修改了shutdown.sh 和restart.sh 以在/boot/shutdownfs 上挂载tmpfs 并在那里复制一些initramfs 文件,将root 旋转,然后chroot 进入其中,调用/down 或/restart。
  • 这两个脚本本质上做了一些快速而肮脏的 /proc 和 /sys 设置,将 /root/host 移动到 /host,然后进行延迟卸载。我无法定期卸载工作(文件系统仍然很忙),但至少这似乎阻止了文件系统完全呕吐。

此解决方案仍然低于标准,因此将不胜感激。

Hel*_*o71 0

man 8 umount:

-l

懒惰卸载。现在将文件系统从文件系统层次结构中分离出来,并在文件系统不再繁忙时立即清除对文件系统的所有引用。(需要内核 2.4.11 或更高版本。)