两个接口上的hostapd(两个配置文件)

两个接口上的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.serviceas使用的

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

看起来像是一种令人不快的黑客行为,但它确实有效。

相关内容