Access to original contents of mount point

On my headless NAS I have sdf1 (a flash-card) mounted as / while /home is mounted from lv00 (an LVM volume backed by a software RAID). To be able to access the machine when the RAID fails, I have a copy of my ssh public key, etc. in /home/foo/.ssh on the file-system from sdf1.
To update the files that are hidden by the mounted /home I normally remount lv00 in /mnt/home, do what I have to do, and then move lv00 back in place.
Is there a way to achieve this without unmounting /home?

Asked By: Janus

||

You can move the mount to a new location without unmounting it, using mount --move:

$ mount --move /home /mnt/home
do stuff with the local /home
$ mount --move /mnt/home /home
Answered By: Michael Mrozek
mkdir /mnt/root
mount --bind / /mnt/root
ls /mnt/root/home/foo/.ssh

As long as you use --bind (as opposed to --rbind), you get a clone of the mount without the stuff mounted on top of it.

Answered By: ephemient

I’ve tried to achieve something similar, but ephemient‘s answer didn’t explain the semantics of the method. It failed for me and so I asked virtually the same question earlier here on unix.SE. After a comment I figured it out on my own and answered it. This is an edited version of my answer to fit into this context here. I removed my other question (and answer) in favor of this one.

Here’s what I was trying to do:

Example case

Mounts:

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

After mounting / I have a folder /home/joe for user joe. Once the other location gets mounted (/data) I have the full set of home folders available, so I am bind-mounting them into place (/data/home on /home). There is a folder /data/home/joe, so as long as the mounting of /dev/sdb1 succeeds, he’ll get the contents of /data/home/joe, otherwise he’ll fall back to /home/joe (on /dev/sda1!).

When it succeeds, how can I access the original contents of /home/joe (on /dev/sda1!) instead of those bind-mounted into place from /data/home/joe?

Solution

Based on a comment by Patrick‘s comment on my question and the solution by ephemient (accepted answer here), I came up with the following.

It is apparently possible to mount --bind (or mount -o bind) the parent folder (this is the crucial part) of a bind-mount elsewhere and thereby access the original contents. So for my example case, instead of trying to:

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

(i.e. mount the already bind-mounted locations elsewhere) I had to:

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

So this is what Patrick meant in his comment

Unless you’re remounting over / (root), that answer should work just fine.

As long as you have a parent folder to the bind-mounted location available, it’ll work, albeit with one indirection as shown above. If you bind-mounted something over / you’re out of luck, as there is no parent folder for /.

Answered By: 0xC0000022L
Categories: Answers Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.