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:
- Configurer busybox et obtenir des appareils avec mdev
- Analyser les options de ligne de commande, déterminer si demander une racine réelle ou une racine de boucle
- Si vrai root, montez-le
/root
et changez root, exécutez/sbin/init
. - Si la boucle est root, montez la partition hôte
/host
. - Monter le bouclage (
/host/${LOOP}
) sur/root
- Déplacer le point de montage de l'hôte (
mount -o move /host /root/host
pour busybox) - Basculer en racine
/root
et exécuter/sbin/init
J'ai le init
script 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 mount
et d'autres choses (il ajoute le paramètre -i pour une raison quelconque, et ntfs-3g
craps), donc je considère simplement copier l' coreutils
implé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_root
terminé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:
- Montez un
tmpfs
at/tmp/shutdown/
ou quelque chose. - Copiez les fichiers d'arrêt (peut
/usr/share/shutdown/
- être ou quelque chose) pivot_root
pour déplacer la racine vers/loop
et chroot dans les tmpfs.mount --move
le/loop/host
à/host
- Démonter
/loop
- Démonter
/host
- 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 coreutils
version 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
à laRC_NO_UMOUNTS
variable, qui empêche le module EXT4 de s'étouffer à propos d'une erreur de journalisation - Ajouté
-o `pidof ntfs-3g`
aux options pourkillall5
(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.
Réponses:
Pas un expert ici, mais après avoir lu la
umount
page de manuel, je vois un indicateur spécifique aux périphériques montés en boucle: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:
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.
la source
man 8 umount
:la source