qemu上でNetBSD/amd64-currentを使ってみる (VirtIO SCSI)

この記事は、NetBSD Advent Calendar 2021の7日目の記事です。

はじめに

今回は、VirtIO SCSI Host Device (virtio-scsi)を使う場合について、書きたいと思います。

VirtIO SCSI Host Deviceとは?

仕様書によると、いわゆるvirtio-scsiというのが、VirtIO Host Deviceのことであるようです。 NetBSDですと、vioscsi(4)というのが それに当たるようです。 VirtIO SCSIには、scsi-hdとscsi-block、scsi-genericという3つの種類の設定ができるようです。 qemu.orgによりvirtio-blkとvirtio-scsiの各設定の比較記事によると、 通常の仮想ディスクイメージを使う場合には、最も性能の良いscsi-hdを使うので良さそうです。 この比較記事によると、virtio-blkの方がvirtio-scsiよりもランダム読み取りの性能が高いそうです。 しかし、接続できるディスクデバイスの数はvirtio-scsiの方が多いそうです。

Google Cloud Compute Engineで提供されている VPSの標準のブロックデバイスは、このvirtio-scsiになっていました。

qemuでvirtio-scsiを使うように指定してNetBSD/amd64-currentをインストールする

virtio-scsiでは、光学ディスクドライブもサポートしているようです。 インストールするために利用するISOイメージファイルもvirtio-scsi経由で設定してみます。

qemuを起動するシェルスクリプトを用意します。VirtIO機能を利用する場合には、コマンドライン引数が長くなりがちですので、 シェルスクリプトの形にまとめておくのが良いと思います。 qemu-virtio-scsi_install.shというファイル名で、以下のようなシェルスクリプトを作成しておきます。

#!/bin/sh

INSTALLISO=../NetBSD-9.99.92-amd64_202112102310Z.iso

# Install
qemu-system-x86_64 \
        -smp 4 \
        -m 4G \
        -accel nvmm \
        -device virtio-scsi-pci,id=scsi \
        -device scsi-cd,drive=cd0 \
        -drive if=none,id=cd0,file=${INSTALLISO},media=disk,format=raw \
        -device scsi-hd,drive=hd1 \
        -drive if=none,id=hd1,file=netbsd.qcow2,format=qcow2 \
        -net nic,model=virtio -net user \
        -rtc base=localtime,clock=host \
        -device intel-hda -device hda-duplex \
        -vga qxl

起動は以下のように実行すれば良いでしょう。 cd0 at scsibus0 at vioscsi0から起動できます。 インストールの各手順を割愛します。

$ sh ./qemu-virtio-scsi_install.sh

インストールが完了したら、仮想マシンはシャットダウンしておきます。

インストールしたNetBSD/amd64-currentを起動させる

インストールに必要な設定は省いたコマンドライン引数を指定してqemuを起動させるシェルスクリプトを以下のように用意します。 ファイル名は、qemu-virtio-scsi.shとしておきます

0
#!/bin/sh

qemu-system-x86_64 \
        -smp 4 \
        -m 4G \
        -accel nvmm \
        -device virtio-scsi-pci,id=scsi \
        -device scsi-hd,drive=hd1 \
        -drive if=none,id=hd1,file=netbsd.qcow2,format=qcow2 \
        -net nic,model=virtio -net user \
        -rtc base=localtime,clock=host \
        -device intel-hda -device hda-duplex \
        -vga qxl

起動するとdmesgは以下のようになります。

Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
    2018, 2019, 2020, 2021 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 9.99.92 (GENERIC) #0: Fri Dec 10 21:57:13 UTC 2021
	mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
total memory = 4095 MB
avail memory = 3941 MB
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
mainbus0 (root)
ACPI: RSDP 0x00000000000F5980 000014 (v00 BOCHS )
ACPI: RSDT 0x00000000BFFE1A2B 000034 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: FACP 0x00000000BFFE18C7 000074 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: DSDT 0x00000000BFFE0040 001887 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: FACS 0x00000000BFFE0000 000040
ACPI: APIC 0x00000000BFFE193B 000090 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: HPET 0x00000000BFFE19CB 000038 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: WAET 0x00000000BFFE1A03 000028 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: 1 ACPI AML tables successfully acquired and loaded
ioapic0 at mainbus0 apid 0: pa 0xfec00000, version 0x20, 24 pins
cpu0 at mainbus0 apid 0
cpu0: Use lfence to serialize rdtsc
cpu0: CPU base freq 1500000000 Hz
cpu0: CPU max freq 3900000000 Hz
cpu0: TSC freq CPUID 1497600000 Hz
cpu0: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu0: node 0, package 0, core 0, smt 0
cpu1 at mainbus0 apid 1
cpu1: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu1: node 0, package 0, core 0, smt 1
cpu2 at mainbus0 apid 2
cpu2: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu2: node 0, package 0, core 1, smt 0
cpu3 at mainbus0 apid 3
cpu3: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu3: node 0, package 0, core 1, smt 1
acpi0 at mainbus0: Intel ACPICA 20210930
acpi0: X/RSDT: OemId &t;BOCHS ,BXPC    ,00000001>, AslId <BXPC,00000001>
LNKS: ACPI: Found matching pin for 0.1.INTA at func 3: 9
LNKB: ACPI: Found matching pin for 0.2.INTA at func 0: 10
LNKC: ACPI: Found matching pin for 0.3.INTA at func 0: 11
LNKD: ACPI: Found matching pin for 0.4.INTA at func 0: 11
LNKA: ACPI: Found matching pin for 0.5.INTA at func 0: 10
acpi0: SCI interrupting at int 9
acpi0: fixed power button present
timecounter: Timecounter "ACPI-Fast" frequency 3579545 Hz quality 1000
hpet0 at acpi0: high precision event timer (mem 0xfed00000-0xfed00400)
timecounter: Timecounter "hpet0" frequency 100000000 Hz quality 2000
pckbc1 at acpi0 (KBD, PNP0303) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (MOU, PNP0F13) (aux port): irq 12
fdc0 at acpi0 (FDC0, PNP0700): io 0x3f2-0x3f5,0x3f7 irq 6 drq 2
lpt0 at acpi0 (LPT1, PNP0400-1): io 0x378-0x37f irq 7
com0 at acpi0 (COM1, PNP0501-1): io 0x3f8-0x3ff irq 4
com0: ns16550a, 16-byte FIFO
qemufwcfg0 at acpi0 (FWCF, QEMU0002): io 0x510-0x51b
qemufwcfg0: <QEMU>
ACPI: Enabled 2 GPEs in block 00 to 0F
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: Intel 82441FX (PMC) PCI and Memory Controller (rev. 0x02)
pcib0 at pci0 dev 1 function 0: Intel 82371SB (PIIX3) PCI-ISA Bridge (rev. 0x00)
piixide0 at pci0 dev 1 function 1: Intel 82371SB IDE Interface (PIIX3) (rev. 0x00)
piixide0: bus-master DMA support present
piixide0: primary channel wired to compatibility mode
piixide0: primary channel interrupting at ioapic0 pin 14
atabus0 at piixide0 channel 0
piixide0: secondary channel wired to compatibility mode
piixide0: secondary channel interrupting at ioapic0 pin 15
atabus1 at piixide0 channel 1
piixpm0 at pci0 dev 1 function 3: Intel 82371AB (PIIX4) Power Management Controller (rev. 0x03)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 1000
piixpm0: 24-bit timer
piixpm0: interrupting at ioapic0 pin 9
iic0 at piixpm0 port 0: I2C bus
vga0 at pci0 dev 2 function 0: Red Hat QXL Video (rev. 0x05)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
virtio0 at pci0 dev 3 function 0
virtio0: network device (rev. 0x00)
vioif0 at virtio0: features: 0x31070020<EVENT_IDX,INDIRECT_DESC,NOTIFY_ON_EMPTY,CTRL_RX,CTRL_VQ,STATUS,MAC>
vioif0: Ethernet address 52:54:00:12:34:56
virtio0: allocated 20480 byte for virtqueue 0 for rx0, size 256
virtio0: using 8192 byte (512 entries) indirect descriptors
virtio0: allocated 81920 byte for virtqueue 1 for tx0, size 256
virtio0: using 69632 byte (4352 entries) indirect descriptors
virtio0: allocated 8192 byte for virtqueue 2 for control, size 64
virtio0: config interrupting at msix0 vec 0
virtio0: queues interrupting at msix0 vec 1
virtio1 at pci0 dev 4 function 0
virtio1: SCSI device (rev. 0x00)
vioscsi0 at virtio1: features: 0x10000000<INDIRECT_DESC>
virtio1: allocated 86016 byte for virtqueue 0 for control, size 256
virtio1: using 73728 byte (4608 entries) indirect descriptors
virtio1: allocated 86016 byte for virtqueue 1 for event, size 256
virtio1: using 73728 byte (4608 entries) indirect descriptors
virtio1: allocated 86016 byte for virtqueue 2 for request, size 256
virtio1: using 73728 byte (4608 entries) indirect descriptors
vioscsi0: cmd_per_lun 128 qsize 256 seg_max 254 max_target 255 max_lun 16383
virtio1: config interrupting at msix1 vec 0
virtio1: queues interrupting at msix1 vec 1
scsibus0 at vioscsi0: 16 targets, 1024 luns per target
hdaudio0 at pci0 dev 5 function 0: HD Audio Controller
hdaudio0: interrupting at msi2 vec 0
hdaudio0: HDA ver. 1.0, OSS 4, ISS 4, BSS 0, SDO 1, 64-bit
hdafg0 at hdaudio0: vendor 1af4 product 0022
hdafg0: DAC00 2ch: Speaker [Jack]
hdafg0: ADC01 2ch: Line In [Jack]
hdafg0: 2ch/2ch 16000Hz 22050Hz 32000Hz 44100Hz 48000Hz 88200Hz 96000Hz PCM16
audio0 at hdafg0: playback, capture, full duplex, independent
audio0: slinear_le:16 2ch 48000Hz, blk 1920 bytes (10ms) for playback
audio0: slinear_le:16 2ch 48000Hz, blk 1920 bytes (10ms) for recording
spkr0 at audio0: PC Speaker (synthesized)
wsbell at spkr0 not configured
isa0 at pcib0
attimer0 at isa0 port 0x40-0x43
pcppi0 at isa0 port 0x61
spkr1 at pcppi0: PC Speaker
wsbell at spkr1 not configured
midi0 at pcppi0: PC speaker
sysbeep0 at pcppi0
attimer0: attached to pcppi0
acpicpu0 at cpu0: ACPI CPU
acpicpu0: C1: HLT, lat   0 us, pow     0 mW
acpicpu1 at cpu1: ACPI CPU
acpicpu2 at cpu2: ACPI CPU
acpicpu3 at cpu3: ACPI CPU
cpu0: CPU base freq 1500000000 Hz
cpu0: CPU max freq 3900000000 Hz
cpu0: TSC freq CPUID 1497600000 Hz
cpu0: TSC freq calibrated 1396657000 Hz
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
autoconfiguration error: ERROR: 43778851 cycle TSC drift observed
fd0 at fdc0 drive 0: 1.44MB, 80 cyl, 2 head, 18 sec
sd0 at scsibus0 target 0 lun 0: <QEMU, QEMU HARDDISK, 2.5+> disk fixed
sd0: 30720 MB, 16383 cyl, 16 head, 240 sec, 512 bytes/sect x 62914560 sectors
sd0: GPT GUID: 65ba8dc6-924e-42ea-a203-23da6b8a35d4
dk0 at sd0: "VMROOT", 54523904 blocks at 64, type: ffs
dk1 at sd0: "VMSWAP", 8388608 blocks at 54523968, type: swap
sd0: async, 8-bit transfers, tagged queueing
IPsec: Initialized Security Association Processing.
aes: Intel AES-NI
chacha: x86 SSE2 ChaCha
WARNING: 1 error while detecting hardware; check system log.
boot device: sd0
root on dk0 dumps on dk1
root file system type: ffs
kern.module.path=/stand/amd64/9.99.92/modules
clock: unknown CMOS layout
wsdisplay0: screen 1 added (80x25, vt100 emulation)
wsdisplay0: screen 2 added (80x25, vt100 emulation)
wsdisplay0: screen 3 added (80x25, vt100 emulation)
wsdisplay0: screen 4 added (80x25, vt100 emulation)

無事にdk0 at sd0 at scsibus0 at vioscsi0 at virtio1から起動できました。

qemu上でNetBSD/amd64-currentを使ってみる (VirtIO Block Device)

この記事は、NetBSD Advent Calendar 2021の5日目の記事です。

はじめに

VPSサービスの提供する仮想マシンにNetBSD/amd64-currentをインストールした時の話を書こうと思ったのですが、 どうにも準備ができていません。 今回から何回かに分けて、その前準備としてやってみていた、qemu上でNetBSD/amd64-currentを動かした際のリポートをしたいと思います。 今回は、VirtIO Block Device (virtio-blk)を使う場合について、書きたいと思います。

VirtIO Block Deviceとは?

VirtIOの仕様というのは、OASISにより標準化されているようです。 仕様書によると、いわゆるvirtio-blkというのが、VirtIO Block Deviceのことであるようです。 NetBSDですと、virtio(4)のman pageにあるld* at virtio?というのが それに当たるようです。

さくらのVPSConoHa VPSで提供されている VPSの標準のブロックデバイスは、このvirtio-blkになっていました。

qemuを用意する

まずはホストとなるNetBSD/amd64 9.99.92のマシンでqemuをインストールします。 以下のようにpkgsrc/emulators/qemuをインストールするので良いでしょう。 私はqemu 6.2.0リリースに備えて、自分のpkgsrcツリーでは、qemu 6.2.0-rc4を用意しています。 ですので以下の例は全てqemu-6.2.0rc4パッケージによるものですが、誰でも使えるqemu-6.1.0nb5でも特に差はないはずです。

# cd /usr/pkgsrc/emulators/qemu
# make install

私は、/etc/mk.confPKG_OPTIONS.qemu=gtk3という行を追加しているため、 標準の状態のpkgsrc/emulators/qemuパッケージとは異なりますが、今回の内容を再現するには影響はしないと思います。

qemuでvirtio-blkを使うように指定してNetBSD/amd64-currentをインストールする

インストールするには、NetBSD/amd64-currentのインストールイメージを入手しないといけません。 CD-R用のISOイメージでなく、BIOS (CSM)ブート用とUEFIブート用のそれぞれのUSBスティック等で使えるディスクイメージも提供されていますが、 今回はISOイメージを使ってインストールしたいと思います。 NetBSD上であれば、ftp(1)コマンドとしてnbftpが使えますので、以下のように実行すれば良いでしょう。 この記事を書いている時点では、202112102310Zというタイムスタンプのものがダウンロードできます。

$ ftp -o NetBSD-9.99.92-amd64_202112102310Z.iso http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/latest/images/NetBSD-9.99.92-amd64.iso

次に、qemuを起動するシェルスクリプトを用意します。VirtIO機能を利用する場合には、コマンドライン引数が長くなりがちですので、 シェルスクリプトの形にまとめておくのが良いと思います。 qemu-virtio-blk_install.shというファイル名で、以下のようなシェルスクリプトを作成しておきます。

#!/bin/sh

INSTALLISO=../NetBSD-9.99.92-amd64_202112102310Z.iso

sudo modload nvmm

# Install
qemu-system-x86_64 \
        -smp 4 \
        -m 4G \
        -accel nvmm \
        -drive driver=qcow2,file=netbsd.qcow2,if=virtio \
        -net nic,model=virtio -net user \
        -rtc base=localtime,clock=host \
        -device intel-hda -device hda-duplex \
        -vga qxl \
        -drive file=${INSTALLISO},index=1,media=cdrom

sudo modunload nvmm

今回はnvmm(4) (NetBSD Virtual Machine Monitor)というNetBSDの機能を使うようにしました。 以下のように実行すれば、qemuの仮想マシンが起動し、その上でNetBSD/amd64 9.99.92が起動しインストーラーにより インストールすることができます。 今回はインストーラーでの各手順については割愛します。 インストールが終わったら、仮想マシンはシャットダウンしておきます。

$ sh ./qemu-virtio-blk_install.sh

インストールしたNetBSD/amd64-currentを起動させる

インストールに必要な設定は省いたコマンドライン引数を指定してqemuを起動させるシェルスクリプトを以下のように用意します。 ファイル名は、qemu-virtio-blk.shとしておきます

#!/bin/sh

qemu-system-x86_64 \
        -smp 4 \
        -m 4G \
        -accel nvmm \
        -drive driver=qcow2,file=netbsd.qcow2,if=virtio \
        -net nic,model=virtio -net user \
        -rtc base=localtime,clock=host \
        -device intel-hda -device hda-duplex \
        -vga qxl

起動するとdmesgは以下のようになります。

Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
    2018, 2019, 2020, 2021 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 9.99.92 (GENERIC) #0: Fri Dec 10 21:57:13 UTC 2021
	mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
total memory = 4095 MB
avail memory = 3941 MB
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
mainbus0 (root)
ACPI: RSDP 0x00000000000F5980 000014 (v00 BOCHS )
ACPI: RSDT 0x00000000BFFE1A2B 000034 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: FACP 0x00000000BFFE18C7 000074 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: DSDT 0x00000000BFFE0040 001887 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: FACS 0x00000000BFFE0000 000040
ACPI: APIC 0x00000000BFFE193B 000090 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: HPET 0x00000000BFFE19CB 000038 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: WAET 0x00000000BFFE1A03 000028 (v01 BOCHS  BXPC     00000001 BXPC 00000001)
ACPI: 1 ACPI AML tables successfully acquired and loaded
ioapic0 at mainbus0 apid 0: pa 0xfec00000, version 0x20, 24 pins
cpu0 at mainbus0 apid 0
cpu0: Use lfence to serialize rdtsc
cpu0: CPU base freq 1500000000 Hz
cpu0: CPU max freq 3900000000 Hz
cpu0: TSC freq CPUID 1497600000 Hz
cpu0: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu0: node 0, package 0, core 0, smt 0
cpu1 at mainbus0 apid 1
cpu1: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu1: node 0, package 0, core 0, smt 1
cpu2 at mainbus0 apid 2
cpu2: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu2: node 0, package 0, core 1, smt 0
cpu3 at mainbus0 apid 3
cpu3: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz, id 0x706e5
cpu3: node 0, package 0, core 1, smt 1
acpi0 at mainbus0: Intel ACPICA 20210930
acpi0: X/RSDT: OemId <BOCHS ,BXPC    ,00000001>, AslId <BXPC,00000001>
LNKS: ACPI: Found matching pin for 0.1.INTA at func 3: 9
LNKB: ACPI: Found matching pin for 0.2.INTA at func 0: 10
LNKC: ACPI: Found matching pin for 0.3.INTA at func 0: 11
LNKD: ACPI: Found matching pin for 0.4.INTA at func 0: 11
LNKA: ACPI: Found matching pin for 0.5.INTA at func 0: 10
acpi0: SCI interrupting at int 9
acpi0: fixed power button present
timecounter: Timecounter "ACPI-Fast" frequency 3579545 Hz quality 1000
hpet0 at acpi0: high precision event timer (mem 0xfed00000-0xfed00400)
timecounter: Timecounter "hpet0" frequency 100000000 Hz quality 2000
pckbc1 at acpi0 (KBD, PNP0303) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (MOU, PNP0F13) (aux port): irq 12
fdc0 at acpi0 (FDC0, PNP0700): io 0x3f2-0x3f5,0x3f7 irq 6 drq 2
lpt0 at acpi0 (LPT1, PNP0400-1): io 0x378-0x37f irq 7
com0 at acpi0 (COM1, PNP0501-1): io 0x3f8-0x3ff irq 4
com0: ns16550a, 16-byte FIFO
qemufwcfg0 at acpi0 (FWCF, QEMU0002): io 0x510-0x51b
qemufwcfg0: <QEMU>
ACPI: Enabled 2 GPEs in block 00 to 0F
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: Intel 82441FX (PMC) PCI and Memory Controller (rev. 0x02)
pcib0 at pci0 dev 1 function 0: Intel 82371SB (PIIX3) PCI-ISA Bridge (rev. 0x00)
piixide0 at pci0 dev 1 function 1: Intel 82371SB IDE Interface (PIIX3) (rev. 0x00)
piixide0: bus-master DMA support present
piixide0: primary channel wired to compatibility mode
piixide0: primary channel interrupting at ioapic0 pin 14
atabus0 at piixide0 channel 0
piixide0: secondary channel wired to compatibility mode
piixide0: secondary channel interrupting at ioapic0 pin 15
atabus1 at piixide0 channel 1
piixpm0 at pci0 dev 1 function 3: Intel 82371AB (PIIX4) Power Management Controller (rev. 0x03)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 1000
piixpm0: 24-bit timer
piixpm0: interrupting at ioapic0 pin 9
iic0 at piixpm0 port 0: I2C bus
vga0 at pci0 dev 2 function 0: Red Hat QXL Video (rev. 0x05)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
virtio0 at pci0 dev 3 function 0
virtio0: network device (rev. 0x00)
vioif0 at virtio0: features: 0x31070020<EVENT_IDX,INDIRECT_DESC,NOTIFY_ON_EMPTY,CTRL_RX,CTRL_VQ,STATUS,MAC>
vioif0: Ethernet address 52:54:00:12:34:56
virtio0: allocated 20480 byte for virtqueue 0 for rx0, size 256
virtio0: using 8192 byte (512 entries) indirect descriptors
virtio0: allocated 81920 byte for virtqueue 1 for tx0, size 256
virtio0: using 69632 byte (4352 entries) indirect descriptors
virtio0: allocated 8192 byte for virtqueue 2 for control, size 64
virtio0: config interrupting at msix0 vec 0
virtio0: queues interrupting at msix0 vec 1
hdaudio0 at pci0 dev 4 function 0: HD Audio Controller
hdaudio0: interrupting at msi1 vec 0
hdaudio0: HDA ver. 1.0, OSS 4, ISS 4, BSS 0, SDO 1, 64-bit
hdafg0 at hdaudio0: vendor 1af4 product 0022
hdafg0: DAC00 2ch: Speaker [Jack]
hdafg0: ADC01 2ch: Line In [Jack]
hdafg0: 2ch/2ch 16000Hz 22050Hz 32000Hz 44100Hz 48000Hz 88200Hz 96000Hz PCM16
audio0 at hdafg0: playback, capture, full duplex, independent
audio0: slinear_le:16 2ch 48000Hz, blk 1920 bytes (10ms) for playback
audio0: slinear_le:16 2ch 48000Hz, blk 1920 bytes (10ms) for recording
spkr0 at audio0: PC Speaker (synthesized)
wsbell at spkr0 not configured
virtio1 at pci0 dev 5 function 0
virtio1: block device (rev. 0x00)
ld0 at virtio1: features: 0x10000a54<INDIRECT_DESC,CONFIG_WCE,FLUSH,BLK_SIZE,GEOMETRY,SEG_MAX>
virtio1: allocated 1060864 byte for virtqueue 0 for I/O request, size 256
virtio1: using 1048576 byte (65536 entries) indirect descriptors
virtio1: config interrupting at msix2 vec 0
virtio1: queues interrupting at msix2 vec 1
ld0: 30720 MB, 16383 cyl, 16 head, 63 sec, 512 bytes/sect x 62914560 sectors
isa0 at pcib0
attimer0 at isa0 port 0x40-0x43
pcppi0 at isa0 port 0x61
spkr1 at pcppi0: PC Speaker
wsbell at spkr1 not configured
midi0 at pcppi0: PC speaker
sysbeep0 at pcppi0
attimer0: attached to pcppi0
acpicpu0 at cpu0: ACPI CPU
acpicpu0: C1: HLT, lat   0 us, pow     0 mW
acpicpu1 at cpu1: ACPI CPU
acpicpu2 at cpu2: ACPI CPU
acpicpu3 at cpu3: ACPI CPU
cpu0: CPU base freq 1500000000 Hz
cpu0: CPU max freq 3900000000 Hz
cpu0: TSC freq CPUID 1497600000 Hz
cpu0: TSC freq calibrated 1425040000 Hz
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
autoconfiguration error: ERROR: 291025806 cycle TSC drift observed
fd0 at fdc0 drive 0: 1.44MB, 80 cyl, 2 head, 18 sec
ld0: GPT GUID: 078cc71c-d564-4e22-959c-c8c7f2f57b6a
dk0 at ld0: "VMROOT", 54523904 blocks at 64, type: ffs
dk1 at ld0: "VMSWAP", 8388608 blocks at 54523968, type: swap
IPsec: Initialized Security Association Processing.
aes: Intel AES-NI
chacha: x86 SSE2 ChaCha
atapibus0 at atabus1: 2 targets
cd0 at atapibus0 drive 0: <QEMU DVD-ROM, QM00003, 2.5+> cdrom removable
cd0: 32-bit data port
cd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
cd0(piixide0:1:0): using PIO mode 4, DMA mode 2 (using DMA)
WARNING: 1 error while detecting hardware; check system log.
boot device: ld0
root on dk0 dumps on dk1
root file system type: ffs
kern.module.path=/stand/amd64/9.99.92/modules
clock: unknown CMOS layout
wsdisplay0: screen 1 added (80x25, vt100 emulation)
wsdisplay0: screen 2 added (80x25, vt100 emulation)
wsdisplay0: screen 3 added (80x25, vt100 emulation)
wsdisplay0: screen 4 added (80x25, vt100 emulation)

無事にld0にあるdk0から起動できました。

NetBSDでCreative BT-W3を使ってみる

この記事は、NetBSD Advent Calendar 2021の2日目の記事です。 2日目から遅刻してすみません。

はじめに

Bluetooth Audio on OpenBSD with the Creative BT-W3という記事を読む前ではあったのですが、 Bluetooth Audioをより安定してNetBSD/amd64-currentで使いたいと思っていました。 確かにbta2dpd(8)を使えば、A2DPプロファイルでSBCではありますが、btsco(4)を使うよりは良い音質で音を聞くことができます。 2020年8月までNetBSD-currentはxhci(4)でアイソクロナス転送をサポートしていなかったので ですが、今はサポートされていますので、uaudio(4)を使うことができます。 ですので、uaudio(4)として認識されるはずのCreative BT-W3を使ってみることにしました。 2021年1月に最初に試した時には使えなかったのですが、NetBSD-currentでは、2021年6月19日以降は使えるようになっています。

Creative BT-W3とは?

BT-W3は、Bluetooth A2DPプロファイル、または、Hands-FreeプロファイルをUSBオーディオクラスのデバイスに変換してくれるアダプターです。 BT-W3とBluetoothヘッドセットをペアリングしておくと、USBヘッドホンやUSBヘッドセットとして利用できます。 Hands-Freeプロファイルのモードの場合には、Bluetoothヘッドセットのマイクも入力として利用できます。 Creativeの商品紹介ページによると、aptX LLやaptX HDも利用できる らしいですが、私の持っているJabra Move WirelessはA2DPではコーデックとしてSBCしかサポートしていませんので、試せていません。 BT-W3は、USB Type-Cのコネクターで接続するようになっていますが、USB Type-CからType-Aに変換するアダプターが附属しています。

NetBSD/amd64-currentにつないでみる

私が最初に試した2021年1月の時点では、”no usable endpoint found”というエラーでuaudio(4)として機能しませんでした。 どうやら、その時点のuaudio(4)が想定するディスクリプターの登場する順序と、BT-W3の持つ順序が異なっているようです。

NetBSDで動くように

FreeBSDの実装を見てみると、ディスクリプターを一定の順番に処理するNetBSDの実装とは違って、ディスクリプター毎にタイプを判別して 登場する順序によらないような実装になっていました。 Creative HP-BTW3 (BT-W3) USB audio device has another descriptor layout #55919で サポートする方法を模索してみましたが、2021年6月19日にJabra Evolve 75を サポートする変更で無事に動くようになりました。

uaudio0 at uhub4 port 1 configuration 1 interface 0
uaudio0: Creative Technology Ltd (0x041e) Creative BT-W3 (0x3270), rev 2.00/1.00, addr 4
uaudio0: audio rev 1.00
audio1 at uaudio0: playback, capture, full duplex, independent
audio1: slinear_le:16 2ch 48000Hz, blk 11520 bytes (60ms) for playback
audio1: slinear_le:16 1ch 48000Hz, blk 5760 bytes (60ms) for recording
spkr2 at audio1: PC Speaker (synthesized)
wsbell at spkr2 not configured
uhidev0 at uhub4 port 1 configuration 1 interface 3
uhidev0: Creative Technology Ltd (0x041e) Creative BT-W3 (0x3270), rev 2.00/1.00, addr 4, iclass 3/0
uhidev0: 3 report ids
uhid0 at uhidev0 reportid 1: input=2, output=0, feature=0
uhid1 at uhidev0 reportid 2: input=18, output=18, feature=0
uhid2 at uhidev0 reportid 3: input=64, output=64, feature=0
uhidev1 at uhub4 port 1 configuration 1 interface 4
uhidev1: Creative Technology Ltd (0x041e) Creative BT-W3 (0x3270), rev 2.00/1.00, addr 4, iclass 3/0
uhidev1: 4 report ids
uhid3 at uhidev1 reportid 1: input=0, output=65, feature=0
uhid4 at uhidev1 reportid 2: input=65, output=0, feature=0
uhid5 at uhidev1 reportid 3: input=0, output=0, feature=3
uhid6 at uhidev1 reportid 4: input=0, output=0, feature=3

おわりに

実を言うと、bta2dpd(8)も2021年3月7日に-nオプションが追加されています。 これで、より安定して使えるようになっているかもしれません。 でも、Dell XPS 13 9300のxhci(4)デバイスは、そもそもあまり安定していないのですが…。

.asiaドメインのWHOIS Privacyサービス

.asiaドメインは、WHOIS Privacy (お名前.comで言うWhois情報公開代行サービスは 利用できないものと思っていたのだが、少なくとも現在はWHOIS Privacyサービスを使っても良いらしい。

DotAsia OrganisationのFAQページによると、.ASIA General FAQ for Registrars and Resellers の部分に、以下のように書かれていて、.asiaとしては提供しないが登録事業者が提供するのであれば利用できるらしい。

Does .Asia registry allow WHOIS Privacy?

While this is not a service we offer at the Registry level, a number of .Asia Accredited Registrars offer domain privacy or WHOIS privacy for Registrants. WHOIS Privacy is accepted by the Registry.

お名前.comは.asiaのドメイン名にはWhois情報公開代行を提供していないし、 Value Domainも以下のようで自由にはできない

レジストラGMOは代行不可。レジストラeNom/KeySystemsは、WHOIS代行は可能ですが、登録後に登録者情報の変更ができません。

結局、Namecheap.comが安いしWHOIS Privacy (Domain privacy protection)も無料で利用可能 だったので、移管することにした。

MPEG 2.5

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