看板 Linux 關於我們 聯絡資訊
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
mmis1000: 你可能可以找找看 linux namesapce 相關資訊? 10/16 01:41
※ 編輯: cuello (220.132.35.216), 10/16/2018 02:10:59
cuello: 如何開始?拜托提示一下 10/16 02:13
cuello: 對不起,正在看 namespace 的 wiki. . . 10/16 02:38
cuello: 所以,systemd-udevd 用自己的 namespace, 外面看不到 10/16 04:53
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
ChakraLinux: 前面兩步其實可以用 systemctl edit systemd-udevd 10/17 12:41
ChakraLinux: 取代,這樣他會自己開一個vim給裡寫override 10/17 12:41
cuello: 曾試過,但它給我一個不認識的 editor 10/17 15:14
cuello: 說也奇怪,我的 EDITOR 我設為 vim 說 10/17 15:15
cuello: 有,我有 export,剛剛查了一下 .bashrc 10/17 15:20
brli7848: 因為systemctl是用VISUAL這個變數,預設是vi 10/17 16:47
cuello: 喔,多謝! :) 10/17 17:37
cuello: 糟糕,不對不對,我的 VISUAL 也是 vim ! 10/18 05:54
cuello: 不然的話,實在應該用它自己提供的 edit 功能, 10/18 05:57
cuello: 否則,不知哪一天他們心血來潮。。。。 10/18 05:58
ChakraLinux: 看文件有另外的變數,忘了是啥了,反正nano好用 10/18 18:05
cuello: 文件跟行為不一樣,SYSTEMD_EDITOR 沒設它應該用 EDITOR 10/18 22:18
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