web-dev-qa-db-ja.com

WUBIはシャットダウン時にパーティションをどのように処理しますか?

さて、基本的に、私はWUBIと同様の方法でGentooを起動しようとしています。 ext4形式のループバックファイルにインストールし、Windowsブートローダーの下にBURGをインストールし、カーネル/ initramfsを起動できるようにしました。起動にはまだいくつかの問題があります(私が解決できると思うもの、それらは主にプログラム自体の小さな問題が原因です)が、私は基本的な考えを持っています:

  1. Busyboxをセットアップし、mdevでデバイスを入手する
  2. コマンドラインオプションを解析し、実際のルートとループルートのどちらを要求するかを決定します
  3. 実際のルートの場合は、/rootにマウントし、ルートを切り替えて、/sbin/initを実行します。
  4. ルートをループする場合は、ホストパーティションを/Hostにマウントします。
  5. ループバック(/Host/${LOOP})を/rootにマウントします
  6. ホストのマウントポイントを移動します(busyboxの場合はmount -o move /Host /root/Host
  7. ルートを/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の元のレイアウトに戻します。私は本質的にこれをしているでしょう:

  1. tmpfs/tmp/shutdown/などにマウントします。
  2. シャットダウンファイルをコピーします(おそらく/usr/share/shutdown/など)
  3. pivot_rootでルートを/loopに移動し、chrootでtmpfsに移動します。
  4. mount --move/loop/Hostから/Host
  5. アンマウント/loop
  6. アンマウント/Host
  7. すべてのパーティションがアンマウントされているため、正常にシャットダウンします。

ただし、Gentooをこれほど変更したことはありません。これはinitscriptで可能ですか? baselayoutやebuildの更新によってこれが上書きされることは望ましくありません。シャットダウン機能が壊れてしまうからです(そして、ホストパーティションを失いたくないのです)。 Gentooのinitシステムがこのようなものをサポートしているかどうかを判断するという問題もあります。それは十分にきれいに見えますが(少しハックっぽい場合)、私はそれについてあまりよくわかりません。 Ubuntuが違うやり方をしているのか知りたいのですが、もしそうなら、どうやって?どんな提案も役に立ちます。

[〜#〜]編集[〜#〜]

ブーツが機能しました。思ったように、coreutilsmountバージョンを使用するだけです。ただし、シャットダウン時に予期したエラーが発生します。ファイルシステムをアンマウントできないエラー、およびループバックFSでのジャーナリングエラー。これを修正する方法がまだわかりません。

編集2:

さて、まあ、私は何かが起こっている...ある種の作品。私は基本的に/etc/init.d/{halt.sh,reboot.sh,shutdown.sh}を編集し、次のことを行いました。

  • /Host変数にRC_NO_UMOUNTSを追加しました。これにより、EXT4モジュールがジャーナリングエラーについて窒息するのを防ぎます。
  • -o `pidof ntfs-3g`のオプションにkillall5を追加しました(ntfs-3gを強制終了しないようにするため)
  • Shutdown.shとrestart.shを変更して/ boot/shutdownfsにtmpfsをマウントし、そこにいくつかのinitramfsファイルをコピーし、ルートをピボットしてからchrootし、/ downまたは/ restartを呼び出します。
  • これらの2つのスクリプトは、基本的に、迅速でダーティな/ procおよび/ sysセットアップを実行し、/ root/Hostを/ Hostに移動してから、レイジーアンマウントを実行します。定期的なアンマウントを機能させることができませんでした(ファイルシステムはまだビジーです)が、少なくともこれにより、ファイルシステムが完全に嘔吐するのを防ぐことができます。

この解決策はまだ標準以下なので、助けていただければ幸いです。

10
Animus

ここでは専門家ではありませんが、umountのマンページを読んだ後、ループマウントされたデバイスに固有のフラグが表示されます。

-d     In case the unmounted device was a loop device, also free this loop device.

また、losetup(まだマンページにあります)をさらに読んで、ループマウントされたデバイスのステータスを確認するために使用できるので、デバッグに使用することをお勧めします。

私が参照しているマンページへのリンク ここにあります 。このオプション:

-a     Show status of all loop devices.

手がかりが得られる可能性があり、他のいくつかのフラグがループしたデバイスのアンマウントに役立つ可能性があります。

私はあなたの状況を再現することができないので、私はあなたにあなた自身であなたの答えを見つける方法を提案することができるだけです、申し訳ありませんが私はこれ以上の助けにはなりません。

1

man 8 umount

-l

怠惰なアンマウント。ここでファイルシステム階層からファイルシステムを切り離し、ビジー状態がなくなったらすぐにファイルシステムへのすべての参照をクリーンアップします。 (カーネル2.4.11以降が必要です。)

0
Hello71