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

от автора

Здравствуйте,

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

ссылка на оригинал статьи http://habrahabr.ru/post/215399/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *