Сборка программ Squirrel

Squirrel — это пакет, позволяющий с минимальными затратами труда собрать свежие тулчейн и rootfs под многие архитектуры, в том числе и под Ingenic.

Сначала нужно поставить зависимости на систему; сейчас это только ruby (не важно, 1.8 или 1.9.x), компилятор, autotools и git для установки.
Для Debian-подобного дистрибутива это делается командой

sudo apt-get install autotools build-essential libtool git ruby

Далее, нужно установить Squirrel. Так как кодовая база все еще довольно сильно меняется, релизов пока нет, и все делается через git. Команды:

$ git clone git://git.whitequark.org/squirrel/squirrel.git
$ cd squirrel
$ git clone git://git.whitequark.org/squirrel/qbuilds.git qbuilds

Теперь нужно добавить настройки для нашей платформы и собрать внутренние зависимости (pkg-config и opkg, если быть точным):

$ cat >etc/squirrel.conf
CROSS_COMPILER = 'mipsel-jz-linux-uclibc'
THREADS = 2 # Number of cores + 1
$ ./squirrel bootstrap

Теперь все готово для сборки тулчейна (достаточно свежего, на момент написания текста это gcc 4.5.1 и последняя uclibc 0.9.31). Тулчейн собирается так:

$ ./squirrel build xz0032-linux[headers] uclibc gcc[tools] # Toolchain

После того, как эта команда успешно отработала, в каталоге tools/ лежит тулчейн; для работы ему нужно установить переменные окружения PATH и LD_LIBRARY_PATH, что делается автоматически при сборке пакетов из Squirrel; кроме того, можно получить настроенный шелл, запустив ./squirrel shell.

Squirrel собирает т.н. qbuild-ы (некоторый аналог ebuild-ов Gentoo), в результате чего получаются .opk-пакеты (некоторый аналог .deb-пакетов). Базовая система состоит из скелета файловой системы по FHS, libc (в данном случае uclibc) и набора утилит, например, busybox. Сборка:

$ ./squirrel build fhs-layout network-base busybox upstart dropbear

Новая Squirrel умеет собирать архивы с рутовой ФС при помощи fakeroot самостоятельно. Делается это так:

$ ./squirrel buildroot tgz network-base busybox upstart dropbear

В результате создается файл rootfs.tgz.

Смысл создания архива с rootfs заключается в том, что в архиве сохраняются права доступа к файлам, их владельцы, а так же файлы устройств. Вся эта информация жизненно необходима для запуска системы. Однако, в нашем случае «сырой» образ не предоставляет никаких средств для входа в систему и потому совсем не пригоден для работы. Придется его слегка перебрать.

Для того, чтобы получить доступ к содержимому [на запись] и не потерять сопутствующую информацию, придется использовать пакет fakeroot. Его можно установить в хост-системе или же запустить оболочку Squirrel (команда ./squirrel shell), в которой fakeroot тоже доступен.

Итак, распаковываем только что созданную rootfs куда-нибудь:

$ fakeroot
# mkdir rootfs
# tar xvf rootfs.tgz -C rootfs

В качестве init используется upstart. Для того, чтобы получить какой-нибудь доступ, можно сделать следующее:
  1. Добавить файл rootfs/etc/init/usb-network.conf, который поднимет сеть и даст возможность зайти по SSH (по умолчанию root создается без пароля):
    description "Set up USB networking"
    start on startup
    console output
    task
    script
    ip link set usb0 up
    ip addr add 10.0.0.2/8 dev usb0
    ip addr
    end script
  2. Создать файл rootfs/etc/ttys и написать в нем, например, /dev/ttyS0 57600, чтобы получить возможность логина с консоли на UART-e.

Все вышеперечисленное, очевидно, делается в fakeroot.

Дальше нам потребуется пакет mtd-utils для хостовой системы (в нем есть mkfs.ubifs):

$ ./squirrel build mtd-utils[tools]

Теперь можно, собственно, собирать rootfs:

# mkfs.ubifs -r rootfs -m 2048 -e 258048 -c 256 -R 4MiB rootfs.ubifs
# cat >ubinize.ini
[root]

mode=ubi
image=rootfs.ubifs
vol_id=1
vol_size=64MiB
vol_type=dynamic
vol_name=root
vol_alignment=1
^D
# ubinize ubinize.ini -m 2048 -p 262144 -o rootfs.ubi

Результат пригоден для прошивания при помощи jzboot.

Comments