Обычно хорошей стратегией, особенно для пользователей с правами администратора, является псевдоним команды rm на rm -i, что требует подтверждения.
поместите его в свой .bashrc
alias rm='rm -i'
Большую часть этой информации можно получить из/sys
:
1а./sys/class/net/
:список сетевых устройств, включая все типы
1б./sys/devices/virtual/net/
:список виртуальных сетевых устройств :включает lo
, туннели, veth, мосты... поэтому, если это первое, а не это, оно должно быть физическим.
если устройство является драйвером )современного беспроводного устройства (, оно будет иметь запись /sys/class/net/<device>/phy82011/name
, например:
$ grep -s --with-filename '' /sys/class/net/*/phy80211/name
/sys/class/net/wlan0/phy80211/name:phy0
/sys/class/net/wlan1/phy80211/name:phy1
/sys/class/net/wlan2/phy80211/name:phy2
Таким образом, запустив соответствующий скрипт из среды udev
и сравнив с этими каталогами и файлами из /sys
, вы получите всю необходимую информацию для этого.
В качестве примечания:если позже для работы на этих устройствах вы измените только сеть пространство имен (, например, с использованием nsenter --net=/var/run/netns/physical
), /sys
по-прежнему будет находиться в пространстве имен хоста mount , и не будет отражать появление этих устройств, а будет показывать их отсутствие. Использование ip netns exec physical command
нормально, оно изменяет пространство имен монтирования и перемонтирует /sys
для вас.
Основываясь на ответе А.Б., я вывел следующее правило:
SUBSYSTEM=="net", ACTION=="add", DEVPATH!="/devices/virtual/*", TAG+="systemd", ENV{SYSTEMD_WANTS}="physical-namespace@.service"
DEVPATH!="/devices/virtual/*
— ключ к захвату только физических устройств. physical-namespace@.service
— это одноразовая служба, которая перемещает интерфейс в нужное пространство имен(physical
):
[Unit]
Description=Move interface to physical namespace
Requires=netns@physical.service
After=netns@physical.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/move-netif %I physical
(netns@.service
просто создает сетевое пространство имен с заданным именем.)
Наконец, move-netif
отвечает за определение того, как перемещать интерфейс:
#!/bin/bash
devpath="$1"
target_ns="$2"
if [[ -e "$devpath/phy80211" ]]; then
phy="$(basename "$(readlink "$devpath/phy80211")")"
iw phy "$phy" set netns name "$target_ns"
else
ifname="$(basename "$devpath")"
ip link set "$ifname" netns "$target_ns"
fi