把 Arch Linux 轉用 Systemd

老實說,我覺得把原本可以用 /etc/rc.conf 一檔解決諸多設定,改為要分散到好幾個設定檔,有點被打 KISS principle 的巴掌,特別是我在不久前的 COSCUP BoF 還大吹大擂。不過,既然官方「鼓勵」快點轉移,我也就一點一滴地照著 Wiki 說明轉換。

轉用 Systemd 也不盡然這麼讓我為難與厭惡,至少帶來的加速開機效果是很顯著的,這是因為 Systemd 採用並列式(同時跑多個)、條件式(需要時才跑)啟用各項系統服務的關係。

也因此,以往有些東西在 Sysvinit 一項接一項前後相依輪流跑的方式下,是保證可以正常執行的,而改用 Systemd 之後就不一定了,像是我會為 ThinkPad 的 TrackPoint 調整一些自訂參數,寫在 /etc/rc.local 裡跑,就未如預期在 Systemd 底下跑,所以改用 udev 寫 rules 來控制:

KERNEL=="serio2", SUBSYSTEM=="serio", DRIVERS=="psmouse", WAIT_FOR="/sys/devices/platform/i8042/serio1/serio2/sensitivity", ATTR{sensitivity}="170", ATTR{speed}="185", ATTR{press_to_select}="1", ATTR{thresh}="6"

一不做二不休,把一樣寫在 /etc/rc.local 的 ThinkPad SMAPI 電池充電閾值設定改用 udev,至此,我的 /etc/rc.local 就可以清空了:

SUBSYSTEM=="platform", DRIVERS=="smapi", RUN+="/bin/sh -c 'echo 30 > /sys/devices/platform/smapi/BAT0/start_charge_thresh'"
SUBSYSTEM=="platform", DRIVERS=="smapi", RUN+="/bin/sh -c 'echo 85 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh'"

還有,我有使用 Miredo 來取得 IPv6 address,在 Systemd 環境下也會因為 NetworkManager 太晚建立有效網路組態而啟動失敗,為此,我必須對 /usr/lib/systemd/system/miredo.service 做個小小修改(放在 /etc/systemd/system/ 底下間接覆寫),加上 Restart 與 RestartSec,讓這項 service 能夠自動重試啟動:

[Unit]
Description=Teredo IPv6 Tunneling Daemon
After=network.target

[Service]
ExecStartPre=/usr/sbin/miredo-checkconf /etc/miredo/miredo.conf
ExecStart=/usr/sbin/miredo -f
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=16

[Install]
WantedBy=multi-user.target

照著  Wiki 做,直到 /usr/bin/journalctl (Systemd 底下類比 dmesg 的程式)的 log 裡看不到明顯的紅字錯誤,大概就差不多搞定了。

CC BY-SA 4.0 This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Leave a Reply

Your email address will not be published. Required fields are marked *