Модификация корневого образа

Материал из FRUCT Maemo wiki (Russian)
Перейти к: навигация, поиск

Модификация корневого образа

В данной статье описываются два способа расширения и модификации существующего на планшете образа root JFFS2. Обратите внимание, что данная статья не имеет отношения к файлу "root.jffs2" устройства N900, так как, несмотря на название файла, в данном устройстве не используется образ jffs2. Решение для N900 – http://talk.maemo.org/showpost.php?p=403015&postcount=3

Содержание


Основы

Файловая система root (rootfs) планшетов хранится в формате Journalling Flash File System v2 (JFFS2). Она находится на одном из разделов чипа flash на устройстве. Кроме того, изначальную версию rootfs можно получить на официальном сайте Nokia, посвященном аппаратно-программному обеспечению.

Существуют два способа монтирования образа JFFS2:

  1. Сделать так, чтобы блочное устройство эмулировало Memory Technology Device (MTD) через block2mtd.
  2. Сделать так, чтобы память ядра эмулировала MTD через mtdram.

Обратите внимание, что для конфигурации хост-ядра потребуется активировать поддержку устройства mtd, чтобы получить доступ к/активировать поддержку файловой системы jffs2.

Получение образа JFFS2

Прежде всего необходимо получить rootfs.jffs2 из официального образа FIASCO от Nokia. После загрузки образа FIASCO выполните на нем следующую команду, чтобы его разархивировать (в результате будут получены все отдельные части образа):

sudo ./flasher-3.0 --unpack  -F <FIASCO image>

Монтирование образа JFFS2

Данные команды будут выполнятся с правами root на хост-машине, а не на самом устройстве.

Блочное устройство эмулирует устройство MTD

Необходимо, чтобы были скомпилированы и инсталлированы следующие модули ядра:

Поддержка Memory Technology Device (MTD) --->

  • CONFIG_MTD ( поддержка Memory Technology Device (MTD) )
  • CONFIG_MTDBLOCK ( Кэширование доступа блочного устройства к устройствам MTD )
  • CONFIG_MTD_PARITIONS ( поддержка разбиения MTD на разделы )

Независимые драйверы устройства MTD --->

  • CONFIG_MTD_MTDRAM ( Тестовый драйвер, использующий RAM )
  • CONFIG_MTD_BLOCK2MTD ( MTD, использующее блочное устройство )

Блочные устройства --->

  • CONFIG_BLK_DEV_LOOP ( Поддержка устройства замыкания на себя )

Файловые системы --->Различные файловые системы --->

  • CONFIG_JFFS2_FS ( поддержка Journalling Flash File System v2 (JFFS2) )
  • CONFIG_JFFS2_LZO ( Расширенные возможности сжатия для JFFS2 --> поддержка сжатия LZO )

Не рекомендуется статически связывать данные модули с ядром. Более удобно иметь возможность разгрузить данные модули, когда они не нужны или при желании начать все заново с самого начала.

Для моделирования блочного устройства с контентом из образа JFFS2 будет использовано устройство замыкания на себя (/dev/loop[0-15]). Для монтирования образа JFFS2 выполните следующие действия:

mknod /tmp/mtdblock0 b 31 0
modprobe loop
losetup /dev/loop0 rootfs.jffs2
modprobe mtdblock
modprobe block2mtd
# Note the ,128KiB is needed (on 2.6.26 at least) to set the eraseblock size.
echo "/dev/loop0,128KiB" > /sys/module/block2mtd/parameters/block2mtd
modprobe jffs2
# check dmesg
mount -t jffs2 /tmp/mtdblock0 /media/jffs2
# check dmesg again - if the above mount results in any errors there is a problem...

Для демонтирования и очистки ресурсов:

umount /media/jffs2
modprobe -r block2mtd
modprobe -r mtdblock
losetup -d /dev/loop0

Или используйте автоматизированный основной сценарий.

Память ядра эмулирует устройство MTD

Обратите внимание, что для mtdram требуется 88 Мб RAM в системе 2 Гб для монтирования приблизительно 2 Мб образа initfs [Faheem Pervez on -dev ml]. Возможны проблемы с rootfs!

Используйте total_size=85892 для mtdram, если 65536 окажется слишком мало.

Тем не менее, если настаиваете: чтобы монтировать образ JFFS2, выполните следующие действия:

mknod /tmp/mtdblock0 b 31 0
modprobe mtdblock
modprobe mtdram total_size=65536 erase_size=256
modprobe jffs2
dd if=/pathtoimage/rootfs.jffs2 of=/tmp/mtdblock0
mkdir /media/jffs2
mount -t jffs2 /tmp/mtdblock0 /media/jffs2

Для демонтирования и очистки ресурсов:

umount /media/jffs2
modprobe -r jffs2
modprobe -r mtdram
modprobe -r mtdblock

Или используйте автоматизированный основной сценарий.

Архивирование и извлечение образа rootfs

Теперь образ доступен в /media/jffs2. Скопируйте весь образ в другой каталог. Данный новый каталог будет использоваться для модификации образа. Не рекомендуется расширять монтированный на текущий момент образ JFFS2. Из-за специальных файлов в /media/jffs2/dev не получиться использовать команду cp для того, чтобы скопировать образ в работающий каталог. Именно по этой причине используется расширение .tar.

cd /media/jffs2
tar cvzf /my_path/myRootImage.tar.gz .
cd $HOME
mkdir myRootImage
cd myRootImage
tar xvpzf /my_path/myRootImage.tar.gz

Повторное сжатие образа

Использование сервисной программы flasher и создание файловой системы root по сслыке

Модифицирование копии образа

Образ успешно заархивирован и скопирован. Теперь можно использовать работающий каталог $HOME/myRootImage, чтобы добавлять, изменять и модифицировать пакеты.

cd $HOME/myRootImage
dpkg -x $HOME/arm_debs/mypackage_arm.deb .

Теперь необходимо создать архив .tar из работающего каталога образа.

cd $HOME/myRootImage
tar cvzf $HOME/myNewRootImage.tar.gz .

Создание собственно образа jffs2

Описанное далее выполнялось в системе Ubuntu Hardy только для того, чтобы успешно выполнить образ initfs. Нет гарантии, что информация применима (хотя теоретически должна быть) для создания rootfs.

  1. Инсталлируйте mtd-tools с требуемым mkfs.jffs2.
 sudo apt-get install mtd-tools 
  1. Выполните:
 sudo mkfs.jffs2 -r myRootImage -o myRootImage.jffs2 -e 128 -l -n 

где myRootImage - корень новой файловой системы и myRootImage.jffs2 – название выходного файла. -e 128 определяет размер стирания равным 128 КиБ. 128 КиБ – это правильный размер стирания для initfs. Он также правильный для rootfs.

Ускорение монтирования образа jffs2

Только что созданный образ jffs2 является простым образом jffs2. Если бы надо было его прошить, все прошло бы замечательно. Но кроме этого можно использовать команду sumtool, которая делает образ JFFS2 суммарным. Суммарный образ JFFS2 монтируется быстрее, чем несуммарный.

Для этого просто:

sumtool -i <input jffs2 image> -o <output jffs2 image> -e 128KiB -l -n

Инсталляция на планшет

После создания нового архива .tar используйте flasher и файловую систему root по ссылке, чтобы создать образ JFFS2 из myNewRootImage.tar.gz.

Используйте flasher для инсталляции образа на планшет.

./flasher-3.0 -r rootfs.jffs2 --f -R

= Основной сценарий для монтирования/демонтирования JFFS2, используя блочное устройство, эмулирующее MTD

Создайте основной сценарий (mount_jffs2.sh) из следующего:

 #!/bin/sh
 JFFSIMG=$1 # jffs image
 LOOP="/dev/loop1" # loop device
 MP="/media/jffs2" # mount point
 MTDBLOCK="/tmp/mtdblock0" # MTD device file
 KVER="2.6"
 BLKMTD="block2mtd"
 UMNT=""

 echo "$0" | grep unmount_ >/dev/null 2>&1
 [ $? -eq 0 ] && UMNT=1
 if [ $# -gt 1 -a x"$2"x = x"unmount"x ]; then
   UMNT=1
 fi

 uname -r | egrep '^2\.6' >/dev/null 2>&1
 if [ $? -ne 0 ]; then
   KVER="2.4"
   BLKMTD=blkmtd
 fi 

 if [ x"${UMNT}"x = x""x ]; then
   if [ ! -b ${MTDBLOCK} ] ; then
     mknod ${MTDBLOCK} b 31 0 || exit 1
   fi
   lsmod | grep loop >/dev/null 2>&1
   if [ $? -ne 0 ]; then
     modprobe loop
     [ $? -ne 0 ] && echo "loopback loading failed" && exit 1
     sleep 1
   fi
   losetup ${LOOP} ${JFFSIMG} || exit 1
   sleep 1
   modprobe mtdblock
   if [ x"${KVER}"x = x"2.4"x ]; then
     modprobe ${BLKMTD} device=${LOOP} || exit 1
   else
     modprobe ${BLKMTD} || exit 1
     echo "${LOOP}" > /sys/module/block2mtd/parameters/block2mtd
   fi
   sleep 1
   modprobe jffs2
   [ ! -d ${MP} ] && mkdir -p ${MP}
   mount -t jffs2 ${MTDBLOCK} ${MP} || exit 1
 else
   umount ${MP}
   if [ $? -ne 0 ]; then
     echo "Cannot unmount JFFS2 at $MP" && exit 1
   fi
   modprobe -r jffs2
   modprobe -r ${BLKMTD}
   modprobe -r mtdblock
   sleep 1
   losetup -d ${LOOP}
 fi 

Убедитесь, что команда chmod a+x выполнена в отношении mount_jffs2.sh, чтобы выполнился основной сценарий.

Использование:

./mount_jffs2.sh rootfs.jffs2

Данный сценарий можно также использовать для демонтирования и разгрузки не используемых модулей ядра и возвратной ссылки:

./mount_jffs2.sh rootfs.jffs2 unmount

Основной сценарий для монтирования/демонтирования JFFS2, используя память ядра, эмулирующую MTD

Создайте основной сценарий (mount_jffs2.sh) из следующего:

 #!/bin/sh
 JFFSIMG=$1 # jffs image
 MP="/media/jffs2" # mount point
 MTDBLOCK="/tmp/mtdblock0" # MTD device file
 UMNT=""

 echo "$0" | grep unmount_ >/dev/null 2>&1
 [ $? -eq 0 ] && UMNT=1
 if [ $# -gt 1 -a x"$2"x = x"unmount"x ]; then
   UMNT=1
 fi

 if [ x"${UMNT}"x = x""x ]; then
   if [ ! -b ${MTDBLOCK} ] ; then
     mknod ${MTDBLOCK} b 31 0 || exit 1
   fi
   modprobe mtdblock
   modprobe mtdram total_size=65536 erase_size=256
   modprobe jffs2
   dd if=${JFFSIMG} of=${MTDBLOCK}
   [ ! -d ${MP} ] && mkdir -p ${MP}
   mount -t jffs2 ${MTDBLOCK} ${MP}
 else
   umount ${MP}
   if [ $? -ne 0 ]; then
     echo "Cannot unmount JFFS2 at $MP" && exit 1
   fi
   modprobe -r jffs2
   modprobe -r mtdram
   modprobe -r mtdblock
 fi 

Убедитесь, что команда chmod a+x выполнена в отношении mount_jffs2.sh, чтобы выполнился основной сценарий.

Использование:

./mount_jffs2.sh rootfs.jffs2

Данный сценарий можно также использовать для демонтирования и разгрузки не используемых модулей ядра:

./mount_jffs2.sh rootfs.jffs2 unmount
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты