我正在使用此 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
简短回答:你不能,除非你把它包装成一个 shell 函数。一个穷人的版本:
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
。十多年前,我为一家我工作过的公司用 shell 编写了这样一个 biest。如果您需要它,我可以尝试从我的一个旧硬盘中找出它。它非常简洁,还提供了更用户友好的方式来显示路由表及其条目。
更详细的答案: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) 使用它来查找/过滤和路由数据包。从数据包处理的角度来看,内核完全可以不使用设备名称。