Модификация корневого образа
Модификация корневого образа
В данной статье описываются два способа расширения и модификации существующего на планшете корневого образа JFFS2. Обратите внимание, что данная статья не имеет отношения к файлу root.jffs2 устройства N900, так как, несмотря на название файла, в данном устройстве не используется образ jffs2. Решение для N900 – http://talk.maemo.org/showpost.php?p=403015&postcount=3
Основы
Корневая файловая система (rootfs) планшетов хранится в формате Journalling Flash File System v2 (JFFS2). Она находится на одном из разделов чипа flash на устройстве. Кроме того, изначальную версию rootfs можно получить на официальном сайте Nokia, посвященном аппаратно-программному обеспечению.
Существуют два способа монтирования образа JFFS2:
- Сделать так, чтобы блочное устройство эмулировало Memory Technology Device (MTD) через block2mtd.
- Сделать так, чтобы память ядра эмулировала 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 и создание эталонной корневой файловой системы.
Модифицирование копии образа
Образ успешно заархивирован и скопирован. Теперь можно использовать работающий каталог $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 (хотя теоретически должна быть).
- Инсталлируйте mtd-tools с требуемым mkfs.jffs2
sudo apt-get install mtd-tools
- Выполните:
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 и эталонную корневую файловую систему, чтобы создать образ 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