前回、N-6300のファームをロードさせ、wlan0を認識させるところまでは進んだ。いよいよ無線LANの設定ツールiwのビルドをしようと思う。

【関連記事】
【組込ボードで無線LAN】②(無線LANカードN-6300を組込ボードに接続するには?)
【組込ボードで無線LAN】⑥(iwのビルド:前編)
【組込ボードで無線LAN】⑧(iwのビルド:後編-1)
  • iwって何?
iw(Linux)を読んだ。IEEE 802.11規格の無線LANネットワークの設定を行うためのコマンドラインユーティリティとある。私がLinuxの無線LANドライバを始めて触ったのはカーネル2.4から2.6への過渡期で、net_device(WIRELESS_EXT)に依存するwireless-toolsが一般的だったが、最近はnetlinkに依存するiwに置き換わっているのだ。
iwは、IEEE 802.11規格の無線LANネットワークの設定を行うためのコマンドラインユーティリティである。wireless-tools(英語版)の置き換えを目標に開発が行われている。

iwは、ISCライセンスの下で配布されているフリーソフトウェアで、iwlwifi(英語版)など多くの無線ドライバに対応している。WPAで暗号化された無線ネットワークに接続する場合は、wpa_supplicantの使用が必要になる。
Ubuntu14(開発PC)でiwと打つとヘルプが表示される。which iwと打ったら/sbin/iwに居るみたい。
$ which iw
/sbin/iw
共有ライブラリの依存関係を表示するlddコマンドを打ってみた。/lib/x86_64-linux-gnu/にライブラリがインストールされてるみたい。
$ ldd /sbin/iw
        linux-vdso.so.1 =>  (0x00007ffebdeb9000)
        libnl-genl-3.so.200 => /lib/x86_64-linux-gnu/libnl-genl-3.so.200 (0x00007f79be756000)
        libnl-3.so.200 => /lib/x86_64-linux-gnu/libnl-3.so.200 (0x00007f79be53b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79be172000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f79bdf54000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f79bdc4e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f79be95c000)
ライブラリってどうやって検索されるのか?共有ライブラリへパスを通すを読んだ。
①LD_LIBRARY_PATHにパスを通す
②システム全体にパスを通す
の2種類あるみたい。

まず①のLD_LIBRARY_PATHをechoしてみたが、何も表示されない(設定されてない)ので、ウチの環境は②であると考えた。
$ echo $LD_LIBRARY_PATH

②のシステム全体にライブラリパスを通すには/etc/ld.so.confという設定ファイルに登録するようなので、/etc/ld.so.confを開いたところ…。
$ sudo vi /etc/ld.so.conf
という感じ。他の*.confをインクルードしてるみたい。階層が深いね。
include /etc/ld.so.conf.d/*.conf
他の*.confをリスト表示。libnlが格納されているx86_64-linux-gnu.confの*.confもあるね。
$ ls /etc/ld.so.conf.d
合計 20
-rw-rw-r-- 1 root root 38  3月 24  2014 fakeroot-x86_64-linux-gnu.conf
-rw-r--r-- 1 root root 44  8月 10  2009 libc.conf
-rw-r--r-- 1 root root 68  4月 12  2014 x86_64-linux-gnu.conf
lrwxrwxrwx 1 root root 43  2月 17  2019 x86_64-linux-gnu_EGL.conf -> /etc/alternatives/x86_64-linux-gnu_egl_conf
lrwxrwxrwx 1 root root 42  2月 17  2019 x86_64-linux-gnu_GL.conf -> /etc/alternatives/x86_64-linux-gnu_gl_conf
-rw-r--r-- 1 root root 56  1月 16  2018 zz_i386-biarch-compat.conf
-rw-r--r-- 1 root root 58  1月 16  2018 zz_x32-biarch-compat.conf
/etc/ld.so.conf.d/x86_64-linux-gnu.confを開いてみたところ…。libnl-3.so.200libnl-3.so.200 が居る/lib/x86_64-linux-gnu/が書かれている。この仕組みでライブラリが探せるわけだ。
$ sudo vi /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
  • iwをUbuntu14(開発PC)で練習ビルドする
さて、iwをまずUbuntu14(x86_64の開発PC)で練習ビルドすることにした。まずソースコードを入手するためiw(Linux)を調べたところ、iw(Linux)にgitのリポジトリも書いてあった。
さらに参照先のgitリポジトリにgitのクローンURLが書いてあった。(最近はURLじゃなくてURIって言うんですよね。でもなんか慣れなくてついついURLって言ってしまう私です
git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git
Ubuntu14(開発PC)でiwをgit clone。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git
Cloning into 'iw'...
remote: Counting objects: 2984, done.
remote: Compressing objects: 100% (219/219), done.
remote: Total 2984 (delta 127), reused 0 (delta 0)
Receiving objects: 100% (2984/2984), 734.38 KiB | 657.00 KiB/s, done.
Resolving deltas: 100% (1989/1989), done.
Checking connectivity... done.
カレントディレクトリにiwというディレクトリが出来た。lsしてみる。
$ ls -l ./iw
合計 768
-rw-rw-r-- 1 pavement1234 pavement1234    491  9月 21 23:26 Android.mk
-rw-rw-r-- 1 pavement1234 pavement1234   1871  9月 21 23:26 CONTRIBUTING
-rw-rw-r-- 1 pavement1234 pavement1234    849  9月 21 23:26 COPYING
-rw-rw-r-- 1 pavement1234 pavement1234   2915  9月 21 23:26 Makefile
-rw-rw-r-- 1 pavement1234 pavement1234    464  9月 21 23:26 README
-rw-rw-r-- 1 pavement1234 pavement1234   3246  9月 21 23:26 ap.c
-rw-rw-r-- 1 pavement1234 pavement1234   6708  9月 21 23:26 bitrate.c
-rw-rw-r-- 1 pavement1234 pavement1234   3796  9月 21 23:26 bloom.c
-rw-rw-r-- 1 pavement1234 pavement1234   7241  9月 21 23:26 coalesce.c
-rw-rw-r-- 1 pavement1234 pavement1234   5146  9月 21 23:26 connect.c
-rw-rw-r-- 1 pavement1234 pavement1234   1199  9月 21 23:26 cqm.c
-rw-rw-r-- 1 pavement1234 pavement1234  33273  9月 21 23:26 event.c
-rw-rw-r-- 1 pavement1234 pavement1234   4715  9月 21 23:26 ftm.c
-rw-rw-r-- 1 pavement1234 pavement1234   2445  9月 21 23:26 genl.c
-rw-rw-r-- 1 pavement1234 pavement1234   3507  9月 21 23:26 hwsim.c
-rw-rw-r-- 1 pavement1234 pavement1234   3206  9月 21 23:26 ibss.c
-rw-rw-r-- 1 pavement1234 pavement1234   1594  9月 21 23:26 ieee80211.h
-rw-rw-r-- 1 pavement1234 pavement1234  28980  9月 21 23:26 info.c
-rw-rw-r-- 1 pavement1234 pavement1234  17900  9月 21 23:26 interface.c
-rw-rw-r-- 1 pavement1234 pavement1234   1117  9月 21 23:26 iw.8
-rw-rw-r-- 1 pavement1234 pavement1234  13970  9月 21 23:26 iw.c
-rw-rw-r-- 1 pavement1234 pavement1234   7725  9月 21 23:26 iw.h
-rw-rw-r-- 1 pavement1234 pavement1234   7874  9月 21 23:26 link.c
-rw-rw-r-- 1 pavement1234 pavement1234   8476  9月 21 23:26 measurements.c
-rw-rw-r-- 1 pavement1234 pavement1234  14303  9月 21 23:26 mesh.c
-rw-rw-r-- 1 pavement1234 pavement1234   3662  9月 21 23:26 mgmt.c
-rw-rw-r-- 1 pavement1234 pavement1234   6048  9月 21 23:26 mpath.c
-rw-rw-r-- 1 pavement1234 pavement1234   1941  9月 21 23:26 mpp.c
-rw-rw-r-- 1 pavement1234 pavement1234  11089  9月 21 23:26 nan.c
-rw-rw-r-- 1 pavement1234 pavement1234 280715  9月 21 23:26 nl80211.h
-rw-rw-r-- 1 pavement1234 pavement1234    851  9月 21 23:26 ocb.c
-rw-rw-r-- 1 pavement1234 pavement1234    904  9月 21 23:26 offch.c
-rw-rw-r-- 1 pavement1234 pavement1234    669  9月 21 23:26 p2p.c
-rw-rw-r-- 1 pavement1234 pavement1234  22269  9月 21 23:26 phy.c
-rw-rw-r-- 1 pavement1234 pavement1234   1693  9月 21 23:26 ps.c
-rw-rw-r-- 1 pavement1234 pavement1234   2893  9月 21 23:26 reason.c
-rw-rw-r-- 1 pavement1234 pavement1234   7553  9月 21 23:26 reg.c
-rw-rw-r-- 1 pavement1234 pavement1234    825  9月 21 23:26 roc.c
-rw-rw-r-- 1 pavement1234 pavement1234  59949  9月 21 23:26 scan.c
-rw-rw-r-- 1 pavement1234 pavement1234     45  9月 21 23:26 sections.c
-rw-rw-r-- 1 pavement1234 pavement1234   5601  9月 21 23:26 sha256.c
-rw-rw-r-- 1 pavement1234 pavement1234   1709  9月 21 23:26 sha256.h
-rw-rw-r-- 1 pavement1234 pavement1234  28210  9月 21 23:26 station.c
-rw-rw-r-- 1 pavement1234 pavement1234   3732  9月 21 23:26 status.c
-rw-rw-r-- 1 pavement1234 pavement1234   2751  9月 21 23:26 survey.c
-rw-rw-r-- 1 pavement1234 pavement1234  38669  9月 21 23:26 util.c
-rw-rw-r-- 1 pavement1234 pavement1234   3262  9月 21 23:26 vendor.c
-rwxrwxr-x 1 pavement1234 pavement1234   1103  9月 21 23:26 version.sh
-rw-rw-r-- 1 pavement1234 pavement1234  12793  9月 21 23:26 wowlan.c
とりあえずmakeしてみたがエラーで瞬殺。libnlが見つからないと言っている。
$ cd iw
$ make
Makefile:75: *** Cannot find development files for any supported version of libnl.  中止.
READMEを開いた。えーと、makeが失敗したらlibnlが見つかるように環境変数PKG_CONFIG_PATHを設定してください、みたいな感じのことが書いてある気がする。

This is 'iw', a tool to use nl80211.


To build iw, just enter 'make'. If that fails, set the
PKG_CONFIG_PATH environment variable to allow the Makefile
to find libnl.


'iw' is currently maintained at http://git.sipsolutions.net/iw.git/,
some more documentation is available at
http://wireless.kernel.org/en/users/Documentation/iw.

Please send all patches to Johannes Berg <johannes@sipsolutions.net>
and CC linux-wireless@vger.kernel.org for community review.

(Google和訳)

これは、nl80211を使用するツールである「iw」です。


iwをビルドするには、「make」と入力します。 それが失敗した場合、設定
Makefileを許可するPKG_CONFIG_PATH環境変数
libnlを見つけます。


「iw」は現在http://git.sipsolutions.net/iw.git/で管理されています。
さらにいくつかのドキュメントが利用可能です
http://wireless.kernel.org/en/users/Documentation/iw。

すべてのパッチをJohannes Berg <johannes@sipsolutions.net>に送信してください。
コミュニティレビュー用のCC linux-wireless@vger.kernel.org。
$PKG_CONFIG_PATHをechoしたが、何も出てこない(=設定されてない)。

が、そもそもPKG_CONFIG_PATHって何かよくわかってない。PKG_CONFIG_PATHで検索かけたところpkg-configという単語が出てきた。さらにpkg-configを調べてみたところ、PKG_CONFIG_PATHには*.pcというファイルを置かなきゃならないみたい。
pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返す。
さらに、こんなことが書いてある。一般的には/usr/lib/pkgconfig/に*.pcファイルを置くのですね。
*.pcは普通は/usr/lib/pkgconfig/以下に作成され、pkg-config が読みにいくデフォルトのパスもここだが、/usr/share/pkgconfigの場合もあるかもしれない。 
*.pcの作り方を知りたい。最低限何を書けばよいのだろう。
取り急ぎ、pkg-configに対応するを読んだ。さらにpkg-config をクロス開発で使うも読んだが、イマイチ書き方がわからない。さらに/usr/lib/pkgconfig/*.pcも読んだが、それぞれ微妙に書き方が異なっていて、標準的な書き方が見いだせない。段々ハマり始めた感じ。ズブズブ…。
  • ちょっと一歩引いて整理してみよう。
iwのREADMEにはこんなことが書いてあった。
「iw」は現在http://git.sipsolutions.net/iw.git/で管理されています。
さらにいくつかのドキュメントが利用可能です
http://wireless.kernel.org/en/users/Documentation/iw。
https://wireless.wiki.kernel.org/en/users/documentation/iwを開いたところ、Linux Wirelessというサイトのabout iwというページだった。ここにiwのビルドに関するヒントらしきものが書いてあり、更にヒントとなりそうなURLリンクが書いてある。
Build requirements

    libnl >= libnl1
    libnl-dev >= libnl-dev-1
    pkg-config Using iw requires you to have libnl, the first working version is 1.0 pre8 as this release introduced genl, Generic Netlink, which nl80211 relies on. If your distribution's libnl is a wrong version then you'll have to download and compile libnl yourself for now (http://www.infradead.org/~tgr/libnl/).

(Google和訳)
ビルド要件

     libnl> = libnl1
     libnl-dev> = libnl-dev-1
     pkg-config iwを使用するにはlibnlが必要です。このリリースでは、nl80211が依存するgenl、Generic Netlinkが導入されたため、最初の作業バージョンは1.0 pre8です。 ディストリビューションのlibnlのバージョンが間違っている場合は、今のところlibnlをダウンロードしてコンパイルする必要があります(http://www.infradead.org/~tgr/libnl/)。

http://www.infradead.org/~tgr/libnl/を開いたところ、Netlink Protocol Library Suite (libnl)というページだった。SWの階層構造が説明されており、めちゃめちゃわかりやすいがpkg-configを解決できそうな記載はなかった(pkg-configでページ内を検索しただけだが)。

1

なかなか突破口が開けない。こういうときは、一旦寝るに限る…。

続く







続く

スポンサードリンク