Назад | Перейти на главную страницу

systemd: как выборочно отключить wpa_supplicant для определенного интерфейса WLAN?

В системе Linux с systemd и networkd Мне необходимо управлять точкой доступа WLAN на одном интерфейсе WLAN, а в дальнейшем (горячее подключение) интерфейсы WLAN работать в обычном режиме станции («клиент»).

Как оказывается, wpa_supplicant.service работает на всех моих интерфейсах WLAN, и это было бы хорошо, если бы все эти интерфейсы WLAN работали в режиме «станция / клиент». Однако пока wpa_supplicant.service обслуживает интерфейс WLAN, невозможно (больше?) hostapd.service работает с этим интерфейсом WLAN в режиме точки доступа AP.

Итак, я хочу отключить wpa_supplicant.service только для определенного интерфейса, скажем wls35u2. Моя идея заключалась в том, чтобы иметь wpa_supplicant@wls35u2.service блок, который я могу выборочно отключить, но оставить wpa_supplicant.service включен. Однако, похоже, это не работает или я что-то делаю не так в wpa_supplicant@wls35u2.service.

Итак, как я могу отключить службу запроса WPA только на определенном интерфейсе, не отключая ее глобально?

Используйте параметр «nohook wpa_supplicant» в /etc/dhcpcd.conf. Если вам не нужен wpa_supplicant для wlan0, это будет:

interface wlan0
        nohook wpa_supplicant

У меня такая же проблема. @Nproject нашел хорошее решение. Но вам не нужно изменять каждую из этих процедур. Просто перейдите в конец упомянутого файла Nproject (/lib/dhcpcd/dhcpcd-hooks/10-wpa_supplicant) и измените следующее предложение if:

ОРИГИНАЛ

if [ "$ifwireless" = "1" ] && \
    type wpa_supplicant >/dev/null 2>&1 && \
    type wpa_cli >/dev/null 2>&1
then
        case "$reason" in
        PREINIT)        wpa_supplicant_start;;
        RECONFIGURE)    wpa_supplicant_reconfigure;;
        DEPARTED)       wpa_supplicant_stop;;
        esac
fi

Добавить [ "$interface" != "TheInterfaceWPASupplicantShouldBeDisabledOn" ] в этом случае:

ИЗМЕНЕНО

if [ "$ifwireless" = "1" ] && [ "$interface" != "TheInterfaceWPASupplicantShouldBeDisabledOn" ]  && \
    type wpa_supplicant >/dev/null 2>&1 && \
    type wpa_cli >/dev/null 2>&1
then
        case "$reason" in
        PREINIT)        wpa_supplicant_start;;
        RECONFIGURE)    wpa_supplicant_reconfigure;;
        DEPARTED)       wpa_supplicant_stop;;
        esac
fi

Кроме того, это предотвратит отображение этого интерфейса в Network Manager (GUI) на панели задач.

[РЕДАКТИРОВАТЬ: посмотрите ответ @rweisse, чтобы узнать, как это лучше сделать]

У меня была такая же проблема на моем raspberry pi.

Я обнаружил, что оба wpa_supplicant @ wlan0 и wpa_supplicant @ wlan1 (У меня есть два интерфейса wlan) и wpa_supplicant.service были отключены.

Мне удалось найти (по крайней мере, на raspbian, я не знаю, как в других выпусках debian), что dhcpcd отвечает за запуск wpa_supplicant.

Под / lib / dhcpcd / dhcpcd-крючки, есть файл с именем "10-WPA-запросчик", в котором вы можете найти процедуры запуска / перенастройки / остановки для wpa_supplicant.

В этом файле я просто добавил условие на $ интерфейс в процессе. Для каждой PROCEDURE_NAME (запуск / остановка / перенастройка):

PROCEDURE_NAME( )
    if [ "$interface" != "TheInterfaceWPASupplicantShouldBeDisabledOn" ] then
        Code of the prodecure
    else
        return 0
    fi

После этого я перезапустил службу dhcpcd с помощью

systemctl restart dhcpcd

Теперь InterfaceWPASupplicantShouldBeDisabledOn больше не является проблемой при использовании hostapd. Это решение довольно жесткое, так как я не думаю, что это должно быть сделано так, но я не смог найти никакого руководства о том, как это сделать по-другому.

Надеюсь это поможет.