11 марта 2014

Установка Mono 3 на SoC семейства Allwinner A10/A20, на примере Cubieboard2

C#
Из песочницы
Tutorial
Здравствуйте,

В данной статье собрана информация из разных источников, по переводу плат семейства Cubieboard из категории бесполезной игрушки. В отладочную площадку для продвинутого C# разработчика.

Это Linux, Это Hardcore детки


Что нам нужно, SD карта, размером не менее 2 GB.
И собственно само перепрофилируемое устройство, в моем случае это Cubieboard2

Сперва нужна уже установленная на Nand и работающая система. В моем случае это был lubuntu-server-13.08-v1.06. Так как оттуда понадобится один маленький, но очень важный файл. Больше данная система никак не используется.
Если хотите написать что то типа «Hello C# world on Linux», то этого вам достаточно, так как в состав данной системы входит пакет на основе mono версии 2.10.8.1. К сожалению в данной версии есть несколько неприятных багов, которые не позволяют сделать что то более серьёзное.
А кто говорил что будет легко, это… Собственно что то я уже повторяюсь.

Поэтому продолжаем.
Вот здесь: https://romanrm.net/a10/debian скачиваем инсталляшку для вашего SoC'a.
Почему эту? Потому что это одна из немногих, где система установлена по необходимому минимуму, без кучи первоначально ненужных пакетов.

Распаковываем и записываем её на SD карту.
Под Linux это можно сделать одной командой: bzip2 -dc a20-debian-server-2gb*.bz2 > /dev/sdX
Где /dev/sdX путь к вашей SD карте.

Под Windows распаковать можно например при помощи 7Zip, а записать на SD карту при помощи win32diskimager.

Вставляем SD карту в устройство и загружаемся. Для особого типа устройств, например MK802 необходимы дополнительные шаги по установке загрузчика, но мне этого делать не пришлось.

Нужно иметь локальный доступ к устройству, например монитор + клава, или я воспользовался адаптером USB-UART TTL 3.3V, параметры 115200/8/N/1. Так как сеть в данный момент еще не работает.
Входим в систему имя/пароль: root/password

Монтируем нашу Nand и копируем оттуда тот самый маленький, но очень важный файлик.
cp /boot/script.bin /boot/script.bak
mount /dev/nanda /mnt
cp /mnt/script.bin /boot/
umount /dev/nanda
sync

Чтобы не искать каждый раз устройство по необЪятной домашней сети, так как в устройствах собранных на A20, разработчики не удосужились присвоить устройству ликвидный MAC адрес, и после каждой перезагрузки он генерируется случайно, соответственно DHCP сервер назначает другой IP.

Прописываем ему в файлик /etc/network/interfaces следующее:
auto lo
iface lo inet loopback

auto eth0
# for DHCP
#iface eth0 inet dhcp
# hwaddress ether c0:b0:c0:a8:1:f5

# Static IP
iface eth0 inet static
 hwaddress ether c0:bo:c0:a8:1:17
 address 192.168.1.23
 network 192.168.1.0
 netmask 255.255.255.0
 broadcast 192.168.1.255
 gateway 192.168.1.1
 nameserver 192.168.1.1

Генерируем новые ключи для SSH сервера, изменяем пароль root'a
rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
passwd
reboot

После перезагрузки можно подключиться к системе нашим любимым SSH клиентом.

Обновляем систему до актуального состояния, устанавливаем локали и время
apt-get update
aptitude dist-upgrade
dpkg-reconfigure locales
dpkg-reconfigure tzdata

Если вы используете SD карту размером более 2GB, то имеет смысл расширить раздел с данными на всю карту.
Делается это следующим образом, на примере уже переразмеченного диска:
root@debian:/dev# fdisk /dev/mmcblk0

Command (m for help): p

Disk /dev/mmcblk0: 8018 MB, 8018460672 bytes
4 heads, 16 sectors/track, 244704 cylinders, total 15661056 sectors
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: 0x000cb560

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048      127071       62512    e  W95 FAT16 (LBA)
/dev/mmcblk0p2          131072    15661055     7764992   83  Linux

смотрим где у нас расположен 2 раздел. Важно сохранить начальный адрес. В моем случае это был 131072.

удаляем раздел с данными, не пугайтесь мы их не удаляем физически, даже если в этот момент что то пойдет не так. Ничего страшного не случится. Так как данные на диск еще не записаны.
Command (m for help): d
Partition number (1-4): 2

Создаем новый раздел
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2):
Using default value 2
First sector (127072-15661055, default 127072):

Вот здесь важно не ошибиться и не согласиться с значениями по умолчанию, а ввести ранее записанное значение первого сектора раздела.
First sector (127072-15661055, default 127072): 131072
Last sector, +sectors or +size{K,M,G} (131072-15661055, default 15661055):
Using default value 15661055

Проверяем, что все правильно и записываем изменения в таблице разделов. Понадобится перезагрузка.
Command (m for help): p

Disk /dev/mmcblk0: 8018 MB, 8018460672 bytes
4 heads, 16 sectors/track, 244704 cylinders, total 15661056 sectors
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: 0x000cb560

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048      127071       62512    e  W95 FAT16 (LBA)
/dev/mmcblk0p2          131072    15661055     7764992   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

Теперь необходимо собственно сообщить системе, что она может использовать все свободное пространство под раздел
resize2fs /dev/mmcblk0p2
И проверяем
root@debian:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.3G  746M  6.3G  11% /
....skip....


Уф, теперь начинается самое интересное.
Так как для armv7l отсутствует официальный порт, по крайней при попытке установить, сообщает, что mono-runtime отсутствует в списке доступных пакетов. Нам необходима экспериментальная версия.

Для начала нам нужно перевести систему с стабильной ветки wheezy на sid + experimental.
Приводим файл /etc/apt/sources.list к следующему виду
deb ftp://ftp.debian.org/debian experimental main
deb ftp://ftp.debian.org/debian sid main contrib non-free

Далее все стандартно
apt-get update
apt-get dist-upgrade
reboot

Ну и собственно из за чего затевался весь этот сыр-бор
root@debian:~#apt-get -t experimental install mono-devel
....skip....
root@debian:~# uname -a
Linux debian 3.4.79-r0-s20-rm2+ #54 SMP Tue Feb 18 01:09:07 YEKT 2014 armv7l GNU/Linux
root@debian:~t# mono -V
Mono JIT compiler version 3.2.8 (Debian 3.2.8+dfsg-4)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  armel,vfp+hard
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            sgen
Теги:cubieboarddebianmono 3manual
Хабы: C#
+9
7,5k 34
Комментарии 2
Похожие публикации
Flutter Developer
до 160 000 ₽КлючМосква
Разработчик C#
от 170 000 ₽TennisiМоскваМожно удаленно
.NET C#/Blazor Developer
от 3 000 до 4 000 $Hand2NoteМожно удаленно
Developer C#
от 100 000 до 180 000 ₽АМ-интеллектуальные технологииМожно удаленно
Senior Backend Developer (C#, .net)
от 200 000 ₽Wärtsilä Digital TechnologiesСанкт-Петербург
Лучшие публикации за сутки