rfjakob/gocryptfs

Issue with idle-unmount and files being used

petrarca-arezzo opened this issue · 7 comments

I'm seeing a strage (I think) behaviour with the idle-unmount option - if I mount a cipherdir with the idle option on and have a file opened in an editior gocryptfs does unmount the directory. My expectation would be that it would be left mounted as long as files are in use/opened and only unmounts it once all files are closed. Manually unmounting gives an error as expected though.

A sample debug output looks like this:

Checking for idle (isIdle = false, open = 0): 2020-12-14 10:13:23.774914275 +0100 CET m=+81.285029634
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:14:38.775224258 +0100 CET m=+156.285339542
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:15:53.775592901 +0100 CET m=+231.285708140
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:17:08.776033063 +0100 CET m=+306.286148317
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:18:23.7764397 +0100 CET m=+381.286554924
Filesystem idle; unmounting: /home/user/secret
unmount: srv.Unmount returned /bin/fusermount: failed to unmount /home/user/secret: Device or resource busy
 (code exit status 1)
Trying lazy unmount
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:19:39.091255942 +0100 CET m=+456.601371260
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:20:54.091621515 +0100 CET m=+531.601736754
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:22:09.091971152 +0100 CET m=+606.602086390
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:23:24.092327712 +0100 CET m=+681.602442945
Filesystem idle; unmounting: /home/user/secret
unmount: srv.Unmount returned /bin/fusermount: entry for /home/user/secret not found in /etc/mtab
 (code exit status 1)
Trying lazy unmount
fusermount: entry for /home/user/secret not found in /etc/mtab
Checking for idle (isIdle = true, open = 0): 2020-12-14 10:24:39.40682465 +0100 CET m=+756.916939948

This is happening with
gocryptfs 1.7.1; go-fuse 0.0~git20190214.58dcd77; 2019-12-26 go1.13.5 linux/amd64

I think the problem is that the editor copies the file into memory, but does not keep it actually open. At least that's what nano seems to do:

Open file

$ nano /tmp/foo.txt

In second terminal check what files nano has open (note: foo.txt is not here)

$ lsof -p $(pgrep nano)
COMMAND   PID  USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
nano    14682 jakob  cwd    DIR  253,0      4096       2 /
nano    14682 jakob  rtd    DIR  253,0      4096       2 /
nano    14682 jakob  txt    REG  253,0    347200 6355383 /usr/bin/nano
nano    14682 jakob  mem    REG  253,0 223542144 6292603 /usr/lib/locale/locale-archive
nano    14682 jakob  mem    REG  253,0     37384 6298839 /usr/lib64/libdl-2.32.so
nano    14682 jakob  mem    REG  253,0    103104 6299797 /usr/lib64/libz.so.1.2.11
nano    14682 jakob  mem    REG  253,0   3222128 6293317 /usr/lib64/libc-2.32.so
nano    14682 jakob  mem    REG  253,0    191480 6298831 /usr/lib64/libtinfo.so.6.2
nano    14682 jakob  mem    REG  253,0    263104 6297444 /usr/lib64/libncursesw.so.6.2
nano    14682 jakob  mem    REG  253,0    182576 6309068 /usr/lib64/libmagic.so.1.0.0
nano    14682 jakob  mem    REG  253,0     26998 6817233 /usr/lib64/gconv/gconv-modules.cache
nano    14682 jakob  mem    REG  253,0    264360 6298832 /usr/lib64/ld-2.32.so
nano    14682 jakob    0u   CHR  136,0       0t0       3 /dev/pts/0
nano    14682 jakob    1u   CHR  136,0       0t0       3 /dev/pts/0
nano    14682 jakob    2u   CHR  136,0       0t0       3 /dev/pts/0

What editor do you use? Can you check with lsof if it keeps the file open?

I tried it with a few different editors (nano, xed, emacs, atom). With all of them the directory gets unmounted after the idle-time even though files are in use (open in the editors with unsaved changes made).
Here some results after the gocryptfs-directory is mounted and four files opened in the editors with unsaved changes:

user@linux ~ $ uname -a
Linux linux 5.4.0-58-generic #64-Ubuntu SMP Wed Dec 9 08:16:25 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
user@linux ~ $ fusermount -u /home/user/secret 
fusermount: failed to unmount /home/user/secret: Device or resource busy
user@linux ~ $ lsof -p $(pgrep nano) | grep home
nano    33555 user  cwd    DIR   0,55     4096  7004411 /home/user/secret
user@linux ~ $ lsof -p $(pgrep xed) | grep home
xed     33562 user  cwd       DIR               0,60    12288  6946824 /home/user
xed     33562 user  mem       REG               0,60    32768  6961704 /home/user/.local/share/gvfs-metadata/root-199bc02a.log
xed     33562 user  mem       REG               0,60    55476  6947290 /home/user/.local/share/gvfs-metadata/root
xed     33562 user  mem       REG               0,60    86057  6969237 /home/user/.config/dconf/user
xed     33562 user    2w      REG               0,60    25446  6946963 /home/user/.xsession-errors
xed     33562 user   13r      REG               0,60    55476  6947290 /home/user/.local/share/gvfs-metadata/root
xed     33562 user   14r      REG               0,60    32768  6961704 /home/user/.local/share/gvfs-metadata/root-199bc02a.log
user@linux ~ $ lsof -p $(pgrep emacs) | grep home
emacs   33609 user  cwd       DIR               0,55     4096  7004411 /home/user/secret
emacs   33609 user  mem       REG               0,60    86057  6969237 /home/user/.config/dconf/user
emacs   33609 user    2w      REG               0,60    25446  6946963 /home/user/.xsession-errors
user@linux ~ $ lsof -p $(pgrep atom) | grep home
lsof: status error on 33317: No such file or directory
lsof: status error on 33322: No such file or directory
lsof: status error on 33324: No such file or directory
lsof: status error on 33348: No such file or directory
lsof: status error on 33371: No such file or directory
lsof: status error on 33436: No such file or directory
lsof 4.93.2
 latest revision: https://github.com/lsof-org/lsof
 latest FAQ: https://github.com/lsof-org/lsof/blob/master/00FAQ
 latest (non-formatted) man page: https://github.com/lsof-org/lsof/blob/master/Lsof.8
 usage: [-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
 [-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
 [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
Use the ``-h'' option to get more help information.
user@linux ~ $ mount | grep gocryptfs
/home/user/.secret on /home/user/secret type fuse.gocryptfs (rw,nosuid,nodev,relatime,user_id=1000,group_id=100,max_read=131072)

then after some (idle-) time:

user@linux ~ $ mount | grep gocryptfs
user@linux ~ $ fusermount -u /home/user/secret 
fusermount: entry for /home/user/secret not found in /etc/mtab
user@linux ~ $

It seems that lsof (not working for me with 'atom') is just showing the mounted folder but not the actual file being edited; exception being xed which only shows the home directory under which the gocryptfs-folder is mounted.

I really hope, I'm not doing some dumb here; can someone reproduce (or not) what I'm seeing?

Nothing dumb :)

I can reproduce the behavior with nano. But I'm not sure what to do about it, as the file is not actually kept open by nano.

What puzzles me though is that if I open a file (with e.g. nano), I can't unmount the directory manually with fusermount. So it seems that fusermount is somehow recognizing the open file.

The first line of the lsof list shows that the mounted directory is in use (but not the actual file). So one might need to look for the directory being used, and not looking for a file being used (?):

user@linux ~ $ lsof -p $(pgrep nano) | grep home
nano    181767 user  cwd    DIR   0,58     4096  7004411 /home/user/secret
user@linux ~ $ lsof -p $(pgrep nano)
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
nano    181767 user  cwd    DIR   0,58     4096  7004411 /home/user/secret
nano    181767 user  rtd    DIR    8,1     4096        2 /
nano    181767 user  txt    REG    8,1   320136  2359348 /bin/nano
nano    181767 user  mem    REG    8,1    51832 14418433 /lib/x86_64-linux-gnu/libnss_files-2.31.so
nano    181767 user  mem    REG    8,1   105528 14418422 /lib/x86_64-linux-gnu/libnsl-2.31.so
nano    181767 user  mem    REG    8,1    57901 26493553 /usr/share/locale-langpack/de/LC_MESSAGES/nano.mo
nano    181767 user  mem    REG    8,1  6070224 25821215 /usr/lib/locale/locale-archive
nano    181767 user  mem    REG    8,1    18816 14418395 /lib/x86_64-linux-gnu/libdl-2.31.so
nano    181767 user  mem    REG    8,1  2029224 14418369 /lib/x86_64-linux-gnu/libc-2.31.so
nano    181767 user  mem    REG    8,1   192032 14418683 /lib/x86_64-linux-gnu/libtinfo.so.6.2
nano    181767 user  mem    REG    8,1   231504 14418180 /lib/x86_64-linux-gnu/libncursesw.so.6.2
nano    181767 user  mem    REG    8,1    55928 14418435 /lib/x86_64-linux-gnu/libnss_nis-2.31.so
nano    181767 user  mem    REG    8,1    43968 14418426 /lib/x86_64-linux-gnu/libnss_compat-2.31.so
nano    181767 user  mem    REG    8,1    27002 26223849 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
nano    181767 user  mem    REG    8,1   191472 14418270 /lib/x86_64-linux-gnu/ld-2.31.so
nano    181767 user    0u   CHR  136,1      0t0        4 /dev/pts/1
nano    181767 user    1u   CHR  136,1      0t0        4 /dev/pts/1
nano    181767 user    2u   CHR  136,1      0t0        4 /dev/pts/1
user@linux ~ $ fusermount -u secret
fusermount: failed to unmount /home/user/secret: Device or resource busy

That is true, however, try this:

cd /
nano /home/user/secret

PS: What I will do is to make the idle unmount behave like fusermount -u. That fixes the case:

cd /home/user
nano secret

But not that one:

cd /
nano /home/user/secret

Hello, I was having a similar problem.

In my case it was a process keypassxc-proxy.exe which remained after quitting KeyPassXC on Windows. (I am using gocryptfs from WSL, but using the mounted filesystem from Windows.)

I am noting it here since this page is what kagi offered as the first link when I searched for failed to unmount /root/gocryptfs-mnt/smallsync/plaintext: Device or resource busy.

Surely I will have this problem again in the future. Maybe someone else will as well, and will benefit from this note.