Systemctl
兩個介面上的 hostapd(兩個配置文件)
我有兩個無線介面,我想在每個介面上執行不同的 AP。(兩種硬體都不支持多個 SSID。)
我有
.conf
每個介面的文件。如何hostapd
自動使用它們?這工作正常:
# hostapd -dd /etd/hostapd/hostapd.wlan0.conf /etc/hostapd/hostapd.wlan1.conf
問題是讓它自動工作。
一項主張是
/etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.wlan0.conf /etc/hostapd/hostapd.wlan1.conf"
但這不起作用,因為整個字元串被解釋為一個文件——它不存在。
我看到這是被
/usr/lib/systemd/system/hostapd.service
用作ExecStart=/usr/sbin/hostapd -B -P /run/hostapd.pid -B $DAEMON_OPTS ${DAEMON_CONF}
但是,我也看到了一些叫做的東西
/usr/lib/systemd/system/hostapd@.service
,它做了一些不同的事情:ExecStart=/usr/sbin/hostapd -B -P /run/hostapd.%i.pid $DAEMON_OPTS /etc/hostapd/%i.conf
(什麼
%i
意思?)然而,systemctl
似乎只知道關於hostapd
而不是關於hostapd@
。
在問題結束時,您幾乎就在那裡。
%i
用於實例化服務。以下是systemd.unit(5)中描述的實例角色的摘錄:單元文件可以通過稱為“實例名稱”的單個參數進行參數化。然後基於“模板文件”建構該單元,該“模板文件”用作多個服務或其他單元的定義。模板單元的名稱末尾必須有一個“@”(就在類型後綴之前)。通過在“@”和單元類型後綴之間插入實例名稱來形成完整單元的名稱。在單元文件本身中,可以使用“%i”和其他說明符來引用實例參數,見下文。
或在說明符列表中:
├─────────┼───────────────┼───────────────────────────────────────────────────┤ │ │ │For instantiated units this is the string between │ │"%i" │Instance name │the first "@" character and the type suffix. Empty │ │ │ │for non-instantiated units. │ ├─────────┼───────────────┼───────────────────────────────────────────────────┤
使用實例化服務將為每個介面執行一個獨立的hostapd守護程序。例如,這允許在保證另一個實例的情況下更改或終止一個實例,因此另一個介面不會受到影響。
您可以這樣做以使用實例:
- 到處恢復預設設置並禁用和停止
hostapd.service
- 重命名您的配置以適應未修改的hostapd實例化服務,該服務
%i.conf
只需要介面名稱後跟.conf
:mv -i /etd/hostapd/hostapd.wlan0.conf /etd/hostapd/wlan0.conf mv -i /etd/hostapd/hostapd.wlan1.conf /etd/hostapd/wlan1.conf
- 使用hostapd 服務的實例
@
化版本,以字元區分,並且其配置與已在 OP 中編寫的普通實例不同。每個介面一次:systemctl enable --now hostapd@wlan0 systemctl enable --now hostapd@wlan1
最後,守護程序將執行兩次:
/usr/sbin/hostapd -B -P /run/hostapd.wlan0.pid /etc/hostapd/wlan0.conf /usr/sbin/hostapd -B -P /run/hostapd.wlan1.pid /etc/hostapd/wlan1.conf
(除非有什麼東西
$DAEMON_OPTS
)。