問題現象
設備裏的http server運行了CGI,在設置eth0爲DHCP之後,怎麼也沒有默認路由信息。CGI調用的腳本最終是使用udhcpc,在shell裏手工運行udhcpc總是能夠自動設置默認路由。
問題解決
這個小小問題折騰了近兩個小時!
從現象看,應該在手工運行udhcpc和CGI間接調用udhcpc之間差異着手。
一開始我的猜測是運行用戶不同?CGI間接調用沒有寫路由權限?
後來發現不是這樣。
好吧,看源碼吧,好在udhcpc源碼還算小巧,很快就看完了。
udhcpc創建RAW socket,廣播discover並解析應答,收到應答之後運行/usr/share/udhcpc/default.script腳本設置IP、路由、DNS。
[root@ ~]# cat /usr/share/udhcpc/default.script
#!/bin/sh
# udhcpc script edited by Tim Riker <[email protected]>
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
case "$1" in
deconfig)
/sbin/ifconfig $interface 0.0.0.0
;;
renew|bound)
/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
if [ -n "$router" ] ; then
echo "deleting routers"
while route del default gw 0.0.0.0 dev $interface ; do
:
done
for i in $router ; do
route add default gw $i dev $interface
done
fi
echo -n > $RESOLV_CONF
[ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
for i in $dns ; do
echo adding dns $i
echo nameserver $i >> $RESOLV_CONF
done
;;
esac
exit 0
看出問題來了沒?並沒有!起碼我沒有。
跟蹤到ps有/usr/share/udhcpc/default.script bound 進程,udhcpc裏的RAW socket還是盡職盡責的,網關,DNS都獲取到了,但爲啥DNS設置了偏偏默認路由不設置!
當我把答案說出來,這問題就簡單得令人髮指了!
原因是route add default gw $i dev $interface這條命令根本沒有運行,找不到route!在CGI運行環境裏環境變量沒有配置/sbin/
[root@ ~]# which ifconfig route
/sbin/ifconfig
/sbin/route
Tim Riker <[email protected]>老人家是不是故意埋個坑^_^,ifconfig和route都是在/sbin下,偏偏ifconfig給帶路徑,route不帶!我要寫個郵件給他!
當然,其實這事不能怪人家。
好吧,udhcpc和udhcpd源碼剖析,另文,先欠着。