FreeBSD Daily Topics

2008年11月5日≪注目≫USB4BSDついにマージ - 480Mbps高速通信実現とGiant Lock削除、NFSに新しいRPCSEC_GSS実装 - Variantシンボリックリンク導入も

heads-up

USB4BSD now on CURRENT

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が削除されたうえに高速通信が実現される利点は大きいといえます。今後どのタイミングでデフォルトスタックになるかに注目です。

NFS gets new RPCSEC_GSS support

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ヵ月後のマージが予定されています。

ports

java/jdk14

JDK 1.4のportが最新のタイムゾーン情報(tzupdater 1.3.9-2008g)を使うようにアップデートされました。

おすすめ記事

記事・ニュース一覧