標準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を代入。
BASEという変数を用意し、そこに'basename /sbin/dhcpcd'を代入。
LOCKという変数を用意し、そこに/var/lock/networkingを代入。
. /usr/local/bin/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内の
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つの関数の記述になる。
ここからは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
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を設定。
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つの命令をパイプでつないでいるのだが、ひとつづつ見てみる。
3つの命令をパイプでつないでいるのだが、ひとつづつ見てみる。
cat /proc/net/route
/proc/net/routeを読み込んで次の命令に渡す。
この/procにはprocファイルシステムがマウントされていて、カーネルの各種統計情報を閲覧することができるが、/proc/net/routeにはIP経路情報が記載されている。
このコマンドを実行してみると
この/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」のことだとわかる。
第4パラメータとは、上の表から「Flags」のことだとわかる。
grep 0003
「0003」という文字列を検索している。
実際に「0003」という文字列があったので、この場合、TMP変数には「0003」と入る。
フラグ「0003」とは「経路は有効でゲートウェイを使用する」という内容だ。
今の例で言うなら、宛て先が「0.0.0.0/0」なので選ばれた経路はデフォルト経路である。
つまり、この一連の命令は「デフォルト経路をeth0が持っているかどうか」を調べていたのだ。
なければ空白が入る。
実際に「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内に一斉にパケットを送信する手段である。
コメントアウトされている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」となる。
結果的には「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」を代入。
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」を書き込み。
/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の実行。
/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」となる。
結果的には「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という文字列を検索している。その結果を次に渡す。
/proc/mountsから/dev/rootという文字列を検索している。その結果を次に渡す。
2つめのgrep
渡された結果からnfsという文字列を検索している。
これらはつまり「/dev/rootがnfs形式でマウントされているかどうか」を調査しているということだ。
この結果は「(空)」か「nfs」というどちらか2つしかない。
渡された結果からnfsという文字列を検索している。
これらはつまり「/dev/rootがnfs形式でマウントされているかどうか」を調査しているということだ。
この結果は「(空)」か「nfs」というどちらか2つしかない。
if [ "$TMP" != "" ]; then
TMP変数が空でなければ以下を実行。
つまり/dev/rootがnfs形式でマウントされていれば、という条件だ。
つまり/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(){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