NetBSD on NVMM

この記事は、NetBSD Advent Calendar 2019の18日目の記事です。

はじめに

今年のNetBSDの目玉の一つは、NVMM (NetBSD Virtual Machine Monitor)だと思います。 実際には2018年からあったように思うのですが、NetBSD/amd64上で、AMD製のCPUだけでなくIntel製のCPUでも動くようになったことで、 活用できる幅が広がったように思います。

とは言っても、私のラップトップでは、Windows 10を問題なく動かせるようにはなっていません。 しかし他のマシンではWindows 10 x86_64も動かせるので、これは私の環境に固有の問題だと思います。 (Windows 10を起動させたいのは、Adobe Acrobat DCやWindows版のMozilla Firefoxを動かしたいのが理由でしたが、 そういう用途にはハードウェアを用意するということで解決させました。持ち歩けないのが面倒ですが。)

しかし、NetBSD上でNetBSDを動かすには十分な動作速度の環境のように感じています。 今回は、私がpkgsrcの各種確認のために使っている設定を紹介します。

ホスト側のNetBSDについて

私は新しい環境が好きなので、ほぼ常にNetBSD/amd64-currentを利用しています。 今日時点では、NetBSD/amd64 9.99.26を使っています。 NVMMは、NetBSD/amd64でしか動きません。 ゲストとしてNetBSD/i386を動かすことはできますが、ホストになれるのは、あくまでNetBSD/amd64だけです。 ハードウェアは、今回はIntel製のCPUであるCore i7-8550Uを搭載したラップトップHP Spectre x368 13-inch ae019TUを使います。 Intel VT-dに対応しているCPUであれば良いように思いますが、問題はファームウェア(BIOS)の方かもしれません。 HP Spectre x368 13-inch ae019TUだと、仮想化に必要な何かがファームウェアで欠けているような気がします。

ゲスト側のNetBSDについて

ゲストは最大128台の仮想マシンで、各仮想マシンには最大256個の仮想CPUと最大128GBのメインメモリーを搭載できるようです。 簡単に試せる最大の仮想CPU数で試してみると、実CPUのスレッド数を超えた数を設定すると、ホスト側のNetBSDでカーネルパニックしたようです。 注意した方が良さそうです。

libnvmm(3)というライブラリーがあるので、自分で仮想マシンモニターを書くこともできるようですが、 標準的には、qemuにNVMMサポートを追加したpkgsrc/wip/qemu-nvmmqemu-system-x86_64コマンドを利用するのことになります。 これは、pkgsrc/emulators/qemuと競合するパッケージなので、pkgsrc/emulators/qemuをインストールした状態で、 pkgsrc/wip/qemu-nvmmqemu-system-x86_64を別名で保持しておくのが良いかもしれません。

# cd /usr/pkgsrc/emulators/qemu
# make install
# cd /usr/pkgsrc/wip/qemu-nvmm
# make
# cp ${WRKSRC}/x86_64-softmmu/qemu-system-x86_64 /opt/bin/qemu-system-x86_64-nvmm
これは以下のように利用します。
# modload nvmm
$ qemu-system-x86_64-nvmm -accel nvmm ...
nvmmデバイスドライバーは、カーネルモジュールで利用するようにした方が良いでしょう。 カーネル構成ファイルで有効にしてしまうと、対応していないCPUにカーネルを持って行った時に困った状況になるかもしれません。

qemuを使うというは、qemuのエミュレートする様々なハードウェアや仕組みを利用できるということでもあります。 ld(4) at virtio(4)をストレージに、vioif(4)をネットワークインターフェイスに設定すれば、通常は全く困らないと思います。

$ qemu-system-x86_64-nvmm -accel nvmm -M pc -m 4G -smp 4 \
-drive driver=qcow2,file=netbsd-amd64-10.qcow2,if=virtio \
-net nic,model=virtio -net user \
-cdrom NetBSD-install.iso -boot d \ # この行はインストール時以外は使わない。
-rtc base=utc,clock=host
NetBSD/i386を利用する場合にも、qemu-system-x86_64-nvmmを使うのを間違わなければ迷うことはないはずです。

Oracle Cloud (www.oraclecloud.com)で、NetBSD/amd64-currentを起動してみる

この記事は、NetBSD Advent Calendar 2019の17日目の記事です。

はじめに

Oracle Cloudのfree tierが発表されていました。 どうやらOracle Cloudというのは複数のサービスの総称のようなのですが、 今回話題にしているのは、free tierの提供されているものです。 www.oraclecloud.comから申し込みしました。 最初に登録した時には、クレジットカードの認証直後に不明なエラーになって本登録へ進めなかったり、 携帯電話の番号にSMSが来なかったりと、いろいろ進められませんでした。 サポートのチャットに問い合わせても、ショップの問題ですね…と言うだけで、特に直したとか直らないとかいう 連絡も以降ありませんでした。 ですが、今は登録できたので、直してもらえたのだと思います。

今回は、 Importing Custom Linux Imagesを読んで、 NetBSDをLinuxタイプの仮想マシン上で動かす所までやってみました。 ですが、残念ながら使えません。vioscsi(4)の先にsd(4)が認識されない状態です。

作るべきディスクイメージの仕様

Importing Custom Linux Imagesによると、 qcow2かVMDK形式のディスクイメージを作成してアップロードすれば良いようです。 Amazon EC2がddしてスナップショットをとってAMIにして…と言う面倒な手順を踏まないといけないのとは対照的です。 Google Compute Engineと似た感じのようです。

ちなみに、qvow2形式はqemuの標準のディスクイメージ形式で、VMDKはVirtualBoxの標準のディスクイメージ形式です。 どちらもqemuで扱えるので、qemu-system-x86_64でディスクイメージを作成しようと思います。 VirtualBoxのVMDK形式が使えるのがOracleっぽい感じです。

ディスクイメージの作成

qcow2で3 GBのディスクイメージを作成し、このディスクイメージから起動するようにします。 Importing Custom Linux Imagesによると、

  • ディスクイメージサイズは400 GB以下
  • BIOSブートでなくてはいけない
  • ディスクイメージ単体で正常に起動しないといけない
  • UUIDで起動ディスクパーティションをブートローダーが認識するのが良い
  • 暗号化されていてはいけない
  • シリアルコンソールが有効になっていると便利
のような条件が書かれていますので。ブートローダー部分以外は従って行こうと思います、

まずは、3 GBのqcow2のディスクイメージを作ります。
$ qemu-img create -f qcow2 netbsd-10.qcow2 3G
次にNetBSDのインストーラーISOイメージをダウンロードします。 201912172010ZのNetBSD-9.99.26-amd64.isoを今回は利用しました。NetBSD-9.99.26-amd64_201912172010Z.isoとファイル名を変えておきます。 http://nycdn.NetBSD.org/pub/NetBSD-daily/HEAD/からダウンロードします。

次に、NetBSDをインストーラーISOイメージからqcow2ディスクイメージにインストールします。

$ qemu-system-x86_64 -m 256 -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd -drive if=none,id=hd,file=netbsd-10.qcow2 -cdrom NetBSD-9.99.26-amd64_201912172010Z.iso -boot d
または
$ qemu-system-x86_64 -m 256 -drive file=netbsd-10.qcow2,if=none,id=drive-virtio-disk0 -device virtio-blk-pci,drive=drive-virtio-disk0,id=virtio-disk0 -cdrom NetBSD-9.99.26-amd64_201912172010Z.iso -boot d
インストール手順はいつもの通りですが、注意が必要そうな箇所のスクリーンショットを掲載しておきます。ハードディスクをld0として認識させた場合の例です。 (sd0であってもld0であっても結果は変わりません)


ld0をインストール先のハードディスクドライブとして選択します。

GPTパーティショニングします。

作ったパーティションには、Labelを付けておくのが良いでしょう。(付けなくても問題はありません)

シリアルコンソールで115200 bpsを選択しておきます。

sshdを有効にしておきます。この後、vioif0でDHCPでIPアドレスを取得するようにしておくと良いでしょう。

起動してみる

Linuxタイプの仮想マシンで起動します。 最初に書きましたが、残念ながらsd0 at scsipi0が認識されません。 シリアルコンソールで操作も可能ですので、ブートメッセージを含めておきたいと思います。

[   1.0000000] pool redzone disabled for 'pdppl'
[   1.0000000] pool redzone disabled for 'kmem-4096'
[   1.0000000] Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
[   1.0000000]     2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
[   1.0000000]     2018, 2019 The NetBSD Foundation, Inc.  All rights reserved.
[   1.0000000] Copyright (c) 1982, 1986, 1989, 1991, 1993
[   1.0000000]     The Regents of the University of California.  All rights reserved.

[   1.0000000] NetBSD 9.99.26 (GENERIC) #0: Tue Dec 17 19:12:50 UTC 2019
[   1.0000000]  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
[   1.0000000] total memory = 15359 MB
[   1.0000000] avail memory = 14914 MB
[   1.0000000] pool redzone disabled for 'buf4k'
[   1.0000000] pool redzone disabled for 'buf64k'
[   1.0000000] cpu_rng: RDSEED
[   1.0000000] rnd: seeded with 256 bits
[   1.0000000] running cgd selftest aes-xts-256 aes-xts-512 done
[   1.0000030] mainbus0 (root)
[   1.0000030] ACPI: RSDP 0x00000000000F6FE0 000014 (v00 BOCHS )
[   1.0000030] ACPI: RSDT 0x00000000BFFE1575 000030 (v01 BOCHS  BXPCRSDT 00000001 BXPC 00000001)
[   1.0000030] ACPI: FACP 0x00000000BFFE1449 000074 (v01 BOCHS  BXPCFACP 00000001 BXPC 00000001)
[   1.0000030] ACPI: DSDT 0x00000000BFFE0040 001409 (v01 BOCHS  BXPCDSDT 00000001 BXPC 00000001)
[   1.0000030] ACPI: FACS 0x00000000BFFE0000 000040
[   1.0000030] ACPI: APIC 0x00000000BFFE14BD 000080 (v01 BOCHS  BXPCAPIC 00000001 BXPC 00000001)
[   1.0000030] ACPI: HPET 0x00000000BFFE153D 000038 (v01 BOCHS  BXPCHPET 00000001 BXPC 00000001)
[   1.0000030] ACPI: 1 ACPI AML tables successfully acquired and loaded
[   1.0000030] ioapic0 at mainbus0 apid 0
[   1.0000030] cpu0 at mainbus0 apid 0
[   1.0000030] cpu0: Intel(R) Xeon(R) Platinum 8167M CPU @ 2.00GHz, id 0x50654
[   1.0000030] cpu0: package 0, core 0, smt 0
[   1.0000030] cpu1 at mainbus0 apid 1
[   1.0000030] cpu1: Intel(R) Xeon(R) Platinum 8167M CPU @ 2.00GHz, id 0x50654
[   1.0000030] cpu1: package 0, core 0, smt 1
[   1.0000030] acpi0 at mainbus0: Intel ACPICA 20191213
[   1.0000030] acpi0: fixed power button present
[   1.0503574] hpet0 at acpi0: high precision event timer (mem 0xfed00000-0xfed00400)
[   1.0622078] pckbc1 at acpi0 (KBD, PNP0303) (kbd port): io 0x60,0x64 irq 1
[   1.0622078] pckbc2 at acpi0 (MOU, PNP0F13) (aux port): irq 12
[   1.0622078] FDC0 (PNP0700) at acpi0 not configured
[   1.0622078] COM1 (PNP0501) at acpi0 not configured
[   1.0622078] qemufwcfg0 at acpi0 (FWCF, QEMU0002): io 0x510-0x51b
[   1.0622078] ACPI: Enabled 2 GPEs in block 00 to 0F
[   1.0622078] pckbd0 at pckbc1 (kbd slot)
[   1.0622078] pckbc1: using irq 1 for kbd slot
[   1.0622078] wskbd0 at pckbd0 mux 1
[   1.0622078] pms0 at pckbc1 (aux slot)
[   1.0622078] pckbc1: using irq 12 for aux slot
[   1.0622078] wsmouse0 at pms0 mux 0
[   1.0622078] pci0 at mainbus0 bus 0: configuration mode 1
[   1.0622078] pchb0 at pci0 dev 0 function 0: Intel 82441FX (PMC) PCI and Memory Controller (rev. 0x02)
[   1.0622078] pcib0 at pci0 dev 1 function 0: Intel 82371SB (PIIX3) PCI-ISA Bridge (rev. 0x00)
[   1.0622078] piixide0 at pci0 dev 1 function 1: Intel 82371SB IDE Interface (PIIX3) (rev. 0x00)
[   1.0622078] piixide0: primary channel interrupting at ioapic0 pin 14
[   1.0622078] atabus0 at piixide0 channel 0
[   1.0622078] piixide0: secondary channel interrupting at ioapic0 pin 15
[   1.0622078] atabus1 at piixide0 channel 1
[   1.0622078] uhci0 at pci0 dev 1 function 2: Intel 82371SB (PIIX3) USB Host Controller (rev. 0x01)
[   1.0622078] uhci0: interrupting at ioapic0 pin 11
[   1.0622078] usb0 at uhci0: USB revision 1.0
[   1.0622078] piixpm0 at pci0 dev 1 function 3: Intel 82371AB (PIIX4) Power Management Controller (rev. 0x03)
[   1.0622078] piixpm0: 24-bit timer
[   1.0622078] piixpm0: interrupting at ioapic0 pin 9
[   1.0622078] iic0 at piixpm0 port 0: I2C bus
[   1.0622078] vga0 at pci0 dev 2 function 0: vendor 1234 product 1111 (rev. 0x02)
[   1.0622078] wsdisplay0 at vga0 kbdmux 1
[   1.0622078] drm at vga0 not configured
[   1.0622078] virtio0 at pci0 dev 3 function 0
[   1.0622078] virtio0: Virtio Network Device (rev. 0x00)
[   1.0622078] vioif0 at virtio0: Features: 0x11070020<INDIRECT_DESC,NOTIFY_ON_EMPTY,CTRL_RX,CTRL_VQ,STATUS,MAC>
[   1.0622078] vioif0: Ethernet address 02:00:17:00:33:23
[   1.0622078] virtio0: config interrupting at msix0 vec 0
[   1.0622078] virtio0: queues interrupting at msix0 vec 1
[   1.0622078] virtio1 at pci0 dev 4 function 0
[   1.0622078] virtio1: Virtio SCSI Device (rev. 0x00)
[   1.0622078] vioscsi0 at virtio1: Features: 0x10000000<INDIRECT_DESC>
[   1.0622078] vioscsi0: cmd_per_lun 128 qsize 128 seg_max 126 max_target 255 max_lun 16383
[   1.0622078] virtio1: config interrupting at msix1 vec 0
[   1.0622078] virtio1: queues interrupting at msix1 vec 1
[   1.0622078] scsibus0 at vioscsi0: 16 targets, 1024 luns per target
[   1.0622078] isa0 at pcib0
[   1.0622078] com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
[   1.0622078] com0: console
[   1.0622078] attimer0 at isa0 port 0x40-0x43
[   1.0622078] pcppi0 at isa0 port 0x61
[   1.0622078] spkr0 at pcppi0: PC Speaker
[   1.0622078] wsbell at spkr0 not configured
[   1.0622078] midi0 at pcppi0: PC speaker
[   1.0622078] sysbeep0 at pcppi0
[   1.0622078] fdc0 at isa0 port 0x3f0-0x3f7 irq 6 drq 2
[   1.0622078] attimer0: attached to pcppi0
[   1.0622078] acpicpu0 at cpu0: ACPI CPU
[   1.0622078] acpicpu1 at cpu1: ACPI CPU
[   1.6691518] uhub0 at usb0: NetBSD (0000) UHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
[   4.0319889] uhidev0 at uhub0 port 1 configuration 1 interface 0
[   4.0319889] uhidev0: QEMU (0x627) QEMU USB Tablet (0x01), rev 2.00/0.00, addr 2, iclass 3/0
[   4.0427834] ums0 at uhidev0: 3 buttons and Z dir
[   4.0529171] wsmouse1 at ums0 mux 0
[   4.0674155] boot device: <unknown>
[   4.0674155] root device:
[   8.1469334] use one of: vioif0 ddb halt reboot
Oracle Cloudの操作もややこしいので、sd0 at scsipi0の問題に目処がついたら、詳しい操作を書いておきたいと思います、。

USB Attached SCSIなマスストレージをNetBSDにつないでみる

この記事は、NetBSD Advent Calendar 2019の16日目の記事です。

はじめに

NetBSDなマシンにUSBマスストレージをつなげて使っていますが、USB Attached SCSI接続なマスストレージは持っておらず、 つないだことがありませんでした。 qemuでUSB Attached SCSI接続なマスストレージを仮想デバイスとして用意できることに気付いたので、 どう認識されるか試してみました。

NetBSD/amd64-currentを起動してみる

あらかじめ、GPT BIOSブートできるようなqcow2ディスクイメージを用意しておきました。 これで起動した仮想マシンに、新たに作った1 GBのディスクイメージをUSB Attached SCSI接続してみます。 qemuの文書 (qemu usb storage emulation)を参考にしてみます。

$ qemu-system-x86_64 -smp 2 -hda netbsd-10.qcow2 -drive if=none,id=stick,file=usb-attached-scsi.qcow2 \
-device nec-usb-xhci,id=xhci -device usb-storage,bus=xhci.0,drive=stick

以下はとりあえず無害のようですが、umass0までは認識されてもsd(4)までは進まないようです。

usbd_free_xfer: timeout_handle pending
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 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.26 (GENERIC) #0: Tue Dec 17 19:12:50 UTC 2019
 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
total memory = 127 MB
avail memory = 98568 KB
pool redzone disabled for 'buf4k'
pool redzone disabled for 'buf64k'
rnd: seeded with 256 bits
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
running cgd selftest aes-xts-256 aes-xts-512 done
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
QEMU Standard PC (i440FX + PIIX, 1996) (pc-i440fx-4.2)
mainbus0 (root)
ACPI: RSDP 0x00000000000F5870 000014 (v00 BOCHS )
ACPI: RSDT 0x0000000007FE15C9 000030 (v01 BOCHS  BXPCRSDT 00000001 BXPC 00000001)
ACPI: FACP 0x0000000007FE149D 000074 (v01 BOCHS  BXPCFACP 00000001 BXPC 00000001)
ACPI: DSDT 0x0000000007FE0040 00145D (v01 BOCHS  BXPCDSDT 00000001 BXPC 00000001)
ACPI: FACS 0x0000000007FE0000 000040
ACPI: APIC 0x0000000007FE1511 000080 (v01 BOCHS  BXPCAPIC 00000001 BXPC 00000001)
ACPI: HPET 0x0000000007FE1591 000038 (v01 BOCHS  BXPCHPET 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: QEMU Virtual CPU version 2.5+, id 0x663
cpu0: package 0, core 0, smt 0
cpu1 at mainbus0 apid 1
cpu1: QEMU Virtual CPU version 2.5+, id 0x663
cpu1: package 1, core 0, smt 0
acpi0 at mainbus0: Intel ACPICA 20191213
acpi0: X/RSDT: OemId <BOCHS ,BXPCRSDT,00000001>, AslId <BXPC,00000001>
LNKS: ACPI: Found matching pin for 0.1.INTA at func 3: 9
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
acpi0: SCI interrupting at int 9
acpi0: fixed power button present
timecounter: Timecounter "ACPI-Safe" frequency 3579545 Hz quality 900
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 (PNP0700) at acpi0 not configured
LPT (PNP0400) at acpi0 not configured
COM1 (PNP0501) at acpi0 not configured
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: vendor 1234 product 1111 (rev. 0x02)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
wm0 at pci0 dev 3 function 0: Intel i82540EM 1000BASE-T Ethernet (rev. 0x03)
wm0: interrupting at ioapic0 pin 11
wm0: 32-bit 33MHz PCI bus
wm0: 64 words (6 address bits) MicroWire EEPROM
wm0: Ethernet address 52:54:00:12:34:56
wm0: 0x200402<LOCK_EECD,IOH_VALID,WOL>
makphy0 at wm0 phy 1: Marvell 88E1011 Gigabit PHY, rev. 0
makphy0: Failed to access EADR. Are you an emulator?
makphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
xhci0 at pci0 dev 4 function 0: Red Hat product 000d (rev. 0x01)
xhci0: interrupting at msix0 vec 0
xhci0: xHCI version 1.0
usb0 at xhci0: USB revision 3.0
usb1 at xhci0: USB revision 2.0
isa0 at pcib0
lpt0 at isa0 port 0x378-0x37b irq 7
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
attimer0 at isa0 port 0x40-0x43
pcppi0 at isa0 port 0x61
spkr0 at pcppi0: PC Speaker
wsbell at spkr0 not configured
midi0 at pcppi0: PC speaker
sysbeep0 at pcppi0
fdc0 at isa0 port 0x3f0-0x3f7 irq 6 drq 2
attimer0: attached to pcppi0
acpicpu0 at cpu0: ACPI CPU
acpicpu0: C1: HLT, lat   0 us, pow     0 mW
acpicpu1 at cpu1: ACPI CPU
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
uhub0 at usb0: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 3.00/1.00, addr 0
uhub0: 4 ports with 4 removable, self powered
uhub1 at usb1: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 0
uhub1: 4 ports with 4 removable, self powered
fd0 at fdc0 drive 0: 1.44MB, 80 cyl, 2 head, 18 sec
IPsec: Initialized Security Association Processing.
usbd_free_xfer: timeout_handle pending
xhci0: invalid mps 2^64 for SS ep0, using 512
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
usbd_free_xfer: timeout_handle pending
umass0 at uhub0 port 1 configuration 1 interface 0
umass0: QEMU (0x46f4) USB Attached SCSI HBA (0x03), rev 3.00/0.00, addr 1
wd0 at atabus0 drive 0
wd0: <QEMU HARDDISK>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 3072 MB, 6241 cyl, 16 head, 63 sec, 512 bytes/sect x 6291456 sectors
wd0: GPT GUID: cf250d44-cfa0-478f-9269-d68811369ada
dk0 at wd0: "6fb45348-e6e1-44f0-a5c8-86cbae8b162f", 5242813 blocks at 64, type: ffs
dk1 at wd0: "25fe867a-0636-4b4a-b261-85228808017a", 1048543 blocks at 5242880, type: swap
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(piixide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)
boot device: wd0
root on dk0 dumps on dk1
root file system type: ffs
kern.module.path=/stand/amd64/9.99.26/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)
USB Attached SCSI接続のマスストレージと、 qemuのxhciをNetBSDでエラーなく動かせるようにするという課題が明らかになったと言うことで。

NetBSD/amiga-current on pkgsrc/emulators/fs-uae-3.0.2

この記事は、NetBSD Advent Calendar 2019の13日目の記事です。

はじめに

WinUAEというm68k AmigaのエミュレーターでNetBSD/amiga-currentを動かしてみていました。 ですが、NetBSD上で動くpkgsrc/emulators/fs-uaeというm68k Amigaエミュレーターがありますので、その上でNetBSD/amigaを動かしたい思ってしまいます。 今回は、pkgsrc/emulators/fs-uaeからインストールできるFS-UAE 3.0.2でNetBSD/amiga-currentを動かすことができたので書いておきたいと思います。

ハードディスクイメージの準備

これは、改めて実施しても良かったのですが、WinUAEで作った.hdfファイルなハードディスクイメージを利用できるようなので、流用してしまいました。 10日目の記事をご覧いだだければと思います。 書いた時には、スワップ領域のIdentifierを入力し間違えていてスワップ領域として利用できていませんでしたが、今日になって間違いに気付きました。 ハードディスクイメージファイルを準備する際には、注意してもらえればと思います。

FS-UAEのインストール

以下のように実行することでインストールできます。

# cd /usr/pkgsrc/emulators/fs-uae
# make install
これで準備ができました。 ここで、fs-uaeコマンドを一度実行しておきます。 そうすることで、~/FS-UAE以下のディレクトリー構造が作成されます。 ここに設定ファイルやハードディスクイメージファイルを配置していきます。

FS-UAEの設定

FS-UAE 3.0.2には、WinUAEのような詳細な設定をできる画面は用意されていないようです。 ですので、各種設定は手作業で~/FS-UAE以下に施していくことになります。 まずは、ハードディスクイメージファイルをWinUAEの環境から持って来て以下のように配置します。

$ ls ~/FS-UAE/Hard\ Drives
netbsd.hdf
次に、A3000をエミュレートするように設定ファイルを書いていきます。 www.fs-uae.netの解説は分かりやすくありません。 以下のようにテキストファイルDefault.fs-uaeを作成します。
$ less ~/FS-UAE/Configurations/Default.fs-uae
[config]
amiga_model = A3000 # Amiga A3000をエミュレートします。
kickstart_rom_file = amiga-os-310-a3000.rom # Kickstart ROMは、WinUAEの場合と一緒のものを指定しました。
hard_drive_0_controller = scsi # ハードディスクドライブはSCSI接続でないとNetBSDから認識されません。
hard_drive_0 = netbsd.hdf # ~/FS-UAE/Hard\ Drivesディレクトリー内のファイル名を指定します。
accuracy = -1 # 最速で動作させます。
chip_memory = 2048 # 以下2行はRAMの容量を設定しています。
zorro_iii_memory = 262144
続いて、Amiga Foreverで入手したKickstart ROMを配置します。
$ ls ~/FS-UAE/Kickstarts
amiga-os-310-a3000.rom
これで準備完了です。

FS-UAEでNetBSD/amiga-currentを起動させてみる

fs-uaeコマンドを実行すると、下図のような起動画面になります。 ネットワークの設定を試していないので、dmesgは取れていません。

NetBSDでビデオ編集してみる

この記事は、NetBSD Advent Calendar 2019の11日目の記事です。

はじめに

普段はNetBSDな環境しか持ち歩いていないので、NetBSDで全てを完了させられると便利です。 そうそうしていることではないのですが、ビデオ編集というのはNetBSDで実現できていませんでした。 最近のpkgsrcでは、pkgsrc/multimedia/olive-editorpkgsrc/multimedia/pitiviが収録されていますので、 実際に編集できそうです。 これら2つを使ってみました。 利用したビデオファイルは、Blender InstututeのSintel 4K版です。

pkgsrc/multimedia/olive-editorpkgsrc/multimedia/pitiviを比較する

pkgsrc/multimedia/olive-editorをインストールする

olive-editorについては、特に注意することはありませんでした。 以下のように実行することで、インストール可能です。

# cd /usr/pkgsrc/multimedia/olive-editor
# make install
これで、olive-editor-0.1.1がインストールできます。 依存関係を見ると、pkgsrc/multimedia/libvaをbuildlinkしています。 私の利用している環境では、Sintel 4K版はIntel Quick Sync Videoのデコーダーの支援がないとスムースに再生できないことは分かっているので、 期待できます。

pkgsrc/multimedia/pitiviをインストールする

pitiviは、GStreamerをベースにしたソフトウェアのようです。 注意点として、pkgsrc/graphics/py-matplotlibとして3.1.2を利用するようにしてください。 そうしないとランタイムエラーで起動することはできません。 以下のように実行することで、インストール可能です。

# cd /usr/pkgsrc/multimedia/pitivi
# make install
手元には未コミットですが、pkgsrc/multimedia/gst-plugin1-vaapiがあるので、インストールしておきます。 また、.mkvファイルを開くために、pkgsrc/multimedia/gst-plugin1-goodもインストールしておきます。

pkgsrc/multimedia/olive-editorを使ってみる

File -> Importから素材を取り込むことができます。 今回は、Sintel.2010.4k.mkvを取り込みました。 プレビューでの再生もIntel Quick Sync Videoの効果があるようでスムースに再生できました。

Exportは、Intel Quick Sync Videoの効果があるかは分かりませんでした。

pkgsrc/multimedia/pitiviを使ってみる

未コミットのpkgsrc/multimedia/gst-plugin1-vaapiを使うと、カーネルパニックしてしまうようです。 gst=play-1.0コマンドからgst-plugin1-vaapiを使ってもカーネルパニックはしないので、 もう少し問題の追求が必要なようです。 pkgsrc/multimedia/gst-plugins1-libavをインストールしておけば使用は問題ないですが、 ハードウェアによるアクセラレーションはないので、私のラップトップでは常用は難しそうです。

NetBSD/amiga-current on WinUAE Amiga m68k emulator

この記事は、NetBSD Advent Calendar 2019の10日目の記事です。

はじめに

ウェブを検索してみると、NetBSD/amigaをWinUAEというm68kを搭載したAmigaというマシンでNetBSD/amigaを動かした記録が見付かります。 ですが、なかなか手元で再現させられる情報がまとまっていないように見えました。 折角、Amiga ForeverでAmigaマシンのROM (Kickstart ROMと呼ばれています)とWorkbenchというAmigaDOSのGUI環境を 購入したので、試行錯誤してみました。

Kickstart ROMとWorkbenchを入手する

Amiga ForeverでAmiga Forever Plus Editionを購入すると、以下の2つのファイルが手に入ります。

  • amiga-os-310-a3000.rom (Kickstart ROMのバージョン3.1で、A3000マシン用)
  • workbench-311.hdf (Workbench 3.1のHDDイメージ)
実際の手順は、NetBSD/amiga 7用のインストール手順書の通りに進めてみます。

Amigaマシンを設定する1

68030を搭載したA3000をベースに設定することにしました。 WinUAEのQuickstartでA3000を選択し、Set configurationボタンを押します。 . メモリーもZ3 Fastを適当に増やしておきます。

HDイメージを用意する

当面の目標としては、NetBSD/amigaの起動するSCSI-2接続のHDDイメージ(.hdfファイル)を作成することです。 ですが、私はSCSI-2接続のHDDディスクイメージをWorkbench 3.1のhdtoolboxコマンドで設定することができませんでした。 これは、私がAmigaDOSについて何も知らないためである可能性が高いです。 とりあえず、SCSI-2接続ではなく、UAE (uaehf.device)という接続にすることで解決できました。

.hdf HDDディスクイメージファイルを作成してしまえば、SCSI-2で接続し直すだけで良いです。 Wrokbench3.1アイコンから、Toolsアイコンを選択し、Toolsウィンドウの右端まで移動してHDToolBoxをダブルクリックすることで、 HDToolBoxを起動します。

次に、.hdfファイルを1GBの容量で作成します。1GBを超えるとHDToolBoxで正常に扱えないようです。 1GB以上で作成したいので、これについては、もっと追求すべきかもしれません。 その上で、HDToolBox上で、Define a New Drive TypeでRead Configurationを実行します。 .hdfファイルを接続し直した際にも、これをする必要がありますし、パーティション設定を初期化したい場合にもこれを実行すると良いようです。 Partitioning Driveを選択し、ルートファイルシステムとスワップ領域用のパーティションを作成します。 HDToolBoxの操作性が全く分からないので、既定値の500MBずつのまま進めました。 (ですが、最終的にスワップ領域を使えない状態になってしまっています。) UDH0をルートファイルシステム、UDH1をスワップ領域にします。 Advanced Optionにチェックし、Bootableにチェックし、Change...ボタンから下図のように設定する必要があります。 細かい設定値はインストール手順書に書かれています。 注意点としては、これもまた書かれていますが、Identifierを手入力した際に、Enterキーを押さないと、0x0になってしまうという点です。 また、Add/Update...ボタンから、事前にIdentifierを登録しておいて、それを選択して使うこともできるはずですが、 .hdf HDDディスクイメージファイルに書き込む際にエラーを発生してしまったので、避けた方が良いかもしれません。 (これもまた、私がAmigaDOSについて何も知らないからだと思いますが。)

※スワップパーティションのIdentifierの値を間違っていました。正しくは、0x4e425301です。こうすることで、ちゃんとスワップ領域として認識されました。(2019-12-18追記)

その上で、WindowsホストのディレクトリーをVF:にマウントし、そこに、AmigaDOS用のxstreamtodevコマンドとminiroot.fs (これは事前に圧縮を解除しておきます)を 置いておき、以下のように実行し、スワップ領域にminiroot.fsを書き込み、インストーラーを起動させる準備をします。

cd VF:
xstreamtodev --input=miniroot.fs --rdb-name=UDH1
(書き込みの進捗状況が表示される。されない場合はターゲットのディスクの指定が間違っている。)

Amigaマシンを設定する2

まずはCPUを実機と同程度の速度に制限するのを止め、最速でエミュレートするようにします。 Fastest possibleを選択します。 また、MMUも必要ですので、MMUを有効にします。

チップセットはFullECSを選択しておきました。 これが一番画面が広いように感じたというだけです。

いろいろ試しましたが、Graphics boardとして、Picasso IV (Village Tronic)/Picasso IV (128k)を選択することで、NetBSD/amigaのブートメッセージを画面表示できるようになりました。 これは、NetBSD 8.0 on Amiga A3000 (WinUAE), Picasso IV graphicsを参考にしました。

ここで、UAE1:に接続されている.hdf HDDディスクイメージファイルをSCSI-2接続に変更します。 合わせて、NetBSD/amigaのインストールISOイメージをSCSI接続のCD-ROMドライブに挿入しておきます。

WinUAEを再起動したら、一息置いてマウスも右と左のボタンを同時に押します。 すると、Amiga Early Startup Control画面に入ることができます。 Boot Options...ボタンから、左側のペインでUDH1を選択し、Useボタンを押して元の画面に戻って、Bootボタンで起動すると、NetBSD/amigaのINSTALLカーネルが起動します。 ちゃんと.hdf HDDディスクイメージファイルをSCSI-2接続に変更しておけば、ルートファイルシステムが見付からないということはないはずです。

NetBSD/amigaのインストールは、インストーラーの促す通りです。 setsの展開には時間がたっぷりかかりますので、気長に進めるのが良さそうです。

最後に、AmigaNet (Hydra Systems)というEthernetアダプターを有効にし、ed(4)として認識された状態の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 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.20 (GENERIC) #0: Fri Dec  6 21:45:14 UTC 2019
        mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amiga/compile/GENERIC
total memory = 264 MB
avail memory = 255 MB
Amiga 3000 (m68030 CPU/MMU m68882 FPU)
memory segment 0 at 07800000 size 00800000
memory segment 1 at 40000000 size 10000000
memory segment 2 at 00000000 size 00200000
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
mainbus0 (root)
clock0 at mainbus0: CIA B system hz 100 hardware hz 709379
timecounter: Timecounter "CIA B" frequency 709379 Hz quality 100
Calibrating delay loop... 46/1024 us
a34kbbc0 at mainbus0
ser0 at mainbus0: input fifo 512 output fifo 32
par0 at mainbus0
kbd0 at mainbus0: CIA A type Amiga
ms0 at mainbus0
grfcc0 at mainbus0
grf0 at grfcc0: width 640 height 400 colors 4
ite0 at grf0: rows 0 cols 0 repeat at (30/100)s next at (10/100)s has keyboard
fdc0 at mainbus0: dmabuf pa 0x1e3658: dmabuf ka 0x727658
fd0 at fdc0 unit 0: 3.5dd 80 cyl, 2 head, 11 sec [9 sec], 512 bytes/sec
ahsc0 at mainbus0
scsibus0 at ahsc0: 8 targets, 8 luns per target
aucc0 at mainbus0
audio0 at aucc0: playback
audio0: slinear_be:16 2ch 28867Hz, blk 40ms for playback
spkr0 at audio0: PC Speaker (synthesized)
zbus0 at mainbus0: i/o size 0x00400000
grfcl0 at zbus0 pa 0x200000 man/pro 2167/21
grf3 at grfcl0: width 640 height 480 colors 16
ite3 at grf3: rows 60 cols 80 repeat at (30/100)s next at (10/100)s has keyboard
grfcl: 4MB Picasso IV being used
grfcl1 at zbus0 pa 0x400000 man/pro 2167/22
ite at grfcl1:  not configured
grfcl2 at zbus0 pa 0xea0000 man/pro 2167/23
ite at grfcl2:  not configured
ed0 at zbus0 pa 0xe90000 man/pro 2121/1ed0: Ethernet address 52:54:05:32:33:34
board at zbus0: pa 0xec0000 man/pro 2011/82 not configured
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
scsibus0: waiting 2 seconds for devices to settle...
cd0 at scsibus0 target 0 lun 0:  cdrom removable
sd0 at scsibus0 target 1 lun 0:  disk fixed
sd0: 1024 MB, 8322 cyl, 4 head, 63 sec, 512 bytes/sect x 2097152 sectors
4 views configured
root on sd0a dumps on sd0b
root file system type: ffs
kern.module.path=/stand/amiga/9.99.20/modules
WARNING: preposterous TOD clock time
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!

Amazon EC2 c5インスタンスでのNetBSD/amd64 9.0_RC1の利用

この記事は、NetBSD Advent Calendar 2019の5日目の記事です。 すっかり遅くなりすみません。

はじめに

昨年のNetBSD Advent Calendarの記事で、 Amazon Web Service EC2 c5インスタンスでNetBSD/amd64-currentを動かそうとした話を書きました。 その時には、ena(4)に関連したカーネルパニックで利用できる状態にはできませんでした。

その後、さいとうさん(msaito@)がxhci(4)と同様の方法で直してくださいました。 AMIを作って起動させるところまでは、 昨年のNetBSD Advent Calendarの記事と同様ですので、 今年度は、ena(4)が使えるようになった状態の報告と、 Get System Logでブートログを表示させる方法を書きたいと思います。 使うのは、先日リリースされたNetBSD/amd64 9.0RC1付近のnetbsd-9です。

ena(4)が使えるようになった状態

AWS EC2では、シリアルコンソールやVNCコンソールはありませんから、sshでログインできなければ操作できません。 ena(4)が使えないといけないのは、そのためです。

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 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.0_RC1 (GENERIC) #0: Mon Dec  2 15:08:52 UTC 2019
 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
total memory = 3881 MB
avail memory = 3745 MB
cpu_rng: RDSEED
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
running cgd selftest aes-xts-256 aes-xts-512 done
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
Amazon EC2 c5.large
mainbus0 (root)
ACPI: RSDP 0x00000000000F8FA0 000014 (v00 AMAZON)
ACPI: RSDT 0x00000000BFFFE360 00003C (v01 AMAZON AMZNRSDT 00000001 AMZN 00000001)
ACPI: FACP 0x00000000BFFFFF80 000074 (v01 AMAZON AMZNFACP 00000001 AMZN 00000001)
ACPI: DSDT 0x00000000BFFFE3A0 0010E9 (v01 AMAZON AMZNDSDT 00000001 AMZN 00000001)
ACPI: FACS 0x00000000BFFFFF40 000040
ACPI: SSDT 0x00000000BFFFF6C0 00087A (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
ACPI: APIC 0x00000000BFFFF5D0 000076 (v01 AMAZON AMZNAPIC 00000001 AMZN 00000001)
ACPI: SRAT 0x00000000BFFFF530 0000A0 (v01 AMAZON AMZNSRAT 00000001 AMZN 00000001)
ACPI: SLIT 0x00000000BFFFF4C0 00006C (v01 AMAZON AMZNSLIT 00000001 AMZN 00000001)
ACPI: WAET 0x00000000BFFFF490 000028 (v01 AMAZON AMZNWAET 00000001 AMZN 00000001)
ACPI: 2 ACPI AML tables successfully acquired and loaded
ioapic0 at mainbus0 apid 0: pa 0xfec00000, version 0x11, 24 pins
cpu0 at mainbus0 apid 0
cpu0: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz, id 0x50657
cpu0: package 0, core 0, smt 0
cpu1 at mainbus0 apid 1
cpu1: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz, id 0x50657
cpu1: package 0, core 0, smt 1
acpi0 at mainbus0: Intel ACPICA 20190405
acpi0: X/RSDT: OemId , AslId 
LNKD: ACPI: Found matching pin for 0.4.INTA at func 0: 11
acpi0: SCI interrupting at int 9
acpi0: fixed power button present
acpi0: fixed sleep button present
timecounter: Timecounter "ACPI-Safe" frequency 3579545 Hz quality 900
pckbc1 at acpi0 (KBD, PNP0303) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (MOU, PNP0F13) (aux port): irq 12
LPT (PNP0400) at acpi0 not configured
COM1 (PNP0501) at acpi0 not configured
ACPI: Enabled 16 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: vendor 8086 product 1237 (rev. 0x00)
pcib0 at pci0 dev 1 function 0: vendor 8086 product 7000 (rev. 0x00)
piixpm0 at pci0 dev 1 function 3: vendor 8086 product 7113 (rev. 0x08)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 1000
piixpm0: 24-bit timer
piixpm0: polling
iic0 at piixpm0 port 0: I2C bus
vga0 at pci0 dev 3 function 0: vendor 1d0f product 1111 (rev. 0x00)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
nvme0 at pci0 dev 4 function 0: vendor 1d0f product 8061 (rev. 0x00)
nvme0: NVMe 1.0
nvme0: for admin queue interrupting at msix0 vec 0
nvme0: Amazon Elastic Block Store, firmware 1.0, serial vol0f4f9afe33c64b139
nvme0: for io queue 1 interrupting at msix0 vec 1 affinity to cpu0
nvme0: for io queue 2 interrupting at msix0 vec 2 affinity to cpu1
ld0 at nvme0 nsid 1
ld0: 3072 MB, 1560 cyl, 64 head, 63 sec, 512 bytes/sect x 6291456 sectors
ena0 at pci0 dev 5 function 0: vendor 1d0f product ec20 (rev. 0x00)
pci0: Elastic Network Adapter (ENA)ena v0.8.1
ena0: initalize 2 io queues
ena0: for MGMNT interrupting at msix1 vec 0
isa0 at pcib0
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
attimer0 at isa0 port 0x40-0x43
pcppi0 at isa0 port 0x61
spkr0 at pcppi0: PC Speaker
wsbell at spkr0 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
ena0: link is UP
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
timecounter: Timecounter "TSC" frequency 3000119080 Hz quality 3000
ld0: GPT GUID: 8e7e8f6a-a91c-4a78-9bc3-c40c38ebbc9c
dk0 at ld0: "AWSROOT", 4194304 blocks at 34, type: ffs
dk1 at ld0: "AWSSWAP", 2097085 blocks at 4194338, type: swap
IPsec: Initialized Security Association Processing.
boot device: ld0
root on dk0 dumps on dk1
root file system type: ffs
kern.module.path=/stand/amd64/9.0/modules
ena0: device is going UP
ena0: for IO queue 0 interrupting at msix1 vec 1 affinity to 1
ena0: for IO queue 1 interrupting at msix1 vec 2 affinity to 0

ここで、com0というのが、Get System Logに出力が表示されるシリアルポートです。 Get System Logに表示されるようにするには、/boot.cfgを以下のように修正します。

$ cat /boot.cfg
menu=Boot normally:rndseed /var/db/entropy-file;consdev com0;boot
menu=Boot single user:rndseed /var/db/entropy-file;boot -s
menu=Drop to boot prompt:prompt
default=1
timeout=5
clear=1
つまり、consdev com0
を追加します。 これにより、Actions → Instance Settings → Get System Log で下図のようにブートメッセージを表示できます。

これで、Linuxのインスタンスと同様に動作させられたのではないでしょうか。

ラップトップのI2C接続なタッチスクリーンをキャリブレーションして快適に使う

この記事は、NetBSD Advent Calendar 2019の3日目の記事です。

はじめに

HP Spectre x360 13-inch ae019TUというラップトップを使っています。 このラップトップには、ペンと指の両方で操作できるタッチスクリーンが搭載されています。 このタッチスクリーンは、NetBSD-currentだと、ims(4)として認識されます。 しかし、画面の表示と一致させるにはキャリブレーションが必要です。

キャリブレーションの方法

NetBSD-currentでは、src/sys/dev/i2c/ims.c 1.2以降、 tpcalibの仕組みでキャリブレーションができるようになっています。 これは、wsmouse_calibcoords構造体に条件を設定してioctl(2)を発行すると実行できます。

その際に与えるべき値は、options DEBUGを指定してビルドしたカーネルで起動すると、ブートメッセージに表示されます。 HP Spectre x360 13-inch ae019TUの場合には、タッチスクリーンは、X方向は0から18344、Y方向は0から10544の値を出力します。

ioctl(2)の実際

ペンで操作する場合のタッチスクリーンは、/dev/wsmouse2に割り当てられています。 この場合の概略の処理は以下のようです。

struct wsmouse_calibcoords calibcoords;
memset(&calibcoords, 0, sizeof(calibcoords));

int fd = open("/dev/wsmouse2", O_RDWR);

/* calibcoords構造体を設定する。 */

ioctl(fd, WSMOUSEIO_SCALIBCOORDS, &calibcoords);
つまり、設定されたcalibcoords構造体を、/dev/wsmouse2に対して、設定(WSMOUSEIO_SCALIBCOORDS)することで、 キャリブレーションができます。

では、calibcoords構造体には何を与えたら良いのでしょうか。 src/sys/dev/wscons/tpcalib.csrc/sys/dev/wscons/mra.cを読むと、 calibcoords.samples[0]に中央の座標、 calibcoords.samples[1]に左上の座標、 calibcoords.samples[2]に左下の座標、 calibcoords.samples[3]に右下の座標、 calibcoords.samples[4]に右上の座標 を指定すれば良いことが分かりました。 今回は、mra.cの想定するようにゆがんだ四角形を画面に合わせるのではありませんが、 簡単ですので、5点を指定してみます。

int X = 18344;
int Y = 10544;
int dispX = 3840 - 1;
int dispY = 2160 - 1;

calibcoords.minx = 0;
calibcoords.maxx = dispX;
calibcoords.miny = 0;
calibcoords.maxy = dispY;

/* center */
calibcoords.samples[0].rawx = X / 2;
calibcoords.samples[0].rawy = Y / 2;
calibcoords.samples[0].x = dispX / 2;
calibcoords.samples[0].y = dispY / 2;

/* top left */
calibcoords.samples[1].rawx = 0;
calibcoords.samples[1].rawy = 0;
calibcoords.samples[1].x = 0;
calibcoords.samples[1].y = 0;

/* bottom left */
calibcoords.samples[2].rawx = 0;
calibcoords.samples[2].rawy = Y;
calibcoords.samples[2].x = 0;
calibcoords.samples[2].y = dispY;

/* bottom right */
calibcoords.samples[3].rawx = X;
calibcoords.samples[3].rawy = Y;
calibcoords.samples[3].x = dispX;
calibcoords.samples[3].y = dispY;

/* top right */
calibcoords.samples[4].rawx = X;
calibcoords.samples[4].rawy = 0;
calibcoords.samples[4].x = dispX;
calibcoords.samples[4].y = 0;
これで、calibcoords構造体は準備できました。

実際に使用する

これをCコンパイラーでコンパイルして、/dev/wsmouse2が開かれて利用されていない状態で実行します。 それによって、以降例えばX window systemを立ち上げると、キャリブレーションされた状態で利用できます。

pkgsrc/editors/xournalppで使ってみます。

必要ない時には、以下のように切り離しておくのが良さそうです。

# /usr/sbin/wsmuxctl -f /dev/wsmux0 -r wsmouse2

NetBSDとGoogle Chtomecast

この記事は、NetBSD Advent Calendar 2019の2日目の記事です。

はじめに

いつだったか忘れてしまいましたが安売りをしていた時に、Google Chromecastを購入していました。 ですが、スマートフォンやPCのGoogle Chromeから投影しないといけないので、 自立しているAmazon Fire TV Stickに比べて活躍の機会があまりありませんでした。

NetBSDラップトップから画面を投影できるのであれば、HDMIケーブルで接続しなくて良いかもしれません。 今回は、NetBSD環境の画面を投影してみました。

ライブラリーを選定する

ウェブを検索してみると、以下の4つの方法が有望そうです。

後ろから2つはnode.jsのモジュールです。 これはpkgsrcではパッケージングしにくいので、上から2つを試してみました。

VLCのscreen://を試す

結果から言うと、依存しているlibmicrodnsがNetBSDに対応しておらず、ビルドできませんでした。 MCAST_JOIN_GROUPがヘッダーファイルで定義されていない場合のコードが、正しくないようです。 RFC3678を良く読まないといけないようなので、今回は断念しました。

pyChromecastを試す

pyChromecastは、pkgsrc/net/py-pychromecastに用意しました。 以下のようにインストールできます。

$ cd /usr/pkgsrc/net/py=pychromecast
$ make install
ただし、pyChromecast自体はライブラリーだけなので、サンプルプログラム等が付属する訳ではありません。 pyChromecastzeroconfというPythonのみで書かれたライブラリーのあかげで、無事に使うことができました。 pyChromecastのREADME.rstを参考に以下のようなファイルを作って実行してみました。 30秒のビデオが再生できました。
import time
import pychromecast

chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == "Living Room TV")
cast.wait()
print(cast.status)

mc = cast.media_controller
mc.play_media('https://www.ryoon.net/~ryoon/BigBuckBunny.mp4', 'video/mp4')
mc.block_until_active()
mc.play()
time.sleep(30)
mc.stop()
Chromecastへ映像を送る方法は分かりました。

次に画面をChromecastに送る方法を考えてみます。 自分のChromecastから見える場所にビデオストリームを置いてやれば良いはずです。 画面をキャプチャーするのは、ffmpegx11grabソースが一番手軽なように思います。 そして、ffmpegと組み合わせるとなると、一番簡単に使えるのはffserverです。 ffserverは、pkgsrc/multimediaffmpeg3を最後に削除されてしまいました。 そこで、今回はffmpeg4パッケージではなくffmpeg3を使うことにします。

さて、そもそも、Chromcastが再生できるビデオストリームとはのような仕様でしょうか? Supported Media for Google Castのページによると、 WebMコンテナーのVP8ビデオであれば再生できそうです。 解像度は、1980×1080も可能なようですが、1280×720で進めてみます。

このようなビデオを配信するffserver3の設定ファイルは以下のようになります。 サウンドは今回は配信しません。

Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 1000
MaxClients 200
MaxBandwidth 10000
CustomLog -

<:Feed screen.ffm>
File /tmp/screen.ffm
FileMaxSize 20M
<:/Feed>

<:Stream screen.webm>
Feed screen.ffm
Format webm
VideoCodec libvpx
VideoFrameRate 30
VideoSize 1280x720
VideoBitRate 512
VideoBufferSize 80
VideoGopSize 30
NoAudio
<:/Stream>
実行は以下のようにします。。
$ ffserver3 -f ffserver3-vp8.conf
これで、http://localhost:8090/screen.ffmffmpeg3コマンドでビデオを送信してやると、 http://10.81.0.117:8090/screen.webm (ここで、10.81.0.117はNetBSDラップトップのIPアドレス)でストリーミング配信されます。

これに画面の左上1280×720ピクセル分を流し込むには、以下のように実行します。

ffmpeg3 -f x11grab -r 30 -s 1280x720 -i :0.0 -vcodec vp8 -c:v libvpx -b:v 2M -threads 2 -s 1280x720 http://localhost:8090/screen.ffm

このストリーミング配信を再生するようにChromecastに指示するのは以下のようなファイルを用意します。

import time
import pychromecast

chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == "Living Room TV")
cast.wait()
print(cast.status)

mc = cast.media_controller
mc.play_media('http://10.81.0.117:8090/screen.webm', 'video/webm; codecs="vp8, vorbis"')
mc.block_until_active()
mc.play()
time.sleep(120)
mc.stop()
ファイル名をscreencast.pyとすると、以下のように実行します。2分間再生します。
$ python3.8 screencast.py

私の環境では、約5秒から15秒で遅れで配信することができました。 ffmpeg3コマンドのオプションを工夫することで、遅延は短くできるかもしれません。

MPEG 2.5

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