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