「networking.sh」の編集履歴(バックアップ)一覧に戻る
networking.sh - (2008/01/26 (土) 00:55:06) のソース
標準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変数 を使用するためだ。 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を読み込んで次ぎの命令に渡す。 このコマンドを実行してみると |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」とは「経路は有効でゲートウェイを使用する」という内容だ。 なければ空白が入る。 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を追加する。 つまりはローカルのブロードキャストを設定したことになる。 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 /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 ----