手把手带你自制Linux系统之四 添加网络功能


1. 添加系统函数库

/etc/rc.d/init.d/functions脚本文件中定义了许多功能函数,用于控制服务脚本的信息显示等。/etc/init.d下的绝大多数脚本或多或少都会使用这些功能。例如在CentOS开机启动时,会看到执行某项操作或启动某个服务是成功还是失败,在右侧会有一个用中括号括起来的单词表示,成功用绿色的OK,失败用红色的FAILED,如图所示:



接下来,就添一个functions文件,其中定义两个函数来实现这样的功能。
vi /mnt/sysroot/etc/rc.d/init.d/functions

内容如下:
SCREEN=`stty -F /dev/console size 2>/dev/null`
COLUMNS=${SCREEN#* }
[ -z $COLUMNS ] && COLUMNS=80
 
SPA_COL=$[$COLUMNS-14]
 
RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033\34m'
NORMAL='\033[0m'
 
 
success() {
  string=$1
  RT_SPA=$[$SPA_COL-${#string}]
  echo -n "$string"
  for I in `seq 1 $RT_SPA`;do
    echo -n " "
  done
  echo -e "[   ${GREEN}OK${NORMAL}   ]"
}
 
failure() {
  string=$1
  RT_SPA=$[$SPA_COL-${#string}]
  echo -n "$string"
  for I in `seq 1 $RT_SPA`;do
    echo -n " "
  done
  echo -e "[ ${RED}FAILED${NORMAL} ]"
}   

使用bincp.sh 移植命令:seq

functions文件的使用方法很简单,只需要在使用功能函数的脚本中source一下/etc/rc.d/init.d/functions即可。function文件中定义了两个shell脚本函数:success和failure,分别在右侧显示绿色的[OK]或红色的[FAILED]


2. 初始化网卡驱动

首先查看网卡信息:

[root@localhost ~]# lspci | grep -i ethernet
02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)

查看网卡的驱动模块:
[root@localhost ~]# lsmod | grep -i PCnet32
pcnet32                35269  0 
mii                     9409  1 pcnet32

查看pcnet32模块信息可以发现pcnet32依赖mii模块:
[root@localhost sysroot]# modinfo pcnet32
filename:       /lib/modules/2.6.18-194.el5/kernel/drivers/net/pcnet32.ko
license:        GPL
description:    Driver for PCnet32 and PCnetPCI based ethercards
author:         Thomas Bogendoerfer
srcversion:     F81443556AAE169CBF80F55
alias:          pci:v00001023d00002000sv*sd*bc02sc00i*
alias:          pci:v00001022d00002000sv*sd*bc*sc*i*
alias:          pci:v00001022d00002001sv*sd*bc*sc*i*
depends:        mii
vermagic:       2.6.18-194.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
parm:           debug:pcnet32 debug level (int)
parm:           max_interrupt_work:pcnet32 maximum events handled per interrupt (int)
parm:           rx_copybreak:pcnet32 copy breakpoint for copy-only-tiny-frames (int)
parm:           tx_start_pt:pcnet32 transmit start point (0-3) (int)
parm:           pcnet32vlb:pcnet32 Vesa local bus (VLB) support (0/1) (int)
parm:           options:pcnet32 initial option setting(s) (0-15) (array of int)
parm:           full_duplex:pcnet32 full duplex setting(s) (1) (array of int)
parm:           homepna:pcnet32 mode for 79C978 cards (1 for HomePNA, 0 for Ethernet, default Ethernet (array of int)
module_sig:    883f3504bb645aa285b5c47ed7a1e8e11213dc09e2fee057e474ae7754a0f36d5fe683478e403f9e0a08018a727bb9fccb38d536dddc1ca9df78384a8a

所以初始化pcnet32网卡需要用到pcnet32和mii模块。 拷贝这两个模块:

mkdir -pv /mnt/sysroot/lib/modules
cp /lib/modules/2.6.18-194.el5/kernel/drivers/net/mii.ko /mnt/sysroot/lib/modules/
cp /lib/modules/2.6.18-194.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/

在rc.sysinit脚本中安装网卡驱动模块:

vi /mnt/sysroot/etc/rc.d/rc.sysinit


加入下面几行:

echo "Initializing network device..."
/sbin/insmod /lib/modules/mii.ko
/sbin/insmod /lib/modules/pcnet32.ko
[ $? -eq 0 ] && success "Initializing newtork device" || failure "Initializing network device"

使用bincp.sh移植命令:insmod, lsmod


3. 配置网卡

网卡驱动安装后可以正常识别网卡,但是想要使用还需要对网卡进行配置,设置IP,网关等信息。


新建网卡配置文件:

mkdir -pv /mnt/sysroot/etc/sysconfig/network-scripts
vi /mnt/sysroot/etc/sysconfig/network-scripts/ifcfg-eth0

加入:
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.198.111
NETMASK=255.255.255.0
GATEWAY=192.168.198.2
ONBOOT=yes


创建网络服务脚本:

cp /etc/rc.d/init.d/network /mnt/sysroot/etc/rc.d/init.d/
vi /mnt/sysroot/etc/rc.d/init.d/network

保留其中前8行内容(文件头信息,为了能够被chkconfig管理),然后使用ifconfig和route命令对网卡进行设置。

#!/bin/bash
#
# chkconfig: 35 09 90
# description: network service
prog=network
. /etc/rc.d/init.d/functions
CONF=/etc/sysconfig/network-scripts/ifcfg-eth0
. $CONF
NETMASK=24
start(){
    ifconfig eth0 $IPADDR/$NETMASK
    [ -n $GATEWAY ] && route add default gw $GATEWAY
}
stop(){
    ifconfig eth0 down
}
status(){
    ifconfig eth0
}
usage(){
    echo "Usage: $prog {start|stop|status|restart}"
}
case $1 in
    start)
    start
    success "Config network eth0"
    ;;
    stop)
    stop
    success "Stop network card eth0"
    ;;
    restart)
    stop
    start
    success "Restart network card eth0"
    ;;
    status)
    status
    ;;
    *)
    usage
    exit 1
    ;;
esac

给网络服务脚本加上执行权限:

chmod +x /mnt/sysroot/etc/rc.d/init.d/network

rc.d目录的0,3,6运行级别中添加对应的软链接:

cd /mnt/sysroot/etc/rc.d/rc0.d
ln -sv ../init.d/network K90network
cd /mnt/sysroot/etc/rc.d/rc3.d
ln -sv ../init.d/network S10network
cd /mnt/sysroot/etc/rc.d/rc6.d
ln -sv ../init.d/network K90network


inittab文件中3运行级别时运行rc

vi /mnt/sysroot/etc/inittab


添加:

l3:3:wait:/etc/rc.d/rc 3

移植命令:ifconfig, route, ping


4. 激活回环网络设备


打开rc.sysinit

vi /mnt/sysroot/etc/rc.d/rc.sysinit

加入:

ifconfig lo 127.0.0.1/8
[ $? -eq 0 ] && success "Activating loopback network device" || failure "Activating loopback network device"

5. 测试

使用ping 命令测试与网关的连通性,没有问题的话说明前面的步骤没有问题。


6. 总结

加入网络功能后,我们的Mini Linux不再是一个孤立的单机,成为了一台可以与其他计算机互相通信的网络计算机,然后这台Mini Linux就可以实现ssh,web服务等功能。但是还有些小问题没有解决,例如测试结果展示的图片中,提示字符串是[root@(none) ~],其中主机名显示(none),就是因为还没有配置主机名的缘故。另外init是以只读方式挂载根文件系统,整个根文件系统都是不可修改的,解决这个问题需要在启动时重新挂载根为读写方式。这些小问题都将在下章节中解决。

Logo

更多推荐