Предыстория
Приобрел я себе планшет на SoC Allwinner A10 (sun4i — кодовое название процессора AllWinner A10 ARMv7-A архитектуры семейства Cortex ядро A8). Сначала игрался с ним на Android 2.x потом на 4.x, но со временем мне стало этого мало. Да еще начали выпускать миникомпьютеры на основе этой SoC с Linux на борту. Я подумал: «Хм, а чем мой планшет хуже?» и занялся делом. Как оказалось, за меня уже все сделали, и дела делать не пришлось:
- Ядро оптимизировали для данной платформы
- Загрузчик оптимизировали к этой платформе
- Вышел новый порт debian armhf.
Осталось только все это дело сконфигурирован и собрать.
Среда
Система — ArchLinux x86-64. Где найти и как устанавливать окружение для сборки описывать не буду, в интернете и так достаточно этой информации. Да и большинству это не зачем, я прикладу все необходимое собранным.«Кухня» у меня такая:
- qemu-user-static — чтобы можно было chroot'иться в rootfs, в репах не было, пришлось из репозитория debian доставать и собирать свой пакет. Все это дело необходимо для запуска arm elf исполняемых файлов на машине с другой архитектурой, в данном случае — на моей.
- gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-70) — Кросскомпилятор GCC ARM. Может и старый, но не подводит пока меня.
Процесс загрузки SoC
- brom ( ищет загрузчик в mmc, nand, usb называемый boot0 (the SPL — Second Program Loader: sun4i-spl.bin).
- boot0 (the SPL — Second Program Loader: sun4i-spl.bin) инициализирует устройства
- SPL (boot0) загружает u-boot (boot1)
- u-boot (boot1) инициализирует оставшиеся устройства и создает абстракции для аботы с «железом»
- Подгружает конфигурационный файл «железа» ( script.bin. evb.bin, mele.bin sys_config.bin) рядом с u-boot подобно initrd.
- u-boot загружает ядро.
Т.е. Загрузка начинается с SD карты, если там нету загрузчика, продолжается с NAND Flash.Согласно документации к загрузчику allwinner-uboot структура SD карты должна выглядеть таким образом:
начало | размер | описание |
0 | 8KB | Unused, available for partition table etc. |
8 | 24KB | Initial SPL loader |
32 | 512KB | u-boot |
544 | 128KB | environment |
672 | 352KB | reserved |
1024 | Free for partitions |
Сборка u-boot
Собирать не обязательно, sun4i-spl.bin u-boot.bin можно скачать здесь.
Собираем uboot-allwinner:
git clone git://github.com/hno/uboot-allwinner
cd uboot-allwinner
make sun4i CROSS_COMPILE=arm-none-linux-gnueabi-
cd ..
Запись загрузчика
Внимание, будьте осторожны, не перепутайте устройство SD карты с другими носителями. Если вы не понимаете того, что делаете, то лучше не делайте.${SD} — переменная устройства, можно заменять вручную, можно перед выполнением прописать:
export SD=/dev/sdb
#Копируем SPL (boot0) первичный загрузчик на SD
dd if=uboot-allwinner/spl/sun4i-spl.bin of=${SD} bs=1024 seek=8 conv=notrunc
#Записываем вторичный (boot1) u-boot загрузчик на SD
dd if=uboot-allwinner/u-boot.bin of=${SD} bs=1024 seek=32 conv=notrunc
Разбиваем MicroSD накопитель
Внимание, в результате операции данные на MicroSD накопители будут утеряны, сохраните все необходимое в надежное место.
- Нам нужно создать два раздела обязательно.
- Первый раздел — раздел с файлом конфигурации железа (evb.bin) и ядром (uImage). Должен начинаться с 2048 сектора, быть размером 32MB-100MB и иметь файловую система FAT ( тип раздела FAT) либо ext2/3 ( тип раздела 83 ).
- Второй раздел — раздел rootfs, собственно вся система, размер раздела желательно сделать в пределах 1GB-4GB, файловая система строго ext4, тип раздела — 83.
- Можно сделать еще swap раздел, по желанию.
- Оставшееся место используете для себя. Я создал раздел для своих данных, можно примонтировать в /home/
Вот, как я разбил свою 16GB карточку:
fdisk -l /dev/sdb
Disk /dev/sdb: 15.9 GB, 15935209472 bytes
64 heads, 32 sectors/track, 15197 cylinders, всего 31123456 секторов
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000728ca
Устр-во Загр Начало Конец Блоки Id Система
/dev/sdb1 2048 34815 16384 83 Linux
/dev/sdb2 34816 6326271 3145728 83 Linux
/dev/sdb3 6326272 31123455 12398592 83 Linux
Согласно пунктам, описанным выше, разбиваем MicroSD накопитель.Я, надеюсь, те, кто пользуется linux, умеет использовать fdisk.
fdisk ${SD}
Форматируем:
mkfs.vfat ${SD}1 -n sun4i-boot
mkfs.ext4 ${SD}2 -L sun4i-rootfs
Монтируем в нужное место:
mkdir /mnt/sun4i-boot
mkdir /mnt/sun4i-rootfs
mount ${SD}1 /mnt/sun4i-boot
mount ${SD}2 /mnt/sun4i-rootfs
Сборка ядра
Ядро можно не компилировать, я приложил снизу готовое ядро с модулями.
#Клонируем репозиторий
git clone git://github.com/amery/linux-allwinner.git
#Сборка ядра
cd linux-allwinner
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- sun4i_defconfig
#Конфигуриуем ядро
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- gconfig
Вместо gconfig можно использовать на вкус xconfig(qt интерфейс) или menuconfig (консольный интерфейс). Не забываем включить необходимые драйвера в ядро а также необходимые вам фичи. Читайте подсказки к параметрам.Советую не забыть про модули тачскрина и фс(fat, ntfs).
#Компилируем
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage modules
#Устанавливаем модули
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- INSTALL_MOD_PATH=/mnt/sun4i-rootfs
#Ядро копируем в boot раздел
cp arch/arm/boot/uImage /mnt/sun4i-boot
Установка rootfs
Как загружать с помощью debootstrap начальную rootfs описывать не буду, так как это достойно еще одной статьи. Я лучше прикладу готовую rootfs Debian Wheezy ARMHF, а вы пользуйтесь. Rootfs необходимо распаковать с сохранением атрибутов на второй раздел SD, так как таким образом сконфигурирован по умолчанию u-boot (про конфигурациию можно почитать здесь. Качаем Debian Wheezy Rootfs и распаковываем:
tar -xpf debian-wheezy-armhf-rootfs.img.tar.bz2 -C /mnt/sun4i-boot
Кстати, здесь есть и модули к ядру 3.0.36+. Также имеется lxde, slim с автозагрузкой пользователя user, network-manager, nm-applet стартует при старте сессии. Можно отредактировать /mnt/sun4i-rootfs/etc/modules.Есть вероятность, что все необходимые модули подгрузит udev, но для уверенности их можно туда прописать. Список необходимых модулей можно получить в AndroidOS через TerminalEmulator либо через ADB:
adb shell lsmod
Настройка загрузки linux
Качаем архив с содержимым первого boot раздела.И извлекаем файл конфигурации evb.bin в /mnt/sun4i-boot из архива.
tar -xf debian-wheezy-armhf-boot.tar.bz2 evb.bin -C /mnt/sun4i-boot
Если вы не собирали ядро, то собранное ядро 3.0.36+ можно тоже извлечь:
tar -xf debian-wheezy-armhf-boot.tar.bz2 uImage -C /mnt/sun4i-boot
Запуск
Все, пожалуй, готово. Мы установили систему на SD накопитель. Вставляем MicroSD карточку в картоприемник планшета и включаем его. Через 5 сек после включения должна засветиться подсветка, экран останется черным. Через несколько миинут должна загрузиться вся система.Помните, пароль по умолчанию для root — root, для user — user. Советую изменить их.Если у вас нет usb клавиатуры, то в rootfs предустановлена виртуальная клавиатура.Подключаемся к wifi сети, или используем USB Ethernet адаптер и с помощью nm-applet подключаемся к сети. Сразу же можно подключиться через ssh.Запускаем lxterminal и доставляем необходимый софт.
sudo -i
apt-get update
apt-get install vlc geany
Возможные проблемы
- Если после включения ничего не видно, возможно еще идет загрузка, подождите минуты 5. Но если, даже подсветки нет, тогда вам нужно будет заменить evb.bin своим файлом конфигурации из android прошики, который находиться на nanda.На устройстве под андроид через Terminal Emaulator либо через adb:
adb shell su mkdir /local/data/tmp/nanda mount /dev/block/nanda /local/data/tmp/nanda
Извлекаем любыми путями script.bin, я делал так:$ adb pull /local/data/tmp/nanda/script.bin evb.bin
cp evb.bin /mnt/sun4i-boot/
- Если все-таки подсветка есть, но система не загрузилась, можно просмотреть логи системы, достав MicroSD карточку из планшета и примонтировав в /mnt/sun4i-rootfs
cat /mnt/sun4i-rootfs/var/log/dmesg cat /mnt/sun4i-rootfs/var/log/Xorg.0.log
- Если же тач не работает, то нужно узнать в Android, какой модуль отвечает у вас за тач:
adb shell 'lsmod | grep ts'
и прописать его /mnt/sun4i-rootfs/etc/modules.
Заключение
Таким образом я запустил linux на своем планшете MOMO9. Система пока не настроена до конца, не мешало бы настроить тот-же laptop-mode и доставить необходимые пакеты. Времени было потрачены не мало. Но зато, собрав так систему «почти» с нуля, сразу начинаешь понимать, как работает данная ОС. Еще пополняется словарный запас специальной английской лексики, что тоже не плохо.И конечно же, я не несу никакой ответственности за то, что вы натворите у себя на ПК, за порчу оборудования. Делайте все с пониманием дела. Не перепутайте устройство SD ридера с винчестером либо другим устройством.
Автор: denis4inet
Хм, отличная статья, все сомневался что брать, китайский нетбук(под который инструкцию по установке линя давно нашел) или планшет (железо лучше, но насчет линукса, инструкцию найти не мог) Теперь скорей планшет возьму. Один вопрос, как он после этого видео воспроизводит, я пока в тему не вникал, но слышал что проблемы с этим у линохов на планшетах.