注文していた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など)は削除されているので、削除されているアプレットを動かしたい場合は後述の手順でBusyboxをMIPS向けにビルドするか、コンパイル済みのバイナリを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 #お好みで