Here we learn about how the configuration works - you need to know this
before we learn about modular networking.
9
2011-08-13
Advanced Configuration
The config_eth0 variable is the heart of an interface configuration. It's
a high level instruction list for configuring the interface (eth0 in this
case). Each command in the instruction list is performed sequentially. The
interface is deemed OK if at least one command works.
Here's a list of built-in instructions.
| Command |
Description |
null
Do nothing
noop
If the interface is up and there is an address then abort configuration
successfully
an IPv4 or IPv6 address
Add the address to the interface
dhcp, adsl or apipa (or a custom command from a 3rd
party module)
Run the module which provides the command. For example dhcp will run
a module that provides DHCP which can be one of either dhcpcd,
dhclient or pump.
If a command fails, you can specify a fallback command. The fallback has to
match the config structure exactly.
You can chain these commands together. Here are some real world examples.
# Adding three IPv4 addresses
config_eth0=(
"192.168.0.2/24"
"192.168.0.3/24"
"192.168.0.4/24"
)
# Adding an IPv4 address and two IPv6 addresses
config_eth0=(
"192.168.0.2/24"
"4321:0:1:2:3:4:567:89ab"
"4321:0:1:2:3:4:567:89ac"
)
# Keep our kernel assigned address, unless the interface goes
# down so assign another via DHCP. If DHCP fails then add a
# static address determined by APIPA
config_eth0=(
"noop"
"dhcp"
)
fallback_eth0=(
"null"
"apipa"
)
When using the ifconfig module and adding more than one address,
interface aliases are created for each extra address. So with the above two
examples you will get interfaces eth0, eth0:1 and eth0:2.
You cannot do anything special with these interfaces as the kernel and other
programs will just treat eth0:1 and eth0:2 as eth0.
The fallback order is important! If we did not specify the null option
then the apipa command would only be run if the noop command
failed.
APIPA and DHCP are discussed later.
Network Dependencies
Init scripts in /etc/init.d can depend on a specific network
interface or just net. All network interfaces in Gentoo's init system provide
what is called net.
If, in /etc/rc.conf, rc_depend_strict="YES" is set, then all
network interfaces that provide net must be active before a dependency on "net"
is assumed to be met. In other words, if you have a net.eth0 and
net.eth1 and an init script depends on "net", then both must be
enabled.
On the other hand, if rc_depend_strict="NO" is set, then the "net"
dependency is marked as resolved the moment at least one network interface is
brought up.
But what about net.br0 depending on net.eth0 and
net.eth1? net.eth1 may be a wireless or PPP device
that needs configuration before it can be added to the bridge. This cannot be
done in /etc/init.d/net.br0 as that's a symbolic link to
net.lo.
The answer is defining an rc_need_ setting in
/etc/conf.d/net.
rc_need_br0="net.eth0 net.eth1"
For a more detailed discussion about dependency, consult the section Writing Init Scripts in the Gentoo
Handbook. More information about /etc/rc.conf is available as
comments within that file.
Variable names and values
Variable names are dynamic. They normally follow the structure of
variable_${interface|mac|essid|apmac}. For example, the variable
dhcpcd_eth0 holds the value for dhcpcd options for eth0 and
dhcpcd_essid holds the value for dhcpcd options when any interface
connects to the ESSID "essid".
However, there is no hard and fast rule that states interface names must be
ethx. In fact, many wireless interfaces have names like wlanx, rax as well as
ethx. Also, some user defined interfaces such as bridges can be given any name,
such as foo. To make life more interesting, wireless Access Points can have
names with non alpha-numeric characters in them - this is important because
you can configure networking parameters per ESSID.
The downside of all this is that Gentoo uses bash variables for networking -
and bash cannot use anything outside of English alpha-numerics. To get around
this limitation we change every character that is not an English alpha-numeric
into a _ character.
Another downside of bash is the content of variables - some characters need to
be escaped. This can be achived by placing the \ character in front of
the character that needs to be escaped. The following list of characters needs
to be escaped in this way: ", ' and \.
In this example we use wireless ESSID as they can contain the widest scope
of characters. We shall use the ESSID My "\ NET:
(This does work, but the domain is invalid)
dns_domain_My____NET="My \"\\ NET"
(The above sets the dns domain to My "\ NET when a wireless card
connects to an AP whose ESSID is My "\ NET)