Як WUBI обробляє розділи після відключення?


10

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

  1. Налаштуйте зайнятий і отримуйте пристрої з mdev
  2. Проаналізуйте параметри командного рядка, визначте, чи запитувати справжній корінь або корінь циклу
  3. Якщо справжній корінь, встановіть його /rootта перемкніть корінь, виконайте /sbin/init.
  4. Якщо корінь циклу, встановіть хост-розділ на /host.
  5. Включити петлю ( /host/${LOOP})/root
  6. Перемістіть точку хосту хоста ( mount -o move /host /root/hostдля зайнятого ящика)
  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 не погоджується з реалізацією 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та chroot у tmpfs.
  4. mount --move/loop/hostдо/host
  5. Відключити /loop
  6. Відключити /host
  7. Вимкніть чисто, оскільки всі перегородки відключені.

Однак я ніколи так не змінював 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, а потім роблять ледачий відключення. Я не міг змусити працювати регулярні вимикачі (файлова система все одно буде зайнята), але, принаймні, це запобігає повній блювоті файлових систем.

Це рішення все ще є частиною, тому будь-яка допомога буде вдячна.


Чи можете ви просто встановити WUBI, а потім вимкнути системні файли з Gentoo після того, як він працював?
Зак

Відповіді:


1

Тут не експерт, але, прочитавши сторінку, umountя бачу прапор, характерний для пристроїв, встановлених у циклі:

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

Крім того, читаючи далі losetup(на Manpages все ще), я б запропонував вам, можливо, використовувати його для налагодження, оскільки це можна використовувати для перегляду стану пристроїв, встановлених у циклі.

Посилання на сторінку, на яку я згадую, знаходиться тут . Цей варіант:

-a     Show status of all loop devices.

може дати вам підказку, а деякі інші прапори можуть допомогти відключити петельні пристрої.

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


0

man 8 umount:

Ледачий відключення. Відключіть файлову систему від ієрархії файлової системи зараз та очистіть усі посилання на файлову систему, як тільки вона більше не зайнята. (Потрібно ядро ​​2.4.11 або новішої версії.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.