[問題] mount -o uid=m,gid=n 的狀況 [已解決]
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://www.ptt.cc/bbs/Linux/M.1539616741.A.872.html
→
10/16 01:41,
7年前
, 1F
10/16 01:41, 1F
※ 編輯: cuello (220.132.35.216), 10/16/2018 02:10:59
→
10/16 02:13,
7年前
, 2F
10/16 02:13, 2F
→
10/16 02:38,
7年前
, 3F
10/16 02:38, 3F
→
10/16 04:53,
7年前
, 4F
10/16 04:53, 4F
→
10/16 04:55,
7年前
, 5F
10/16 04:55, 5F
這個問題已暫時解決,這裡大致報告一下,感謝 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
→
10/17 12:41,
7年前
, 6F
10/17 12:41, 6F
→
10/17 12:41,
7年前
, 7F
10/17 12:41, 7F
→
10/17 15:14,
7年前
, 8F
10/17 15:14, 8F
→
10/17 15:15,
7年前
, 9F
10/17 15:15, 9F
→
10/17 15:20,
7年前
, 10F
10/17 15:20, 10F
推
10/17 16:47,
7年前
, 11F
10/17 16:47, 11F
→
10/17 17:37,
7年前
, 12F
10/17 17:37, 12F
→
10/18 05:54,
7年前
, 13F
10/18 05:54, 13F
→
10/18 05:57,
7年前
, 14F
10/18 05:57, 14F
→
10/18 05:58,
7年前
, 15F
10/18 05:58, 15F
→
10/18 18:05,
7年前
, 16F
10/18 18:05, 16F
→
10/18 22:18,
7年前
, 17F
10/18 22:18, 17F
→
10/18 22:19,
7年前
, 18F
10/18 22:19, 18F
[後記 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
Linux 近期熱門文章
21
56
PTT數位生活區 即時熱門文章