In che modo WUBI gestisce le partizioni allo spegnimento?


10

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ù:

  1. Configurare busybox e ottenere dispositivi con mdev
  2. Analizzare le opzioni della riga di comando, determinare se si richiede la radice reale o la radice del ciclo
  3. Se il root è reale, montalo /roote cambia root, eseguilo /sbin/init.
  4. Se si esegue il root root, montare la partizione host su /host.
  5. Montare loopback ( /host/${LOOP}) su/root
  6. Sposta il mountpoint dell'host ( mount -o move /host /root/hostper busybox)
  7. Passa a root /rooted eseguilo/sbin/init

Ho la initsceneggiatura 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 mounte cose del genere (aggiunge il parametro -i per qualche motivo e si ntfs-3grisolve), quindi sto pensando di copiare semplicemente l' coreutilsimplementazione 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_rootcompletato, 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:

  1. Montare un tmpfsat /tmp/shutdown/o qualcosa del genere.
  2. Copia sui file di arresto (forse /usr/share/shutdown/o qualcosa del genere)
  3. pivot_rootper spostare la radice /loope chroot nel tmpfs.
  4. mount --moveil /loop/hosta/host
  5. Smonta /loop
  6. Smonta /host
  7. 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 coreutilsversione 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 /hostalla RC_NO_UMOUNTSvariabile, che impedisce al modulo EXT4 di soffocarsi per un errore di journaling
  • Aggiunto -o `pidof ntfs-3g`alle opzioni per killall5(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.


Potresti semplicemente installare WUBI e poi cambiare i file di sistema con Gentoo dopo averlo fatto funzionare?
Zach,

Risposte:


1

Qui non sono un esperto, ma dopo aver letto la umountmanpage vedo una bandiera specifica per i dispositivi montati in loop:

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

Anche leggendo più a fondo losetup(nelle pagine man ancora), ti suggerirei forse di usarlo per il debug in quanto può essere usato per vedere lo stato dei dispositivi montati in loop.

Il link alla manpage a cui mi riferisco è qui . Questa opzione:

-a     Show status of all loop devices.

potrebbe darti un indizio e alcune altre bandiere potrebbero aiutare a smontare i dispositivi in ​​loop.

Dato che non riesco a replicare la tua situazione, posso solo suggerirti modi per trovare la tua risposta da solo, mi dispiace di non poter essere di maggiore aiuto.


0

man 8 umount:

-l

Smontaggio pigro. Scollega subito il filesystem dalla gerarchia del filesystem e pulisci tutti i riferimenti al filesystem non appena non è più occupato. (Richiede il kernel 2.4.11 o successivo.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.