¿Cómo maneja WUBI las particiones al apagar?

10

Bien, entonces, básicamente, estoy tratando de arrancar Gentoo de manera similar a WUBI; Tengo una instalación en un archivo loopback con formato ext4, BURG instalado en el cargador de arranque de Windows y el kernel / initramfs disponible para el arranque. El arranque todavía tiene algunos problemas (creo que puedo resolverlos, principalmente debido a pequeños problemas con los propios programas), pero tengo la idea básica:

  1. Configure busybox y obtenga dispositivos con mdev
  2. Analice las opciones de la línea de comandos, determine si solicita una raíz real o raíz de bucle
  3. Si es root real, móntelo /rooty cambie root, ejecute /sbin/init.
  4. Si la raíz del bucle, monte la partición del host /host.
  5. Montar loopback ( /host/${LOOP}) en/root
  6. Mover el punto de montaje del host ( mount -o move /host /root/hostpara busybox)
  7. Cambiar de raíz a /rooty ejecutar/sbin/init

Tengo el initguión aquí:

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

Nada complicado, de verdad. NTFS-3G aparentemente no está de acuerdo con la implementación de busybox mounty esas cosas (agrega el parámetro -i por alguna razón, y ntfs-3gtermina), así que estoy considerando simplemente copiar la coreutilsimplementación o algo así. Eso, y necesito examinar qué se necesita para montar particiones de bucle invertido (me da un error como "Archivo no encontrado" cuando intento montar el bucle invertido manualmente). Aún así, creo que estos son lo suficientemente fáciles de resolver por mi cuenta.

Sin embargo, de lo que me estoy preguntando es del cierre. Una vez que switch_rootse complete, el sistema se quedará con un /archivo montado en bucle invertido y /dev/sda2(esta es una instalación de Windows 7) encendido /host. Ahora, no hay forma de desmontar /host, ya que está en uso. Sin embargo, uno no puede desmontar /mientras la raíz tiene sistemas de archivos montados en un subdirectorio. Las instalaciones de Ubuntu basadas en WUBI deben enfrentar el mismo dilema. ¿Cómo se supera este problema? Es un problema de huevo y gallina, y realmente me molesta.

Estaba considerando algo similar a un script de arranque que contiene un caché temporal de archivos para una raíz básica, básica (como un initramfs, pero al revés). Se ejecutaría en último lugar, copiando los archivos en un tmpfs, girando la raíz, quizás volviendo al diseño original de initramfs. Básicamente estaría haciendo esto:

  1. Monta un tmpfsat /tmp/shutdown/o algo así.
  2. Copie los archivos de apagado (tal vez /usr/share/shutdown/o algo así)
  3. pivot_rootpara mover la raíz /loopy hacer chroot en tmpfs.
  4. mount --moveel /loop/hosta/host
  5. Desmontar /loop
  6. Desmontar /host
  7. Cierra limpiamente, ya que todas las particiones han sido desmontadas.

Sin embargo, nunca he modificado tanto a Gentoo. ¿Es esto posible con un initscript? No quiero que esto se sobrescriba con ninguna actualización de baselayout o cualquier ebuild, ya que eso me dejaría con la funcionalidad de apagado interrumpida (y realmente no quiero perder la partición del host). También está el problema de averiguar si el sistema de inicio de Gentoo incluso admite algo como esto. Parece lo suficientemente limpio (aunque un poco duro), pero no estoy muy seguro de eso. Quiero saber si Ubuntu lo hace de manera diferente, y si es así, ¿cómo? Cualquier sugerencia sería útil.

EDITAR :

Tengo la bota funcionando. Solo es cuestión de usar la coreutilsversión de mount, como pensé. Sin embargo, estoy teniendo los errores que esperaba al cerrar; errores al no poder desmontar los sistemas de archivos y errores de registro en diario con el bucle invertido FS. No tengo idea de cómo solucionar esto todavía.

EDITAR 2:

Bien, bueno, tengo algo en marcha que ... Más o menos funciona. Básicamente edité /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}e hice lo siguiente:

  • Agregado /hosta la RC_NO_UMOUNTSvariable, que evita que el módulo EXT4 se atragante por un error de registro en diario
  • Añadido -o `pidof ntfs-3g`a las opciones para killall5(para asegurarse de que no mata ntfs-3g)
  • Modificó shutdown.sh y restart.sh para montar un tmpfs en / boot / shutdownfs y copiar algunos archivos initramfs allí, pivotear la raíz, luego hacer chroot en ella, llamando a / down o / restart.
  • Estos dos scripts esencialmente realizan una configuración rápida y sucia / proc y / sys, mueven / root / host a / host y luego desmontan de forma diferida. No pude hacer que los desmontes regulares funcionen (el sistema de archivos aún estaría ocupado), pero al menos esto parece evitar que los sistemas de archivos vomiten por completo.

Esta solución aún es deficiente, por lo que cualquier ayuda sería apreciada.

Ánimo
fuente
¿Podrías simplemente instalar WUBI y luego cambiar los archivos del sistema con Gentoo después de que funcionara?
Zach

Respuestas:

1

No soy un experto aquí, pero después de leer la página de umountmanual veo una bandera específica para dispositivos montados en bucle:

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

También leyendo más en losetup(todavía en las páginas de manual), te sugiero que tal vez lo uses para depurar, ya que puede usarse para ver el estado de los dispositivos montados en bucle.

El enlace a la página de manual a la que me refiero está aquí . Esta opción:

-a     Show status of all loop devices.

podría darle una pista, y algunas otras banderas podrían ayudar a desmontar los dispositivos en bucle.

Como no puedo replicar su situación, solo puedo sugerirle formas de encontrar su respuesta por su cuenta, lamento no poder ayudarlo más.

marc-andre benoit
fuente
0

man 8 umount:

-l

Perezoso desmontado. Separe el sistema de archivos de la jerarquía del sistema de archivos ahora y limpie todas las referencias al sistema de archivos tan pronto como ya no esté ocupado. (Requiere el kernel 2.4.11 o posterior).

Hola71
fuente