Fw: [BBS ] 給 Maple 用的 systemd service 檔

作者: holishing   2021-05-25 23:40:49
※ [本文轉錄自 holishing 信箱]
作者: [email protected] ([email protected])
標題: [BBS ] 給 Maple 用的 systemd service 檔
時間: Tue May 25 23:38:36 2021
作者: lantw44 ([=============>]) 看板: lantw44
標題: [BBS ] 給 Maple 用的 systemd service 檔
時間: Fri Nov 10 20:30:37 2017
這篇文可能很接近廢文…… 因為要寫一個 systemd service 檔實在太容易了,跟以往
許多系統使用的 init script 相比真的簡單太多了。也許是因為以前寫 init script
很麻煩,所以當時的教學文件都是直接改 /etc/rc.local 吧。
其實會有這個需求是因為以前我常把資料放在 BBS 上,為了避免電力維修造成停電,
或是很不幸的系統當機,還是我到了沒有網路可用的地方,想要找資料找不到,所以
會有個習慣是每隔一段時間就會把個板備份下來,這樣才能離線使用。
我知道備份下來的 .tar.gz.uue 檔解開以後就可以用 less -R 閱讀,用 grep 搜尋,
但這總是不方便。在找不到適合的閱讀程式的情況下,最好的解法似乎是直接在筆電上
架一個 BBS,一個只有 bbsd 而無寄信、轉信、網頁功能的簡單系統。由於我不會每次
開機都需要用到本機的 BBS,所以當然就不會寫進 /etc/rc.local,需要手動啟動。
雖然說手動啟動其實也還蠻容易的,但是現在既然有 systemd 可以幫我管理 process,
那就來寫個 service 檔方便開關吧。同時這也附帶一個好處是,我可以確保執行環境
很乾淨,也可以讓它脫離目前登入的 session。這裡指的是 systemd 用 cgroup 弄出
來的 session 而不是傳統 Unix 的 session,後者只要 setsid 一下就能脫離了。
於是我弄了兩個 service 檔丟進 /etc/systemd/system:
maplebbs.service 就是用來跑 bbsd 的,很直觀。
maplebbs-ipc.service 是用來跑 camera 和 account 還有事後清理 shm 和 sem 的。
下面就是檔案內容了,有點算是發個文當備份吧。
# maplebbs.service
[Unit]
Description=MapleBBS Daemon
Requires=maplebbs-ipc.service
[Service]
Type=forking
PrivateTmp=yes
PrivateDevices=yes
ProtectSystem=full
ExecStart=/home/bbs/bin/bbsd
[Install]
WantedBy=multi-user.target
# maplebbs-ipc.service
[Unit]
Description=MapleBBS IPC Setup
[Service]
User=bbs
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/bbs/bin/camera
ExecStart=/home/bbs/bin/account
ExecStop=-/usr/bin/ipcrm -M 2999
ExecStop=-/usr/bin/ipcrm -M 2997
ExecStop=-/usr/bin/ipcrm -M 1998
ExecStop=-/usr/bin/ipcrm -M 4998
ExecStop=-/usr/bin/ipcrm -S 2000
[Install]
WantedBy=multi-user.target
說起來真的沒什麼特別的,後面 ipcrm 接的數字可以在 src/include/config.h 找到。
systemctl daemon-reload 以後執行 systemctl start maplebbs 就能啟動了。
不過事情真的有這麼簡單嗎?如果你的系統沒有 SELinux 或其他類似安全機制的話可能
真的這樣就完成了吧。但我的系統上是用 SELinux 的 targeted policy,這代表一般日
常操作大多不受限,而系統服務就有比較多的限制,例如不可以存取家目錄之類的。
事實上日常操作還是有些程式,像是瀏覽器的 Java 和 Flash 外掛會受 SELinux 限制,
用來避免網頁利用外掛程式任意讀寫家目錄,應該是個還不錯的安全功能吧。
於是各種教學文件教大家把 BBS 裝在 /home/bbs 就出問題了。預設情況下系統服務根
本沒辦法進 /home 裡面的子目錄,所以不論是 camera、account、bbsd 都直接收 EXEC
失敗無法啟動。
我很偷懶的沒去看怎麼自製一個 selinux module,所以就把原本家目錄的 user_home_t
和 bin 資料夾的 home_bin_t 都 relabel 掉了。有個很簡單的解法就是參考 /usr/bin
和 /srv 使用的 type,設定成跟它們一樣就行了。
於是
semanage fcontext -a -s system_u -t bin_t -f d '/home/bbs/bin'
semanage fcontext -a -s system_u -t bin_t -f f '/home/bbs/bin/[^/]+'
semanage fcontext -a -s system_u -t var_t \
'/home/bbs/(\.BRD|\.USR|bak|brd|etc|gem|innd|log|run|tmp|usr)(/.*)?'
接著再
restorecon -FR /home/bbs
就完成了。可以 systemctl start maplebbs 了。
有個小問題是 systemctl stop maplebbs 的時候 maplebbs-ipc 不會跟著關,所以要記
得執行 systemctl stop maplebbs-ipc 才會把 shm 和 sem 都清掉。
該說我覺得後面 SELinux 這段其實比前面的 systemd service 檔還重要嗎……

Links booklink

Contact Us: admin [ a t ] ucptt.com