NOTE!!! Prebuilt MeeGo images use BTRFS nowadays and since Maemo 5 doesn't support it, creating an own image using ext3 is necessary.
Under construction
NOTE: This instruction covers the case where user wants to chroot to a MeeGo image on the Nokia N900 when Maemo 5 is already installed.
One issue with a chroot installation is finding space for it. The SD card and Mydocs have plenty of space but they use FAT32 as a file system, so they can't be used directly. A solution is to mount loopback images. The easiest way to get started is to use a prebuilt loopback image.
If a prebuilt loopback image is not yet available, you can create it from a tarball.
Create 2 GB image file.
dd if=/dev/zero of=/home/user/MyDocs/meego-image bs=1024 count=2097152
Create filesystem on image file.
mkfs.ext3 /home/user/MyDocs/meego-image
Create mount point and loopback mount the image.
export MEEGO_ROOT="/mnt/meego_root" mkdir $MEEGO_ROOT mount -o loop /home/user/MyDocs/meego-image $MEEGO_ROOT
Install GNU tar (Busybox tar and GNU tar have some unfortunate compatibility problems) from Maemo Extras repository.
apt-get install tar-gnu
Check if the Meego rootfs image has an extra /SOMEDIR at a beginning of the actual system files.
gtar -tzf <meego-image>
Unpack the Meego image.
# If there was an extra /SOMEDIR at the beginning strip it away when unpacking gtar --strip-components 1 -xzf <meego-image> -C $MEEGO_ROOT # otherwise just extract the image gtar -xzf <meego-image> -C $MEEGO_ROOT
Umount the image.
umount $MEEGO_ROOT
You now have a loopback image ready to be chrooted into.
Using a script to chroot into an image makes the process faster and safer. There is also a modular way.
Copy the code below to a meego_chroot.sh script and remember to chmod +x it.
Usage: ./meego_chroot.sh <path_to_meego-arm-n900-loop.img>
Image downloaded from http://repo.meego.com/MeeGo/releases/1.0/core/images/meego-n900-open-armv7l/ contains entire hard drive, not single partition. Partition starts at byte 16384, so line mounting image
mount -o loop ${MEEGO_IMAGE} ${MEEGO_ROOT}
should be replaced by
losetup /dev/loop0 ${MEEGO_IMAGE} -o 16384
mount /dev/loop0 ${MEEGO_ROOT}
You may always execute the commands below manually, if you like. Changing the prompt is optional and you only need to do it once per image.
#!/bin/sh
GRAPHICS_LIBS="\
/usr/lib/libIMGegl.so \
/usr/lib/libglslcompiler.so \
/usr/lib/libpvrPVR2D_DRI2WSEGL.so \
/usr/lib/libsrv_um.so \
/usr/lib/libOpenVGU.so \
/usr/lib/libpvrPVR2D_BLITWSEGL.so \
/usr/lib/libpvrPVR2D_FRONTWSEGL.so \
/usr/lib/libpvrPVR2D_FLIPWSEGL.so \
/usr/lib/libpvrPVR2D_X11WSEGL.so \
/usr/lib/libOpenVG.so \
/usr/lib/libEGL.so \
/usr/lib/libPVRScopeServices.so \
/usr/lib/libpvr2d.so \
/usr/lib/libGLESv2.so"
### Prepare and mount the image ###
MEEGO_IMAGE=$1
MEEGO_ROOT=/mnt/meego_root
mkdir -p ${MEEGO_ROOT}
mount -o loop ${MEEGO_IMAGE} ${MEEGO_ROOT}
### Mount system directories ###
echo "Mounting system directories inside the chroot environment..."
mount -o bind /proc ${MEEGO_ROOT}/proc
mount -o bind /sys ${MEEGO_ROOT}/sys
mount -o bind /dev ${MEEGO_ROOT}/dev
mount -o bind /dev/pts ${MEEGO_ROOT}/dev/pts/
mount -o bind /var/lib/dbus/ ${MEEGO_ROOT}/var/lib/dbus/
mount -o bind /usr/share/fonts ${MEEGO_ROOT}/usr/share/fonts
mount -o bind /tmp ${MEEGO_ROOT}/tmp
mount -o bind /var/run ${MEEGO_ROOT}/var/run
mount -o bind /home ${MEEGO_ROOT}/home
### Setup ###
rm -f ${MEEGO_ROOT}/etc/resolv.conf
cp /etc/resolv.conf ${MEEGO_ROOT}/etc/resolv.conf
rm -f ${MEEGO_ROOT}/etc/mtab
ln -s /proc/mounts ${MEEGO_ROOT}/etc/mtab
# Prepare .bashrc for setupping chroot environment
grep -q -s MeeGo ${MEEGO_ROOT}/root/.bashrc
if [ "$?" -ne "0" ]; then
echo "# MeeGo" >> ${MEEGO_ROOT}/root/.bashrc
echo "source /tmp/session_bus_address.user" >> ${MEEGO_ROOT}/root/.bashrc
# Change the prompt - this is optional
# echo "export PS1=MeeGo-chroot:\\\w\\\\\$" >> ${MEEGO_ROOT}/root/.bashrc
fi
# Setup .bashrc for cases when sudo is used
grep -q -s MeeGo ${MEEGO_ROOT}/home/user/.bashrc
if [ "$?" -ne "0" ]; then
echo "# MeeGo" >> ${MEEGO_ROOT}/home/user/.bashrc
echo "source /tmp/session_bus_address.user" >> ${MEEGO_ROOT}/home/user/.bashrc
# Change the prompt - this is optional
# echo "export PS1=MeeGo-chroot:\\\w\\\\\$" >> ${MEEGO_ROOT}/home/user/.bashrc
fi
# Copy graphics libraries from host
for lib in ${GRAPHICS_LIBS}; do
cp ${lib} ${MEEGO_ROOT}/usr/lib/
done
# Copy pulseaudio files from host
cp /usr/lib/libpulse* ${MEEGO_ROOT}/usr/lib/
### Start your engines ###
echo -e "chrooting to ${MEEGO_ROOT}...\n"
cd ${MEEGO_ROOT}
chroot ${MEEGO_ROOT} /bin/bash
### Cleanup ###
echo "Cleaning mounts..."
cd ~
umount ${MEEGO_ROOT}/dev/pts
umount ${MEEGO_ROOT}/dev
umount ${MEEGO_ROOT}/sys
umount ${MEEGO_ROOT}/proc
umount ${MEEGO_ROOT}/var/lib/dbus/
umount ${MEEGO_ROOT}/usr/share/fonts
umount ${MEEGO_ROOT}/tmp
umount ${MEEGO_ROOT}/var/run
umount ${MEEGO_ROOT}/home
umount ${MEEGO_ROOT}
echo
If the script fails for whatever reason, it is likely that cleanup is needed afterwards.
# Check if any programs inside chroot are still running ps # Check if anything is still mounted inside chroot mount # Umount all the mounts inside chroot and remember the order # first 'umount /dev/pts' and only after that 'umount /dev' # Check used loop device losetup # Free the loop device, replace X with correct number losetup -d /dev/loopX