Хорошо, в общем, я пытаюсь загрузить Gentoo способом, похожим на WUBI; У меня есть установка на файл петли в формате ext4, BURG установлен под загрузчиком Windows и ядро / initramfs, доступные для загрузки. У загрузки все еще есть некоторые проблемы (те, которые, я думаю, я могу решить, в основном из-за небольших проблем с самими программами), но у меня есть основная идея:
- Настройте busybox и получайте устройства с помощью mdev
- Разберите параметры командной строки, определите, запрашиваете ли вы настоящий root или loop root
- Если настоящий root, подключите его
/root
и переключите root, выполните/sbin/init
. - Если корневой цикл, подключите раздел хоста
/host
. - Смонтировать петлю (
/host/${LOOP}
) на/root
- Переместить точку монтирования хоста (
mount -o move /host /root/host
для busybox) - Переключите 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. По сути, я бы делал это:
- Смонтировать
tmpfs
на/tmp/shutdown/
или что-то. - Скопируйте закрытые файлы (возможно
/usr/share/shutdown/
или что-то) pivot_root
переместить корень/loop
и получить доступ к tmpfs.mount --move
/loop/host
к/host
- Отсоединение
/loop
- Отсоединение
/host
- Отключите чисто, так как все разделы были размонтированы.
Тем не менее, я никогда не модифицировал 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, а затем выполняют ленивое размонтирование. Я не мог заставить работать обычные размонтирования (файловая система все еще была бы занята), но, по крайней мере, это, по-видимому, останавливало файловую систему от полной рвоты.
Это решение все еще на низком уровне, поэтому любая помощь будет принята с благодарностью.