| (32 intermediate revisions not shown) | |||
| Line 1: | Line 1: | ||
| - | ''' | + | '''NOTE!!! These instructions haven't been checked for a while, so they are likely to be broken. One known fault is that prebuilt MeeGo images use BTRFS nowadays and since Maemo 5 doesn't support it, creating an own image using ext3 is necessary. |
| - | + | '''NOTE: These instructions cover the case where user wants to chroot to a MeeGo image on the Nokia N900, when Maemo 5 is already installed.''' | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | === | + | '''Note: Following these instructions will get you chroot terminal, not MeeGo GUI. Applications can be run by typing their name but many of them will fail without other services started first.''' |
| - | Create | + | |
| - | export MEEGO_ROOT="/mnt/ | + | 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 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 | mkdir $MEEGO_ROOT | ||
| - | mount -o loop | + | 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. | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | == | + | == Chrooting into a loopback image == |
| - | + | ||
| + | Using a script to chroot into an image makes the process faster and safer. There is also a [[ARM/N900/Install/chroot_modular|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> <offset> | ||
| + | |||
| + | 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 offset from the beginning of the image can vary, so a fixed value is not possible. Offset can be found using Linux ''file'' command. | ||
| + | |||
| + | # file meego-handset-armv7l-n900-daily-mmcblk0p.raw | ||
| + | meego-handset-armv7l-n900-daily-mmcblk0p.raw: x86 boot sector; partition 1: ID=0x83, starthead 0, | ||
| + | '''startsector 1''', 3125000 sectors; partition 2: ID=0x83, starthead 133, startsector 3125001, 500000 sectors, | ||
| + | code offset 0xb8 | ||
| + | |||
| + | The part we're interested in ''file'' output is shown in bold. In this case, partition 1 starts from sector 1. To get the offset, this needs to be multiplied by 512. 512 x 1 = 512, so we should use 512 as offset in the above command line. | ||
| + | |||
| + | |||
| + | You may always execute the commands below manually, if you like, just remember that in that case you have to export all variables used. For example, instead of line 'MEEGO_ROOT=/mnt/meego' write | ||
| + | export MEEGO_ROOT=/mnt/meego | ||
| + | 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_IMAGE_OFFSET=$2 | ||
| + | MEEGO_ROOT=/mnt/meego_root | ||
| + | |||
| + | mkdir -p ${MEEGO_ROOT} | ||
| + | |||
| + | # We can't loop mount directly if image requires offset | ||
| + | # mount -o loop ${MEEGO_IMAGE} ${MEEGO_ROOT} | ||
| + | |||
| + | # TODO This can fail if /dev/loop0 already exists | ||
| + | losetup /dev/loop0 ${MEEGO_IMAGE} -o ${MEEGO_IMAGE_OFFSET} | ||
| + | |||
| + | mount /dev/loop0 ${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 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 | |
| - | umount | + | # 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 | ||
| + | |||
| + | [[Category:N900]] | ||
NOTE!!! These instructions haven't been checked for a while, so they are likely to be broken. One known fault is that prebuilt MeeGo images use BTRFS nowadays and since Maemo 5 doesn't support it, creating an own image using ext3 is necessary.
NOTE: These instructions cover the case where user wants to chroot to a MeeGo image on the Nokia N900, when Maemo 5 is already installed.
Note: Following these instructions will get you chroot terminal, not MeeGo GUI. Applications can be run by typing their name but many of them will fail without other services started first.
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> <offset>
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 offset from the beginning of the image can vary, so a fixed value is not possible. Offset can be found using Linux file command.
# file meego-handset-armv7l-n900-daily-mmcblk0p.raw meego-handset-armv7l-n900-daily-mmcblk0p.raw: x86 boot sector; partition 1: ID=0x83, starthead 0, startsector 1, 3125000 sectors; partition 2: ID=0x83, starthead 133, startsector 3125001, 500000 sectors, code offset 0xb8
The part we're interested in file output is shown in bold. In this case, partition 1 starts from sector 1. To get the offset, this needs to be multiplied by 512. 512 x 1 = 512, so we should use 512 as offset in the above command line.
You may always execute the commands below manually, if you like, just remember that in that case you have to export all variables used. For example, instead of line 'MEEGO_ROOT=/mnt/meego' write
export MEEGO_ROOT=/mnt/meego
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_IMAGE_OFFSET=$2
MEEGO_ROOT=/mnt/meego_root
mkdir -p ${MEEGO_ROOT}
# We can't loop mount directly if image requires offset
# mount -o loop ${MEEGO_IMAGE} ${MEEGO_ROOT}
# TODO This can fail if /dev/loop0 already exists
losetup /dev/loop0 ${MEEGO_IMAGE} -o ${MEEGO_IMAGE_OFFSET}
mount /dev/loop0 ${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