我有两个无线接口,我想在每个接口上运行不同的 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
as使用的
ExecStart=/usr/sbin/hostapd -B -P /run/hostapd.pid -B $DAEMON_OPTS ${DAEMON_CONF}
然而,我也看到了一些叫做的东西,它做了不同的事情:/usr/lib/systemd/system/[email protected]
ExecStart=/usr/sbin/hostapd -B -P /run/hostapd.%i.pid $DAEMON_OPTS /etc/hostapd/%i.conf
(什么%i
意思?)然而,systemctl
似乎只知道hostapd
而不是关于hostapd@
。
答案1
你几乎已经到了问题的结尾了。%i
是用来我实例化的服务。以下是中描述的实例角色的摘录系统单元(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.service
重命名您的配置以适应未修改的主机实例化服务只需要
%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
)。
答案2
我已编辑/usr/lib/systemd/system/hostapd.service
对这两个配置文件进行硬编码。
编辑后似乎需要运行
# systemctl daemon-reload
看起来像是一种令人不快的黑客行为,但它确实有效。