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
コメントを残す