2013年3月23日土曜日

ArchLinux on Android (chroot)

Android( Iconia Tab A200 )上にchrootを使ってArchLinuxを起動してみた。
幸い、A200で実行している方が居たのでそのやり方をほぼ引用
Archlinux running in chroot
ただし、うまく行かない部分もあったので適宜修正。

流れ
PCでスクリプト作成

adb でスクリプトをタブレット内に移動

adb でスクリプトを実行

ArchLinux インストール、設定、アプリインストール

VNC


環境
PC:
ArchLinux (スクリプトを書く関係上Linuxでの操作の方が楽そう)

Android:
Iconia Tab A200
ROM: cm-10-20121027-UNOFFICIAL-a200
gapps: gapps-jb-20121011-signed
kernel: gm-a200-v2.0-signed # OCカーネル適用


タブレット側での設定
Android Terminal Emulator, androidVNC, 日本語フルキーボード for Tablet を Google Play よりインストール # デフォルトのキーボードとandroidVNCの相性が悪い(私の環境では)
設定 ---> 言語と入力 ---> 日本語フルキーボード for Tablet にチェック ---> デフォルト ---> 日本語フルキーボード for Tablet
設定 ---> {}開発者向けオプション ---> Rootアクセス ---> アプリとADB
設定 ---> {}開発者向けオプション ---> USBデバッグ にチェック
設定 ---> パフォーマンス ---> プロセッサ ---> 1504 MHz #少しでも操作が早くなることを祈りOC

PCとA200をUSBでつなぐ

PCでの操作
$ mkdir arch # 適当に作業用ディレクトリを作成
$ cd arch
$ wget http://archlinuxarm.org/os/ArchLinuxARM-trimslice-latest.tar.gz

$ vi archarm.init.sh
#!/bin/bash

echo "Now enter the screen size you want in pixels (e.g. 800x480), followed by [ENTER]:"

read REZ

##############################################
# Pick which desktop environment to use, this#
# is done by having a xstartup file for each #
# desktop, then renaming the one you want to #
# use to 'xstartup' before boot #
##############################################
echo "Please select which Desktop environment you want to use, type the number to select it then press [ENTER]"
echo "1 - LXDE"
echo "2 - XFCE4"
echo "Make your Selection:"
read DESKTOP
if [ $DESKTOP == 1 ]
then
mv /root/.vnc/lxstartup /root/.vnc/xstartup
fi
if [ $DESKTOP == 2 ]
then
mv /root/.vnc/xfce4startup /root/.vnc/xstartup
fi


###########################################
# Tidy up previous LXDE and DBUS sessions #
###########################################
rm /tmp/.X* > /dev/null 2>&1
rm /tmp/.X11-unix/X* > /dev/null 2>&1
rm /root/.vnc/localhost* > /dev/null 2>&1
rm /var/run/dbus/pid > /dev/null 2>&1

############################################################
# enable workaround for upstart dependent installs         #
# in chroot'd environment. this allows certain packages    #
# that use upstart start/stop to not fail on install.      #
# this means they will have to be launched manually though #
############################################################
dpkg-divert --local --rename --add /sbin/initctl > /dev/null 2>&1
ln -s /bin/true /sbin/initctl > /dev/null 2>&1


###############################################
# start vnc server with given resolution and  #
# DBUS server, (and optionally an SSH server) #
###############################################
vncserver :0 -geometry $REZ
dbus-daemon --system --fork > /dev/null 2>&1
#/etc/rc.d/sshd start


echo
echo "If you see the message 'New 'X' Desktop is localhost:0' then you are ready to VNC into your ArchArm OS.."
echo
echo "If VNC'ing from a different machine on the same network as the android device use the 1st address below:"
##########################################
# Output IP address of android device    #
##########################################
ifconfig | grep "inet addr"

echo
echo "If using androidVNC, change the 'Color Format' setting to 24-bit colour, and once you've VNC'd in, change the 'input mode' to touchpad (in settings)"

echo
echo "To shut down the VNC server and exit the ArchArm environment, just enter 'exit' at this terminal - and WAIT for all shutdown routines to finish!"
echo

###############################################################
# Spawn and interactive shell - this effectively halts script #
# execution until the spawning shell is exited (i.e. you want #
# to shut down vncserver and exit the ArchArm environment)     #
###############################################################
/bin/bash -i

#########################################
# Disable upstart workaround and        #
# kill VNC server (and optionally SSH)  #
# Rename used xstartup to its first file#
#########################################
vncserver -kill :0
if [ $DESKTOP == 1 ]
then
mv /root/.vnc/xstartup /root/.vnc/lxstartup
fi
if [ $DESKTOP == 2 ]
then
mv /root/.vnc/xstartup /root/.vnc/xfce4startup
fi

#/etc/rc.d/sshd stop

$ vi archarm.sh
#name this file archarm.sh

############################################
# This file goes in the same directory as                                   #
# your archarm.img file                                                                 #
# run by typing "sh archarm.sh"                                                  #
############################################
#ArchArm boot script (archarm.sh) based on #
#Ubuntu boot script V6.1 for Android       #
#Built by Zachary Powell (zacthespack)     #
#Thanks to:                                #
#Johan (sciurius)                          #
#Marshall Levin                            #
#and to everyone at XDA!                   #
############################################
#Check for root                            #
############################################
# This script has been modified to run     #
# Archlinux on the Acer Iconia A200 by     #
# workdowg (acertabletfurum)               #
# Thanks to all of the above               #
############################################
perm=$(id|cut -b 5)
if [ "$perm" != "0" ];then echo "This script requires root! Type: su"; exit; fi
mount -o remount,rw /dev/block/mmcblk0p5 /system
##########################################
#Set up veriables                        #
##########################################
export kit=$(dirname $0)
export bin=/system/bin
export mnt=/data/local/mnt
export USER=root
if [[ ! -d $mnt ]]; then mkdir $mnt; fi
export PATH=$bin:/sbin:/usr/bin:/usr/local/bin:/usr/sbin:/bin:/usr/local/sbin:/usr/games:$PATH
export TERM=xterm
export HOME=/root
export USER=root
##########################################
#Set up loop device                      #
##########################################
if [ -b /dev/block/loop255 ]; then
echo "Loop device exists"
else
busybox mknod /dev/block/loop255 b 7 255
fi
#mount -o loop,noatime -t ext2 $kit/ubuntu.img $mnt
busybox losetup /dev/block/loop255 $kit/archarm.img
##########################################
#Mount all required partitions           #
##########################################
busybox mount -t ext2 /dev/block/loop255 $mnt
busybox mount -o bind /dev $mnt/dev
busybox mount -t devpts devpts $mnt/dev/pts
busybox mount -t proc proc $mnt/proc
busybox mount -t sysfs sysfs $mnt/sys
busybox mount -o bind /sdcard $mnt/media/sdcard

##########################################
#Checks if you have a external sdcard    #
#and mounts it if you do                 #
##########################################
if [ -d /mnt/external_sd ]; then
busybox mount -o bind /mnt/external_sd $mnt/media/external_sd
fi
if [ -d /Removable/MicroSD ]; then
busybox mount -o bind /Removable/MicroSD $mnt/external_sd
fi
##########################################
#Sets up network forwarding              #
##########################################
busybox sysctl -w net.ipv4.ip_forward=1
echo "nameserver 8.8.8.8" > $mnt/etc/resolv.conf
echo "nameserver 8.8.4.4" >> $mnt/etc/resolv.conf
echo "127.0.0.1 localhost" > $mnt/etc/hosts
echo "Arch is configured with SSH and VNC servers that can be accessed from the IP:"
ifconfig wlan0
echo " "
##########################################
#Chroot into ArchArm                      #
##########################################
busybox chroot $mnt /root/archarm.init.sh

##########################################
#Shut down ArchArm                        #
##########################################
echo "Shutting down ArchARM"
for pid in `lsof | grep $mnt | sed -e's/ / /g' | cut -d' ' -f2`; do kill -9 $pid >/dev/null 2>&1; done
sleep 5
umount $mnt/media/sdcard
umount $mnt/media/external_sd
umount $mnt/dev/pts
umount $mnt/proc
umount $mnt/sys
umount $mnt
losetup -d /dev/block/loop255

$ vi archarm-image-creator.sh
#!/bin/bash -v

mkdir /sdcard/arch
cd /sdcard
#make and mount image file
dd if=/dev/zero of=archarm.img seek=2000000000 bs=1 count=1 #create empty 1.9gb image file
mke2fs -F archarm.img
mknod /dev/loop256 b 7 256
losetup /dev/loop256 archarm.img
mount -t ext2 /dev/loop256 /sdcard/arch/
# download and extract archlinuxarm
cd /sdcard/arch
cp /sdcard/Download/ArchLinuxARM-trimslice-latest.tar.gz .
#this is compatable with the A200
tar xzf ArchLinuxARM*.tar.gz
rm ArchLinuxARM*.tar.gz
#make some directories
mkdir -p /sdcard/arch/media/external_sd
mkdir /sdcard/arch/media/sdcard
mkdir /sdcard/arch/dev/pts
mkdir /sdcard/arch/dev/ptmx
mkdir /sdcard/arch/root/.vnc
# do some mounting
mount -o bind /dev/ /sdcard/arch/dev
mount -t proc proc /sdcard/arch/proc
mount -t sysfs sysfs /sdcard/arch/sys
mount -t devpts devpts /sdcard/arch/dev/pts
mount -o bind /sdcard /sdcard/arch/media/sdcard
# enter the chroot
chroot . /bin/bash
# your now in the Arch install.

$ vi copy-files.sh
# copy the files you made (or downloaded) earlier
cp /media/sdcard/Download/archarm.init.sh /root/archarm.init.sh
chmod 755 /root/archarm.init.sh
cp /media/sdcard/Download/xfce4startup /root/.vnc/xfce4startup
chmod 755 /root/.vnc/xfce4startup
cp /media/sdcard/Download/lxstartup /root/.vnc/lxstartup
chmod 755 /root/.vnc/lxstartup
cp /media/sdcard/Download/.bashrc /root/.bashrc
cp /media/sdcard/Download/bash.bashrc /etc/bash.bashrc

$ vi xfce4startup
#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
exec startxfce4 &

$ vi lxstartup
#!/bin/sh
xrdb $HOME/.Xresources
xsetroot -solid grey
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
exec startlxde &

$ vi .bashrc
#name file .bashrc
alias ls='ls --color=auto'
PS1='[\u@\h \W]\$ '
export EDITOR="nano"

$ vi bash.bashrc
#name this file bash.bashrc
#
# /etc/bash.bashrc
#
# This file is the systemwide bashrc file. While most of the
# environment is preserved when running an interactive shell
# the PS[1-4] variables, aliases and functions are reset.
#
# When running a non-login shell, apply the following settings:
# - Prompt defaults (PS[1-4], PROMPT_COMMAND)
# - bash_completion if it exists
# - source /etc/bash.bashrc.local

PS1='[\u@\h \W]\$ '
PS2='> '
PS3='> '
PS4='+ '

export PS1 PS2 PS3 PS4

if test "$TERM" = "xterm" -o \
"$TERM" = "xterm-color" -o \
"$TERM" = "xterm-256color" -o \
"$TERM" = "rxvt" -o \
"$TERM" = "rxvt-unicode" -o \
"$TERM" = "xterm-xfree86"; then
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"'
export PROMPT_COMMAND
fi

[ -r /etc/bash_completion ] && . /etc/bash_completion
[ -r /etc/bash.bashrc.local ] && . /etc/bash.bashrc.local
export EDITOR="vi"


$ vi cpfile.sh
#!/bin/bash
adb push archarm.sh /sdcard/
adb push .bashrc /sdcard/Download
adb push bash.bashrc /sdcard/Download
adb push xfce4startup /sdcard/Download
adb push lxstartup /sdcard/Download
adb push archarm.init.sh /sdcard/Download
adb push archarm-image-creator.sh /sdcard/Download
adb push copy-files.sh /sdcard/Download
adb push ArchLinuxARM-trimslice-latest.tar.gz /sdcard/Download

sudo chmod 755 cpfile.sh
./cpfile.sh

$ adb shell
$ su
# cd /sdcard/Download/
# sh archarm-image-creator.sh

# echo "nameserver 8.8.8.8" > /etc/resolv.conf
# echo "export TERM=xterm" >> /etc/profile
# echo "export HOME=/root" >> /etc/profile
# source /etc/profile
# sh /media/sdcard/Download/copy-files.sh
# pacman -Syyu
# pacman -S mesa --force # 引っかかるので強制的にインストール
# pacman -S dialog xorg-xrdb xorg-xsetroot xterm xorg-fonts-75dpi tightvnc lxde xfce4
# pacman -S wireless_tools wpa_actiond wicd
# pacman -S gedit ibus-anthy ttf-dejavu
# systemctl enable net-auto-wireless.service
# exit
# exit
$ exit

タブレット側での操作
Android Terminal Emulatorを起動し
$ su
# cd /sdcard
# sh archarm.sh

解像度 1280x750 #任意
初回起動時のVNCのパスワード: archarm #任意
Would you like to enter a view-only password ? y

ホームボタンを押す( Android Terminal Emulator は終了させない )
androidVNC起動

パスワード archarm
アドレス localhost
ポート 5900
色数 24-bit color

接続する

成功するとこんな感じ


終了するときは Android Terminal Emulatorを開いて exit

次のようにVNCで接続時に目当てのDEが起動しなかったら
/root/.vnc/中の
xfce4startup , lxstartup の内容確認
何故か最終行が
exec startxfce4 &
から
twn
に変わる事あり。適宜修正。
起動時に立ち上がっているTerminalで startlxde or startxfce4 でも起動できるけど

1度起動すればarcharm.imgとarcharm.shが一緒にさえあればどこにおいても大丈夫。
ただし移動したら再起動する。

memo:
$ adb shell
error: insufficient permissions for device
と出た時
$ adb kill-server
$ sudo adb start-server
$ adb shell

archarm-image-creator.sh の内容はスクリプトを使うより一つずつ実行するほうが良い気がする。
anthyを入れれば一応日本語入力もできる

起動時に出る command not found の回避方法がわからない。問題なく動くから無視していいのか?
ネットワークの設定に何度も失敗。適当に本家のwikiを参考にしながら適当にインストールするアプリを増やし、どれが効いたのかわからないが一応成功。
Rは動いたが、Maximaは公式レポに入っていない模様。
gnumericは動く
androidVNCの入力モードを適宜変えれば少し使いやすくなるかも。

正直実用性からは程遠いですが、なかなか面白いです。

ArchLinux on Android (chroot) Part2
続編 イメージファイルの容量を増やしOfficeなどを動かしてみた
Android で TeX がしたい
GUIが要らない場合

0 件のコメント :

コメントを投稿