※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

標準Linuxの/etc/init.d/内にある。

スクリプト

#!/bin/sh
#
# start/stop network deamons
#
#

DHCPCD=/sbin/dhcpcd
BASE=`basename $DHCPCD`
LOCK=/var/lock/networking

. /usr/local/bin/kuro_lib


if [ -f /etc/netinfo ]; then
	. /etc/netinfo
fi

# for dhcpcd.exe
export INTERFACE=$ENETNAME

configure()
{
	echo "create network files.."
	echo "IP=[$my_ipaddress], netmask=[$my_subnetmask], dgw=[$my_dgw], dns1=[$my_dns1], dns2=[$my_dns2]"
	if [ "$my_ipaddress" = "" ]; then
		my_ipaddress=$DEFAULT_IP
		my_subnetmask=255.255.255.0
		my_dgw=
	fi
	touch /etc/resolv.conf
}

set_defaultGw()
{
	if [ "$my_dgw" = "" ]; then
		route del default
	else
		route add default gw $my_dgw
	fi
}

set_defaultIp()
{
	echo "** setting default ip"
	/sbin/ifconfig $ENETNAME $DEFAULT_IP netmask 255.255.255.0 
	# delete default gw
	my_dgw=
}

set_defaultIf()
{
	TMP=`cat /proc/net/route |awk '{print $4}'|grep 0003`
	if [ "$TMP" = "" ]; then
		echo "add default if"
		#route add -net 255.255.255.255 netmask 255.255.255.255 $ENETNAME
		route add -net default $ENETNAME
	fi

}

set_dns()
{
	echo "Configuration resolv.conf"
	cat /dev/null > /etc/resolv.conf
	if [ "$my_dns1" != "" ]; then
		echo "nameserver $my_dns1" >> /etc/resolv.conf
	fi
	
	if [ "$my_dns2" != "" ]; then
		echo "nameserver $my_dns2" >> /etc/resolv.conf
	fi
}

start()
{
	configure
	
	/sbin/ifconfig lo up
	killall $BASE
	rm -f /etc/dhcpc/dhcpcd-eth0.pid
	
	# delete default gw
	while :
	do :
		/sbin/route del default
		if [ $? -ne 0 ]; then
			break
		fi
	done
	sleep 1
	echo "Configuration network interface: lo $ENETNAME"

	##
	## change mtu (frame-size 1518,4100,7418)
	##
	if [ "$mtu" = "4102" ] ; then
		mtu=4084
	elif [ "$mtu" = "7422" ] ; then
		mtu=7404
	elif [ "$mtu" = "9694" ] ; then
		mtu=9676
	else
		mtu=1500
	fi
	/sbin/ifconfig $ENETNAME mtu $mtu multicast
	if [ $? -ne 0 ]; then
		echo "mtu fail"
		/sbin/ifconfig $ENETNAME mtu 1500 multicast
	fi
	if [ "$my_ipaddress" = "dhcp" ]; then
		if [ "$my_dgw" != "" ]; then
			echo "--- set static dgw"
			DHCP_GW="-G $my_dgw"
		fi
		## see also /etc/dhcpc/dhcpcd.exe
		echo "DHCPCSTATE=requesting" > /var/tmp/dhcpcstate
		##
		echo "requesting DHCP  tout=30[s]"
		$DHCPCD -L /etc/dhcpc -h `hostname` $DHCP_GW -t 15 $ENETNAME
		if [ $? -ne 0 ]; then
			echo "** dhcp fail"
			echo "DHCPCSTATE=fixip" > /var/tmp/dhcpcstate
			set_defaultIp
			set_defaultGw
			# wait linkup delay
			sleep 4
		fi
	else
		echo "DHCPCSTATE=fixip" > /var/tmp/dhcpcstate
		echo "/sbin/ifconfig $ENETNAME $my_ipaddress netmask $my_subnetmask"
		/sbin/ifconfig $ENETNAME $my_ipaddress netmask $my_subnetmask
		if [ $? -ne 0 ]; then
			set_defaultIp
		fi
		set_defaultGw
		set_dns
	fi
	##
	set_defaultIf

	## set ipaddress in /etc/hosts
	/etc/init.d/sethostname.sh

	#/usr/local/bin/change_notify.sh network
}

stop()
{
	echo "Deconfiguration network interface: lo $ENETNAME"
	killall $BASE
	/sbin/ifconfig $ENETNAME down
	/sbin/ifconfig lo down
}

# for NFS
TMP=`grep /dev/root /proc/mounts|grep nfs`
if [ "$TMP" != "" ]; then
	echo "nfs root mode. skip $ENETNAME network configuration."
	exit 0
fi
#

lock_file check
lock_file create

case "$1" in 
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	stop
	sleep 1
	start
	;;
    *)
	echo "Usage: $0 {start|stop|restart}"
	;;
esac

lock_file delete

exit 0

スクリプト詳細

ブロックごとに見てみる。
#!/bin/sh
#
# start/stop network deamons
#
#
シェルにshを指定。ネットワークデーモンの開始/停止のコメント。
DHCPCD=/sbin/dhcpcd
BASE=`basename $DHCPCD`
LOCK=/var/lock/networking
DHCPCDという変数を用意し、そこに/sbin/dhcpcdを代入。
BASEという変数を用意し、そこに'basename /sbin/dhcpcd'を代入。
LOCKという変数を用意し、そこに/var/lock/networkingを代入。
. /usr/local/bin/kuro_lib
/usr/local/bin/kuro_libをサブシェルで走らせる。
kuro_lib内の
  • DEFAULT_IP変数(=192.168.11.150)
  • ENETNAME変数(=eth0)
  • lock_file関数
を使用するためだ。
if [ -f /etc/netinfo ]; then
/etc/netinfoが存在すれば(/etcにnetinfoというファイルがあれば)以下を実行。
. /etc/netinfo
/etc/netinfoをサブシェルで走らせる。
netinfo内の
  • my_ipaddress変数
  • my_subnetmask変数
  • my_dgw変数
  • my_dns1変数
  • my_dns2変数
  • mtu変数
を使用するためだ。
fi
/etc/netinfoの存在の有無の条件分岐を終了。
# for dhcpcd.exe
/etc/dhcpc/dhcpcd.exeのために、というコメント。
export INTERFACE=$ENETNAME
環境変数を設定するexportコマンドで、INTERFACE変数にeth0を代入している。
ここからは7つの関数の記述になる。

configure関数

configure()
{
configure関数の定義が始まる。
echo "create network files.."
echo "IP=[$my_ipaddress], netmask=[$my_subnetmask], dgw=[$my_dgw], dns1=[$my_dns1], dns2=[$my_dns2]"
画面に
create network files..
IP=[IPアドレス値], netmask=[ネットマスク値], dgw=[デフォルトゲートウェイ値], dns1=[DNS1値], dns2=[DNS2値]
と表示される。
if [ "$my_ipaddress" = "" ]; then
my_ipaddress変数に何も設定されていなければ以下を実行。
my_ipaddress=$DEFAULT_IP
my_subnetmask=255.255.255.0
my_dgw=
my_ipaddress変数にDEFAULT_IP変数の値、my_subnetmask変数に255.255.255.0、my_dgw変数は空、とそれぞれの変数に値を代入。
fi
my_ipaddress変数が空かどうかの条件分岐を終了。
touch /etc/resolv.conf
/etcにresolv.confというファイルを作成。
}
configure関数はここまで。

set_defaultGw関数

set_defaultGw()
{
set_defaultGw関数の定義ここから。
if [ "$my_dgw" = "" ]; then
my_dgw変数が空であれば以下を実行。
route del default
routeコマンド?でデフォルト経路情報を削除。
デフォルト経路とは、自分の経路情報に記録されていない宛て先のパケットを送るためのものだ。
一般的にはルーターを指す。
else
my_dgw変数が空でなければ以下を実行。
route add default gw $my_dgw
routeコマンド?で、デフォルト経路としてmy_dgw変数の内容を経路テーブルに追加。
fi
my_dgw変数が空かどうかの条件分岐を終了。
}
set_defaultGw関数はここまで。

set_defaultIp関数

set_defaultIp()
{
set_defaultIp関数はここから。
echo "** setting default ip"
/sbin/ifconfig $ENETNAME $DEFAULT_IP netmask 255.255.255.0
画面上に「** setting default ip」と表示。
ifconfigコマンド?でeth0にDEFAULT_IP変数の値とnetmaskを255.255.255.0を設定。
# delete default gw
my_dgw=
デフォルトゲートウェイを削除する、というコメントの後にmy_dgw変数に空を代入している。
}
set_defaultIp関数はここまで。

set_defaultIf関数

set_defaultIf()
{
set_defaultIf関数はここから。
TMP=`cat /proc/net/route |awk '{print $4}'|grep 0003`
TMPという変数を用意して、そこに「cat /proc/net/route |awk '{print $4}'|grep 0003」の結果を代入している。
3つの命令をパイプでつないでいるのだが、ひとつづつ見てみる。
cat /proc/net/route
/proc/net/routeを読み込んで次の命令に渡す。
この/procにはprocファイルシステムがマウントされていて、カーネルの各種統計情報を閲覧することができるが、/proc/net/routeにはIP経路情報が記載されている。
このコマンドを実行してみると
Iface Destination Gateway Flags RefCnt Use Metric Mask MTU Window IRTT
eth0 0001A8C0 00000000 0001 0 0 0 00FFFFFF 0 0 0
eth0 00000000 0101A8C0 0003 0 0 0 00000000 0 0 0
というように出力された。
awk '{print $4}'
awkコマンド?で第4パラメータを抜き取って次の命令へ。
第4パラメータとは、上の表から「Flags」のことだとわかる。
grep 0003
「0003」という文字列を検索している。
実際に「0003」という文字列があったので、この場合、TMP変数には「0003」と入る。
フラグ「0003」とは「経路は有効でゲートウェイを使用する」という内容だ。
今の例で言うなら、宛て先が「0.0.0.0/0」なので選ばれた経路はデフォルト経路である。
つまり、この一連の命令は「デフォルト経路をeth0が持っているかどうか」を調べていたのだ。
なければ空白が入る。
if [ "$TMP" = "" ]; then
TMP変数が空なら以下を実行。
echo "add default if"
画面に「add default if」と表示。
#route add -net 255.255.255.255 netmask 255.255.255.255 $ENETNAME
route add -net default $ENETNAME
routeコマンド?でeth0経由のネットワーク255.255.255.255を追加する、はコメントアウトされ、routeコマンド?でeth0にデフォルト経路を追加している。
コメントアウトされている255.255.255.255/32の経路情報は「ローカルブロードキャスト」と呼ばれるもので、ルーターを超えないLAN内に一斉にパケットを送信する手段である。
fi
TMP変数の内容の条件分岐を終了する。
}
set_defaultIf関数はここまで。

set_dns関数

set_dns()
{
set_dns関数はここから。
echo "Configuration resolv.conf"
画面に「Configuration resolv.conf」と表示する。
cat /dev/null > /etc/resolv.conf
/etc/resolv.confの内容を消去している。
if [ "$my_dns1" != "" ]; then
my_dns1変数が空でなければ以下を実行。
echo "nameserver $my_dns1" >> /etc/resolv.conf
「nameserver my_dns1変数の値」を/etc/resolv.confに追記。
fi
my_dns1変数が空かどうかの条件分岐を抜ける。
if [ "$my_dns2" != "" ]; then
my_dns2変数が空でなければ以下を実行。
echo "nameserver $my_dns2" >> /etc/resolv.conf
「nameserver my_dns2変数の値」を/etc/resolv.confに追記。
fi
my_dns2変数が空かどうかの条件分岐を終了する。
}
set_dns関数はここまで。

start関数

start()
{
start関数の定義が始まる。
configure
configure関数の実行。
/sbin/ifconfig lo up
ifconfigコマンド?でlo(ループバック)デバイスを始動する。
killall $BASE
killallコマンド?で「basename /sbin/dhcpcd」を停止する、という内容だが、basenameコマンド?で/sbin/dhcpcdを「dhcpcd」と削ってkillallコマンド?に渡している。
結果的には「killall dhcpcd」となる。
rm -f /etc/dhcpc/dhcpcd-eth0.pid
/etc/dhcpc/dhcpcd-eth0.pidをrmコマンド?で消去する。
# delete default gw
デフォルトゲートウェイを削除する、とのコメント。
while :
do :
	/sbin/route del default
	if [ $? -ne 0 ]; then
		break
	fi
done
while文による無限ループだ。
/sbin/route del default
routeコマンド?でデフォルト経路を削除し
if [ $? -ne 0 ]; then
break
fi
routeコマンド?がエラーの終了ステータス「1」を返すまでbreak文でループから抜けられない。
sleep 1
1秒数えたあと
echo "Configuration network interface: lo $ENETNAME"
画面上に「Configuration network interface: lo eth0」と表示。
##
## change mtu (frame-size 1518,4100,7418)
##
mtuの変更、とのコメント。
if [ "$mtu" = "4102" ] ; then
	mtu=4084
elif [ "$mtu" = "7422" ] ; then
	mtu=7404
elif [ "$mtu" = "9694" ] ; then
	mtu=9676
else
	mtu=1500
fi
mtu変数が
  • 4102であればmtu変数に4084を代入
  • 7422であればmtu変数に7404を代入
  • 9694であればmtu変数に9676を代入
  • それ以外ならmtu変数に1500を代入
という内容だ。
/sbin/ifconfig $ENETNAME mtu $mtu multicast
ifconfigコマンド?でeth0のmtuを上で判別した値に設定しマルチキャストフラグを立てる。
if [ $? -ne 0 ]; then
	echo "mtu fail"
	/sbin/ifconfig $ENETNAME mtu 1500 multicast
fi
ifconfigコマンド?がエラーの場合、画面上に「mtu fail」と表示し、eth0のmtuを1500に設定しマルチキャストフラグを立てる。
if [ "$my_ipaddress" = "dhcp" ]; then
my_ipaddress変数が「dhcp」であれば以下を実行。
if [ "$my_dgw" != "" ]; then
my_dgw変数が空でなければ以下を実行。
echo "--- set static dgw"
DHCP_GW="-G $my_dgw"
画面上に「--- set static dgw」と表示。
DHCP_GWという変数を用意し、「-G $my_dgw」を代入。
fi
my_dgw変数が空かどうかの条件分岐を終了する。
## see also /etc/dhcpc/dhcpcd.exe
echo "DHCPCSTATE=requesting" > /var/tmp/dhcpcstate
/etc/dhcpc/dhcpcd.exeを参照、とのコメント。
/var/tmp/dhcpcstateに「DHCPCSTATE=requesting」を書き込み。
##
echo "requesting DHCP  tout=30[s]"
画面上に「requesting DHCP tout=30[s]」と表示する。
$DHCPCD -L /etc/dhcpc -h `hostname` $DHCP_GW -t 15 $ENETNAME
/sbin/dhcpcd -L /etc/dhcpc -h `hostname` $DHCP_GW -t 15 eth0
を実行。
if [ $? -ne 0 ]; then
エラーが返れば以下を実行。
echo "** dhcp fail"
画面上に「** dhcp fail」と表示する。
echo "DHCPCSTATE=fixip" > /var/tmp/dhcpcstate
/var/tmp/dhcpcstateに「DHCPCSTATE=fixip」と書き込む。
set_defaultIp
set_defaultGw
set_defaultIp関数とset_defaultGw関数を実行する。
# wait linkup delay
sleep 4
リンクが始動するのを4秒間待つ。
fi
dhcpcdコマンドがエラーを返すかどうかの条件分岐を終了する。
else
my_ipaddress変数が「dhcp」でなければ以下を実行。
echo "DHCPCSTATE=fixip" > /var/tmp/dhcpcstate
/var/tmp/dhcpcstateに「DHCPCSTATE=fixip」と書き込む。
echo "/sbin/ifconfig $ENETNAME $my_ipaddress netmask $my_subnetmask"
/sbin/ifconfig $ENETNAME $my_ipaddress netmask $my_subnetmask
/sbin/ifconfig eth0 $my_ipaddress netmask $my_subnetmask
を実行。
if [ $? -ne 0 ]; then
エラーが返れば以下。
set_defaultIp
set_defaultIp関数を実行。
fi
エラーかどうかの判別終了。
set_defaultGw
set_dns
set_defaultGw関数、set_dns関数の実行。
fi
my_ipaddress変数が「dhcp」かどうかの条件分岐を終了する。
##
set_defaultIf
set_defaultIf関数を実行する。
## set ipaddress in /etc/hosts
/etc/init.d/sethostname.sh
/etc/hostsにIPアドレスを設定する、というコメント。
/etc/init.d/sethostname.shの実行。
#/usr/local/bin/change_notify.sh network
/usr/local/bin/change_notify.sh networkの実行はコメントアウトだ。
}
start関数はここまで。

stop関数

stop()
{
stop関数はここから。
echo "Deconfiguration network interface: lo $ENETNAME"
画面上に「Deconfiguration network interface: lo eth0」と表示する。
killall $BASE
killallコマンド?で「basename /sbin/dhcpcd」を停止する、という内容だが、basenameコマンド?で/sbin/dhcpcdを「dhcpcd」と削ってkillallコマンド?に渡している。
結果的には「killall dhcpcd」となる。
/sbin/ifconfig $ENETNAME down
ifconfigコマンド?でeth0を停止している。
/sbin/ifconfig lo down
ifconfigコマンド?でlo(ループバック)デバイスを停止している。
}
stop関数はここまで。

スクリプト本体

# for NFS
NFS用の分岐。NFSとは「Network File System」の略。
ネットワーク上のデバイスを自分のファイルのように扱えるファイルシステムだ。
TMP=`grep /dev/root /proc/mounts|grep nfs`
TMPという変数を用意し、そこに「grep /dev/root /proc/mounts|grep nfs」を代入している。

1つめのgrep
/proc/mountsから/dev/rootという文字列を検索している。その結果を次に渡す。

2つめのgrep
渡された結果からnfsという文字列を検索している。
これらはつまり「/dev/rootがnfs形式でマウントされているかどうか」を調査しているということだ。
この結果は「(空)」か「nfs」というどちらか2つしかない。
if [ "$TMP" != "" ]; then
TMP変数が空でなければ以下を実行。
つまり/dev/rootがnfs形式でマウントされていれば、という条件だ。
echo "nfs root mode. skip $ENETNAME network configuration."
画面上に「nfs root mode. skip eth0 network configuration.」と表示。
exit 0
終了ステータスに正常を示す「0」を設定しスクリプトを終了する。
fi
TMP変数が空かどうかの条件分岐を終了。
lock_file check
/usr/local/bin/kuro_libのlock_file関数にcheckという引数を付けて実行。
lock_file関数を見てみる。

lock_file関数

lock_file(){
lock_file関数はここから。
case $1 in
第1引数の内容で処理内容を分岐する。

checkの場合
check)
 [ -f "${LOCK}" ] && echo "${THIS_SCRIPT} : already runnign"
/var/lock/networkingが存在すれば、画面上に「${THIS_SCRIPT} : already runnign」と表示する。
ちなみに行末の「runnign」は「running」のスペルミスだろう。
 return 1
 ;;
戻り値に「1」を設定しlock_file関数を終了する。

createの場合
create)
 echo "${THIS_SCRIPT}" $2 > ${LOCK}
 ;;
「${THIS_SCRIPT} 第2引数」と/var/lock/networkingに書き込む。

deleteの場合
delete)
 rm -f ${LOCK}
 ;;
/var/lock/networkingを消去する。

delete_logの場合
delete_log)
 rm -f ${LOCK}.log
 ;;
/var/lock/networking.logを消去する。

それ以外の場合
*)
 ;;
何もしない。
esac
第1引数の内容による処理振り分けを終了する。
}
lock_file関数はここまで。
lock_file create

case "$1" in 
    start)
	start
	;;
    stop)
	stop
	;;
    restart)
	stop
	sleep 1
	start
	;;
    *)
	echo "Usage: $0 {start|stop|restart}"
	;;
esac

lock_file delete

exit 0