NetBSD/amd64 current on Toshiba dynabook R63/PS

はじめに

Vaio Pro 11を使っていましたが、早々にキートップが外れる、SSDが外れる、SSDが遅いと言う問題に当たってしまいました。確かにDRMKMSにもちゃんと対応していて、良いマシンですが、結局東芝の直販サイトで安売りしているdynabook R63/PSに乗り換えることになってしまいました。 ここでは、dynabook R63/PSで、NetBSD/amd64 current (6.99.24)を使う方法について、書きたいと思います。

サポート状況

最初にdmesgを示します。これは、GENERICカーネルでdtraceサポートを有効化しただけのカーネルです。

Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 7.99.24 (DTRACE7) #271: Mon Dec 14 23:27:23 JST 2015
 ryo_on@brownie:/usr/world/7.99/amd64/obj/sys/arch/amd64/compile/DTRACE7
total memory = 8103 MB
avail memory = 7849 MB
rnd: seeded with 128 bits
timecounter: Timecounters tick every 10.000 msec
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
TOSHIBA dynabook R63/PS (PRB63PS-NDC)
mainbus0 (root)
ACPI: RSDP 0x00000000000F0030 000014 (v00 TOSHIB)
ACPI: RSDT 0x00000000D90ED000 000068 (v01 TOSHIB A0096    00000003      01000013)
ACPI: FACP 0x00000000D90EC000 00010C (v05 TOSHIB A0096    00000003 LOHR 0000005F)
ACPI: DSDT 0x00000000D90CF000 01264F (v02 TOSHIB A0096    20150216 INTL 20130927)
ACPI: FACS 0x00000000D9099000 000040
ACPI: HPET 0x00000000D90EB000 000038 (v01 TOSHIB A0096    00000001 LOHR 0000005F)
ACPI: APIC 0x00000000D90EA000 0000BC (v01 TOSHIB A0096    00000001 LOHR 0000005F)
ACPI: MCFG 0x00000000D90E9000 00003C (v01 TOSHIB A0096    00000001 LOHR 0000005F)
ACPI: ASF! 0x00000000D90E8000 0000A0 (v32 TOSHIB A0096    00000001 LOHR 0000005F)
ACPI: TCPA 0x00000000D90E7000 000032 (v02 TOSHIB A0096    00000000 LOHR 0000005F)
ACPI: BOOT 0x00000000D90E6000 000028 (v01 TOSHIB A0096    00000000 LOHR 0000005F)
ACPI: MSDM 0x00000000D90E5000 000055 (v03 TOSHIB A0096    00000000 LOHR 0000005F)
ACPI: SLIC 0x00000000D90E4000 000176 (v01 TOSHIB A0096    00000000 LOHR 0000005F)
ACPI: DBGP 0x00000000D90E3000 000034 (v01 TOSHIB A0096    00000000 LOHR 0000005F)
ACPI: SSDT 0x00000000D90CE000 0003F9 (v02 TOSHIB SataAhci 00001000 INTL 20130927)
ACPI: SSDT 0x00000000D90C8000 00060D (v02 TOSHIB MacUniq2 00001000 INTL 20130927)
ACPI: SSDT 0x00000000D90C7000 0005E6 (v02 PmRef  Cpu0Ist  00003000 INTL 20130927)
ACPI: SSDT 0x00000000D90C6000 000B60 (v02 CpuRef CpuSsdt  00003000 INTL 20130927)
ACPI: SSDT 0x00000000D90C4000 0012DF (v02 SaSsdt SaSsdt   00003000 INTL 20130927)
ACPI: DMAR 0x00000000D90C3000 0000D8 (v01 INTEL  BDW      00000001 INTL 00000001)
ACPI: FPDT 0x00000000D90E2000 000044 (v01 TOSHIB A0096    00000000 LOHR 0000005F)
ACPI: All ACPI Tables successfully acquired
ioapic0 at mainbus0 apid 2: pa 0xfec00000, version 0x20, 40 pins
cpu0 at mainbus0 apid 0
cpu0: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz, id 0x306d4
cpu1 at mainbus0 apid 1
cpu1: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz, id 0x306d4
cpu2 at mainbus0 apid 2
cpu2: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz, id 0x306d4
cpu3 at mainbus0 apid 3
cpu3: Intel(R) Core(TM) i7-5500U CPU @ 2.40GHz, id 0x306d4
acpi0 at mainbus0: Intel ACPICA 20150717
acpi0: X/RSDT: OemId , AslId <    ,01000013>
acpi0: MCFG: segment 0, bus 0-63, address 0x00000000f8000000
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFE821F6F8410 0003D3 (v02 PmRef  Cpu0Cst  00003001 INTL 20130927)
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFE810E845010 0005AA (v02 PmRef  ApIst    00003000 INTL 20130927)
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFE810E7283D0 000119 (v02 PmRef  ApCst    00003000 INTL 20130927)
acpi0: SCI interrupting at int 9
timecounter: Timecounter "ACPI-Safe" frequency 3579545 Hz quality 900
hpet0 at acpi0: high precision event timer (mem 0xfed00000-0xfed00400)
timecounter: Timecounter "hpet0" frequency 14318180 Hz quality 2000
acpivga0 at acpi0 (GFX0): ACPI Display Adapter
acpiout0 at acpivga0 (DDC1, 0x0400): ACPI Display Output Device
acpiout0: brightness levels: [0-100]
acpiout1 at acpivga0 (DDC2, 0x0300): ACPI Display Output Device
acpiout2 at acpivga0 (DDC3, 0x0301): ACPI Display Output Device
acpiout3 at acpivga0 (DDC4, 0x0302): ACPI Display Output Device
acpiout4 at acpivga0 (DDC5, 0x0303): ACPI Display Output Device
acpiout5 at acpivga0 (DDC6, 0x0006): ACPI Display Output Device
acpiout6 at acpivga0 (DDC7, 0x0007): ACPI Display Output Device
acpiout7 at acpivga0 (DDC8, 0x0008): ACPI Display Output Device
acpiout8 at acpivga0 (DDC9, 0x0009): ACPI Display Output Device
acpiout9 at acpivga0 (DDCA, 0x000a): ACPI Display Output Device
acpiout10 at acpivga0 (DDCB, 0x000b): ACPI Display Output Device
acpiout11 at acpivga0 (DDCC, 0x000c): ACPI Display Output Device
acpiout12 at acpivga0 (DDCD, 0x000d): ACPI Display Output Device
acpiout13 at acpivga0 (DDCE, 0x000e): ACPI Display Output Device
acpiout14 at acpivga0 (DDCF, 0x000f): ACPI Display Output Device
acpivga0: unknown output device acpiout5
acpivga0: unknown output device acpiout6
acpivga0: unknown output device acpiout7
acpivga0: unknown output device acpiout8
acpivga0: unknown output device acpiout9
acpivga0: unknown output device acpiout10
acpivga0: unknown output device acpiout11
acpivga0: unknown output device acpiout12
acpivga0: unknown output device acpiout13
acpivga0: unknown output device acpiout14
acpivga0: connected output devices:
acpivga0:   0x0400 (acpiout0): Int. Digital Flat Panel, index 0, port 0, head 0
acpivga0:   0x0300 (acpiout1): Ext. Digital Monitor, index 0, port 0, head 0, bios detect
acpivga0:   0x0301 (acpiout2): Ext. Digital Monitor, index 1, port 0, head 0, bios detect
acpivga0:   0x0302 (acpiout3): Ext. Digital Monitor, index 2, port 0, head 0, bios detect
acpivga0:   0x0303 (acpiout4): Ext. Digital Monitor, index 3, port 0, head 0, bios detect
PDRC (PNP0C02) at acpi0 not configured
acpiwmi0 at acpi0 (AMW0, PNP0C14-0): ACPI WMI Interface
acpiwmibus at acpiwmi0 not configured
GTPM (IFX0102) at acpi0 not configured
LDRC (PNP0C02) at acpi0 not configured
GEN1 (PNP0C02) at acpi0 not configured
attimer1 at acpi0 (TIMR, PNP0100): io 0x40-0x43,0x50-0x53 irq 0
pckbc1 at acpi0 (PS2K, TOS7407) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (PS2M, TTP1000) (aux port): irq 12
SIRC (PNP0C02) at acpi0 not configured
valz0 at acpi0 (VALZ, TOS6208): Toshiba VALZ
BT (TOS6205) at acpi0 not configured
acpiacad0 at acpi0 (ADP1, ACPI0003): ACPI AC Adapter
acpibut0 at acpi0 (PWRB, PNP0C0C): ACPI Power Button
acpilid0 at acpi0 (LID, PNP0C0D): ACPI Lid Switch
acpibat0 at acpi0 (BAT1, PNP0C0A-1): ACPI Battery
acpitz0 at acpi0 (TZ01)
acpitz0: levels: critical 107.0 C, passive cooling
ACPI: Enabled 4 GPEs in block 00 to 7F
ACPI Exception: AE_NOT_FOUND, While evaluating Sleep State [\_S1_] (20150717/hwxface-646)
ACPI Exception: AE_NOT_FOUND, While evaluating Sleep State [\_S2_] (20150717/hwxface-646)
pckbd0 at pckbc1 (kbd slot)
pckbc1: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard
pms0 at pckbc1 (aux slot)
pckbc1: using irq 12 for aux slot
wsmouse0 at pms0 mux 0
pci0 at mainbus0 bus 0: configuration mode 1
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
pchb0 at pci0 dev 0 function 0: vendor 8086 product 1604 (rev. 0x09)
i915drmkms0 at pci0 dev 2 function 0: vendor 8086 product 1616 (rev. 0x09)
drm: Memory usable by graphics device = 4096M
drm: Supports vblank timestamp caching Rev 2 (21.10.2013).
drm: Driver supports precise vblank timestamp query.
i915drmkms0: interrupting at ioapic0 pin 16 (i915)
intelfb0 at i915drmkms0
i915drmkms0: info: registered panic notifier
i915drmkms0: More than 8 outputs detected via ACPI
intelfb0: framebuffer at 0xffff80008ed93000, size 1920x1080, depth 32, stride 7680
wsdisplay0 at intelfb0 kbdmux 1: console (default, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
hdaudio0 at pci0 dev 3 function 0: HD Audio Controller
hdaudio0: interrupting at ioapic0 pin 16
hdaudio0: timeout leaving reset state
hdaudio0: device driver failed to attach
vendor 8086 product 9cb1 (USB serial bus, xHCI, revision 0x03) at pci0 dev 20 function 0 not configured
vendor 8086 product 9cba (miscellaneous communications, revision 0x03) at pci0 dev 22 function 0 not configured
wm0 at pci0 dev 25 function 0: I218 V Ethernet Connection (rev. 0x03)
wm0: interrupting at msi0 vec 0
wm0: PCI-Express bus
wm0: 2048 words FLASH
wm0: Ethernet address b8:6b:23:86:df:bb
ihphy0 at wm0 phy 2: i217 10/100/1000 media interface, rev. 5
ihphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
hdaudio1 at pci0 dev 27 function 0: HD Audio Controller
hdaudio1: interrupting at ioapic0 pin 22
hdafg0 at hdaudio1: vendor 10ec product 0255
hdafg0: DAC00 2ch: Speaker [Built-In]
hdafg0: DAC01 2ch: HP Out [Jack]
hdafg0: ADC02 2ch: Mic In [Jack]
hdafg0: 2ch/2ch 44100Hz 48000Hz 96000Hz 192000Hz PCM16 PCM20 PCM24 AC3
audio0 at hdafg0: full duplex, playback, capture, mmap, independent
ppb0 at pci0 dev 28 function 0: vendor 8086 product 9c9a (rev. 0xe3)
ppb0: PCI Express capability version 2  x1 @ 5.0GT/s
ppb0: link is x1 @ 2.5GT/s
pci1 at ppb0 bus 1
pci1: i/o space, memory space enabled, rd/line, wr/inv ok
rtsx0 at pci1 dev 0 function 0: vendor 10ec product 5227 (rev. 0x01)
rtsx0: interrupting at msi1 vec 0
sdmmc0 at rtsx0
ppb1 at pci0 dev 28 function 2: vendor 8086 product 9c94 (rev. 0xe3)
ppb1: PCI Express capability version 2  x1 @ 5.0GT/s
ppb1: link is x1 @ 2.5GT/s
pci2 at ppb1 bus 2
pci2: i/o space, memory space enabled, rd/line, wr/inv ok
iwm0 at pci2 dev 0 function 0: vendor 8086 product 095a (rev. 0x59)
iwm0: interrupting at msi2 vec 0
ehci0 at pci0 dev 29 function 0: vendor 8086 product 9ca6 (rev. 0x03)
ehci0: interrupting at ioapic0 pin 23
ehci0: EHCI version 1.0
usb0 at ehci0: USB revision 2.0
pcib0 at pci0 dev 31 function 0: vendor 8086 product 9cc3 (rev. 0x03)
ahcisata0 at pci0 dev 31 function 2: vendor 8086 product 9c83 (rev. 0x03)
ahcisata0: interrupting at ioapic0 pin 19
ahcisata0: 64-bit DMA
ahcisata0: AHCI revision 1.30, 3 ports, 32 slots, CAP 0xcf34ff02
atabus0 at ahcisata0 channel 0
isa0 at pcib0
tpm0 at isa0 iomem 0xfed40000-0xfed44fff irq 7: device 0x001a15d1 rev 0x10
pcppi0 at isa0 port 0x61
midi0 at pcppi0: PC speaker
sysbeep0 at pcppi0
attimer1: attached to pcppi0
acpicpu0 at cpu0: ACPI CPU
acpicpu0: C1: FFH, lat   1 us, pow  1000 mW
acpicpu0: C2: FFH, lat 148 us, pow   200 mW
acpicpu0: C3: FFH, lat 233 us, pow   200 mW
acpicpu0: P0: FFH, lat  10 us, pow 15000 mW, 2401 MHz, turbo boost
acpicpu0: P1: FFH, lat  10 us, pow 15000 mW, 2400 MHz
acpicpu0: P2: FFH, lat  10 us, pow 14088 mW, 2300 MHz
acpicpu0: P3: FFH, lat  10 us, pow 12607 mW, 2100 MHz
acpicpu0: P4: FFH, lat  10 us, pow 11888 mW, 2000 MHz
acpicpu0: P5: FFH, lat  10 us, pow 11184 mW, 1900 MHz
acpicpu0: P6: FFH, lat  10 us, pow  9680 mW, 1700 MHz
acpicpu0: P7: FFH, lat  10 us, pow  9019 mW, 1600 MHz
acpicpu0: P8: FFH, lat  10 us, pow  7738 mW, 1400 MHz
acpicpu0: P9: FFH, lat  10 us, pow  7119 mW, 1300 MHz
acpicpu0: P10: FFH, lat  10 us, pow  6511 mW, 1200 MHz
acpicpu0: P11: FFH, lat  10 us, pow  5209 mW, 1000 MHz
acpicpu0: P12: FFH, lat  10 us, pow  4643 mW,  900 MHz
acpicpu0: P13: FFH, lat  10 us, pow  4090 mW,  800 MHz
acpicpu0: P14: FFH, lat  10 us, pow  3021 mW,  600 MHz
acpicpu0: P15: FFH, lat  10 us, pow  2386 mW,  500 MHz
acpicpu0: T0: I/O, lat   1 us, pow     0 mW, 100 %
acpicpu0: T1: I/O, lat   1 us, pow     0 mW,  88 %
acpicpu0: T2: I/O, lat   1 us, pow     0 mW,  76 %
acpicpu0: T3: I/O, lat   1 us, pow     0 mW,  64 %
acpicpu0: T4: I/O, lat   1 us, pow     0 mW,  52 %
acpicpu0: T5: I/O, lat   1 us, pow     0 mW,  40 %
acpicpu0: T6: I/O, lat   1 us, pow     0 mW,  28 %
acpicpu0: T7: I/O, lat   1 us, pow     0 mW,  16 %
coretemp0 at cpu0: thermal sensor, 1 C resolution, Tjmax=105
acpicpu1 at cpu1: ACPI CPU
acpicpu2 at cpu2: ACPI CPU
coretemp1 at cpu2: thermal sensor, 1 C resolution, Tjmax=105
acpicpu3 at cpu3: ACPI CPU
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
ERROR: 2866 cycle TSC drift observed
acpiacad0: AC adapter online.
IPsec: Initialized Security Association Processing.
uhub0 at usb0: vendor 8086 EHCI root hub, class 9/0, rev 2.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
ahcisata0 port 0: device present, speed: 6.0Gb/s
wd0 at atabus0 drive 0
wd0: 
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 238 GB, 496149 cyl, 16 head, 63 sec, 512 bytes/sect x 500118192 sectors
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(ahcisata0:0:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100) (using DMA)
uhub1 at uhub0 port 1: vendor 8087 product 8001, class 9/0, rev 2.00/0.03, addr 2
uhub1: single transaction translator
uhub1: 8 ports with 8 removable, self powered
uhub2 at uhub1 port 6: vendor 05e3 USB2.0 Hub, class 9/0, rev 2.10/88.30, addr 3
uhub2: single transaction translator
uhub2: 4 ports with 0 removable, self powered
uvideo0 at uhub1 port 7 configuration 1 interface 0: Chicony Electronics Co.,Ltd. TOSHIBA Web Camera - FHD, rev 2.00/83.73, addr 4
video0 at uvideo0: Chicony Electronics Co.,Ltd. TOSHIBA Web Camera - FHD, rev 2.00/83.73, addr 4
Kernelized RAIDframe activated
pad0: outputs: 44100Hz, 16-bit, stereo
audio1 at pad0: half duplex, playback, capture
boot device: wd0
root on wd0a dumps on wd0b
root file system type: ffs
kern.module.path=/stand/amd64/7.99.24/modules
iwm0: hw rev: 0x210, fw ver 25.228 (API ver 9), address 5c:e0:c5:a8:88:ab
iwm0: 11a rates: 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
iwm0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
iwm0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
wsdisplay0: screen 1 added (default, vt100 emulation)
wsdisplay0: screen 2 added (default, vt100 emulation)
wsdisplay0: screen 3 added (default, vt100 emulation)
wsdisplay0: screen 4 added (default, vt100 emulation)

ディスプレイ

最近のNetBSD 7.0やcurrentでは、DRM/KMSサポートが追加されており、dynabook R63/PSに搭載されているIntelのチップセットでも、それを使用することができます。ですので、コンソール、XともにフルHDの解像度で使用することができます。 ただし、Xにおけるアクセラレーションは有効化することができません。native X.org (/usr/X11R7以下にインストールされるX.org)では、以下のように/etc/X11/xorg.confに設定する必要があります、

Section "Device"
        Identifier  "Card0"
        Option  "NoAccel"
        Driver  "intel"
        BusID   "PCI:0:2:0"
EndSection
NoAccelオプションを指定する必要があると言うことです。

しかし、Firefoxを起動すると、以下のようにエラーが発生しているようです。

drm: stuck on render ring
drm: GPU HANG: ecode 0:0x0fdf9faf, reason: Ring hung, action: reset
drm: GPU hangs can indicate a bug anywhere in the entire gfx stack, including us
erspace.
drm: Please file a _new_ bug report on bugs.freedesktop.org against DRI -> DRM/Intel
drm: drm/i915 developers can then reassign to the right component if it's not a kernel issue.
drm: The gpu crash dump is required to analyze gpu hangs, so please always attach it.
drm: GPU crash dump saved to /sys/class/drm/card0/error
i915drmkms0: interrupting at ioapic0 pin 16 (pci0@pci:0000:00:02.0)
drm: stuck on render ring
drm: GPU HANG: ecode 0:0x0fdf9faf, reason: Ring hung, action: reset
i915drmkms0: interrupting at ioapic0 pin 16 (pci0@pci:0000:00:02.0)
drm: stuck on render ring
drm: GPU HANG: ecode 0:0x0fdf9faf, reason: Ring hung, action: reset
i915drmkms0: interrupting at ioapic0 pin 16 (pci0@pci:0000:00:02.0)
drm: stuck on render ring
drm: GPU HANG: ecode 0:0x0fdf9faf, reason: Ring hung, action: reset
i915drmkms0: interrupting at ioapic0 pin 16 (pci0@pci:0000:00:02.0)
drm: stuck on render ring
drm: GPU HANG: ecode 0:0x0fdf9faf, reason: Ring hung, action: reset
i915drmkms0: interrupting at ioapic0 pin 16 (pci0@pci:0000:00:02.0)
これは、dynabook R63/PSのチップセットをNetBSDではサポートしていないためのようです。Intelチップセットの世代について理解していませんので、これ以上は言及しないことにします。

外部ディスプレイ接続については、HDMIとVGAが用意されていますが、HDMI出力は使用することができません。Vaip Pro 11でもHDMI接続はできませんでしたので、まだサポートされていないのだと思います。VGA出力は、xrandrを使用しないでもミラーリングされる場合が多いです(詳細を探求できていません)。

オーディオ

内蔵スピーカーによるオーディオ再生については、問題はありません。マイク機能、ヘッドフォン機能については試していません。

ポインティングデバイス

アルプス電気製のトラックパッドとポインティングスティック(アキュポイントと言うらしい)が搭載されていますが、通常のPS/2マウスとしてしか認識されません。 ただし、ポインティングスティックには、物理的に2つに分かれたボタンが用意されていますので、ポインティングスティックを使えば、右クリック、エミュレーションして中ボタンクリックも可能ですので、困ることはないと思います。 Linuxには、アルプス電気製のデバイスのサポートもあるようですので、いずれNetBSDでも使えるようにできればと考えています。

キーボード

キーボードは普通のテンキーなしのJIS配列キーボードです。 ただし、東芝独自のGHCI/SCIという仕組みでイベントが発行されます。 FNキーとFn1キー等の組み合わせがWindowsでは使われますが、仕組みとしては、ほぼ全てのキーとFNキーの組み合わせに対してイベントを設定できるようになっています。 内蔵ディスプレイのオンオフ、内蔵ポインティングデバイスのオンオフについては、valz(4)というデバイスドライバーを書いてサポートするようにしました。NetBSD currentでは使用できます。 本当は、内蔵ディスプレイの輝度の変更をしたかったのですが、これについてはACPIの一般的なコードがうまく働いていないようで、valz(4)からは操作できませんでした。acpivga(4)とかのコードをちゃんと理解しないといけないと考えています。

有線LAN

有線LANポートが内蔵されています。Intel I218 Vというもので、wm(4)として認識されます。非常に安定しています。MSI/MSI-Xを使うようです。

wm0 at pci0 dev 25 function 0: I218 V Ethernet Connection (rev. 0x03)
wm0: interrupting at msi0 vec 0
wm0: PCI-Express bus
wm0: 2048 words FLASH
wm0: Ethernet address b8:6b:23:86:df:bb

無線LAN(WiFi)

iwm(4)として認識されるのですが、すぐにエラーになって使えなくなってしまいます。Vaio Pro 11にもiwm(4)は搭載されていたのですが、どうだったのか…。 エラーメッセージは以下の通りです。

iwm0: failed to load firmware: 35
821.11a/gのいずれでも同じ状況ですので、send-prくらいはしておこうと考えています。

その他のデバイス

他のデバイスについて、箇条書きにしておきます。

  • SDカードスロットは一度しか試していませんが使えました。
  • USB 3/xhciは、搭載されていますが使えません。USB 2/ehciが使えるので、とりあえずは困りません。
  • 内蔵のUSBカメラはuvideo(4)として使えます。
  • ACPI接続のBluetoothコントローラーは認識できません。

おわりに

NetBSDを動かすために、新し目なマシンを用意するのは結構冒険だと思うのですが、ディスプレイ関係でアクセラレーションが効かない以外には、あまり問題はないマシンだと思います。 いずれ、Bluetoothコントローラー、ポインティングデバイスについては、改善を試みようと思っています。

Python psutilとsysctl(3)について

はじめに

Let's Encryptのベータテストに応募したところ、テストユーザーになることができました。 そこで、証明書の取得方法を調べてみると、Pythonで書かれたクライアントを使って取得することが分かりました。 Pythonで書かれているのだから、クロスプラットフォームなのに違いないと最初は思ったのですが、psutilというモジュールを使っており、これが各プラットフォームに独自のCで書かれたコードをたくさん持っていました。 psutil 3.3.0をNetBSDでだいたい動くようにする中で分かった、NetBSD独自のシステム情報の取得の仕組みを紹介します。

psutilは、ごく最近OpenBSDのサポートが追加されました。また、FreeBSDのサポートは以前からされています。 NetBSDサポートの追加は、この2つのOS用のコードをうまく再利用しつつ進めました。

psutilは、Python System and process Utilitiesの略で、プロセスやシステムの情報をアーキテクチャーによらず統一した方法で呼び出せる仕組みです。
https://pythonhosted.org/psutil/
にドキュメントがあり、実行例も丁寧に記述されています。なので、動作確認も比較的容易です。

NetBSDで動くようにするためのパッチは、
http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/py-psutil/patches/
にあります。 こういう類いのプログラムを書く経験がほとんどないので、より良い実装方法がありましたら、教えていただければ助かります。

システムの情報を入手する仕組み

システムの情報をユーザーランドのプログラムが入手するには、カーネルに問い合わせをして教えてもらわなくてはなりません。今回psutilでNetBSDをサポートするに当たって調べたところ、以下の2つの仕組みが用意されているようです。

  • sysctlライブラリー関数
  • kvmライブラリーに定義されている関数類

今回は、sysctlライブラリー関数の方を使っているのですが、私の理解できた範囲で、両方について説明してみます。

sysctlライブラリー関数

sysctlについては、sysctl(3)とsysctl(7)のマニュアルページを読みました。 sysctl関数は、MIB (Management Information Base)と言うintの配列を使って欲しい情報を指定して、情報を入手する仕組みです。情報を設定することもできますが、今回はそのような使い方はしませんでした。

$ man 3 sysctl
と実行してみると、マニュアルページを読むことができます。 実際にMIBに指定するパラメーターはsysctl(7)マニュアルページに記載されていますので、
$ man 7 sysctl
を参照すると、いくぶんかは説明されています。 MIBは、intの配列を定義して例えば以下のように手作業で作って使うこともできますが、sysctl(8)コマンドで使用するような文字列を使って、MIBを生成することもできます。
mib[0] = CTL_KERN;
mib[1] = KERN_FILE2;
mib[2] = KERN_FILE_BYFILE;
mib[3] = 0;
mib[4] = sizeof(struct kinfo_file);
mib[5] = 0;
sysctlnametomib("net.inet6.tcp6.pcblist", mib, &namelen)
ほぼ、sysctl(8)コマンドで指定する文字列でMIBを作れるようです。

kvmライブラリーに定義されている関数

これらは、kvm(3)マニュアルページに解説されています。/dev/mem等を通じて情報にアクセスします。これも情報を設定することもできます。 今回は、kvm(3)マニュアルページに解説されている関数は、結果的には使用しませんでした。なので、例はありません。 実行中のカーネルだけでなく、core等から情報を取得することもできるようなので、役立つ場面もあるかもしれません。

sysctl(3)での実例

psutilにNetBSDサポートを追加するに当たって、sysctl(3)を使いましたが、sysctl(7)の解説だけでは、実例がなく良く分からないこともありました。NetBSDのsrcツリーの中の事例も参照しつつ進めました。

以下には、sysctl(3)を使って、各種の情報を取得していく方法について、記していきたいと思います。 なんとなく、NetBSDに特有なものを記載します。pkgsrc/sysutils/py-psutilだと、psutil/arch/bsd/以下の内容です。

プロセスをPIDで指定して、その実行ファイル名を絶対パスで取得する

NetBSD currentのみですが、以下のようにして取得できます。

mib[0] = CTL_KERN;
mib[1] = KERN_PROC_ARGS;
mib[2] = pid;
mib[3] = KERN_PROC_PATHNAME;
mib[3]は、以下のように変えれば、他の情報を得られます。
KERN_PROC_ARGV 引数の文字列
KERN_PROC_ENV 環境変数の文字列
KERN_PROC_NARGV 引数の数
KERN_PROC_NENV 環境変数の数
と、ここまで書いて気付きましたが、psutil_get_cmd_args()は書き方が最適ではないですね。KERN_PROC_NARGVを使えば良いでしょうね。

psutilで使っている箇所は以下です。

PyObject *
psutil_proc_exe(PyObject *self, PyObject *args) {
    pid_t pid;
    char pathname[MAXPATHLEN];
    int error;
    int mib[4];
    int ret;
    size_t size;

    if (! PyArg_ParseTuple(args, "l", &pid))
        return NULL;

    mib[0] = CTL_KERN;
    mib[1] = KERN_PROC_ARGS;
    mib[2] = pid;
    mib[3] = KERN_PROC_PATHNAME;

    size = sizeof(pathname);
    error = sysctl(mib, 4, NULL, &size, NULL, 0);
    if (error == -1) {
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }

    error = sysctl(mib, 4, pathname, &size, NULL, 0);
    if (error == -1) {
        PyErr_SetFromErrno(PyExc_OSError);
        return NULL;
    }
    if (size == 0 || strlen(pathname) == 0) {
        ret = psutil_pid_exists(pid);
        if (ret == -1)
            return NULL;
        else if (ret == 0)
            return NoSuchProcess();
        else
            strcpy(pathname, "");
    }
    return Py_BuildValue("s", pathname);
}

プロセスの持つスレッド数を取得する

各プロセスの情報は、kinfo_proc2構造体に格納できます。 /usr/include/sys/sysctl.h に定義がされています。

kinfo_proc2構造体にプロセスIDを指定して情報を格納するには、以下のようなMIBを用意します。pidにプロセスIDを指定します。

mib[0] = CTL_KERN;
mib[1] = KERN_PROC2;
mib[2] = KERN_PROC_PID; // PIDを指定して条件を絞ることを示しています。
mib[3] = pid;
mib[4] = size;
mib[5] = 1;
mib[2]は、以下のように変えれば、絞る条件を変更できます。
KERN_PROC_ALL  絞らない
KERN_PROC_GID  グループID
KERN_PROC_PGRP  プロセスグループ
KERN_PROC_RGID  リアルグループID
KERN_PROC_RUID  リアルユーザーID
KERN_PROC_SESSION セッションID
KERN_PROC_TTY  TTYデバイス
KERN_PROC_UID  ユーザーID
プロセスの持つスレッド数は、p_nlwpsに格納されています。

psutilでの使用例は以下のようです。

int
psutil_kinfo_proc(pid_t pid, kinfo_proc *proc) {
    // Fills a kinfo_proc struct based on process pid.
    int ret;
    int mib[6];
    size_t size = sizeof(kinfo_proc);

    mib[0] = CTL_KERN;
    mib[1] = KERN_PROC2;
    mib[2] = KERN_PROC_PID;
    mib[3] = pid;
    mib[4] = size;
    mib[5] = 1;

    ret = sysctl((int*)mib, 6, proc, &size, NULL, 0);
    if (ret == -1) {
        PyErr_SetFromErrno(PyExc_OSError);
        return -1;
    }
    // sysctl stores 0 in the size if we can't find the process information.
    if (size == 0) {
        NoSuchProcess();
        return -1;
    }
    return 0;
}

PyObject *
psutil_proc_num_threads(PyObject *self, PyObject *args) {
    // Return number of threads used by process as a Python integer.
    long pid;
    kinfo_proc kp;
    if (! PyArg_ParseTuple(args, "l", &pid))
        return NULL;
    if (psutil_kinfo_proc(pid, &kp) == -1)
        return NULL;
    return Py_BuildValue("l", (long)kp.p_nlwps);
}

プロセスの持つファイルディスクリプター数を取得する

開かれているファイルに関する情報は、kinfo_file構造体に格納して参照します、 例えばあるプロセスの開いているファイルディスクリプターの数を取得するには、以下のようなMIBを用意します。

mib[0] = CTL_KERN;
mib[1] = KERN_FILE2;
mib[2] = KERN_FILE_BYPID; /* 
mib[3] = (int) pid;
mib[4] = sizeof(struct kinfo_file);
mib[5] = 0;
この結果として得られたkinfo_file構造体の配列の長さが、あるファイルの開いているファイルディスクリプターの数になります。

プロセスのソケットの情報を取得する

Let's Encryptは、psutilのnet_connectionsというメソッドを使っています。これは、netstat(1)やsockstat(1)のような機能で、システムの全てのソケット接続の状況をプロセスごとに取得するものです。 NetBSDのsysctlでは、直接このような機能はないようです。 そこで、sockstat(1)のソースコードを参考にして、kinfo_proc2とkinfo_fileの2種類の構造体を組み合わせることにしました。kinfo_porc2のki_sockaddrとlkinfo_fileのki_fdataが同じ内容を指しているので、その関係を使って結び付けました。

実例は、 http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/py-psutil/patches/patch-psutil_arch_bsd_netbsd__socks.c?rev=1.1&content-type=text/x-cvsweb-markup を参照してください。

おわりに

psutilのLinux用のコードは、多くがprocfsからの情報を使っています。BSDとの思想の違いは、こういう所にもあるのかもしれません。

MPEG 2.5

MPEG 2.5と言う表記を見掛けたのだが、どういうものか理解できなかった。 /usr/pkgsrc/audio を以下のように検索すると、 /usr/pkgsrc/audio/libmad/DESCR に、MPEG-2 extension to Lower Sam...