さて、基本的に、私はWUBIと同様の方法でGentooを起動しようとしています。 ext4形式のループバックファイルにインストールし、Windowsブートローダーの下にBURGをインストールし、カーネル/ initramfsを起動できるようにしました。起動にはまだいくつかの問題があります(私が解決できると思うもの、それらは主にプログラム自体の小さな問題が原因です)が、私は基本的な考えを持っています:
/root
にマウントし、ルートを切り替えて、/sbin/init
を実行します。/Host
にマウントします。/Host/${LOOP}
)を/root
にマウントしますmount -o move /Host /root/Host
)/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
本当に複雑なことは何もありません。 NTFS-3Gは、mount
などのbusyboxの実装に同意していないようです(何らかの理由でパラメーター-iが追加され、ntfs-3g
がクラップスになります)ので、コピーすることを検討しています。 coreutils
の実装か何か。それで、ループバックパーティションをマウントするために何が必要かを調べる必要があります(ループバックを手動でマウントしようとすると、「ファイルが見つかりません」などのエラーが表示されます)。それでも、これらは自分で理解するのに十分簡単だと思います。
しかし、私が疑問に思っているのはシャットダウンです。 switch_root
が完了すると、システムには/
ループバックマウントファイルと/dev/sda2
(これはWindows 7のインストールです)が/Host
に残ります。現在、/Host
は使用中であるため、アンマウントする方法はありません。ただし、ルートのサブディレクトリにファイルシステムがマウントされている間は、/
をアンマウントすることはできません。 WUBIベースのUbuntuインストールも同じジレンマに直面する必要があります。この問題をどのように克服しますか?それは鶏が先か卵が先かという問題で、本当に迷惑です。
私は、基本的な基本ルート(initramfsのようですが、その逆)のファイルの一時キャッシュを保持するブートスクリプトの行に沿って何かを検討していました。それは最後に実行され、ファイルをtmpfsにコピーし、ルートをピボットし、おそらくinitramfsの元のレイアウトに戻します。私は本質的にこれをしているでしょう:
tmpfs
を/tmp/shutdown/
などにマウントします。/usr/share/shutdown/
など)pivot_root
でルートを/loop
に移動し、chrootでtmpfsに移動します。mount --move
/loop/Host
から/Host
/loop
/Host
ただし、Gentooをこれほど変更したことはありません。これはinitscriptで可能ですか? baselayoutやebuildの更新によってこれが上書きされることは望ましくありません。シャットダウン機能が壊れてしまうからです(そして、ホストパーティションを失いたくないのです)。 Gentooのinitシステムがこのようなものをサポートしているかどうかを判断するという問題もあります。それは十分にきれいに見えますが(少しハックっぽい場合)、私はそれについてあまりよくわかりません。 Ubuntuが違うやり方をしているのか知りたいのですが、もしそうなら、どうやって?どんな提案も役に立ちます。
[〜#〜]編集[〜#〜]:
ブーツが機能しました。思ったように、coreutils
のmount
バージョンを使用するだけです。ただし、シャットダウン時に予期したエラーが発生します。ファイルシステムをアンマウントできないエラー、およびループバックFSでのジャーナリングエラー。これを修正する方法がまだわかりません。
編集2:
さて、まあ、私は何かが起こっている...ある種の作品。私は基本的に/etc/init.d/{halt.sh,reboot.sh,shutdown.sh}
を編集し、次のことを行いました。
/Host
変数にRC_NO_UMOUNTS
を追加しました。これにより、EXT4モジュールがジャーナリングエラーについて窒息するのを防ぎます。-o `pidof ntfs-3g`
のオプションにkillall5
を追加しました(ntfs-3gを強制終了しないようにするため)この解決策はまだ標準以下なので、助けていただければ幸いです。
ここでは専門家ではありませんが、umount
のマンページを読んだ後、ループマウントされたデバイスに固有のフラグが表示されます。
-d In case the unmounted device was a loop device, also free this loop device.
また、losetup
(まだマンページにあります)をさらに読んで、ループマウントされたデバイスのステータスを確認するために使用できるので、デバッグに使用することをお勧めします。
私が参照しているマンページへのリンク ここにあります 。このオプション:
-a Show status of all loop devices.
手がかりが得られる可能性があり、他のいくつかのフラグがループしたデバイスのアンマウントに役立つ可能性があります。
私はあなたの状況を再現することができないので、私はあなたにあなた自身であなたの答えを見つける方法を提案することができるだけです、申し訳ありませんが私はこれ以上の助けにはなりません。
-l
怠惰なアンマウント。ここでファイルシステム階層からファイルシステムを切り離し、ビジー状態がなくなったらすぐにファイルシステムへのすべての参照をクリーンアップします。 (カーネル2.4.11以降が必要です。)