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ł:
- Skonfiguruj busybox i pobierz urządzenia za pomocą mdev
- Analizuj opcje wiersza poleceń, określ, czy pytasz o prawdziwy root czy loop root
- Jeśli jest to prawdziwy root, zamontuj go
/root
i włącz root, uruchom/sbin/init
. - W przypadku pętli root zamontuj partycję hosta
/host
. - Zamontuj pętlę zwrotną (
/host/${LOOP}
)/root
- Przenieś punkt montowania hosta (
mount -o move /host /root/host
dla busybox) - Przełącz root na
/root
i uruchom/sbin/init
Mam init
tutaj 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 mount
i innymi rzeczami (z jakiegoś powodu dodaje parametr -i i ntfs-3g
psuje się), więc zastanawiam się nad skopiowaniem coreutils
implementacji 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_root
zakoń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:
- Zamontuj
tmpfs
na/tmp/shutdown/
lub coś. - Skopiuj pliki zamykania (być może
/usr/share/shutdown/
czy coś) pivot_root
aby przenieść root/loop
i chroot do tmpfs.mount --move
/loop/host
do/host
- Odmontuj
/loop
- Odmontuj
/host
- 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 coreutils
wersji 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
/host
doRC_NO_UMOUNTS
zmiennej, która powstrzymuje moduł EXT4 przed zadławieniem się błędem kronikowania - Dodano
-o `pidof ntfs-3g`
do opcji dlakillall5
(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.