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.)

  • @whaleross
    link
    62 days ago

    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.

    • @[email protected]OP
      link
      fedilink
      22 days ago

      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)
      • @whaleross
        link
        1
        edit-2
        2 days ago

        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.)

  • Strit
    link
    fedilink
    73 days ago

    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.

  • @[email protected]
    link
    fedilink
    English
    53 days ago

    You need to

    sudo mount --bind "/home/user/folderApple" "/home/user/folderApple-original"

    before you

    sudo mount --bind "/mnt/drive/folderBanana" "/home/user/folderApple".

      • @[email protected]
        link
        fedilink
        English
        32 days ago

        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?

  • Badabinski
    link
    fedilink
    22 days ago

    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.