I have 2 directories which both have stuff in them:
-
/home/user/folderApple
-
/mnt/drive/folderBanana
I want to mount folderBanana
onto folderApple
like this:
sudo mount --bind "/mnt/drive/folderBanana" "/home/user/folderApple"
But I still want to be able to access the contents of folderApple
while this is activated. From what I am reading, binding the original directory to a new location should make it available, like this:
mkdir "/home/user/folderApple-original"
sudo mount --bind "/home/user/folderApple" "/home/user/folderApple-original"
But this just binds /mnt/drive/folderBanana
to /home/user/folderApple-original
as well. I tried reversing the order and result is the same.
How do I tell mount
to look for the underlying directory?
I am happy to use symlinks or something else if it’ll reliably get the job done, I am not wedded to this mechanism.
(The purpose of all this is that when an external drive is connected, I can have the storage conveniently available, but when it is not connected, the system will fallback to internal storage. But then I will want to move files between the fallback and external locations when both are available. So I need to see both locations at once.)
Check out section 4.1 here https://www.baeldung.com/linux/bind-mounts
The easy solution would be to have a third common mount point for the two that is switched if the external drive is connected or not.
In another subthread I came up with the below, is this what you mean? I haven’t tried it yet.
/home/user/folderApple
is always empty/home/user/folderApple-original
mounts ontop of/home/user/folderApple
at boot- then
/mnt/drive/folderBanana
also mounts ontop of/home/user/folderApple
when/if it becomes available (later in the order)
Basically, yeah. Bind the “local” path on boot and then have systemd triggers for when USB mounts and unmounts to swap them automatically.
(Personally I wouldn’t do it like this though because it will become trouble with any open files or shell or whatever in a path that is replaced by a different mount.)
Only way I know of is to unmount the binded folder. I don’t think there is a way to have the filesystem show files from both at the same time.
You need to
sudo mount --bind "/home/user/folderApple" "/home/user/folderApple-original"
before you
sudo mount --bind "/mnt/drive/folderBanana" "/home/user/folderApple"
.The results are the same no matter which order I do the mounts in.
So… are you saying the contents of
/home/user/folderApple-original
really changes after you bindmount something over/home/user/folderApple
? This seems odd. Do you have submounts under the original directory? Try with--rbind
?
Sounds like you may want to use a union filesystem like overlayfs. I’m not sure if the specific behavior of overlayfs will work for you, but it’s worth investigating.
Thank you for putting your use-case in your post, since otherwise I think this might be an XY problem.
EDIT: There’s also mergefs and unionfs. I don’t know what the features and drawbacks are for these three union filesystems. mergefs seems like it might be the most configurable, but it’s also FUSE. unionfs and overlayfs are both in-kernel, so they’ll perform better (which may not matter for your use-case). overlayfs is the one I’m most familiar with of those two, since it’s used by most container runtimes.