→ 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