しばらくの間、中断していたが CFW も一段落したので再開。
devkit3.tgz と それの元の mkdevkit3
- mindev10bin2.iso の中にある mindevel10.tgz を chroot 環境として展開 (tar -zxvpf )
- i686 パッケージを アンインストール
- usr/include を 削除するか usr/include-x86_64 などに rename (必須)
- mipsel-devkit3.tgz をそこに上書き展開。
- startup.sh で qemu-mipsel を動作させるようにする (起動して1回のみ)
- /etc/ld.conf.d のファイルを lib64 → lib に修正 して ldconfig (とりあえず)
- 状況は前記事とあまり変わらない。ここから再スタート。
perl は、config.sh に cppsyms='NO_ASM'=1' なんていう変なのが入っていた。
初期に gcrypt だったか .. の make でうまくいかないので、/usr/rpm/macros とかに -DNO_ASM を 無理やり入れていた。これが回りまわってこうなったようだ。
/usr/rpm/macros とかの -DNO_ASM を off にしても同じ現象 -- で 調べると いろいろ伝播している。とりあえず mysql と tcl と icu あたり。あと python と uuid も。
config.sh を書き換えて make すると最後まで行った。
あと、地道にビルドしていったら、nspr , nss がビルドできるようになっていた。
そうなるとついに openldap がビルドできるようになる。
現状が良く分からなくなっているので、また整理から。
http://nmj.sumomo.ne.jp/my-rhel6/
ここの mipsel-devkit3.tgz と それの元の mkdevkit3.tar を新たに置いた。
今までは元の環境を壊さないようにしていたが、実は libtool など具合が悪いものがある。もう面倒なので、元の環境を上書きするのを前提にした。
具体的にインストールの仕方を書くと
この操作で rpmbuild --target mipsel とすることで、ビルドが出来るようになる。
mkdevkit3.tar には、SRPM や 作った RPM を置いてある。mipsel-devkit3.tgz は ほぼ作った RPM を 元にしている。( gcc も無理やり ビルドして RPM 化した。)
mipsel-devkit4.tgz と それの元の mkdevkit4.tar
- ext4 を mount
- swapon
- chroot した上で sshd を起動。
ここまで済んだら - 外部のマシンから ssh を使って ログイン。
という手順になると思う。
devkit3 の発展形態。作った rpm は 806個 になった。ようやく全体の 1/2 を超えた。
ついに openldap がビルドできた。これでいろんなものがビルドできるようになって、かなり進んだ。
mesa はまだ。perl はビルドできたが微妙な状態。x86_64 版とちゃんぽんになっているのがいけないのかも。
そして ... rpm コマンド が作れた。ここがひとつのマイルストーン。実機で chroot できる環境を作ることができる。次の devkit はセルフベースで、cc1/cc1plus のみクロスに出来るものを目指す。
ちなみに、openssh-server はできているので 実機では ssh でログインできるものになるはず。ストレージは microSD しかない。相当に遅そうだが novo7 basic ならなんとか。
もうちょっと詳しくかいておこう。
x86_64 用に作った rpm の総数は、1500 個ぐらい。だがこれには、カーネルや 立ち上げに必要な ものがふくまれている。chroot してビルドするのに必要なものはもっと少ない。
次目指すのは、microSD に ext4 パーティションを作って そこに展開した tarball を 使って セルフの環境で 自分自身をビルドできる環境。microSD の I/O 性能や 使えるメモリの量の点で novo7 basic を使うことを想定。
で、qemu-mipsel と gcc の cc1/cc1plus などをパックしたものも用意して、この上に 展開することで、Linux x86_64 での chroot 環境でも使えるものにする。 devkit4 までは、x86_64 環境に上書きしていたが、これが逆になる。
セルフの環境用の microSD は、vfat 領域を減らして ext4 と swap パーティションを追加したものになると思う。最初は adb で入って
次の作業
次は、作った rpm を rpm コマンドで インストールしようとして エラーを見る。
# mkdir newroot
# rpm -r `pwd`/newroot --initdb
# rpm -r `pwd`/newroot -Uvh *.rpm
こんな感じ。で、rpm がないというエラーが出る。このエラーを減らすように rpm を追加していく。
現状で足りないのは、
kernel-headers
kernel
pcsc-ifd-handler (needed by pcsc-lite-1.5.2-6.el6suz1.mipsel)
sane-backends-libs-gphoto2 (needed by sane-backends-devel)
phonon-backend (needed by qt-x11)
mesa-dri-drivers (needed by mesa-libGL)
setools-libs-python ( needed by policycoreutils-python)
text-www-browser (needed by docbook-utils )
これぐらいまで減ってきた。qt, mesa は強引にビルドしてこうなっている。ちなみに、text-www-browser は、w3m のことで core-dump するので ビルドできていない。
kernel は無論ビルドできない。
他にもビルドできていないものがあって、avahi と cups 。数は少なくなったが、結構難物ばかり残っている。
で、これらをビルドして kernel など無理なもの のみになれば、--nodeps で 無理やりインストールして tarball を作る。これで、ようやく self ベースに切り替えられる。
その後は、... java 関係。java 関係が一番の難物で不安を感じている。
ちょっとビルドについてのメモ
perl は、noarch パッケージは基本ビルドしないことに。mipsel パッケージは 全部ビルド。
./genstrings > sample.c
で core-dump 。これがクリアできていない。
checking for python module gtk... no
configure: error: Could not find Python module gtk
これの原因は、
checking for python module gtk... no
configure: error: Could not find Python module gtk
ということらしいのだが...
mktables だったかで code-dump 。たぶん gd が原因。
lib64 を読もうとしてエラー。
最初 そのままではビルドできないものを多々あったが、いくつか ビルドしなおして正規のものに置き換えた
cracklib
gmp
libSM
libxcb
sane-backends
unixODBC
uuid
nss-softokn
gstreamer-plugins-base (libtheora )
nfs-utils
まだ残っているが、まぁぼちぼち。
mipsel-devroot6.tgz と mipsel-devkit5.tgz と それの元の mkdevkit6.tar (整理中: (仮))
avahi も cups も devel パッケージを作りたいだけなので、ごまかした。
で、これを元にとにかく self 版を作ってみたのが、devroot6 。
devkit5 は、同じ rpm を元に x86_64環境に上書きする従来の発展版。
devroot6 は、689 個のパッケージをインストールしたもので、直接 chroot 可能なようにしている。実機でも chroot 可能なはずだが未確認。サイズは 400MB弱で まだまだ小さい。
一応はできたのだが ... 結構動作があやしい。なので、作る予定がなかった devkit も作ることにした。
mkdevkit6.tar は、すべての元で作った rpm ( 全部で 1013 ) 個が置いてある。サイズも 1.2GB と巨大になってしまった。半分は SRPMS で もう使わないものも置いていたりするので大きくなっている。
今後は、作ったこれを動かしてみるつもり。あと、これほどのサイズのものを頻繁に置き換えるのは無理があるので 当面これを手直しして使う。次に置くのは最終形態にするつもりで、いつになるか分からない。
ちょっと実機で試す
32G の microSD にパーティションを3つ作成し、ext4 で mkfs して mipsel-devroot6.tgz を展開
adb で mount して chroot できた。
bash-4.1# ifconfig -a
ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:16 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1376 (1.3 KiB) TX bytes:1376 (1.3 KiB)
wlan0 Link encap:Ethernet HWaddr 00:E0:4C:14:E3:67
inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:42 errors:0 dropped:305 overruns:0 frame:0
TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:24804 (24.2 KiB) TX bytes:7971 (7.7 KiB)
ビルド用 しかインストールしていないので、openssh も入れてなかった。
bash-4.1# rpm -Uvh init*
error: Failed dependencies:
/etc/oracle-release is needed by initscripts-9.03.23-1.0.1.el6.mipsel
bash-4.1# rpm -Uvh init* --nodeps
Preparing... ########################################### [100%]
1:initscripts ########################################### [100%]
bash-4.1# rpm -Uvh openssh-5* openssh-server*
Preparing... ########################################### [100%]
1:openssh ########################################### [ 50%]
2:openssh-server ########################################### [100%]
bash-4.1#
bash-4.1# ls /etc/init.d
avahi-daemon iptables netfs pcscd rpcidmapd snmpd
functions killall network quota_nld rpcsvcgssd snmptrapd
gpm lvm2-monitor nfs rdisc sandbox sshd
halt messagebus nfslock restorecond saslauthd udev-post
httpd netconsole openct rpcgssd single uuidd
bash-4.1# /etc/init.d/sshd start
cat: /proc/sys/crypto/fips_enabled: No such file or directory
/etc/init.d/sshd: line 50: [: too many arguments
Generating SSH2 RSA host key: /etc/init.d/sshd: line 69: 890 Segmentation fault $KEYGEN -q -t rsa -f $RSA_KEY -C '' -N '' &>/dev/null
[FAILED]
bash-4.1#
rpm は入ったけれど、なんかダメみたいだ。... telnet はどうだろう。
bash-4.1# rpm -Uvh telnet-server*
error: Failed dependencies:
xinetd is needed by telnet-server-1:0.17-46.el6.mipsel
bash-4.1# ls xinetd*
ls xinetd*
ls: cannot access xinetd*: No such file or directory
bash-4.1#
だめだった。
ちょっとビルドのテスト
bash-4.1# su - root
-bash-4.1# rpmbuild --rebuild mingetty*
Installing mingetty-1.08-4.1.el6.src.rpm
:
+ rm -rf /root/rpmbuild/BUILDROOT/mingetty-1.08-4.1.el6.mipsel
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.p2pk4u
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf mingetty-1.08
+ exit 0
-bash-4.1# rpm -Uvh /root/rpmbuild/RPMS/mipsel/mingetty-1* --force
rpm -Uvh /root/rpmbuild/RPMS/mipsel/mingetty-1* --force
Preparing... ########################################### [100%]
1:mingetty ########################################### [100%]
-bash-4.1#
いちおう OK 。( su - しているのは、adb から chroot しただけでは、HOME とか最低限度の環境すらないため。)
ちょっと使ってみたわけだが、Ronzi A3 は microSD の I/O が遅くてレスポンスが悪い。あと adb で作業するのは辛い。やはり最低限の作業環境は最初から入れときたい。
それはともかく、ついに実機で動かすところまで来た。
現在の不具合:
redhat-rpm-config を入れると、self 版では rpm を生成する最後のところで エラーになる。
INTERNAL ERROR 521 (0.152-Dec 5 2011): cannot read data from file
elfutils の eu-strip を動かすようになって、それが動かないということらしい。
ちなみに redhat-rpm-config を入れないと %dist が 入らないので 違うファイル名の rpm が出来てしまう。
で、x86_64 の環境だと native の eu-strip を使っているはずで、それなら問題ないようだ
なかなか嫌らしい問題っぽいが、とりあえず rpm -e redhat-rpm-config として、/usr/lib/rpm/macros に
%dist .el6
を入れておくことにしよう。
それ以外に アーキテクチャが対応していないという理由で全然ビルドできないものがいくつかある。
corosync libatomic_ops openais valgrind fakechroot
このあたり。( + libgcrypt )
いろいろ問題があるのだが、作ろうとしていたものは、開発のベース。すなわちこのような問題に直面して、それを直していけるようなもの。そういう意味では あと一息。
追記:
# passwd
Error - unable to connect to audit system
詳細な原因はわからないが、passwd などが動かないようだ。どうもそのせいで mipsel-devroot6.tgz の作成に失敗している。%pre で groupadd などをしているパッケージがあり、これらは エラーになる。
ちょっとインチキだが、audit なしでビルドした shadow-utils と passwd を置き換えたら
/usr/sbin/build-locale-archive: cannot read data from locale archive: Cannot allocate memory
warning: %post(glibc-common-2.12-1.25.el6suz3.mipsel) scriptlet failed,
warning: %post(gtk-doc-1.11-5.1.el6.noarch) scriptlet failed, exit status 139
エラーはこの 2 にまで減った。直せていないが %post なので パッケージが入らないというわけではない。
ちょっとまずそうなので、作りなおして置き換えることにしよう。
- fakechroot
x86_64 以外ではビルドできない。これを必要としているのは、rpm コマンドのビルドで、しかも check する場合のみ。--without check を付ければ良さそう。 - libatomic_ops
pulseaudio , gc で必要とされている。
ググると gentoo には 、libatomic_ops-1.2-mips.patch があるようだ。 で、この libatomic_ops は、gc-7.1 に含まれるもの。gc は無理やりビルドできるが、libatomc_ops がないので実行できなかったようだ。(w3mが ビルドできなかった理由?) - pulseaudio
SDL で必要。.. だが SDL 側で off にできそう。
あと、先の話だが、java-1.6.0-openjdk 。ただし、これも off にできそう。 - corosync
openais で必要。 - openais
lvm2 と cluster で必要。 cluster は、lvm2 で必要。
要するに lvm2 側でなんとかすれば、corosync も openais , cluster は不要。
lvm2 見てみたら、enable_cluster のときだけ必要で、それが 1 になるのは x86 系だけだった。要するに最初から不要 - valgrind
curl , gdb , libmthca libtasn1 , python で必要とされている。
が 、いくつかの architecture では 必要ないことになっている。
パッチは見つけた (r11845_mips.tar.bz2)が、最新でも まともにサポートされていないようだ。
が、libtasn1 は x86 と ppc のみ必要。libmthca は libibverbs-driver のことで librdmam , libnes , corosync あたりが関係ある。
ビルドできない rpm について
qemu: Unsupported syscall: 4204
ls でこんなメッセージが出るようになった。4204 というのは、capget のことで、qemu (1.0)では、
case TARGET_NR_capget:
goto unimplemented;
case TARGET_NR_capset:
goto unimplemented;
こんなふうになっている。
あと、qemu の環境で rpm でパッケージをインストールすると
File size limit exceeded
というメッセージが出て 1 つめで終わってしまう。SIGXFSZ を受けている?
df が表示されない。
/etc/mtab にそれらしいのを入れれば OK っぽい。