手把手帶你自制Linux系統之四 添加網絡功能

手把手帶你自制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是以只讀方式掛載根文件系統,整個根文件系統都是不可修改的,解決這個問題需要在啓動時重新掛載根爲讀寫方式。這些小問題都將在下章節中解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章