NetBSD/amd64-currentをAmazon Web Service EC2 c5インスタンスで動かしてみる

この記事は、 NetBSD Advent Calendar 2018の23日目の記事です。

はじめに

もう1年以上前の話だと思うのですが、Amazon Web Service (AWS) EC2にc5という Linux KVMをAmazonが独自拡張したと言うインスタンスのタイプが追加されました。 その後、同じような仕組みのm5インスタンスと言うもの追加されているようです。 c5インスタンスでは、Elastic Network Adapter (ENA)と言うEthernetアダプター を利用できることが必須になっているようです。 NetBSD/aarch64では、a1インスタンスでena(4)がFreeBSDから移植されていて 無事に動いていますが、 c5インスタンスでのNetBSD/amd64の動作確認結果は聞いたことはありませんでした。

そもそもc5インスタンスで起動できるAMIの作り方も良く分かりませんでした。 今回は、カーネルパニックでena(4)は動かせるまで至りませんでしたが、 c5インスタンス用のAMIの作成をまとめておくことは意味があるかもしれません。

AMIファイルの作り方を調べてみる

AWS EC2のAMIは、直接ダウンロードしてみることはできないようです。 裏にはスナップショットと言うものがあるようですが、Amazonが公開している Amazon LinuxのAMI用のスナップショットを見ることはできないようです。

今回は、FreeBSD/amd64 12のAMIからc5インスタンスを作成し、そのディスクの 構造を見てみました。それを見ると、NetBSDで言うと、GPTパーティションからの BIOSブート(UEFIブートではない)であることが分かりました。 かつて、UEFIブートができないことにGPTを使っていたやり方を思い出せば良さそうです。

ここで、カーネルは、

ena*    at pci? dev ? function ?        # Amazon Elastic Network Adapter
の行をGENERIC設定ファイルに追加した追加したGENERIC_ENA設定ファイルでビルドします。
; 3GBのディスクイメージファイルを作成します
$ dd if=/dev/zero of=./netbsd-c5-gpt-bios-boot.img bs=1g count=3
; vnd(4)を使ってブロックデバイスとして扱えるようにします。
# vndconfig vnd0 netbsd-c5-gpt-bios-boot.img
; GPTパーティションを作る準備をします
# gpt create vnd0
; 2GBのルートパーティションを作成します。私の場合には/dev/dk5として扱えるようになります。
# gpt add -s 2g -t ffs -l AWSROOT vnd0
; 1GBのスワップパーティションを作成します。私の場合には/dev/dk6として扱えるようになります。
# gpt add -t swap -l AWSSWAP vnd0
; ルートパーティションからBIOSブートするように設定します。
# gpt biosboot -A -i 1 vnd0
; ルートパーティションをFFSv2でフォーマットします。
# newfs -O2 /dev/rdk5
; FFSv2で起動できるようにブートローダーを配置します。
# installboot -v /dev/rdk5 /usr/mdec/bootxx_ffsv2
; ユーザーランドをインストールするために/mntにマウントします。
# mount /dev/dk5 /mnt
# cd /usr/src ; 以下でユーザーランドをビルドします。
# ./build.sh -U -O /usr/world/8.99/amd64/obj -T /usr/world/8.99/amd64/tools -D /usr/world/8.99/amd64/destdir -R /usr/world/8.99/amd64/release -u -j 8 -m amd64 tools
# ./build.sh -U -O /usr/world/8.99/amd64/obj -T /usr/world/8.99/amd64/tools -D /usr/world/8.99/amd64/destdir -R /usr/world/8.99/amd64/release -u -j 8 -m amd64 kernel=GENERIC_ENA
# ./build.sh -U -O /usr/world/8.99/amd64/obj -T /usr/world/8.99/amd64/tools -D /usr/world/8.99/amd64/destdir -R /usr/world/8.99/amd64/release -u -j 8 -m amd64 distribution
; ユーザーランドを/mntをルートにしてインストールします。
# ./build.sh -U -O /usr/world/8.99/amd64/obj -T /usr/world/8.99/amd64/tools -D /usr/world/8.99/amd64/destdir -R /usr/world/8.99/amd64/release -u -j 8 -m amd64 -V INSTALLSETS="base comp etc games man misc modules tests text" install=/mnt
; ブートローダーをインストールします。
# cp /usr/mdec/boot /mnt
; カーネルをインストールします (ena(4)が有効になっているカーネルをインストールします)
# cp /usr/world/8.99/amd64/obj/sys/arch/amd64/compile/GENERIC_ENA/netbsd /mnt
; AWS EC2の公開鍵の配置のためのスクリプトを追加します。
# vi /mnt/etc/rc.d/ec2_init
/etc/rc.d/ec2_initは、NetBSD Wikiの Build-up your own NetBSD AMIのウェブページにある以下のような内容です。
#!/bin/sh
#
# PROVIDE: ec2_init
# REQUIRE: NETWORKING
# BEFORE:  LOGIN

$_rc_subr_loaded . /etc/rc.subr

name="ec2_init"
rcvar=${name}
start_cmd="ec2_init"
stop_cmd=":"

METADATA_URL="http://169.254.169.254/latest/meta-data/"
SSH_KEY_URL="public-keys/0/openssh-key"
HOSTNAME_URL="hostname"

SSH_KEY_FILE="/root/.ssh/authorized_keys"

ec2_init()
{
        (
        umask 022
        # fetch the key pair from Amazon Web Services
        EC2_SSH_KEY=$(ftp -o - "${METADATA_URL}${SSH_KEY_URL}")

        if [ -n "$EC2_SSH_KEY" ]; then
                # A key pair is associated with this instance, add it
                # to root 'authorized_keys' file
                mkdir -p $(dirname "$SSH_KEY_FILE")
                touch "$SSH_KEY_FILE"
                cd $(dirname "$SSH_KEY_FILE")

                grep -q "$EC2_SSH_KEY" "$SSH_KEY_FILE"
                if [ $? -ne 0 ]; then
                        echo "Setting EC2 SSH key pair: ${EC2_SSH_KEY##* }"
                        echo "$EC2_SSH_KEY" >> "$SSH_KEY_FILE"
                fi
        fi

        # set hostname
        HOSTNAME=$(ftp -o - "${METADATA_URL}${HOSTNAME_URL}")
        echo "Setting EC2 hostname: ${HOSTNAME}"
        echo "$HOSTNAME" > /etc/myname
        hostname "$HOSTNAME"
        )
}

load_rc_config $name
run_rc_command "$1"
; 実行可能に設定します。
# chmod 555 /mnt/etc/rc.d/ec2_init
; 起動時の設定をします。
# vi /mnt/etc/rc.conf
rc_configured=YES
ec2_init=YES
sshd=YES # for remote shell access to instance
; rootユーザーでログインできるようにします。
# vi /mnt/etc/ssh/sshd_config
PermitRootLogin without-password
; 以下でファイルシステムの設定をします。
# mkdir /mnt/proc /mnt/kern
# vi /mnt/etc/ifconfig.ena0
dhcp
# vi /mnt/etc/fstab
NAME=AWSROOT    /               ffs     rw,log  1 1
NAME=AWSSWAP    none            swap    sw,dp   0 0
kernfs          /kern           kernfs  rw
ptyfs           /dev/pts        ptyfs   rw
procfs          /proc           procfs  rw
tmpfs           /var/shm        tmpfs   rw,-m1777,-sram%25
; /dev以下のノードを作成します。
# cd /mnt/dev
# ./MAKEDEV all
; vnd0を開放します。
# cd ~
# umount /mnt
# vndconfig -u vnd0
これで、ディスクイメージファイルは完成です。 以下で、AMIファイルを作成して行きます。

AMIファイルの作成は、Elastic Block Store (EBS)でディスクを割り当てし、 そのディスクにローカルで作成したディスクイメージを書き込み、 そのスナップショットをとってAMIを作成します。 操作は、Pythonで書かれたawsコマンドを使います。

; pkgsrcからawsコマンドをインストールします。
# cd /usr/pkgsrc/net/py-awscli
# make install

; AWSの認証のための情報と、使用するリージョンの情報、実行結果の表示方法を設定します、
$ aws configure
AWS Access Key ID [None]: XXX
AWS Secret Access Key [None]: XXX
Default region name [None]: us-east-1
Default output format [None]: text

; 既にあるsshの鍵ペアを使って、Amazon Linux 2のHVMのAMIを使ってc5.largeインスタンスを起動させます、
$ aws ec2 run-instances --image-id ami-009d6802948d06e52 --instance-type c5.large --key-name c5-20181220
619017845909    r-0dab8fafc6dbc2a6c
INSTANCES       0       x86_64          False   xen     ami-009d6802948d06e52  i-01dfee86f4d0d109d      c5.large        c5-20181220     2018-12-21T13:41:14.000Z
        ip-172-31-38-245.ec2.internal   172.31.38.245           /dev/xvda      ebs      True            subnet-73de462f hvm     vpc-d459f1ae
CPUOPTIONS      1       2
MONITORING      disabled
NETWORKINTERFACES               0e:de:7c:89:d3:a2       eni-0a38d352461629255  619017845909     ip-172-31-38-245.ec2.internal   172.31.38.245   True    in-use subnet-73de462f  vpc-d459f1ae
ATTACHMENT      2018-12-21T13:41:14.000Z        eni-attach-09acc70fb71f4bd95   True     0       attaching
GROUPS  sg-1d45925e     default
PRIVATEIPADDRESSES      True    ip-172-31-38-245.ec2.internal   172.31.38.245
PLACEMENT       us-east-1d              default
SECURITYGROUPS  sg-1d45925e     default
STATE   0       pending
STATEREASON     pending pending
; これで、i-01dfee86f4d0d109dというインスタンスIDのc5.largeインスタンスが起動されました、

; 起動完了してrunningステータスになっているか確認します。
$ aws ec2 describe-instances --instance-ids i-01dfee86f4d0d109d
ESERVATIONS    619017845909    r-0dab8fafc6dbc2a6c
INSTANCES       0       x86_64          False   True    xen     ami-009d6802948d06e52   i-01dfee86f4d0d109d     c5.large        c5-20181220     2018-12-21T13:41:14.000Z        ip-172-31-38-245.ec2.internal   172.31.38.245   ec2-34-229-210-170.compute-1.amazonaws.com      34.229.210.170  /dev/xvda       ebs     True   subnet-73de462f  hvm     vpc-d459f1ae
BLOCKDEVICEMAPPINGS     /dev/xvda
EBS     2018-12-21T13:41:15.000Z        True    attached        vol-029d14d5198ee2174
CPUOPTIONS      1       2
HIBERNATIONOPTIONS      False
MONITORING      disabled
NETWORKINTERFACES               0e:de:7c:89:d3:a2       eni-0a38d352461629255  619017845909     ip-172-31-38-245.ec2.internal   172.31.38.245   True    in-use subnet-73de462f  vpc-d459f1ae
ASSOCIATION     amazon  ec2-34-229-210-170.compute-1.amazonaws.com      34.229.210.170
ATTACHMENT      2018-12-21T13:41:14.000Z        eni-attach-09acc70fb71f4bd95   True     0       attached
GROUPS  sg-1d45925e     default
PRIVATEIPADDRESSES      True    ip-172-31-38-245.ec2.internal   172.31.38.245
ASSOCIATION     amazon  ec2-34-229-210-170.compute-1.amazonaws.com      34.229.210.170
PLACEMENT       us-east-1d              default
SECURITYGROUPS  sg-1d45925e     default
STATE   16      running
; runningステータスになっていることを確認して次に進みます。

; 3GBのstandardタイプ(磁気ハードディスクドライブ)のEBSボリュームを作成します、
$ aws ec2 create-volume --availability-zone us-east-1d --volume-type standard --size 3

; 作成したEBSボリュームの内容を確認します、
$ aws ec2 describe-volumes --volume-ids vol-076f8c399f56e6753
VOLUMES us-east-1d      2018-12-21T13:44:05.665Z        False   3              available        vol-076f8c399f56e6753   standard

; Amazon Linux 2のインスタンスに作成したEBSボリュームを接続します。
$ aws ec2 attach-volume --instance-id i-01dfee86f4d0d109d --volume-id vol-076f8c399f56e6753 --device "/dev/sdf"
2018-12-21T13:46:15.709Z        /dev/sdf        i-01dfee86f4d0d109d     attaching       vol-076f8c399f56e6753

; 接続できたことを確認します。
$ aws ec2 describe-volumes --volume-ids vol-076f8c399f56e6753
VOLUMES us-east-1d      2018-12-21T13:44:05.665Z        False   3              in-use   vol-076f8c399f56e6753   standard
ATTACHMENTS     2018-12-21T13:46:15.000Z        False   /dev/sdf        i-01dfee86f4d0d109d     attached        vol-076f8c399f56e6753

; もし、送信側セキュリティー設定(ポートごとの通過できる通信の設定)を実施します。
$ aws ec2 authorize-security-group-egress --group-id sg-1d45925e --port 22 --protocol all

; 受信側のセキュリティー設定を実施します。
$ aws ec2 authorize-security-group-ingress --group-id sg-1d45925e --port 22 --protocol all --cidr 0.0.0.0/0

; Amazon Linux 2のディスク領域にディスクイメージファイルを転送します。
$ scp -i c5-20181220.pem netbsd-c5-gpt-bios-boot.img ec2-user@ec2-34-229-210-170.compute-1.amazonaws.com:~/

; sshでAmazon Linux 2にログインします。
$ ssh -i c5-20181220.pem ec2-user@ec2-34-229-210-170.compute-1.amazonaws.com

; 接続したEBSボリュームにディスクイメージファイルを書き込みます。これがスナップショットになり、AMIになります。
[ec2-user@ip-172-31-38-245 ~]$ sudo dd if=netbsd-c5-gpt-bios-boot.img of=/dev/sdf bs=64k

; /dev/sdfに接続したEBSボリュームを取り外します。
$ aws ec2 detach-volume --volume-id vol-076f8c399f56e6753
2018-12-21T13:46:15.000Z        /dev/sdf        i-01dfee86f4d0d109d     detaching       vol-076f8c399f56e6753

; 取り外したEBSボリュームのスナップショットを取得します。これにはしばらく時間がかかります。
$ aws ec2 create-snapshot --volume-id vol-076f8c399f56e6753
        False   619017845909            snap-04eb837b14f764a00  2018-12-21T14:06:20.000Z        pending vol-076f8c399f56e6753   3

; Amazon Linux 2のインスタンスを消します。
$ aws ec2 terminate-instances --instance-ids i-01dfee86f4d0d109d
TERMINATINGINSTANCES    i-01dfee86f4d0d109d
CURRENTSTATE    32      shutting-down
PREVIOUSSTATE   16      running

; スナップショットを使ってAMIを作成します。
$ aws ec2 register-image --architecture x86_64 --name "NetBSD/amd64 8.99.28 with ena" --ena-support --virtualization-type hvm --block-device-mappings 'DeviceName=/dev/sda1,Ebs={SnapshotId=snap-04eb837b14f764a00}' --root-device-name "/dev/sda1"
ami-088a6d6fc2dccd87b
; これで、ami-088a6d6fc2dccd87bというIDのAMIが作成されました。ENAが有効で、c5.largeインスタンスに使えるように仮想化タイプもhvmにしました。
このAMIを使ってc5.largeインスタンスを起動させてみます。

NetBSD/amd64-currentの起動

ami-088a6d6fc2dccd87bを使って、c5.largeインスタンスを作成することで、 NetBSD/amd64-currentを起動させることができます。 起動したら、AWS ConsoleからInstanceを選び、起動させたインスタンスのInstance Settings よりGet Instance Screenshotを選びます。 残念ながらMSI-X割り込みの関係でエラーになってカーネルパニックしてしまっています。

AWS EC2は、sshでログインできないと何もできませんので、 ディスクイメージファイルのカーネルファイル/netbsdを差し替えて アップロードしてEBSボリュームに書き込むのを繰り返してデバッグするしかなさそうです。

NetBSD/amd64でChisel HDLからVerilogを生成してシミュレーションしてみる

この記事は、 NetBSD Advent Calendar 2018の20日目の記事です。

はじめに

MIPSの 命令セットアーキテクチャーと実装が オープンソースになるような時代が来るとは思っていませんでした。 これもRISC-Vへの期待に影響があるのかもしれません。

Chiselと言うハードウェア記述言語は、そのRISC-Vの代表的な実装である Rocket chip の多くの部分を書くのに使われているものです。

今回は、Rocket chipは大規模過ぎるので、Chiselのチュートリアルである Chisel TutorialsのChiselコードをVerilogに変換して、 verilatorでのシミュレーション実行もしてみたいと思います。

私はこれからChiselで書いてみたい回路があるのですが、 NetBSDで生活して良くあるのは、そもそも環境が整わない、整ったと思ったら誤作動している と行ったことなので、既存の正しく動くことの分かっているものが、同じように動くことを 確認するのは大切です。

Chiselの環境の準備

Chiselは、ScalaというJava Virtual Machine (JVM)で動く処理系で書かれています。 Chisel自体が、Scala言語のドメイン固有言語(DSL)になっています。

Chiselの処理系は、sbt (pkgsrc/lang/scala-sbt)を使って各環境ごとに それぞれ用意します。 ですので、/usr/local以下にインストールしておくといったことは 一般的ではないようです。

まずは、pkgsrc.lang/scala-sbtのインストールですが、 NetBSD/amd64のネイティブなOpenJDK 8ではうまく動きません。 Java Native Access (JNA)がサポートされていないのが いけませんし、他にも理由はありそうです。 pkgsrc/lang/openjdk8をちゃんと直さないといけません…。 ですが、ここでは先を急いでpkgsrc/lang/oracle-jdk8を 使うことにしてしまいます。 java.sun.com からLinux/x86_64用のJREとJDKの配布物をダウンロードして$DISTDIR に配置した上で、以下のように実行すれば良いでしょう。

# cd /usr/pkgsrc/lang/scala-sbt
# make ACCEPTABLE_LICENSES=oracle-binary-code-license install
これで、Oracle JDKを追加でインストールしてsbtはそれを使うようにできます。 pkgsrc/lang/openjdk8と共存できるので、 アンインストールは不要です。

Chisel Tutorialsから試してみます。chisel-tutorialの Gitリポジトリーをクローンし、まずはFIRRTLでシミュレーションをしてみます。 Chisel Tutorialsの課題の加算器の解答例をシミュレーションしてみます。 初回は、Chisel自体のインストールも実行されます。

$ git clone git@github.com:ucb-bar/chisel-tutorial.git
$ cd  chisel-tutorial
$ sbt -v "test:runMain solutions.Launcher Adder"
(snip)
[info] Loading settings from build.sbt ...
[info] Set current project to chisel-tutorial (in build file:/home/ryoon/chisel/chisel-tutorial/)
[warn] Multiple main classes detected.  Run 'show discoveredMainClasses' to see the list
[info] Running solutions.Launcher Adder
Starting tutorial Adder
[info] [0.002] Elaborating design...
[info] [1.010] Done elaborating.
Total FIRRTL Compile Time: 508.3 ms
Total FIRRTL Compile Time: 82.5 ms
file loaded in 0.149673865 seconds, 6 symbols, 2 statements
[info] [0.001] SEED 1545137294717
test Adder Success: 10 tests passed in 15 cycles in 0.020284 seconds 739.49 Hz
[info] [0.007] RAN 10 CYCLES PASSED
Tutorials passing: 1
[success] Total time: 4 s, completed 2018/12/18 21:48:16
どうやら、テストまで成功したようです。

次には、Verilogのコードを生成し、Verilatorによるシミュレーションも実施してみます。 ですが、そうやらChiselは、GNU makeがmakeと言う名前でPATH にあることを前提にしているようです。 Chiselをbuildし直したら良いのでしょうが、ここでは簡便に/usr/pkg/bin/gmakemakeとしてシンボリックリンクを作成してしまいます。

# cd /usr/pkgsrc/cad/verilator
# make install
$ ln -s /usr/pkg/bin/gmake make
$ PATH=./:$PATH sbt -v "test:runMain solutions.Launcher Adder --backend-name verilator
      Archiving VAdder__ALL.a ...
ar r VAdder__ALL.a VAdder__ALLcls.o VAdder__ALLsup.o
ranlib VAdder__ALL.a
c++    Adder-harness.o verilated.o verilated_vcd_c.o VAdder__ALL.a    -o VAdder -lm -lstdc++
make: Leaving directory '/home/ryoon/chisel/chisel-tutorial/test_run_dir/solutions/Adder'
sim start on brownie at Tue Dec 18 21:56:19 2018
inChannelName: 00029411.in
outChannelName: 00029411.out
cmdChannelName: 00029411.cmd
STARTING test_run_dir/solutions/Adder/VAdder
[info] [0.001] SEED 1545137775286
Enabling waves..
Exit Code: 0
[info] [0.022] RAN 10 CYCLES PASSED
Tutorials passing: 1
[success] Total time: 6 s, completed 2018/12/18 21:56:19
テストまで完了し成功したようです。 ここで、Verilogのソースコードはtest_run_dir/solutions/Adder/Adder.vに 生成されます。 これをVerilatorでシミュレーションした際の波形ファイルは、test_run_dir/solutions/Adder/Adder.vcdに 生成されます。 pkgsrc/cad/gtkwaveで波形を見ることができます。
# cd /usr/pkgsrc/cad/gtkwave
# make install
$ gtkwave test_run_dir/solutions/Adder/Adder.vcd
ですが、今の私には波形が正しいかを判断することはできません…。

Chiselでの回路の記述と確認は、どうにかNetBSD/amd64上でも実施できそうです。

NetBSD/amd64-current上でIntel Quick Sync Videoを使ってみる

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

はじめに

IntelのCPUに内蔵されているGPUには、Intel Quick Sync Video (QSV)というビデオのデコードとエンコードをする仕組みが入っています。 今回は、KabylakeなIntel Core i7なチップの搭載されているHP Spectre x360 ae019TUで、NetBSD/amd64 8.99.27上で、 H.264のビデオのデコードとエンコードをQSVでさせてみました。 エンコードには、pkgsrc/multimedia/ffmpeg4を使い、 デコードには、pkgsrc/multimedia/mpvを使います。 比較のためにfmpeg4でCPUを使ってH.264を利用しますが、 これには本来はライセンスが必要なはずです。 CPUを使ってH.264のデコード/エンコードをしてはいけないと思います。

Intel QSVを使用する準備

NetBSDでIntel QSVを使うためには、pkgsrc/multimedia/libva (VA API)を使うのが一番良いようです。 Intel Media SDKはもしNetBSDで使えたとしても相当苦労するのが明らかですし、 VDPAUは、2015年以降のコミットは2018年11月の2件のみです。

NetBSD/amd64 8.99.27で必要なものをpkgsrcからインストールします。 pkgsrc/multimedia/ffmpeg4pkgsrc/multimedia/mpvもNetBSD/amd64 8.99.27ではpkgsrc/multimedia/libva に依存するのが既定値になっています。 本当に自分の環境でlibvaサポートが有効になるかを確認したい場合にが、 make show-optionsの出力にvaapiが含まれているかを確認すれば良いでしょう。 libvaからIntel QSVを使うには、pkgsrc/multimedia/intel-vaapi-driverが必要です。 また、libvaの動作確認をするには、pkgsrc/multimedia/libva-utilsがあると良いです。

# cd /usr/pkgsrc/multimedia/ffmpeg4
# make install
# cd /usr/pkgsrc/multimedia/mpv
# make install
# cd /usr/pkgsrc/multimedia/intel-vaapi-driver
# make install
# cd /usr/pkgsrc/multimedia/libva-utils
# make install
これで必要なソフトウェアは準備できました。

本当にIntel QSVが使えるか確認する

mpvffmpeg4を使ってみる前に、libva-utilsパッケージに含まれるvainfoコマンドで、 サポートされているIntel QSVの機能を確認してみます。

$ vainfo
vainfo: VA-API version: 1.3 (libva 2.3.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Kaby Lake - 2.2.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSlice
      VAProfileVP9Profile2            : VAEntrypointVLD
私の環境ではH.264のサポートはデコードもエンコードも有効なようです。

より古いIntel製CPUの場合には、提供されない機能もあるようです。 ですので、全ての環境で同じ結果が表示されるとは限りません。

テスト用のビデオファイルを用意する

良く考えると、私は全くビデオファイルを持っていませんでした。 自由に使えるビデオファイルと言えば、Blender FoundationのBig Buck Bunnyの3Dアニメーションビデオです。 https://download.blender.org/peach/bigbuckbunny_movies/から、 big_buck_bunny_1080p_stereo.aviのファイルをダウンロードしておきます。 これは、MS MPEG4というcodecでエンコードされたファイルのようです。

H.264にエンコードしてみる

ffmpeg4を使ってH.264にエンコードしてみます。 ちょっとマシンの都合が悪く、実際の結果を示せませんが、おおむね以下のような性能でエンコードされました。 大変期待外れな内容です。

エンコーダー CPU (libx264) QSV (h264_vaapi)
実時間に対する倍数 1.7倍程度 1.0倍程度
それぞれの実行時のコマンドは以下のようです。
; CPUエンコードの場合
$ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.avi software.mp4
; QSVエンコードの場合
$ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.avi hardware.mp4
QSVエンコードの場合、load averageは2程度で推移しています。 もしかしたらMS MPEG4のデコードが律速になっているのかもしれません。

big_buck_bunny_1080p_stereo.aviのファイルをH.264エンコードのファイルに変換したファイルを変換元ファイルにして 再度挑戦してみます。

エンコーダー CPU (libx264) QSV (h264_vaapi)
実時間に対する倍数 0.3倍程度 0.7倍程度
それぞれの実行時のコマンドは以下のようです。
; CPUエンコードの場合
$ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.mp4 software.mp4
; QSVエンコードの場合
$ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.mp4 hardware.mp4
余計に悪くなってしまいました。

次にQSVの場合のH.264のデコードも有効にしてみます。

エンコーダー CPU (libx264) QSV (h264_vaapi)
実時間に対する倍数 0.3倍程度 9.3倍程度
それぞれの実行時のコマンドは以下のようです。
; CPUエンコードの場合
$ ffmpeg4 -c:a copy -c:v h264 -level 40 -qp 23 -i big_buck_bunny_1080p_stereo.mp4 software.mp4
; QSVエンコードの場合
$ ffmpeg4 -vaapi_device /dev/dri/card0 -hwaccel vaapi -hwaccel_output_format vaapi -c:v h264_vaapi -level 50 -qp 23 -c:a copy -i big_buck_bunny_1080p_stereo.mp4 hardware.mp4
これくらい差があれば、ありがたさを実感できます。

mpvでのデコード

pkgsrc/multimedia/mpvでIntel QSVでデコードして視聴する場合には、以下のようにします。

$ mpv --hwdec=vaapi --vo=vaapi big_buck_bunny_1080p_stereo.mp4
これで視聴すると、load averageは上がらないようですし、H.264のライセンスのことも気にしなくて良いのかもしれません。

実際には、VP9等のcodecもIntel QSVはサポートしています。そちらの方が有用かもしれません。

明日は、furandon_pigさんが記事を書いてくれます。

Amazon Web Service EC2のa1インスタンスでNetBSD/aarch64を動かしてみる

この記事は、 NetBSD Advent Calendar 2018の9日目の記事です。

はじめに

port-armメーリングリストに、 jmcneill@さんが、 NetBSD on AWS EC2 ARM instances と言う投稿をされました。 AmazonがAmazon Web Service (AWS) EC2にa1インスタンスという64ビットARM (aarch64)を追加していますが、 その上でNetBSD/evbarm64が動くという話です。

今回は、jmcneill@さんが、用意してくれたAMIを使って、a1.middleインスタンス を作り、pkgsrcを使ってみました。

AWS EC2 a1とは

AWS EC2 a1は、Amazonの独自に開発した64ビットARM CPUである AWS Gravitation Processorで動くインスタンスのようです。 jmcneill@さんが、 us-east-1(N. Virginia)にAMIを用意してくれていますので、 us-east-1であれば何の苦もなくインスタンスを用意できるはずです。

今回は、a1.middleインスタンスを使ってみますが、これはCPU: 1基、RAM: 2GiBの インスタンスです。最大構成のa1.4xlargeですと、CPU: 16基、RAM: 32 GiBです。

a1.middleインスタンスを用意する

a1インスタンスだからと言って、特に特別なことはありません。 普通にAWSのインスタンスを作成していきます。 まずは、Community版のAMIで、ami-0c7624c662581e8faを検索して 選択します。ログイン用のssh鍵も生成し、ダウンロードしておきます。

次には、EBSディスクを割り当ててインスタンスを起動させます。

a1.middleインスタンスへログインする

ログインについては、NetBSD Wikiの記事に書かれている通りです。 生成したssh鍵の秘密鍵をダウンロードしてあると思います。それを使って、以下のようにログインします。

$ chmod 600 a1-privatekey.pem
$ ssh -i a1-privatekey.pem root@aws-hostname-address

a1.middleインスタンスの初期設定をする

ログインはできましたが、あまりセキュリティー的に気持ちの良い状態ではありません。 ちょっと試すだけだとしても、以下のような設定はしておいた方が良いでしょう。

# useradd -m ryoon
# passwd ryoon
# su ryoon
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
(手元の端末からssh公開鍵を転送し、~/.ssh/authorized_keysを用意する)
# vi /etc/group
wheel:*:0:root,ryoon
(snip)
operator:*:5:root,ryoon
(snip)
# vi /etc/ssh/sshd_config
(snip)
PasswordAuthentication no
(snip)
UsePam no
# /etc/rc.d/ec2_init stop
# vi /etc/rc.conf
(snip)
ec2_init=NO
(snip)
ここまで設定したら、別ターミナルから自分のユーザーID (ここではryoon)で ログインしてみて、suコマンドでrootユーザーになれる ことまで確認します。成功したら、下のターミナルではログアウトして良いです。

a1.middleインスタンスを使ってみる

ここまでやれば、とりあえずは大きな不安はなく状況を確認できます。 最初にunameの結果を確認しておきます。

$ uname -ap
NetBSD ec2-34-228-210-40.compute-1.amazonaws.com 8.99.26 NetBSD 8.99.26 (GENERIC64) #3: Fri Nov 30 14:40:13 AST 2018  jmcneill@toki.invisible.ca:/home/jmcneill/netbsd/cvs-src/sys/arch/evbarm/compile/obj/GENERIC64 evbarm aarch64

dmesgは以下のようです。

------------------------------------------
kern_vtopdiff         = 0xffffffbf85800000
physical_start        = 0x0000000040000000
kernel_start_phys     = 0x000000007a800000
kernel_end_phys       = 0x000000007b42e000
msgbuf                = 0x000000007c22c000
physical_end          = 0x000000043b000000
VM_MIN_KERNEL_ADDRESS = 0xffffffc000000000
kernel_start_l2       = 0xffffffc000000000
kernel_start          = 0xffffffc000000000
kernel_end            = 0xffffffc000c2e000
pagetables            = 0xffffffc000c2e000
pagetables_end        = 0xffffffc000c39000
kernel_end_l2         = 0xffffffc000e00000
module_start          = 0xffffffc000e00000
module_end            = 0xffffffc002e00000
(kernel va area)
(devmap va area)      = 0xfffffffff0000000
VM_MAX_KERNEL_ADDRESS = 0xffffffffffe00000
------------------------------------------
mpstart
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 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 8.99.26 (GENERIC64) #3: Fri Nov 30 14:40:13 AST 2018
 jmcneill@toki.invisible.ca:/home/jmcneill/netbsd/cvs-src/sys/arch/evbarm/compile/obj/GENERIC64
total memory = 1952 MB
avail memory = 1889 MB
timecounter: Timecounters tick every 10.000 msec
armfdt0 (root)
simplebus0 at armfdt0: ACPI
simplebus1 at simplebus0
acpifdt0 at simplebus0
acpifdt0: using EFI runtime services for RTC
ACPI: RSDP 0x000000007C2D0014 000024 (v02 AMAZON)
ACPI: XSDT 0x000000007C2C00E8 000064 (v01 AMAZON AMZNFACP 00000001      01000013)
ACPI: FACP 0x000000007C2A0000 000114 (v06 AMAZON AMZNFACP 00000001 AMZN 00000001)
ACPI: DSDT 0x000000007C230000 00154F (v03 AMAZON AMZNDSDT 00000001 INTL 20160108)
CPI: APIC 0x000000007C2B0000 0000B8 (v03 AMAZON AMZNAPIC 00000001 AMZN 00000001)
ACPI: SPCR 0x000000007C290000 000050 (v02 AMAZON AMZNSPCR 00000001 AMZN 00000001)
ACPI: GTDT 0x000000007C280000 000060 (v02 AMAZON AMZNGTDT 00000001 AMZN 00000001)
ACPI: MCFG 0x000000007C270000 00003C (v02 AMAZON AMZNMCFG 00000001 AMZN 00000001)
ACPI: SLIT 0x000000007C260000 00002D (v01 AMAZON AMZNSLIT 00000001 AMZN 00000001)
ACPI: IORT 0x000000007C250000 000078 (v01 AMAZON AMZNIORT 00000001 AMZN 00000001)
ACPI: PPTT 0x000000007C240000 0000A0 (v01 AMAZON AMZNPPTT 00000001 AMZN 00000001)
ACPI: 1 ACPI AML tables successfully acquired and loaded
acpi0 at acpifdt0: Intel ACPICA 20180810
acpi0: X/RSDT: OemId , AslId <    ,01000013>
acpi0: MCFG: segment 0, bus 0-255, address 0x0000000020000000
cpu0 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
cpu0: package 0, core 0, smt 0
cpu0: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
cpu0: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
cpu0: Dcache line 64, Icache line 64
cpu0: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
cpu0: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
cpu0: L2 2048KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
cpu0: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
cpu0: auxID=0x11120, GICv3, FP, CRC32, SHA1, SHA256, AES+PMULL, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
gicvthree0 at acpi0: GICv3
gicvthree0: ITS #0 at 0x10080000
gicvthree0: ITS TT0 type 0x1 size 0x80000
gicvthree0: ITS TT1 type 0x4 size 0x10000
gtmr0 at acpi0: irq 27
armgtmr0 at gtmr0: ARM Generic Timer (83333 kHz)
timecounter: Timecounter "armgtmr0" frequency 83333333 Hz quality 500
qemufwcfg0 at acpi0 (FWCF, QEMU0002): mem 0x9020000-0x9020017
qemufwcfg0: <U>
acpipchb0 at acpi0 (PCI0, PNP0A08-PCI0): PCI Express Host Bridge
pci0 at acpipchb0 bus 0
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
vendor 1d0f product 0200 (host bridge) at pci0 dev 0 function 0 not configured
puc0 at pci0 dev 1 function 0: Amazon.com EC2 Serial (com)
com0 at puc0 port 0 (16650-compatible): polling
com0: ns16550a, working fifo
com0: console
nvme0 at pci0 dev 4 function 0: vendor 1d0f product 8061 (rev. 0x00)
nvme0: NVMe 1.0
nvme0: for admin queue interrupting at irq 8192 (MSI-X vec 0)
nvme0: Amazon Elastic Block Store, firmware 1.0, serial vol0b45b29e22629dbda
nvme0: for io queue 1 interrupting at irq 8193 (MSI-X vec 1) affinity to cpu0
ld4 at nvme0 nsid 1
ld4: 30720 MB, 7801 cyl, 128 head, 63 sec, 512 bytes/sect x 62914560 sectors
ena0 at pci0 dev 5 function 0: vendor 1d0f product ec20 (rev. 0x00)
pci0: Elastic Network Adapter (ENA)ena vDRV_MODULE_VER_MAJOR.DRV_MODULE_VER_MINOR.DRV_MODULE_VER_SUBMINOR
ena0: initalize 1 io queues
ena0: for MGMNT interrupting at irq 8194 (MSI-X vec 0)
RES0 (PNP0C02) at acpi0 not configured
plgpio0 at acpi0 (GPO0, ARMH0061-0): mem 0x9030000-0x9030fff irq 39
gpio0 at plgpio0: 8 pins
acpibut0 at acpi0 (PWRB, PNP0C0C-0): ACPI Power Button
acpiged0 at acpi0 (GED1, ACPI0013-0): irq 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
ena0: link is UP
ena0: link state UP (was UNKNOWN)
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
cpu_boot_secondary_processors: writing mbox with 0
cpu_boot_secondary_processors: secondary processors hatched
IPsec: Initialized Security Association Processing.
boot device: ld4
root on ld4a dumps on ld4b
mountroot: trying ext2fs...
mountroot: trying ffs...
root file system type: ffs
kern.module.path=/stand/evbarm/8.99.26/modules
init: copying out path `/sbin/init' 11
ena0: device is going UP
ena0: for IO queue 0 interrupting at irq 8195 (MSI-X vec 1)
Kernel RNG "kernel" runs test FAILURE: too many runs of 1 0s (2686 >= 2685)
cprng kernel: failed statistical RNG test
Kernel RNG "kernel" runs test FAILURE: too many runs of 4 1s (393 >= 384)
cprng kernel: failed statistical RNG test
Kernel RNG "kernel" long run test FAILURE: Run of 26 1s found
cprng kernel: failed statistical RNG test
64ビットARMでのUEFIやACPI、ena(4)など、最近の変更のおかげで 使えていることが良く分かります。

ena(4)がどのように使えているのかも確認してみます。

$ ifconfig
ena0: flags=0x8843 mtu 1500
 capabilities=80200
 enabled=0
 ec_capabilities=4
 ec_enabled=0
 address: 0e:52:89:d3:32:4e
 media: Ethernet autoselect (10Gbase-T full-duplex)
 status: active
 inet6 fe80::af2d:2c6:5f60:bd02%ena0/64 flags 0x0 scopeid 0x1
 inet 172.31.34.124/20 broadcast 172.31.47.255 flags 0x0
lo0: flags=0x8049 mtu 33624
 inet6 ::1/128 flags 0x20
 inet6 fe80::1%lo0/64 flags 0x0 scopeid 0x2
 inet 127.0.0.1/8 flags 0x0
10Gbit Ethernetとして認識されていることが分かります。ですが、ネットワーク速度は実測 できていません。

pkgsrcanoncvs.NetBSD.orgからcheckout して、pkgsrc/multimedia/ffmpeg4をビルドしてみましたが、 体感的には、Intel Core SoloなNetBSD/i386のマシンが思い出されました。 思ったより速いです。

明日は、Intel CPUなマシン上で動くNetBSD/amd64でIntel Quick Sync Videoの機能を 使って、ビデオの再生やエンコードを高速化したいと思います。

pkgsrcでのクロスコンパイル方法 2018年版

この記事は、 NetBSD Advent Calendar 2018の8日目の記事です。

はじめに

pkgsrcには、今目の前にあるマシンとは違うアーキテクチャーの マシンで動くNetBSDのためのバイナリーパッケージを作る仕組みがあります。

基本的には、 pkgsrc/doc/HOWTO-use-crosscompile にあるようにすれば良い訳ですが、実際にやってみた経験のある方は 多くはないかもしれません。

今回はNetBSD/amd64 8.99.25で、 NetBSD/evbearmv7hf-el用 8.99.25のバイナリーパッケージを作成してみます。

クロスツールチェインを用意する

NetBSDはクロスビルドをするためのツールチェインを簡単に作ることができます。 具体的には、以下のようにします。

$ cd /usr/src
$ ./build.sh -U -T /usr/world/9/earmv7hf-el/tools -O /usr/world/9/earmv7hf-el/obj -D /usr/world/9/earmv7hf-el/destdir tools
$ ./build.sh -U -T /usr/world/9/earmv7hf-el/tools -O /usr/world/9/earmv7hf-el/obj -D /usr/world/9/earmv7hf-el/destdir build
これで、/usr/world/9/earmv7hf-el/tools以下にクロスコンパイラーなどが、 /usr/world/9/earmv7hf-el/destdir以下にユーザーランドが用意されます。

このクロスコンパイラーなどを使い、このユーザーランドにパッケージをインストールしつつ パッケージをビルドしていくことになります。

/etc/mk.confの設定

pkgsrcの設定は、NetBSDがホストのであって別段bootstrap pkgsrcを 実行していない場合は、/etc/mk.confに設定を書くことになります。

ここでは、以下のように実行した場合にevbearmv7hf-el用に クロスビルドするようにしてみます。

$ cd /usr/pkgsrc/www/http-parser
$ make USE_CROSS_COMPILE=YES install
/etc/mk.confに以下のように追加します。
USE_CROSS_COMPILE?=no
.if !empty(USE_CROSS_COMPILE:M[yY][eE][sS])
USE_CWRAPPERS=no
#ABI=32
CROSSBASE=${LOCALBASE}/cross
MACHINE_ARCH=earmv7hf
TOOLDIR=/usr/world/8.99/evbearmv7hf-el/tools
CROSS_DESTDIR=/usr/world/8.99/evbearmv7hf-el/destdir
PACKAGES=/usr/pkgbin/earmv7hf
WRKOBJDIR=/usr/tmp/pkgsrc/evbearmv7hf-el
.endif
最近のpkgsrcでは、ビルドを高速化するために pkgsrc/pkgtools/cwrappersというツールを使うようになっています。 ですが、このcwrappersは、クロスビルドには対応できていないようです。 USE_CWRAPPERS=noを指定しておく必要があります。

後はビルドするだけと言いたい所ですが、クロスビルド用のlibtool コマンドをネイティブ環境にインストールしておく必要があります。 クロスビルドしたearmv7hf用のバイナリーパッケージをNetBSD/amd64のユーザーランドに インストールします。 以下のように実行して準備しておきます。

# cd /usr/pkgsrc/cross/cross-libtool-base
# make USE_CROSS_COMPILE=YES package
# pkg_add -m earmv7hf /usr/pkgbin/earmv7hf/All/cross-libtool-base-earmv7hf-2.4.6nb4.tgz

後は、前述のようにコマンドを実行して待つだけです。

$ cd /usr/pkgsrc/www/http-parser
$ make USE_CROSS_COMPILE=YES install
(snip)
$ ll /usr/pkgbin/earmv7hf/All/http-parser-2.8.1.tgz
-rw-r--r--  1 ryoon  wheel  34029 Sep 28 02:08 /usr/pkgbin/earmv7hf/All/http-parser-2.8.1.tgz

ビルド結果の確認

ビルドできたパッケージを確認してみましょう。以下のようにearmv7hf用のバイナリーができている ことが分かります。

$ file libhttp_parser.so.2.0.7
libhttp_parser.so.2.0.7: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, for NetBSD 8.99.25, compiled for: earmv7hf, not stripped

全てのパッケージがクロスビルド可能な訳ではありません。私はpkgsrc/lang/rust のブートストラップキットを作成するために必要なパッケージしか試せていません。 まずはcwrappersでクロスビルドができるようにしたいと思っています。 その次にはPythonがビルドできるようになれば役立ちそうです。

明日は、最近のNetBSD/aarch64でできるようになったと言うAmazon Web Service (AWS) EC2 でのa1インスタンスでのNetBSDの動作を体験してみたいと思います。

pkgsrcでGo言語で書かれたソフトウェアをパッケージにする方法

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

はじめに

pkgsrcのパッケージは、オフラインでビルドできることが求められています。 ですので、ビルドの準備段階や最中に依存するソースコードをダウンロードするのは 避けなくてはいけません。

今日はGo言語で書かれたソフトウエアであるHugo と言うスタティックサイトジェネレーターを例にして、Go言語で書かれたソフトウエアの場合の buildlinkの仕組みを体験してみたいと思います。

依存するソフトウエアの準備方法

pkgsrcでは、configureステージ(典型的には GNU autoconfのconfigureスクリプトを実行する段階で、ビルドの1つ前の段階)の前に WRKSRC(デフォルトではそのパッケージのディレクトリー内にwork ディレクトリー)以下に、依存するパッケージのヘッダーファイルやライブラリファイルを用意して おきます。 このような処理をする場合には、例えば以下のように パッケージのMakefileから buildlink3.mkファイルをインクルードしておきます。

(snip)
.include "../../devel/go-locker/buildlink3.mk"
.include "../../www/go-toml-burntsushi/buildlink3.mk"
.include "../../www/go-urlesc/buildlink3.mk"
.include "../../devel/go-purell/buildlink3.mk"
.include "../../textproc/go-chroma/buildlink3.mk"
(snip)

ヘッダーファイルやライブラリーファイルをWRKSRC以下に配置すると 書きましたが、Go言語の場合には、ちょっと事情が異なり、ソースコードとスタティックライブラリーが 配置されます)。 実際に依存先のソースコードとスタティックライブラリーが格納されるのは、 work/.buildlink/gopkgディレクトリー以下です。 pkgsrc/www/hugoの場合の中身を少し確認してみます。
$ find work/.buildlink/gopkg
(snip)
work/.buildlink/gopkg/src/github.com/disintegration/imaging/utils.go
work/.buildlink/gopkg/src/github.com/disintegration/imaging/utils_test.go
work/.buildlink/gopkg/src/github.com/dlclark
work/.buildlink/gopkg/src/github.com/dlclark/regexp2
work/.buildlink/gopkg/src/github.com/dlclark/regexp2/ATTRIB
work/.buildlink/gopkg/src/github.com/dlclark/regexp2/LICENSE
work/.buildlink/gopkg/src/github.com/dlclark/regexp2/README.md
work/.buildlink/gopkg/src/github.com/dlclark/regexp2/match.go
work/.buildlink/gopkg/src/github.com/dlclark/regexp2/regexp.go
(snip)
以上のように/usr/pkg/gopkgの以下の必要なパッケージの分だけが配置 されています。

パッケージング手順

Hugoの場合には、依存するソフトウエアの情報がREADME.mdに記載されています。 最初のステップは、そこに記載されているソフトウエアがpkgsrcに 収録されているかどうかを確認することから始めます。 Go言語で書かれたソフトウエアは、GitHubやgolang.org、gopkg.inといった ウェブサイトでホスティングされている例が多く、URIがソフトウエアを識別する 名前空間になっているようです。それは、MakefileGO_SRCPATHに指定されていますので、pkgsrcの ツリー内を検索すれば、目的のソフトウエアが既にpkgsrcに 収録されているか分かると思います。

通常、pkgsrcのパッケージを作る際には、 pkgsrc/pkgtools/url2pkgパッケージで提供される url2pkgコマンドを使うの便利ですが、Go言語で書かれたソフトウエアの 場合には、利用してもあまり利点はありません。 既存のGo言語で書かれたソフトウエアのパッケージのディレクトリーをコピーして それを元に作成するのが良いと思います。

ここでは、pkgsrc/www/go-aceパッケージのMakefilelbuildlink3.mkを例に注意点を説明してみます。

# $NetBSD: Makefile,v 1.6 2018/11/04 18:38:08 bsiegert Exp $ # CVSタグは変更は不要です。適切に書き変わります、

DISTNAME= ace-0.0.4b # ウェブブラウザーでダウンロードしてみてファイル名を確認して、それを使用します。
PKGNAME= go-${DISTNAME} # パッケージの名前です。通常はこのままで良いです。
PKGREVISION= 4 # 初回作成時には、PKGREVISIONは含めません。
MASTER_SITES= ${MASTER_SITE_GITHUB:=yosssi/} # GitHubでホスティングされている場合には、MASTER_SITE_GITHUBを使います。ここでは、https://github.com/yosssi/ と展開されます。
CATEGORIES= www # カテゴリーを選択して設定します。
GITHUB_TAG= 71afeb714739f9d5f7e1849bcd4a0a5938e1a70d # リリースもされておらず、タグも打たれていない場合にはハッシュ値を設定します。
GITHUB_PROJECT= ${PKGBASE:S/^go-//} # GitHubのプロジェクト名です。通常はこのままで良いです。

MAINTAINER= pkgsrc-users@NetBSD.org # 自分の電子メールアドレスを設定します。
HOMEPAGE= https://github.com/yosssi/ace # プロジェクトのウェブサイトを設定します。
COMMENT= HTML template engine for Go # パッケージの説明を1行で書きます。
LICENSE= mit # pkgsrc/licenses以下のファイル名でライセンスを指定します。

GO_DIST_BASE= ${GITHUB_PROJECT}-${GITHUB_TAG} # 通常はこのまま良いです。
GO_SRCPATH= github.com/yosssi/ace # GitHubのURIから作成します。

# Avoid a circular dependency on ace-proxy
# 以下の部分は、www/go-ace特有の処理なので、通常は必要ありません。
post-patch:
 ${RUN} ${RM} -rf ${WRKSRC}/examples/cache_options

.include "../../www/go-gohtml/buildlink3.mk" # go-aceの依存するパッケージを指定します。
.include "../../lang/go/go-package.mk" # GO言語で書かれたパッケージ用の定型句です。
.include "../../mk/bsd.pkg.mk" # pkgsrcのパッケージ用の定型句です。
実際には、pkgsrc/pkgtools/pkglintを使って、以下のようにチェックし、 「Looks fine.」となるようにします。
$ cd /usr/pkgsrc/www/go-ace
$ pkglint -Wall -Call

ビルドしてみる

Hugoの場合には、README.mdに依存するパッケージが書かれていましたが、 書かれているパッケージが依存するパッケージまでは書かれていません。 また、こんなに丁寧なではないこともあります。 Go言語のパッケージの場合には、実際にビルドしてみれば簡単に不足するパッケージが 分かります。

ここでは、pkgsrc/www/hugoから

.include "../../devel/go-locker/buildlink3.mk"
の行を削除して、ビルドしてみます。 以下のようにビルドに失敗しました。
===> Building for go-hugo-0.52
/usr/tmp/pkgsrc/www/hugo/work/src/github.com/gohugoio/hugo/cache/filecache/filecache.go:30:2: cannot find package "github.com/BurntSushi/locker" in any of:
        /usr/pkg/go111/src/github.com/BurntSushi/locker (from $GOROOT)
        /usr/tmp/pkgsrc/www/hugo/work/src/github.com/BurntSushi/locker (from $GOPATH)
        /usr/tmp/pkgsrc/www/hugo/work/.buildlink/gopkg/src/github.com/BurntSushi/locker
*** Error code 1

Stop.
make[1]: stopped in /usr/pkgsrc/www/hugo
*** Error code 1

Stop.
make: stopped in /usr/pkgsrc/www/hugo
https://github.com/BurntSushi/lockerがないことが分かりました。 これが既にpkgsrc内にあればbuildlinkすれば良いですし、 なければpkgsrc/www/go-aceの例のようにパッケージを 作成した上でbuildlinkします。 パッケージの依存関係は数珠つなぎになっていますから、 パッケージを作る作業は再帰的に続いてなかなか終わらない場合もあります。 ですが、依存しなくなったパッケージを依存関係から削除するのよりはずっと簡単です。

Go言語のパッケージは、まだまだ充実しているとは言えないと思いますので、 面白いソフトウエアがあれば教えてもらえればと思います。

明日は、pkgsrcでのクロスコンパイルの方法について書こうと思います。

NetBSD/amd64-current on HP Spectre x360 ae019TU (デスクトップ環境構築編)

この記事は、NetBSD Advent Calendar 2018の6日目の記事です。

前回の補足

前回のインストール編で 書き忘れていた点が2点ありました。

  • 最近のNetBSD/amd64-currentだと、acpibat(4)の認識のところで止まってしまいます。ですので、boot -cで起動させて、disable acpibatを入力してやるか、事前に/boot.cfgファイルを書き換えて、userconf disable acpibatを足しておく必要があります。
  • 附属の可視光/赤外線用のビデオカメラの認識の際にカーネルパニックします。PR kern/53734が正しいかは分かりませんが、uvideo(4)を無効にするか、このPRのパッチを当てておく必要があります。

はじめに

前回インストールしたNetBSD/amd64 8.99.26では、以下の機能が使えます。

  • オーディオ出力
  • Synaptics製タッチパッド
  • microSDカードリーダー
  • 無線LAN
  • NVMe SSDストレージ
  • Intel製内蔵GPUによるアクセラレーション
  • USB Aコネクター経由でのUSB 3デバイスの利用
以下の機能は、パッチを当てれば使えます。
  • タッチスクリーンのペンによる操作
以下の機能は使えません。
  • 内蔵の可視光/赤外線のウェブカメラ
  • タッチスクリーンの指による操作
  • 指紋認証
  • USB Type-Cコネクター経由でのUSB 3デバイスの利用
  • ディスプレイの輝度調整
  • ACPIで電源を切る(shutdown -p nowが働かない)
  • ACPIで内蔵バッテリーのステータスを取得する
  • ハードウェアボタンによるオーディオ音量調整
細かい所は不便ですが、生活するのに困るほどではありません。

ここでは、快適にFirefoxウェブブラウザー(pkgsrc/www/firefox)で ウェブブラウジングができるようにする、Blender(pkgsrc/graphics/blender)で3Dモデリングができるまでを説明して行きます。

必要なパッケージのインストール

快適なX Window Systemの環境を容用意するには、残念ながらxsrcから 生成されたXでは不十分なことは前回も触れました。 ここでは、pkgsrcでも不十分ですので、lpkgsrc-wip も利用します。 pkgsrc-wipは、pkgsrcに収録されていない 作業中のパッケージを収録しているリポジトリーです。 pkgsrc-wipは、Git等のバージョン管理システムの リポジトリーからパッケージをビルドする仕組みが充実しているので、 リリースされていないソフトウエアは、pkgsrc-wipに置かれたままに なっていることもあるようです。

pkgsrcのディレクトリーの下に以下のようにpkgsrc-wipの リポジトリーを展開します。

$ cd /usr/pkgsrc
$ git clone git://wip.pkgsrc.org/pkgsrc-wip.git wip
これにより、pkgsrc-wipのリポジトリーが/usr/pkgsrc/wip ディレクトリーに配置できました。

今回使うのは、/usr/pkgsrc/wip/xf86-video-intel-gitパッケージです。 また、/usr/pkgsrc/x11/modular-xorg-serverについては、 /usr/pkgsrc/graphics/MesaLib18を利用する必要があります。 となると、以下のような順序でパッケージをインストールすることになります。

# cd /usr/pkgsrc/graphics/MesaLib18
# make install
# cd /usr/pkgsrc/wip/xf86-video-intel-git
# make install
ここで、/usr/pkgsrc/x11/modular-xorg-serverは、 /usr/pkgsrc/wip/xf86-video-intel-git の依存パッケージとしてインストールされるので、明示的にmake install を実行する必要はありません。

他には、生活に必要なパッケージを入れて行きます。 今回は、FirefoxとBlenderを使えるようにするのが目的でしたが、 Xのモジュールやターミナルエミュレーター、ウィンドウマネージャー、日本語インプットメソッド、フォントなども必要です。

# /usr/pkgsrc/x11/xf86-input-mouse
# make install
# /usr/pkgsrc/x11/xf86-input-keyboard
# make install
# /usr/pkgsrc/fonts/noto-ttf
# make install
# /usr/pkgsrc/meta-pkgs/modular-xorg-apps
# make install
# /usr/pkgsrc/meta-pkgs/modular-xorg-fonts
# make install
# /usr/pkgsrc/meta-pkgs/modular-xorg-utils
# make install
# /usr/pkgsrc/www/firefox
# make install
# /usr/pkgsrc/graphics/blender
# make install
# /usr/pkgsrc/wm/jwm
# make install
# /usr/pkgsrc/x11/mlterm
# make install
# /usr/pkgsrc/inputmethod/fcitx-skk
# make install
それぞれの設定については、省略します。

この組み合わせであれば、FirefoxでWebGLなウェブページを楽しんだり、 快適にBlenderで3Dモデリングを楽しんだりすることができます。 ここでは、FirefoxでWebGLでアクアリウムを表示するサンプルを表示させたスクリーンショットを 掲載しておきます。 もし描画が乱れる場合には、 アクセラレーションメソッドをSNAではなくUXAにして みてください。

本当は、xsrcからインストールしたX Window Systemで以上のような ことができれば良いのですが、現状ではうまく行きません。

明日は、Go言語で書かれたソフトウエアをpkgsrcのパッケージにする例を紹介したいと思います。

NetBSD/amd64-current on HP Spectre x360 ae019TU (インストール編)

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

はじめに

2018年7月のJapan NetBSD Users' GroupのBoFの際には、いろいろ動かないものばかり だったのだが、2018年12月現在では、HP Spectre x360 13-inch ae019TUも多くの 機能がちゃんと動くようになっている。 今日から2日間は、HP Spectre x360 13-inch ae019TUで、快適にNetBSDデスクトップを 使用する方法について書いていきたい。 ちなみにこの記事は、おおしまさんのU-EFI bootで起動するNetBSD USBメモリを作ってみるの記事を 読んだ方にはほぼ不要だと思います。

NetBSDのインストール

このマシンには、当然のようにDVDドライブなどは内蔵されていない。 それにUEFIな環境で使用したい。 と言うことで、今日の時点で最新なNetBSD-8.99.26-amd64-uefi-install.img.gznycdn.NetBSD.orgから ディスクイメージをダウンロードして USBスティックに書き込み、インストールに使用することにする。 NetBSDの環境があれば、そこでddコマンドで書き込むのが良いのだが、 今回は、Windows 10 Proの環境で書き込んでみた。rawrite32.exeを使う。 rawrite32.exeは、a href="https://www.netbsd.org/~martin/rawrite32/"> lNetBSD.orgにあるmartin@のウェブページからダウンロードすることができる。 ちなみに、既にGPTなパーティショニングがされていると、rawrite32.exeでは どうやってもエラーになってディスクイメージを書き込めないことがある。 どうにかしたいのだが、何も行動できていない。

実際のインストールは、インストーラーであるsysinstは使用しなかった。 おそらくsysinstは、GPTパーティショニングな環境へのインストールに まだ対応していないのではないかと思う。これについても何もできていない。 今回は、sysinstが起動したら、すぐにCtrl-Cを押して シェルに移行し、そこでインストールを行なった。 このマシンのストレージはNVMeなSSDであり、ld0として認識される。 容量は1 TBである。 以下のようにしてパーティションを設定する。

# gpt create ld0
# gpt add -s 128m -t efi -l EFI ld0
# gpt add -s 50G -t ffs -l ROOT ld0
# gpt add -s 32G -t swap -l SWAP ld0
# gpt add -s 250G -t ffs -l USR  ld0
# gpt -t ffs -l HOME ld0
以下のようにそれぞれのパーティションをnewfsする。 ここで、ld0に作成した各GPTパーティションはdk2移行に 割り振られているものとする。今のdk2が実際に使用する際には dk0となる。
# newfs_msdos /dev/rdk2
# newfs -O2 /dev/rdk3
# newfs -O2 /dev/rdk4
# newfs -O2 /dev/rdk5
# newfs -O2 /dev/rdk6
# gpt set -a bootme -i 2 ld0
ここで注意すべき点があるとすれば、gpt biosbootコマンドを使ってはいけない ということである。 これを実行してしまうと、このマシンではUEFIでもCSMでも起動しなくなる (そもそも純粋なUEFIモードというのが、このマシンのBIOS設定では不可能なようであるが)。 以下のようにUEFIブートローダーを配置する。
# mkdir /efiboot
# mount_msdos /dev/dk2 /efiboot
# mkdir -p /efiboot/EFI/boot
# cp /usr/mdec/boot*.efi /efiboot/EFI/boot
# umount /efiboot
これにより、bootia32.efibootx64.efiが配置され、 bootx64.efiが使用されることとなる。 あとは、パーティションを実際の使用時と同じ構造で/mnt以下に にmountして例えば以下のように配布物を展開しておく。
# tar zxvfp base.tgz -C /mnt
# tar zxvfp etc.tgz -C /mnt
ここで、他の配布物も展開しておいて良いが、X Window Systemに関しては、 xsrcからビルドしたものでは快適なデスクトップ環境は実現できないので、 X Window System関連のものは展開しない。 忘れてはいけないのが、/dev以下のノードの作成である。 このタイミングでちゃんとやっておかないとtmpfsが使われてしまい。 直すのが面倒である。 他にも必要なものを準備しておく。
# cp / mnt/usr/mdec/boot /mnt
# mkdir /mnt/kern
# mkdir /mnt/proc
# cd /mnt/dev
# ./MAKEDEV all
後は設定ファイル類を準備すれば良い。
# vi /etc/fstab
NAME=ROOT /  ffs rw,log 1 1
NAME=SWAP none  swap sw,dp 0 0
NAME=USR /usr  ffs rw,log 1 1
NAME=HOME /home  ffs rw,log 1 1
kernfs  /kern  kernfs rw
ptyfs  /dev/pts ptyfs rw
procfs  /proc  procfs rw
tmpfs  /var/shm tmpfs rw,-m1777,-sram%25

# vi /etc/rc.conf
(snip)
rc_configured=YES
(snip)

ここまで来れば、後はいつものNetBSD環境である。 dmesgは、dmesgdに投稿してある。 一つ残念なこととして、USB Type-CポートがUSB 3のデバイスを認識しないというのがある。 どうにか直したいのだが…。

明日は、pkgsrcpkgsrc-wipを使って(私的に)快適なデスクトップ環境を構築する話を書きます。

pkgsrc/security/acmeshでLet's EncryptのTLS/SSL証明書を使う

この記事は、NetBSD Advent Calendar 2018の4日目の記事です。

自分のウェブサイトをLet's EncryptでTLS/SSL化したいと思っていて、 過去にはpkgsrc/security/py-certbotを試すために pkgsrc/sysutils/py-psutilのNetBSDへの移植に 取り組んだこともあったのだが、なかなか継続的に利用し続けるのは大変だった。

NetBSD blogの Using acme.sh for Let's Encrypt certificates on pkgsrc.org servers を読んで、acme.sh を試したいと思ったのだが、そもそもpkgsrcには収録されていないし、DNSによる認証は ちょっと遠慮したいので、そのまま適用はできないでいた。 やっと重い腰を上げてpkgsrcに追加して設定した話を書きたい。 ちなみに、ワイルドカード証明書が発行できるようになっているが、今回はワイルドカード証明書 は発行を受けない。

インストール

インストールは、pkgsrc/security/acmeshを使えば良い。

# cd /usr/pkgsrc/security/acmesh
# make install
以上のように実行すれば良い。このようにインストールすると、 ▽usおそらくHTTPでの認証で ウェブサーバーをインストールしないでもTLS/SSL証明書を発行できるように pkgsrc/net/socatもインストールされる。 今回はsocatは使わないがインストールされてしまう。

TLS/SSL証明書の発行を受ける

TLS/SSL証明書の発行を受けようというサーバーのホスト名はwww.example.com であることにしよう。 このFQDNでアクセスできるようにDNSを設定しておくのが必要なのは言うまでもない。

私は、このサーバーでpkgsrc/www/nginx-develをhttpdとして 使用する予定なので、TLS/SSL証明書の発行を受ける際にも、これを使用することにする。 以下のようにインストールし、設定しておく。

# cd /usr/pkgsrc/www/nginx-devel
# make install
# vi /usr/pkg/etc/nginx/nginx.conf
http {
(snip)
    server {
        listen       80;
        server_name  www.example.com;
(snip)
        location / {
            root   /usr/htdocs;
            index  index.html index.htm;
        }
(snip)
# cp /usr/pkg/share/examples/rc.d/nginx /etc/rc.d
# vi /etc/rc.conf
(snip)
nginx=YES
(snip)
# /etc/rc.d/nginx start
次に、HTTPでの認証用のファイルの作成などをacme.shコマンドを使って行なう。
# sudo nginx
$ /usr/pkg/sbin/acme.sh --issue -w /usr/htdocs -d www.example.com
これによって、例えば
/usr/htdocs/.well-known/acme-challenge/q-h2-aGCzrWmEurHUYgG_KZU1hVroXgi9n6nzNH0odc
のようなファイル名のファイルが生成され、2分間(?)程度待つとTLS/SSL証明書が発行される。 場所は、nginxユーザーのホームディレクトリーである/var/db/nginx 以下である。 使用する2つのファイルを/usr/pkg/etc/nginx内にシンボリックリンクしておく。
# cd /usr/pkg/etc/nginx
# ln -s /var/db/nginx/.acme.sh/www.example.com/fullchain.cer www.example.com.cer
# ln -s /var/db/nginx/.acme.sh/www.example.com/www.example.com.key www.example.com.key

これらを、それぞれ/usr/pkg/etc/nginx.confに以下のように設定する。

# vi /usr/pkg/etc/nginx.conf
(snip)
http {
    server {
        listen       443 http2 ssl;
        server_name  www.example.com;

        ssl_certificate      www.example.com.cer;
        ssl_certificate_key  www.example.com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
(snip)

TLS/SSL証明書を更新する

このように発行されたLet's EncryptのTLS/SSL証明書は、3カ月しか有効ではない。 毎回手作業では大変なのでcronで自動的に更新したい。 今回は以下のように、TLS/SSL証明書を再取得してnginxを再起動する ように設定した。しかし、まだ初回の更新の機会がめぐって来ていないので、 実際のところはうまく動くかは分からない。

# cd /usr/pkgsrc/security/sudo
# make install
# visudo
(snip)
nginx ALL=(root) NOPASSWD: /etc/rc.d/nginx reload
# sudo nginx
$ crontab -e
3 1 * * * /usr/pkg/sbin/acme.sh --cron --home /var/db/nginx/.acme.sh --reloadcmd "/usr/pkg/bin/sudo /etc/rc.d/nginx reload" && /usr/pkg/sbin/acme.sh --cron --home /var/db/nginx/.acme.sh  --installcert -d www.example.com --reloadcmd "/usr/pkg/bin/sudo /etc/rc.d/nginx reload"
crontabの内容について、実際に動くのを確認できた内容に書き換えました。

明日は、NetBSDデスクトップ環境として常用しているHP Spectre x360 13-inch ae019TUについて、 NetBSD/amd64-currentをインストールする話を書こうと思います。

OpenGLのサポート状況を確認する

HP Spectre x360のIntel Kabylake Refreshな環境で、NetBSD/amd64-currentを使うと OpenGLも有効になって、Blenderも使えて嬉しく思っていたのだが、 OpenGLのサポートするバージョンを確認する方法が分かっていなかった。

Debian wikiのMesaのページを 見ていたら書かれていた。 glxinfoコマンドは、pkgsrc/graphics/MesaDemosから glxinfo_mesademosを使う。

$ glxinfo_mesademos|grep "OpenGL core profile version string"
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.2.0
以上のようだと、OpenGL 4.5に対応している。

ffmpegのx11grabデータソースから30 fpsで取得する

自分の作業を記録しておくのに、スクリーンの内容をビデオとしてキャプチャーしておきたいと思った。 しかし、今使用しているHP Spectre x360 qe019TUは、USB Type-Cによる ビデオ出力はあるはずだが、NetBSDでは動かない。 調べてみると、ffmpegのx11grabデータソースでビデオキャプチャーできることが分かった。 とりあえず、以下のようにすると、30 fpsでMP4ビデオにできた。

$ ffmpeg4 -f x11grab -r 30 -s 1920x1080 -i :0.0+0,24 -vcodec libx264 capture.mp4

ここで、ffmpeg4コマンドは、pkgsrc/multimedia/ffmpeg4xcbオプションを有効にしてビルドしたバージョン4.1である。

mupdfでPDFファイルをPostScriptファイルに変換する

PDFファイルをNetBSD上で読むのに、長らくMotifベースのxpdf (pkgsrc/print/xpdf)を使ってきたが、文字化けしてしまうPDFファイルがあるのが悩みだった。 思い切ってmupdf (pkgsrc/print/mupdf)に乗り換えてみた。 これまでにmupdfで文字化けしてしまうPDFファイルには遭遇していない。

PostScriptプリンターで印刷するには、PDFファイルからPostScriptファイルに変換する必要がある。 mupdfでもPDFファイルをPostScriptファイルに変換できるはずと思って試してみた。 具体的には、pkgsrc/print/mupdfパッケージに含まれているmutoolコマンドが使用できた。 実際の操作は以下のようである。

$ mutool convert -o output.ps input.pdf
ビューアーとコンバーターの挙動が違うとトラブルの元なので、この方法を使って行きたい。

pkgsrcのpLaTeX (pkgsrc/print-platex)で作ったdviファイルをdvipdfmxでPDFファイルに変換する

本当に久しぶりにLaTeXでPDFファイルを作成したくなって、pkgsrcに日本語対応のLaTeXがあるか探してみたところ、 pkgsrc/print/tex-platexというのが 収録されていた。 pkgsrc/print/tex-jsclassesを使ってDVIファイルを作ってみて、pkgsrc/print/dvipdfmxで PDFファイルに変換しようとすると、以下のようなエラーになってPDFファイルを生成できない。

current-situation-of-coal-industry-in-the-world.dvi -> current-situation-of-coal-industry-in-the-world.pdf
[1
kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+359/600 --dpi 959 rml
/usr/pkg/bin/mktexpk: gsftopk: not found
mktexpk: don't know how to create bitmap font for rml.
mktexpk: perhaps rml is missing from the map file.
kpathsea: Appending font creation commands to missfont.log.

dvipdfmx:warning: Could not locate a virtual/physical font for TFM "rml".
dvipdfmx:warning: >> There are no valid font mapping entry for this font.
dvipdfmx:warning: >> Font file name "rml" was assumed but failed to locate that font.
dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output...

Output file removed.
私はRyumin-LightとGothicBBB-Mediumは、フォントを埋め込まないようにしたいので、以下のパッチのように f ptex-noEmbed.mapの行を追加する必要がある。
--- /usr/pkg/etc/texmf/dvipdfmx/dvipdfmx.cfg.orig       2018-11-08 14:28:42.047918996 +0000
+++ /usr/pkg/etc/texmf/dvipdfmx/dvipdfmx.cfg
@@ -223,6 +223,7 @@ f kanjix.map
 % minimal example for Chinese and Korean users
 % improvements please to tex-live@tug.org
 f ckx.map
+f ptex-noEmbed.map

 %% Include other config files
 %i 
ここで、tex-platex-2018dvipdfmx-20180217を使用している。

ちなみに、tex-platex-2018では、入力の.texファイルをUTF-8で書くことが可能だった。

RubyのURI.parseでプロキシーサーバーを設定する際にパスワードとして使えない文字

ユーザー認証付きのHTTPプロキシーサーバーを経由しないと、どこにも行けないネットワークで生活しないといけないことがある。 そんな環境でもRubyスクリプト(実際にはJRubyで動かすことが多い)でWWWにアクセスしなくてはいけないことがある。 RubyのURI.parseが呼ばれると、

URI::InvalidURIError: bad URI(is not URI?)
とエラーになってそもそもWWWにアクセスしに行かないことがある。 これは、ユーザー認証付きのHTTPプロキシーサーバーのパスワードに使えないはずの文字が設定されているためである。 私の環境の場合にはWindowsのActive Directoryの認証情報と連携しているので、Windowsのログオンパスワードとして 良かれと思って記号を使っていると、遭遇してしまうことがある。

では、どのような文字をパスワードとして使用するのを避ければ良いのだろうか? RFC2396であるUniform Resource Identifiers (URI): Generic Syntaxによると、 以下のように書かれている。

   The user information, if present, is followed by a commercial at-sign
   "@".

      userinfo      = *( unreserved | escaped |
                         ";" | ":" | "&" | "=" | "+" | "$" | "," )
つまり、セミコロン、コロン、アンパサンド、イコール、プラス、ダラー、カンマ以外は使えないようだ。 いまいちescaped = % hex hexの場合がどうなるのか分からないが…。

とりあえずは、これら以外の記号は避けてActive Directoryにパスワード登録するのが良さそうだ。

NetBSD/amd64上で動かすFirefox 61.0.2でのDNS over HTTPSを使う

オーディオやウェブカメラをFirefoxから使うと言う話ではないので、 NetBSDだからと言って特別な事はあるはずもないのだが、 DNS over HTTPSをmozilla wikiのTrusted Recursive Resolverを参考に設定して使ってみた。 Firefoxのprofileディレクトリーにあるprefs.jsに以下のように設定されるように、about:configで 設定すれば良い。Firefoxを再起動することなく、設定直後から反映される。

user_pref("network.trr.bootstrapAddress", "1.1.1.1");
user_pref("network.trr.mode", 3); // DNS over HTTPSしか使わない。通常のDNSにfallbackする場合には2にする。
user_pref("network.trr.uri", "https://mozilla.cloudflare-dns.com/dns-query");

仮想マシンハードディスクイメージファイルの形式

仮想マシンのハードディスクイメージファイルについて、いつもどれがどれか分からなくなってしまうので、その種類を書いておく。 Appleのdmg形式は除いている。

RAW
物理ディスクのダンプ
qcow
昔のqemuの形式
qcow2
今のqemuの形式
FVD (Fast Virtual Disk)
IBMの開発したqemu用の形式
QED
qemu用だが既に互換性のためだけに残っている状態。
VDI (Virtual Disk Image)
VirtualBoxの形式
VMDK (Virtual Machine Disk)
VMwareの形式
VHD (VIrtual Hard Disk)
Microsoft Virtual PCの形式
VHDX (Virtual Hard DIsk v2)
Microsoft Hyper-Vの形式
bochs
Bochsのbximageコマンドで作る形式
他にもあるだろうが、普段目にするのはこの程度なように思う。

NetBSDのpkgsrcから導入したXでAccelMethodを設定する

FreeBSDのX.orgでCaps lockキーをCtrlにするで書いたことと基本的に同じではあるのだが、 NetBSD上でpkgsrcから導入したmodular-xorg-server-1.20.1を導入した場合の設定例を書いておく。

やりたいことは、Toshiba dynabook R63/PSというIntel Broadwell世代のラップトップでIntelのinternal GPUのアクセラレーション方式をSNAからUXAに切り替えるということである。 以下のようにすれば良い。

; まず/etc/X11/xorg.conf.dディレクトリーがないので作成する。
# mkdir /etc/X11/xorg.conf.d
; 以下のような内容を用意する。
# cat /etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
        Identifier "Intel GPU"
        Driver "intel"
        Option "AccelMethod" "UXA"
#       Option "NoAccel" "True" # アクセラレーションを無効にする場合
EndSection

JRubyのRestClientで、認証付きHTTPプロキシーサーバーを経由してアクセスする方法

いつの頃か覚えていないのだが、とある認証付きHTTPプロキシーサーバーを経由して、 JRubyのRestClientを使ったプログラムが動いていたはずである。 プロキシーサーバーの情報は、この環境は、Windows 10の環境であるから、


> set http_proxy=http://username:password@serveripaddress:portnumber
のように設定してある。

しかし、何かが変わったようで、今日になると404 Proxy Authentication Requiredの エラーが、net/httpから返されて認証付きプロキシーサーバーを越えることができない。 パスワードは英数字のみで構成されているので、パスワードの値が問題ではないはずである。

いろいろ試した結果、


RestClient.proxy = ENV['http_proxy']
を書いておくことで解消できた。

net/httpの仕様がいまいち理解できず気持ちが悪いが、 いずれまた、はまりそうな気がするので書いておく。

FreeBSDのX.orgでCaps lockキーをCtrlにする

最近のX.orgでは、xorg.confは用意しておかなくても良いのだが、その時にctrl:nocapsを指定する方法を書いておく。 FreeBSDでPortsからxorg-server-1.18.4_9,1を導入した時に使用している。


$ cat /usr/local/etc/X11/xorg.conf.d/10-capslock.conf
Section "InputClass"
        Identifier "keyboard0"
        Driver "kbd"
        MatchIsKeyboard "on"
        Option "XkbOptions" "ctrl:nocaps"
EndSection

PowerShellのSend-MailMessageで外部コマンドの標準出力を電子メールを送る際に改行を維持する

PowerShellを使うと良い所は、電子メールを簡単に送付できるSend-MailMessageと言う命令があるところである。 これを使って、外部コマンドの標準出力を電子メールとして送るとすると、以下のようになる。


## 管理者権限のPowerShellコンソールで、Set-ExecutionPolicy remotesignedを実行しておく必要がある。
## 使い方:
## powershell -NoProfile -ExecutionPolicy Unrestricted .\send-notification-email.ps1

# 送信する電子メールの本文はUTF-8にする。
$utf8 = ([System.Text.Encoding]::UTF8)

# 差出人
$fromaddress = "fromuser@example.com"

# 宛先として2つの電子メールアドレスを設定する。
$toaddress1 = "touser1@example.jp"
$toaddress2 = "touser2@example.jp"

# 電子メールのSubject
$subject = "件名です"

# 本文は外部コマンドの標準入力から受け取る
$body = C:\jruby-9.2.0.0\bin\jruby.exe .\output-to-stdout.rb

if ($LASTEXITCODE -ne 0)
{
  $email = @{
    From = $fromaddress
    To = "$toaddress1","$toaddress2"
    Subject = $subject
    Body = $body -join "`r`n"
    SMTPServer = "smtp.example.com"
    Encoding = $utf8
  }
  send-mailmessage @email
}
ここで、外部コマンドの標準出力が複数行存在する場合には注意が必要である。 つまり、-join "`r`n"を付けておかないと、全て結合されて1行になってしまう。

NetBSD 8 on さくらのVPS V4

お名前VPSをずいぶんと長く使って来たのだが、我慢できないほどにディスクアクセスが遅くなってしまい、他に乗り換えることにした。 最近のVPSサービスは、ディスクがSSDであまり容量の大きくないものばかりなので、手頃な価格で200 GB程度のディスク容量のものとなると、 さくらのVPSくらいしかなさそうだった。

さくらのVPSは、ブートセクターが壊れることはあるとか言う話を聞いたことがあって心配していたのだが、私の使うことにした石狩データセンター収容のV4の仮想マシンは、 とりあえず初回からNetBSDが起動しないと言うことはなかった。


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 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 8.0 (GENERIC) #0: Sat Jul 21 13:49:48 JST 2018
 xxx@xxx.xxx:/usr/world/amd64/8/obj/sys/arch/amd64/compile/GENERIC
total memory = 2047 MB
avail memory = 1964 MB
rnd: seeded with 128 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-trusty)
mainbus0 (root)
ACPI: RSDP 0x00000000000F08F0 000014 (v00 BOCHS )
ACPI: RSDT 0x000000007FFFFC93 000034 (v01 BOCHS  BXPCRSDT 00000001 BXPC 00000001)
ACPI: FACP 0x000000007FFFF1C0 000074 (v01 BOCHS  BXPCFACP 00000001 BXPC 00000001)
ACPI: DSDT 0x000000007FFFE040 001180 (v01 BOCHS  BXPCDSDT 00000001 BXPC 00000001)
ACPI: FACS 0x000000007FFFE000 000040
ACPI: SSDT 0x000000007FFFF234 00099F (v01 BOCHS  BXPCSSDT 00000001 BXPC 00000001)
ACPI: APIC 0x000000007FFFFBD3 000088 (v01 BOCHS  BXPCAPIC 00000001 BXPC 00000001)
ACPI: HPET 0x000000007FFFFC5B 000038 (v01 BOCHS  BXPCHPET 00000001 BXPC 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 Xeon E312xx (Sandy Bridge), id 0x206a1
cpu0: package 0, core 0, smt 0
cpu1 at mainbus0 apid 1
cpu1: Intel Xeon E312xx (Sandy Bridge), id 0x206a1
cpu1: package 1, core 0, smt 0
cpu2 at mainbus0 apid 2
cpu2: Intel Xeon E312xx (Sandy Bridge), id 0x206a1
cpu2: package 2, core 0, smt 0
acpi0 at mainbus0: Intel ACPICA 20170303
acpi0: X/RSDT: OemId , AslId 
LNKS: ACPI: Found matching pin for 0.1.INTA at func 3: 9
LNKD: ACPI: Found matching pin for 0.1.INTD at func 2: 11
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
LNKB: ACPI: Found matching pin for 0.6.INTA at func 0: 10
LNKC: ACPI: Found matching pin for 0.7.INTA at func 0: 11
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 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
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. 0x02)
pcib0 at pci0 dev 1 function 0: vendor 8086 product 7000 (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
uhci0 at pci0 dev 1 function 2: vendor 8086 product 7020 (rev. 0x01)
uhci0: interrupting at ioapic0 pin 11
usb0 at uhci0: USB revision 1.0
piixpm0 at pci0 dev 1 function 3: vendor 8086 product 7113 (rev. 0x03)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 1000
piixpm0: 24-bit timer
piixpm0: interrupting at ioapic0 pin 9
iic0 at piixpm0: I2C bus
vga0 at pci0 dev 2 function 0: vendor 1234 product 1111 (rev. 0x00)
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: Virtio Network Device (rev. 0x00)
vioif0 at virtio0: Features: 0x11070020
vioif0: Ethernet address xx:xx:xx:xx:xx:xx
virtio0: allocated 20480 byte for virtqueue 0 for rx, size 256
virtio0: using 8192 byte (512 entries) indirect descriptors
virtio0: allocated 81920 byte for virtqueue 1 for tx, 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: Virtio Network Device (rev. 0x00)
vioif1 at virtio1: Features: 0x11070020
vioif1: Ethernet address xx:xx:xx:xx:xx:xx
virtio1: allocated 20480 byte for virtqueue 0 for rx, size 256
virtio1: using 8192 byte (512 entries) indirect descriptors
virtio1: allocated 81920 byte for virtqueue 1 for tx, size 256
virtio1: using 69632 byte (4352 entries) indirect descriptors
virtio1: allocated 8192 byte for virtqueue 2 for control, size 64
virtio1: config interrupting at msix1 vec 0
virtio1: queues interrupting at msix1 vec 1
virtio2 at pci0 dev 5 function 0
virtio2: Virtio Network Device (rev. 0x00)
vioif2 at virtio2: Features: 0x11070020
vioif2: Ethernet address xx:xx:xx:xx:xx:xx
virtio2: allocated 20480 byte for virtqueue 0 for rx, size 256
virtio2: using 8192 byte (512 entries) indirect descriptors
virtio2: allocated 81920 byte for virtqueue 1 for tx, size 256
virtio2: using 69632 byte (4352 entries) indirect descriptors
virtio2: allocated 8192 byte for virtqueue 2 for control, size 64
virtio2: config interrupting at msix2 vec 0
virtio2: queues interrupting at msix2 vec 1
virtio3 at pci0 dev 6 function 0
virtio3: Virtio Block Device (rev. 0x00)
ld0 at virtio3: Features: 0x10000a54
virtio3: allocated 270336 byte for virtqueue 0 for I/O request, size 128
virtio3: using 262144 byte (16384 entries) indirect descriptors
virtio3: interrupting at ioapic0 pin 10
ld0: 200 GB, 16383 cyl, 16 head, 63 sec, 512 bytes/sect x 419430400 sectors
virtio4 at pci0 dev 7 function 0
virtio4: Virtio Memory Balloon Device (rev. 0x00)
viomb0 at virtio4virtio4: allocated 8192 byte for virtqueue 0 for inflate, size 128
virtio4: allocated 8192 byte for virtqueue 1 for deflate, size 128
: Features: 0x10000000
virtio4: interrupting at ioapic0 pin 11
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
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
acpicpu2 at cpu2: ACPI CPU
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
IPsec: Initialized Security Association Processing.
uhub0 at usb0: vendor 8086 (0x8086) UHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
uhidev0 at uhub0 port 1 configuration 1 interface 0
uhidev0: QEMU (0x627) QEMU USB Tablet (0x01), rev 2.00/0.00, addr 2, iclass 3/0
ums0 at uhidev0: 3 buttons and Z dir
wsmouse1 at ums0 mux 0
atapibus0 at atabus1: 2 targets
cd0 at atapibus0 drive 0:  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)
pad0: outputs: 44100Hz, 16-bit, stereo
audio0 at pad0: half duplex, playback, capture, mmap
pad0: Virtual format configured - Format SLINEAR, precision 16, channels 2, frequency 44100
pad0: Latency: 139 milliseconds
spkr1 at audio0: PC Speaker (synthesized)
boot device: ld0
root on ld0a dumps on ld0b
root file system type: ffs
kern.module.path=/stand/amd64/8.0/modules
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)

Log-structured File System (LFS) について書かれている文献

Log-structured File System (LFS)というファイルシステムがあって、NetBSDもサポートしている。 しかし、私の知る限りNetBSDではちゃんと動いたことはないように思う。 それでも、どうにかして動かしたいと思う人は私以外にもいるようで、時折何かの修正がコミットされている。

もうHDDにストレージのアクセス速度を求める時代ではないのかもしれないが、SSDにも応用できる考え方はあるのではないかとも思う。 mount_lfs(8)のmanページと、英語版Wikipediaの参考文献にあげられている文書を書いておく。 Wikipediaの方はリンクがあるが、mount_lfs(4)の方はそうではないので、後で読む時にはここからたどるようにしたい。

mount_lfs(8)のmanページより

英語版WikipediaのLog-structured file systemの記事より

mount_lfs(8)のmanページの分と重複する物は割愛した。

最初は教科書の一章であるLog-Structured File Systemsを読むのが分かりやすそうだ。

LLVM/clangでビルドできるNetBSDのアーキテクチャー

LLVM/clangでビルドできる(試みることのできる)アーキテクチャー(MACHINE_ARCH)をちゃんと把握しておかないといけないと思っていた。 src/share/mk/bsd.own.mkによると、以下の各MACHINE_ARCHであるようだ。

  • aarch64
  • aarch64eb
  • earm*
  • i386
  • powerpc
  • powerpc64
  • sparc
  • sparc64
  • x86_64

また、LLVM/clangでビルドしたNetBSDを用意するには、/etc/mk.confに以下のように書いておけば良いはずである。


MKGCC=no
MKLLVM=yes
HAVE_LLVM=yes
しかし、build.shにこれを自動的に設定してくれるオプションがないのが不便だ。

FreeBSD Portsで、オプションを選択するダイアログボックスを逐次出さないようにする

FreeBSDを使うことがあるので、そこではFreeBSD Portsを使いたいと思う。だが、いつもオプションを選ぶダイアログボックスでビルドが途中で止まってしまい、 いつまで経っても目的を達せないので、あきらめてpkgsrcを使っていた。

以前、FreeBSD Workshopに出席した際に、最初に指定しておくことのできるmakeターゲットがあると聞いたので、やっとports(7)のman ページを読んでみた。 config-recursiveというのが、それだった。


# cd /usr/ports/x11-wm/jwm
# make config-recursive
(ここで必要なオプションを設定する)
# make install
のようにすることで、目的は達成できた。

私としては、デフォルトのオプションから変えることは基本的にないと思うので、デフォルトの値を自動的に設定するmakeターゲットがあると便利なのだが、 ports(7)には記載されていないようだった。一度、ports/Mk以下をちゃんと読まないといけないように思う。

NetBSD上でのBitVisorのビルドと、BitVisor上でのNetBSDの起動

はじめに

この記事は、Japan NetBSD Users' Group BoF 2018で発表した内容を整理し直したものです。

NetBSDでBitVisorをビルドしてみる話と言う 記事があって、ここでは、NetBSD上でBitVisorのUEFIブートローダーはビルドできなかったという結果が掲載されている。

最近は、UEFIブートローダーも含め、一式をちゃんとNetBSD上でビルドできるようになっているので、このことについて書いておく。

また、私は、BitViorをUEFIな環境で既に構築されているNetBSDを起動させるために使用するので、NetBSD/amd64l-current (8.99.24)以外でのビルドは試していない。

準備

最初に述べたように、NetBSD/amd64 8.99.24でビルドするので、x86_64用のCコンパイラーはGCC 6.4.0が既に用意されている。 これにより、UEFIブートローダー以外のものはビルドができる。 UEFIブートローダーは、mingw-w64によるx86_64用のクロスコンパイラーが必要となる。 まずはこのクロスコンパイラーをpkgsrcからインストールする。以下のように実行すれば良い。


$ cd /usr/pkgsrc/cross/mingw-w64-x86_64-gcc
$ make install
ここで、mingw-w64-x86_64-gcc-bootstrapというパッケージもインストールされるが、 これはmingw-w64-x86_64-gccをビルドするために一時的に必要になるパッケージなので、 mingw-w64-x86_64-gccが正常にインストールされたら、make deinstallしてかまわない。 GNU makeも必要なので、pkgsrc/devel/gmakeをインストールしておくことになるが、 このパッケージをインストールしていない人はいないだろう。

ビルドする

以下のように実行することで、bitvisor.elfbitvisor/boot/uefi-loader/loadvmm.dllbitvisor/boot/uefi-loader/loadvmm.efiを生成できる。


$ cd ~/
$ hg clone ssh://hg@bitbucket.org/bitvisor/bitvisor
$ cd ~/bitvisor
$ gmake
$ PATH=/usr/pkg/cross/x86_64-w64-mingw32/bin:$PATH gmake -C boot/uefi-loader

次に、USBスティックを用意し、ここにEFIパーティションを作成して、BitVisorをインストールしていく。 NetBSD/amd64の稼動しているマシンにUSBスティックを差し込み、sd0として認識された場合を記載する。 また、このマシンには、GPTなパーティションは存在しないものとする。 存在する場合には、/dev/dk0の数字0が変わる。


# gpt destroy sd0
# gpt create sd0
# gpt add -t efi sd0
# newfs_msdos /dev/rdk0
# mount_msdos /dev/dk0 /mnt
# mkdir -p /mnt/EFI/boot
# cp ~ryoon/bitvisor/bitvisor.elf /mnt/EFI/boot
# cp ~ryoon/bitvisor/boot/uefi-loader/loadmem.efi /mnt/EFI/boot/bootx64.efi
# umount /mnt

次に、このUSBスティックから起動させる。一時的にブートオーダー外のUSBスティックから起動するように操作する。 USBスティックをブートオーダーの最上位にすると、BitVisorがBitVisorを起動させようとしてエラーになるので、注意が必要である。 以下にHP Spectre x360 ae019TUで動かしているBitVisor上でのNetBSD/amd64 8.99.24のdmesgを示す。BitVisor上でなく起動させた場合との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 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 8.99.24 (DTRACE7) #0: Thu Aug 30 18:01:22 JST 2018
 ryoon@brownie:/usr/world/8.99/amd64/obj/sys/arch/amd64/compile/DTRACE7
total memory = 16132 MB
avail memory = 15608 MB
cpu_rng: RDSEED
timecounter: Timecounters tick every 10.000 msec
Kernelized RAIDframe activated
running cgd selftest aes-xts-256 aes-xts-512 done
[  436.000000] uvideo* disabled
[  436.000000] uvideo* already disabled
timecounter: Timecounter "i8254" frequency 1193182 Hz quality 100
efi: systbl at pa 3af15018
HP HP Spectre x360 Convertible 13-ae0xx ( )
mainbus0 (root)
ACPI: RSDP 0x000000003A360000 000024 (v02 HPQOEM)
ACPI: XSDT 0x000000003A3600C0 0000FC (v01 HPQOEM SLIC-MPC 01072009 HP   00010013)
ACPI: FACP 0x000000003A39AC60 000114 (v06 HPQOEM SLIC-MPC 01072009 HP   00010013)
ACPI: DSDT 0x000000003A360248 03AA13 (v02 HPQOEM 83B9     01072009 ACPI 20160422)
ACPI: FACS 0x000000003A7EAF00 000040
ACPI: APIC 0x000000003A39AD78 0000BC (v03 HPQOEM 83B9     01072009 HP   00010013)
ACPI: FPDT 0x000000003A39AE38 000044 (v01 HPQOEM 83B9     01072009 HP   00010013)
ACPI: FIDT 0x000000003A39AE80 00009C (v01 HPQOEM 83B9     01072009 HP   00010013)
ACPI: MCFG 0x000000003A39AF20 00003C (v01 HPQOEM 83B9     01072009 HP   00000097)
ACPI: SSDT 0x000000003A39AF60 0003A3 (v01 HPQOEM 83B9     00001000 ACPI 20160422)
ACPI: SSDT 0x000000003A39B308 005D97 (v02 HPQOEM 83B9     00001000 ACPI 20160422)
ACPI: MSDM 0x000000003A3A10A0 000055 (v03 HPQOEM SLIC-MPC 00000001 HP   00010013)
ACPI: SSDT 0x000000003A3A10F8 003156 (v02 HPQOEM 83B9     00003000 ACPI 20160422)
ACPI: HPET 0x000000003A3A4250 000038 (v01 HPQOEM 83B9     00000001 HP   0000005F)
ACPI: SSDT 0x000000003A3A4288 000024 (v02 HPQOEM 83B9     00000000 ACPI 20160422)
ACPI: UEFI 0x000000003A3A42B0 000042 (v01 HPQOEM 83B9     00000002 HP   01000013)
ACPI: SSDT 0x000000003A3A42F8 0017AE (v02 HPQOEM 83B9     00003000 ACPI 20160422)
ACPI: LPIT 0x000000003A3A5AA8 000094 (v01 HPQOEM 83B9     00000000 HP   0000005F)
ACPI: SSDT 0x000000003A3A5B40 000141 (v02 HPQOEM 83B9     00000000 ACPI 20160422)
ACPI: SSDT 0x000000003A3A5C88 00029F (v02 HPQOEM 83B9     00000000 ACPI 20160422)
ACPI: SSDT 0x000000003A3A5F28 0011E7 (v02 HPQOEM 83B9     00001000 ACPI 20160422)
ACPI: SSDT 0x000000003A3A7110 00023D (v02 HPQOEM 83B9     00000000 ACPI 20160422)
ACPI: DBGP 0x000000003A3A7350 000034 (v01 HPQOEM 83B9     00000002 HP   0000005F)
ACPI: DBG2 0x000000003A3A7388 000054 (v00 HPQOEM 83B9     00000002 HP   0000005F)
ACPI: DMAR 0x000000003A3A73E0 000114 (v01 HPQOEM 83B9     00000001 HP   00000001)
ACPI: NHLT 0x000000003A3A74F8 00002D (v00 HPQOEM 83B9     00000002 HP   01000013)
ACPI: SSDT 0x000000003A3A7528 000066 (v01 HPQOEM 83B9     00000001 ACPI 20160422)
ACPI: TPM2 0x000000003A3A7590 000034 (v03 HPQOEM 83B9     00000001 HP   00000000)
ACPI: ASF! 0x000000003A3A75C8 0000A0 (v32 HPQOEM 83B9     00000001 HP   000F4240)
ACPI: BGRT 0x000000003A3A7668 000038 (v01 HPQOEM 83B9     01072009 HP   00010013)
ACPI: WSMT 0x000000003A3A76A0 000028 (v01 HPQOEM 83B9     01072009 HP   00010013)
ACPI: 11 ACPI AML tables successfully acquired and loaded
ioapic0 at mainbus0 apid 2: pa 0xfec00000, version 0x20, 120 pins
x2APIC available but disabled by DMAR table
cpu0 at mainbus0 apid 0
cpu0: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu0: package 0, core 0, smt 0
cpu1 at mainbus0 apid 2
cpu1: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu1: package 0, core 1, smt 0
cpu2 at mainbus0 apid 4
cpu2: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu2: package 0, core 2, smt 0
cpu3 at mainbus0 apid 6
cpu3: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu3: package 0, core 3, smt 0
cpu4 at mainbus0 apid 1
cpu4: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu4: package 0, core 0, smt 1
cpu5 at mainbus0 apid 3
cpu5: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu5: package 0, core 1, smt 1
cpu6 at mainbus0 apid 5
cpu6: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu6: package 0, core 2, smt 1
cpu7 at mainbus0 apid 7
cpu7: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, id 0x806ea
cpu7: package 0, core 3, smt 1
acpi0 at mainbus0: Intel ACPICA 20180810
acpi0: X/RSDT: OemId , AslId 
acpi0: MCFG: segment 0, bus 0-255, address 0x00000000e0000000
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFBED67849808 0003FF (v02 PmRef  Cpu0Cst  00003001 INTL 20160422)
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFBED67849008 0005CD (v02 PmRef  Cpu0Ist  00003000 INTL 20160422)
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFBED678E2008 000D14 (v02 PmRef  ApIst    00003000 INTL 20160422)
ACPI: Dynamic OEM Table Load:
ACPI: SSDT 0xFFFFFBF1037D8408 00030A (v02 PmRef  ApCst    00003000 INTL 20160422)
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 24000000 Hz quality 2000
acpiec0 at acpi0 (EC0, PNP0C09-1): io 0x62,0x66
acpivga0 at acpi0 (GFX0): ACPI Display Adapter
acpiout0 at acpivga0 (DD01, 0x0100): ACPI Display Output Device
acpiout1 at acpivga0 (DD02, 0x0002): ACPI Display Output Device
acpiout2 at acpivga0 (DD03, 0x0300): ACPI Display Output Device
acpiout3 at acpivga0 (DD04, 0x0301): ACPI Display Output Device
acpiout4 at acpivga0 (DD05, 0x0302): ACPI Display Output Device
acpiout5 at acpivga0 (DD06, 0x0303): ACPI Display Output Device
acpiout6 at acpivga0 (DD07, 0x0304): ACPI Display Output Device
acpiout7 at acpivga0 (DD08, 0x0305): ACPI Display Output Device
acpiout8 at acpivga0 (DD09, 0x0009): ACPI Display Output Device
acpiout9 at acpivga0 (DD0A, 0x000a): ACPI Display Output Device
acpiout10 at acpivga0 (DD0B, 0x000b): ACPI Display Output Device
acpiout11 at acpivga0 (DD0C, 0x000c): ACPI Display Output Device
acpiout12 at acpivga0 (DD0D, 0x000d): ACPI Display Output Device
acpiout13 at acpivga0 (DD0E, 0x000e): ACPI Display Output Device
acpiout14 at acpivga0 (DD0F, 0x000f): ACPI Display Output Device
acpiout15 at acpivga0 (DD1F, 0x0400): ACPI Display Output Device
acpiout15: brightness levels: [0-100]
acpiout16 at acpivga0 (SKC0, 0xca00): ACPI Display Output Device
acpivga0: autoconfiguration error: unknown output device acpiout0
acpivga0: autoconfiguration error: unknown output device acpiout1
acpivga0: autoconfiguration error: unknown output device acpiout2
acpivga0: autoconfiguration error: unknown output device acpiout3
acpivga0: autoconfiguration error: unknown output device acpiout4
acpivga0: autoconfiguration error: unknown output device acpiout5
acpivga0: autoconfiguration error: unknown output device acpiout6
acpivga0: autoconfiguration error: unknown output device acpiout7
acpivga0: autoconfiguration error: unknown output device acpiout8
acpivga0: autoconfiguration error: unknown output device acpiout9
acpivga0: autoconfiguration error: unknown output device acpiout10
acpivga0: autoconfiguration error: unknown output device acpiout11
acpivga0: autoconfiguration error: unknown output device acpiout12
acpivga0: autoconfiguration error: unknown output device acpiout13
acpivga0: autoconfiguration error: unknown output device acpiout14
acpivga0: autoconfiguration error: unknown output device acpiout16
acpivga0: connected output devices:
acpivga0:   0x0400 (acpiout15): Unknown Output Device, head 0
FWHD (INT0800) at acpi0 not configured
LDRC (PNP0C02) at acpi0 not configured
attimer1 at acpi0 (TIMR, PNP0100): io 0x40-0x43,0x50-0x53 irq 0
CWDT (INT3F0D) at acpi0 not configured
SEN1 (INT3403) at acpi0 not configured
SEN2 (INT3403) at acpi0 not configured
SEN3 (INT3403) at acpi0 not configured
pckbc1 at acpi0 (PS2K, HPQ8001) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (PS2M, SYN326A) (aux port): irq 12
PDRC (PNP0C02) at acpi0 not configured
IOTR (PNP0C02) at acpi0 not configured
GPI0 (INT344B) at acpi0 not configured
TPL0 (ELAN2514) at acpi0 not configured
FPNT (SYNA8003) at acpi0 not configured
WLBT (HPQ6001) at acpi0 not configured
acpiwmi0 at acpi0 (WTBT, PNP0C14-TBFP): ACPI WMI Interface
acpiwmibus at acpiwmi0 not configured
PEPD (INT33A1) at acpi0 not configured
acpiwmi1 at acpi0 (WFDE, PNP0C14-SampleDev): ACPI WMI Interface
acpiwmibus at acpiwmi1 not configured
acpiwmi2 at acpi0 (WFTE, PNP0C14-TestDev): ACPI WMI Interface
acpiwmibus at acpiwmi2 not configured
TPM (MSFT0101) at acpi0 not configured
acpiwmi3 at acpi0 (WMID, PNP0C14-0): ACPI WMI Interface
wmihp0 at acpiwmi3: HP WMI mappings
ACPI Error: Field [D128] at bit offset/length 128/1024 exceeds size of target Buffer (160 bits) (20180810/dsopcode-251)
ACPI Error: Method parse/execution failed \HWMC, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Method parse/execution failed \_SB.WMID.WMAA, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Field [D128] at bit offset/length 128/1024 exceeds size of target Buffer (160 bits) (20180810/dsopcode-251)
ACPI Error: Method parse/execution failed \HWMC, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Method parse/execution failed \_SB.WMID.WMAA, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Field [D128] at bit offset/length 128/1024 exceeds size of target Buffer (160 bits) (20180810/dsopcode-251)
ACPI Error: Method parse/execution failed \HWMC, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Method parse/execution failed \_SB.WMID.WMAA, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Field [D128] at bit offset/length 128/1024 exceeds size of target Buffer (160 bits) (20180810/dsopcode-251)
ACPI Error: Method parse/execution failed \HWMC, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Method parse/execution failed \_SB.WMID.WMAA, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Field [D128] at bit offset/length 128/1024 exceeds size of target Buffer (160 bits) (20180810/dsopcode-251)
ACPI Error: Method parse/execution failed \HWMC, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
ACPI Error: Method parse/execution failed \_SB.WMID.WMAA, AE_AML_BUFFER_LIMIT (20180810/psparse-569)
acpibat0 at acpi0 (BAT0, PNP0C0A-1): ACPI Battery
acpiacad0 at acpi0 (ADP1, ACPI0003): ACPI AC Adapter
acpilid0 at acpi0 (LID0, PNP0C0D): ACPI Lid Switch
acpibut0 at acpi0 (PWRB, PNP0C0C): ACPI Power Button
VBPA (INT33D6) at acpi0 not configured
CIND (INT33D3) at acpi0 not configured
IETM (INT3400) at acpi0 not configured
PTID (INT340E) at acpi0 not configured
acpitz0 at acpi0 (TZ01): cpu0 cpu1 cpu2 cpu3 cpu4 cpu5 cpu6 cpu7
acpitz0: levels: hot 100.0 C, passive 99.0 C, passive cooling
ACPI: Enabled 5 GPEs in block 00 to 7F
pckbd0 at pckbc1 (kbd slot)
pckbc1: using irq 1 for kbd slot
wskbd0 at pckbd0: console keyboard
pms0 at pckbc1 (aux slot)
pms0: Synaptics touchpad version 8.16
pms0: Extended W mode, Palm detect, One button click pad, Multi-finger Report, Multi-finger
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 5914 (rev. 0x08)
genfb0 at pci0 dev 2 function 0: vendor 8086 product 5917 (rev. 0x07)
genfb0: framebuffer at 0x50000000, size 3840x2160, depth 32, stride 15360
wsdisplay0 at genfb0 kbdmux 1: console (default, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at genfb0 not configured
vendor 8086 product 1903 (miscellaneous DASP, revision 0x08) at pci0 dev 4 function 0 not configured
vendor 8086 product 9d35 (miscellaneous prehistoric, revision 0x21) at pci0 dev 19 function 0 not configured
xhci0 at pci0 dev 20 function 0: vendor 8086 product 9d2f (rev. 0x21)
xhci0: interrupting at msi0 vec 0
xhci0: xHCI version 1.0
usb0 at xhci0: USB revision 3.0
usb1 at xhci0: USB revision 2.0
vendor 8086 product 9d31 (miscellaneous DASP, revision 0x21) at pci0 dev 20 function 2 not configured
dwiic0 at pci0 dev 21 function 0status 0x100002
reset 0xffffffff
rlo 0xffffffff
rho 0xffffffff
: I2C controller instance 0
dwiic0: interrupting at ioapic0 pin 16
ACPI Warning: \_SB.PCI0.I2C0.TPL0._DSM: Insufficient arguments - Caller passed 3, ACPI requires 4 (20180810/nsarguments-309)
status 0x100002
reset 0x3
rlo 0xdcc34004
rho 0x0
iic0 at dwiic0: I2C bus
ihidev0 at iic0 addr 0x10: vendor 0x4f3 product 0x2594, ELAN2514
ihidev0: 23 report ids
ihidev0: interrupting at irq 35
hid at ihidev0 reportid 1 not configured
hid at ihidev0 reportid 2 not configured
hid at ihidev0 reportid 3 not configured
hid at ihidev0 reportid 4 not configured
hid at ihidev0 reportid 6 not configured
ims0 at ihidev0 reportid 7: 3 buttons digitizer, tip, barrel, eraser
wsmouse1 at ims0 mux 0
hid at ihidev0 reportid 10 not configured
hid at ihidev0 reportid 14 not configured
hid at ihidev0 reportid 23 not configured
vendor 8086 product 9d3a (miscellaneous communications, revision 0x21) at pci0 dev 22 function 0 not configured
ppb0 at pci0 dev 28 function 0: vendor 8086 product 9d10 (rev. 0xf1)
ppb0: PCI Express capability version 2  x1 @ 8.0GT/s
ppb0: link is x1 @ 5.0GT/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 525a (rev. 0x01)
rtsx0: interrupting at msi1 vec 0
sdmmc0 at rtsx0
ppb1 at pci0 dev 28 function 1: vendor 8086 product 9d11 (rev. 0xf1)
ppb1: PCI Express capability version 2  x1 @ 8.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 24fd (rev. 0x78)
iwm0: interrupting at msi2 vec 0
ppb2 at pci0 dev 28 function 4: vendor 8086 product 9d14 (rev. 0xf1)
ppb2: PCI Express capability version 2  x4 @ 8.0GT/s
pci3 at ppb2 bus 3
pci3: i/o space, memory space enabled, rd/line, wr/inv ok
ppb3 at pci0 dev 29 function 0: vendor 8086 product 9d18 (rev. 0xf1)
ppb3: PCI Express capability version 2  x4 @ 8.0GT/s
pci4 at ppb3 bus 110
pci4: i/o space, memory space enabled, rd/line, wr/inv ok
nvme0 at pci4 dev 0 function 0: vendor 1179 product 0116 (rev. 0x00)
nvme0: NVMe 1.2.1
nvme0: for admin queue interrupting at msix3 vec 0
nvme0: KXG50ZNV1T02 TOSHIBA, firmware AAHA4102, serial 187S11A9TP8T
nvme0: for io queue 1 interrupting at msix3 vec 1 affinity to cpu0
nvme0: for io queue 2 interrupting at msix3 vec 2 affinity to cpu1
nvme0: for io queue 3 interrupting at msix3 vec 3 affinity to cpu2
nvme0: for io queue 4 interrupting at msix3 vec 4 affinity to cpu3
nvme0: for io queue 5 interrupting at msix3 vec 5 affinity to cpu4
nvme0: for io queue 6 interrupting at msix3 vec 6 affinity to cpu5
nvme0: for io queue 7 interrupting at msix3 vec 7 affinity to cpu6
nvme0: for io queue 8 interrupting at msix3 vec 8 affinity to cpu7
ld0 at nvme0 nsid 1
ld0: 953 GB, 124519 cyl, 255 head, 63 sec, 512 bytes/sect x 2000409264 sectors
vendor 8086 product 9d27 (miscellaneous DASP, revision 0x21) at pci0 dev 30 function 0 not configured
vendor 8086 product 9d29 (miscellaneous DASP, revision 0x21) at pci0 dev 30 function 2 not configured
pcib0 at pci0 dev 31 function 0: vendor 8086 product 9d4e (rev. 0x21)
vendor 8086 product 9d21 (miscellaneous memory, revision 0x21) at pci0 dev 31 function 2 not configured
hdaudio0 at pci0 dev 31 function 3: HD Audio Controller
hdaudio0: interrupting at msi4 vec 0
hdafg0 at hdaudio0: vendor 10ec product 0295
hdafg0: DAC00 2ch: Speaker [Built-In]
hdafg0: DAC01 2ch: HP Out [Jack]
hdafg0: ADC02 2ch: Mic In [Built-In]
hdafg0: ADC03 2ch: Mic In [Jack]
hdafg0: 2ch/2ch 44100Hz 48000Hz 96000Hz 192000Hz PCM16 PCM20 PCM24
audio0 at hdafg0: full duplex, playback, capture, mmap, independent
hdafg0: Virtual format configured - Format SLINEAR, precision 16, channels 2, frequency 48000
hdafg0: Latency: 128 milliseconds
spkr0 at audio0: PC Speaker (synthesized)
wsbell at spkr0 not configured
hdafg1 at hdaudio0: vendor 8086 product 280b
hdafg1: DP00 8ch: Digital Out [Jack]
hdafg1: 8ch/0ch 48000Hz PCM16*
ichsmb0 at pci0 dev 31 function 4: vendor 8086 product 9d23 (rev. 0x21)
ichsmb0: interrupting at ioapic0 pin 16
iic1 at ichsmb0: I2C bus
isa0 at pcib0
tpm0 at isa0 iomem 0xfed40000-0xfed44fff irq 7: device 0x001a15d1 rev 0x10
pcppi0 at isa0 port 0x61
spkr1 at pcppi0: PC Speaker
wsbell at spkr1 not configured
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 151 us, pow   200 mW
acpicpu0: C3: FFH, lat 1034 us, pow   200 mW
acpicpu0: P0: FFH, lat  10 us, pow 15000 mW, 2001 MHz, turbo boost
acpicpu0: P1: FFH, lat  10 us, pow 15000 mW, 2000 MHz
acpicpu0: P2: FFH, lat  10 us, pow 14088 mW, 1900 MHz
acpicpu0: P3: FFH, lat  10 us, pow 13193 mW, 1800 MHz
acpicpu0: P4: FFH, lat  10 us, pow 12317 mW, 1700 MHz
acpicpu0: P5: FFH, lat  10 us, pow 10617 mW, 1500 MHz
acpicpu0: P6: FFH, lat  10 us, pow  9796 mW, 1400 MHz
acpicpu0: P7: FFH, lat  10 us, pow  8989 mW, 1300 MHz
acpicpu0: P8: FFH, lat  10 us, pow  8199 mW, 1200 MHz
acpicpu0: P9: FFH, lat  10 us, pow  7426 mW, 1100 MHz
acpicpu0: P10: FFH, lat  10 us, pow  6670 mW, 1000 MHz
acpicpu0: P11: FFH, lat  10 us, pow  5209 mW,  800 MHz
acpicpu0: P12: FFH, lat  10 us, pow  4502 mW,  700 MHz
acpicpu0: P13: FFH, lat  10 us, pow  3812 mW,  600 MHz
acpicpu0: P14: FFH, lat  10 us, pow  3137 mW,  500 MHz
acpicpu0: P15: FFH, lat  10 us, pow  2478 mW,  400 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=100
acpicpu1 at cpu1: ACPI CPU
coretemp1 at cpu1: thermal sensor, 1 C resolution, Tjmax=100
acpicpu2 at cpu2: ACPI CPU
coretemp2 at cpu2: thermal sensor, 1 C resolution, Tjmax=100
acpicpu3 at cpu3: ACPI CPU
coretemp3 at cpu3: thermal sensor, 1 C resolution, Tjmax=100
acpicpu4 at cpu4: ACPI CPU
acpicpu5 at cpu5: ACPI CPU
acpicpu6 at cpu6: ACPI CPU
acpicpu7 at cpu7: ACPI CPU
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
timecounter: Timecounter "TSC" frequency 1992519060 Hz quality 3000
uhub0 at usb0: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 3.00/1.00, addr 0
uhub0: 6 ports with 6 removable, self powered
uhub1 at usb1: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 0
uhub1: 12 ports with 12 removable, self powered
acpiacad0: AC adapter online.
ld0: GPT GUID: 1be43938-fdfc-4b4b-a3ca-a5605ce6ca8c
dk0 at ld0: "EFI", 262144 blocks at 34, type: msdos
dk1 at ld0: "ROOT", 104857600 blocks at 262178, type: ffs
dk2 at ld0: "SWAP", 67108864 blocks at 105119778, type: swap
dk3 at ld0: "USR", 251658240 blocks at 172228642, type: ffs
dk4 at ld0: "HOME", 1576522349 blocks at 423886882, type: ffs
IPsec: Initialized Security Association Processing.
acpibat0: HP LION rechargeable battery
acpibat0: granularity: low->warn 0.010 Ah, warn->full 0.025 Ah
umass0 at uhub0 port 1 configuration 1 interface 0
umass0: SanDisk (0x781) Extreme (0x5580), rev 3.00/0.10, addr 2
umass0: using SCSI over Bulk-Only
scsibus0 at umass0: 2 targets, 1 lun per target
sd0 at scsibus0 target 0 lun 0:  disk fixed
ugen0 at uhub1 port 5
ugen0: Chicony Electronics Co.,Ltd. (0x4f2) HP Wide Vision FHD Camera (0xb593), rev 2.00/0.11, addr 1
sd0: fabricating a geometry
sd0: 29923 MB, 29923 cyl, 64 head, 32 sec, 512 bytes/sect x 61282631 sectors
sd0: fabricating a geometry
sd0: GPT GUID: 43d2f7c4-c936-4007-9c14-482ea9eff122
dk5 at sd0: "bb0fbda9-7a58-4e4b-bb66-00e06c93d80d", 61282564 blocks at 34, type: msdos
ubt0 at uhub1 port 7
ubt0: vendor 8087 (0x8087) product 0a2b (0xa2b), rev 2.00/0.10, addr 3
WARNING: 16 errors while detecting hardware; check system log.
boot device: ld0
root on dk1 dumps on dk2
root file system type: ffs
kern.module.path=/stand/amd64/8.99.24/modules
iwm0: hw rev 0x230, fw ver 22.361476.0, address xx:xx:xx:xx:xx:xx
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)

違いがあるのは、CPUのfeaturesに仮想化関係がなくなることしか見付けられなかった。

BitVisor上の場合。


$ cpuctl identify 0
cpu0: highest basic info 00000016
cpu0: highest extended info 80000008
cpu0: "Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz"
cpu0: Intel 7th or 8th gen Core (Kaby Lake, Coffee Lake) (686-class), 1992.44 MHz
cpu0: family 0x6 model 0x8e stepping 0xa (id 0x806ea)
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features1 0x77fafb9f
cpu0: features1 0x77fafb9f
cpu0: features1 0x77fafb9f
cpu0: features2 0x2c100800
cpu0: features3 0x121
cpu0: features5 0x29c67af
cpu0: features5 0x29c67af
cpu0: SEF edx 0xc000000
cpu0: xsave features 0x7
cpu0: xsave instructions 0xf
cpu0: xsave area size: current 832, maximum 1088, xgetbv disabled
cpu0: I-cache 32KB 64B/line 8-way, D-cache 32KB 64B/line 8-way
cpu0: L2 cache 256KB 64B/line 4-way
cpu0: L3 cache 8MB 64B/line 16-way
cpu0: 64B prefetching
cpu0: ITLB 64 4KB entries 8-way, 2M/4M: 8 entries
cpu0: DTLB 64 4KB entries 4-way
cpu0: L2 STLB 1536 4KB entries 6-way
cpu0: L1 1GB page DTLB 4 1GB entries 4-way
cpu0: Initial APIC ID 0
cpu0: Cluster/Package ID 0
cpu0: Core ID 0
cpu0: SMT ID 0
cpu0: DSPM-eax 0x27f7
cpu0: DSPM-eax 0x27f7
cpu0: DSPM-ecx 0x9
cpu0: SEF highest subleaf 00000000
cpu0: microcode version 0x84, platform ID 7

BitVisorなしの場合。


$ cpuctl identify 0
cpu0: highest basic info 00000016
cpu0: highest extended info 80000008
cpu0: "Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz"
cpu0: Intel 7th or 8th gen Core (Kaby Lake, Coffee Lake) (686-class), 1992.56 MHz
cpu0: family 0x6 model 0x8e stepping 0xa (id 0x806ea)
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features 0xbfebfbff
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features1 0x7ffafbbf
cpu0: features2 0x2c100800
cpu0: features3 0x121
cpu0: features5 0x29c67af
cpu0: features5 0x29c67af
cpu0: SEF edx 0xc000000
cpu0: xsave features 0x1f
cpu0: xsave instructions 0xf
cpu0: xsave area size: current 832, maximum 1088, xgetbv enabled
cpu0: enabled xsave 0x7
cpu0: I-cache 32KB 64B/line 8-way, D-cache 32KB 64B/line 8-way
cpu0: L2 cache 256KB 64B/line 4-way
cpu0: L3 cache 8MB 64B/line 16-way
cpu0: 64B prefetching
cpu0: ITLB 64 4KB entries 8-way, 2M/4M: 8 entries
cpu0: DTLB 64 4KB entries 4-way
cpu0: L2 STLB 1536 4KB entries 6-way
cpu0: L1 1GB page DTLB 4 1GB entries 4-way
cpu0: Initial APIC ID 0
cpu0: Cluster/Package ID 0
cpu0: Core ID 0
cpu0: SMT ID 0
cpu0: DSPM-eax 0x27f7
cpu0: DSPM-eax 0x27f7
cpu0: DSPM-ecx 0x9
cpu0: SEF highest subleaf 00000000
cpu0: microcode version 0x84, platform ID 7

課題

tools/logディレクトリー以下の機能をNetBSDにも導入したい。

NetBSD/amiga-current on WinUAE Amiga m68k emulator

この記事は、 NetBSD Advent Calendar 2019 の10日目の記事です。 はじめに ウェブを検索してみると、NetBSD/amigaをWinUAEというm68kを搭載したAmigaというマシンでNetBSD/amigaを動かした記録が見付かります。...