2011年1月6日木曜日

Fedora 14から無線LANが「つながらない」 via bcm43xx

Broadcom STA Wireless Driverを指示どおり入れたのに、無線LANが「つながらない」というか無線LANモジュールが「認識されない」問題についてのまとめ。
結論から言うと、私の特殊事情が原因だった。
ここ(http://www.broadcom.com/docs/linux_sta/README.txt)の指示どおり、RPMパッケージを導入。
$ su
# rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
これで、non-freeのRPMパッケージのレポジトリが利用可能になるので、
# yum update
# yum install kmod-wl
これで、ドライバの導入は終了。
が、しかし、認識されない。ネットで検索かけて海外フォーラムの記事を読んでも同様の問題はなかった模様。
/lib/modules/2.6.10-74.fc14.i686/extra/wlにwl.koはあるのに…。
で、ちょっとした拍子に、uname -rとタイプすると、
2.6.35.6-45.fc4.i686
と出てきた。原因はこれ。一応、確認すると、2.6.35.6-45.fc4.i686の方にはwl.koはなかった。
要するに、yumでインストールしたのは、カーネルが2.6.35.10-47.fc4.i686の方だけだったみたいで(何となくこれは分かってた)、しかも、私の環境はUbuntuとデュアルブートで、Ubuntu側がメインだから、Fedoraの新しいカーネルが導入されても自動でGrubのメニューは更新されてなかった。新しいカーネルが入ってるのに古いのでずっと起動してたというわけ。
ということで、Ubuntuに戻って、
$ sudo update-grub
で新しいカーネルのinitrdイメージをGrubに追加して、新たに加わったFedoraのカーネルから起動すると、何事もなかったかのように、無事、無線LANが認識された。この記事もFedoraから書いてます。やったね。Fedoraの新しいカーネルがインストールされたら、Ubuntuでupdate-grub。これは忘れてはいけないということでした。まぁ、/bootのパーティションを別にしておけばよかったんだろうけど。

2011年1月5日水曜日

UbuntuでFedoraのLive USBを作る!〜そしてUbuntuとFedoraのデュアルブート

Fedora Live CDから同Live USBをUbuntuでつくろうとして苦労したので、メモっておく。
とりあえず、ISOイメージをダウンロード。

syslinuxをインストールしておく。多分入ってるとは思うけど。(私は入ってた。)

$ sudo aptitude install sysylinux
で、/mntにイメージをマウントする。正直どこでもいいけど。
$ sudo mount <ISOイメージのパス> /mnt -o ro,loop -t iso9660
マウントすると、LiveOSというディレクトリがあるので、そこまで移動。
$ cd /mnt/LiveOS
そしたら、そこにあるあたかもUSBを作ってくれそうなのをroot権限で実行する。
$ sudo ./livecd-iso-to-disk <ISOイメージのパス> /dev/<USBのデバイスファイル(sdc1とか)>
md5がなんたらとか言ってくるけど、無視してEnterすればOK。
USBメモリに対応するデバイスファイルの名前が不明な場合、ポートに差し込むと自動でマウントしてくれるので、そのままで、dfで確認するといい。あとでも使うので、しっかりと。
そして、上のコマンドを実行する前に、USBメモリをアンマウントしないとだめ。
でまぁ、しばらく待ってると、Live USBメモリが完成しましたとか言うけど、差したままリブートかけても起動してくれなかった。正確にはboot:で止まる。vmlinuz0とか入れても、途中でkernel panicで止まる。
これは、syslinuxをやり直したら解消した。
$ sudo syslinux /dev/(USBのデバイスファイル)
これで、Live USB完成!めでたし、めでたし。
知ってたら大したことないんだけどね。知らなかったから、大変だった。Linux(Ubuntu)から他のLinux(Fedora)のLive USBを作るのがこんなに大変だなんて。Winから作ったほうが(Live USB Creatorで)断然楽とか…。

それに引換、デュアルブートは楽でしたよ。
フツーにインストールするだけ。無論、Ubuntuを上書きしちゃダメですよ。
あと、重要なのは、 ブートローダーのインストール先。Fedoraに割り当てたパーティションのパーティションの先頭(PBR)ってやつを選ばないと、Ubuntuが起動できなくなっちゃう。まぁ、戻せるとは思いますけど(下のをFedoraからやって、Ubuntuに戻ってGrubを再インストールするなりすれば)。
インストールを終えて再起動すると、Ubuntuが起動するはずなので、GRUBにFedoraを認識させる。
$ sudo update-grub
これでOK。ちなみに、Fedoraを消すときは、パーティションごと消しちゃって、同じくGRUBをアップデートしたらいけるはず。

参考URL
http://coffeecode.net/archives/223-Using-Fedoras-liveusb-creator-on-Ubuntu-Lucid-Lynx.html

2011年1月4日火曜日

最新のBroadcom STA Wireless DriverをdkmsでUbuntuへ

Ubuntuのレポジトリで配布されているBroadcom STA Wireless Driver(BCM43xx用/S10eの場合、BCM4312用)[5.60.48.36]がBroadcomのオフィシャルで公開されているもの(http://www.broadcom.com/support/802.11/linux_sta.php)[5.100.82.38]より古かったので、練習がてら新しいのに置き換えてみることにした。
とりあえず、ダウンロード。で、適当にディレクトリを作ってその中に展開。
$ tar zxvf hybrid-portsrc_x86_32-v5_100_82_38.tar.gz
とりあえず置き換えてみることにした。
$ make
$ sudo rmmod wl
$ cd /lib/modules/<現在のカーネル>/updates/dkms/
$ mv wl.ko wl.ko.old
$ sudo cp <さっきビルドした、wl.ko> wl.ko
$ sudo insmod wl.ko
うん、動いた。APも認識してくれたし。
だけど、カーネルがアップデートされるたびにこれをしないといけないのか?
そういや、カーネルアップデートするときに自動で組み込んでるよな。そういや、dkmsとかいう名前だったよな。
ってことでググったら、Ubuntu Japanese Wiki(https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo)にあった。これにしたがって作業する。
とりあえず、元の作業ディレクトリに戻って、makeしたのをcleanする。あと、一応いらないもの(README.txt)は消しておく。
$ make clean
$ rm README.txt 
ソースを展開したディレクトリごと、/usr/srcの下にコピーする。
$ sudo cp <ソースを展開したディレクトリ> /usr/src/ -r
古い方のドライバの名前に似せて、リネームしておく。そして、これをきちんと把握しておく。これ重要(後述)。
$ sudo mv <さっきのディレクトリ名> bcmwl-5.100.82.38
古いのはバージョンの後ろに+bdcomとか付いてたけど、もういいやってことで付けなかった。
で、dkms.confを古いのからコピってくる。
$ cd /usr/src
$ sudo cp bcmwl-5.60.48.36+bdcom/dkms.conf bcmwl-5.100.82.38/
dkms.confを編集する。
$ cd bcmwl-5.100.82.38
$ sudo vim dkms.conf
以下のように編集。
PACKAGE_VERSION="5.60.48.36+bdcom" => "5.100.82.38"
PATCHから始まる行をすべて#でコメントアウト(最初、コメントアウトしてなくて、dkmsがエラー吐いた。そりゃ、ないもん参照したってなぁ。)
wikiに従うと、dkms.confではPACKAGE_NAME(ここではbcmwl)とPACKAGE_VERSION(同5.100.82.38)とに一致するディレクトリ(同bcmwl-5.100.82.38)の中を読みに行くらしい。
これ以下の作業でもわかるように、このNAMEとVERSIONがdkmsでの管理情報になるよう。
ここからは、dkmsでの作業。
$ sudo dkms add -m bcmwl -v 5.100.82.38
$ sudo dkms build -m bcmwl -v 5.100.82.38
$ sudo dkms install -m bcmwl -v 5.100.82.38
(mはモジュール名、vはバージョンっぽい。) 
ここで、全部dkms 〜 completed って出たので喜んでwikiにしたがって、古いカーネルを再インストールしたら、dkmsが古い方(5.60.48.36)を自動的にインストールしてくれたorz
よく考えたら、wikiに書いてあるのは、インストールだけだった。更新じゃなかったお。
したがって、manを参考に手探りながら古いドライバをdkmsのツリーから外してやることに。
$ sudo dkms remove -m bcmwl -v 5.60.48.36 --all
インストールしているカーネルそれぞれすべて(--all)から、古いドライバを削除してくれる。
で、改めて、カーネルを再インストール。今度は成功した。
はじめから、dkms使ってやれば、よかったんやん、と自分で思ったのだが、予め展開してみて、ちゃんと動作するか確認するのが重要っぽい。結果的には合ってたそうな。ちゃんちゃん。
参考サイト
https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo

2011年1月1日土曜日

Ubuntu 10.10のカーネル再構築

一時はやめた、カーネルの再構築をやってみた。
(1)下準備
$ aptitude search linux-source
でパッケージ名を検索し、
$ sudo aptitude install linux-source-2.6.35
でソースをインストール、というかダウンロード。
カーネルビルドに必要なパッケージをインストール。
$ sudo aptitude install kernel-package build-essential libncurses5-dev libqt3-mt-dev
これで準備OK
(2)ソースの展開。
$ cd /usr/src
$ sudo tar jxvf linux-source-2.6.35.tar.bz2
/usr/src/linux-source-2.6.35というディレクトリにソースが展開される。
(3).configファイルのコピー
$ sudo cp /boot/config-2.6.35-24-generic .config
これで、現在のカーネルコンフィギュレーションファイルがコピーされる。
(4)カーネルコンフィギュレーション
$ sudo make oldconfig
これは、新しいカーネルコンフィギュレーションとの整合性を取るためのものらしい。本来なら、新しい設定が増えたりすると、質問してくるらしいが、今回はなかった。
$ sudo make menuconfig
ここからが、実際のカーネルコンフィギュレーション。設定項目が多すぎるので、詳細は割愛するが、私のように調子に乗って「関係ねーや」とか言っていろいろ切りすぎると、kernel panicで動かなくなるので要注意。
書いてある説明では、
[*] built-in =カーネルに組み込み
[ ] excluded =カーネルに組み込まない
<M> module =モジュールにする(多分、カーネルには組み込まないけど、必要になったら呼び出すってことだと思う)
<  >が付いてるところはモジュールにすることが可能。
Shift + / 、すなわち、?を入力する要領でキーを押してやれば、その設定項目のヘルプが参照可能。
/ で設定項目のサーチが可能。 
とりあえず、Processor type and features -> Processor familiyをいじったり、Intel CPUならAMDの、AMD CPUならIntelのを切る程度から始めたほうがいいかもしれない。
あと、Networking support -> Amateur Radio support はアマチュア無線のデバイスか何か知らないけど、それがないなら絶対にいらない。
Kernel hackingはすべて切っといてもカーネル開発をしないなら問題ないらしい。
絶対にいらない(他社製で、Dell laptop support)と思えるもの以外は<M>にしておけば、なんとかなる気がする。
(5)Extraversionの変更
$ sudo vim Makefile
で、EXTRAVERSION=の後ろをわかりやすく、かつ、標準のカーネルのそれとは変わるようにしておいたほうがいい。同じ名前にすると、インストール時に当然ややこしくなる。
この部分は、カーネルのバージョンの例えば、2.6.35-24-genericで言えば、「-24-generic」 に相当する。私は、EXTRAVERSION=.original0xにしておいた。
(6)omnibookのMakefileの編集
omnibookというモジュールのMakefileに問題があり、そのため、ビルドが止まってしまうことがあった。簡単に言うと、原因は、変数の扱いがミスってるために、makeが当該のファイル(sections.lds)を参照できないため。ということで、環境によっては大丈夫かもしれないが、一応、修正しておくのが良い。
$ gksudo gedit
でroot権限でgeditを実行し(vimの検索機能の使い方を知らないorzため)、ソースのディレクトリ内のubuntu/omnibook/Makefileを開く。
で、sectionsで検索をかけると、
EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds
とある。ここが問題の箇所。ちなみに、変数PDWの処理がおかしい(if で分岐すると、elseの時にはソースのパスが代入されないらしい)。
で、他のサイトでは、変数PWDにちゃんと正しい値が代入されるように書き換えていたが、めんどくさいので、汎用性はなくなるが、$(PWD)を消して、絶対パスを記してやればいいと思う。どうせ、他の場所でビルドしないし。
ってことで、この箇所を、
EXTRA_LDFLAGS += /usr/src/linux-source-2.6.35/ubuntu/omnibook/sections.lds
に書き換える。
(7)いよいよビルド。
$ sudo su -
で、rootになって、
# export CONCURRENCY_LEVEL=(CPU、コア、スレッドの数より+1の数)
で、makeに使う、CPUとかの数の上限を高めておくと並列でやってくれるらしい。AtomはHTTだが、どこまでいってもシングル・コアなので、効果は限られていただろうが、一応やった。おまじない程度。
# logout 
でrootを抜け、
$ sudo make-kpkg clean 
$ sudo make-kpkg --initrd --revision=(適当。ここでは日付にしておいた) kernel_image kernel_headers
でビルドが開始される。
(8)新しいカーネルのインストール
ビルドが完成すると、1つ上のディレクトリにdebパッケージが生成されるのでこれをインストール。
$ cd ..
$ sudo dpkg -i linux-image-2.6.35.(EXTRAVERSION)_(revision)_i386.deb linux-headers-2.6.35.(EXTRAVERSION)_(revision)_i386.deb
1組しかパッケージがないなら、めんどくさいから、これでもいい。
$ sudo dpkg -i *.deb 
これでインストールされる。GRUBも自動で更新される。
(9)再起動、そして新しいカーネル(?)
再起動をかければ、自動で新しいカーネルから起動するはず。
起動しない場合(kernel panicとか)、起動時にシフトキーを押してやれば、GRUBからカーネルを選択して起動できるようになるので、きちんと動いていたカーネルを選択して起動してやればいい。
カーネルの削除自体は、aptitudeとかを使ってやれば、普通のアプリと同じように削除できる。

カーネルを再構築して速く、軽くなったかって?分からんわw
ただ、カーネルコンフィギュレーションは面白かったし、いろんなことを処理してるんだなぁってことで、Linuxの仕組みにはちょっと明るくなった。

参照したサイト一覧
http://mwlab.net/2010/07/ubuntu-10-04-rebuild-kernel.html
http://ankyo.blog.so-net.ne.jp/2010-01-05
http://ky-hive.jp/blog/?p=257
http://www.itmedia.co.jp/enterprise/articles/0708/21/news018.html
omnibookのsections.ldsがおかしい原因について記したサイト
(参考にする前に絶対パスをしてしてやる解決策を見出したんだと、自分の臨機応変さについては主張しておきたい(笑))
http://ankyo.blog.so-net.ne.jp/2010-05-04-1