V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
pq
V2EX  ›  Linux

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

  •  
  •   pq · 2017-06-06 13:11:16 +08:00 · 3278 次点击
    这是一个创建于 2716 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    24 条回复    2017-06-07 19:46:58 +08:00
    likuku
        1
    likuku  
       2017-06-06 15:00:48 +08:00   ❤️ 1
    SAMBA 吧,用 SAMBA 作不同 share 点来分享资源。

    本来 ACL 可以,但 NTFS 不能加 Linux 的 ACL
    Havee
        2
    Havee  
       2017-06-06 15:12:55 +08:00   ❤️ 1
    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
        3
    Havee  
       2017-06-06 15:18:30 +08:00
    第一行中 fmask=177,dmask=077
    pq
        4
    pq  
    OP
       2017-06-06 15:36:52 +08:00
    @Havee -o bind 时,后面那些参数都不起效果的,man mount 中写明了的,google 也都这么说。
    pq
        5
    pq  
    OP
       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
        6
    parametrix  
       2017-06-06 15:44:53 +08:00   ❤️ 1
    可以考虑用 bindfs,参考 http://bindfs.org/docs/bindfs.1.html
    Havee
        7
    Havee  
       2017-06-06 15:46:07 +08:00
    @pq 那第二次 mount 就 -o bind,ro
    只读
    Havee
        8
    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
        9
    pq  
    OP
       2017-06-06 15:48:57 +08:00
    算了,这个想法目前看来不现实,我还是启动到 windows 后,将部分不想让这个 uid 看到的目录移动到另一个分区算了,然后将非敏感的 ntfs 分区直接以这个 uid 挂载。
    pq
        10
    pq  
    OP
       2017-06-06 15:49:58 +08:00
    @parametrix 嗯,google 时确实有人提到过 bindfs,等下我试试看。。。
    pq
        11
    pq  
    OP
       2017-06-06 15:51:14 +08:00
    @Havee 呵呵,我在 fstab 中挂那个分区时就是以 ro 模式 mount 的。
    Havee
        12
    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
        13
    pq  
    OP
       2017-06-06 15:54:49 +08:00
    @Havee 是的,ro 是可以用在 bind 后的,但我这个 case,需要的是对特定目录的授权访问,所以,uid 或 umask/fmask/dmask 之类能修改才是有意义的。
    Havee
        14
    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
        15
    pq  
    OP
       2017-06-06 15:58:26 +08:00
    @Havee 这么做的后果,等于是将整个分区透明化了,普通 uid 可以直接通过顶级挂载点访问整个分区,而我想要做的是,让部分目录对普通 uid 不可见。
    Havee
        16
    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
        17
    pq  
    OP
       2017-06-06 16:02:12 +08:00
    @Havee 晕,只读也是能读呀,我想要的是,部分目录完全不可见,不能读。。。。
    yjd
        18
    yjd  
       2017-06-06 16:02:49 +08:00
    当初也想实现像 ntfs 那样方便设置权限。最后不了了之了。期待 pq 解决。
    parametrix
        19
    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
        20
    wevsty  
       2017-06-06 16:41:40 +08:00
    可以用 libfuse 开发个映射的程序就可以完成了。
    PaleCheung
        21
    PaleCheung  
       2017-06-06 18:06:53 +08:00
    @pq 然后原来的目录用 link 链接就好。
    保持原来的目录树结构
    likuku
        22
    likuku  
       2017-06-07 15:07:54 +08:00
    @pq mount --bind 我常用,但是用在 liveCD 环境下打包 /解包 chroot 方式快速安装系统用.

    可以当成是把源目录给硬 mount
    pq
        23
    pq  
    OP
       2017-06-07 15:25:42 +08:00
    @likuku 是的,基本上相当于一个硬链接,无法阻止普通 uid 通过顶级挂载点来直接访问整个分区。
    likuku
        24
    likuku  
       2017-06-07 19:46:58 +08:00
    NTFS 上数据迁移到 Linux 原生支持的 FS 吧,或者 直接用 windows.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5362 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:44 · PVG 11:44 · LAX 19:44 · JFK 22:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.