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

Материал из FRUCT Maemo wiki (Russian)
(Различия между версиями)
Перейти к: навигация, поиск
(Блочное устройство эмулирует устройство MTD)
(Основной сценарий для монтирования/демонтирования JFFS2, используя блочное устройство, эмулирующее MTD)
 
(не показаны 3 промежуточные версии 1 участника)
Строка 86: Строка 86:
 
  modprobe -r mtdblock
 
  modprobe -r mtdblock
  
Или используйте [[#Основной сценарий для монтирования/демонтирования JFFS2, используя блочное устройство, эмулирующее MTD|автоматизированный основной сценарий]].
+
Или используйте [[#Основной сценарий для монтирования/демонтирования JFFS2, используя блочное устройство, эмулирующее MTD |автоматизированный основной сценарий]].
  
 
=== Архивирование и извлечение образа rootfs ===
 
=== Архивирование и извлечение образа rootfs ===
Строка 101: Строка 101:
 
[http://maemo.org/development/documentation/manuals/2-x/howto_use_flasher_rootfs/ Использование сервисной программы flasher и создание эталонной корневой файловой системы].
 
[http://maemo.org/development/documentation/manuals/2-x/howto_use_flasher_rootfs/ Использование сервисной программы flasher и создание эталонной корневой файловой системы].
  
=== Модифицирование копии образа ===
+
=== Модификация копии образа ===
 
Образ успешно заархивирован и скопирован. Теперь можно использовать работающий каталог $HOME/myRootImage, чтобы добавлять, изменять и модифицировать пакеты.  
 
Образ успешно заархивирован и скопирован. Теперь можно использовать работающий каталог $HOME/myRootImage, чтобы добавлять, изменять и модифицировать пакеты.  
  

Текущая версия на 23:42, 4 апреля 2010

[править] Модификация корневого образа

В данной статье описываются два способа расширения и модификации существующего на планшете корневого образа 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:

  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 и создание эталонной корневой файловой системы.

[править] Модификация копии образа

Образ успешно заархивирован и скопирован. Теперь можно использовать работающий каталог $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 и эталонную корневую файловую систему, чтобы создать образ 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
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты