さて、基本的に、私はWUBIと同様の方法でGentooを起動しようとしています。私はext4フォーマットのループバックファイル、Windowsブートローダーの下にインストールされたBURG、およびブートに使用できるkernel / initramfsにインストールしています。起動にはまだいくつかの問題があります(解決できると思いますが、それらは主にプログラム自体の小さな問題が原因です)。
- busyboxをセットアップし、mdevでデバイスを取得する
- コマンドラインオプションを解析し、実際のルートまたはループルートを要求するかどうかを決定します
- 実際のルートの場合は、マウントして
/rootルートを切り替え、を実行し/sbin/initます。 - ループルートの場合、ホストパーティションをにマウントします
/host。 - ループバック(
/host/${LOOP})をマウント/root - ホストのマウントポイントを移動します(
mount -o move /host /root/hostbusyboxの場合) - ルートを切り替えて
/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はやなどのbusyboxの実装に同意していないmountようです(何らかの理由でパラメーター-iが追加され、ntfs-3gクラップアウトされます)coreutils。それと、ループバックパーティションのマウントに必要なものを調べる必要があります(ループバックを手動でマウントしようとすると、「ファイルが見つかりません」などのエラーが表示されます)。それでも、これらは私自身で理解するのに十分簡単だと思います。
しかし、私が不思議に思っているのはシャットダウンです。いったんswitch_root完了すると、システムがで残される/ファイルをループバックマウントして/dev/sda2(これは、Windows 7がインストールされ)で/host。現在、/hostは使用中のため、マウントを解除する方法はありません。ただし、/ルートのファイルシステムがサブディレクトリにマウントされている間は、マウントを解除できません。WUBIベースのUbuntuインストールも同じジレンマに直面する必要があります。この問題をどのようにして克服しますか?それは鶏と卵の問題であり、私は本当に迷惑です。
私は、基本的な基本的なルート(initramfsのようなものですが、その逆)のファイルの一時的なキャッシュを保持するブートスクリプトに沿って何かを検討していました。それは最後に実行され、ファイルをtmpfsにコピーし、ルートをピボットし、おそらくinitramfsの元のレイアウトに戻します。私は基本的にこれをやっています:
tmpfsat/tmp/shutdown/または何かをマウントします。- シャットダウンファイルをコピーします(おそらく
/usr/share/shutdown/何か) pivot_rootルートを/looptmpfs に移動し、chrootします。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`optsに追加されましたkillall5(ntfs-3gが強制終了されないようにするため)。- shutdown.shとrestart.shを変更して、tmpfsを/ boot / shutdownfsにマウントし、そこにいくつかのinitramfsファイルをコピーし、ルートをピボットしてから、chrootし、/ downまたは/ restartを呼び出します。
- これらの2つのスクリプトは基本的に、迅速でダーティな/ procおよび/ sysセットアップを実行し、/ root / hostを/ hostに移動してから、レイジーアンマウントを実行します。定期的にアンマウントすることはできませんでしたが(ファイルシステムはまだビジー状態です)、少なくともこれにより、ファイルシステムが完全に嘔吐するのを防ぐことができます。
この解決策はまだ不十分ですので、どんな助けもいただければ幸いです。