Bene, quindi, in sostanza, sto cercando di avviare Gentoo in un modo simile a WUBI; Ho un'installazione su un file di loopback in formato ext4, BURG installato sotto il Bootloader di Windows e il kernel / initramfs disponibile per l'avvio. L'avvio ha ancora alcuni problemi (quelli che penso di poter risolvere, sono principalmente dovuti a piccoli problemi con i programmi stessi) ma ho l'idea di base giù:
- Configurare busybox e ottenere dispositivi con mdev
- Analizzare le opzioni della riga di comando, determinare se si richiede la radice reale o la radice del ciclo
- Se il root è reale, montalo
/root
e cambia root, eseguilo/sbin/init
. - Se si esegue il root root, montare la partizione host su
/host
. - Montare loopback (
/host/${LOOP}
) su/root
- Sposta il mountpoint dell'host (
mount -o move /host /root/host
per busybox) - Passa a root
/root
ed eseguilo/sbin/init
Ho la init
sceneggiatura qui:
#!/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
Niente di complicato, davvero. Apparentemente NTFS-3G non è d'accordo con l'implementazione di busybox mount
e cose del genere (aggiunge il parametro -i per qualche motivo e si ntfs-3g
risolve), quindi sto pensando di copiare semplicemente l' coreutils
implementazione o qualcosa del genere. Quello, e ho bisogno di esaminare ciò che è necessario per montare le partizioni di loopback (mi dà un errore come "File not found" quando provo a montare il loopback manualmente). Tuttavia, penso che questi siano abbastanza facili da capire da soli.
Tuttavia, quello che mi chiedo è l'arresto. Una volta switch_root
completato, il sistema verrà lasciato con un /
file montato in loopback e /dev/sda2
(questa è un'installazione di Windows 7) su /host
. Ora, non è possibile smontare /host
, poiché è in uso. Tuttavia, non è possibile smontare /
mentre il root ha filesystem montati in una sottodirectory. Le installazioni Ubuntu basate su WUBI devono affrontare lo stesso dilemma. Come si supera questo problema? È un problema con pollo e uova, e mi sta davvero seccando.
Stavo considerando qualcosa sulla falsariga di uno script di avvio che contiene una cache temporanea di file per una radice di base di base (come un initramfs, ma viceversa). Sarebbe durato per ultimo, copiando i file su un tmpfs, ruotando la radice, forse riportandola al layout originale di initramfs. In sostanza lo farei:
- Montare un
tmpfs
at/tmp/shutdown/
o qualcosa del genere. - Copia sui file di arresto (forse
/usr/share/shutdown/
o qualcosa del genere) pivot_root
per spostare la radice/loop
e chroot nel tmpfs.mount --move
il/loop/host
a/host
- Smonta
/loop
- Smonta
/host
- Chiudere in modo pulito, poiché tutte le partizioni sono state smontate.
Tuttavia, non ho mai modificato Gentoo così tanto. Questo è possibile con un initscript? Non voglio che questo venga sovrascritto da alcun aggiornamento del baselayout o di qualsiasi ebuild, dal momento che ciò mi lascerebbe con funzionalità di arresto interrotta (e davvero non voglio perdere la partizione host). C'è anche il problema di capire se il sistema init di Gentoo supporta qualcosa del genere. Sembra abbastanza pulito (anche se un po 'hacker), ma non ne sono troppo sicuro. Voglio sapere se Ubuntu lo fa diversamente, e se sì, come? Qualsiasi suggerimento sarebbe utile.
MODIFICA :
Ho fatto funzionare lo stivale. È solo questione di usare la coreutils
versione di mount
, come pensavo. Sto riscontrando gli errori che mi aspettavo allo spegnimento, però; errori con impossibilità di smontare filesystem ed errori di journaling con il loopback FS. Non ho idea di come risolvere ancora.
MODIFICA 2:
Va bene, ho qualcosa che va ... Tipo di lavori. Ho praticamente modificato /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}
e fatto quanto segue:
- Aggiunto
/host
allaRC_NO_UMOUNTS
variabile, che impedisce al modulo EXT4 di soffocarsi per un errore di journaling - Aggiunto
-o `pidof ntfs-3g`
alle opzioni perkillall5
(per assicurarsi che non abbia ucciso ntfs-3g) - Modificato shutdown.sh e restart.sh per montare un tmpfs su / boot / shutdownfs e copiarlo su alcuni file initramfs lì, ruotare il root, quindi chroot in esso, chiamando / down o / restart.
- Questi due script essenzialmente eseguono una configurazione rapida e sporca / proc e / sys, spostano / root / host su / host, quindi eseguono smontaggi pigri. Non riuscivo a far funzionare gli smontaggi regolari (il filesystem sarebbe ancora occupato), ma almeno questo sembra fermare il vomito del filesystem.
Questa soluzione è ancora scadente, quindi qualsiasi aiuto sarebbe apprezzato.