如何才能让 NTFS 分区 mount 后,普通 uid 只能读取某些指定目录?

2017-06-06 13:11:16 +08:00
 pq

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

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

3115 次点击
所在节点    Linux
24 条回复
likuku
2017-06-06 15:00:48 +08:00
SAMBA 吧,用 SAMBA 作不同 share 点来分享资源。

本来 ACL 可以,但 NTFS 不能加 Linux 的 ACL
Havee
2017-06-06 15:12:55 +08:00
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
Havee
2017-06-06 15:18:30 +08:00
第一行中 fmask=177,dmask=077
pq
2017-06-06 15:36:52 +08:00
@Havee -o bind 时,后面那些参数都不起效果的,man mount 中写明了的,google 也都这么说。
pq
2017-06-06 15:43:57 +08:00
@likuku 本地 samba ?确实应该可行,但这效率和资源占用,估计会很恐怖,本来用户态的 ntfs-3g 就够耗资源的,再加上一个 samba。。。。

ntfs-3g 官网确实写明了,已经支持 NTFS ACL,而且,man ntfs-3g 也有相关参数,但 mount 的 man 里却不提这个,我试着 setfacl 后,貌似没任何效果,唉,linux 真是个大杂烩,各种层级的文档,经常自说自话,这点远不如 FreeBSD 那么统一。
parametrix
2017-06-06 15:44:53 +08:00
可以考虑用 bindfs,参考 http://bindfs.org/docs/bindfs.1.html
Havee
2017-06-06 15:46:07 +08:00
@pq 那第二次 mount 就 -o bind,ro
只读
Havee
2017-06-06 15:48:40 +08:00
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).
pq
2017-06-06 15:48:57 +08:00
算了,这个想法目前看来不现实,我还是启动到 windows 后,将部分不想让这个 uid 看到的目录移动到另一个分区算了,然后将非敏感的 ntfs 分区直接以这个 uid 挂载。
pq
2017-06-06 15:49:58 +08:00
@parametrix 嗯,google 时确实有人提到过 bindfs,等下我试试看。。。
pq
2017-06-06 15:51:14 +08:00
@Havee 呵呵,我在 fstab 中挂那个分区时就是以 ro 模式 mount 的。
Havee
2017-06-06 15:54:47 +08:00
@pq
man mount 中说的很清楚了啊

mkdir -p 123 456
mount --bind 123 456
mount -o remount,bind,ro 123 456
cd 456; touch 123

试试结果是什么
pq
2017-06-06 15:54:49 +08:00
@Havee 是的,ro 是可以用在 bind 后的,但我这个 case,需要的是对特定目录的授权访问,所以,uid 或 umask/fmask/dmask 之类能修改才是有意义的。
Havee
2017-06-06 15:57:33 +08:00
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
pq
2017-06-06 15:58:26 +08:00
@Havee 这么做的后果,等于是将整个分区透明化了,普通 uid 可以直接通过顶级挂载点访问整个分区,而我想要做的是,让部分目录对普通 uid 不可见。
Havee
2017-06-06 16:00:49 +08:00
你需要特定的用户
那第一次挂在参数就 -o uid=username,gid=username,fmask=133,dmask=022

第二次 mount --bind

第三次 mount -o remount,bind,ro

这样不就是特定的用户 username 只读了?
pq
2017-06-06 16:02:12 +08:00
@Havee 晕,只读也是能读呀,我想要的是,部分目录完全不可见,不能读。。。。
yjd
2017-06-06 16:02:49 +08:00
当初也想实现像 ntfs 那样方便设置权限。最后不了了之了。期待 pq 解决。
parametrix
2017-06-06 16:12:55 +08:00
@pq #17 用 bindfs 可以权限映射:比如 dirA 属于 user1@group1

bindfs --map=user1/user2:@group1/@group2 --perms=permissions /some/dirA /some/dirB

可以把 dirA 映到 dirB 的同时,dirB 及其中文件属于 user2@group2,并且权限也可以设置。发生修改的时候,文件所属与权限都符合这个映射。
wevsty
2017-06-06 16:41:40 +08:00
可以用 libfuse 开发个映射的程序就可以完成了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/366333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX