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
?
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
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.
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 /
.