【実験】Raspbianを使えちゃう様にする

※本項は実験的な内容ですのでご注意下さい。

chrootで世界を切り替える

実験的な方法で実用性があるかは疑問ですが、chrootというコマンドを使ってPaPeRo iのシェルをRaspbianにする方法があります。

PaPeRo iのARM CPUはRaspberry Pi 1よりちょっと良いやつで、Raspbianの実行形式を実行できます。
そしてカーネルはRaspbianと同じLinuxなので、Raspbianのユーザランドを用意しchrootというコマンドを使うことで、シェルとシェルから見える世界をRaspbianに切り替えることが出来ます。

切り替わるのはログインシェルの世界だけでありカーネルやドライバはOpenWRTのままで不整合が発生しますので、どの程度動くかはやってみないと分からないと言ったところです。

使用するディストリビューション

まずはカーネルバージョンがPaPeRo iに近いRaspbian wheezyを使いたいのですが、jessieの様なGUI抜きのLITEが提供されておらずサイズが大きいです。
そこで今回は、Raspbian互換のコンパクトイメージMINIBIANWHEEZY版を使用します。

ユーザランドUSBメモリの作成

Raspbian(MINIBIAN)環境はUSBメモリに作成し、PaPeRo i本体にコピーはせずそのまま挿して使う事にします。

(1) LinuxホストでMINIBIAN WHEEZY版をダウンロードして展開します。

host$ mkdir /tmp/minibian
host$ cd /tmp/minibian
host$ wget http://sourceforge.net/projects/minibian/files/2015-02-18-wheezy-minibian.tar.gz
host$ tar xvzf 2015-02-18-wheezy-minibian.tar.gz

これで/tmp/minibian2015-02-18-wheezy-minibian.imgというファイルが出来ます。

(2) USBメモリを挿します。
自動マウントされる場合はumountします。

(3) MINIBIANイメージをUSBメモリに書き込みます。
以下はUSBメモリが/dev/sdcだった場合です。これを間違えるとLinuxホストが壊れたり大事なファイルが消えたりしますので、充分ご注意下さい。

host$ sudo dd if=2015-02-18-wheezy-minibian.img of=/dev/sdc bs=1M

(4) MINIBIANイメージは512Mに収まるように作られていて小さいので、パーティションを拡張します(raspi-configでは出来ません)。
1番目がvfatのブートパーティションで、2番目がルートですので、2番目のパーティションを領域一杯に広げます。
以下は8GのUSBメモリの例です。

host$ sudo fdisk /dev/sdc
コマンド (m でヘルプ): p

ディスク /dev/sdc: 7948 MB, 7948206080 バイト
ヘッド 4, セクタ 16, シリンダ 242560
Units = シリンダ数 of 64 * 512 = 32768 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0004a452

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1               1        1527       48856    b  W95 FAT32
/dev/sdc2            1528       15616      450848   83  Linux

コマンド (m でヘルプ): d
パーティション番号 (1-4): 2

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 2
最初 シリンダ (1528-242560, 初期値 1528):
初期値 1528 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1528-242560, 初期値 242560):
初期値 242560 を使います

コマンド (m でヘルプ): p

ディスク /dev/sdc: 7948 MB, 7948206080 バイト
ヘッド 4, セクタ 16, シリンダ 242560
Units = シリンダ数 of 64 * 512 = 32768 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0004a452

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdc1               1        1527       48856    b  W95 FAT32
/dev/sdc2            1528      242560     7713056   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。    
host$ sudo e2fsck -f /dev/sdc2
host$ sudo resize2fs /dev/sdc2

(5) USBメモリを取り外します。

(6) USBメモリをPaPeRo iに挿してmountします。
/dev/sda2がルートパーティションになっていると思います(USBメモリを挿す前後でls /dev/sd*して調べて下さい)。

# mount -t ext4 /dev/sda2 /mnt

(7) NANDフラッシュ用のマウントポイントを作成しておきます。

# mkdir /mnt/tiny
# mkdir /mnt/java_cache
# mkdir /mnt/Extension

(8) ファイル/mnt/etc/debian_chrootを新規作成し”minibian_whzy”等と書いておくとchroot後のプロンプトに表示されるので、chrootしているしていないの見分けがついて便利です。

# echo minibian_whzy > /mnt/etc/debian_chroot

(9) chrootのための準備用のシェルスクリプトを作成します。

# mkdir /Extension/test
# cat > /Extension/test/chrootpre_minibian <<EOF
DRV=/mnt  
mount -o bind /dev \$DRV/dev  
mount -o bind /dev/pts \$DRV/dev/pts  
mount -o bind /tmp \$DRV/tmp 
mount -o bind /tiny \$DRV/tiny  
mount -o bind /java_cache \$DRV/java_cache  
mount -o bind /Extension \$DRV/Extension  
mount -t proc none \$DRV/proc  
EOF
# chmod +x /Extension/test/chrootpre_minibian

使い方

(1) 準備用シェルスクリプトを実行します。

# /Extension/test/chrootpre_minibian

(2) chrootします。

# chroot /mnt /bin/bash

(3) /Extension以下がPATHに入っているとOpenWRTのバイナリを実行しようとして失敗するので直します。

(minibian_whzy)# export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

(4) dfが失敗してしまいますが、以下の様にすれば正常に出来る様になります。

(minibian_whzy)# cd /etc
(minibian_whzy)# ln -s ../proc/mounts mtab
(minibian_whzy)# df

(5) インターネットに接続出来る用にします。
お使いの設定次第なのですが、例えばPaPeRo iのLANポートを192.168.1.100に変更して192.168.1.0のネットワークに接続しており、ルータのアドレスが192.168.1.1の場合以下の様にします。

(minibian_whzy)# route add default gw 192.168.1.1
(minibian_whzy)# echo nameserver 192.168.1.1 > /etc/resolv.conf

(6) /etc/apt/sources.listは以下の様にjaistを参照するように変更する方が良いようです。

#deb http://mirrordirector.raspbian.org/raspbian wheezy main non-free
deb http://ftp.jaist.ac.jp/raspbian wheezy main contrib non-free rpi
deb http://archive.raspberrypi.org/debian wheezy main

(7) raspberry piの設定コマンドraspi-configをインストールし、en_US.UTF-8ja_JP.UTF-8のロケールを設定します。

(minibian_whzy)# apt-get update
(minibian_whzy)# apt-get install raspi-config
(minibian_whzy)# raspi-config

(8) manが日本語で表示される様になります。

(minibian_whzy)# export LANG=ja_JP.UTF-8
(minibian_whzy)# man man

(9) 試しにrubyをインストールしてみます。

(minibian_whzy)# apt-get install ruby
(minibian_whzy)# irb

ちゃんとrubyが動作します。
ちょっと試した限りではpython3やgccなどが問題無く動作しました(このgccで作成した実行形式は本chroot環境でしか動作しません)。

手順は異なりますが本家debianでも同様のことが可能です。

【実験】Debian stretchのchroot環境構築のリンクを追加しました(2017/12/18)