Mobile Rails Dev 03/31/2010
I promise this won’t turn into an android blog, but I discovered something neat and I wanted to share it.
The goal for any mobile phone I use is to allow me to leave the office. Being a freelancer I work every day, but sometimes us developers want a social life. The real problem is when ever we go out, there’s a good chance that a client will call. Most of the time, they just need to ask a question or get some help, but every once in a while there is an emergency, that needs your attention right away. The ability to respond quickly in those circumstances can make a huge difference. No one wants to here, “I will get yo your site in 6 hours when I get home.”, when what they need is “Ok, its back up. I will look into what caused the problem A.S.A.P.
Keeping that level of customer service used to mean dragging my laptop everywhere I went. Sure SSHing to a server to fix a problem from your cell is nice, but what if you need to do something more then restarting a service. What if you need to cap deploy, or make a change then git push it.
While I had my blackberry, the solution I chose was to keep my laptop with me at all times, then I could tether when the need arose, fix the problem and be done. But this also limited where I could go.
With the G1 I can go where I please, their 3G network makes SSHing fast and with the instructions below I can even do dev from my G1. It’s of course no where near as swift as my laptop, but in those few emergency cases, it works and most importantly, I can leave my laptop at home.
Prep Work
Your going to need four things to complete this projects.
- A larger SD Card (I used the 4GB version of this one, you will also need a way to see it on your PC)
- A game (Here ya go)
- A linux
- A G1
Lets install some applications to get the Android side ready to go. Of course this is the swt I run with, you can use what you like.
- Time Tracker
- Task Manager for Root
- Skype (if you use skype)
- ConnectBot
- Linda File Manager
- Task Switcher
- Terminal Emulator
- Text Edit
Root Your Phone (Full Directions)
- Downgrade to RC29
- Gain root access using the telnetd trick
- Upgrade to RC33
Prepair The SD Card
- Change the partition type to FAT32 (some may not need this change). Make sure you change the device correctly. Also note that I am running this from my Linux box. You can format from your G1 as well.
sudo fdisk /dev/mmcblk0
- Format the card. You should do this to the card rather you had to change the partition type or not. It helps remove any junk put on by the manufacturer.
sudo mkfs.vfat -F 32 /dev/mmcblk0p1
Prepair the phone a little
- Enable Wifi, it’s not really needed but it will make this a lot easier.
- Plug into power source, again just to make life easy.
- Install the applications above if you haven’t already. Most importantly the terminal editor.
Building the Debian Image
- get the sd card mounted on the computer again
- Make a 1GB disk image
dd if=/dev/zero of=mobilerails.img bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 18.9066 s, 56.8 MB/ - get debootstrap
sudo apt-get install debootstrap
- format the image
mke2fs -F mobilerails.img
- mount the image
mkdir mobrails
sudo mount -o loop mobilerails.img mobrails/ - Build the boot strap
sudo apt-get install debootstrap
sudo debootstrap --verbose --arch armel --foreign lenny mobrails http://ftp.de.debian.org/debian - Play a game until that finishes
- Unmount the image
sudo umount mobrails
- Create the following directory structure on the root of the sdcard
- /mobilerails
- /mobilerails/image
- /mobilerails/share
- /mobilerails/bin
- copy the mobilerails.img to sdcard/mobilerails/image
Create the following files in /mobilerails/bin/
- create a new file on the sd card /mobilerails/bin/fsrw.sh
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
echo "Filesytem remounted as read/write"
echo "Courtesy of http://www.androidfanatic.com"
echo "Installer by Mark Walker (ghostwalker)"
#Based on Saurik's remount.sh - modified by Mark Walker of http://www.androidfanatic.com - create a new file /mobilerails/bin/install.sh
sh fsrw.sh
clear
cat fsrw.sh > /data/local/bin/fsrw.sh
cat prepsys.sh > /data/local/bin/prepsys.sh
cat stopsys.sh > /data/local/bin/stopsys.sh
cat entersys.sh > /data/local/bin/entersys.sh
cat firsttime.sh > /data/local/bin/firsttime.sh
cd /sdcard/mobilerails
chmod 4777 *
cd /data/local/bin/
chmod 4777 *
echo " "
echo "Make sure you run firsttime AFTER you run prepsys"
echo " " - create the file /mobilerails/bin/prepsys.sh
clear
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
echo "Android Filesytem remounted as read/write"
export kit=/sdcard/mobilerails
export bin=/data/local/bin
export mnt=/data/local/mnt
export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH
export TERM=linux
export HOME=/root
modprobe ext2
mknod /dev/loop2 b 7 0
mount -o loop,noatime $kit/image/mobilerails.img $mnt
mount -t devpts devpts $mnt/dev/pts
mount -t proc proc $mnt/proc
mount -t sysfs sysfs $mnt/sys
mount $kit/share $mnt/share -o bind
#no idea why we need this
sysctl -w net.ipv4.ip_forward=1 - create sdcard/mobilerails/bin/entersys.sh
export TERM=linux
export mnt=/data/local/mnt
chroot $mnt /bin/login - create sdcard/mobilerails/bin/stopsys.sh
busybox umount -f /data/local/mnt/dev/pts /data/local/mnt/proc /data/local/mnt/sys /data/local/mnt/share /data/local/mnt
busybox losetup -d /dev/block/loop2 - create sdcard/mobilerails/bin/firsttime.sh
export mnt=/data/local/mnt
chroot $mnt /debootstrap/debootstrap --second-stage
echo 'deb http://ftp.de.debian.org/debian lenny main' > $mnt/etc/apt/sources.list
echo 'nameserver 4.2.2.2' > $mnt/etc/resolv.conf
chroot $mnt passwd
chroot $mnt /bin/bash
The actual Install
- umount the sdcard and get it back over to the G1
- open terminal
- run some commands
cd /sdcard/mobilerails/bin
sh install.sh
prepsys.sh
#fix the link up errors
cd /data/local/mnt
mkdir share
mkdir dev/pts
cd /sdcard
stopsys.sh - The last 10% of the debian install. You should now be su under the “normal” terminal. i.e. not inside debian.
prepsys.sh
firsttime.sh - play a game
- When the bootstrapping is done enter a root password (just for the debain system)
Post Install System Configuration
Ok now we are at a bash prompt. We don’t want to do too much though, just get some stuff setup inside the image.
- First we are going to need some swap space, but we want it to exist outside our image.
dd if=/dev/zero of=/share/swap bs=1M count=256
mkswap /share/swap - Just because your in a chroot deb environment doesn’t mean you won’t effect the android kernel. Lets get those two sharing
rm -f /etc/mtab
mount -t devpts devpts /dev/pts
mount -t proc proc /proc
mount -t sysfs sysfs /sys
ln -s /proc/mounts /etc/mtab - Now we can mount our swap image
swapon /share/swap
- check and make sure we are sill sane
mount
free -m - Ok, now lets add a normal user
adduser coteyr
exit - Now we are back in our android environment, lets fix it so that swap is turned on and off ever time we stop and start the deb environment.
vi /sdcard/mobilerails/bin/prepsys.sh
#add
chroot $mnt swapon /share/swap
#somewhere twords the endvi /sdcard/mobilerails/bin/stopsys.sh
#add
export mnt=/data/local/mnt
chroot $mnt swapoff /share/swap
# at the very top - Reinstall the scripts
cd /sdcard/mobilerails/bin/
sh install.sh - Stop the system
stopsys.sh
- Make sure that the swap file exists outside the image
cd /sdcard/mobilerails/share
ls - check that we have no left over mounts (that aren’t supposed to be there. umount them if you do)
mount
- Now, just to be really nice reboot the phone and make a backup of the mobilerails directory on your computer
Now for Rails
Ok phone is back up. Next we need to get a dev enviroment up and running.
- Now lets get the sdcard back in the phone
- start up the terminal
- become root
su
- mount the debian system
prepsys.sh
- At this point the debian system is running along side the android system the android can’t really see debian and debian can’t really see the android (at least not without browsing by hand). We want to keep it this way, though there are other ways, but keeping our dev environment separate is safer. lets entersys.sh
entersys.sh
- login and then the fun starts
- lets get us some sudo
su
apt-get update
apt-get install sudo
visudo - make your changes then exit(if you don’t know how to setup sudoers read the comments in that file)
- lets leave root….
exit
- and start installing ruby at el.
sudo apt-get install ruby irb rdoc git-core libopenssl-ruby
- play your game again
- lets install rubygems the right way*That would be an opinion*
wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
tar -xzf rubygems-1.3.1.tgz
cd rubygems-1.3.1
sudo ruby setup.rb
#ri and rdoc take forever so just play a game
sudo gem1.8 install rails --no-ri --no-rdoc - Next were going to want to generate some ssh keys for our git repo
cd
ssh-keygen - get them into your repo (I will leave this step up to you, everyone has diffrent methods)
- Lets make our Projects directory and lets git a project
cd
mkdir Projects
cd Projects
git clone ssh://git@someserver.com/ReallyCoolProject
cd ReallyCoolProject
script/server - now we can go over to our browser and hit localhost:3000 (you installed task switcher right?)
Final Thoughts
Editing can be done from the terminal via vi or nano or you can use one of the editors from the android side. If you use the android side you should be able to see the debian system in /data/local/mnt/.
Few quick things to remember.
- The loop device is a bit fragel. Don’t yank out your sdcard wiout unmounting it first.
- Make frequent backups of the mobilerails directory. It will corupt if the phone crashes(or is turned off) and it is mounted.
- I wouldn’t run with the system prep-ed all the time because of the above problems.
- Keep your debian system and your android system separate unless your really sure you know what your doing.
- Protect your phone and sdcard, you just gave whoever stole your phone read and write access to your git repo
- The system wiill run slower when your running webrick. Kill it if you don’t need it for a while.
- Sqllite is fine, mysql would be fun (bad fun).
- Your G1 can see that swap space, be aware of that.
- Permissions wont copy across the two systems. Make sure that you remember that if you edit or create a file outside the debian system.
- Your not running a VM, it’s just a chrooted environment. That means any kernel level things will be seen by everyone. Try not to insmod or such inside the image, unless you really really know what your doing.
- If your tenminal exits, then you loose your chrooted environment. but you can just entersys.sh again.