Accès au contenu original du point de montage

32

Sur mon NAS sans tête, j'ai sdf1(une carte flash) montée en tant /que /homedepuis lv00(un volume LVM sauvegardé par un logiciel RAID). Pour pouvoir accéder à la machine lorsque le RAID tombe en panne, je dispose d'une copie de ma clé publique ssh, etc. /home/foo/.sshsur le système de fichiers sdf1.
Pour mettre à jour les fichiers qui sont cachés par la montée /homenormalement je remount lv00dans /mnt/home, faire ce que je dois faire, puis se déplacer lv00en place.
Y a-t-il un moyen d'y parvenir sans démonter /home?

Janus
la source

Réponses:

44
mkdir /mnt/root
mount --bind / /mnt/root
ls /mnt/root/home/foo/.ssh

Tant que vous utilisez --bind(contrairement à --rbind), vous obtenez un clone de la monture sans la substance montée sur le dessus.

éphémère
la source
Parfait! J'étais en train de jouer avec l'idée de mount --bind, mais je n'ai eu que quelques idées compliquées qui ne manqueraient pas de casser quand j'en aurais besoin. Cela fait exactement ce dont j'ai besoin et peut même aller en tant que montage permanent. Merci
Janus
Vaut-il la peine de modifier cette réponse pour inclure le fait que vous devez monter un niveau au-dessus du répertoire couvert avec un montage, comme indiqué dans l’autre réponse? Cette réponse est par ailleurs meilleure, car elle est plus courte et donc plus facile à lire rapidement!
Michael Firth
5

J'ai essayé d'obtenir quelque chose de similaire, mais la réponse de l' éphémient n'expliquait pas la sémantique de la méthode. Cela a échoué pour moi et j'ai donc posé pratiquement la même question plus tôt ici sous unix.SE. Après un commentaire, je l'ai compris par moi-même et j'ai répondu. Ceci est une version révisée de ma réponse pour entrer dans ce contexte ici. J'ai enlevé mon autre question (et sa réponse) en faveur de celle-ci.

Voici ce que j'essayais de faire:

Exemple de cas

Montures:

/dev/sda1  on /     type ext4 (rw)
/dev/sdb1  on /data type ext4 (rw)
/data/home on /home type none (rw,bind)

Après le montage, /j'ai un dossier /home/joepour l'utilisateur joe. Une fois que l'autre emplacement est monté ( /data), j'ai l'ensemble des dossiers de base disponibles, je suis donc en train de les monter en place ( /data/home on /home). Il y a un dossier /data/home/joe, donc tant que le montage de /dev/sdb1réussit, il obtiendra le contenu de /data/home/joe, sinon il retombera sur /home/joe(sur /dev/sda1!).

Quand cela réussit, comment puis-je accéder au contenu original de /home/joe(on /dev/sda1!) Au lieu de ceux qui sont montés dans la reliure /data/home/joe?

Solution

Sur la base d’un commentaire de Patrick sur ma question et de la solution de ephemient (réponse acceptée ici), j’ai proposé ce qui suit.

Il est apparemment possible de mount --bind(ou mount -o bind) le dossier parent ( c'est la partie cruciale ) d'un montage lié ailleurs et ainsi d'accéder au contenu d'origine. Donc, pour mon exemple, au lieu d'essayer de:

mount --bind /home/joe /home/joe/underneath
# or ...
mount --bind /home /home/joe/underneath

(c.-à-d. monter les emplacements déjà montés dans des liaisons ailleurs), je devais:

test -d /.ROOT || mkdir /.ROOT
mount --bind / /.ROOT
mount --bind /.ROOT/home/joe /home/joe/underneath

Voilà donc ce que Patrick voulait dire dans son commentaire

À moins que vous ne remontiez au-dessus /(racine), cette réponse devrait fonctionner correctement.

Tant que vous avez un dossier parent disponible à l'emplacement monté par la liaison, cela fonctionnera, mais avec une seule indirection, comme indiqué ci-dessus. Si vous avez lié quelque chose de monté, /vous êtes hors de chance, car il n'y a pas de dossier parent pour /.

0xC0000022L
la source
Monter le dossier parent était la partie clé qui me manquait. Merci.
aidan
1

Vous pouvez déplacer la monture vers un nouvel emplacement sans la démonter, en utilisant mount --move:

$ mount --move /home /mnt/home
do stuff with the local /home
$ mount --move /mnt/home /home
Michael Mrozek
la source
1
Merci Michael. Cela a le même inconvénient de rendre / home inaccessible aux autres utilisateurs.
Janus