- 論壇徽章:
- 0
|
繼續(xù)補完
不好意思,最近工作太忙,好久沒有來搞這個東東了,加之心愛的手機丟了,心情又不太好,不過一切都過去了,繼續(xù)來將它補充完整。
修改啟動腳本
在前面寫rcS啟動腳本中。當(dāng)時只是為了系統(tǒng)能夠正常地啟動,在啟動網(wǎng)卡/路由/服務(wù)等時,有如下語句:
——————————————————————————————————————————————
#set lo ip address
ifconfig lo 127.0.0.1
#set eth0 ip address
#當(dāng)然,這樣子做只是權(quán)宜之計,最后做的應(yīng)該是在這一步引導(dǎo)網(wǎng)絡(luò)啟動腳本,像RedHat
#那樣,自動讀取所有指定的配置文件來啟動
ifconfig eth0 192.168.0.68 netmask 255.255.255.0
#set route
#同樣的,最終這里應(yīng)該是運行啟動路由的腳本,讀取路由配置文件
route add default gw 192.168.0.1
……
———————————————————————————————————————————————
這樣配置的最大壞處就是不能根據(jù)配置文件自定義,每次開機都定死了,現(xiàn)在來修改它,將這段語句刪除之,換成如下語句:
for i in /etc/start/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
echo "Running $i ."
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
echo "Done $i ."
echo
done
解釋一下,這段語句的作用,就是啟動/etc/start/目錄下,所有以S開頭的腳本文件,可以啟動兩類,以sh結(jié)尾或沒有 sh后綴的。
這樣,我們在/etc/目錄下再新建一目錄start/,這里面就是我們啟動時需要的腳本的。先來啟動網(wǎng)卡。
修改網(wǎng)卡配置文件
我是根據(jù)Red hat的作法,把網(wǎng)卡配置放在/etc/sysconfig/network-scripts目錄下,類似于ifcfg-ethXX這樣子,它們的語法是:
DEVICE=eth0
BOOTPROTO=static
BROADCAST=88.88.88.255
IPADDR=88.88.88.44
NETMASK=255.255.255.0
NETWORK=88.88.88.0
ONBOOT=yes
好,建立這些目錄和文件,我共有兩個文件ifcfg-ethXX;氐/etc/start目錄,建立網(wǎng)卡的啟動腳本S01interface:
#!/bin/sh
. /etc/sysconfig/network
#enable ip_forword
echo >1 /proc/sys/net/ipv4/ip_forward
#enable syn_cookie
echo >1 /proc/sys/net/ipv4/tcp_syncookies
#enable loopback interface
/sbin/ifconfig lo 127.0.0.1
#eanble ethernet interface
/usr/sbin/bootife
#set hostname
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]
then
HOSTNAME=localhost
fi
/bin/hostname ${HOSTNAME}
請注意這個腳本文件,有兩個地方:
1、包含了另一個配置文件/etc/sysconfig/network,在這里,我也是照抄了redhat,我的/etc/sysconfig/network這個文件的內(nèi)容如下:
NETWORKING=yes
HOSTNAME=skynet
GATEWAY=88.88.88.2
2、在啟動網(wǎng)卡時,我使用了
#eanble ethernet interface
/usr/sbin/bootife
bootife是我自己寫的一個C程序,作用是讀取/etc/sysconfig/network-scripts/下面的ifcfg-ethXX文件,并配置之,本來這里就該用shell來完成更合適一點,無奈,偶shell功底實在差了一點(剛學(xué)幾天),就是想從Redhat中照抄過來,反復(fù)試了幾次也沒有成功。所以被逼無奈用C來完成之,后面我會附上我的C的源碼,也希望哪位大哥能夠?qū)懸欢蜸hell的程序代替它,放上來大家共享之。
修改路由啟動文件
同樣的,我在/etc/start下,建立新腳本S02route.sh,它的作用是啟動所有配置的靜態(tài)路由:
#!/bin/bash
. /etc/sysconfig/network
# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]
then
grep "eth*" /etc/sysconfig/static-routes | while read ignore args ; do
# echo "/sbin/route add -"$args
/sbin/route add -$args
done
fi
#Add defalut gw
/sbin/route add default gw ${GATEWAY}
OK,啟動時讀取的配置文件是/etc/sysconfig/static-routes ,它的語法和Redhat是一樣的,請參照建立此文件。
啟動服務(wù)程序
新建啟動腳本S03server:
#!/bin/sh
#------------------------------------------------------------------
#-- Source
#-- Author(s) : kendo
#-- Email: kendo999@sohu.com
#-- http://www.skynet.org.cn
#-- 2005/10/31
#------------------------------------------------------------------
. /etc/sysconfig/bootserver
if [ "$enable_httpd" = 1 ] ; then
. /etc/scripts/httpd.sh $1
fi
if [ "$enable_adsl" = 1 ] ; then
……
fi
if [ "$enable_udhcpd" = 1 ] ; then
……
fi
很簡單,根據(jù)相應(yīng)變量的值,調(diào)用相應(yīng)的腳本。
1、這些啟動標志變量,我定義在了/etc/sysconfig/bootserver當(dāng)中,其內(nèi)容如下:
#start server on system boot
#1:yes 0:no
enable_httpd=1
enable_adsl=1
enable_udhcpd=1
2、每種服務(wù)對應(yīng)的腳本,我都放在了/etc/scripts下面。這些腳本,取決于你打算使用哪些服務(wù)程序了。腳本的來源,可以自己編寫,有可能其源碼中自帶有,也可以到網(wǎng)上查找……我就不再一一贅述了,
OK,基本上,腳本的修改就完成了,下一步,將是建立RamDisk。
——————————————————————————————————————————————
附,讀取網(wǎng)卡配置文件,啟動網(wǎng)卡的C源碼:
/************************************************************************
** author:kendo
** date:2005/10/26
***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#define NETCFGDIR "/etc/sysconfig/network-scripts/"
struct _ifcfg{
char device[8];
char bootproto[8];
char br[16];
char netmask[16];
char ip[16];
char network[16];
int onboot;
};
void ParseKey(struct _ifcfg *ifcfg,char *key,char *value)
{
if(!strcmp(key,"DEVICE"))
{
strcpy(ifcfg->device,value);
}
else if(!strcmp(key,"BOOTPROTO"))
{
strcpy(ifcfg->bootproto,value);
}
else if(!strcmp(key,"BROADCAST"))
{
strcpy(ifcfg->br,value);
}
else if(!strcmp(key,"IPADDR"))
{
strcpy(ifcfg->ip,value);
}
else if(!strcmp(key,"NETMASK"))
{
strcpy(ifcfg->netmask,value);
}
else if(!strcmp(key,"NETWORK"))
{
strcpy(ifcfg->network,value);
}
else if(!strcmp(key,"ONBOOT"))
{
ifcfg->onboot=(strcmp(value,"yes") ? 0 : 1);
}
}
int main(int argc,char **argv)
{
FILE *fp;
DIR *dir;
int i;
char filename[50],buf[80];
char *index,*key,*value,*p;
struct _ifcfg *ifcfg;
struct dirent *ptr;
ifcfg=(struct _ifcfg *)malloc(sizeof(struct _ifcfg));
memset(ifcfg,0,sizeof(struct _ifcfg));
dir=opendir(NETCFGDIR); /*打開腳本目錄*/
while((ptr=readdir(dir))!=NULL) /*讀取所有文件*/
{
if(strncmp(ptr->d_name,"ifcfg-eth",9)) /*這里,只啟動了以太網(wǎng)卡^o^*/
{
continue;
}
memset(filename,0,sizeof(filename));
sprintf(filename,"%s%s",NETCFGDIR,ptr->d_name);
if((fp=fopen(filename,"r"))==NULL) /*打開配置文件*/
{
continue;
}
while(!feof(fp))
{
memset(buf,0,sizeof(buf));
if(fgets(buf,80,fp)!=NULL) /*逐行讀取分析*/
{
p=strchr(buf,'n');
if(p)
{
*p='';
}
index=buf;
key=strtok(index,"="); /*讀取配置變量*/
value=strtok(NULL,"="); /*讀取變量的值*/
ParseKey(ifcfg,key,value); /*分析之,存入結(jié)構(gòu)ifcfg中*/
}
}
/*構(gòu)建相應(yīng)的命令*/
memset(buf,0,80);
strcpy(buf,"/sbin/ifconfig");
if(ifcfg->onboot)
{
sprintf(buf,"%s %s %s netmask %s broadcast %s",
buf,
ifcfg->device,
ifcfg->ip,
ifcfg->netmask,
ifcfg->br);
/*直接調(diào)用system來實現(xiàn),當(dāng)然也可以自己通過ioctl來設(shè)置,相應(yīng)源碼,我以前在c/c++版發(fā)過*/
system(buf);
}
}
free(ife);
return 0;
} |
|