Может ли root надежно определять флаги per-mount («bind mount»), например для файловой системы FUSE? - PullRequest
0 голосов
/ 28 августа 2018

Файловые системы FUSE, смонтированные пользователем без полномочий root, не могут быть доступны для пользователя root (если только allow_other не используется при монтировании).

Как пользователь root, я хочу запросить флаги для каждого монтирования, такие как nosuid, чтобы я мог использовать mount() с MS_REMOUNT|MS_BIND|..., чтобы добавить флаг MS_RDONLY для каждого монтирования. Я был успешным на большинстве файловых систем, используя statvfs() для запроса существующих флагов монтирования. Но есть ли способ реализовать это, который обрабатывает такие случаи, как FUSE (и NFS с root_squash)?

1 Ответ

0 голосов
/ 28 августа 2018

Да. statvfs() работает и в этом случае. В то же время он предотвращает блокировку файловой системы FUSE.

$ mkdir mnt
$ bindfs --no-allow-other mnt mnt
$ stat -f mnt
  File: "mnt"
    ID: 0        Namelen: 255     Type: fuseblk
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 78150265   Free: 8223357    Available: 4722313
Inodes: Total: 19857408   Free: 18558102

$ strace stat -f mnt
...
statfs("mnt", {f_type=FUSE_SUPER_MAGIC, f_bsize=0, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=0, f_frsize=0, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_RELATIME}) = 0
...

  File: "mnt"
    ID: 0        Namelen: 0       Type: fuseblk
Block size: 0          Fundamental block size: 0
Blocks: Total: 0          Free: 0          Available: 0
Inodes: Total: 0          Free: 0
+++ exited with 0 +++

statvfs() явно задокументировано как не требующий доступа к целевому каталогу, только родители.

EACCES (statvfs ()) Отказано в разрешении на поиск для компонента путь префикс пути. (См. Также path_resolution (7).)

К сожалению, ваш процесс перемонтирования имеет условие гонки, которое нельзя исправить, если вы не можете открыть целевой каталог. Примечание O_PATH позволяет открывать каталоги, не требуя разрешения для самого каталога. (O_PATH fds может быть адресован как путь, используя /proc/self/fd/%d, в том числе mount()).

...