Systemctl

兩個介面上的 hostapd(兩個配置文件)

  • October 3, 2021

我有兩個無線介面,我想在每個介面上執行不同的 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)。

引用自:https://unix.stackexchange.com/questions/618635