Cubieboard2でpkgsrcの開発をする際に気を付けていること

この記事は、NetBSD Advent Calendar 2017の24日目の記事です。 代わりに投稿できるようになっているので、勝手に投稿してしまいます。 もう25日ですし。

はじめに

ArmアーキテクチャーのNetBSD用のパッケージをpkgsrcで作ることが あります。

大抵のArmのCPUの載ったボードは、SDカードやmicroSDカードを ルートファイルシステムにしています。 SDカード等には、ウェアレベリングの機能などありませんから、 何かを長時間ビルドすると、書き込み回数が多くて、壊れてしまいます。 今回は、いつもビルドに使っているCubieborad2の場合に、この問題に 対処すべくやっていることを書いておきます。

スワップ領域の問題

スワップ領域は、ダウンロードして来たarmv7.imgにも設定 されていますが、非常に小さく役に立ちません。 Cubieboard2ですと、SATAの端子があって、SATAのSSDやHDDを接続できますので、 そちらのファイルシステム内に、スワップ領域を作っておきます。


# dd if=/dev/zero of=/home/ryoon/swapfile bs=1m count=4096
# chmod 600 /home/ryoon/swapfile
# swapctl -a -p 0 /home/ryoon/swapfile
その上で、従来のmicroSDカード上のスワップを無効にし、 これを常に使うようにしてしまいます。/etc/fstab以下のように 置き換えます。

/home/ryoon/swapfile none swap sw 0 0

一時ファイルの置き場所をSSD/HDDにする

これは、TMP環境変数を定義し直すのでも良いのかもしれませんが、 /tmpにSSD/HDDのパーティションの1つを割り当ててしまいます。 以下のように/etc/fstabを変更します。


/dev/wd0e sw,log 1 1
その上で、マシンをリブートさせます。 mount -aで良いように思われるかもしれませんが、 既にディレクトリーやUNIXドメインソケット等が作成されているかもしれませんので、 再起動をお勧めします。

まとめ

簡単ですが、pkgsrcの開発をする際に、SDカード等を破損させないために 私がしていることを紹介しました。 でもまだ壊れることがあるので、何か足りないことがあるのかもしれません。

NetBSDマシンをソフトウェアトークンとして使いqiitaに二段階認証でログインできるようにする

この記事は、NetBSD Advent Calendar 2017の12日目の記事です。 すっかり遅くなっていますが、代わりに投稿できるようになっていたので、 勝手に投稿してしまいます。 あまりNetBSDにもpkgsrcにも直接関係ないような気もしますが…。

はじめに

Two Factor Authenticationは、二段階認証と日本語訳されているようです。 qiitaでも、この二段階認証を使ってログインできるようになっています。

普通は、Google Authenticatorのようなスマートフォンで使用できる ソフトウェアを使って、二段階認証のワンタイムパスワードを 生成すると思います。 しかし、pkgsrcにもsecurity/2faと言う パッケージで、コマンドラインのプログラムが用意されています。 これは、https://github.com/rsc/2fa で公開されているものをパッケージにしたものです。 Go言語で書かれています。 これを使ってqiitaにログインしてみました。

2faコマンドのインストール

Goコンパイラーが動くアーキテクチャーである必要があります。 私はNetBSD/amd64を使っているので、無事にビルドできました。 以下のように操作します。


$ cd /usr/pkgsrc/security/2fa
$ make install
これで/usr/pkg/bin/2faというコマンドがインストールされました。

二段階認証を設定する

二段階認証の設定ページより、QRコードの代わりに、テキストでキーを表示させます、 ここでは、abc123と表示されたと仮定します。


$ 2fa -add qiita
2fa key for qiita: abc123
これで、準備は整いました。 初回のワンタイムパスワードを生成してみます。 ここで、qiitaは時間ベースのワンタイムパスワード(TOTP)を受け付けて くれるようです。

$ 2fa qiita
123456
これで、123456と言うワンタイムパスワードが得られました。 これを、qiitaのページに入力します。

二段階認証でログインする

一度ログアウトして、二段階認証を使ってログインしてみます。 ユーザーIDとパスワードを入力した後、ワンタイムパスワードが求められる ようになっています。


$ 2fa qiita
234567
のように実行し、この例であれば、234567を入力してください。

まとめ

qiitaで、時間ベースのワンタイムパスワードを使用して二段階認証でログインしました。 ワンタイムパスワードはNetBSDの環境で生成することができました。

時間ベースのワンタイムパスワードの生成に限りませんが、端末の時刻はNTP等で 合わせておくようにしましょう。

NanoPi NEOでNetBSDを使ってみる

この記事は、NetBSD Advent Calendar 2017の11日目の記事です。 すっかり遅くなっていますが、代わりに投稿できるようになっていたので、 勝手に投稿してしまいます。 とは言っても、小ネタですが…。

はじめに

オープンソースカンファレンス2017 Chibaに行った際に、えびはらさんに、 NanoPi NEOを紹介いただきました。 Allwinner H3と言うsun8iアーキテクチャーのArm Cortex-A7の4コアのCPUと、 512MBのメインメモリーを搭載しています。 ビデオ出力はありません。シリアルコンソールでの接続になります。 また、Gigabit EthernetとUSB 2.0のポートを1つずつ持っています。 私は、秋月電子通商 のウェブサイトで購入しました。

microSDカードを準備する

lNetBSD/evbearmv7hf-elのSUNXIカーネルが使用できます。 NetBSD/evbarm on Allwinner Technology SoCsにある通りですが、 まずはhttp://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/から、 evbarm-earmv7hf/binary/gzimg/armv7.img.gzをダウンロードします。

次に、これを2GB以上のmicroSDカードに書き込みます。 以下のように実行します。


# gzcat armv7.img.gz | dd of=/dev/ld0d bs=1m

AllwinnerのSoCを搭載したマシンで起動させるには、u-bootを使用する必要 があります。 以下のようにして、u-bootのバイナリーを作成します。


$ cd /usr/pkgsrc/sysutils/u-boot-nanopi-neo
$ make install
これで、/usr/pkg/share/u-boot/nanopi-neo/u-boot-sunxi-with-spl.bin にu-bootのバイナリーが作成できました。

このu-bootバイナリーをmicroSDカードに書き込みます。 以下のように操作します。


# dd if=/usr/pkg/share/u-boot/nanopi-neo/u-boot-sunxi-with-spl.bin of=/dev/rld0d bs=1k seek=8 conv=sync
これで、起動する準備ができました。

起動させる

NanoPi NEOのmicroSDカードスロットに挿入し、シリアルコンソールとUTPケーブル も接続してmicro USBケーブルで電源を接続します。

シリアルコンソールで接続するNetBSDマシンでは、以下のように実行して 出力を待っておきます。


$ cu -s 115200 -l /dev/ttyU0
rootユーザーでは、sshでログインできませんので、 特にmicroSDカードの内容を先に変更しておくのでなければ、シリアルコンソールは 必須です。

カーネルの起動メッセージは以下のようになります。


Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
    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.9 (SUNXI) #0: Fri Dec 22 11:22:37 UTC 2017
 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/SUNXI
total memory = 512 MB
avail memory = 499 MB
timecounter: Timecounters tick every 10.000 msec
armfdt0 (root)
fdt0 at armfdt0: FriendlyARM NanoPi NEO
fdt1 at fdt0
fdt2 at fdt0
fdt3 at fdt0
cpus0 at fdt0
cpu0 at cpus0: Cortex-A7 r0p5 (Cortex V7A core)
cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu0: 32KB/32B 2-way L1 VIPT Instruction cache
cpu0: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu0: 512KB/64B 8-way write-through L2 PIPT Unified cache
vfp0 at cpu0: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpufreqdt0 at cpu0
cpu1 at cpus0
cpu2 at cpus0
cpu3 at cpus0
gic0 at fdt1: GIC
armgic0 at gic0: Generic Interrupt Controller, 160 sources (150 valid)
armgic0: 16 Priorities, 128 SPIs, 7 PPIs, 15 SGIs
fclock0 at fdt2: 24000000 Hz fixed clock
fclock1 at fdt2: 32768 Hz fixed clock
fclock2 at fdt2: 16000000 Hz fixed clock
gtmr0 at fdt0: Generic Timer
gtmr0: interrupting on GIC irq 27
armgtmr0 at gtmr0: ARMv7 Generic 64-bit Timer (24000 kHz)
timecounter: Timecounter "armgtmr0" frequency 24000000 Hz quality 500
sun8ih3ccu0 at fdt1: H3 CCU
sun8ih3rccu0 at fdt1: H3 PRCM CCU
sunxigpio0 at fdt1: PIO
gpio0 at sunxigpio0: 94 pins
sunxigpio0: interrupting on GIC irq 43
sunxigpio1 at fdt1: PIO
gpio1 at sunxigpio1: 12 pins
sunxigpio1: interrupting on GIC irq 77
fregulator0 at fdt0: vcc3v3
gregulator0 at fdt0: cpux-supply
fregulator1 at fdt0: vcc3v0
fregulator2 at fdt0: vcc5v0
sunxisid0 at fdt1: Security ID EFUSE
sunxiusbphy0 at fdt1: USB PHY
/soc/syscon@1c00000 at fdt1 not configured
sunxiemac0 at fdt1: EMAC
sunxiemac0: interrupting on GIC irq 114
ukphy0 at sunxiemac0 phy 1: OUI 0x0088a0, model 0x0000, rev. 0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
sun6idma0 at fdt1: DMA controller (12 channels)
sun6idma0: interrupting on GIC irq 82
h3codec0 at fdt1: H3 Audio Codec (analog part)
psci0 at fdt0: PSCI 0.1
gpioleds0 at fdt0: nanopi:blue:status nanopi:green:pwr
gpiokeys0 at fdt0: k1
sunximmc0 at fdt1: SD/MMC controller
sunximmc0: interrupting on GIC irq 92
ehci0 at fdt1: EHCI
ehci0: interrupting on GIC irq 110
ehci0: EHCI version 1.0
ehci0: 1 companion controller, 1 port
usb0 at ehci0: USB revision 2.0
ohci0 at fdt1: OHCI
ohci0: interrupting on GIC irq 111
ohci0: OHCI version 1.0
usb1 at ohci0: USB revision 1.0
sunxitimer0 at fdt1: Timer
timecounter: Timecounter "Timer 2" frequency 24000000 Hz quality 200
sunxiwdt0 at fdt1: Watchdog
sunxiwdt0: default watchdog period is 16 seconds
com0 at fdt1: ns16550a, working fifo
com0: console
com0: interrupting on GIC irq 32
sunxirtc0 at fdt1: RTC
sunxithermal0 at fdt1: Thermal sensor controller
sunxithermal0: interrupting on GIC irq 63
sunxithermal0: cpu: alarm 90C hyst 15C shut 105C
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
cpu2: Cortex-A7 r0p5 (Cortex V7A core)
cpu2: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu2: 32KB/32B 2-way L1 VIPT Instruction cache
cpu2: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu2: 512KB/64B 8-way write-through L2 PIPT Unified cache
vfp2 at cpu2: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpu1: Cortex-A7 r0p5 (Cortex V7A core)
cpu1: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu1: 32KB/32B 2-way L1 VIPT Instruction cache
cpu1: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu1: 512KB/64B 8-way write-through L2 PIPT Unified cache
vfp1 at cpu1: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpu3: Cortex-A7 r0p5 (Cortex V7A core)
cpu3: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu3: 32KB/32B 2-way L1 VIPT Instruction cache
cpu3: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu3: 512KB/64B 8-way write-through L2 PIPT Unified cache
vfp3 at cpu3: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpufreqdt0: 1008.000 MHz, 1300000 uV
cpufreqdt0: 816.000 MHz, 1100000 uV
cpufreqdt0: 480.000 MHz, 1100000 uV
sdmmc0 at sunximmc0
uhub0 at usb0: Generic (0000) EHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 1
uhub0: 1 port with 1 removable, self powered
uhub1 at usb1: Generic (0000) OHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
uhub1: 1 port with 1 removable, self powered
IPsec: Initialized Security Association Processing.
sdmmc0: SD card status: 4-bit, C10, U1
ld0 at sdmmc0: <0x03:0x5344:SL32G:0x80:0x61532365:0x0f3>
ld0: 29476 MB, 7486 cyl, 128 head, 63 sec, 512 bytes/sect x 60367872 sectors
ld0: 4-bit width, High-Speed/SDR25, 50.000 MHz
boot device: ld0
root on ld0a dumps on ld0b
root file system type: ffs
kern.module.path=/stand/evbarm/8.99.9/modules
これで、emac0と言うネットワークインターフェイスが 使用できます。

まとめ

Friendly ElecのNanoPi NEOで、NetBSD/evbearmv7hf-elのSUNXIカーネルを 起動させ、ネットワーク機能を使うことができました。 ヒートシンクを付けていますが、それなりに暖かくなります。 CPUはコア数も多く速いようなので、USB接続のSSDを付けてpkgsrcの開発に 使用するのが良さそうです。

pkgsrcでRELROを有効にしてビルドしてみる

この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった18日目の記事です。

はじめに

pkgsrcはmk.confファイルに設定しておくことで、 挙動を変更することができます。 その中に、以前より試してみたかったオプションが3つあります。

  • PKGSRC_USE_RELRO
  • PKGSRC_MKPIE
  • PKGSRC_MKREPRO
の3つです。

その中でも、PKGSRC_MKREPROに一番興味があったのですが、 どうやら今は循環依存になってしまい、リーフパッケージでないと ビルドできない状態のようです。

今回は、PKGSRC_USE_RELROを有効にして、自分のいつも使っている パッケージをビルドして使ってみました。

RELROとは何か

RELROは、RElocation Read-Onlyの略だそうです。 私はセキュリティー機能の専門家ではないので、詳しく説明はできませんが、 メモリーの一部の領域を読み出し専用にして、メモリーの破壊を防止する ことで、安全性を高める手法と理解しています。

設定方法

mk.confに設定できる内容は、pkgsrc/mk/defaults/mk.conf に既定値が設定されており、コメントも付記されています。 RELROについては、以下のように記載されています。


PKGSRC_USE_RELRO?= no
# Link with RELRO by default (on supported platforms). This makes the
# exploitation of some security vulnerabilities more difficult in some cases.
# Possible values:
#       no:      Do not pass any flags for RELRO
#       partial: Pass -Wl,-z,relro
#       full:    Pass -Wl,-z,relro -Wl,-z,now
#
# Keywords: relro

のように記載されています。この内容は、任意のパッケージのディレクトリーで 以下のように実行することで読むこともできます。

$ make help topic=relro
===> mk/defaults/mk.conf (keywords: relro no PKGSRC_USE_RELRO full partial):
PKGSRC_USE_RELRO?= no
# Link with RELRO by default (on supported platforms). This makes the
# exploitation of some security vulnerabilities more difficult in some cases.
# Possible values:
#       no:      Do not pass any flags for RELRO
#       partial: Pass -Wl,-z,relro
#       full:    Pass -Wl,-z,relro -Wl,-z,now
#

これによると、PKGSRC_USE_RELROの既定値はnoで、 有効にするには、partialとfullのいずれかを 設定することが必要と分かります。 また、コンパイラーにLDFLAGS経由で渡されるオプションについても記載されています。

今回は、fullを指定したいと思います。Got overwriteが防止 できるようになるようです。

RELROを有効にして

上述したように、コンパイラーにオプションが渡されます。 これによって、RELROが有効になったバイナリーができるはずですが、 pkgsrcでは、RELROが有効になってバイナリーが本当に生成されたかを readelfコマンドで確認するようになっています。 ですので、LDFLAGSを尊重しないようになっているビルドメカニズムである パッケージについて、RELROを有効にしてビルドしたつもりになって しまうのを防止することができます。

私の使っているパッケージのビルドでは、converters/qkc 以外はLDFLAGSを尊重しているようで、RELROを有効にしたバイナリーを 作成することができました。 editors/emacs25やwww/firefoxも 特に支障なく動いているようです。

まとめ

RELROを有効にして、pkgsrcのパッケージをビルドしてみました。

Hyper-V第1世代の仮想マシンでレガシーネットワークアダプターが使えるようになった

この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった17日目の記事です。

はじめに

PR kern/49323という2014年10月に send-prして何もできないままになっていた、Hyper-V第1世代の仮想マシンで レガシーネットワークアダプターが使えない問題が、2017年11月にnakayama@さん によって修正されました。

これによって、100 Mbpsではありますが、支障なくネットワーク接続できるように なったので、私は大変喜んでいます。 nakayama@さんありがとうございます。

Hyper-VとBSD

私は大変喜んではいるのですが、Hyper-Vのサポートについては、 FreeBSDやOpenBSDでは既に準仮想化デバイスも含め、 順調にサポートが進んでいるようです。

私も仕事でHyper-Vを使わないといけない場合には、 FreeBSD/amd64を使っています。 でも、Hyper-V第2世代仮想マシンは、FreeBSD/amd64 11.1のISOイメージを 起動させることはできませんでした。

NetBSDと言うと、Google Summer of Codeで課題になったことはあったようですが、 進まなかったのか、結果がsrcツリーにcommitされてはいません。

いつものように、世界で自分しか困っていないパターンなのかもしれません…。

Hyper-V仮想マシンの様子

Hyper-V第1世代の仮想マシンを用意し、ネットワークアダプターを削除して、 レガシーネットワークアダプターを追加するだけです。 acpicpu0の後で、fd0を初期化する辺りで なかなか進まず、気分的にあきらめそうになりますが、 我慢して待ては進みます。 カーネルのブートメッセージは以下のようになります。


Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
    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.9 (GENERIC) #0: Sun Dec 17 17:49:04 UTC 2017
 mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/amd64/compile/GENERIC
total memory = 1023 MB
avail memory = 971 MB
WARNING: module error: module `cd9660' pushed by boot loader already exists
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
Microsoft Corporation Virtual Machine (7.0)
mainbus0 (root)
ACPI: RSDP 0x00000000000F5BF0 000014 (v00 ACPIAM)
ACPI: RSDT 0x000000003FFF0000 000040 (v01 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: FACP 0x000000003FFF0200 000081 (v02 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: DSDT 0x000000003FFF1D24 003CBE (v01 MSFTVM MSFTVM02 00000002 INTL 02002026)
ACPI: FACS 0x000000003FFFF000 000040
ACPI: WAET 0x000000003FFF1A80 000028 (v01 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: SLIC 0x000000003FFF1AC0 000176 (v01 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: OEM0 0x000000003FFF1CC0 000064 (v01 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: SRAT 0x000000003FFF0800 0000E0 (v02 VRTUAL MICROSFT 00000001 MSFT 00000001)
ACPI: APIC 0x000000003FFF0300 000452 (v01 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: OEMB 0x000000003FFFF040 000064 (v01 VRTUAL MICROSFT 06001702 MSFT 00000097)
ACPI: 1 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) Core(TM) i3-2348M CPU @ 2.30GHz, id 0x206a7
cpu0: package 0, core 0, smt 0
acpi0 at mainbus0: Intel ACPICA 20171110
acpi0: X/RSDT: OemId , AslId 
LNKA: ACPI: Found matching pin for 0.8.INTA at func 0: 11
LNKA: ACPI: Found matching pin for 0.10.INTA at func 0: 11
acpi0: SCI interrupting at int 9
timecounter: Timecounter "ACPI-Safe" frequency 3579545 Hz quality 900
attimer1 at acpi0 (TMR, PNP0100): io 0x40-0x43 irq 0
pckbc1 at acpi0 (PS2K, PNP0303) (kbd port): io 0x60,0x64 irq 1
pckbc2 at acpi0 (PS2M, PNP0F03) (aux port): irq 12
pcppi1 at acpi0 (SPKR, PNP0800): io 0x61
spkr0 at pcppi1: PC Speaker
wsbell at spkr0 not configured
midi0 at pcppi1: PC speaker
sysbeep0 at pcppi1
UAR1 (PNP0501) at acpi0 not configured
UAR2 (PNP0501) at acpi0 not configured
FDC (PNP0700) at acpi0 not configured
SYSR (PNP0C02) at acpi0 not configured
OSYS (PNP0C02) at acpi0 not configured
VMB8 (VMBUS) at acpi0 not configured
SYSM (PNP0C01) at acpi0 not configured
GENC (HYPER_V_GEN_COUNTER_V1) at acpi0 not configured
ACPI: Enabled 1 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
attimer1: attached to pcppi1
pci0 at mainbus0 bus 0: configuration mode 1
pci0: This pci host supports neither MSI nor MSI-X.
pci0: i/o space, memory space enabled, rd/line, rd/mult, wr/inv ok
pchb0 at pci0 dev 0 function 0: vendor 8086 product 7192 (rev. 0x03)
pcib0 at pci0 dev 7 function 0: vendor 8086 product 7110 (rev. 0x01)
piixide0 at pci0 dev 7 function 1: Intel 82371AB IDE controller (PIIX4) (rev. 0x01)
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 7 function 3: vendor 8086 product 7113 (rev. 0x02)
timecounter: Timecounter "piixpm0" frequency 3579545 Hz quality 900
piixpm0: 24-bit timer
piixpm0: SMBus disabled
vga0 at pci0 dev 8 function 0: vendor 1414 product 5353 (rev. 0x00)
wsdisplay0 at vga0 kbdmux 1: console (80x25, vt100 emulation), using wskbd0
wsmux1: connecting to wsdisplay0
drm at vga0 not configured
tlp0 at pci0 dev 10 function 0: DECchip 21140A Ethernet, pass 2.0
tlp0: interrupting at ioapic0 pin 11
tlp0: Ethernet address 00:15:5d:00:7d:01
tlp0: 100baseTX, 100baseTX-FDX
isa0 at pcib0
com0 at isa0 port 0x3f8-0x3ff irq 4: ns16550a, working fifo
com1 at isa0 port 0x2f8-0x2ff irq 3: ns16550a, working fifo
fdc0 at isa0 port 0x3f0-0x3f7 irq 6 drq 2
acpicpu0 at cpu0: ACPI CPU
acpicpu0: C1: HLT, lat   0 us, pow     0 mW
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
fd0 at fdc0 drive 0: 1.44MB, 80 cyl, 2 head, 18 sec
wd0 at atabus0 drive 0
wd0: &t;Virtual HD>
wd0: drive supports 128-sector PIO transfers, LBA48 addressing
wd0: 127 GB, 264224 cyl, 16 head, 63 sec, 512 bytes/sect x 266338304 sectors
IPsec: Initialized Security Association Processing.
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, WRITE DMA FUA
wd0(piixide0:0:0): using PIO mode 4, DMA mode 2 (using DMA), WRITE DMA FUA EXT
atapibus0 at atabus1: 2 targets
cd0 at atapibus0 drive 0: <Virtual CD, , > cdrom removable
cd0: 32-bit data port
cd0: drive supports PIO mode 4, DMA mode 2
cd0(piixide0:1:0): using PIO mode 4, DMA mode 2 (using DMA)
boot device: cd0
root on cd0a dumps on cd0b
root file system type: cd9660
kern.module.path=/stand/amd64/8.99.9/modules
tlp0としてレガシーネットワークアダプターが認識されました。

以下のようにdhcpcd(8)を使ってアドレスを取得しましたが、 以前のようにエラーにはならず、その後のftpでのダウンロードも 問題なくできました。


# dhcpcd tlp0
# ifconfig tlp0
tlp0: flags=0x8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ec_capabilities=1<VLAN_MTU>
        ec_enabled=0
        address: 00:15:5d:00:7d:01
        media: Ethernet 100baseTX
        status: active
        inet 172.17.248.236/28 broadcast 172.17.248.239 flags 0x0
        inet6 fe80::79e6:af53:6f8e:e91%tlp0/64 flags 0x0 scopeid 0x1

まとめ

Hyper-V第1世代の仮想マシンでレガシーネットワークアダプターを NetBSDから使えるようになりました。

ですが、レガシーでない方のネットワークアダプター、 Hyper-V第2世代の仮想マシンのサポートなどやるべきことはたくさんありそうです。

NetBSDでWacom Intuos 2ペンタブレットを使う

この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった15日目の記事です。

はじめに

Wacom Intuos 2 A4 XD-0912-Uと言うペンタブレットを入手した。 残念ながら絵心はないのだが、NetBSDで使えないのはもったいないので、 使えるようにしてみた。

XD-0912-Uは、A4サイズのペンタブレットで、ペンは傾きも検出できるもので、 売られていた当時は、旗艦モデルだったような気がする。 ただし、今はWindows 7までしか対応しておらず、Windows 10では使用できないので Windowsでは使用は難しいかもしれない。

NetBSDのペンタブレットサポートを考える

ペンタブレットは、マウスとは違い、絶対的な位置情報を発信する必要がある。 NetBSDの既存の仕組みを見てみると、絶対的な位置情報を扱うものとして、 uts(4)というUSB接続タッチパネルの仕組みがあるが、 ペンタブレットをフル活用するには、筆圧、ペンの傾きをサポートする必要がある。 wsmouse(4)の仕組みも、筆圧やペンの傾きの情報を扱えるようには 設計されていないようだ。

と言うことで、uhid(4)を使っている既存の仕組みを改造してサポートする のが現実的だ。 デバイスの初期化はNetBSDカーネルで行い、 OpenBSD用のX windows systemであるXenocaraに含まれている xf86-input-usbtabletを改造して、 対応することにした。

NetBSDカーネルでの初期化

初期化は、基本的には既存のWacom製のペンタブレットと同じで、インターフェイスに 0x0202というデータを送ることで初期化できる。 Wacom Intuos 2は、0x0202による初期化をしないと、相対的な位置情報を USBマウスのように発信してくる。 USBマウスとして動かなくなったら正しく初期化できたと分かる。

uhid(4)の出力を解析する

LinuxのWacom用のデバイスドライバーに関連する資料などを 見ながら、実際にペンを動かして確認してみることにする。


$ cat /dev/uhid0 | od -x
のように実行した上で、ペンタブレット上でペンを動かして出力される データを確認して行く。 ですが、結局はデータの最初の部分がどのようになるかを把握する以上の ことはできなかった。

仕方がないのでLinuxのソースコードを読んでみることにした。。 主には、 drivers/input/tablet/wacom_wac.c を見れば良かった。 LinuxのWacomサポートは、evdevの仕組みで出力すると言うことのようなので、 出力は参考にならないが、ペンタブレットからの入力をデコードする部分の 必要な演算は分かる。 中身自体は、どこで切って入力値にするかと言うだけなので、 あまり面白みはなかった。

本当は、X.orgのインプットモジュールを書く方法について、 きちんとまとめておきたいのだが、今回は割愛して、実際の使用方法に移る。

使い方

以下のようにソースコードを取得し、ビルドし、配置する。 ここで、X.orgはNetBSDのxsrcを使っているので、pkgsrcから導入した場合には、 /usr/pkg以下に配置する必要があるだろう。


$ git clone git@github.com:ryoon/xf86-input-usbtablet.git
$ cd xf86-input-usbtablet
$ ./configure
$ make
# cp src/.libs/usbtablet_drv.so /usr/X11R7/lib/modules/drivers

残念ながら自動的にこのxf86-input-usbtabletドライバーを使用してくれるような ことはない。 以下のように/etc/X11/xorg.confに追加しておく必要がある。 赤字の部分が重要である。


Section "ServerLayout"
 Identifier     "X.org Configured"
 Screen      0  "Screen0" 0 0
 Screen      1  "Screen1" RightOf "Screen0"
 InputDevice    "Mouse0" "CorePointer"
 InputDevice    "Keyboard0" "CoreKeyboard"

 InputDevice    "w_stylus" "SendCoreEvents"
 InputDevice    "w_eraser" "SendCoreEvents" 

EndSection

Section "Files"
 ModulePath   "/usr/X11R7/lib/modules"
 FontPath     "/usr/X11R7/lib/X11/fonts/misc/"
 FontPath     "/usr/X11R7/lib/X11/fonts/TTF/"
 FontPath     "/usr/X11R7/lib/X11/fonts/Type1/"
 FontPath     "/usr/X11R7/lib/X11/fonts/75dpi/"
 FontPath     "/usr/X11R7/lib/X11/fonts/100dpi/"
 FontPath     "/usr/pkg/share/fonts/X11/TTF/"
 FontPath     "/usr/pkg/share/fonts/X11/local/"
EndSection

Section "Module"
 Load  "dbe"
# Load  "dri"
# Load  "dri2"
 Load  "extmod"
 Load  "glx"
 Load  "record"
 Load  "shadow"
EndSection

Section "InputDevice"
 Identifier  "Keyboard0"
 Driver      "kbd"
EndSection

Section "InputDevice"
 Identifier  "Mouse0"
 Driver      "mouse"
 Option     "Protocol" "wsmouse"
 Option     "Device" "/dev/wsmouse"
 Option     "ZAxisMapping" "4 5 6 7"
 Option     "Emulate3Buttons" "on"
EndSection


Section "InputDevice"
 Identifier "w_stylus"
 Driver "usbtablet"
 Option "Type" "stylus"
 Option "Device" "/dev/uhid0"
 Option "Mode" "Absolute"
 Option "Threshold" "10"
# Option "DebugLevel" "99"
EndSection

Section "InputDevice"
 Identifier "w_eraser"
 Driver "usbtablet"
 Option "Type" "eraser"
 Option "Device" "/dev/uhid0"
 Option "Mode" "Absolute"
# Option "DebugLevel" "99"
EndSection


Section "Monitor"
 Identifier   "Monitor0"
 VendorName   "Monitor Vendor"
 ModelName    "Monitor Model"
EndSection

Section "Monitor"
 Identifier   "Monitor1"
 VendorName   "Monitor Vendor"
 ModelName    "Monitor Model"
EndSection

Section "Device"
  Option     "NoAccel" "True"
        #Option     "AccelMethod"
        #Option     "Backlight"
        Option     "DRI" "False"
        #Option     "ColorKey"
        #Option     "VideoKey"
        #Option     "Tiling"
        #Option     "LinearFramebuffer"
        #Option     "SwapbuffersWait"
        #Option     "TripleBuffer"
        #Option     "XvPreferOverlay"
        #Option     "HotPlug"
        #Option     "ReprobeOutputs"
        #Option     "XvMC"
        #Option     "ZaphodHeads"
        #Option     "TearFree"
        #Option     "PerCrtcPixmaps"
        #Option     "FallbackDebug"
        #Option     "DebugFlushBatches"
        #Option     "DebugFlushCaches"
        #Option     "DebugWait"
        #Option     "BufferCache"
 Identifier  "Card0"
# Option     "AccelMethod" "SNA"
# Option     "AccelMethod" "UXA"
 Driver      "intel"
 BusID       "PCI:0:2:0"
EndSection

Section "Screen"
 Identifier "Screen0"
 Device     "Card0"
 Monitor    "Monitor0"
 SubSection "Display"
  Viewport   0 0
  Depth     1
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     4
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     8
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     15
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     16
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     24
 EndSubSection
EndSection

Section "Screen"
 Identifier "Screen1"
 Device     "Card1"
 Monitor    "Monitor1"
 SubSection "Display"
  Viewport   0 0
  Depth     1
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     4
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     8
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     15
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     16
 EndSubSection
 SubSection "Display"
  Viewport   0 0
  Depth     24
 EndSubSection
EndSection

これで、pkgsrc/graphics/gimpでペンと消しゴムが使用できる。

一応、今も売っているはずのでIntuos Art CTH-690/K0でも動くのだが、 uhid(4)の何かのバグに突き当たっているようなので、お勧めはしない。

まとめ

Wacom Intuos 2をNetBSDで動くようにできた。 私は絵心は皆無なので、実際にこれを使って絵を描いてみると、致命的な 間違いをしていることが分かるかもしれない。特にペンの傾きは不安である。

ついでに、Wacom Favoで、ペンの傾きを正しく無視するようにしたので、 Wacom Favoユーザーにも使ってもらえると良いかもしれない。 Gimpがsegfaultで終了しなくなる。

NetBSD/evbearmでfdt(4)対応した環境を試してみる

この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった13日目の記事です。

はじめに

最近、NetBSD/armでは、fdt(4)に対応するのが進んでいる。 fdtとはFlattened Device Treeの略で、dtbファイルを用意しておけば、 各機種ごとにカーネルを用意しなくても、NetBSD/i386やNetBSD/amd64における GENERICカーネルのようなものを用意できるもののようだ。

fdt(4)に対応すると、カーネルのブートメッセージがどのように変化するか 自分で確認しておきたかったので、今回試してみた。

今回使用した機種は、Cubieboard2というAllwinner A20というSoCを搭載した ものです。これはsun7iという名前で呼ばれているアーキテクチャーである。 これは、SATAでHDDやSSDを接続できるため、pkgsrc/www/firefoxをビルド するのに使用していた。 今は、pkgsrc/lang/rustがNetBSD/armではビルドできないので お休み中である、

fdt(4)に対応する前のCUBIEBOARDカーネルのカーネルのブートメッセージは、 えびはらさんが https://github.com/ebijun/NetBSD/blob/master/allwinner/dmesgに 掲載してくれている。

どのカーネルを使用すれば良いか

GENERICカーネル的なものを作成できると書いたが、 現状ではAllwinnerのsun?iアーキテクチャーのSoCを使った機種は、 SUNXIカーネルを使うことになっているようだ。

ディスクイメージファイルを生成する

Cubieboard2に対しては、NetBSD/evbearmv7hf-elが リトルエンディアンでは最適なアーキテクチャーだと考えられる。

NetBSD-currentのソースコードが/usr/srcに、 X window systemのソースコードが/usr/xsrcに それぞれ配置されているとすると、 以下のようにして、ディスクイメージファイルの生成まで一括して 実行することができる。


$ cd /usr/src
$ ./build.sh -U -O /usr/world/8.99/evbearmv7hf-el/obj \
-T /usr/world/8.99/evbearmv7hf-el/tools \
-D /usr/world/8.99/evbearmv7hf-el/destdir \
-R /usr/world/8.99/evbearmv7hf-el/release -x -j 5 -m evbearmv7hf-el release
私は、NetBSD/arm64 8.0_BETAの環境で実行したが、POSIXにある程度準拠した環境で あれば、どこでも同じようにビルドできるはずである。 私の環境では、ほぼ2時間で完了した。

以上のように実行すると、/usr/world/8.99/evbearmv7hf-el/release/evbarm/binary/gzimg/armv7.img.gz のように、gzipで圧縮されたディスクイメージファイルが作成される。

ディスクイメージファイルをmicroSDカードに書き込む

Cubieboard2には、microSDカードを挿入できるようになっている。 以下のようにして、dynabook R73/PS上のNetBSD/amd64でmicroSDカードに書き込んだ。 dynabook R73/PSには、SDカードスロットがあり、そこに挿入された SDカードは、ld(4)デバイスとして認識されるが、 USB接続のメモリーカードリーダー/ライターであれば、 sd(4)になるだろう。 NetBSD/amd64かNetBSD/i386でなければ、書き込み先は/dev/rld0d のようにdではないかもしれない。


$ gzcat armv7.img.gz| sudo dd of=/dev/rld0d bs=1m
ここでは、pkgsrc/security/sudoを使ってみた。

ディスクにu-bootブートローダーのプログラムを書き込む

Cuboeboard2でのブートはu-bootを使う。 Cubieboard用のu-bootのバイナリーは、以下のようにしてpkgsrcの枠組みの中で 作成することができる。


$ cd /usr/pkgsrc/sysutils/u-boot-cubieboard2
$ make install
これで、/usr/pkg/share/u-boot/cubieboard2/u-boot-sunxi-with-spl.bin にCubieboard2用のu-bootイメージを得ることができた。 以下のようにして書き込む。

# dd if=/usr/pkg/share/u-boot/cubieboard2/u-boot-sunxi-with-spl.bin of=/dev/rld0d bs=1k seek=8 conv=sync

HDMI接続でブートメッセージが見えるようにする

Cubieboard2は、HDMIでディスプレイを接続し、X window systemも使用できるが、 armv7imgディスクイメージファイルでSUNXIカーネルの対応する環境には、 シリアルコンソールしかない機種もある。 そのためか、armv7.imgディスクイメージファイルでは、 Cubieboard2であってもシリアルコンソールを使用するようになっている。 そこで、HDMI接続されたディスプレイにカーネルのブートメッセージを表示し、 操作できるように設定しておくことにする。

まずは、u-bootのブートコマンドを書き換え、バイナリーを再生成する。 ここでは、NetBSD/amd64の環境で実行するとする。


# mount_msdos /dev/ld0a /mnt
$ cd /mnt
$ vi boot.cmd (赤字の部分を追加する)
if test "${soc}" = "sunxi" ; then
        setenv kernel netbsd-SUNXI.ub
        setenv bootargs root=ld0a console=fb
        setenv mmcpart 0:1
        setenv use_fdt 1
fi
if test "${soc}" = "tegra" ; then
        setenv kernel netbsd-TEGRA.ub
        setenv bootargs root=ld1a
        setenv mmcpart 1:1
        setenv use_fdt 1
fi
if test "${board}" = "am335x" ; then
        setenv kernel netbsd-BEAGLEBONE.ub
        setenv mmcpart 0:1
        setenv bootargs root=ld0a
fi

if test "${kernel}" = "" ; then
        echo '>>>'
        echo '>>> Target device is not supported by this script.'
        echo '>>>'
        exit
fi

if test "${use_fdt}" = "1" ; then
        fatload mmc ${mmcpart} ${kernel_addr_r} ${kernel}
        fatload mmc ${mmcpart} ${fdt_addr_r} ${fdtfile}
        fdt addr ${fdt_addr_r}
        bootm ${kernel_addr_r} - ${fdt_addr_r}
else
        fatload mmc ${mmcpart} ${kernel_addr_r} ${kernel}
        bootm ${kernel_addr_r} ${bootargs}
fi
$ mkubootimage -A arm -C none -O linux -T script -a 0 -n "NetBSD sunxi boot" boot.cmd boot.scr
$ cd ~
# umount /mnt
これで準備は完了した。

起動してカーネルのブートメッセージを確認する

後は、microSDカードをCubieboard2に挿入して、HDMIケーブルとUSBキーボードを つなぎ、電源をつなげば起動する。

初回は、microSDカードいっぱいまで使用可能領域を伸長させる処理があるので、 何もできない。 自動的に再起動した後にログインできる。 この時点では、ユーザーIDはroot、パスワードは設定なしでログインできる。 以下のようなカーネルのブートメッセージが表示できた。 いたる所にfdtと入っている。


Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
    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.9 (SUNXI) #0: Sat Dec 16 00:35:22 JST 2017
 ryoon@datesquare:/usr/world/8.99/evbearmv7hf-el/obj/sys/arch/evbarm/compile/SUNXI
total memory = 1016 MB
avail memory = 998 MB
timecounter: Timecounters tick every 10.000 msec
armfdt0 (root)
fdt0 at armfdt0: Cubietech Cubieboard2
fdt1 at fdt0
fdt2 at fdt0
fdt3 at fdt0
cpus0 at fdt0
cpu0 at cpus0: Cortex-A7 r0p4 (Cortex V7A core)
cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu0: 32KB/32B 2-way L1 VIPT Instruction cache
cpu0: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu0: 256KB/64B 8-way write-through L2 PIPT Unified cache
vfp0 at cpu0: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpufreqdt0 at cpu0
cpu1 at cpus0
gic0 at fdt1: GIC
armgic0 at gic0: Generic Interrupt Controller, 160 sources (150 valid)
armgic0: 16 Priorities, 128 SPIs, 7 PPIs, 15 SGIs
fclock0 at fdt2: 25000000 Hz fixed clock
fclock1 at fdt2: 125000000 Hz fixed clock
fclock2 at fdt2: 24000000 Hz fixed clock
fclock3 at fdt2: 32768 Hz fixed clock
gtmr0 at fdt0: Generic Timer
gtmr0: interrupting on GIC irq 27
armgtmr0 at gtmr0: ARMv7 Generic 64-bit Timer (24000 kHz)
timecounter: Timecounter "armgtmr0" frequency 24000000 Hz quality 500
sun4ia10ccu0 at fdt1: A20 CCU
sunxigmacclk0 at fdt2: GMAC MII/RGMII clock mux
sunxigpio0 at fdt1: PIO
gpio0 at sunxigpio0: 175 pins
sunxigpio0: interrupting on GIC irq 60
sunxisramc0 at fdt1: SRAM Controller
sunxisramc0: area: SRAM A3/A4
sunxisramc0: area: SRAM D
fregulator0 at fdt0: vcc3v3
fregulator1 at fdt0: usb1-vbus
fregulator2 at fdt0: usb2-vbus
fregulator3 at fdt0: ahci-5v
fregulator4 at fdt0: vcc3v0
fregulator5 at fdt0: vcc5v0
sunxisid0 at fdt1: Security ID EFUSE
sunxiusbphy0 at fdt1: USB PHY
sunxitwi0 at fdt1: Marvell TWSI controller
sunxitwi0: interrupting on GIC irq 39
iic0 at sunxitwi0: I2C bus
axp20x0 at iic0 addr 0x34: AC used
axp20x0: DCDC2 1400mV
axp20x0: DCDC3 1250mV
axp20x0: LDO2 3000mV, LDO4 3300mV
axp20x0: LDO3 2800mV
axp20xreg0 at axp20x0: dcdc2 (vdd-cpu)
axp20xreg1 at axp20x0: dcdc3 (vdd-int-dll)
sunxits0 at fdt1: Touch Screen Controller
sunxits0: interrupting on GIC irq 61
/soc@1c00000/display-frontend@1e00000 at fdt1 not configured
/soc@1c00000/display-frontend@1e20000 at fdt1 not configured
sun4idma0 at fdt1: DMA controller
sun4idma0: interrupting on GIC irq 59
/soc@1c00000/display-backend@1e60000 at fdt1 not configured
/soc@1c00000/display-backend@1e40000 at fdt1 not configured
/soc@1c00000/hdmi@1c16000 at fdt1 not configured
/soc@1c00000/lcd-controller@1c0c000 at fdt1 not configured
/soc@1c00000/lcd-controller@1c0d000 at fdt1 not configured
/hdmi-connector at fdt0 not configured
/soc@1c00000/interrupt-controller@1c00030 at fdt1 not configured
awge0 at fdt1: GMAC
awge0: interrupting on GIC irq 117
awge0: Ethernet address: 02:0d:0b:82:26:14
rlphy0 at awge0 phy 1: RTL8201L 10/100 media interface, rev. 1
rlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
psci0 at fdt0: PSCI 0.1
/pmu at fdt0 not configured
/display-engine at fdt0 not configured
gpioleds0 at fdt0: cubieboard2:blue:usr cubieboard2:green:usr
sunximmc0 at fdt1: SD/MMC controller
sunximmc0: interrupting on GIC irq 64
motg0 at fdt1: 'otg' mode not supported
ehci0 at fdt1: EHCI
ehci0: interrupting on GIC irq 71
ehci0: EHCI version 1.0
ehci0: 1 companion controller, 1 port
usb0 at ehci0: USB revision 2.0
ohci0 at fdt1: OHCI
ohci0: interrupting on GIC irq 96
ohci0: OHCI version 1.0
usb1 at ohci0: USB revision 1.0
/soc@1c00000/crypto-engine@1c15000 at fdt1 not configured
ahcisata0 at fdt1: SATA
ahcisata0: interrupting on GIC irq 88
ahcisata0: ignoring broken port multiplier support
ahcisata0: AHCI revision 1.10, 1 port, 32 slots, CAP 0x6f24ff80
atabus0 at ahcisata0 channel 0
ehci1 at fdt1: EHCI
ehci1: interrupting on GIC irq 72
ehci1: EHCI version 1.0
ehci1: 1 companion controller, 1 port
usb2 at ehci1: USB revision 2.0
ohci1 at fdt1: OHCI
ohci1: interrupting on GIC irq 97
ohci1: OHCI version 1.0
usb3 at ohci1: USB revision 1.0
sunxitimer0 at fdt1: Timer
sunxiwdt0 at fdt1: Watchdog
sunxiwdt0: default watchdog period is 16 seconds
sunxirtc0 at fdt1: RTC
/soc@1c00000/ir@1c21800 at fdt1 not configured
sunxicodec0 at fdt1: A10 Audio Codec
audio0 at sunxicodec0: full duplex, playback, capture, mmap, independent
sunxicodec0: Virtual format configured - Format SLINEAR, precision 16, channels 2, frequency 48000
sunxicodec0: Latency: 256 milliseconds
spkr0 at audio0: PC Speaker (synthesized)
wsbell at spkr0 not configured
com0 at fdt1: ns16550a, working fifo
com0: interrupting on GIC irq 33
sunxitwi1 at fdt1: Marvell TWSI controller
sunxitwi1: interrupting on GIC irq 40
iic1 at sunxitwi1: I2C bus
/soc@1c00000/hstimer@1c60000 at fdt1 not configured
genfb0 at fdt3: Simple Framebuffer (1920x1080 32-bpp @ 0x7f817000)
genfb0: switching to framebuffer console
genfb0: framebuffer at 0x7f817000, size 1920x1080, depth 32, stride 7680
wsdisplay0 at genfb0 kbdmux 1: console (default, vt100 emulation)
wsmux1: connecting to wsdisplay0
wsdisplay0: screen 1-3 added (default, vt100 emulation)
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
cpu1: Cortex-A7 r0p4 (Cortex V7A core)
cpu1: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu1: 32KB/32B 2-way L1 VIPT Instruction cache
cpu1: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu1: 256KB/64B 8-way write-through L2 PIPT Unified cache
vfp1 at cpu1: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpufreqdt0: 960.000 MHz, 1400000 uV
cpufreqdt0: 912.000 MHz, 1400000 uV
cpufreqdt0: 864.000 MHz, 1300000 uV
cpufreqdt0: 720.000 MHz, 1200000 uV
cpufreqdt0: 528.000 MHz, 1100000 uV
cpufreqdt0: 312.000 MHz, 1000000 uV
cpufreqdt0: 144.000 MHz, 1000000 uV
sdmmc0 at sunximmc0
uhub0 at usb1: Generic (0000) OHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
uhub0: 1 port with 1 removable, self powered
uhub1 at usb0: Generic (0000) EHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 1
uhub1: 1 port with 1 removable, self powered
uhub2 at usb3: Generic (0000) OHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
uhub2: 1 port with 1 removable, self powered
uhub3 at usb2: Generic (0000) EHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 1
uhub3: 1 port with 1 removable, self powered
IPsec: Initialized Security Association Processing.
sdmmc0: SD card status: 4-bit, C10, U1
ld0 at sdmmc0: <0x03:0x5344:SL32G:0x80:0x61532365:0x0f3>
ld0: 29476 MB, 7486 cyl, 128 head, 63 sec, 512 bytes/sect x 60367872 sectors
ld0: 4-bit width, High-Speed/SDR25, 50.000 MHz
ehci0: handing over low speed device on port 1 to companion controller
boot device: ld0
root on ld0a dumps on ld0b
root file system type: ffs
kern.module.path=/stand/evbarm/8.99.9/modules
WARNING: preposterous TOD clock time
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!
uhidev0 at uhub0 port 1 configuration 1 interface 0
uhidev0: Dell (0x413c) Dell USB Keyboard (0x2003), rev 1.10/2.00, addr 2, iclass 3/1
ukbd0 at uhidev0: 8 Variable keys, 6 Array codes
wskbd0 at ukbd0: console keyboard, using wsdisplay0
wsdisplay0: screen 4 added (default, vt100 emulation)
cpu0とcpu1が離れているのがおもしろい。

まとめ

fdt(4)を使ったNetBSD/evbarmの環境を体験することができた。

HP ProLiant ML110 G7に32GBのメモリーを搭載する

HP ProLiant ML110 G7 Server Maintenance and Service Guide の62ページ目には、以下のように記載されている。 General DIMM slot population guidelines Th...