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