vine-users ML アーカイブ



[vine-users:057894] ifup の異常終了

  • From: Hisao Yamada <yy@xxxxxxxxxxxxxxxx>
  • Subject: [vine-users:057894] ifup の異常終了
  • Date: Sun, 26 Jan 2003 14:22:31 +0900
 初めて投稿します.Vine Linux 2.6 をノートパソコンにインストール
しましたが,Cardbusネットワークカード(FNW-3603-TX)をHotPlugできず,
原因を調べた結果,以下のことがわかりました.ネット上で検索しました
が同じ記事が見つからなかったので,まだ知られていない可能性もあると
考えて報告することにしました.

『現象の説明』
FNW-3603-TX には RealTek RTL-8139 が使われています.Vine Linux 2.6
では,このチップ用のドライバー 8139too.c のコード中に FNW-3603-TX
も登録されているので,カードを差し込むと,最初から認識されます.
ところが,/etc/sysconfig などに,必要なファイルが揃っていても,
ネットワークインタフェースは構成されません.しかも,カードの挿入後
に改めて ifup eth0 などと入力すると,ネットワークインタフェースが
正しく構成されます.

『解決法』
この問題は,/etc/sysconfig/network-scripts/network-functions の
関数 is_available () の中の
LC_ALL= LANG= ip -o link | grep -q $1
を
LC_ALL= LANG= ip -o link | grep $1 >/dev/null 2>&1
に修正することで解決できることがわかりました.

『原因』
この現象の起きる理由を詳しく調べました.
Vine Linux 2.6 では,cardbusのネットワークカードを差し込むと
HotPlug機能により /sbin/murasaki.pci が必要なドライバーモジュール
(FNW-3603-TXの場合は 8139too.o)をロードし,次に /sbin/murasaki.net
により ifup eth0 (インタフェースが1つの場合)が実行されてインタフェース
が構成されるようになっています.このことは,/var/log/messages への
出力と Vine Linux 2.6 のソースコードに含まれている
murasaki-0.5.4-1vl4.src.rpm の内容などからわかります.この ifup eth0
が異常終了するため,インタフェースが構成されません.
/sbin/ifup eth0 が実行されると ifup (スクリプトファイル) の中の

is_available ${REALDEVICE} || {
if [ "$?" = "1" ] ; then
echo $"$alias device does not seem to be present,
delaying ${DEVICE} initialization."
exit 1
else
exit 0
fi
}

のところで /etc/sysconfig/network-scripts/network-functions の関数

is_available ()
{
LC_ALL= LANG= ip -o link | grep -q $1
if [ "$?" = "1" ]; then
alias=`modprobe -c | awk "/^alias $1 / { print \\$3 }"`
if [ -z "$alias" -o "$alias" = "off" ]; then
return 2
fi
modprobe $alias >/dev/null 2>&1|| {
return 1
}
else
return 0
fi
}

が呼ばれますが,grep -q $1 ($1 は eth0 です) の終了コードが1になり
(0になるはずが後述の理由で1になってしまいます),その後の return 2
または return 1 が実行されてしまいます.(私の環境では $alias に
off が代入されるので return 2 が実行されます.$alias が実在する
モジュールを表していれば,return 文は実行されずに関数を抜けます)
その結果 is_available ${REALDEVICE} が偽になり || 以下が実行され
return 2 のときは $? = 2 なので,無言のまま exit 0 で終了します.
問題なのは grep -q $1 の終了コードが1になることですが,kernel
から実行されるために,ifup の実行中に標準出力がないことが原因に
なっているように思います.このことは,この部分を
grep -q $1 >/tmp/dummy
などにすると ifup が異常終了しなくなることからも想像できます.
コマンドラインから実行したときには,標準出力があるので異常終了
しないのでしょう.
私はこれまで Red Hat Linux 7.2 を使っていましたが,同じようなことは,
そこでも起きていたようです.ただ,RHL7.2 では,grep -q $1 の終了
コードが2だったため, return 0 が実行され,問題が現れなかったようです.
2が返されることは grep -q $1 の直後に echo $? >/tmp/result を挿入
した結果,わかりました.異常な動作を説明したので,わかり難かった
かもしれませんが,やっとカードを使えるようになったので,私にとって
は価値のある修正でした.