Coolpad W770 ext3パーティションのマウント
W770にTouchDownをインストールして暫く使っていたら、/dataパーティションを使い切ってしまってにっちもさっちもいかなくなってしまった。そこで「仙石浩明の日記」の記載にあるように、起動時のext3パーティションを起動時にマウントするようにしてみた。
W770の/etcの下を見てみると、以下のようなファイルが存在している。
- inand_mount.sh
- inand_umount.sh
内容的には起動時に/dev/block/mmcblk1pXのパーティションを/data/app,/coolpad,/gpsdataの各ディレクトリにマウント・アンマウントするスクリプトになっている。init.rcの内容を見てみると、残念ながらこれらのスクリプトは実行されていないようだ。しかし、前述の記載にあるように、起動時に実行されているスクリプトがいくつかある。
- udisk_rm.sh
- install-recovery.sh
そこで、”inand_mount.sh”の内容を修正して起動時に/dev/block/mmcblk0p2を/system/extにマウントするようにして、”udisk_rm.sh”から呼び出すようにしてみたところ、上手く動作した。
あとはadbから以下のようにして/data/appを/system/extの下に移動し、シンボリックリンクを張っておいた。
# mount -o rw,remount /dev/block/mtdblock5 /system # cd /data # cp -rp ./app /system/ext # mv app app.org # ln -s /system/ext/app ./app
/data/data同様に移動してみたが、なぜかSelectNetがDisk容量が足りないとエラーメッセージを出してセレクトできなくなってしまったのであきらめた。またこの設定だけだと/system/extがシャットダウン時にアンマウントされないらしいので、自動的にアンマウントできるようにしないと危ない。この件について「余談ですが……」に/system/bin/shutdownを修正してアンマウントする方法があるが、W770にはそもそも該当ファイルが無いのでこの方法は使えない。何か方法を見つけないと駄目。
また、作業中一度W770が起動中しなくなったので注意!起動のアニメーション中にリスタートがかかって無限ループに入ってしまった。起動が終了していないためか、ADBでもsuが使えずお手上げ。結局Volume UpとVolume Downを同時に押しながらPower ONしてリカバーモードに入れて復帰した。このモードでは中国語でメッセージがでるが、HOMEボタンを押せば先に進み、Volume Up/DownでRecoveryを選択してHOMEで決定でOKだった。
tu-sonさんから”DroidSail Super App2SD Lite”が使えるとの情報を頂いているが(感謝!)、できればrootを解除した状態で使用したいのでもう少し調べる予定。
udisk_rm.sh
#!/system/xbin/sh echo "clear udisk ....." busybox rm -rf /udisk/* /system/etc/inand_mount.sh /dev/block/mmcblk0
inand_mount.sh
#!/system/xbin/sh
#INAND_DEV=/dev/block/mmcblk1
INAND_DEV=$1
PART=$2
if [ "$2" = "" ] ; then
# for all partitions.
PART=0
fi
if [ "$INAND_DEV" = "" ] ; then
echo "argument error!"
echo "usage: $0 <dev-path> [partition-number]"
echo " e.g: $0 /dev/block/mmcblk1 2"
echo " mount the second partition on device /dev/block/mmcblk1."
exit 1
fi
#key: yulong.mount.inandp1
MOUNT_RES_PROP=yulong.mount.inand
BOOT_REASON=`getprop ro.yulong.boot.reason`
LOG_FILE=/tmp/mount.log
# ======================================
# convert resoult .
covert_ret()
{
case "$1" in
0) ret=1
;;
?) ret=0
;;
esac
return $ret
}
# check & wait device ready.
# $1: <devname>
wait_device()
{
dev_chk=1
dev_name=$1
chk_cnt=0
echo "waitting for $dev_name ready ..."
while [ "$dev_chk" != "0" ]
do
dev=`ls $dev_name` > /dev/null 2>&1
dev_chk=$?
setprop ${MOUNT_RES_PROP}.waitdev $chk_cnt
chk_cnt=`busybox expr $chk_cnt + 1`
if [ "$dev_chk" != "0" ] && [ $chk_cnt -lt 120 ] ; then
sleep 1
else
break
fi
done
echo "check $INAND_DEV ok!"
}
#==========================
# mount point for ext3.
# $0 <dev_name> <mount_point> <check> <fstype>
# return 1: successful ,0 faliure
mnt_part()
{
mnt_dev=$1
mnt_point=$2
chk=$3
fstype=$4
# check if point was mounted?
mnt=`cat /proc/mounts |busybox grep $mnt_point`
if [ "$?" = "0" ] ; then
echo "mount-point:$mnt_point is exist!"
# assume success.
return 1
fi
if [ "$fstype" = "ext3" ] ; then
if [ "$chk" = "true" ] ; then
echo "check $mnt_dev ..."
e2fsck -p $mnt_dev
fi
mount -t ext3 -o rw,nosuid,nodev $mnt_dev $mnt_point
else
# vfat
if [ "$chk" = "true" ] ; then
echo "check $mnt_dev ..."
fsck_msdos -p -f $mnt_dev
fi
mount -t vfat -o utf8,errors=continue $mnt_dev $mnt_point
fi
echo -e "==== mount $mnt_point at:`date +%Y-%m-%d**%H:%M:%S`====" >> $LOG_FILE
covert_ret $?
ret=$?
return $ret
}
#==============================================
checkfs=false
if [ "$BOOT_REASON" = "excep_rtc" ] || [ "$BOOT_REASON" = "excep_press_poweron" ] || [ "$BOOT_REASON" = "excep_recovery" ]
then
checkfs=true
fi
echo "====begin mount:$INAND_DEV==`date +%Y-%m-%d**%H:%M:%S`====" >> $LOG_FILE
# wait device ready.
wait_device ${INAND_DEV}
echo "====device ready:`date +%Y-%m-%d**%H:%M:%S`====" >> $LOG_FILE
# mountting...
echo "mounting..."
#-----
mnt_part ${INAND_DEV}p2 /system/ext $checkfs ext3
setprop ${MOUNT_RES_PROP}p2 $?
echo -e "====end mount all:`date +%Y-%m-%d**%H:%M:%S`====\n" >> $LOG_FILE
コメントを残す