Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[FreeBSD] Fonctionnement "incohérent" de unionfs ?

5 réponses
Avatar
Nicolas Le Scouarnec
Bonjour,

Afin de créer une jail, et d'avoir les ports disponibles sans consommer
pleins d'espace disque, je me suis dit que j'allais utiliser nullfs et
unionfs.

J'ai mes ports originaux dans la couche du dessous, et, la couche
supérieure dans dossier vide, qui me permet de stocker les "nouveaux"
fichiers (work, fichiers téléchargés...).

Ca marche "bien":
-Je peux créer un fichier dans n'importe quel dossier, il me
l'enregistre bien dans la couche supérieure (dossier couche_unionfs).
-Je peux lire n'importe quel fichier, je vois le fichier de la couche
inférieure.
-Je peux modifier un fichier, je verrais alors la nouvelle version, qui
aura été enregistré dans la couche supérieure.

Seulement, si je tapes "make", je me fais jetter... Quelques essais
sans lancer la jail (si je la lance , ca me donne la meme chose).


[root@lea zsh]# make
make: No such file or directory
[root@lea zsh]# pwd
/a2/jails/club_jeu/usr/ports/shells/zsh
[root@lea zsh]# mount|grep /a2
/dev/amrd0s2h on /a2 (ufs, local, soft-updates)
/usr/src on /a2/jails/club_jeu/usr/src (nullfs, local, read-only)
/usr/ports on /a2/jails/club_jeu/usr/ports (nullfs, local, read-only)
<above>:/a2/jails/club_jeu/usr/couche_unionfs/src on
/a2/jails/club_jeu/usr/src (unionfs, local, noclusterw)
<above>:/a2/jails/club_jeu/usr/couche_unionfs/ports on
/a2/jails/club_jeu/usr/ports (unionfs, local, noclusterw)



Forcement, je ne sais pas ce que make n'arrive pas a trouver... si je
fais less Makefile, ca marche.

Maintenant, si je remonte, ca marche quand meme a la base de mon
montage, mais ca ne va pas loin:
[root@lea zsh]# cd ..
[root@lea shells]# make
make: No such file or directory
[root@lea shells]# cd ..
[root@lea ports]# make
===> accessibility
make: No such file or directory
*** Error code 2

Quelque chose que je viens de remarquer, je me fais insulter par sudo
dans les dossiers avec lequel ca ne marche pas:
[nlsn@lea zsh]% sudo make
sudo: Can't get working directory!
make: No such file or directory

Qu'est-ce que j'ai mal fait ? On ne peut pas superposer deux couches
unionfs (enfin, nullfs et unionfs) ? Ou alors je suis tombé sur un
super bug que je vais m'empresser de breveter et j'ai gagné 5 euros ?
--
Nicolas Le Scouarnec

5 réponses

Avatar
pornin
According to Nicolas Le Scouarnec :
[ zsh]# make
make: No such file or directory
[ zsh]# pwd
/a2/jails/club_jeu/usr/ports/shells/zsh


N'utilise pas "pwd" mais tape "/bin/pwd". "pwd" est "optimisé" par zsh,
qui suis tes divers "cd" et ne te donne pas ce que donnerait getcwd().
La différence entre les deux est sensible quand on a, par exemple, des
liens symboliques. Si tu as un problème de détermination du "current
wordking directory", le "pwd" de zsh te le cachera.


Forcement, je ne sais pas ce que make n'arrive pas a trouver... si je
fais less Makefile, ca marche.


Ce n'est pas forcément "make" qui n'arrive pas à trouver quelque
chose ; ça peut être le shell qui n'arrive pas à trouver "make".

Avec ktrace, on peut avoir les appels système effectués, ce permet
de mieux cerner le problème.


Bon, sinon, "chez moi ça marche"(tm). FreeBSD 5.2.1-RELEASE. Extrait :

$ mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/md0 on /tmp (ufs, local, soft-updates)
/dev/ad0s1e on /usr (ufs, local, soft-updates)
/dev/ad0s1d on /var (ufs, local, soft-updates)
/usr/ports on /usr/home/pornin/zoinx/ports (nullfs, local)
<above>:/usr/home/pornin/zoinx/urk on
/usr/home/pornin/zoinx/ports (unionfs, local, noclusterw)

$ cd /usr/home/pornin/zoinx/ports/shells/zsh
$ /bin/pwd
/usr/home/pornin/zoinx/urk/shells/zsh
$ make
===> Vulnerability check disabled
zsh-4.0.9.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
/usr/ports/distfiles is not writable by you; cannot fetch.
*** Error code 1



Stop in /usr/home/pornin/zoinx/urk/shells/zsh.

(L'erreur, c'est parce que je ne suis pas root.)


Note un point : je suis rentré dans "zoinx/ports" mais je me suis
retrouvé physiquement (selon getcwd()) dans "zoinx/urk" parce que
c'est celui-là qui est "au-dessus" au sens du unionfs.

J'ai fait ça en mettant en place le nullfs vers "zoinx/ports" puis
en faisant un "unionfs" comme ça :

mount -t unionfs -b zoinx/ports zoinx/urk

avec le flag "-b" pour dire que l'union doit se faire avec "zoinx/urk"
au-dessus mais néanmoins dans "zoinx/urk".


On doit pouvoir le faire dans l'autre sens, mais là je me retrouve
avec un "nullfs" que je n'arrive pas à démonter ("file system busy")
ce qui n'est pas terrible. La page de man n'est pas particulièrement
faite pour me rassurer par ailleurs.

Au fait, pourquoi faire un nullfs ? "unionfs" sait très bien faire
tout seul le travail :

mount -t unionfs -o -b /usr/ports /blah/ports

et hop, dans /blah/ports, je retrouve les fichiers de /usr/ports,
de telle sorte que les modifications en écriture n'affectent pas
les vrais fichiers de /usr/ports, mais se fassent plutôt dans le
filesystem qui contenait /blah/ports avant le montage. Ce n'est
pas ce que tu veux ?


--Thomas Pornin


Avatar
Nicolas Le Scouarnec
N'utilise pas "pwd" mais tape "/bin/pwd". "pwd" est "optimisé" par zsh,
qui suis tes divers "cd" et ne te donne pas ce que donnerait getcwd().
liens symboliques. Si tu as un problème de détermination du "current
wordking directory", le "pwd" de zsh te le cachera.


Apparement, il y en a un effectivement.

Voila ce que me donne ces deux commandes: pwd ne trouve pas "." !?!

[ zsh]# /bin/pwd
pwd: .: No such file or directory
[ zsh]# /bin/pwwd
zsh: no such file or directory: /bin/pwwd


Ce n'est pas forcément "make" qui n'arrive pas à trouver quelque
chose ; ça peut être le shell qui n'arrive pas à trouver "make".


Non, puisque, sinon zsh me précise que c'est lui qui ne trouve pas make
(cf plus haut).


Avec ktrace, on peut avoir les appels système effectués, ce permet
de mieux cerner le problème.


Ca ne m'aide pas beaucoup, si ce n'est que je vois bien qu'il ne trouve
pas le repertoire, il lit des "." et des ":"


Fonctionnement "anormal"
9447 pwd CALL __getcwd(0x804b000,0x3fc)
9447 pwd RET __getcwd -1 errno 20 Not a directory
9447 pwd CALL stat(0x28122558,0xbfbfe870)
9447 pwd NAMI "/"
9447 pwd RET stat 0
9447 pwd CALL lstat(0x804b400,0xbfbfe870)
9447 pwd Events dropped.
9447 pwd CALL write(0x2,0xbfbfe1c0,0x1)
9447 pwd GIO fd 2 wrote 1 byte
"."
9447 pwd RET write 1
9447 pwd CALL write(0x2,0x2812349e,0x2)
9447 pwd GIO fd 2 wrote 2 bytes
": "
9447 pwd RET write 2
9447 pwd CALL write(0x2,0xbfbfe1a0,0x1a)
9447 pwd GIO fd 2 wrote 26 bytes
"No such file or directory
"
9447 pwd RET write 26/0x1a
9447 pwd CALL exit(0x1)

Fonctionnement "normal" (ca marche dans un autre repertoir)
7401 pwd CALL __getcwd(0x804b000,0x3fc)
7401 pwd RET __getcwd 0
7401 pwd CALL fstat(0x1,0xbfbfe7f0)
7401 pwd RET fstat 0
7401 pwd CALL break(0x804d000)
7401 pwd RET break 0
7401 pwd CALL ioctl(0x1,TIOCGETA,0xbfbfe830)
7401 pwd RET ioctl 0
7401 pwd CALL write(0x1,0x804c000,0xb)
7401 pwd GIO fd 1 wrote 11 bytes
"/home/nlsn
"
7401 pwd RET write 11/0xb
7401 pwd CALL exit(0)



Bon, sinon, "chez moi ça marche"(tm). FreeBSD 5.2.1-RELEASE. Extrait :


:-)


/usr/ports on /usr/home/pornin/zoinx/ports (nullfs, local)
<above>:/usr/home/pornin/zoinx/urk on
/usr/home/pornin/zoinx/ports (unionfs, local, noclusterw)


C'est monté dans le meme ordre. Tu n'as pas ajouté d'option en le
montant ?


mount -t unionfs -b zoinx/ports zoinx/urk
avec le flag "-b" pour dire que l'union doit se faire avec "zoinx/urk"
au-dessus mais néanmoins dans "zoinx/urk".


Justement, j'ai l'ai fait sans "-b", j'ai tout ajouté dans le fstab.
C'est sans doute la mon erreur. Cependant, ca devrait marcher,
théoriquement non ?


On doit pouvoir le faire dans l'autre sens, mais là je me retrouve
avec un "nullfs" que je n'arrive pas à démonter ("file system busy")
ce qui n'est pas terrible. La page de man n'est pas particulièrement
faite pour me rassurer par ailleurs.


J'ai eu cela aussi, j'ai fermé tous mes shells, qui n'étaient
normalement plus dans ce repertoire et j'ai pu démonter ensuite.


Au fait, pourquoi faire un nullfs ? "unionfs" sait très bien faire
tout seul le travail :
mount -t unionfs -o -b /usr/ports /blah/ports


Hum, je vais essayer comme ca, en fait, je m'étais posé le probleme en:
1) "copier /usr/ports" dans la jail
2) pouvoir y écrire ensuite

Donc j'avais d'abord monté un nullfs, et ensuite un unionfs.


les vrais fichiers de /usr/ports, mais se fassent plutôt dans le
filesystem qui contenait /blah/ports avant le montage. Ce n'est
pas ce que tu veux ?


Si tout a fait, mais je me suis enteté dans ma solution, et j'ai pas
pensé a faire cela.

Si je veux faire comme cela, il faut que j'utilise l'option -b de
mount. Je suppose que je ne pourrais pas le faire directement dans le
fstab ? Il va falloir que je rajouter une commande mount dans mes
scripts ?


--
Nicolas Le Scouarnec

Avatar
pornin
According to Nicolas Le Scouarnec :
Voila ce que me donne ces deux commandes: pwd ne trouve pas "." !?!


C'est un ennui, ça. Ça arrive quand on est dans un répertoire avec
un shell, mais qu'on a par ailleurs effacé ce répertoire depuis un
autre shell.


/usr/ports on /usr/home/pornin/zoinx/ports (nullfs, local)
<above>:/usr/home/pornin/zoinx/urk on
/usr/home/pornin/zoinx/ports (unionfs, local, noclusterw)


C'est monté dans le meme ordre. Tu n'as pas ajouté d'option en le
montant ?


Si, j'ai dû mettre un -b pour avoir le même ordre, justement.


Si je veux faire comme cela, il faut que j'utilise l'option -b de
mount. Je suppose que je ne pourrais pas le faire directement dans le
fstab ?


Il faut essayer mais je ne vois rien qui s'y oppose. Essaye de mettre
un -b dans la colonne des options (la quatrième). Si je ne m'abuse,
"mount" ne fait rien de très sorcier avec le fstab : il extrait le
type de filesystem, et appelle le "mount_truc" qui va bien en lui
passant textuellement les options.

M'enfin, mon avis à moi est qu'il faut commencer par faire marcher
le montage avec des lignes de commande "à la main" avant de finasser
avec un fstab.


--Thomas Pornin


Avatar
Nicolas Le Scouarnec
C'est monté dans le meme ordre. Tu n'as pas ajouté d'option en le
montant ?
Si, j'ai dû mettre un -b pour avoir le même ordre, justement.



Bizarre.

Si je veux faire comme cela, il faut que j'utilise l'option -b de
mount. Je suppose que je ne pourrais pas le faire directement dans le
fstab ?
Il faut essayer mais je ne vois rien qui s'y oppose. Essaye de mettre

un -b dans la colonne des options (la quatrième). Si je ne m'abuse,


Ca marche très bien avec ca, merci.

M'enfin, mon avis à moi est qu'il faut commencer par faire marcher
le montage avec des lignes de commande "à la main" avant de finasser
avec un fstab.


J'ai réussi a avoir ce que je voulais, ca marche, je n'ai plus
d'erreur. J'ai juste cela dans le mount:
<below>:/usr/src on /a2/jails/club_jeu/usr/src (unionfs, noclusterw)
<below>:/usr/ports on /a2/jails/club_jeu/usr/ports (unionfs, noclusterw)



--
Nicolas Le Scouarnec


Avatar
talon
Patrick Lamaizière wrote:
Thomas Pornin écrivait :

La page de man n'est pas particulièrement
faite pour me rassurer par ailleurs.


«
HISTORY
The mount_unionfs utility first appeared in 4.4BSD. It first worked in
FreeBSD-(fill this in).
»

Ben ça fout la trouille même. Quel est le status de ces fonctionnalités ?
C'est vraiment apparu avec 4.4 BSD ?



Fais une recherche Google et tu trouveras la réponse à ta question
plutôt 1000 fois qu'une.

--

Michel TALON