Mar 152017
CentOS7,网卡名字,采用consistent network device naming,简单的说,网络的名字,已经不是以前的eth0,eth1,你装系统前,你根本就不知道他叫啥名字。
这样的命名,好处就是你机器重启,增加pci设备,不会导致原来的设备名称发生改变。如果我们通过grub,修改内核的方式,改变回到以前的网卡命名,这种方式在新的设备里,会出现很多问题,你会发现每次重启机器,网卡名字都是会改变,一直都是在不停的变化,让你疯掉。
所以最佳的办法,就是还是使用装系统的时候默认网卡是啥名字就是什么名字。那么对于cobbler来说,
cobbler system add \
--name=vm1 \
--hostname=vm1 \
--profile=CentOS7-x86_64 \
--interface=eth0 \
--mac=00:50:56:35:61:5C \
--ip-address=192.168.27.100 \
--subnet=255.255.255.0 \
--gateway=192.168.27.0 \
--static=1
你是必须指定网卡名字的。
我们可以考虑通过cobbler提供的snippet来解决这个问题。
目前cobbler提供 pre_install_network_config,还不能很好解决这个问题。
cd /var/lib/cobbler/snippets
mv pre_install_network_config pre_install_network_config.save
我们创建一个新的 pre_install_network_config
#if $getVar("system_name","") != ""
# Start pre_install_network_config generated code
#raw
# generic functions to be used later for discovering NICs
mac_exists() {
[ -z "$1" ] && return 1
if which ip 2>/dev/null >/dev/null; then
ip -o link | grep -i "$1" 2>/dev/null >/dev/null
return $?
elif which esxcfg-nics 2>/dev/null >/dev/null; then
esxcfg-nics -l | grep -i "$1" 2>/dev/null >/dev/null
return $?
else
ifconfig -a | grep -i "$1" 2>/dev/null >/dev/null
return $?
fi
}
get_ifname() {
if which ip 2>/dev/null >/dev/null; then
IFNAME=$(ip -o link | grep -i "$1" | sed -e 's/^[0-9]*: //' -e 's/:.*//')
elif which esxcfg-nics 2>/dev/null >/dev/null; then
IFNAME=$(esxcfg-nics -l | grep -i "$1" | cut -d " " -f 1)
else
IFNAME=$(ifconfig -a | grep -i "$1" | cut -d " " -f 1)
if [ -z $IFNAME ]; then
IFNAME=$(ifconfig -a | grep -i -B 2 "$1" | sed -n '/flags/s/:.*$//p')
fi
fi
}
#end raw
#set ikeys = $interfaces.keys()
#import re
#set $vlanpattern = $re.compile("[a-zA-Z0-9]+[\.][0-9]+")
#set $routepattern = $re.compile("[0-9/.]+:[0-9.]+")
##
## Determine if we should use the MAC address to configure the interfaces first
## Only physical interfaces are required to have a MAC address
#set $configbymac = True
#for $iname in $ikeys
#set $idata = $interfaces[$iname]
#if $idata["mac_address"] == "" and not $vlanpattern.match($iname) and not $idata["interface_type"].lower() in ("master","bond","bridge","bonded_bridge_slave")
#set $configbymac = False
#end if
#end for
#set $i = 0
#if $configbymac
## Output diagnostic message
# Start of code to match cobbler system interfaces to physical interfaces by their mac addresses
#end if
#for $iname in $ikeys
# Start $iname
#set $idata = $interfaces[$iname]
#set $mac = $idata["mac_address"]
#set $static = $idata["static"]
#set $ip = $idata["ip_address"]
#set $netmask = $idata["netmask"]
#set $iface_type = $idata["interface_type"]
#set $iface_master = $idata["interface_master"]
#set $if_gateway = $idata["if_gateway"]
#set $static_routes = $idata["static_routes"]
#set $devfile = "/etc/sysconfig/network-scripts/ifcfg-" + $iname
#if $vlanpattern.match($iname)
## If this is a VLAN interface, skip it, anaconda doesn't know
## about VLANs.
#set $is_vlan = "true"
#else
#set $is_vlan = "false"
#end if
#if ($configbymac and $is_vlan == "false" and $iface_type.lower() not in ("slave","bond_slave","bridge_slave","bonded_bridge_slave")) or $iface_type.lower() in ("master","bond","bridge")
## This is a physical interface, hand it to anaconda. Do not
## process slave interface here.
#if $iface_type.lower() in ("master","bond","bridge","bonded_bridge_slave")
## Find a slave for this interface
#for $tiname in $ikeys
#set $tidata = $interfaces[$tiname]
#if $tidata["interface_type"].lower() in ("slave","bond_slave","bridge_slave") and $tidata["interface_master"].lower() == $iname
#if $tidata["mac_address"] != '':
#set $mac = $tidata["mac_address"]
# Found a slave for this interface: $tiname ($mac)
#break
#end if
#else if $tidata["interface_type"].lower() == "bonded_bridge_slave" and $tidata["interface_master"].lower() == $iname
## find a slave for this slave interface...
#for $stiname in $ikeys
#set $stidata = $interfaces[$stiname]
#if $stidata["interface_type"].lower() in ("slave","bond_slave","bridge_slave") and $stidata["interface_master"].lower() == $tiname
#if $stidata["mac_address"] != '':
#set $mac = $stidata["mac_address"]
# Found a slave for this interface: $tiname -> $stiname ($mac)
#break
#end if
#end if
#end for
#end if
#end for
#end if
#if $static and $ip != ""
#if $netmask == ""
## Netmask not provided, default to /24.
#set $netmask = "255.255.255.0"
#end if
#set $netinfo = "--bootproto=static --ip=%s --netmask=%s" % ($ip, $netmask)
#if $if_gateway != ""
#set $netinfo = "%s --gateway=%s" % ($netinfo, $if_gateway)
#else
#set $netinfo = "%s --gateway=0.0.0.0" % ($netinfo)
#end if
#if $len($name_servers) > 0
#set $netinfo = "%s --nameserver=%s" % ($netinfo, $name_servers[0])
#end if
#else if not $static
#set $netinfo = "--bootproto=dhcp"
#else
## Skip this interface, it's set as static, but without
## networking info.
# Skipping (no configuration)...
#continue
#end if
#if $hostname != ""
#set $netinfo = "%s --hostname=%s" % ($netinfo, $hostname)
#end if
# Configuring $iname ($mac)
if mac_exists $mac
then
get_ifname $mac
echo "network --device=\$IFNAME $netinfo " >> /tmp/pre_install_network_config
#for $route in $static_routes
#if $routepattern.match($route)
#set $routebits = $route.split(":")
#set [$network, $router] = $route.split(":")
ip route add $network via $router dev \$IFNAME
#else
# Warning: invalid route "$route"
#end if
#end for
fi
#else
#if $iface_type.lower() in ("slave","bond_slave","bridge_slave","bonded_bridge_slave")
# Skipping (slave-interface)
#else
# Skipping (not a physical interface)...
#end if
#end if
#end for
# End pre_install_network_config generated code
#end if
这样cobbler默认使用的sample.ks来安装centos 7.x,那么网卡名字,就会和系统默认是一致的。
上面的snippet是我同事 http://zhanguo1110.blog.51cto.com/5750817/1671442 写的。
参考文档