作者cuello (cuello)
看板Linux
标题[问题] mount -o uid=m,gid=n 的状况 [已解决]
时间Mon Oct 15 23:18:59 2018
Hi,
请问一下,甚麽情况下可能出现以下的 owner, group 的状况
在一个 terminal 上 (我是 817.100)
cuello@husserl:/mnt/sdc1_vfat$ id
uid=817(cuello) gid=100(users) groups=100(users)
cuello@husserl:/mnt/sdc1_vfat$ ls -ldn .
drwxr-xr-x 16 817 100 4096 Jan 1 1970 .
(这个资料夹是 817.100 的)
cuello@husserl:/mnt/sdc1_vfat$ ls -CF
(很多东西省略了)
但是在另一个 termninal 上却是 (我还是 817.100)
cuello@husserl:/mnt/sdc1_vfat$ id
uid=817(cuello) gid=100(users) groups=100(users)
cuello@husserl:/mnt/sdc1_vfat$ ls -ldn .
drwxr-xr-x 2 817 0 4096 Oct 15 22:33 .
(这个资料夹是 817.0 的!!!)
cuello@husserl:/mnt/sdc1_vfat$ ls -CF
(门都没有)
好吧,那就给它...
cuello@husserl:/mnt/sdc1_vfat$ sudo chown 817.100 .
cuello@husserl:/mnt/sdc1_vfat$ ls -ldn .
drwxr-xr-x 2 817 100 4096 Oct 15 22:33 .
("817.100" 总这样总该可以了吧... 但是)
cuello@husserl:/mnt/sdc1_vfat$ ls -CF
(还是甚麽都没有)
事情是这样子的: 我一直都在用自己写的 automounter。
就是去勾在 udev, 当插入 USB 随身碟,或是 SD 卡的时候,
自动检查里面的 filesystem,
然後用我的 X11 的 id 自动开一个 X-terminal。
前者,那个"第一个"就是我的 automounter 开的。
但是我常常从另一个 X-terminal 工作,这就是"另一个"。
许多年来,相安无事,直到最近,从别的 terminal "没有 access"!
因为最近一波勤於 compile 更新 kernels,就赶快 boot 一下别的核心,
试过了 4.14.75 3.16.58 4.9.130 却都是同样的状况....
刚才,查了一下 logfile,是 (我省略了一些 opts)
sudo mount -o nosuid,uid=817,gid=100,users -t vfat /dev/sdc1 /mnt/sdc1_vfat/
从外面试,也都如预期.
因为情况有点复杂,所以选择由以上角度切入,
看看会不会有甚麽线索。
如果需要提供进一步细节,请不吝指教。
===============================================================
[後记: 1539625745]
刚才在 mount 前面加了 sudo chown 817.100 /mnt/sdc1_vfat/
先前只有 "chown 817",现在从其它 terminals 看,
虽然资料夹是 817.100 的,但是一样,从其它 terminals 看,
里面甚麽也没有。
这个 "automounter" 是尽可能 portable 的 #!/bin/sh shell-script。
用一个 hook (/etc/udev/rules.d/99-udsh.rules) 拦截所有 udev-events
之後,用 su 变换为 user 权限,叫出下一步的 wrapper script,
这个 wrapper 再用 setsid(1) 叫 automounter 并 detach,
所以没有被 systemd-udev 追杀的问题。
是个常用的自用程式,例如,插入 USB 随身碟,
声响,自动 mount,有几个 partition 就自动开几个窗子,
每关掉一个窗子(^D),那个 partition 就自动 umount。
如此而以。一直都在正常使用,是甚麽时候开始这样,
我也搞不清楚,最近都是紧紧跟着 kernel 4.14.x
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.35.216
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Linux/M.1539616741.A.872.html
1F:→ mmis1000: 你可能可以找找看 linux namesapce 相关资讯? 10/16 01:41
※ 编辑: cuello (220.132.35.216), 10/16/2018 02:10:59
2F:→ cuello: 如何开始?拜托提示一下 10/16 02:13
3F:→ cuello: 对不起,正在看 namespace 的 wiki. . . 10/16 02:38
4F:→ cuello: 所以,systemd-udevd 用自己的 namespace, 外面看不到 10/16 04:53
5F:→ cuello: 现在问题就剩,怎麽 mount 才可 propagate 出去... 10/16 04:55
这个问题已暂时解决,这里大致报告一下,感谢 mmis1000 指出问题所在。
因为我的 shell-script 是挂勾在 udev 执行的,但是现在已经不是先前的
udevd, 而是 systemd-udevd,它用的是自己的 namespace,这并不会
propagate 回 root namespace (其它 terminal 或 shell),所以只能在
我那个由 systemd-udevd 叫出的 shell-scipt 所开的 terminal 里面看到。
这到底该视为 feature,还是还有 bug,我现在也没有能力判断。
暂时的解决方法:
# mkdir /etc/systemd/system/systemd-udevd.service.d/
# vim /etc/systemd/system/systemd-udevd.service.d/override.conf
# (因为我的系统还没有这个档案,就建个含两行字的档案)
[Service]
MountFlags=shared
# systemctl daemon-reload
# service systemd-udevd --full-restart
这样就好了。我从 root namespace 就可以看到 systemd-udevd
所建立的 mount point。
另一方面,我 compile 的 kernel 是 CONFIG_NAMESPACES=y
或许把它设为 =n 完全放弃 namespace 这 feature 重编也可以
(但是我自已没试过,这样会不利於开设虚拟机器,应该只适合在像
Pi 那种小机器使用。)
还有 nsenter(1) 应该也可以让我(有 root) 进去 systemd-udevd
那个 mount namespace,但我自己也是还没试过。
奇怪的是,有个正在使用我的 automounter 的朋友并没有这个问题,
他用也是 Debian stretch 以及跟我同等级的 kernel...
这我也还无法解释...
※ 编辑: cuello (220.132.35.216), 10/17/2018 04:05:09
6F:→ ChakraLinux: 前面两步其实可以用 systemctl edit systemd-udevd 10/17 12:41
7F:→ ChakraLinux: 取代,这样他会自己开一个vim给里写override 10/17 12:41
8F:→ cuello: 曾试过,但它给我一个不认识的 editor 10/17 15:14
9F:→ cuello: 说也奇怪,我的 EDITOR 我设为 vim 说 10/17 15:15
10F:→ cuello: 有,我有 export,刚刚查了一下 .bashrc 10/17 15:20
11F:推 brli7848: 因为systemctl是用VISUAL这个变数,预设是vi 10/17 16:47
12F:→ cuello: 喔,多谢! :) 10/17 17:37
13F:→ cuello: 糟糕,不对不对,我的 VISUAL 也是 vim ! 10/18 05:54
14F:→ cuello: 不然的话,实在应该用它自己提供的 edit 功能, 10/18 05:57
15F:→ cuello: 否则,不知哪一天他们心血来潮。。。。 10/18 05:58
16F:→ ChakraLinux: 看文件有另外的变数,忘了是啥了,反正nano好用 10/18 18:05
17F:→ cuello: 文件跟行为不一样,SYSTEMD_EDITOR 没设它应该用 EDITOR 10/18 22:18
18F:→ cuello: 不过,真得应该要用 systemctl edit systemd-udevd 才安全 10/18 22:19
[後记 1539872570]
是说,用 systemctl edit systemd-udevd 把 MountFlags=slave
改为 =shared,虽然暂时可以解决问题,但是想说人家预设为
MountFlags=slave 总是有个好理由,感觉好像做了件不好的事。
所以就一直寻找有没有办法,在 mount(8) 的时後,一次的地,
让这个 namespace propagate 回上面的 namespace。
但是到现在找不到答案...
※ 编辑: cuello (220.132.35.216), 10/18/2018 22:31:38
[後记 1540316204]
已经解决这个问题!不知道这板的习惯如何,但我想不是件坏事。
我在 stackexchange 得到了一个很有帮助的解答:
Is it possible for mount(8) to override systemd MountFlags?
https://unix.stackexchange.com/questions/476241/is-it-possible-for-mount8-to-override-systemd-mountflags
Filipie Brandenburger 建议在我的 script 用 systemd-mount(1)
来取代 mount(8),他并提示 systemd-mount(1) 在可能范围内,
所有的 options 都与 mount(8) 通用。我就直接把程式里的
mount 改为 systemd-mount。问题解决!
所以,这才是我所期待最适当的解决方法。
先前修改为 MountFlags=shared 的方法当然可行,
但是系统把这个 namespace 用篱围起来自然会有它的打算,
冒然拆掉的话,未来就必须一直维护下去这个自己创造的问题。
结论:只把自己的程式的 mount(8) 改为 systemd-mount(1)。
系统的设定完全没有动!结案,谢谢!
※ 编辑: cuello (220.132.35.216), 10/24/2018 02:03:00