pharo-vm on NetBSD/amd64

Pharo 9のVMNetBSD/amd64でも動かせるようになったのでメモ。

f:id:steleto:20210815201040p:plain

source

リポジトリhttps://github.com/pharo-project/opensmalltalk-vm にあるが、こちらはVMMakerで自動生成されたコードは入っていない。自動生成させるにはpharo-vmが必要なので、「pharo-vmバイナリを作るのにpharo-vmのソースが必要で、pharo-vmのソースを作るのにpharo-vmバイナリが必要で……」という循環参照が発生する。

幸い自動生成されたコードも含めたものが http://files.pharo.org/vm/pharo-spur64-headless/Linux-x86_64/source/ にあるので、こっちから持ってくれば問題ない。ディレクトリ名に「headless」とあるけどcmakeのオプション指定で非headlessにできるので問題なし。

patch

とりあえず動くようにはなったけど、これで正解なのかは知らない。

  • "cmake/<OS>.cmake" を要求するので、とりあえず "cmake/OpenBSD.cmake" を "cmake/NetBSD.cmake" にコピー

  • backtrace(3) を使用しているので libexecinfo が必要になる

--- CMakeLists.txt.orig
+++ CMakeLists.txt
@@ -367,6 +367,7 @@
 check_library_exists(dl dlopen "" HAVE_LIBDL)
 check_library_exists(dyld dlopen "" HAVE_DYLD)
 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
+check_library_exists(execinfo backtrace "" HAVE_EXECINFO)
 
 #Required by the UUID Plugin
 
@@ -451,6 +452,10 @@
 add_executable(${VM_EXECUTABLE_NAME} ${VM_FRONTEND_APPLICATION_TYPE} ${VM_FRONTEND_SOURCES})
 addLibraryWithRPATH(${VM_LIBRARY_NAME} ${VM_SOURCES})
 
+if(${HAVE_EXECINFO})
+   target_link_libraries(${VM_LIBRARY_NAME} execinfo)
+endif()
+
 #
 # LibFFI
 #
  • uuidgen(2) を使用する(同時に libuuid の uuid_generate との衝突を回避)
    • もともと uuidgen(2) を使用するコードがあったのでなるべくそちらを使うように頑張ったけど、やっぱり面倒だったので libuuid の uuid_generate に統一しても良いんじゃないかと思った次第。
--- CMakeLists.txt.orig
+++ CMakeLists.txt
@@ -374,6 +374,6 @@
 check_include_files(uuid/uuid.h HAVE_UUID_UUID_H)
 check_include_files(uuid.h HAVE_UUID_H)
-check_library_exists(uuid uuidgen "" HAVE_UUIDGEN)
+check_function_exists(uuidgen HAVE_UUIDGEN)
 check_library_exists(uuid uuid_generate "" HAVE_UUID_GENERATE)
 
 
--- plugins.cmake.orig
+++ plugins.cmake
@@ -77,7 +77,7 @@
     addLibraryWithRPATH(UUIDPlugin ${UUIDPlugin_SOURCES})
     if(WIN)
         target_link_libraries(UUIDPlugin PRIVATE "-lole32")
-    elseif(UNIX AND NOT OSX)
+    elseif(UNIX AND NOT OSX AND HAVE_UUID_GENENATE)
        #find_path(LIB_UUID_INCLUDE_DIR uuid.h PATH_SUFFIXES uuid)
         find_library(LIB_UUID_LIBRARY uuid)
         message(STATUS "Using uuid library:" ${LIB_UUID_LIBRARY})
  • uuidgen(2) は native byte-order なので、 uuid_generate に合わせて big endian に強制する
    • やっぱり uuid_generate に統一したほうが楽そう
--- plugins/UUIDPlugin/common/UUIDPlugin.c.orig
+++ plugins/UUIDPlugin/common/UUIDPlugin.c
@@ -41,6 +41,9 @@
 
    #if defined(HAVE_UUIDGEN)
      uuidgen(&uuid, 1);
+     uuid.time_low = htobe32(uuid.time_low);
+     uuid.time_mid = htobe16(uuid.time_mid);
+     uuid.time_hi_and_version = htobe16(uuid.time_hi_and_version);
    #else
      uuid_generate(uuid);
    #endif
  • clone(2) と名前が衝突したので、とりあえず sqclone へ変更
--- generated/64/vm/src/gcc3x-cointerp.c.orig
+++ generated/64/vm/src/gcc3x-cointerp.c
@@ -1068,7 +1068,7 @@
 extern sqInt classUnsafeAlien(void);
 static void clearLeakMapAndMapAccessibleFreeSpace(void);
 static sqInt NoDbgRegParms cloneInOldSpaceforPinning(sqInt objOop, sqInt forPinning);
-extern sqInt clone(sqInt objOop);
+extern sqInt sqclone(sqInt objOop);
 extern sqInt compactClassIndexOf(sqInt objOop);
 static sqInt NoDbgRegParms copyObjtoAddrstopAtsavedFirstFieldsindex(sqInt objOop, sqInt segAddr, sqInt endSeg, sqInt savedFirstFields, sqInt i);
 extern void countMarkedAndUnmarkdObjects(sqInt printFlags);
@@ -46834,7 +46834,7 @@
 
    /* SpurMemoryManager>>#clone: */
 sqInt
-clone(sqInt objOop)
+sqclone(sqInt objOop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt classIndex;
     sqInt classIndex1;
@@ -54408,14 +54408,14 @@
 
    clone1 = (((longAt(obj1)) & (classIndexMask())) == ClassMethodContextCompactIndex
        ? cloneContext(obj1)
-      : clone(obj1));
+       : sqclone(obj1));
    if (!(clone1)) {
        error("Not enough space to copy the objects in two-way become. This should have been detected before");
        return;
    }
    clone2 = (((longAt(obj2)) & (classIndexMask())) == ClassMethodContextCompactIndex
        ? cloneContext(obj2)
-      : clone(obj2));
+       : sqclone(obj2));
    if (!(clone2)) {
        error("Not enough space to copy the objects in two-way become. This should have been detected before");
        return;
@@ -75835,7 +75835,7 @@
        else {
            if ((GIV(argumentCount) == 0)
             || (!(((longAt(rcvr)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0))) {
-              newCopy = clone(rcvr);
+               newCopy = sqclone(rcvr);
            }
            else {
                newCopy = 0;
  • クラッシュレポートの NetBSD/amd64 対応(クラッシュさせたことがないので合っているか不明)
--- src/debugUnix.c.orig
+++ src/debugUnix.c
@@ -16,6 +16,12 @@
 
 #endif
 
+#if __NetBSD__
+
+#include <ucontext.h>
+
+#endif
+
 
 #ifdef HAVE_EXECINFO_H
 # include <execinfo.h>
@@ -250,6 +256,20 @@
            regs->mc_edi, regs->mc_edi, regs->mc_ebp, regs->mc_esp,
            regs->mc_eip);
    return regs->mc_eip;
+#elif __NetBSD__ && __x86_64__
+   __greg_t *regs = &uap->uc_mcontext.__gregs;
+   fprintf(output,
+           "\trax 0x%08llx rbx 0x%08llx rcx 0x%08llx rdx 0x%08llx\n"
+           "\trdi 0x%08llx rsi 0x%08llx rbp 0x%08llx rsp 0x%08llx\n"
+           "\tr8  0x%08llx r9  0x%08llx r10 0x%08llx r11 0x%08llx\n"
+           "\tr12 0x%08llx r13 0x%08llx r14 0x%08llx r15 0x%08llx\n"
+           "\trip 0x%08llx\n",
+           regs[_REG_RAX], regs[_REG_RBX], regs[_REG_RCX], regs[_REG_RDX],
+           regs[_REG_RDI], regs[_REG_RSI], regs[_REG_RBP], regs[_REG_RSP],
+           regs[_REG_R8 ], regs[_REG_R9 ], regs[_REG_R10], regs[_REG_R11],
+           regs[_REG_R12], regs[_REG_R13], regs[_REG_R14], regs[_REG_R15],
+           regs[_REG_RIP]);
+   return (void *)regs[_REG_RIP];
 #elif __linux__ && __x86_64__
    greg_t *regs = uap->uc_mcontext.gregs;
    fprintf(output,
@@ -409,6 +429,9 @@
 # elif __FreeBSD__ && __i386__
            void *fp = (void *)(uap ? uap->uc_mcontext.mc_ebp: 0);
            void *sp = (void *)(uap ? uap->uc_mcontext.mc_esp: 0);
+#elif __NetBSD__
+           void *fp = (void *)(uap ? _UC_MACHINE_FP(uap) : 0);
+           void *sp = (void *)(uap ? _UC_MACHINE_SP(uap) : 0);
 # elif __OpenBSD__
            void *fp = (void *)(uap ? uap->sc_rbp: 0);
            void *sp = (void *)(uap ? uap->sc_rsp: 0);
  • 起動スクリプトで LD_LIBRAY_PATHに @pkglibdir@ (後で /usr/pkg/lib に置換)を追加
--- packaging/linux/bin/launch.sh.in.orig
+++ packaging/linux/bin/launch.sh.in
@@ -18,8 +18,8 @@
 *) PLUGINS="`pwd`/$BIN"
 esac
 
-if [ $(uname -s) = "OpenBSD" ]; then
-  LD_LIBRARY_PATH="$PLUGINS:${LD_LIBRARY_PATH}" exec $GDB "$BIN/@VM_EXECUTABLE_NAME@" "$@"
+if [ $(uname -s) = "OpenBSD" -o $(uname -s) = "NetBSD" ]; then
+  LD_LIBRARY_PATH="$PLUGINS:@pkglibdir@:${LD_LIBRARY_PATH}" exec $GDB "$BIN/@VM_EXECUTABLE_NAME@" "$@"
 fi
 
 # On some linuxes there multiple versions of the C library.  If the image uses

cmake option

  • -DFLAVOUR=CoInterpreter: デフォルト値と同じだけどJenkinsfileが指定してたので。
  • -DALWAYS_INTERACTIVE=1: 非headlessなVMが必要な場合に指定する。これもJenkinsfileで指定されていたので。
  • -DGENERATE_SOURCES=OFF: ソースの自動生成を行わなくする。
  • -DPHARO_BIN_LOCATION=${PREFIX}/lib/pharo 起動スクリプトがここで指定されたバイナリを実行する。

after build

build/vm/* がバイナリとライブラリ、 build/packaging/linux/bin/pharo が起動スクリプトなので適当に回収する。

なお build/vm/pharoJITで動く関係か paxctl -m で PaX MPROTECT を解除しておく必要がる。

NetBSDから Brother DCP-J963N で印刷する

家で使用している Brother DCP-J963N はドライバのソースが非公開で gimp-printのようなオープンなドライバも無かったので、印刷する時は毎回Windowsを起動させていたのだが、どうやらAirPrintに対応しているのでCUPSから動かせるらしいと聞いて試してみたらうまくいったのでメモ。

参考文献

qiita.com

Debian + CUPS + avahi で Brother DCP-J973N を動作させている例。最初はこちらの通りに進めてみたけど印刷時に「見つかりません」になってしまったのであきらめた。

blog.onodera.asia

NetBSD + CUPS + mdnsd で EPSON EW-M752T。実はこっちを見て mdnsd(8) の存在を知ったりする。

CUPSの起動

いつものpkgsrcからインストール。

  1. cd pkgsrc/print/cups して make package-install
  2. cp /usr/pkg/share/examples/rc.d/cups /etc/rc.d
  3. /etc/rc.conf に "cupsd=YES" を追加
  4. service cupsd start (/etc/rc.d/cupsd start と一緒だけど service(8) なるものがいつの間にか増えてたので使ってみた)

手元の環境だと cups-browsed は最終的に無くても認識できたけど、キャッシュが残っていた可能性もあるので本当に必要ないかどうかは不明。

mdnsdのインストール

  1. /etc/nsswitch.conf の "hosts:" の末尾に "mdnsd" を追加
  2. /etc/rc.conf に "mdnsd=YES" を追加
  3. service mdnsd start
  4. プリンタの電源を入れた状態で ippfind と入力して何か出たらOK(今回は ”ipp://BRW40B89A423C96.local:631/ipp/print” と出た)

この1.の nssswitch.conf の追加をしないとCUPSで名前の取得まではできるけども、印刷してみると「見つかりません」で印刷できないという状態になった。 それから net/avahi は無くても良いらしい。

CUPSの設定

  1. Firefoxで "http://localhost:631" にアクセス
  2. 「管理」 → 「新しいプリンターの検索」
  3. しばらく待つと「Brother DCP-J963N (Brother DCP-J963N)」という全く同じ項目が2つ出る
    • プロトコルが異なるようで、上が「dnssd://Brother%20DCP-J963N.ipp.tcp.local./?uuid=(略)」、下が「lpd://BRW40B89A423C96/BINARY_P1」だった
  4. どっちが良いのかわからなかったのでとりあえず上(dnssd)を選択して進める
  5. 名前とかもそのまま
  6. メーカーは「Generic → Generic IPP Everywhere Printer (en)」
  7. デフォルトオプションの設定は無変更で「デフォルトオプションの設定」ボタンを押して完了

テスト印刷

CUPSから「テストページの印刷」をやったら印刷はできたものの左右両端の線が出なかった(印刷可能範囲を越えたかな?)が、その辺は次に印刷が必要になったときに考えよう(ぉぃ

Raspberry Pi 2B(v1.1)でカメラを試す

NetBSDRaspberry Piのカメラ使えるのかなーと手元に余ってたRaspberry Pi 2B(v1.1)でちょっと試してみた。

カメラの撮影で使われる raspistill などはpkgsrcの misc/raspberrypi-userland で用意されているようなので、まずはこれをインストールする。microSDのスペックにも依存しそうだが、手持ちの環境でMAKE_JOBS=3でビルドさせると大体10時間くらいかかる模様。なおswapなしでMAKE_JOBS=5で走らせるとcmakeのところでメモリ不足になって死ぬので注意。

で、インストールまで行ってもそのままでは raspistill の実行に失敗する。色々調べたところ vcgencmd (これも misc/raspberrypi-userland に含まれている)でカメラの状態を確認できるらしいが、実行してみるとどうもカメラサポートが無効になっているとのこと。

armv7# vcgencmd get_camera
supported=0 detected=0

じゃあどうやってカメラサポート有効にするのかとまた色々探し回ったところ、 /boot/config.txt に以下の2行を追加すれば良いらしい。

gpu_mem=128
start_x=1

前者は名前からなんとなくわかるとして、後者のstart_x=1って何? と調べたら、通常の起動時では start.elf と fixup.dat を参照するところで start_x.elf と fixup_x.dat を参照させるようにするコマンドとのこと。なるほど、ところで/bootにそんなファイルないぞ?

ということで今度はファームのバイナリを探し回って、おそらくコイツのbootの下にあるやつだろうと見当をつける。念のため start.elf などと同じリビジョン(今回は0c01dbefba4)をチェックアウトして start_x.elf と fixup_x.dat を/boot配下へコピー。リビジョンは src/external/broadcom/rpi-firmware/dist/start.elf のログを参照。

github.com

こんな作業が必要なあたり「……もしかして誰もカメラ動かした人いないんじゃね?」みたいな予感がしてくる。とりあえず見なかったことにしてファイルを/bootにコピーし、/boot/config.txt を書き換えたら再起動して再びvcgencmdでカメラ状態をチェック。

armv7# vcgencmd get_camera
supported=1 detected=1

無事にサポートOKになったし検出もできてる。では準備も整ったのでいよいよ raspistill を実行。

armv7# raspistill -o hoge.jpg

[ 122.1222268] uvm_fault(0x80b30a08, 6c533000, 2) -> e
[ 122.1222268] Fatal kernel mode data abort: 'Translation Fault (S)'
[ 122.1329515] trapframe: 0xb8e15de0
[ 122.1329515] FSR=00002805, FAR=6c533c80, spsr=00030013
[ 122.1426852] r0 =6c533c80, r1 =00000380, r2 =00000040, r3 =00000010
[ 122.1426852] r4 =80abb480, r5 =6c533c90, r6 =00000370, r7 =3395fc90
[ 122.1571841] r8 =913df940, r9 =00000370, r10=00000002, r11=b8e15e64
[ 122.1633485] r12=0000003f, ssp=b8e15e30, slr=8009a92c, pc =80097290

Stopped in pid 0.206 (system) at        netbsd:armv7_dcache_inv_range+0x28:
mcr     p15, 0, r0, c7, c6, 1
db{0}>

カーネル落ちた…… (´・ω・`)

RaspberryPi4 + ZFS で bonnie++ ベンチ

最初に結論:

  • NetBSDZFSは少なくともベンチマークを回せる程度の安定性はある
  • さすがに raidframe RAID1 と比較すると速度もCPU負荷も分が悪い
  • そもそも測定方法もいいかげんなのでぶっちゃけ話のネタ以上の意味はない

Raspberry Pi 4 と USB HDD 2台で raidframe による RAID1 と、最近になって更新された ZFS で mirror を組んだときのベンチマークを測ってみた。比較用に1台の場合も。

  • Raspberry Piは小型のヒートシンクを着けただけなので、測定中のどこかの段階で発熱によるクロックダウンが起きていると思われる。
  • コマンドは "bonnie++ -d <mount先> -b -u root"。
  • 測定が早すぎると "+++++" という結果になる。解決には例えば "-n 256:1024:1024:16" のようにオプションで調整するように紹介しているところが多いが、実際に試したら一日経っても終わらなかったので諦めた。
  • パーティションはGPTで作成。1台のとRAID1はどちらもUFS2+log。
  • USB-HDD変換はAOTECH ADK-HDCASE25BKA千石電商2号店(本店の右)でワゴン売りしてたもの。最近は見かけなくなった電源供給用のUSBプラグが生えており、Raspebrry Piで不安だった電源供給能力を回避できて実に都合が良かったりする。
  • HDDは東芝 MQ04ABF100。なんかバッファー容量でけぇな?と思っていたが、おそらくSMR(シングル磁気記憶方式)による書き込み性能悪化をフォローするためなんじゃないかという気がする。つまりベンチマークのような非現実的な書き込み負荷をかけるものとすこぶる相性が悪い。
singleraidrame RAID1ZFS mirror
Sequencial OutputPer Characterspeed 17 K/sec23 K/sec7 K/sec
CPU 99 %99 %99 %
Latency 527 ms360 ms1,161 ms
Blockspeed 44,554 K/sec47,822 K/sec39,870 K/sec
CPU 93 %92 %89 %
Latency 3,286 ms1,991 ms57,757 us
Rewritespeed 17,823 K/sec13,193 K/sec27,813 K/sec
CPU 70 %44 %83 %
Latency 3,337 ms7,757 ms872 ms
Sequencial InputPer Characterspeed 149 K/sec132 K/sec21 K/sec
CPU 96 %85 %99 %
Latency 810 ms3,408 ms469 ms
Blockspeed 96,631 K/sec88,545 K/sec87,687 K/sec
CPU 69 %66 %95 %
Latency 182 ms185 ms158 ms
Random Seeksspeed 123.2 /sec121.4 /sec99.4 /sec
CPU 22 %22 %21 %
Latency 348 ms486 ms550 ms
Sequencial CreateCreatespeed 2 /sec296 /sec62 /sec
CPU 0 %57 %4 %
Latency 596 ms43,634 us201 ms
Readspeed +++++ /sec+++++ /sec9,824 /sec
CPU +++ %+++ %98 %
Latency 84 us81 us16,000 us
Deletespeed 2 /sec784 /sec56 /sec
CPU 0 %21 %5 %
Latency 640 ms22,506 us300 ms
Random CreateCreatespeed 35 /sec295 /sec61 /sec
CPU 8 %56 %4 %
Latency 491 ms49,918 us285 ms
Readspeed +++++ /sec+++++ /sec10,041 /sec
CPU +++ %+++ %97 %
Latency 51 us72 us14,300 us
Deletespeed 37 /sec525 /sec46 /sec
CPU 5 %46 %4 %
Latency 279 ms71,794 us329 ms

RaspberryPi4にNetBSD/aarch64を試す (2)

昨日動かねーって書いたら早速情報を頂きました。ありがとうございます。

ということで rpi4-acpi.tgzをFATパーティション(うちの環境だと/dev/sd1e)に展開。てっきり中身はカーネルイメージかと思っていたんだけど、中身はこれだけだった。

  • overlays/miniuart-bt.btbo
  • RPI_EFI.fd
  • bcm2711-rpi-4-b.dtb
  • config.txt

これカーネルイメージだったらuserlandも同じバージョンのものを用意しないとなー、と思っていたんだけども、どうやらそのままで良さそうなので昨日ダウンロードしてきた9.99.46の上にぶちまけて電源投入。…あれカーネル起動までの挙動が違う?と思ったらUEFIかなこれ? そして無事にmicroSDを/dev/ld0で認識(ついでにUSBも)してログインまで到達。わーい。

>> NetBSD/evbarm efiboot (arm64), Revision 1.13 (Mon Feb 10 03:23:29 UTC 2020)
Press return to boot now, any other key for boot prompt
booting netbsd - starting in 0 seconds.
6200256+2685688+3049488+1514744 [587306+732024+515925]=0x101b010
[   1.0000000] Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
[   1.0000000]     2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
[   1.0000000]     2018, 2019, 2020 The NetBSD Foundation, Inc.  All rights reserved.
[   1.0000000] Copyright (c) 1982, 1986, 1989, 1991, 1993
[   1.0000000]     The Regents of the University of California.  All rights reserved.

[   1.0000000] NetBSD 9.99.46 (GENERIC64) #0: Mon Feb 10 03:23:29 UTC 2020
[   1.0000000]  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/GENERIC64
[   1.0000000] total memory = 3932 MB
[   1.0000000] avail memory = 3799 MB
[   1.0000000] pool redzone disabled for 'buf4k'
[   1.0000000] pool redzone disabled for 'buf64k'
[   1.0000000] armfdt0 (root)
[   1.0000000] simplebus0 at armfdt0: Sony UK Raspberry Pi 4 Model B
[   1.0000000] simplebus1 at simplebus0
[   1.0000000] acpifdt0 at simplebus0
[   1.0000000] acpifdt0: using EFI runtime services for RTC
[   1.0000000] ACPI: RSDP 0x0000000037320014 000024 (v02 MCRSFT)
[   1.0000000] ACPI: XSDT 0x00000000373100E8 00005C (v01 MCRSFT RPI4EDK2 02000820      01000013)
[   1.0000000] ACPI: FACP 0x0000000037260000 00010C (v05 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: DSDT 0x0000000037210000 001788 (v05 MSFT   EDK2     00000002 INTL 20181213)
[   1.0000000] ACPI: CSRT 0x0000000037280000 000169 (v00 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: DBG2 0x0000000037270000 00005C (v00 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: GTDT 0x0000000037250000 000060 (v02 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: APIC 0x0000000037240000 000174 (v03 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: MCFG 0x0000000037230000 00003C (v01 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: SPCR 0x0000000037220000 000050 (v02 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: 1 ACPI AML tables successfully acquired and loaded
[   1.0000000] acpi0 at acpifdt0: Intel ACPICA 20191213
[   1.0000000] cpu0 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu0: package 0, core 0, smt 0
[   1.0000000] cpu0: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.0000000] cpu0: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.0000000] cpu0: Dcache line 64, Icache line 64
[   1.0000000] cpu0: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.0000000] cpu0: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.0000000] cpu0: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.0000000] cpu0: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.0000000] cpu0: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.0000000] cpu1 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu1: package 0, core 1, smt 0
[   1.0000000] cpu2 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu2: package 0, core 2, smt 0
[   1.0000000] cpu3 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu3: package 0, core 3, smt 0
[   1.0000000] gic0 at acpi0: GIC
[   1.0000000] armgic0 at gic0: Generic Interrupt Controller, 256 sources (247 valid)
[   1.0000000] armgic0: 16 Priorities, 224 SPIs, 7 PPIs, 16 SGIs
[   1.0000000] gtmr0 at acpi0: irq 27
[   1.0000000] armgtmr0 at gtmr0: Generic Timer (54000 kHz, virtual)
[   1.0000070] PEPD (BCM2854) at acpi0 not configured
[   1.0000070] xhci0 at acpi0 (XHC0, 11063483-0): mem 0x600000000-0x600000fff irq 175
[   1.0000070] usb0 at xhci0: USB revision 3.0
[   1.0000070] usb1 at xhci0: USB revision 2.0
[   1.0000070] USB0 (BCM2848) at acpi0 not configured
[   1.0000070] bcmmbox0 at acpi0 (RPIQ, BCM2849-0): mem 0xfe00b880-0xfe00b8a3 irq 65
[   1.0000070] vcmbox0 at bcmmbox0
[   1.0000070] VCIQ (BCM2835) at acpi0 not configured
[   1.0000070] VCSM (BCM2856) at acpi0 not configured
[   1.0000070] GPI0 (BCM2845) at acpi0 not configured
[   1.0000070] I2C1 (BCM2841) at acpi0 not configured
[   1.0000070] I2C2 (BCM2841) at acpi0 not configured
[   1.0000070] SPI0 (BCM2838) at acpi0 not configured
[   1.0000070] SPI1 (BCM2839) at acpi0 not configured
[   1.0000070] plcom0 at acpi0 (URT0, BCM2837-4): mem 0xfe201000-0xfe201fff irq 153
[   1.0000070] plcom0: txfifo disabled
[   1.0000070] plcom0: console
[   1.0000070] URTM (BCM2836) at acpi0 not configured
[   1.0000070] BTH0 (BCM2EA6) at acpi0 not configured
[   1.0000070] RHPX (MSFT8000) at acpi0 not configured
[   1.0000070] sdhc0 at acpi0 (SDC1, BCM2847-0): mem 0xfe300000-0xfe3000ff irq 158
[   1.0000070] SDC2 (BCM2855) at acpi0 not configured
[   1.0000070] sdhc0: SDHC 3.0, rev 153, PIO, 250000 kHz, HS 3.3V, re-tuning mode 1, 1024 byte blocks
[   1.0000070] sdmmc0 at sdhc0 slot 0
[   1.0000070] cpu1: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.0000070] cpu1: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.1425640] cpu1: Dcache line 64, Icache line 64
[   1.1425640] cpu1: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.1525598] cpu1: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.1625609] cpu1: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.1725606] cpu1: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.1725606] cpu1: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.1925616] cpu3: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.1925616] cpu3: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.2025633] cpu3: Dcache line 64, Icache line 64
[   1.2025633] cpu3: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.2125629] cpu3: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.2225636] cpu3: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.2325636] cpu3: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.2325636] cpu3: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.2525648] cpu2: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.2525648] cpu2: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.2625663] cpu2: Dcache line 64, Icache line 64
[   1.2625663] cpu2: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.2725660] cpu2: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.2825670] cpu2: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.2925670] cpu2: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.3025680] cpu2: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.3125681] cpu0: PMU interrupting on irq 48
[   1.3125681] cpu1: PMU interrupting on irq 49
[   1.3125681] cpu2: PMU interrupting on irq 50
[   1.3125681] cpu3: PMU interrupting on irq 51
[   1.3125681] uhub0 at usb0: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 3.00/1.00, addr 0
[   1.3398059] uhub1 at usb1: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 0
[   1.4898097] sdmmc0: SD card status: 4-bit, C10, U1, A1
[   1.4998097] ld0 at sdmmc0: <0x02:0x544d:SA32G:0x50:0x28c11dbe:0x12c>
[   1.4998097] ld0: 29544 MB, 7503 cyl, 128 head, 63 sec, 512 bytes/sect x 60506112 sectors
[   1.5163645] ld0: 4-bit width, High-Speed/SDR25, 50.000 MHz
[   2.9711459] uhub2 at uhub1 port 1: vendor 2109 (0x2109) USB2.0 Hub (0x3431), class 9/0, rev 2.10/4.20, addr 1
[   2.9826380] uhub2: single transaction translator
[   3.3211594] boot device: ld0
[   3.3211594] root on ld0a dumps on ld0b
[   3.3311597] root file system type: ffs
[   3.3411609] kern.module.path=/stand/evbarm/9.99.46/modules
[   3.3411609] WARNING: clock lost 40 days
[   3.3531083] WARNING: using filesystem time
[   3.3571838] WARNING: CHECK AND RESET THE DATE!
Mon Feb 10 07:48:25 UTC 2020
Starting root file system check:
/dev/rld0a: file system is clean; not checking
fdisk: Cannot determine the number of heads
Not resizing /: already correct size
Starting file system checks:
/dev/rld0e: 124 files, 54282 free (54282 clusters)
random_seed: /var/db/entropy-file: Not present
Setting tty flags.
Setting sysctl variables:
ddb.onpanic: 1 -> 0
Starting network.
Hostname: arm64
IPv6 mode: host
Configuring network interfaces:.
Adding interface aliases:.
Waiting for DAD to complete for statically configured addresses...
Starting dhcpcd.
no valid interfaces found
Starting mdnsd.
mDNSResponder: mDNSResponder (Engineering Build) starting
mDNSResponder: Unable to parse DNS server list. Unicast DNS-SD unavailable
mDNSResponder: mDNSPlatformSourceAddrForDest: connect 1.1.1.1 failed errno 49 (Can't assign requested address)
Building databases: dev, utmp, utmpx, services.
Starting syslogd.
Feb 10 07:48:30 arm64 mDNSResponder: mDNSPlatformSendUDP got error 49 (Can't assign requested address) sending packet to 224.0.0.251 on interface 127.0.0.11
Mounting all file systems...
Clearing temporary files.
Updating fontconfig cache: done.
Checking quotas: done.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting devpubd.
Starting local daemons:.
Updating motd.
Starting ntpd.
ssh-keygen: 1024 SHA256:JfZlqlKMsSSUEZM1LMQ3TWRWOfUqURaueAhu/FT0TGA root@arm64 (DSA)
ssh-keygen: 521 SHA256:td5L5p5hgp4kuBi4Oid7PoCf7WetoTCqxDU2RXr4rw8 root@arm64 (ECDSA)
ssh-keygen: 256 SHA256:/1qwo0nQT+1hbHa8QEC4VzvnqOWk2RiHIdPVOHwX/sk root@arm64 (ED25519)
Feb 10 07:49:00 arm64 syslogd[183]: last message repeated 4 times
ssh-keygen: 3072 SHA256:PA1KOUFEmnjGYwK4kM+JE/L4B21ZbMToeRa8c23A5es root@arm64 (RSA)
Starting sshd.
postfix: rebuilding /etc/mail/aliases (missing /etc/mail/aliases.db)
Starting postfix.
Starting inetd.
Starting cron.
Mon Feb 10 07:49:08 UTC 2020

NetBSD/evbarm (arm64) (constty)

login:

RaspberryPi4にNetBSD/aarch64を試す

  1. http://nycdn.netbsd.org/pub/NetBSD-daily/HEAD/latest/evbarm-aarch64/binary/gzimg/arm64.img.gz をダウンロード
  2. gzcat arm64.img.gz | sudo dd of=/dev/sd1d bs=32kmicroSDカードに書き込み
  3. microSDカードを挿す
  4. 6、8、10番ピンにUARTのGND、TX、RXを繋ぐ(CubieBoard2で使っているやつを拝借)
  5. USBコネクタを挿して電源投入

んで流れた起動メッセージがこれ。カーネルを読み込んで起動しているところまでは良いけども、どうもmicroSDである/dev/ld0が見えないらしい。

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

[   1.0000000] NetBSD 9.99.46 (GENERIC64) #0: Mon Feb 10 03:23:29 UTC 2020
[   1.0000000]  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/GENERIC64
[   1.0000000] total memory = 3941 MB
[   1.0000000] avail memory = 3807 MB
[   1.0000000] pool redzone disabled for 'buf4k'
[   1.0000000] pool redzone disabled for 'buf64k'
[   1.0000000] armfdt0 (root)
[   1.0000000] simplebus0 at armfdt0: Raspberry Pi 4 Model B Rev 1.2
[   1.0000000] simplebus1 at simplebus0
[   1.0000000] simplebus2 at simplebus0
[   1.0000000] cpus0 at simplebus0
[   1.0000000] simplebus3 at simplebus0
[   1.0000000] cpu0 at cpus0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu0: package 0, core 0, smt 0
[   1.0000000] cpu0: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.0000000] cpu0: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.0000000] cpu0: Dcache line 64, Icache line 64
[   1.0000000] cpu0: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.0000000] cpu0: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.0000000] cpu0: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unifiede
[   1.0000000] cpu0: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.0000000] cpu0: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32xd
[   1.0000000] cpu1 at cpus0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu1: package 0, core 1, smt 0
[   1.0000000] cpu2 at cpus0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu2: package 0, core 2, smt 0
[   1.0000000] cpu3 at cpus0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu3: package 0, core 3, smt 0
[   1.0000000] simplebus4 at simplebus1
[   1.0000000] gic0 at simplebus1: GIC
[   1.0000000] armgic0 at gic0: Generic Interrupt Controller, 256 sources (247 valid)
[   1.0000000] armgic0: 16 Priorities, 224 SPIs, 7 PPIs, 16 SGIs
[   1.0000000] fclock0 at simplebus2: 54000000 Hz fixed clock (osc)
[   1.0000000] bcmcprman0 at simplebus1: BCM283x Clock Controller
[   1.0000000] bcmaux0 at simplebus1
[   1.0000000] fclock1 at simplebus2: 480000000 Hz fixed clock (otg)
[   1.0000000] bcmicu0 at simplebus1: Multiprocessor
[   1.0000000] gtmr0 at simplebus0: Generic Timer
[   1.0000000] gtmr0: interrupting on GIC irq 27
[   1.0000000] armgtmr0 at gtmr0: Generic Timer (54000 kHz, virtual)
[   1.0000030] gregulator0 at simplebus0: vdd-sd-io
[   1.0000030] gregulator0: cannot get pin 0
[   1.0000030] plcom0 at simplebus1: ARM PL011 UART
[   1.0000030] plcom0: txfifo disabled
[   1.0000030] plcom0: interrupting on GIC irq 153
[   1.0000030] com0 at simplebus1: BCM AUX UART, working fifo
[   1.0000030] com0: console
[   1.0000030] com0: interrupting on GIC irq 125
[   1.0000030] mmcpwrseq0 at simplebus0: couldn't get reset GPIOs
[   1.0000030] /soc/dsi@7e209000 at simplebus1 not configured
[   1.0000030] bcmgpio0 at simplebus1: GPIO controller 2838
[   1.0000030] bcmgpio0: pins 0..31 interrupting on GIC irq 145
[   1.0000030] bcmgpio0: pins 32..58 interrupting on GIC irq 146
[   1.0000030] gpio0 at bcmgpio0: 58 pins
[   1.0000030] /soc/firmware/gpio at simplebus4 not configured
[   1.0000030] /soc/power at simplebus1 not configured
[   1.0000030] /phy at simplebus0 not configured
[   1.0000030] bcmmbox0 at simplebus1: VC mailbox
[   1.0000030] bcmmbox0: interrupting on GIC irq 65
[   1.0000030] vcmbox0 at bcmmbox0
[   1.0000030] /scb/ethernet@7d580000 at simplebus3 not configured
[   1.0000030] /soc/timer@7e003000 at simplebus1 not configured
[   1.0000030] /soc/txp@7e004000 at simplebus1 not configured
[   1.0000030] bsciic0 at simplebus1: Broadcom Serial Controller
[   1.0000030] bsciic0: interrupting on GIC irq 149
[   1.0000030] iic0 at bsciic0: I2C bus
[   1.0000030] sdhc0 at simplebus1: SDHC controller
[   1.0000030] sdhc0: interrupting on GIC irq 158
[   1.0000030] bsciic1 at simplebus1: Broadcom Serial Controller
[   1.0000030] bsciic1: interrupting on GIC irq 149
[   1.0000030] iic1 at bsciic1: I2C bus
[   1.0000030] /soc/vec@7e806000 at simplebus1 not configured
[   1.0000030] dwctwo0 at simplebus1: USB controller
[   1.0000030] dwctwo0: interrupting on GIC irq 105
[   1.0000030] bcmdmac0 at simplebus1: DMA0 DMA2 DMA4 DMA5 DMA6 DMA7
[   1.0000030] bcmpmwdog0 at simplebus1: Power management, Reset and Watchdog controller
[   1.0000030] /soc/pwm@7e20c800 at simplebus1 not configured
[   1.0000030] /soc/emmc2@7e340000 at simplebus1 not configured
[   1.0000030] /soc/mailbox@7e00b840 at simplebus1 not configured
[   1.0000030] /chosen at simplebus0 not configured
[   1.0000030] armpmu0 at simplebus0: Performance Monitor Unit
[   1.0000030] gpioleds0 at simplebus0: ACT
[   1.0000030] cpu2: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.0000030] cpu2: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.2828385] cpu2: Dcache line 64, Icache line 64
[   1.2828385] cpu2: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.2928308] cpu2: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.3028318] cpu2: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unifiede
[   1.3128316] cpu2: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.3128316] cpu2: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32xd
[   1.3328329] cpu1: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.3328329] cpu1: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.3428347] cpu1: Dcache line 64, Icache line 64
[   1.3528339] cpu1: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.3528339] cpu1: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.3628348] cpu1: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unifiede
[   1.3728348] cpu1: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.3828371] cpu1: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32xd
[   1.3928360] cpu3: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.3928360] cpu3: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.4028375] cpu3: Dcache line 64, Icache line 64
[   1.4128372] cpu3: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.4128372] cpu3: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.4228382] cpu3: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unifiede
[   1.4328382] cpu3: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.4428392] cpu3: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32xd
[   1.4528393] sdhc0: SDHC 3.0, rev 153, PIO, 250000 kHz, HS 3.3V, re-tuning mode 1, 1024 bytes
[   1.4628412] sdmmc0 at sdhc0 slot 0
[   1.4628412] usb0 at dwctwo0: USB revision 2.0
[   1.4828431] armpmu0: interrupting on GIC irq 48
[   1.4828431] armpmu0: interrupting on GIC irq 49
[   1.4928429] armpmu0: interrupting on GIC irq 50
[   1.5028433] armpmu0: interrupting on GIC irq 51
[   1.5128434] uhub0 at usb0: NetBSD (0000) DWC2 root hub (0000), class 9/0, rev 2.00/1.00, ad1
[   1.6428481] sdmmc0: 4-bit width, 50.000 MHz
[   1.6428481] sdmmc0: SDIO function
[   1.6528478] bwfm0 at sdmmc0 function 1
[   1.6628529] (manufacturer 0x2d0, product 0xa9a6) at sdmmc0 function 2 not configured
[   1.6628529] (manufacturer 0x2d0, product 0xa9a6, standard function interface code 0x2) at sd
[   2.2328699] WARNING: 2 errors while detecting hardware; check system log.
[   2.2439641] boot device: <unknown>
[   2.2439641] unknown device major 0xffffffffffffffff
[   2.2439641] root device:

NYC*BUG dmesgd を見る限りだと去年の9月と12月で動作報告があるので、なにかしら設定を間違えたか単にこの後で何かバグったのか。

Date From (nickname) *BSD (derived) Description
2019-09-01 mlelstv NetBSD RPI4 4GB
2019-12-30 jmcneill NetBSD NetBSD/evbarm 9.99.31 on Raspberry Pi 4 Model B (4GB, ACPI)

dmesgだけ見るとリビジョン表記が全員バラバラなのは気付いたけど流石にそこまで影響しないよなぁ…おそらく技適対応やUSBの給電回りの修正で1.2になったんだと思うし。

Date
2019-09-01 simplebus0 at armfdt0: Raspberry Pi 4 Model B Rev 1.1
2019-12-30 simplebus0 at armfdt0: Sony UK Raspberry Pi 4 Model B
今回 simplebus0 at armfdt0: Raspberry Pi 4 Model B Rev 1.2

パンクしてた

作業に飽きたのでちょっとBromptonでひとっぱしり出掛けようかと思ったら後輪がパンクしてたらしく空気がすっからかんになってた。普通の自転車ならともかくタイヤが小さいしギアやら何やらがあって作業しにくいので「じゃあいっそ後輪引き抜くかー」と思いつきで行動。

 

f:id:steleto:20200119153059j:plain
まず写真左の変速レバーからのワイヤとチェーン部分を繋いでいる棒状の部品を回して外す。外れたら右のチェーン部分も回して引き抜く。

 

f:id:steleto:20200119153208j:plain

ナットを外す。ワッシャーも一緒に取れるので無くさないよう注意。

 

f:id:steleto:20200119153330j:plain

チェーンテンショナーをうまいこと引っぱって外す。テンショナーはそこそこ強めのバネがあるので気をつける。

 

f:id:steleto:20200119153416j:plain

ナットを緩め、奥にある爪のパーツを手前に引く(完全に外さなくても良い)。両側とも爪を外したら車輪を引き抜く。ちなみに作業中は気付かなかったけども、この爪の部品はどうも上下があるらしく「TOP」と刻印されている側を上にしないといけない。

 

f:id:steleto:20200119153959j:plain

後輪が外せたら空気を入れるところのネジを外せばチューブだけ取れる。

 

チューブが取れたら後は空気が漏れているところを探してパッチを当てるだけ。大きめの穴なら音で分かるし、分からなければ水桶に突っ込めば気泡でわかる。さて今回は…あ、あった。

 

f:id:steleto:20200119154550j:plain

そ こ か よ 。

流石にここはパッチ当てられないから交換するしかないな…