WPA2 protocol の FreeBSD SA2017年10月18日 11時55分54秒

FreeBSD-SA-17:07.wpa が出されている。

現在のところ、修正が出されてたのは 11 系のみ。11-STABLE、11.1-RELEASE に 11.0-RELEASE。ports からも wpa_supplicant と hostapd も提供されているので、そちらに切替えて回避する事も出来るようだ。10 系への影響と対応は現在も調査中とのこと。

buildworld と buildkernel と書かれてはいるが、カーネルへの修正はバージョン番号を上げただけなので、カーネルは急ぐ必要はない。

FreeBSD の一時スワップデバイスは tmpfs を nfs で export して swapon2017年09月25日 12時52分37秒

mdconfig の swapon はかなりオーバヘッドが多い。と言うか、ほとんどがオーバヘッドだ。

それに引き換え、あまり推奨されていない筈のNFS ファイルの swapon は、swap pager と NFS、そしてディスクの IO の値が一致する。ネットワークの帯域に多少は心配があっての、ファイルやデバイスへのアクセスは優秀で、ほぼ 100% の様だ。

これらを総合すると、swap 領域の圧迫の一時的な対処法は、別機からのサポートのようだ。メモリに余裕のあるシステムから、tmpfs を nfs エクスポートし、そこのファイルを直接 swapon をする。

また、大量のページングが発生している状況だと、スワップ領域も細切れになり、また、仮装メモリと実メモリのマッピングも随分と断片化する。ディスクが主体のスワップよりも、ネットワークと tmpfs のメモリアクセスの方が数倍も早くなる場合が多い。

NFS の export の部分を若干省略するが、大体の作業。

nfs-server $ mount -t swap dummy /mnt/tmp
nfs-server $ dd if=/dev/zero of=/mnt/tmp/swap bs=1M count=1 seek=9999
nfs-server $ vi /etc/export
nfs-server $ sh /etc/rc.d/nfsd onestart
swapping-machine $ mount -t nfs nfs-server:/mnt/tmp /mnt/swap
swapping-machine $ swapon /mnt/swap/swap

FreeBSD で NFS ファイルにスワップする2017年09月15日 11時56分57秒

FreeBSD では長らくの間、NFS ファイルをスワップに指定できるようになっている。FreeBSD の古いドキュメントを見付けると、4.x 以前はとても遅かったといった記述や、NFS はネットワークに左右されるので、勧められないとの記述もあることはある。

取り敢えず実例。NFS の export と mount の位置はあまり関係なく、個々の設定による。

$ mount -t nfs x.x.x.x:/swap /mnt/swap
$ dd if=/dev/zero of=/mnt/swap/swap1 count=1 seek=1200
$ swapon /mnt/swap/swap1
swapon にそのままファイルのパスを指定すれば良い。dd にて空のファイルを先に作った。
$ swapctl -l
$ systat -swap
Device:       1024-blocks     Used:
/dev/#NODEV     1229824    109580
Disk      1K-blocks   Used /0%  /10  /20  /30  /40  /50  /60  /70  /80  /90  /10
[NFS swap]  1229696 109580 XXXXX

sswapctl や systat などで、スワップの割り当てや利用量をみられる。しかし、残念ながらファイル名は表示されないので、覚えておかなければいけない。
$ swapoff /mnt/swap/swap1
スワップ領域を外す場合は、ファイル名で指定する。複数の NFS ファイルで複数の領域を割り当てる事は出来るが、swapoff はファイル名で指定なので、忘れたら swapoff 出来なくなる。

shutdown 時には、nfs の umount や swapoff -a のタイミングが結構微妙な様なので、出来るならば shutdown 前に swapoff をしておいた方が良さそうだ。

FreeBSD で lockd を後から起動したら mount をやり直す2017年04月24日 21時04分27秒

NFS v3 では、ファイルのロックは NFS 自体の実装では提供されていないので、別途 lockd デーモンを起動する。もし、NFS を
$ sh /etc/rc.d/nfsd onestart
等のように、手動で NFS を起動した場合に、lockd の起動を忘れることがある。

lockd デーモンも同じように起動する。

$ sh /etc/rc.d/nfsd onestart
lockd と nfsd デーモンは独立しているので、片方だけ起動しても自動的には起動しない。

lockd デーモンを起動する前に、既に mount されたファイルシステムには、ファイルロックが有効にはならないようだ。一度、umount して、mount すると、ロックが有効になった。

DEBUG カーネルなら ndis を動かせる2017年03月07日 13時20分12秒

デバッグを有効にしたカーネルを用い、以下の変更を加えると通信が出来る様にはなる。
Index: sys/dev/if_ndis/if_ndisvar.h
===================================================================
--- sys/dev/if_ndis/if_ndisvar.h        (revision 317316)
+++ sys/dev/if_ndis/if_ndisvar.h        (working copy)
@@ -155,9 +155,9 @@
        u_int                   ndis_80211:1,
                                ndis_link:1,
                                ndis_running:1;
+                       struct ifnet            *ifp;
        union {
                struct {                /* Ethernet */
-                       struct ifnet            *ifp;
                        struct ifmedia          ifmedia;
                        int                     ndis_if_flags;
                };
しかし、同じ変更を GENERIC カーネルで使うと、今度は kldload が失敗する。

問題はまだあるようだが、取り敢えず回避策は見付かった。一応システムを更新したら使い物にならない現状からは一歩前進。

NDIS を壊した net80211 の変更2017年02月01日 22時24分09秒

net80211 の変更のプロジェクトその変更部分。かなり大きいので一気に変更箇所を把握するのは無理。

net80211 を ifnet から切り離したが、NDIS は両方を扱うようになっているので、中途半端な変更で終ってしまったから壊れたようだ。wlan の処理から、イーサネット依存部分を切り離そうとしたらしい。

ndis でクラッシュする原因は分かった2017年01月30日 18時23分42秒

デバッグを有効にしたカーネルを使ったら比較的簡単に原因が浮かび上がってきた。カーネルスタックは、ロックの型が一致してないとの事。

少しカーネルに変更を加えて、構造体のアドレスを表示してみた。すると、全て同じアドレスでなければいけないのに、異なったアドレスを表示する箇所がある。

ifnet 構造体の ifp のアドレスがおかしい。if_ndisvar.h の ifnet の ifp 型が、ケーブル用と無線用で共に使われていたが、変更後に共有体の一部になった事が原因だ。

ndis のコード内で、ifp 型を受け取らなければいけない場所で、ieee80211com の構造体として、初期化された部分が渡されるので、渡された構造体が全く異なってしまっている。

FreeBSD の各種デバッグオプションを有効にし NDIS を観察2017年01月22日 12時52分06秒

NDIS が 11.0-RELEASE になって動かないが、あまり有効な手段を見付けられないので、取り敢えず FreeBSD の各種デバッグオプションを有効にして、カーネルを作ることにした。何らかのヒントが出てくれれば良いのだが。

カーネルの設定ファイルは他のものを読み込むことが出来る。

% cat /usr/src/sys/i386/conf/DEBUG 
include GENERIC

ident           GENERIC-DEBUG

#options        DEADLKRES               # Enable the deadlock resolver
options         INVARIANTS              # Enable calls of extra sanity checking
options         INVARIANT_SUPPORT       # Extra sanity checks of internal structures, required by INVARIANTS
options         WITNESS                 # Enable checks to detect deadlocks and cycles
options         WITNESS_SKIPSPIN        # Don't run witness on spinlocks for speed

options         DDB
options         KDB
include で GENERIC カーネルの設定を読み込み、DDB/KDB、INVARIANTS と WITNESS を有効にして、buildkernel KERNCONF=DEBUG。

再起動後に、ndis を試すと、ロックのエラーが表示された。

kernel: panic: mtx_lock() of spin mutex network driver @ /usr/src/sys/modules/if_ndis/../../dev/if_ndis/if_ndis.c:1849
kernel: cpuid = 0
kernel: KDB: stack backtrace:
kernel: #0 0xc0c81d3f at kdb_backtrace+0x4f
kernel: #1 0xc0c3f1d5 at vpanic+0x115
kernel: #2 0xc0c3f0b9 at kassert_panic+0xd9
kernel: #3 0xc0c1e3c3 at __mtx_lock_flags+0x183
kernel: #4 0xc73b4d08 at ndis_start+0x38
kernel: #5 0xc73b1021 at ndis_starttask+0x21
kernel: #6 0xc6ceaea1 at _end+0x4f2afd1
kernel: #7 0xc0bffd6e at fork_exit+0x7e
kernel: #8 0xc119af50 at fork_trampoline+0x8

NDIS に変更が行われたのは 2015 年の夏2017年01月05日 12時54分41秒

NDIS が FreeBSD 11.0-RELEASE から使えなくなっている。current メーリングリストで、テスト募集中とあったのを見た覚えがあったので、見返してみた。メールは 2015 年の夏だった。どうやら一人だけ、テストをしてみようとした人はいたみたいだったが、動作するデバイスを持っていないようだった。

当時は当該機 も current を使っていなかったので、目に止めただけだった。これに返信しても、返事が貰えるかは定かではないが、とりあえず駄目元で返信を試みた。

ndis のデバッグを有効にする2016年12月06日 13時24分20秒

NDIS はカーネルモジュールとして読み込まれるので、素のカーネルの sysctl を探しても出て来ない。ndis モジュールを読み込んだ後に debug.ndis が変更できる。
$ sysctl debug.ndis=1
debug.ndis: 0 -> 1