「networking.sh」の編集履歴(バックアップ)一覧に戻る
networking.sh - (2008/01/27 (日) 21:29:08) のソース
標準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関数はここから。 > 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} > ;; > delete) > rm -f ${LOCK} > ;; > delete_log) > rm -f ${LOCK}.log > ;; > *) > ;; > esac > > } 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 ----