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の機能を 使って、ビデオの再生やエンコードを高速化したいと思います。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

plgarc/wip/llama.cppでpkgsrcのBLASサポートを探る

この記事は、 NetBSD Advent Calendar 2024 の13日目の記事です。 llama.cppを使ってみる 以前に、 NetBSD/amd64でllama.cppを使ってみる という記事で llama.cpp を使ってみていました。 あれか...