Добре, так, в основному, я намагаюся завантажувати Gentoo таким чином, як WUBI; У мене є установка на файл форматного циклу ext4, BURG, встановлений під завантажувачем Windows, і ядро / initramfs, доступні для завантаження. У завантаженні все ще є деякі проблеми (ті, на які я думаю, я можу розробитись, вони в основному через невеликі проблеми з самими програмами), але в мене є основна ідея:
- Налаштуйте зайнятий і отримуйте пристрої з mdev
- Проаналізуйте параметри командного рядка, визначте, чи запитувати справжній корінь або корінь циклу
- Якщо справжній корінь, встановіть його
/root
та перемкніть корінь, виконайте/sbin/init
. - Якщо корінь циклу, встановіть хост-розділ на
/host
. - Включити петлю (
/host/${LOOP}
)/root
- Перемістіть точку хосту хоста (
mount -o move /host /root/host
для зайнятого ящика) - Переключити 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 не погоджується з реалізацією 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
та chroot у tmpfs.mount --move
/loop/host
до/host
- Відключити
/loop
- Відключити
/host
- Вимкніть чисто, оскільки всі перегородки відключені.
Однак я ніколи так не змінював Gentoo. Чи можливо це за допомогою initscript? Я не хочу, щоб це було замінено будь-якими оновленнями базового виводу або будь-яким іншим ebuild, оскільки це не дасть мені порушити функцію відключення (і я дійсно не хочу втрачати хост-розділ). Існує також проблема з'ясування, чи система init Gentoo навіть підтримує щось подібне. Це здається досить чистим (якщо трохи хакітним), але я не надто впевнений у цьому. Я хочу знати, чи робить Ubuntu по-іншому, і якщо так, то як? Будь-які пропозиції були б корисні.
Редагувати :
У мене завантаження працює. Справа лише у використанні coreutils
версії mount
, як я думав. Однак у мене виникають помилки, які я очікував при відключенні; помилки з неможливістю відключення файлових систем та помилок журналу за допомогою FS із зворотним зв'язком. Я не маю уявлення, як все це виправити.
EDIT 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, повернути корінь, а потім увімкнути його, викликаючи / вниз або / перезапустити.
- Ці два сценарії, по суті, виконують швидку та брудну настройку / proc та / sys, переміщують / root / host на / host, а потім роблять ледачий відключення. Я не міг змусити працювати регулярні вимикачі (файлова система все одно буде зайнята), але, принаймні, це запобігає повній блювоті файлових систем.
Це рішення все ще є частиною, тому будь-яка допомога буде вдячна.