技术解析

如何才能让 NTFS 分区 mount 后,普通 uid 只能读取某些指定目录?
0
2021-06-30 07:41:51
idczone

我试着以 uid=0,umask=077 来 mount,然后再 mount -o bind,umask=022 /ntfs_dir /home/uid/path,执行起来是没问题,但 umask 还是原来的 077,在 bind 后加 uid 也没效果,估计 bind 时是不能修改原来的挂载参数的。

不知还有没有其它办法来实现这个功能呢?


SAMBA 吧,用 SAMBA 作不同 share 点来分享资源。
本来 ACL 可以,但 NTFS 不能加 Linux 的 ACL

root 权限
mount -t ntfs-3g -o uid=root,gid=root,fmask=133,dmask=022 /dev/sdb1 /mnt/data
username 用户
mount -t ntfs-sg -o bind,uid=username,gid=users /mnt/data/dir /home/uid/path

第一行中 fmask=177,dmask=077

-o bind 时,后面那些参数都不起效果的,man mount 中写明了的,google 也都这么说。

本地 samba ?确实应该可行,但这效率和资源占用,估计会很恐怖,本来用户态的 ntfs-3g 就够耗资源的,再加上一个 samba。。。。
ntfs-3g 官网确实写明了,已经支持 NTFS ACL,而且,man ntfs-3g 也有相关参数,但 mount 的 man 里却不提这个,我试着 setfacl 后,貌似没任何效果,唉,linux 真是个大杂烩,各种层级的文档,经常自说自话,这点远不如 FreeBSD 那么统一。

可以考虑用 bindfs,参考 http://bindfs.org/docs/bindfs.1.html

那第二次 mount 就 -o bind,ro
只读

man mount
...
mount(8) since v2.27 allows to change the mount options by passing the relevant options along with --bind.
For example:
mount --bind,ro foo foo
This feature is not supported by the Linux kernel; it is implemented in userspace by an additional mount(2)
remounting system call. This solution is not atomic.
The alternative (classic) way to create a read-only bind mount is to use the remount operation, for example:
mount --bind olddir newdir
mount -o remount,bind,ro olddir newdir
Note that a read-only bind will create a read-only mountpoint (VFS entry), but the original filesystem
superblock will still be writable, meaning that the olddir will be writable, but the newdir will be read-only.
It's also possible to change nosuid, nodev, noexec, noatime, nodiratime and relatime VFS entry flags by
"remount,bind" operation. It's impossible to change mount options recursively (for example with -o rbind,ro).

算了,这个想法目前看来不现实,我还是启动到 windows 后,将部分不想让这个 uid 看到的目录移动到另一个分区算了,然后将非敏感的 ntfs 分区直接以这个 uid 挂载。

嗯,google 时确实有人提到过 bindfs,等下我试试看。。。

呵呵,我在 fstab 中挂那个分区时就是以 ro 模式 mount 的。


man mount 中说的很清楚了啊
mkdir -p 123 456
mount --bind 123 456
mount -o remount,bind,ro 123 456
cd 456; touch 123
试试结果是什么

是的,ro 是可以用在 bind 后的,但我这个 case,需要的是对特定目录的授权访问,所以,uid 或 umask/fmask/dmask 之类能修改才是有意义的。

host ~ mkdir -p 123 456
host ~ mount --bind 123 456
host ~ mount -o remount,bind,ro 123 456
host ~ cd 456; touch 123
touch: cannot touch '123': Read-only file system

这么做的后果,等于是将整个分区透明化了,普通 uid 可以直接通过顶级挂载点访问整个分区,而我想要做的是,让部分目录对普通 uid 不可见。

你需要特定的用户
那第一次挂在参数就 -o uid=username,gid=username,fmask=133,dmask=022
第二次 mount --bind
第三次 mount -o remount,bind,ro
这样不就是特定的用户 username 只读了?

晕,只读也是能读呀,我想要的是,部分目录完全不可见,不能读。。。。

当初也想实现像 ntfs 那样方便设置权限。最后不了了之了。期待 pq 解决。

用 bindfs 可以权限映射:比如 dirA 属于 [email&--map=user1/user2:@group1/@group2 --perms=permissions /some/dirA /some/dirB
可以把 dirA 映到 dirB 的同时,dirB 及其中文件属于 [email protected],并且权限也可以设置。发生修改的时候,文件所属与权限都符合这个映射。

可以用 libfuse 开发个映射的程序就可以完成了。

然后原来的目录用 link 链接就好。
保持原来的目录树结构

mount --bind 我常用,但是用在 liveCD 环境下打包 /解包 chroot 方式快速安装系统用.
可以当成是把源目录给硬 mount

是的,基本上相当于一个硬链接,无法阻止普通 uid 通过顶级挂载点来直接访问整个分区。

NTFS 上数据迁移到 Linux 原生支持的 FS 吧,或者 直接用 windows.

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服