Comment WUBI gère-t-il les partitions lors de l'arrêt?


10

Très bien, donc, fondamentalement, j'essaie de démarrer Gentoo d'une manière similaire à WUBI; J'ai une installation sur un fichier de bouclage au format ext4, BURG installé sous le chargeur de démarrage Windows et le noyau / initramfs disponible pour le démarrage. Le démarrage a encore quelques problèmes (ceux que je pense pouvoir résoudre, ils sont principalement dus à de petits problèmes avec les programmes eux-mêmes) mais j'ai l'idée de base:

  1. Configurer busybox et obtenir des appareils avec mdev
  2. Analyser les options de ligne de commande, déterminer si demander une racine réelle ou une racine de boucle
  3. Si vrai root, montez-le /rootet changez root, exécutez /sbin/init.
  4. Si la boucle est root, montez la partition hôte /host.
  5. Monter le bouclage ( /host/${LOOP}) sur/root
  6. Déplacer le point de montage de l'hôte ( mount -o move /host /root/hostpour busybox)
  7. Basculer en racine /rootet exécuter/sbin/init

J'ai le initscript ici:

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

Rien de compliqué, vraiment. NTFS-3G n'est apparemment pas d'accord avec l'implémentation de busybox de mountet d'autres choses (il ajoute le paramètre -i pour une raison quelconque, et ntfs-3gcraps), donc je considère simplement copier l' coreutilsimplémentation ou quelque chose. Cela, et je dois examiner ce qui est nécessaire pour monter des partitions de bouclage (cela me donne une erreur comme "Fichier non trouvé" lorsque j'essaie de monter le bouclage manuellement). Pourtant, je pense que ce sont assez faciles à comprendre par moi-même.

Cependant, ce que je me demande en quelque sorte, c'est l'arrêt. Une fois l'opération switch_rootterminée, le système se retrouvera avec un /fichier monté en boucle et /dev/sda2(il s'agit d'une installation de Windows 7) activé /host. Maintenant, il n'y a aucun moyen de démonter /host, car il est en cours d'utilisation. Cependant, on ne peut pas démonter tant /que la racine a des systèmes de fichiers montés dans un sous-répertoire. Les installations Ubuntu basées sur WUBI doivent faire face au même dilemme. Comment surmonter ce problème? C'est un problème de poule et d'oeuf, et ça m'ennuie vraiment.

J'envisageais quelque chose dans le sens d'un script de démarrage qui contient un cache temporaire de fichiers pour une racine de base, de base (comme un initramfs, mais l'inverse). Il s'exécuterait en dernier, copiant les fichiers sur un tmpfs, pivotant la racine, peut-être en la ramenant à la disposition d'origine des initramfs. Je ferais essentiellement ceci:

  1. Montez un tmpfsat /tmp/shutdown/ou quelque chose.
  2. Copiez les fichiers d'arrêt (peut /usr/share/shutdown/- être ou quelque chose)
  3. pivot_rootpour déplacer la racine vers /loopet chroot dans les tmpfs.
  4. mount --movele /loop/hostà/host
  5. Démonter /loop
  6. Démonter /host
  7. Arrêtez proprement, car toutes les partitions ont été démontées.

Cependant, je n'ai jamais autant modifié Gentoo. Est-ce possible avec un initscript? Je ne veux pas que cela soit écrasé par les mises à jour de la baseelayout ou de tout autre ebuild, car cela me laisserait une fonctionnalité d'arrêt cassé (et je ne veux vraiment pas perdre la partition hôte). Il y a aussi le problème de savoir si le système d'initialisation de Gentoo supporte même quelque chose comme ça. Il semble assez propre (si un peu hackish), mais je n'en suis pas trop sûr. Je veux savoir si Ubuntu le fait différemment, et si oui, comment? Toute suggestion serait utile.

MODIFIER :

J'ai fait démarrer la botte. Juste une question d'utiliser la coreutilsversion de mount, comme je le pensais. J'ai cependant les erreurs que j'attendais à l'arrêt; des erreurs avec l'impossibilité de démonter les systèmes de fichiers et des erreurs de journalisation avec le bouclage FS. Je n'ai aucune idée de comment résoudre ce problème.

EDIT 2:

D'accord, eh bien, j'ai quelque chose qui va ... Une sorte de travaux. J'ai essentiellement édité /etc/init.d/{halt.sh,reboot.sh,shutdown.sh}et fait ce qui suit:

  • Ajouté /hostà la RC_NO_UMOUNTSvariable, qui empêche le module EXT4 de s'étouffer à propos d'une erreur de journalisation
  • Ajouté -o `pidof ntfs-3g`aux options pour killall5(pour vous assurer qu'il n'a pas tué ntfs-3g)
  • Modification de shutdown.sh et restart.sh pour monter un tmpfs sur / boot / shutdownfs et y copier certains fichiers initramfs, faire pivoter la racine, puis y chrooter, en appelant / down ou / restart.
  • Ces deux scripts effectuent essentiellement une configuration rapide et sale / proc et / sys, déplacent / root / host vers / host, puis effectuent un démontage paresseux. Je ne pouvais pas faire fonctionner les démontages réguliers (le système de fichiers serait toujours occupé), mais au moins cela semble empêcher les systèmes de fichiers de vomir complètement.

Cette solution est encore médiocre, donc toute aide serait appréciée.


Pourriez-vous simplement installer WUBI, puis désactiver les fichiers système avec Gentoo après l'avoir fait fonctionner?
Zach

Réponses:


1

Pas un expert ici, mais après avoir lu la umountpage de manuel, je vois un indicateur spécifique aux périphériques montés en boucle:

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

En lisant également plus loin losetup(dans les pages de manuel toujours), je vous suggère de peut-être l'utiliser pour déboguer car il peut être utilisé pour voir l'état des périphériques montés en boucle.

Le lien vers la page de manuel à laquelle je fais référence est ici . Cette option:

-a     Show status of all loop devices.

pourrait vous donner un indice, et certains autres indicateurs pourraient aider à démonter les périphériques en boucle.

Comme je ne peux pas reproduire votre situation, je ne peux que vous suggérer des moyens de trouver votre réponse par vous-même, désolé de ne pas pouvoir vous aider davantage.


0

man 8 umount:

-l

Démontage paresseux. Détachez maintenant le système de fichiers de la hiérarchie du système de fichiers et nettoyez toutes les références au système de fichiers dès qu'il n'est plus occupé. (Nécessite le noyau 2.4.11 ou une version ultérieure.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.