debian_jessie_armhf_miniroot

を先に済ませておくこと

qemu のインストール

# apt-get install qemu-user-static
  • hello.c
#include <stdio.h>

int main(){
        printf("hello\n");
        return 0;
}

hello.cを作り arm向けにビルドする

# arm-linux-gnueabihf-gcc hello.c
# file a.out
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, 
interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, 
BuildID[sha1]=87755657e33fd0d2666512c5e2b584b306d35534, not stripped

qemuをインストールした状態なら armバイナリが実行できる

# ./a.out
hello

パッケージの展開

miniroot/ ディレクトリに自分でビルドした libc, libncurses, bash, busybox を展開する

# dpkg -x build/bash/bash_4.3-11+deb8u1_armhf.deb                 miniroot/
# dpkg -x build/busybox/busybox_1.22.0-9+deb8u1_armhf.deb         miniroot/
# dpkg -x build/libc6/libc6_2.19-18+deb8u10_armhf.deb             miniroot/
# dpkg -x build/libncurses5/libncurses5_5.9+20140913-1_armhf.deb  miniroot/
# dpkg -x build/libncurses5/libtinfo5_5.9+20140913-1_armhf.deb    miniroot/
# tree miniroot/                                  ディレクトリツリーの確認
# cp /usr/bin/qemu-arm-static miniroot/usr/bin/            qemuを miniroot/ 内にコピー
# chroot miniroot/                                         miniroot/ 内にchrootしてみる
I have no name!@debian:/#                                  qemuのおかげでARMバイナリのbashが起動する!!
I have no name!@debian:/# busybox ls -l                    busyboxのlsを実行してみる

busyboxへのシンボリックリンクを作る

I have no name!@debian:/# cd bin/
I have no name!@debian:/bin# busybox ln -s busybox ln
I have no name!@debian:/bin# busybox ln -s busybox ls
I have no name!@debian:/bin# busybox ln -s busybox mv
I have no name!@debian:/bin# busybox ln -s busybox cp

lsという名前でbusyboxを呼び出せるようになる

I have no name!@debian:/bin# ls -l
-rwxr-xr-x  1 0  0  653984 Aug  6 15:38 bash
-rwxr-xr-x  1 0  0  494652 Aug  6 15:46 busybox
lrwxrwxrwx  1 0  0       7 Aug  7 02:12 cp -> busybox
lrwxrwxrwx  1 0  0       7 Aug  7 02:12 ln -> busybox
lrwxrwxrwx  1 0  0       7 Aug  7 02:12 ls -> busybox
lrwxrwxrwx  1 0  0       7 Aug  7 02:12 mv -> busybox
lrwxrwxrwx  1 0  0       4 Aug  6 15:37 rbash -> bash    (rbash は bash -r と同じ制限付きシェル今回は使わない)
lrwxrwxrwx  1 0  0       7 Aug  7 02:12 rm -> busybox
I have no name!@debian:/# exit                           chrootを抜けるには exit

最小限の環境を作る

bashとbusyboxがリンクされているライブラリ(シェアドオブジェクト 拡張子.so)を調べる

# chroot miniroot/
I have no name!@debian:/# /lib/ld-linux-armhf.so.3 --list /bin/bash
        libncurses.so.5 => /lib/arm-linux-gnueabihf/libncurses.so.5 (0xf67ad000)
        libtinfo.so.5 => /lib/arm-linux-gnueabihf/libtinfo.so.5 (0xf6783000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xf6770000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xf667e000)
        /lib/ld-linux-armhf.so.3 (0xf6fd7000)

I have no name!@debian:/# /lib/ld-linux-armhf.so.3 --list /bin/busybox
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xf66e2000)
        /lib/ld-linux-armhf.so.3 (0xf6fd7000)

それぞれのファイルはシンボリックリンクになっているので実体ファイルを調べる

I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libncurses.so.5
lrwxrwxrwx    1 0        0               17 Aug  7 01:13 /lib/arm-linux-gnueabihf/libncurses.so.5 -> libncurses.so.5.9
I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libtinfo.so.5
lrwxrwxrwx    1 0        0               15 Aug  7 02:07 /lib/arm-linux-gnueabihf/libtinfo.so.5 -> libtinfo.so.5.9
I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libdl.so.2
lrwxrwxrwx    1 0        0               13 Aug  6 14:49 /lib/arm-linux-gnueabihf/libdl.so.2 -> libdl-2.19.so
I have no name!@debian:/# ls -l /lib/arm-linux-gnueabihf/libc.so.6
lrwxrwxrwx    1 0        0               12 Aug  6 14:49 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.19.so
I have no name!@debian:/# ls -l /lib/ld-linux-armhf.so.3
lrwxrwxrwx    1 0        0               30 Aug  6 14:49 /lib/ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.19.so
I have no name!@debian:/# exit                           chrootを抜けるには exit

target/ ディレクトリを作り、先ほどの miniroot/ からコピーしていく

# mkdir target
# mkdir target/bin
# mkdir target/usr/bin -p
# mkdir target/sbin
# mkdir target/lib/arm-linux-gnueabihf/ -p
# mkdir target/proc
# mkdir target/dev
# cp -a miniroot/bin/*                                     target/bin/
# cp -a miniroot/lib/arm-linux-gnueabihf/libncurses.so.5   target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libncurses.so.5.9 target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libtinfo.so.5     target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libtinfo.so.5.9   target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libdl.so.2        target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libdl-2.19.so     target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libc.so.6         target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/arm-linux-gnueabihf/libc-2.19.so      target/lib/arm-linux-gnueabihf/
# cp -a miniroot/lib/ld-linux-armhf.so.3                   target/lib/
# cp -a miniroot/lib/arm-linux-gnueabihf/ld-2.19.so        target/lib/arm-linux-gnueabihf/
# cp -a /usr/bin/qemu-arm-static                           target/usr/bin/

Linuxは起動直後に /sbin/init を筆頭プロセスとして起動するので /sbin/init は /bin/bash へのシンボリックリンクとする

# cd target/sbin/
# ln -s ../bin/bash init
# cd                 (homeに戻る)
# tree target/
target/
|-- bin
|   |-- bash
|   |-- busybox
|   |-- cp -> busybox
|   |-- ln -> busybox
|   |-- ls -> busybox
|   |-- mv -> busybox
|   |-- rbash -> bash
|   `-- rm -> busybox
|-- dev
|-- lib
|   |-- arm-linux-gnueabihf
|   |   |-- ld-2.19.so
|   |   |-- libc-2.19.so
|   |   |-- libc.so.6 -> libc-2.19.so
|   |   |-- libdl-2.19.so
|   |   |-- libdl.so.2 -> libdl-2.19.so
|   |   |-- libncurses.so.5 -> libncurses.so.5.9
|   |   |-- libncurses.so.5.9
|   |   |-- libtinfo.so.5 -> libtinfo.so.5.9
|   |   `-- libtinfo.so.5.9
|   `-- ld-linux-armhf.so.3 -> arm-linux-gnueabihf/ld-2.19.so
|-- proc
|-- sbin
|   `-- init -> ../bin/bash
`-- usr
    `-- bin
        `-- qemu-arm-static

target/ 内に chroot して動作確認

# chroot target/
bash-4.3# ls -l bin/
total 1124
-rwxr-xr-x    1 0        0           653984 Aug  6 15:38 bash
-rwxr-xr-x    1 0        0           494652 Aug  6 15:46 busybox
lrwxrwxrwx    1 0        0                7 Aug  7 02:12 cp -> busybox
lrwxrwxrwx    1 0        0                7 Aug  7 02:12 ln -> busybox
lrwxrwxrwx    1 0        0                7 Aug  7 02:12 ls -> busybox
lrwxrwxrwx    1 0        0                7 Aug  7 02:12 mv -> busybox
lrwxrwxrwx    1 0        0                4 Aug  6 15:37 rbash -> bash
lrwxrwxrwx    1 0        0                7 Aug  7 02:12 rm -> busybox
# exit       (またはCTRL+D)

関連