1

Я использую эту команду ifconfig для установки IP на сетевом интерфейсе

ifconfig eth0 x.x.x.x netmask x.x.x.x mtu 1400

Теперь они говорят, что ifconfig устарела, и я должен использовать iproute2. Я преобразовал эту команду в две команды:

ip addr add x.x.x.x/24 dev eth0
ip link set mtu 1400 dev eth0

Как я могу объединить оба в одну команду?

1 ответ1

2

Короткий ответ: вы не можете, если вы не заключите его в функцию оболочки. Версия для бедного человека:

function ifaddrmtu() {
    # Call: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254
    #   or: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254 1400
    local label=$1
    local ip=$2
    local mask=$3
    local mtu=$4
    sudo ip addr add $ip/$mask brd + dev ${label%:*} label $label
    [ ! -z $mtu ] && sudo ip link set mtu $mtu dev $label
}

Теперь, если вы действительно хотите отобразить старое поведение ifconfig на iproute2 , вы должны написать синтаксический анализатор, который отображает синтаксис и семантику ifconfig в iproute2 . Чуть более десяти лет назад я написал такую лучшую оболочку для компании, в которой я работал. Если вам это нужно, я могу попробовать выкопать его с одного из моих старых жестких дисков. Это было довольно опрятно и также имело более удобные способы показа таблиц маршрутизации и их записей.

Более подробный ответ: использование инфраструктуры iproute2 добавление IP-адреса и настройка mtu устройства - это две разные вещи с точки зрения ядра. Хотя ifconfig использует связь ioctl в старом стиле для изменения конфигурации в сетевом стеке ядра (ядро впоследствии выполняет всю работу, вызывая различные функции для добавления IP-адреса и установки mtu), iproute2 использует инфраструктуру обмена сообщениями netlink для связи с сетевой стек.

Лучше всего это увидеть, используя strace (отрывок из моей Linux VM):

# ip addr del 1.1.1.1/32 dev eth4

# strace -e ioctl ifconfig eth4:new 1.1.1.1 netmask 255.255.255.255 mtu 1400
ioctl(4, SIOCSIFADDR, {ifr_name="eth4:new", ifr_addr={AF_INET, inet_addr("1.1.1.1")}}) = 0
ioctl(4, SIOCGIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFNETMASK, {ifr_name="eth4:new", ifr_netmask={AF_INET, inet_addr("255.255.255.255")}}) = 0
ioctl(4, SIOCSIFMTU, {ifr_name="eth4:new", ifr_mtu=1400}) = 0

# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000
    inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
    inet 1.1.1.1/32 scope global eth4:new

# ip addr del 1.1.1.1/32 dev eth4                                          

# strace -e "send,sendmsg,recvmsg" ip addr add 1.1.1.1/32 dev eth4 label eth4:new
send(3, "\24\0\0\0\22\0\1\3\206\35\31R\0\0\0\0\0\0\0\0", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\340\3\0\0\20\0\2\0\206\35\31R\257\10\0\0\0\0\4\3\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\206\35\31R\257\10\0\0\0\0\0\0\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"8\0\0\0\24\0\5\6\207\35\31R\0\0\0\0\2 \0\0\2\0\0\0\10\0\2\0\1\1\1\1"..., 56}], msg_controllen=0, msg_flags=0}, 0) = 56
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$\0\0\0\2\0\0\0\207\35\31R\257\10\0\0\0\0\0\0008\0\0\0\24\0\5\6\207\35\31R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36                       = ?

# strace -e "send,sendmsg,recvmsg" ip link set mtu 1420 dev eth4
send(3, " \0\0\0\20\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 32, 0) = 32
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"4\0\0\0\2\0\0\0\0\0\0\0\250\10\0\0\355\377\377\377 \0\0\0\20\0\5\0\0\0\0\0"..., 8192}], msg_controllen=0, msg_flags=0}, 0) = 52
send(3, "\24\0\0\0\22\0\1\3;\35\31R\0\0\0\0\0\0\0\0", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\340\3\0\0\20\0\2\0;\35\31R\250\10\0\0\0\0\4\3\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0;\35\31R\250\10\0\0\0\0\0\0\1\0\0\0I\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"(\0\0\0\20\0\5\0<\35\31R\0\0\0\0\0\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0"..., 40}], msg_controllen=0, msg_flags=0}, 0) = 40
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$\0\0\0\2\0\0\0<\35\31R\250\10\0\0\0\0\0\0(\0\0\0\20\0\5\0<\35\31R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36

# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1420 qdisc pfifo_fast state UP qlen 1000
    inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
    inet 1.1.1.1/32 scope global eth4:new

Конечно, есть и другие причины, по которым IP-адрес и настройка mtu для записи устройства - это две разные вещи. Скажем так, что IP-адреса на самом деле не принадлежат интерфейсам, как это предлагает ifconfig . Имя - это просто метка, используемая в качестве имени интерфейса, к которому базовая информационная база (FIB) использует для поиска / фильтрации и маршрутизации пакетов. Ядро с точки зрения обработки пакетов вполне может жить без имени устройства.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .