2011年12月03日

開発環境の整備(3)

開発環境の整備とかいうタイトルにしてしまったが、Android とはほぼ関係ない。なにをやろうとしているかといえば ... Redhat Enterprise Linux 6 (RHEL6) の mipsel 版 clone を作ること。

しばらくの間、中断していたが CFW も一段落したので再開。

devkit3.tgz と それの元の mkdevkit3

    現状が良く分からなくなっているので、また整理から。

    http://nmj.sumomo.ne.jp/my-rhel6/

    ここの mipsel-devkit3.tgz と それの元の mkdevkit3.tar を新たに置いた。

    今までは元の環境を壊さないようにしていたが、実は libtool など具合が悪いものがある。もう面倒なので、元の環境を上書きするのを前提にした。

    具体的にインストールの仕方を書くと

    • 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 (とりあえず)

    この操作で rpmbuild --target mipsel とすることで、ビルドが出来るようになる。

    mkdevkit3.tar には、SRPM や 作った RPM を置いてある。mipsel-devkit3.tgz は ほぼ作った RPM を 元にしている。( gcc も無理やり ビルドして RPM 化した。)

  • 状況は前記事とあまり変わらない。ここから再スタート。

    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 がビルドできるようになる。

mipsel-devkit4.tgz と それの元の mkdevkit4.tar

    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 で入って

    • ext4 を mount

    • swapon

    • chroot した上で sshd を起動。

      ここまで済んだら

    • 外部のマシンから ssh を使って ログイン。

      という手順になると思う。

次の作業

    次は、作った 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

    perl は、noarch パッケージは基本ビルドしないことに。mipsel パッケージは 全部ビルド。

  • cups

    ./genstrings > sample.c

    で core-dump 。これがクリアできていない。

  • avahi

    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

    ということらしいのだが...
  • w3m

    mktables だったかで code-dump 。たぶん gd が原因。

  • setools

    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 なので パッケージが入らないというわけではない。

    ちょっとまずそうなので、作りなおして置き換えることにしよう。


    ビルドできない rpm について
  • 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 あたりが関係ある。





    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 っぽい。
posted by すz at 18:25| Comment(0) | TrackBack(0) | Jz47xx(Linux)