Jak WUBI obsługuje partycje po wyłączeniu?


10

W porządku, więc w zasadzie próbuję uruchomić Gentoo w sposób podobny do WUBI; Mam instalację w formacie pętli zwrotnej w formacie ext4, BURG zainstalowany pod Windows Bootloader i jądro / initramfs dostępne do rozruchu. Podczas uruchamiania nadal występują pewne problemy (te, które myślę, że mogę rozwiązać, głównie z powodu małych problemów z samymi programami), ale mam podstawowy pomysł:

  1. Skonfiguruj busybox i pobierz urządzenia za pomocą mdev
  2. Analizuj opcje wiersza poleceń, określ, czy pytasz o prawdziwy root czy loop root
  3. Jeśli jest to prawdziwy root, zamontuj go /rooti włącz root, uruchom /sbin/init.
  4. W przypadku pętli root zamontuj partycję hosta /host.
  5. Zamontuj pętlę zwrotną ( /host/${LOOP})/root
  6. Przenieś punkt montowania hosta ( mount -o move /host /root/hostdla busybox)
  7. Przełącz root na /rooti uruchom/sbin/init

Mam inittutaj skrypt:

#!/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

Naprawdę nic skomplikowanego. NTFS-3G najwyraźniej nie zgadza się z implementacją busybox mounti innymi rzeczami (z jakiegoś powodu dodaje parametr -i i ntfs-3gpsuje się), więc zastanawiam się nad skopiowaniem coreutilsimplementacji czy coś takiego. I muszę sprawdzić, co jest potrzebne do montowania partycji pętli zwrotnej (daje mi błąd typu „Nie znaleziono pliku”, gdy próbuję ręcznie zamontować pętlę zwrotną). Mimo to uważam, że są one łatwe do samodzielnego rozwiązania.

Zastanawiam się jednak nad zamknięciem. Po switch_rootzakończeniu system pozostanie z /plikiem podłączonym do pętli zwrotnej i /dev/sda2(jest to instalacja systemu Windows 7) włączony /host. Teraz nie ma możliwości odmontowania /host, ponieważ jest w użyciu. Nie można jednak odmontować, /gdy w katalogu głównym są zainstalowane systemy plików. Instalacje Ubuntu oparte na WUBI muszą zmierzyć się z tym samym dylematem. Jak można przezwyciężyć ten problem? To problem z kurczakiem i jajkami i naprawdę mnie to denerwuje.

Zastanawiałem się nad czymś w rodzaju skryptu rozruchowego, który przechowuje tymczasową pamięć podręczną plików dla podstawowego, podstawowego katalogu głównego (jak initramfs, ale na odwrót). Działa jako ostatni, kopiując pliki do tmpfs, obracając root, być może przywracając oryginalny układ initramfs. Zasadniczo robiłbym to:

  1. Zamontuj tmpfsna /tmp/shutdown/lub coś.
  2. Skopiuj pliki zamykania (być może /usr/share/shutdown/czy coś)
  3. pivot_rootaby przenieść root /loopi chroot do tmpfs.
  4. mount --move/loop/hostdo/host
  5. Odmontuj /loop
  6. Odmontuj /host
  7. Zamknij dokładnie, ponieważ wszystkie partycje zostały odmontowane.

Jednak nigdy tak bardzo nie modyfikowałem Gentoo. Czy jest to możliwe dzięki skryptowi initscript? Nie chcę, aby to zostało nadpisane przez jakiekolwiek aktualizacje bazy lub jakiegokolwiek ebuilda, ponieważ pozostawiłoby mnie to zepsutą funkcją zamykania (i naprawdę nie chcę stracić partycji hosta). Istnieje również problem z ustaleniem, czy system inicjujący Gentoo w ogóle obsługuje coś takiego. Wydaje się wystarczająco czysty (choć trochę hackerski), ale nie jestem tego pewien. Chcę wiedzieć, czy Ubuntu robi to inaczej, a jeśli tak, to w jaki sposób? Wszelkie sugestie byłyby pomocne.

EDYCJA :

Uruchomiłem bagażnik. Wystarczy kwestia użycia coreutilswersji mount, jak myślałem. Mam jednak błędy, których spodziewałem się po zamknięciu; błędy związane z niemożnością odmontowania systemów plików i błędy kronikowania przy sprzężeniu zwrotnym FS. Nie mam pojęcia, jak to naprawić.

EDYCJA 2:

Dobra, cóż, coś mi się dzieje, że ... rodzaj prac. Zasadniczo dokonałem edycji /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}i wykonałem następujące czynności:

  • Dodano /hostdo RC_NO_UMOUNTSzmiennej, która powstrzymuje moduł EXT4 przed zadławieniem się błędem kronikowania
  • Dodano -o `pidof ntfs-3g`do opcji dla killall5(aby upewnić się, że nie zabił NTFS-3G)
  • Zmodyfikowano shutdown.sh i restart.sh, aby zamontować tmpfs na / boot / shutdownfs i skopiować tam niektóre pliki initramfs, przestawić root, a następnie chroot do niego, wywołując / down lub / restart.
  • Te dwa skrypty zasadniczo wykonują szybką i brudną konfigurację / proc i / sys, przenoszą / root / host do / host, a następnie wykonują leniwe odmontowywanie. Nie mogłem zmusić regularnych odmontowań do pracy (system plików nadal byłby zajęty), ale przynajmniej to wydaje się powstrzymywać systemy plików przed całkowitymi wymiotami.

To rozwiązanie jest wciąż słabe, więc każda pomoc byłaby mile widziana.


Czy możesz po prostu zainstalować WUBI, a następnie zmienić pliki systemowe w Gentoo po jego uruchomieniu?
Zach.

Odpowiedzi:


1

Nie umountjestem tutaj ekspertem, ale po przeczytaniu strony widzę flagę specyficzną dla urządzeń montowanych w pętli:

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

Również czytając dalej losetup(wciąż na stronach podręcznika), sugerowałbym, abyś mógł użyć go do debugowania, ponieważ może on służyć do sprawdzania stanu urządzeń zamontowanych w pętli.

Link do strony, o której mowa, znajduje się tutaj . Ta opcja:

-a     Show status of all loop devices.

może dać ci wskazówkę, a niektóre inne flagi mogą pomóc odmontować zapętlone urządzenia.

Ponieważ nie mogę odtworzyć twojej sytuacji, mogę jedynie zasugerować ci, jak samemu znaleźć odpowiedź, przepraszam, że nie mogę pomóc.


0

man 8 umount:

-l

Leniwy odmontować. Odłącz teraz system plików od hierarchii systemu plików i wyczyść wszystkie odniesienia do systemu plików, gdy tylko nie będzie on już zajęty. (Wymaga jądra 2.4.11 lub nowszego.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.