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:
- Configure busybox y obtenga dispositivos con mdev
- Analice las opciones de la línea de comandos, determine si solicita una raíz real o raíz de bucle
- Si es root real, móntelo
/root
y cambie root, ejecute/sbin/init
. - Si la raíz del bucle, monte la partición del host
/host
. - Montar loopback (
/host/${LOOP}
) en/root
- Mover el punto de montaje del host (
mount -o move /host /root/host
para busybox) - Cambiar de raíz a
/root
y ejecutar/sbin/init
Tengo el init
guió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 mount
y esas cosas (agrega el parámetro -i por alguna razón, y ntfs-3g
termina), así que estoy considerando simplemente copiar la coreutils
implementació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_root
se 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:
- Monta un
tmpfs
at/tmp/shutdown/
o algo así. - Copie los archivos de apagado (tal vez
/usr/share/shutdown/
o algo así) pivot_root
para mover la raíz/loop
y hacer chroot en tmpfs.mount --move
el/loop/host
a/host
- Desmontar
/loop
- Desmontar
/host
- 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 coreutils
versió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
/host
a laRC_NO_UMOUNTS
variable, 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 parakillall5
(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.