Автоматически перемещает физические сетевые интерфейсы на пространство имен

Обычно хорошей стратегией, особенно для пользователей с правами администратора, является псевдоним команды rm на rm -i, что требует подтверждения.

поместите его в свой .bashrc

alias rm='rm -i'
3
02.08.2018, 11:48
2 ответа

Большую часть этой информации можно получить из/sys:

1а./sys/class/net/:список сетевых устройств, включая все типы

1б./sys/devices/virtual/net/:список виртуальных сетевых устройств :включает lo, туннели, veth, мосты... поэтому, если это первое, а не это, оно должно быть физическим.

  1. если устройство является драйвером )современного беспроводного устройства (, оно будет иметь запись /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для вас.

3
27.01.2020, 21:12

Основываясь на ответе А.Б., я вывел следующее правило:

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
4
27.01.2020, 21:12

Теги

Похожие вопросы