Loopback接口的配置过程
前篇分析了给本机系统配置IP地址的过程,本篇介绍一下loopback接口的“配置”过程,之所以用引号,是因为此配置不完全是用户自己控制的,为什么不先介绍loopback的配置,原因也在此。上篇我们已经对配置的过程一步一步做了分解,那么我们可以一下子来了解loopback接口的初始化及配置过程,这也是对普通设备的初始化和配置过程的一个回顾。
要使Loopback接口起作用得分为2个步骤:
第一步是在系统初始化的时候就创建一个in_dev{}
结构给loopback接口,参照前篇,对于用户配置普通设备的IP地址,这个动作应该是在ioctl->...... ->inet_set_ifa
函数中完成。这是两种不同设备的配置上的区别:loopback设备是自动创建,而普通设备是“用户”手动创建。
而其这种自动还转了一道手,它实际是在ip_netdev_notifier
收到NETDEV_REGISTER
事件后才去调用inetdev_init
创建了in_dev{}
结构,此函数请参考前篇。而普通设备则是在ioctl的上下文中调用inet_set_ifa
函数创建的。
第二个步骤就是当系统初始化结束之后根据系统配置打开loopback接口,使之UP。如同普通设备的操作,系统必须调用dev_open
打开looback接口,从而发送NETDEV_UP
事件给ip_netdev_notifier
。这个notifier对于普通设备的事件还是不是太感兴趣,啥也不做;但是非常关心loopback接口的UP事件,它创建了in_ifaddr{}
结构。这有是loopback接口配置自动化的证明了。ip_netdev_notifier
的事件处理函数是inetdev_event
,其相关代码如下:
inetdev_event
{
......
case NETDEV_UP:
if (dev == &loopback_dev) {
struct in_ifaddr *ifa;
if ((ifa = inet_alloc_ifa()) != NULL) {
/*这里面每个赋值都很重要,直接决定loopback的性质 INADDR_LOOPBACK宏就是0x7f000001-- 127.0.0.1 */
ifa->ifa_local = ifa->ifa_address = htonl(INADDR_LOOPBACK);
ifa->ifa_prefixlen = 8;
ifa->ifa_mask = inet_make_mask(8);
ifa->ifa_dev = in_dev;
/*该地址是属于本机范围的,不属于外部地址,我们会在后面说到这个值*/
ifa->ifa_scope = RT_SCOPE_HOST;
memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
inet_insert_ifa(ifa);
}
}
......
}
值得关注的是这段代码又调用了inet_insert_ifa
函数,它发送NETDEV_UP
事件给fib_inetaddr_notifier
。
是否loopback设备的配置可以改变?可以的!让我们跑到Linux的/etc/sysconfig/ network目录下(目前是Redhat,其它版本的Linux不一定是此目录,但都大同小异),看到有ifcfg-lo
这么一个文件,内容如下:
DEVICE=lo
IPADDR=127.0.0.1 #可以改变这个IP地址
NETMASK=255.0.0.0
NETWORK=127.0.0.0
......
BROADCAST=127.255.255.255
NAME=loopback
你可以改动这个文件里的某些项,然后执行#ifup