В идеале это должен быть многопроцессорный сервер, но технически это будет работать и на виртуалке под эмуляцией (разумеется на порядок медленнее).
Вообще существует несколько вариантов сборки системы под себя, они отличаются кросс сборкой и нативной сборкой.
Кросс сборка это когда физически для компиляции используется процессор другой архитектуры ( под arm компилим на x86 или x86_64)
Нативная сборка это когда физически над компиляцией трудится сам mini2440 (файловая система при этом может быть по сети или SD)
По понятным причинам нативная сборка самая медленная, я её отбросил сразу же.
С другой стороны скорость нативной сборки сопоставима с кросс компиляцией из под одно-ядерного линукса x86 запущенного в виртуалке - поэтому кой чего не очень большое можно собирать и на mini2440 это тема другой статьи
Кросс сборка в свою очередь бывает выполненной посредством кросс компиляторов и сборкой из под эмулятора процессора.
Сборка кросс компиляторами самая быстрая но систему на ней полноценную собрать - ещё та задача для продвинутых программистов разработчиков. Дело в том что в состав системы входит много пакетов которые в процессе сборки выполняют серию тестов запуском только что собранного кода. По понятным причинам мы выполнить такие тесты не можем - бинарник под другой проц. Есть методы обхода этого ограничения, но всегда это уникальный подход, отдельные патчи и много много потраченного времени. Есть и другого рода сложности вроде фиксированных в коде путей линковки библиотек - получается arm бинарник с библиотеками x86... В общем это путь для супер продвинутых разработчиков.
Кросс сборка эмуляторами существуют программы которые позволяют эмулировать нужный нам процессор или даже таргет систему, например qemu
Эмуляция процессора qemu-{архитектура} дает возможность запускать бинарники другой архитектуры находясь в хостовой системе непосредственно.
Этот путь я избрал для сборки своей системы, он позволяет получить особенности таргет архитектуры процессора без привязки к аппаратной части и что самое главное - использовать ВСЕ ядра (аппаратные) для сборки.
Эмуляция устройства qemu-system-{таргет устройство}
Позволяет запустить виртуальную машину эмулирующую требуемую платформу.
Этот путь хорош тем что позволяет работать в рамках органичений присутствующих в системе (объемы RAM NAND, порты).
Позволяет запустить загрузчик и проверить его работу, влить kernel и т.д. НО автоматически получаем все прелести ограничений при сборке, это сильно замедляет процесс.
Начну пожалуй с описания эмуляции устройства:
Эмуляция mini2440 через qemu
работать я буду в каталоге /tftproot хостовой системы, хотя это не принципиально
качаем патченый под mini2440 вариант qemu
# cd /tftproot
# git clone
конфигирим и устанавливаем
# cd qemu_src
# ./configure —prefix=/tftproot/qemu --target-list=arm-softmmu
# make -j3
# make install
каталог /tftproot/qemu теперь содержит необходимые бинарники для запуска
для подключения виртуальной mini2440 нам потребуется бридж интерфейс
! обращаю внимание что перенастройка сети должна вестись с локальной консоли хост системы !
вносим правки в /etc/conf.d/net
# mcedit /etc/conf.d/net
- Код: Выделить всё
bridge_br0="eth0"
config_eth0=( "null" )
config_br0=( "dhcp" )
dhcpcd_br0="-t 10"
RC_NEED_br0="net.eth0"
brctl_br0=( "setfd 0" "sethello 1" "stp off" )
# cd /etc/init.d && ln -s net.lo net.br0
# rc-update add net.br0 default
# /etc/init.d/net.eth0 stop && /etc/init.d/net.br0 start && /etc/init.d/net.eth0 start
нужен вспомогательный скрипт подъёма интерфейса эмулятора mini2440
# mkdir -p /tftproot/etc/ && mcedit /tftproot/etc/qemu-ifup
- Код: Выделить всё
#!/bin/sh
modprobe tun
ifconfig $1 0.0.0.0 promisc up
brctl addif br0 $1
# chmod og+x /tftproot/etc/qemu-ifup
ну и главный скрипт запуска эмулятора
- Код: Выделить всё
#!/bin/bash
base="/tftproot"
echo Starting in $base
name_nand="$base/mini2440_nand.bin"
name_snapshots="$base/mini2440_snapshots.img"
kernel="$base/uImage"
ifup="$base/etc/qemu-ifup"
if [ ! -f "$name_nand" ]; then
echo $0 : creating NAND empty image : "$name_nand"
dd if=/dev/zero of="$name_nand" bs=528 count=131072
fi
if [ ! -f "$name_snapshots" ]; then
echo $0 : creating empty snapshot image : "$name_snapshots"
qemu-img create "$name_snapshots" 100MB
fi
cmd="/tftproot/qemu/qemu-system-arm \
-M mini2440 $* \
-drive file=$name_snapshots,snapshot=on \
-serial stdio \
-kernel ${kernel} \
-mtdblock "$name_nand" \
-show-cursor \
-usb -usbdevice keyboard -usbdevice mouse \
-net nic,vlan=0 \
-net tap,vlan=0,ifname=tap0,script=${ifup} \
-monitor telnet::5555,server,nowait"
cd $base
echo $cmd
$cmd
особенности:
u-boot.bin должен быть без поддержки LCD (без сплеш патча)
и обязательно ! Лежать в каталоге ./mini2440
после запуска виртуалки работа как с обычной бордой:
MINI2440 # nand scrub
MINI2440 # nand createbbt
MINI2440 # mtdparts
MINI2440 # dynpart
MINI2440 # dynenv set u-boot_env
MINI2440 # saveenv
MINI2440 # setenv ipaddr 192.168.1.130
MINI2440 # setenv serverip 192.168.1.205
MINI2440 # setenv bootargs console=ttySAC0,115200 noinitrd init=/sbin/init mini2440=3tbc nfsroot=192.168.1.205:/tftproot/rootfs root=/dev/nfs rw ip=192.168.1.130
MINI2440 # setenv bootcmd 'tftpboot 32000000 uImage ; bootm'
MINI2440 # saveenv
MINI2440 # nand erase kernel
MINI2440 # tftpboot 0x32000000 uImage
MINI2440 # nand write.e 0x32000000 kernel
MINI2440 # reset
Сборка в эмуляции через qemu
ну и самая интересная часть моей статьи - как я делаю сборку сам
статья про такую сборку есть в документации gentoo (английский)
нужно подготовить ядро для того чтобы оно распознавало иной формат бинарников (опция CONFIG_BINFMT_MISC=m или CONFIG_BINFMT_MISC=y при сборке ядра системы). В сборке Calculate Linux Roboforum Build места разработчика это уже включено.
собираем обработчик кода arm (! статическая сборка обязательна для чрута)
# USE=static emerge -b1 app-emulation/qemu-user
регистрируем обработчик в ядре (вынес в тег код потому что сложная строка)
- Код: Выделить всё
# echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register
проверяем
# cat /proc/sys/fs/binfmt_misc/arm
берём последний стейдж arm gentoo линукса и разворачиваем его для работы (ищем здесь ссылку
# wget
# mkdir /tftproot/rootfs
# tar -xvjpf stage3-armv4tl-20100718.tar.bz2 -C /tftproot/rootfs
подправим правила сборки
# mcedit /tftproot/rootfs/etc/make.conf
- Код: Выделить всё
ARCH=arm
CFLAGS="-Os -pipe -march=armv4t -mtune=arm920t"
CXXFLAGS="${CFLAGS}"
CHOST="armv4tl-softfloat-linux-gnueabi"
ACCEPT_KEYWORDS="arm ~arm"
USE="${ARCH} zlib bindist make-symlinks minimal"
VIDEO_CARDS="fbdev dummy"
INPUT_DEVICES="evdev keyboard mouse tslib"
LINGUAS="ru"
FEATURES="buildpkg getbinpkg noman noinfo nodoc ccache"
MAKEOPTS="-j9"
PORTAGE_BINHOST="http://projects.roboforum.ru/mini2440/gentoo/packages"
PKGDIR=/packages/
PORTDIR="/usr/portage"
DISTDIR="/usr/portage/distfiles"
#PORTDIR_OVERLAY="/usr/local/portage/layman/embedded-cross /usr/local/portage"
установим обработчик qemu-arm на таргет систему (при переносе на железку mini2440 его нужно будет удалить)
# cp /usr/bin/qemu-arm /tftproot/rootfs/usr/bin/qemu-arm
и скопируем минимально необходимые библиотеки для обработчика в хост систему
# mkdir -p /usr/gnemul/qemu-arm
# cp -a /tftproot/rootfs/lib/ /usr/gnemul/qemu-arm
подготовим каталоги
# cd /tftproot/rootfs
# mkdir -p usr/portage
# mkdir -p packages
# mkdir -p proc
# mkdir -p sys
# mkdir -p dev
# mkdir -p /var/run
подготовка системных каталогов для чрута
# mount --bind /usr/portage usr/portage
# mount --bind /proc proc
# mount --bind /sys sys
после выхода не забудте
# umount usr/portage
# umount sys
# umount proc
ну и погнали !
# chroot . /bin/busybox mdev -s
# chroot . /bin/bash --login
визуально ничего не изменилось но попробуйте набрать uname -a и вот оно чудо:
amper / # uname -a
Linux amper 2.6.24-gentoo-r8 #1 SMP Wed Apr 8 01:21:51 MSD 2009 armv5tel GNU/Linux
возьмите за правило всегда после чрута выполнять команду
amper / # env-update && source /etc/profile
это позволит избежать неприятных вещей с переменными окружения
возможно вам потребуется поставить переменные прокси сервера и DNS
amper / # echo "nameserver 192.168.0.30" >/etc/resolv.conf
amper / # export ftp_proxy=http://192.168.0.30:3128
amper / # export http_proxy=http://192.168.0.30:3128
ну а делее фантазия Ваша, работаем в генту линуксе
я начал с пересборки тулчейна:
amper / # emerge --synс
amper / # emerge -v1 ccache
amper / # ccache -M 2G
amper / # emerge -v1 binutils gcc glibc
сборка binutils gcc заняля около 4 часов на 8 ядерном сервере,
glibc на момент написания пока собирается
именно поэтому рекомендую пользоваться уже собранными мной бинарниками!
Все пакеты которые я успел собрать лежат тут, они же будут пытаться подтягиваться
при вышеуказанном конфиге в бинарном виде (для экономии Вашего времени сборки)
Добавлено спустя 31 минуту 55 секунд:
пример насколько это "тяжкая задача"
- Код: Выделить всё
1 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||98.1%] Tasks: 300 total, 8 running
2 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||96.8%] Load average: 4.70 6.23 5.34
3 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||99.4%] Uptime: 41 days, 01:50:21
4 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||94.2%]
5 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||96.8%]
6 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||98.1%]
7 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||94.2%]
8 [||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||98.7%]
Mem[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 2480/3953MB]
Swp[|||||||||||||||||||||||||||||||||| 1498/4102MB]
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
6107 root 20 0 141M 16816 4152 R 64.0 0.4 0:01.04 /usr/bin/qemu-arm /usr/libexec/gcc/armv4tl-softfloat-linux-gnueabi/4.4.4/cc1 -fpreprocessed /var/tmp/ccache/mkdirat.tmp.amper.6045.i -quiet
6117 root 20 0 140M 12664 3396 R 45.0 0.3 0:00.75 /usr/bin/qemu-arm /usr/libexec/gcc/armv4tl-softfloat-linux-gnueabi/4.4.4/cc1 -fpreprocessed /var/tmp/ccache/open64.tmp.amper.6053.i -quiet -
6115 root 20 0 140M 12424 3392 R 37.0 0.3 0:00.70 /usr/bin/qemu-arm /usr/libexec/gcc/armv4tl-softfloat-linux-gnueabi/4.4.4/cc1 -fpreprocessed /var/tmp/ccache/openat.tmp.amper.6057.i -quiet -
6126 root 20 0 140M 12172 3380 R 37.0 0.3 0:00.63 /usr/bin/qemu-arm /usr/libexec/gcc/armv4tl-softfloat-linux-gnueabi/4.4.4/cc1 -fpreprocessed /var/tmp/ccache/openat64.tmp.amper.6061.i -quiet
5944 root 20 0 132M 8020 1480 R 12.0 0.2 0:11.93 /usr/bin/qemu-arm /usr/bin/make -j9 subdir=io -C io ..=../ subdir_lib
6148 root 20 0 129M 4284 1460 S 5.0 0.1 0:00.12 /usr/bin/qemu-arm /usr/armv4tl-softfloat-linux-gnueabi/gcc-bin/4.4.4/armv4tl-softfloat-linux-gnueabi-gcc -c -std=gnu99 -fgnu89-inline -O2 -W
6109 root 20 0 129M 4300 1464 S 4.0 0.1 0:00.12 /usr/bin/qemu-arm /usr/armv4tl-softfloat-linux-gnueabi/gcc-bin/4.4.4/armv4tl-softfloat-linux-gnueabi-gcc -c -std=gnu99 -fgnu89-inline -O2 -W
6144 root 20 0 129M 4320 1480 S 4.0 0.1 0:00.19 /usr/bin/qemu-arm /usr/armv4tl-softfloat-linux-gnueabi/gcc-bin/4.4.4/armv4tl-softfloat-linux-gnueabi-gcc -c -I../include -I/var/tmp/portage/
6128 root 20 0 129M 4908 1784 S 3.0 0.1 0:00.10 /usr/bin/qemu-arm /bin/sh -c (echo '#define SYSCALL_NAME access'; \ echo '#define SYSCALL_NARGS 2'; \ echo '#define SYSCALL_SYMBOL __acces
30606 root 20 0 17116 2688 1168 R 1.0 0.1 0:20.19 htop
22459 root 20 0 156M 35496 3692 S 1.0 0.9 2:26.96 /usr/bin/qemu-arm /usr/bin/python2.6 /usr/bin/emerge -v1 binutils gcc glibc
6129 root 20 0 129M 4300 1464 S 1.0 0.1 0:00.12 /usr/bin/qemu-arm /usr/armv4tl-softfloat-linux-gnueabi/gcc-bin/4.4.4/armv4tl-softfloat-linux-gnueabi-gcc -c -std=gnu99 -fgnu89-inline -O2 -W
6045 root 20 0 125M 3376 1084 S 0.0 0.1 0:00.04 /usr/bin/qemu-arm /usr/lib/ccache/bin/armv4tl-softfloat-linux-gnueabi-gcc ../sysdeps/unix/sysv/linux/mkdirat.c -c -std=gnu99 -fgnu89-inline