声明: 本手册已经被新版本代替了,不再被维护。

2. 高级配置

内容:

2.a. 高级配置

config_eth0变量是一个网络接口配置的核心。它包含了一组用来配置接口的高级指令列表(我们用eth0作为示例)。指令列表中的每一条命令都是顺序执行的。该列表中只要至少有一条命令正常工作,则这个网络接口就被认为是可以使用的。

这里列出了一些可用的指令。

命令 描述
null 不做任何事
noop 如果网络接口已经开启并且也绑定好地址的话,则中止配置过程,配置成功。
一个IPv4或是IPv6的地址 绑定地址到接口上
dhcpadslapipa(或者一个第三方模块提供的自定义命令) 运行提供这些命令的模块,例如dhcp这个命令会运行一个提供DHCP功能的模块,它可能是dhcpcddhclient或者pump中的一个。

如果一条命令执行失败,你可以指定一条fallback指令。这条fallback指令必须完全符合配置的结构。

你可以连在一起使用这些指令,下面是一些真实应用的例子。

代码 1.1: 配置示例

# 加上三个IPv4的地址
config_eth0=(
  "192.168.0.2/24"
  "192.168.0.3/24"
  "192.168.0.4/24"
)

# 加上一个IPv4的地址和两个IPv6的地址
config_eth0=(
  "192.168.0.2/24"
  "4321:0:1:2:3:4:567:89ab"
  "4321:0:1:2:3:4:567:89ac"
)

# 保持使用内核分配的地址,除非网络接口没有启动。如果是这样则改用DHCP获
#取。如果DHCP失败的话则由APIPA指定一个网络地址。
config_eth0=(
  "noop"
  "dhcp"
)
fallback_eth0=(
  "null"
  "apipa"
)

注意: 当你使用的是ifconfig模块并且绑定了一个以上的网络地址,系统会为每一个网络地址建立一个别名。在上面的两个例子中你将会得到这几个网络接口:eth0eth0:1eth0:2。由于内核和其他程序会把eth0:1eth0:2看作eth0,所以你将无法对这些接口做什么特殊的事情。

重要: fallback中的顺序相当重要!如果我们没有指定null选项,那么apipa只会在noop命令失败后才会执行。

注意: APIPADHCP稍后会讨论。

2.b. 网络依赖性

/etc/init.d中的初始化脚本可能依赖于某个特定的网络接口或只是net服务。可以通过定义在/etc/conf.d/rc中的RC_NET_STRICT_CHKING这个变量,来使net代表不同的意思。

描述
none 系统始终认为net服务已经启动了
no 这是说除了net.lo之外,至少还需要再启动一个net.*服务。同时拥有WIFI网络和静态NIC网络的笔记本用户可使用这个值。对他们来说某一时间只要有一个网络接口启动,那么net服务就应被视为启动了。
lo 这和no选项相同,不过就是把net.lo也考虑在内了。它对那些不怎么在意在系统启动时哪个网络接口会被启动的用户很有用。
yes 所有的网络接口都启动后,net服务才算启动。

可是需要依赖net.eth0net.eth1net.br0应该怎么处理呢?net.eth1可能是一个无线网络或是一个PPP设备,且需要在桥接前先设定好。这不能在/etc/init.d/net.br0中定义,因为它只是一个到net.lo的符号连接。

答案是在/etc/conf.d/net里定义一个自己的depend()函数。

代码 2.1: /etc/conf.d/net中net.br0的依赖关系

# 你可以使用目前脚本里能用的任何依赖关系(use、after、before)
depend_br0() {
  need net.eth0 net.eth1
}

要获得更多关于依赖性的讨论。请参考Gentoo手册中的这一节撰写初始化脚本

2.c. 变量名称和值

变量的名称是动态的,它们通常的结构是variable_${interface|mac|essid|apmac}。例如dhcpcd_eth0变量代表eth0的dhcpcd命令参数。而dhcpcd_essid变量代表连接到ESSID为"essid"的AP的网络接口的dhcpcd命令参数。

不过,没有什么强制性的和快速的标准规定了网络接口名称必须是ethx。事实上,许多无线网络接口除了使用ethx之外,也会使用类似于wlanx、rax之类的名称。而且一些用户自定义的网络接口(比如网桥接口)可以被命名为任何名字(比如foo)。更有趣的是,无线网络接入点可以在ESSID中使用非英文字符或数字字符——这一点很重要,因为你可以为每一个ESSID设定网络参数。

不幸的是Gentoo在网络设定方面使用的是bash的变量名——而bash不能使用数字、英文字母之外的任何字符。为了突破这样的一个限制,我们把所有除数字、英文字母之外的字符用_字符表示。

bash的另一个问题是变量的内容——一些字符需要转义。这可以通过在需要转义的字符前面加\来解决。下面列出的是需要转义的字符列表:"'\

在这个例子中,我们使用无线网络ESSID,因为它可以包含的字符范围最广。我们使用My "\ NET这个ESSID:

代码 3.1: 变量名示例

(这样确实可以传递域名,但是域名的值是非法的)
dns_domain_My____NET="My \"\\ NET"

(上面的例子意思是当一块无线网卡连接到ESSID为My "\ NET的无线接入点时
把dns域名设置为My "\NET)