ジャンル不定の日記です。

Orange pi R1でArch Linux起動した

前の記事に書いたが、朝原因わかったので昨日断念したOrange pi R1でArch Linuxを再トライ。

同じSD使ったんで、u-boot本体はパーティションの外に入ってるんで、フォーマットしてrootfs展開してboot.scrだけ更新。
rootfsはext4にした。
自ビルドカーネルのmenuconfigみたらext4しかチェックされてなかったので、とりあえずext4が無難と判断。
最終的にはフラッシュメモリ向きのFSにしたいかな。

boot.cmd
setenv bootargs root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200
load mmc 0:1 ${kernel_addr_r} /boot/zImage
load mmc 0:1 ${fdt_addr_r} /boot/${fdtfile}
if load mmc 0:1 ${ramdisk_addr_r} /boot/initramfs.img;then
    bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r};
else
    bootz ${kernel_addr_r} - ${fdt_addr_r};
fi;
こんな感じにした。
/boot/initramfs.img がない場合はinitramfsを使わない。ある場合は使う。あってもなくても起動した。
注意点はカーネルパラメータに rw つけないとエラー多発でログイン不能になる。
あと、ArmbianはramdiskがuImageだったからと思うが、Archの場合は bootz にramdiskを渡すときにサイズも入れる必要があった。入れないとboot失敗する。

初期パスワードは、
root(root) と一般ユーザのalarm(alarm)

zImageを昨日作った自ビルドのものに差し替えても起動した。
自ビルドカーネルは5.5.0-rc5になってたけど、stableが5.4.11なのね。stableにしとくべきだった。

自ビルドしたROMで起動しない原因わかった!

昨日からOrange pi R1 を自ビルドしたkernelとu-bootで起動しようとしてできなかったが、
Arch Linuxだとどうにもならんので、起動するArmbianのイメージを書き換えてみた。

boot.cmd
setenv bootargs root=/dev/mmcblk0p1 rootwait rootfstype=ext4 console=ttyS0,115200
load mmc 0:1 ${kernel_addr_r} /boot/zImage
load mmc 0:1 ${fdt_addr_r} /boot/${fdtfile}
load mmc 0:1 ${ramdisk_addr_r} /boot/uInitrd
bootz ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r};
これで /boot/boot.scr を作成した。
.dtbファイルの変わるので自ビルドしたやつを配置した。
結果、起動した。

次に自ビルドしたu-boot本体をddで書き込んだ。
Starting kernel ...

Uncompressing Linux... done, booting the kernel.
initramfsの形式が違うからと思うが1行増えたが止まった。

どうもu-boot本体がおかしいみたい。

u-bootのバージョンを確認したが、
自ビルド: U-Boot 2020.01-00473-g88366b96ee (Jan 12 2020 - 16:07:49 +0900) Allwinner Technology
Armbian: U-Boot 2019.10-armbian (Jan 05 2020 - 10:27:36 +0100) Allwinner Technology

https://linux-sunxi.org/U-Boot
にも v2019.10 を使うように書いてあるが、Armbianのバージョンと同じ。

$ git checkout v2019.10
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- orangepi_r1_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
でビルドしなおしてみた。

結果、起動した!

ArmbianでOrange pi R1をルーター化1

メインPCが復活(再インストール)したんで、Orange pi R1のルーター化に挑戦した。
miZyは読み込み専用になっちゃうし、OpenWRTはwifiデバイスを使うのが難しそうだったし、どうせSDになるならArmbianでいいや。
というわけで、とりあえずArmbianを使ってルーター化に挑戦することにした。

Orange pi R1は有線インターフェイスが2つあるが、Armbianだとeth0とudevが命名したデバイスだったが、eth0とeth1にしたい。
公式の製品ページ見ると、eth1はボードのシリアルピンの側にあるmacアドレスの書いたシールが貼ってある方みたい。
こっちがRTL8152Bでeth0の方がCPU内臓の。
/etc/udev/rules.d/10-network.rulesを
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="macアドレス", NAME="eth1"
で設定したらeth1になる。
/etc/udev/rules.d/以下にあればファイル名はどうでもいい。

UTCになってたからタイムゾーンの設定をしようとしたのだが、armbian-configというArmbianの設定ツールがあるらしいので入れて使ってみた。
そしたら、
Network > Hotspot なる項目が!
これやったらアクセスポイント化に使えるhostapdを設定してくれた。
のだが、ほとんど手動で書き換える必要があったから微妙かな・・・
armbian-configは最初シリアルコンソールで使ったが、画面崩れてまともに操作できないのでsshで接続して使ったほうが良かった。

armbian-configで設定したらできた?
hostapdの設定ファイルは /etc/hostapd.conf にあった。
country_code=JP
に変更したのと、wpa_passphraseにパスフレーズを変更した。
最初USになってたが、JPじゃないと違法電波が飛ぶかもしれないらしい。

armbian-config でHotspot設定をしたら wlan0 にIPアドレスが設定されてたが、
設定ファイルは /etc/network/interfaces.d/armbian.ap.nat みたい。
172.からのクラスB?アドレスが設定されてたが、192.168からの見慣れたアドレスにしたいので変えた。
/etc/network/interfaces.d/armbian.ap.nat
# armbian NAT hostapd
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
プライベートアドレスの仕様忘れてたんで調べたが、
ネットワーク範囲の先頭と末尾のアドレスは割り当てられないので、192.168.1.0-192.168.1.255のネットワークの場合192.168.1.0と192.168.1.255はアドレスに使えないので192.168.1.1になる。
192.168.0.0-192.168.0.255のネットワークにすることも考えたが、ルーターを2台置くような感じにすると192.168.0.0-192.168.255.255の範囲で上位ネットワークを作ることになるので3桁目も0にしないほうが良さそう。

再起動したらwlan0のアドレスが予定通り192.168.1.1に変わってたが、起動ログで dnsmasq がエラー。
これは小規模なdnsサーバーとdhcpサーバーとして機能するサービスみたいで、ルーターにするのに丁度いいね。
設定ファイルは /etc/dnsmasq.conf にあった。
interface=wlan0
#listen-address=192.168.1.1
bind-interfaces
server=8.8.8.8
domain-needed
bogus-priv
dhcp-range=192.168.1.100,192.168.1.150,12h
listen-addressとdhcp-rangeが変更前の172.からのアドレスだったのでコケたぽい。
そして、iptablesを設定してから気づいたが、listen-addressは設定してるとNAT設定したあとにまた起動時にdnsmasq がエラー吐いた。
コメントアウトした。
DNS機能はなしでDHCPだけにすることはできないのかな?

iptablesの設定はかなりハマったが、
/etc/systemd/system/armbian-restore-iptables.service が起動時に /etc/iptables.ipv4.nat を読み込むみたい。
なので、iptablesをいじったあとは、
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
で保存されて再起動後も有効になるぽい。
調べてたら iptables-persistent を入れて/etc/iptables/rules.v4 に保存するみたいな情報が散乱してたが、
iptables-save は最初から入ってて、/etc/iptables/rules.v4は起動時に読み込まれない。

iptablesの設定は、
$ sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
1行だけ。
設定してから上のコマンドで保存すれば再起動後も有効。
-t nat がnatテーブルの指定。
-A POSTROUTING がPOSTROUTINGチェインに追加。
-s 192.168.1.0/24 が送信元アドレス。
-o eth0が転送先インターフェイス。
-j MASQUERADE が処理内容。
で、Androidスマホで確認したが192.168.1.0/24の範囲からの通信をグローバルに出れるインターフェイスに転送された。

メインPCぶっ壊れた

Orange pi R1のSDカードいじってたら、この前は起動したArmbianのイメージが起動できなかった。
SDぶっ壊れたのかと思って3枚使ってみたが全部ダメ。
で、メインPC再起動してみたらメインPCのArch Linuxまで起動しない・・・

復旧しようとしてサブPC用のArch LinuxをインストールしてあるUSBメモリを装着したが、パーティション分けてたからデバイス番号変わっちゃってbootできないね・・・

インストール用のUSBメモリを作成しようとしてUbuntuが入ったノートPCでやってみたが、ddしても反映しない・・・

Windowsで作成する方法見てRufusでやってみたらできたが、ddモードとやらにする方法がわからず苦戦した。
そのままスタートして、syslinuxがどうとか言われてダウンロードしたあとにDDモードの選択画面が出るのね。


そこまででかなり時間かかったが、インストールにかつてないほどハマった。
とりあえず、前の環境はmountできたんで、バックアップ用のHDDにhomeとetcをコピーしといた。
復旧できないような最悪の事態は避けられた。
データは救出できたし、起動時にやたら遅かったりしたんで再インストールしようかと思ったが、とりあえずfsck.btrfsやってみたがエラーなし。
再起動してもやっぱエラーいっぱいで起動しない。
というわけで、再インストール方針に決定。

以前の環境はsdaをパーティション作らずにbtrfsにしてgrubでbootしてたが、それが今回はどうやってもgrub-installできなかった。
BIOS boot partition作っても無理で、結局sda1をext2で/bootにしてsda2をbtrfsにした。

そして起動したが、
starting version xxx
の直後で止まった。
問題がbtrfsなのか確認するためext4でもう一度やってみたが同じ。

前はpacstrapでbaseだけ入れればよかった気がするが、linuxとlinux-firmwareも入れなきゃだめなのね。
インストールガイド見てlinuxは入れる必要があると判断したがlinux-firmwareも必須なのね。

キーボードレイアウトの設定とかもかなり苦戦してブラウザで検索できるようになるまでに7時間くらいかかった。
疲れたから続きは寝てからやる。

R1用のopenWRTを試した

SDブートのOrange pi R1用openWRTを試した。

openWRT公式のリリース版18.06.5が見つからなくて18.06.2入れたらwifiモジュールがなかった。

openWRT公式ではなくOrange pi公式のopenWRTを試してみたらwifiはデバイスは最初から入ってた。
だが、CUIで設定しようとしてもapモードしか情報が出てこずわからなかった。
openWRTはルーター用OSだからwifiはアクセスポイントなんだね。

それで、有線LANもあるわけだからルーターに有線LANで接続してWebUIを見てみた。
がWebUIでのネットワーク設定に有線デバイスは表示されるがwifiはデバイスは表示されなかった。

WebUIにパッケージマネージャ機能があったんで見てたが、デバイスドライバなんかもあるが、
R1が搭載してるRealtek RTL8189FTVのドライバはなかった。
公式パッケージにないドライバだからWebUIに設定項目がないのか?と思った。

いろいろ調べてたが、openWRT公式の対応デバイスリスト見たらRTL8189FTVは18.06.5からサポート(ただし今はサポートしていない)的に書かれてた。
openWRT公式の18.06.5以降ならwifi対応?
ということで、snapshotにはR1用あったんで試してみて、スナップショットにはWebUIが無いみたいなんで追加で入れたが、接続できない。
sshも接続できないがpingは通る。
有線LAN2つのうち2番目のポートだけdhcpになっててルーターに接続できるようになってるが、これwanポートみたいだからファイアウォールかな?

snapshotだから問題な可能性も考慮して、
最初R1用のリリース版バイナリは18.06.2までしか見つからなくてリリース版の自ビルドとか考えたんだが、メニューにAllwinner H2+が無くてよくわからなかった。
色々時間費やしたが、見落としてたみたいでよく見ると18.06.5にもR1用があった!

というわけなんだが、
18.06.5も変わらずRTL8189FTVのドライバはついてなくてパッケージマネージャでも出てこなかった。

注文してたUSBシリアルケーブル届いた

注文してたUSBシリアルケーブル届いた。

というわけで早速Orange pi R1につないでみたんだが、
ググったらZeroのピンアサインばっか出てきてR1は出てこないんで、
Zeroが外からGND RxD TxDの順みたいなんで、Amazonのレビューにケーブルのピンアサインが黒はGNDで当然として緑がTxD白がRxDと書いてあったのでクロスで接続してみたが認識せず。
ケーブルのピンアサインが間違ってるのかと思って逆にしてみたがダメ。

かなり時間を費やしたが、
R1のピンアサインは内からGND RxD TxDの順だった・・・
というか、超ちっさくて見えなかったが、基板に印字してあるのね・・・

シリアル接続できたのだが、screenが文字化けして入力もできず。
代わりにminicomとpicocomも試したが、文字化け無しで入力もできたがフリーズする・・・
再起動したらscreenで問題なくなったがここでも時間を費やした・・・


そして、SDに入れておいたArmbianはすんなり起動してSPIフラッシュにmiZyを書き込もうとしたのだが、
Zeroで書き込んでる人はflashromというツールを使って/dev/spidev0.0に書き込んでたが、そんなデバイス無い!
$ cat /proc/mtd
dev:    size   erasesize  name
mtd0: 01000000 00010000 "spi0.0"
正しい場所は/proc/mtdに書いてあるらしい。

あと、Armbianはrootの初期パスワードが1234で、初回ログイン時にパスワード変更と一般ユーザーの作成が強制された。

で/dev/mtd0にflashromで書き込もうとしたのだが、このツールデバイスのチップ名書かないといけないらしく、参考にしたZeroでやってた人はMX25L1605にしてたが、これ2MBのチップ?なんか違う気が・・・

というわけで調べてたのだが、
mtd-utilsに入ってるflashcpというコマンドでも書き込めるらしい。
$ sudo flashcp -v 16M.bin /dev/mtd0
これで書き込めた。(miZyのイメージはファイル名長いんで16M.binに省略した)

そのあと調べてて見つけたが、
ブートイメージがない状態でOrange piを起動するとフラッシュモードになるようだったが、
sunxi-toolsに入ってるsunxi-felってコマンドで、
$ sudo sunxi-fel -p spiflash-write 0 *M.bin
みたいな感じでも母艦から書き込めた気配・・・
だが、ブートROMがあるとフラッシュモードにならないから初回限定だね。
てか、デバイスを操作して書き込むならddでできない?

やっとのことでmiZyを起動できたのだが、wifiが有効になってない。
miZyは起動した時点でrootログイン済み状態だった。

Orange pi R1に搭載されてるWifiモジュールはRealtek RTL8189FTVみたい。
探してみたら、
# ls /lib/modules/3.4.113-sun8i|grep 8189
8189es.ko
あった!
# modprobe 8189es.ko
でインターフェイス出てきた。

で、/etc/modules.dに8189esを追加して起動時に有効化・・・
しようとしたのだが、再起動したら変更が反映されてなかった。

どうもopenWRTは
# mount_root
しないと書き込めないとか見たんでやってみたがダメ。
いろいろ調べたりoverlay関連のpathを書き換えてみたりしたがダメ。

どうも、
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
rootfs                  125308         4    125304   0% /
/dev/root               125308         4    125304   0% /
devtmpfs                   512         0       512   0% /dev
tmp                     125308         4    125304   0% /mnt
/dev/ram0                 5120      5120         0 100% /rom
tmp-overlay             125308         4    125304   0% /overlay
overlayfs               125308         4    125304   0% /
tmpfs                   125308        48    125260   0% /tmp
tmpfs                      512         0       512   0% /dev
こんな感じなんだが、
/romが実体?な気がするがここは読み込み専用。
openWRTは/romに/overlayを重ねてて書き換えても戻せるようになってるらしい。
/overlayの方は普通は書き換えると反映するようなんだが、/romが5120kBなのに/overlayは125MBくらい。
overlayのサイズがオーバーしてると書き込めないとか見たんだが、それが原因?

ちょっとわかんない。

Orange Pi R1届いた

Orange Pi R1届いた。

で早速miZy試してみようと思った。
ググると、SPIへ書き込みしてる人はSDブートのOSからflashromというコマンドで書き込んでた。
なので、いったんSDにArmbianを入れて起動してからやろうとした。

LANケーブルでつないでSSHで操作してる人が多いような印象だったが、
元々手持ちのUSBシリアルケーブルを使うつもりだったので探したがなかなか見つからない。
USBに4pinのケーブルがついてるやつを発見したんで、これだ!
思ったのだが、このケーブル、オスピンが出てるのだが、orange piの端子もピンだからソケットじゃないとつながらない・・・
両メスのケーブルとか見つからなかったが、オスメスのケーブルは見つかったのでブレッドボードを介して接続することにした。
が、ケーブル挿しても何もデバイス出てこない・・・
長いこと使ってなかったし、ぶっ壊れてんのか?

かなり時間を費やしたが、諦めてAmazonでケーブル注文した。
150円くらいから売ってるが、急ぎなんでAmazon発送の312円のケーブルにした。

PCのUSBポートでも起動してるぽかったのでOTGで接続も試したが、OS入りのSDをつなぐと何もデバイス出てこない。
SDを入れずにPCとつなぐと、
$ lsusb
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 002: ID 03eb:3312 Atmel Corp. 4-Port Hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 07cc:0360 Carry Computer Eng., Co., Ltd Winter Ver1.3  
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 002: ID 1f3a:efe8 Onda (unverified) V972 tablet in flashing mode
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 248a:8366 Maxxter Wireless Optical Mouse ACT-MUSW-002
Bus 001 Device 004: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 002: ID 03eb:3312 Atmel Corp. 4-Port Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
何故かONDAのタブレットが出てきた。
OS入りのSDを入れた状態だと出ない。
SDに入れたOSを経由せずともLiveSuitでFlashできそうな感じ。
だが、LiveSuitは専用のイメージに変換しないと焼けない気配がしたので難易度高そうなのと、
焼いたところで結局シリアルケーブルが無いと操作できない。

元々持ってたケーブルは、
シリアル変換ケーブルじゃなくて ケース裏からピンヘッダーを取るケーブルとかだったかも・・・
とすればどっかにケーブルあるはずだが見つからない・・・

MySQLが起動しない

引き続きUbuntu 20.04LTSにアップしちゃったサーバーの調査だが、MySQLが起動してなかった。
これもapparmorかと思って調べてたがうまく行かなくて、mysqlのエラーログ見たら簡単にわかった。

クエリーキャッシュがなくなってるみたいで、/etc/mysql/my.cnfの
query_cache_limit      = 1M
query_cache_size        = 0
のとこコメントアウトしたら起動した。

bind9が起動しない

サーバーOSをUbuntu 16.04LTSから18.04LTSにしようとしたらリリース前の20.04LTSになってしまったわけだが、
bind9が起動しない。

というわけで調べたが、
$ systemctl status bind9.service
  bind9.service - BIND Domain Name Server
     Loaded: loaded (/lib/systemd/system/bind9.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2020-01-07 05:19:23 JST; 4s ago
       Docs: man:named(8)
    Process: 39403 ExecStart=/usr/sbin/named $OPTIONS (code=exited, status=1/FAILURE)

Jan 07 05:19:23 www12256ui named[39404]: listening on IPv4 interface eth0, 133.242.163.30#53
Jan 07 05:19:23 www12256ui named[39404]: listening on IPv4 interface eth1, 192.168.1.2#53
Jan 07 05:19:23 www12256ui named[39404]: generating session key for dynamic DNS
Jan 07 05:19:23 www12256ui named[39404]: sizing zone task pool based on 8 zones
Jan 07 05:19:23 www12256ui named[39404]: could not configure root hints from '/usr/share/dns/root.hints': permission denied
Jan 07 05:19:23 www12256ui named[39404]: loading configuration: permission denied
Jan 07 05:19:23 www12256ui named[39404]: exiting (due to fatal error)
Jan 07 05:19:23 www12256ui systemd[1]: bind9.service: Control process exited, code=exited, status=1/FAILURE
Jan 07 05:19:23 www12256ui systemd[1]: bind9.service: Failed with result 'exit-code'.
Jan 07 05:19:23 www12256ui systemd[1]: Failed to start BIND Domain Name Server.
赤文字にした箇所が怪しい。(実際のコンソールでも赤文字の箇所だが)

/var/log/syslog見ると
Jan 7 04:50:56 www12256ui named[11771]: could not configure root hints from '/usr/share/dns/root.hints': permission denied
Jan 7 04:50:56 www12256ui kernel: [ 737.835580] audit: type=1400 audit(1578340256.746:200): apparmor="DENIED" operation="open" profile="/usr/sbin/named" name="/usr/share/dns/root.hints" pid=11771 comm="named" requested_mask="r" denied_mask="r" fsuid=106 ouid=0

permission deniedだからとりあえずパーミッション確認したが、rootで644だった。
とりあえず666と600に変えてみたがダメ。

syslogのnamedが吐いてるエラー行の前後にカーネルが吐いてるログがあってapparmorとか書いてる。
apparmorって確かセキュリティ関連のやつだっけ?

というわけで調べてたが、bind9用の設定は/etc/apparmor.d/usr.sbin.namedの様だった。
これに、
/usr/share/dns/root.hints rw,
追加してみた。

apparmorとbind9を再起動したら無事起動した。

Ubuntu 16.04LTSを18.04LTSにアップグレードしようとしたのだが・・・

VPSを1台、Ubuntu 16.04LTSから18.04LTSにアップグレードしようとしたのだが、
なんか20.04LTSになってるwww

アップしようとしてるバージョンの表示してくれんと困るわ・・・
というか見落としたのか?
do-release-upgradeしようとしたら何故か-dオプションつけないとできないからおかしいと思ったわ・・・

まあ今回のサーバーはサービス運営してないやつだから20.04でなんとかする。