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

看板Maple (BBS架站)作者 ( )時間3年前 (2021/05/25 23:40), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 holishing 信箱] 作者: holishing.bbs@ptt2.cc (holishing.bbs@ptt2.cc) 標題: [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 檔還重要嗎…… -- ※ 發信站: 批踢踢兔(ptt2.cc), 來自: 140.112.30.70 r2 :想到 pttbbs 後來直接弄 shmctl 在 ~/bin/ 底下... 1112 02:25 → lantw44 :感覺如果要認真把每個服務都寫成 systemd service 檔, 1112 20:33 → lantw44 :應該檔案會非常多,也許會像是 nfs 那種數量 1112 20:33 → r2 :OAOrz 1112 21:15 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: holishing (140.116.246.190 臺灣), 05/25/2021 23:40:49
文章代碼(AID): #1WhHg26m (Maple)
文章代碼(AID): #1WhHg26m (Maple)