Как WUBI обрабатывает разделы при выключении?


10

Хорошо, в общем, я пытаюсь загрузить Gentoo способом, похожим на WUBI; У меня есть установка на файл петли в формате ext4, BURG установлен под загрузчиком Windows и ядро ​​/ initramfs, доступные для загрузки. У загрузки все еще есть некоторые проблемы (те, которые, я думаю, я могу решить, в основном из-за небольших проблем с самими программами), но у меня есть основная идея:

  1. Настройте busybox и получайте устройства с помощью mdev
  2. Разберите параметры командной строки, определите, запрашиваете ли вы настоящий root или loop root
  3. Если настоящий root, подключите его /rootи переключите root, выполните /sbin/init.
  4. Если корневой цикл, подключите раздел хоста /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

Ничего сложного, правда. NTFS-3G, очевидно, не согласен с реализацией busybox mountи прочим (он добавляет параметр -i по какой-то причине и ntfs-3gвычеркивается), поэтому я подумываю просто скопировать coreutilsреализацию или что-то в этом роде. Это, и мне нужно проверить, что нужно для монтирования петлевых разделов (при попытке монтирования петлевого ввода вручную появляется ошибка типа «Файл не найден»). Тем не менее, я думаю, что это достаточно легко понять самостоятельно.

Однако то, о чем я как бы удивляюсь, это отключение. После switch_rootзавершения, система останется с /файлом, смонтированным в петле, и /dev/sda2(это установка Windows 7) /host. Теперь нет способа размонтировать /host, так как он используется. Тем не менее, нельзя размонтировать, /пока корень имеет файловые системы, смонтированные в подкаталоге. Установки Ubuntu на основе WUBI должны столкнуться с той же дилеммой. Как можно преодолеть эту проблему? Это проблема курицы и яйца, и это действительно раздражает меня.

Я рассматривал что-то вроде загрузочного скрипта, который содержит временный кэш файлов для базового, базового корня (например, initramfs, но наоборот). Он запускался последним, копируя файлы в tmpfs, поворачивая корень, возможно, возвращая его к исходной компоновке initramfs. По сути, я бы делал это:

  1. Смонтировать tmpfsна /tmp/shutdown/или что-то.
  2. Скопируйте закрытые файлы (возможно /usr/share/shutdown/или что-то)
  3. pivot_rootпереместить корень /loopи получить доступ к tmpfs.
  4. mount --move/loop/hostк/host
  5. Отсоединение /loop
  6. Отсоединение /host
  7. Отключите чисто, так как все разделы были размонтированы.

Тем не менее, я никогда не модифицировал Gentoo так сильно. Это возможно с initscript? Я не хочу, чтобы это было перезаписано какими-либо обновлениями baselayout или любого другого ebuild, так как это оставило бы меня с нарушенной функциональностью завершения работы (и я действительно не хочу терять раздел хоста). Существует также проблема выяснения, поддерживает ли система инициализации Gentoo нечто подобное. Это кажется достаточно чистым (если немного хакерским), но я не слишком уверен в этом. Я хочу знать, если 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)
  • Изменили shutdown.sh и restart.sh, чтобы смонтировать tmpfs в / boot / shutdownfs и скопировать туда некоторые файлы initramfs, повернуть корневой каталог, а затем выполнить chroot в него, вызвав либо / down, либо / restart.
  • Эти два сценария по сути выполняют быструю и грязную настройку / proc и / sys, перемещают / root / host в / host, а затем выполняют ленивое размонтирование. Я не мог заставить работать обычные размонтирования (файловая система все еще была бы занята), но, по крайней мере, это, по-видимому, останавливало файловую систему от полной рвоты.

Это решение все еще на низком уровне, поэтому любая помощь будет принята с благодарностью.


Не могли бы вы просто установить WUBI и затем выключить системные файлы с помощью Gentoo после того, как он заработал?
Зак

Ответы:


1

Не эксперт здесь, но после прочтения umountman-страницы я вижу флаг, специфичный для устройств, монтируемых в петле:

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

Также, читая далее losetup(по-прежнему на страницах man), я бы предложил вам использовать его для отладки, так как он может использоваться для просмотра состояния устройств, смонтированных на петле.

Ссылка на справочную страницу, на которую я ссылаюсь, находится здесь . Эта опция:

-a     Show status of all loop devices.

может дать вам подсказку, а некоторые другие флаги могут помочь размонтировать зацикленные устройства.

Поскольку я не могу воспроизвести вашу ситуацию, я могу только предложить вам способы найти ваш ответ самостоятельно, извините, что я не могу вам помочь.


0

man 8 umount:

-l

Ленивый демонтировать. Отключите файловую систему от иерархии файловой системы и очистите все ссылки на файловую систему, как только она больше не будет занята. (Требуется ядро ​​2.4.11 или новее.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.