以下省略!

タイダルウ(ry ほぼ毎日1記事執筆運動実施中。 ※記事に広告(アフィリエイト)リンクを掲載している場合があります。

PQI Air Penでいろいろ遊んでみる何か(普通の遊び方ではありません)

f:id:abyssluke:20201209173740j:plain:w200:left注文していたPQI Air Penが2/22に届いたのでいろいろと遊んでみた。といってもAir Pen向けにいろいろビルドしてみたりした時の記録とかだけど。そこそこ長いので続きを読むから。

目次

telnet開いてるとか…

PQIはどこかしらに穴があることで有名。
telnetポートとかが開いていたりするが、以下の情報でrootログインできてしまうアレ。ちなみにFTPも同じようにログインできる。無線microSDリーダーライターみたいな行為できるね!
ID: root PW: pqiap

Air Penから出ているSSID(デフォルトではPQI Air Pen)に接続している場合はpqi.air(192.168.200.1)に接続する。Air Penから無線LAN APに接続したりしている場合はそれっぽいIPに接続してみる(nmapとかで調べてみたりとかして)。

telnetでログインするとBusyboxのashが起動する。
Busyboxのバージョンは1.01で、軽量化のためかどうでもいいアプレット(wgetなど)は削除されているので、削除されているアプレットを動かしたい場合は後述の手順でBusyboxMIPS向けにビルドするか、コンパイル済みのバイナリmicroSDカードにダウンロードして動かす。
microSDカードは/tmp/www/ftp/sda1にマウントされている(FTPでログインした場合は/tmp/www/ftp/がルートになる)。

各種環境情報

カーネル
# uname -a
Linux (none) 2.6.31.AirPen_V0.1.22-g5eca71a #319 Thu Jan 3 16:27:02 CST 2013 mips unknown
CPU
# cat /proc/cpuinfo
system type             : Atheros AR9330 (Hornet)
processor               : 0
cpu model               : MIPS 24Kc V7.4
BogoMIPS                : 232.96
wait instruction        : yes
microsecond timers      : yes
tlb_entries             : 16
extra interrupt vector  : yes
hardware watchpoint     : yes, count: 4, address/irw mask: [0x0000, 0x0888, 0x0ff8, 0x0a3b]
ASEs implemented        : mips16
shadow register sets    : 1
core                    : 0
VCED exceptions         : not available
VCEI exceptions         : not available
メモリ

製造時期によっては32MBメモリ搭載の場合もあるが、今回購入したものは64MBメモリ搭載だった。

# cat /proc/meminfo
MemTotal:          61696 kB
MemFree:           52176 kB
Buffers:             120 kB
Cached:             2420 kB
SwapCached:            0 kB
Active:             2144 kB
Inactive:           1360 kB
Active(anon):        964 kB
Inactive(anon):        0 kB
Active(file):       1180 kB
Inactive(file):     1360 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:           988 kB
Mapped:             1288 kB
Slab:               4136 kB
SReclaimable:        340 kB
SUnreclaim:         3796 kB
PageTables:          152 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       30848 kB
Committed_AS:       2964 kB
VmallocTotal:    1048404 kB
VmallocUsed:        1404 kB
VmallocChunk:    1045032 kB
起動コマンドライン

上記でも挙げたようにメモリは64Mとなっている。

# cat /proc/cmdline
console=ttyS0,115200 root=31:05 rootfstype=squashfs init=/sbin/init mtdparts=ar7240-nor0:256k(u-boot),64k(u-boot-env),64k(ART),64k(NVRAM),1280k(uImage),2560k(rootfs),1280k(uImage2),2560k(rootfs2),64k(CONF) mem=64M

何気にMTD領域をバックアップしてみる

MTD(フラッシュメモリ)領域は以下のように定義されている。

# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00010000 "u-boot"
mtd1: 00010000 00010000 "u-boot-env"
mtd2: 00010000 00010000 "ART"
mtd3: 00010000 00010000 "NVRAM"
mtd4: 00140000 00010000 "uImage"
mtd5: 00280000 00010000 "rootfs"
mtd6: 00140000 00010000 "uImage2"
mtd7: 00280000 00010000 "rootfs2"
mtd8: 00010000 00010000 "CONF"

スクリプトを使って一気にバックアップしてもいいが、ここは一つずつddコマンドでmicroSDカードにバックアップしてみた。

# cd /tmp/www/ftp/sda1
# dd if=/dev/mtd0ro of=mtd0-u-boot.img
# dd if=/dev/mtd1ro of=mtd1-u-boot-env.img
# dd if=/dev/mtd2ro of=mtd2-ART.img
# dd if=/dev/mtd3ro of=mtd3-NVRAM.img
# dd if=/dev/mtd4ro of=mtd4-uImage.img
# dd if=/dev/mtd5ro of=mtd5-rootfs.img
# dd if=/dev/mtd6ro of=mtd6-uImage2.img
# dd if=/dev/mtd7ro of=mtd7-rootfs2.img
# dd if=/dev/mtd8ro of=mtd8-CONF.img

いろいろビルドしてみる

いろんなプログラムをスタティックリンクでビルドしてみた。
なおMIPSのクロスコンパイル環境はSourcery CodeBench Lite Edition 2014.05-27版がインストールされており、パスが通っているものとする。
2016.05-8(最新版)〜2014.11-22版はビルドしたバイナリを実機で実行しようとするとカーネルバージョンが古いと怒られてしまうので2014.05-27版を使うべし(微妙に苦戦した)。
Air PenのmicroSDカードにコピーする手順は省略している

busybox
$ wget https://busybox.net/downloads/busybox-1.26.2.tar.bz2
$ tar xjvf busybox-1.26.2.tar.bz2
$ cd busybox-1.26.2
$ make ARCH=mips CROSS_COMPILE=mips-linux-gnu- defconfig
$ make ARCH=mips CROSS_COMPILE=mips-linux-gnu- menuconfig
(※Busybox Settings→Build BusyBox as a static binary (no shared libs)を有効にしておくこと)
(※Busybox Library Tuning→Allow wide Unicode characters on outputも有効にしておいた方がいいかも)
(※ツールチェインによっては一部コマンドを無効化しないとビルドがコケる場合がある)
$ make ARCH=mips CROSS_COMPILE=mips-linux-gnu-
nkf
$ wget https://ja.osdn.net/dl/nkf/nkf-2.1.4.tar.gz
$ tar xzvf nkf-2.1.4.tar.gz
$ cd nkf-2.1.4
$ vi Makefile
$ cat Makefile
CC = mips-linux-gnu-gcc
CFLAGS = -g -O2 -Wall -pedantic -static -march=24kc
# CFLAGS = -O3
(※後略。 PREFIXは作業ディレクトリにセットしておいたほうがいいかもしれない)
$ make
$ mips-linux-gnu-strip nkf #お好みで
mruby

ビルドにはruby(mrubyではない)が必要。

$ git clone https://github.com/mruby/mruby
$ cd mruby
$ vi build_config.rb
$ cat build_config.rb
(※前略)
MRuby::CrossBuild.new('pqi-air') do |conf|

  toolchain :gcc

  conf.gembox 'default'
  conf.cc.command = "mips-linux-gnu-gcc"
  conf.cc.flags << %w(-g -O2 -Wall -static -march=24kc)
  conf.linker.command = "mips-linux-gnu-gcc"
  conf.linker.flags << %w(-s -static)
  conf.archiver.command = "mips-linux-gnu-ar"

end
$ make
(※build/pqi-air/binにmirb,mruby,mruby-stripができる)
sl(起動できず)

実機でtelnetを使って実行するとError opening terminal: vt102.と怒られて実行できない(対処法はあるかもしれんが…)が、参考情報としてとりあえず記載しておく。

ncursesをビルド、作業ディレクトリにインストールしておいてからslをビルドする。
Sourcery CodeBench Lite Edition 2014.05-27を使ってビルドする場合は問題無いが、ncursesをビルドする際にビルドがコケる場合はCPPFLAGS="-P"を./configure時に設定すること(GCC 5系以降の現象?)。

$ wget https://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
$ tar xzvf ncurses-6.0.tar.gz
$ cd ncurses-6.0
$ ./configure --host=mips-linux-gnu --prefix=/home/hoge/workdir --with-shared --without-debug --without-ada --enable-overwrite
$ make
$ make install
$ cd ..
$ git clone https://github.com/mtoyoda/sl
$ cd sl
$ vi Makefile
$ cat Makefile
(※前略)
CC=mips-linux-gnu-gcc
CFLAGS=-O2 -static -march=24kc -L/home/hoge/workdir/lib -I/home/hoge/workdir/include

sl: sl.c sl.h
	$(CC) $(CFLAGS) -o sl sl.c -lncurses
$ make
$ mips-linux-gnu-strip ./sl #お好みで