[問題] mount -o uid=m,gid=n 的狀況 [已解決]

看板Linux作者 (cuello)時間7年前 (2018/10/15 23:19), 7年前編輯推噓1(1017)
留言18則, 4人參與, 7年前最新討論串1/1
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
你可能可以找找看 linux namesapce 相關資訊?
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
對不起,正在看 namespace 的 wiki. . .
10/16 02:38, 3F

10/16 04:53, 7年前 , 4F
所以,systemd-udevd 用自己的 namespace, 外面看不到
10/16 04:53, 4F

10/16 04:55, 7年前 , 5F
現在問題就剩,怎麼 mount 才可 propagate 出去...
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
前面兩步其實可以用 systemctl edit systemd-udevd
10/17 12:41, 6F

10/17 12:41, 7年前 , 7F
取代,這樣他會自己開一個vim給裡寫override
10/17 12:41, 7F

10/17 15:14, 7年前 , 8F
曾試過,但它給我一個不認識的 editor
10/17 15:14, 8F

10/17 15:15, 7年前 , 9F
說也奇怪,我的 EDITOR 我設為 vim 說
10/17 15:15, 9F

10/17 15:20, 7年前 , 10F
有,我有 export,剛剛查了一下 .bashrc
10/17 15:20, 10F

10/17 16:47, 7年前 , 11F
因為systemctl是用VISUAL這個變數,預設是vi
10/17 16:47, 11F

10/17 17:37, 7年前 , 12F
喔,多謝! :)
10/17 17:37, 12F

10/18 05:54, 7年前 , 13F
糟糕,不對不對,我的 VISUAL 也是 vim !
10/18 05:54, 13F

10/18 05:57, 7年前 , 14F
不然的話,實在應該用它自己提供的 edit 功能,
10/18 05:57, 14F

10/18 05:58, 7年前 , 15F
否則,不知哪一天他們心血來潮。。。。
10/18 05:58, 15F

10/18 18:05, 7年前 , 16F
看文件有另外的變數,忘了是啥了,反正nano好用
10/18 18:05, 16F

10/18 22:18, 7年前 , 17F
文件跟行為不一樣,SYSTEMD_EDITOR 沒設它應該用 EDITOR
10/18 22:18, 17F

10/18 22:19, 7年前 , 18F
不過,真得應該要用 systemctl edit systemd-udevd 才安全
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
文章代碼(AID): #1RnA_bXo (Linux)
文章代碼(AID): #1RnA_bXo (Linux)