current - Hans Petter Selasky氏が開発したUSB4BSD USBスタックが、Alfred Perlstein氏によってFreeBSDへマージされました。USB4BSDの導入によって次の機能や特徴が実現されます。
新しいmutexが有効になったUSB APIの提供
多くのUSBドライバがGiantロックフリーで動作するようになる
Linux USBカーネル互換レイヤの提供
ドライバがロードされないという問題を解決することになる新しいUGENバックエンドとlibusbライブラリの提供
USB設定を簡単にするusbconfigユーティリティの導入
スプリットトランザクションのフルサポート(ハイスピードUSBハブで動作しているUSBオーディオデバイスがフルスピードで動作するようになる)
HS ISOCトランザクションのフルサポート(HS Webカメラデバイスドライバの開発が可能になる)
キャッシュフラッシュやバッファインバリデートなど、組み込み環境におけるUSB機能のサポート
USBディスクリプタの安全なパースの実現
USBデバイスサイドモード(USBガジェットモード)のサポート
I/Oベクタに似たUSB転送のサポートでスループットの向上と割り込みの低下
マージされたUSB4BSDはまだデフォルトでは有効になりません。次のように既存のUSBスタックを無効にして新しくマージされたUSB4BSDを有効にするカーネル設定ファイルを作成します。たとえばここでは/sys/i386/conf/CURRENTファイルとして用意したものとします。
リスト1 USB4BSDを有効にするためのカーネル設定ファイルの例: /sys/i386/conf/CURRENT
include GENERIC
ident CURRENT
# disable legacy USB stack
nodevice uhci # UHCI PCI->USB interface
nodevice ohci # OHCI PCI->USB interface
nodevice ehci # EHCI PCI->USB interface (USB 2.0)
nodevice usb # USB Bus (required)
nodevice udbp # USB Double Bulk Pipe devices
nodevice ugen # Generic
nodevice uhid # "Human Interface Devices"
nodevice ukbd # Keyboard
nodevice ulpt # Printer
nodevice umass # Disks/Mass storage - Requires scbus and da
nodevice ums # Mouse
nodevice ural # Ralink Technology RT2500USB wireless NICs
nodevice rum # Ralink Technology RT2501USB wireless NICs
nodevice zyd # ZyDAS zb1211/zb1211b wireless NICs
nodevice urio # Diamond Rio 500 MP3 player
nodevice uscanner # Scanners
# USB Serial nodevices
nodevice ucom # Generic com ttys
nodevice u3g # USB-based 3G modems (Option, Huawei, Sierra)
nodevice uark # Technologies ARK3116 based serial adapters
nodevice ubsa # Belkin F5U103 and compatible serial adapters
nodevice uftdi # For FTDI usb serial adapters
nodevice uipaq # Some WinCE based devices
nodevice uplcom # Prolific PL-2303 serial adapters
nodevice uslcom # SI Labs CP2101/CP2102 serial adapters
nodevice uvisor # Visor and Palm devices
nodevice uvscom # USB serial support for DDI pocket's PHS
# USB Ethernet, requires miibus
nodevice aue # ADMtek USB Ethernet
nodevice axe # ASIX Electronics USB Ethernet
nodevice cdce # Generic USB over Ethernet
nodevice cue # CATC USB Ethernet
nodevice kue # Kawasaki LSI USB Ethernet
nodevice rue # RealTek RTL8150 USB Ethernet
nodevice udav # Davicom DM9601E USB
# enable USB4BSD USB stack
# USB core support
device usb2_core
# USB controller support
device usb2_controller
device usb2_controller_ehci
device usb2_controller_ohci
device usb2_controller_uhci
# USB mass storage support
device usb2_storage
device usb2_storage_mass
# USB ethernet support, requires miibus
device usb2_ethernet
device usb2_ethernet_aue
device usb2_ethernet_axe
device usb2_ethernet_cdce
device usb2_ethernet_cue
device usb2_ethernet_kue
device usb2_ethernet_rue
#device usb2_ethernet_dav
# USB wireless LAN support
device usb2_wlan
device usb2_wlan_rum
device usb2_wlan_ral
device usb2_wlan_zyd
# USB serial device support
device usb2_serial
device usb2_serial_ark
device usb2_serial_bsa
device usb2_serial_bser
device usb2_serial_chcom
device usb2_serial_cycom
device usb2_serial_foma
device usb2_serial_ftdi
device usb2_serial_gensa
device usb2_serial_ipaq
device usb2_serial_lpt
device usb2_serial_mct
device usb2_serial_modem
device usb2_serial_moscom
device usb2_serial_plcom
device usb2_serial_visor
device usb2_serial_vscom
# USB bluetooth support
device usb2_bluetooth
#device usb2_bluetooth_ng
# USB input device support
device usb2_input
device usb2_input_hid
device usb2_input_kbd
device usb2_input_ms
# USB sound and MIDI device support
#device usb2_sound
コミットログに表示されているUSB4BSDデバイスのうちusb2_ethernet_dav、usb2_bluetooth_ng、usb2_soundはそのままではビルドできないのでとりあえずはずしておきます。
ベンチマークを実施する場合は、次のようにデバッグオプションを無効にする設定を追加してからカーネルを再構築してみてください。CURRENTはデフォルトではデバッグ機能が有効になっているため、ベンチマーク試験を実施する場合にはデバッグ機能を無効化する必要があります。
リスト2 ベンチマークをとる場合はデバッグ機能の無効化設定も追加しておく
# disable - Debugging for use in -current
nooptions KDB
nooptions DDB
nooptions GDB
nooptions INVARIANTS
nooptions INVARIANT_SUPPORT
nooptions WITNESS
nooptions WITNESS_SKIPSPIN
USB4BSDを有効にする前とした後のdmesg(8)の出力からUSBに関する部分を抜粋します。USB4BSDではUSBからGiant Lockの表記が解除されていること、バスの通信速度として「12Mbps Full Speed USB v1.0」と「480Mbps High Speed USB v2.0」が表示されていることに注目してください。
リスト3 FreeBSDの従来のUSBスタック出力 dmesg(8)
uhci0: <Intel 82801H (ICH8) USB controller USB-D> port 0x30c0-0x30df irq 16 at device 26.0 on pci0
uhci0: [GIANT-LOCKED]
uhci0: [ITHREAD]
usb0: <Intel 82801H (ICH8) USB controller USB-D> on uhci0
usb0: USB revision 1.0
uhub0: <Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1> on usb0
uhub0: 2 ports with 2 removable, self powered
ehci0: <Intel 82801H (ICH8) USB 2.0 controller USB2-B> mem 0x52225c00-0x52225fff irq 18 at device 26.7 on pci0
ehci0: [GIANT-LOCKED]
ehci0: [ITHREAD]
リスト4 USB4BSDによる新しいUSBスタック出力 dmesg(8)
uhci0: <Intel 82801H (ICH8) USB controller USB-D> port 0x30c0-0x30df irq 16 at device 26.0 on pci0
uhci0: [ITHREAD]
uhci0: LegSup = 0x0f10
usbus0: <Intel 82801H (ICH8) USB controller USB-D> on uhci0
ehci0: <Intel 82801H (ICH8) USB 2.0 controller USB2-B> mem 0x52225c00-0x52225fff irq 18 at device 26.7 on pci0
ehci0: [ITHREAD]
ugen0.1: <Intel> at usbus0
ushub0: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
ushub0: 2 ports with 2 removable, self powered
usbus1: 12Mbps Full Speed USB v1.0
ugen1.1: <Intel> at usbus1
ushub1: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus1
ushub1: 2 ports with 2 removable, self powered
usbus2: 480Mbps High Speed USB v2.0
iPod nano 第3世代を活線挿抜した場合のコンソールの出力例を次に示します(iPodは場合によってはシステムパニックを引き起こします。一旦iPodをスリープモードにするか再起動してから接続した方が安全です) 。USB4BSDで認識されていることが確認できます。
リスト5 iPod nano 第3世代挿入時コンソール出力
ugen2.2: <Apple Inc.> at usbus2
umass0: <Apple Inc. iPod, class 0/0, rev 2.00/0.01, addr 2> on usbus2
umass0: SCSI over Bulk-Only; quirks = 0x0000
umass0:10:0:-1: Attached to scbus10
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <Apple iPod 1.62> Removable Direct Access SCSI-0 device
da0: 40.000MB/s transfers
da0: 7583MB (1941441 4096 byte sectors: 255H 63S/T 120C)
GEOM_LABEL: Label for provider da0s1 is msdosfs/IPOD.
リスト6 iPod nano 第3世代引抜時コンソール出力
umass0: at ushub2, port 1, addr 2 (disconnected)
(da0:umass-sim0:0:0:0): lost device
(da0:umass-sim0:0:0:0): removing device entry
umass0: detached
GEOM_LABEL: Label msdosfs/IPOD removed.
今回マージされたUSB4BSDが、いつ従来のUSBスタックから置き換わるのかは定かではありません。場合によっては再び差し戻される可能性もあるわけですが、Giant Lockが削除されたうえに高速通信が実現される利点は大きいといえます。今後どのタイミングでデフォルトスタックになるかに注目です。
current - Doug Rabson氏によってNFSクライアントとサーバの双方に対してRPCSEC_GSS認証をサポートするための実装が追加されました。この実装によって従来使われていたRPC実装は破棄され、新しく実装されたRPC実装がNFSロックマネージャに置き換わります(実際にはユーザランドのsunrpcコードが移植されたものです) 。今のところ古いコードも新しいコードも両方ありますが、デフォルトでは新しいコードが使われます。古いコードを使う場合にはNFS_LEGACYRPCオプションを使ってください。
RPCSEC_GSSをクライアントとサーバで活用する場合、KGSSAPIオプションとcryptoデバイスを指定してカーネルをビルドする必要があります。またgssd(8)を動かしていく必要があるため、最新の/etc/rc.d/gssdと/etc/rc.d/nfsdをインストールした上で「gssd_enable=YES」の行を/etc/rc.confに追加しておく必要があります。
現在の実装ではssh経由でログインしてデリゲートされている場合などのように違う場所にチケットファイルが置いてあるケースではマウントはできてもファイルへのアクセスが許可されません。この制限はFreeBSDのみならずSolarisやLinuxにおいても同様です。興味深いのはDoug Rabson氏がこの問題は理論上はVariantシンボリックリンクを使えば解消できると説明しているところにあります。
EuroBSDCon2008でBrooks Davis氏が、DragonFly BSDのVariantシンボリックリンクをベースに大幅な変更を加えてFreeBSDにVariantシンボリックリンク機能を持ってきた旨を発表しています。Variantシンボリックリンクの導入については必要と考える意見と不要とみなす意見があり、これまではFreeBSDには導入されていませんでした。しかしながらVariantシンボリックリンクが有効に機能するケースが増えると、FreeBSD本体にVariantシンボリックリンク機能がマージされる可能性がでてきます。その点でDoug Rabson氏がにVariantシンボリックリンクで理論的には状況を改善できると説明しているのは興味深いところです。
サーバでRPCSEC_GSSをサポートするにはサーバクレジットを「nfs/<fqdn>@<REALM>」のように作成して/etc/krb5.keytabファイルに記述します。あとは/etc/exportsに「-sec=krb5」オプションを追加してmountd(8)とnfsd(8)の双方を再起動します。同機能を使う場合、従来はサービススレッドを作成していたところがkthreadsに変更されます。kthreadsがとういった状況にあるのかは「top -H」のように'-H'オプションを指定することで確認できます。
この新しいRPCSEC_GSS認証サポートはIsilon Systemsスポンサーシップのもとで取り組まれました。7-STABLEへは1ヵ月後のマージが予定されています。