Meego Wiki
Views

ARM/N900/Install/chroot

From MeeGo wiki
(Difference between revisions)
Jump to: navigation, search
(Creating a loopback image from a tarball)
(Chrooting into a loopback image: Added missing chrooted /home unmounting; without this script failed to clean environment)
Line 43: Line 43:
Usage: ./meego_chroot.sh <path_to_meego-arm-n900-loop.img>
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 16834
 +
  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.  
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.  
Line 137: Line 148:
   umount ${MEEGO_ROOT}/tmp
   umount ${MEEGO_ROOT}/tmp
   umount ${MEEGO_ROOT}/var/run
   umount ${MEEGO_ROOT}/var/run
 +
  umount ${MEEGO_ROOT}/home
    
    
   umount ${MEEGO_ROOT}
   umount ${MEEGO_ROOT}

Revision as of 18:50, 29 May 2010

Under construction

NOTE: This instruction covers the case where user wants to chroot to a MeeGo image with the Nokia N900 device where Maemo 5 is 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.

Creating a loopback image from a tarball

Create 2GB 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 compability 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

Chrooting into a loopback image

Using a script to chroot into an image makes the process faster and safer.

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 16834
 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

Problems

If script fails for what ever 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
Personal tools