このブログはURLが変更になりました

新しいブログはこちら→ https://matsuu.hatenablog.com/

「10行でできる高精度ハードウェア自動認識」の高速化

仙石浩明の日記: 10行でできる高精度ハードウェア自動認識 (initramfs の init を busybox だけで書く)

すばらしい。確かに modules.alias を使う方が、簡単かつ確実に必要なモジュールを読み込むことができそう。さっそくこの方法を使って initramfs の init スクリプトを書き直してみた。

tmp=/tmp/dev2mod
echo 'dev2mod(){ while read dev; do case $dev in' > $tmp
sed 's/^alias  *\([^ ]*\)  *\(.*\)/\1)modprobe \2;;/' \
    /lib/modules/`uname -r`/modules.alias >> $tmp
echo 'esac; done; }' >> $tmp
. $tmp
rm $tmp
cat /sys/bus/*/devices/*/modalias | dev2mod

sedは遅いのでawkで。ついでに.$$を入れておく。

tmp=/tmp/dev2mod.$$
echo 'dev2mod(){ while read dev; do case $dev in' > $tmp
awk '/alias/{ print $2")modprobe "$3";;"}' \
    /lib/modules/`uname -r`/modules.alias >> $tmp
echo 'esac; done; }' >> $tmp
. $tmp
rm $tmp
cat /sys/bus/*/devices/*/modalias | dev2mod

コメント行がなくなっていい感じ。文字数も少なくてすむのでちょっと省エネ。
比較すると、

# time ./dev2mod
real    0m1.054s
user    0m0.980s
sys     0m0.056s

# time ./dev2mod_awk 
real    0m1.006s
user    0m0.964s
sys     0m0.028s

あまり早くならなかった。ネックはそこじゃない。awkのreadlineあたりを使えばもっと良くなるかも。
でもよりよい実装が思い付かなかった。ダメだな俺。
手元のawkGNU awkbusyboxawkは未確認。busyboxawkだと遅くなったりして。