Hello World для ядра Linux на Cubieboard2

Одноплатники упорно продолжают входить в нашу жизнь. Кто-то использует их как медиацентры, кто-то как умные роутеры, кто-то как компы.
Тематика ресурса обуславивает необходимость попытаться применить имеющийся одноплатник как очень жирный микроконтроллер, на котором можно реализовать кучу всего интересного. В сторону подобного применения движение тоже есть, тот же RaspberyPI в SO-DIMM.
Но у обычного RaspberryPI портов выведено маловато. Да и по ресурсам он не шик. Другое дело Cubieboard2. Тут и 2 ядра, и оперативы побольше, и флешка своя есть, и выводов целых 96 штук. Все ниже описанное будет работать и для Cubieboard (1) и после напилинга на других платках с Allwiner A10/20.

Сегодня мы поближе познакомимся с Cubieboard2, подготовим ОС и запустим Hello World.

На кого рассчитано и уровень вхождения

Статьи рассчитаны на людей, уже имевших опыт использования линукса и программирования под ним, так же нужен опыт программирования МК на Си.
Т.е. чтобы было понятно о чем речь, необходимо чтобы вы не пугались и примерно представляли о чем речь, когда слышите слова: ядро, модуль, страница памяти, Makefile, gcc, код на Си, указатель, адрес, регистр, GPIO, прерывания, таймер.

Cubieboard

Тут уже был обзор Cubieboard-а. Но он был беглый и без технических подробностей. Начнем с описания того что имеем в железе:
Первым делом стоит скачать мануал на сам проц(найти в инете или у меня): Allwiner A20.
Так же полезна страничка, где расписаны какие функции и на каких выводах висят.
Здесь описаны только порты, выведенные на штыри. Так же удобно для поиска нужных выводов.
Схема самой платы так же есть на сайте.
Вообоще говоря linux-sunxi.org — сайт порта ядра Linux для Allwiner, поэтому там очень многое есть по работе с нашей платкой.
А вот и расположение выводов картинкой прямо на плате:
Cubieboard2 pinout
Тут мы видим, что все отлично: у нас выведено и +5В и земля и 3.3В, и все это с кучей выводов, которые можно использовать. Единственная досада — разъем с шагом 2.0 мм. Надо покупать у китайцев.
Рабочее напряжение выводов: 3.3В
Допустимый ток вывода в зависимости от настроек от 10 до 40 мА.

Но все же брать более 10 мА прямиком от проца я бы не стал.
В сети продаются и «материнки» для cubieboard, позволяющие легко подключить камеру на OV7670, датчики температур и др. Все это гуглится и используется, мы же начнем с низов и будем писать софт для нашей уникальной железяки(об этом чуть позднее). Поэтому особенности использования GPIO через стандартные средства я в данном цикле статей опущу дабы не переписывать интернеты.

ОС

С железом все ясно, посмотрим на софт. Это или Android или порт Linux. Андроидом пусть пользуются на медиацентрах, а мы разрабатываем умную железку, поэтому это будет Linux. Линукс это может быть любой. Совсем. Главное чтобы были установлены заголовочные файлы ядра. Я некоторое время пытался подцепить Lubuntu, Cubieez и пр, но ничего хорошего не вышло. И тут я вспомнил про любимый Archlinux. Установка у него как всегда геморная. В итоге получили рабочий образ Linux на флешке. Иксов там изначально нет. Там нет даже wget и links. Их надо будет поставить, но это позже. Зато в репах есть пакеты для установки заголовочных файлов ядра!
Образ 4Гб флешки для быстрой установки Archlinux
В качестве терминала я использую putty. Подключим Cubieboard через Ethernet и через SSH подключимся: логин root, пароль root. Изначально включен DHCP, поэтому IP-шник смотрим на роутере. Или придется поднять DHCP-сервер, чтобы Cubieboard получил адрес. Ну или открыть на флешке файл /etc/netctl/eth0 и отредактировать, настроив статические IP.
Description='A basic static ethernet connection'
Interface=eth0
Connection=ethernet
IP=static
Address=('192.168.51.77/16')
Gateway='192.168.1.1'
DNS=('192.168.1.1')

## for DHCPv6
#IP6=dhcp
## for IPv6 autoconfiguration
#IP6=stateless
ExecUpPost='/usr/bin/ntpd -gq || true'

Когда на Cubiebоard появился доступ в интернет, в консоли пишем:
pacman -Syu

Обновляем локальный репозиторий и ставим новые пакеты современного релиза Archlinux. Здесь придерживаются rolling-release, поэтому численных версий у Арча нет. Соглашаемся на установку нажав «Y». Подробнее о использовании менеджера пакетов pacman здесь.
ставим инструменты сборки:
pacman -S gcc make

Ставим заголовочные файлы:
pacman -S linux-sun7i-headers

Ставим wget чтобы качать архивы с исходниками, и sunxi-tools — набор утилит для конфигурации системы, tar — работа с архивами, а nano — текстовый редактор.
pacman -S wget sunxi-tools tar nano

возможно какие то из этих пакетов уже стоят, их переустановка ничего не сделает, а какие пакеты доставлял уже точно не помню
На этом подготовка окончена, можно приступать к написанию Hello World для ядра.
Но сначала посмотрим какие средства работы с железом уже есть.

Настройка железа средствами ОС

Основной мануал по теме — Fex Guide
Собственно в установленном арче в папке /boot лежит файл script.bin — в нем хранятся настройки железа, это своеобразный BIOS.
переведем его в читабельный формат:
bin2fex script.bin script.fex

и откроем:
nano script.fex

При необходимости можете попытаться исправить что-нибудь. Например в блоке:
[leds_para]
leds_used = 1
leds_num = 2
leds_pin_1 = port:PH20<1><default><default><0>
leds_name_1 = "green:ph20:led1"
leds_pin_2 = port:PH21<1><default><default><0>
leds_name_2 = "blue:ph21:led2"
leds_default_1 = 0
leds_trigger_1 = "none"
leds_default_2 = 0
leds_trigger_2 = "heartbeat"

заменить
leds_default_1 = 0

на
leds_default_1 = 1

Непонятно почему, но изначально в конфиге 2 раза прописан блок [leds_para]. Повтор удалим, оставив только 1 блок.
выходим из nano по Ctrl+X и сохраняем изменения
При экспериментах очень стоит сохранять старый конфиг, мало ли где ошиблись…
cp script.bin _script.bin

запускаем преобразование текста обратно в бинарный файл настроек
fex2bin script.fex script.bin

и перезагружаемся
reboot

О боже, да у нас же загорелся зеленый светодиод!
Вообще говоря названия в script.fex говорящие, поэтому задание на дом:
настроить светодиоды так, чтобы зеленый горел тем чаще, чем выше загрузка ядра cpu0, а синий — cpu1
При подключении оборудования стоит помнить, что некоторые выводы могут быть настроены в специфичные режимы. Поэтому содержимое этого файла надо контролировать, чтобы не нарваться на конфликты в используемых выводах.

Hello World для ядра

По теме есть отличная книга:
Модули ядра Linux. Олег Цилюрик.
там же есть архив с исходниками примеров. качаем его:
wget http://rus-linux.net/MyLDP/BOOKS/Moduli-yadra-Linux/Kexamples.BOOK.tgz
tar -xvf Kexamples.BOOK.tgz

переходим в папочку с примером:
cd Kexamples.BOOK/first_hello/

собираем пример(благо Makefile уже написан автором книги):
make

и загружаем модуль:
insmod hello_printk.ko

Теперь открываем сообщения ядра командой dmesg и если все хорошо то увидим в конце
[485.125615] Hello, world!
Число в скобочках в начале — время относительно момента включения
чтобы выгрузить модуль пишем
rmmod hello_printk

обращаем внимание, что при загрузке надо писать расширение, т.к. мы указываем на файл. При выгрузке пишем только имя модуля, т.к. модуль зарегистрирован в ядре и выгружается по имени, а не по имени файла.
В сообщениях ядра теперь
[ 485.125615] Hello, world!
[ 2456.438238] Goodbye, world!
Посмотрим в исходник:
#include <linux/module.h>

MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" );

static int __init hello_init( void ) {
   printk( "Hello, world!\n" );
   return 0;
}

static void __exit hello_exit( void ) {
   printk( "Goodbye, world!\n" );
}

module_init( hello_init );
module_exit( hello_exit );

тут у нас все просто, две функции, помеченные __init и __exit — все очевидно, функции выполняемые при инициализации и выгрузке модуля.
Эти макросы указывают в какой секции располагается код. При этом код этих функций удаляется из памяти после выполнения.
Макросы module_* ниже указывают какая функция должна выполняться при старте, а какая при выгрузке модуля. При этом сами функции должны быть определены перед этими строками, иначе произойдет ошибка при компиляции.
макросы MODULE_* — указывают дополнительную информацию о модуле. Так в примере указана лицензия и автор. Тут могут еще указываться версия, описание, поддерживаемые устройства, другие имена модуля.
Использовать MODULE_LICENSE( «GPL» ) необходимо, т.к. иначе при попытке использовать какой-либо функционал ядра модуль не загрузится и будет выдано предупреждение.
printk — аналог функции printf для вывода сообщений, но для пространства ядра. Она печатает сообщение в буфер сообщений ядра, который можно просмотреть командой dmegs.
При этом использование большинства «стандартных» библиотек Си недоступно. Доступны только те функции, которые встроены в ядро. Происходит это из-за различий в линковке(связывании модулей): приложения линкуются с библиотеками, а модули — только с ядром. Просмотреть доступные функции ядра можно командой(их много и у каждого ядра они, вообще говоря, отличаются):
/proc/kallsyms

Так же стоит помнить что у нас общий с ядром стек и наши переменные постоянно занимают память и не выгружаются. Тоесть рекурсию использовать не стоит, а чтобы хранить массивы надо предварительно выделять для них память. Работа с числами с плавающей точкой так же недоступна из модулей, т.к, вопервых, это не место для вычислений, во вторых функции работы с плавающей точкой не экспортируются ядром. Но это уже тонкости, о них тоже позже.

Заключение

На этом пока остановимся. Ничего платформо-зависимого и конкретного мы сегодня не сделали, а лишь подготовили площадку для дальнейших развлечений, да собрали вместе все источники информации. Советую полистать предложенную книгу, т.к. перепечатывать ее смысла нет, а использовать примеры из нее в качестве основы для новых модулей удобно. Там же расположен основной материал по программированию модулей, я же опишу программирование в контексте реализации реальных задач для конкретной платы. В основном по этой книге я сам недавно начинал разбираться. Так же хороший материал в Драйверы устройств Linux, Третья редакция
UPD: нашлись еще полезные ссылки:
Драйвер HD44780 через LPT
Перевод The Linux Kernel Module Programming Guide

В следующей статье будет уже реальный модуль работы с АЦП.
Скорее всего многое осталось упущено из внимания, поэтому жду вопросы в комментариях.

  • +15
  • 03 августа 2014, 11:17
  • kest

Комментарии (66)

RSS свернуть / развернуть
Отличный пост, актуальная тема. Мне скоро тоже придет плата от китайских товарищей.
Только с другим процессором, А8.
0
На Allwiner A10? Или чья-то еще?
0
Статейка супер!
Пешите еще, пусть люди вылазят из срача в соседней теме. Уже скоро 8 тис. коментов.
0
ниче, еще немного и скоро гет 8192 там возьмем )))
0
Немного не понял, что вы имели ввиду? ))
0
2 в 13 степени :) = 8192
0
«гет» — это давняя забава во флудогенерирующих топиках. цель в том, чтобы запостить пост (да что со мной такое последнее время?) с «красивым» круглым номером.
0
Если брать правила имиджборд, то не просто пост, а пост, содержащий этот самый номер. Т.е. если запостить пост с текстом «8192 гет!» и он будет 8192-м — то это гет, а остальные варианты (просто пост с номером 8192 или пост с таким текстом, но не 8192-й) — не гет.
0
ну в общем да.
0
хотя что-то там накал страстей утихает, меня даже начинают посещать сомнения что и до 8к доживет…
0
Пост отличный, сам все еще порываюсь написать модуль SPI для cubieboard2. Hello world и его компиляцию я осилил по книге LDD3, разобрался даже с GPIO, но когда дело дошло до DMA и прерываний, пришлось лезть в дебри исходников, где я и заблудился.
0
Так а SPI аппаратный есть же, драйвер стандартный мне запустить удавалось. Правда не использовал, только осцилом посмотрел выдает ли то что пишешь — выдавал.
Прерывания и таймеры я осилил(DMA пока даже не смотрел), но пока не описал(начал в черновиках), т.к. занимаюсь повышением быстродействия GPIO (2Mhz маловато) и с RMW доступом… В ARM ассемблере похоже нет инструкций побитового доступа к регистрам. Вам это как-то удалось с GPIO решить?
0
Надо будет глянуть, раньше SPI был только для cubieboard1. С GPIO я особо не игрался. Я думаю, что из ядра можно дергать выводы гораздо быстрее 2 МГц даже без ассемблера, однако для этого нужно временно залочить ядро.
0
Спасибо огромное!!! как раз в тему. Уехав из города с войной кинул в сумочку кубик первый Думаю времени много будет как раз и позанимаюсь и тут вот и статейка. В тему!
0
Однако. Я подобное решение видел в рефлектометрах exfo но там на винде хр. Несколько странно в результате — функционал прибора избыточным получился и таскать мне его тяжело :)
0
Немного подумал и прошу автора описать область применения подобных устройств, кроме медиацентра.
Как я понимаю в конечном приборе должна быть или большая потребность в вычислительной мощности или очень развитый интерфейс (вспомнил принтер кенон на базе обычного компа в его недрах).
Статься про запуск ос хорошая, но лично мне не очень понятно зачем всё это.
0
Ну, если говорить о любительском применении, то да, обычно все сводится к медиацентру или «умному дому» :)

Но в промышленном – все гораздо интереснее. Подобные девайсы (я не имею ввиду именно данную плату, она больше как отладочная) дают нам «из коробки» мощные графические средства, мультимедию, сетевые возможности. И все это достаточно доступно и дешево.
Как области применения, например, из того что первым приходит в голову: современные кассовые аппараты, киоски самообслуживания, прочие «тонкие клиенты», решения для IP (видео) телефонии, цифровое видеонаблюдение и прочее, где активно используется сеть …
0
Плюс есть множество готовых модулей (драйверов) для различной периферии.
0
Ну хотябы та-же робототехника. Воткнул WiFi и камеру в USB, подключил моторчики(а вот для них уже нужны «драйвера»: аппаратные и программные.). Уже можно кататься. Далее навешивать датчики — а тут уже без драйверов не обойтись.
0
Про роботов я не подумал, да.
0
Записал образ на флешку.софтиной Hdd raw copy. Вставляю флешку в кубик и не вижу ничего ни в сети кубика ни на hdmi выходе. Если вытащить флешку то образ из nand грузится нормально. Да может по hdmi И ничего не должно быть. И еще у меня кубик первый — пойдет этот образ на нем?
0
У первого одно ядро, у второго два => ядра не совместимы, а значит и образ не пойдет
Для первого установка арча: archlinuxarm.org/platforms/armv7/allwinner/cubieboard
0
спасибо. а флешку под виндой для кубика я вряд ли смогу сделать? может есть где-то готовая сборка для кубика первого?
0
Может и есть, но для второго я арч не нашел, потому и выложил тут свой.
ЗЫ делал через виртуальную машину(с убунтой) из под винды
0
>и загружаем модуль:
>insmod hello_printk.ko
>обращаем внимание, что при загрузке надо писать расширение,
>т.к. мы указываем на файл. При выгрузке пишем только имя модуля,
> т.к. модуль зарегистрирован в ядре и выгружается по имени, а не по имени файла.

Можно использовать modprobe, и вводить только имя модуля без расширения. Кроме того, modprobe загрузит все зависимости, а insmod откажется загружать модуль, если ему что-то не хватает.
+1
можно. но для modprobe модуль надо устанавливать (копировать в опред. папку, обновлять файл зависимостей и тд). Это конечно тоже можно сделать, но модули, работающие на низком уровне обычно ни от кого не зависят и возможность разрешения зависимостей вроде как и не нужна, а необходимость указать расширение — не проблема.
0
Это конечно да, особенно если модуль простой. Если он чуть посложнее, то лучше все делать из дерева ядра и компилить модуль через
make modules
make modules_install

А тогда модуль волшебно подхватывается через modprobe.

Ну и кроме того, а подключение модулей после перезагрузки? Странными скриптами или всетаки через штатные средства?
/etc/modules
/etc/modprobe.d/
+1
подскажите этот туториал по программированию он справедлив только для арча или можно например на кубиане поиграться? Что нужно для этого? gcc b make поставить? Нашел образ флешки для а10 но он кривой какой-то. При попытке апдейта на конфликт баз данных ругается
0
В большинстве своем для всех Линуксов справедлив. С небольшими вариациями на тему Имеется ввиду уже как именно грузить эти самы драйвера в рабочей системе и где что лежит. КОмпиляция и правила создания едины насколько мне известно.
0
справедлив для всех. но есть одно НО. ни в linaro, ни в кубиане(конкретно кубиан не проверял, cubieez проверял) вы не сможете установить заголовочные файлы одной командой «pacman -S linux-sun7i-headers». Я пытался на других дистрах завести, но у меня не получилось.
Т.е. поставить gcc и make это даже не пол дела. Самое главное — установить заголовочные файлы.
0
Я конечно понимаю что это наглость… :-) Но все ж. Вы часом не выложили Вашу rootfs с уже установленными заголовочными файлами? Или Вы компилячите все на хост машине указав пути на Линукс?
Просто я с ужасом успоминаю как я занимался сексом с Малинкой ставя под Дебиан на Малинке эти самые заголовочные файлы… Кстати в Арче они встали без вопросов с полпинка.
И опять таки под iMX6 мне не удалось их установить. Это касается rootfs Ubuntu. Но я начинающий и возможно криворучка.
0
потому я арч и выбрал, что на других дистрах просто не получилось. скорее всего помимо конфигурирования и сборки надо было это новособранное ядро и ставить со всеми модулями… вобщем увидел я что в арче это все так легко делается и забил.
мои исходники не помогут вам для другого дистра или другой платы. версии должны абсолютно полностьб совпадать. иначе модуль даже если скомпилируется — не загрузится
0
Я потому и просил rootfs целиком. :-)
0
а в этих заголовках как раз и находится все по кубику для компилятора? верно?
0
В этих файлах то что может пригодится для компиляции модулей. И строго говоря не только их. Хотя прямо скажем отлаживаться лучше на удаленной большой машинке. Как и компилироваться. И все такое. Причем компилировать можно прямо для целевой платформы и потом запускать программу на целевой платформе отлаживая на хост-машине. Но это касается обычных пользовательских программ. С модулями такое не прокатит я думаю. Хотя компилировать модуль можно на хост машине а потом переносить его на целевую платформу и смотреть что страшного он с ней сотворил. :-)
0
можно установить заголовочные файлы ядра которое в кубике на обычном линуксе и собирать на полноценном компе. так и делают с ядром и стандартными модулями, ибо на кубике долго оч.
0
скажите а можно на кубике приложения графикой запускать ну например красивый интерфейс управления умным домом или вендинг-автомат какой-нибудь с красивым интерфейсом графическим. То пока смотрю что кубики медиаплееры что не особо то интересно. Вот Ваша первая статейка где с кубиком что-то интересное делают — сервомашинка, ацп. И если графику можно на нем то под каким софтом? под QT?
0
можно конечно. для этого надо будет установить xorg и сопустствующие программы (драйвера, граф. оболочку). в итоге получим то что получаем в стандартных прошивках типа linaro. Идеология в archlinux такая, изначально устанавливается только ядро и самый необходимый софт. все остальное ставишь сам на свой выбор и настраиваешь.
0
но и на арче это не сложно. В инете много описано как именно. Я на Малинке делал это не сложно.
0
а на каком софте графически приложения для линкс делаются? на QT? и еще вопросец драйвер графики для чипа mali уже есть стабильный
Вот как раз с чистым дистрибутивом работать это по мне. Опыта поднаберусь в линуксе.
со скрипом запускаю имидж для первого кубика. Пошли вторые сутки-) сейчас завис на:
error: failed retrieving file 'sunxi-tools-20140120-1-armv7h.pkg.tar.xz' from mirror.archlinuxarm.org: Connection time-out
warning: failed to retrieve some files from alarm
error: failed to commit transaction (download library error)
Errors occurred, no packages were upgraded.
[root@alarm ~]#
0
так у вас же интернета нет похоже. яндекс пингуется?
0
насколько знаю я QT Это некая ОБЪЕКТНАЯ т.е. С++ библиотека. Не имеющая отношения к X window. Т.е. задачи написанные с ее применением можно запускать с терминала. Вроде как это даже хорошо. ПРоц грузится меньше. Она содержит библиотеки не только для работы с графикой. Я так понимаю что можно использовать и библиотеки X-windows. А можно и просто поднять вебсервер и получить полноценную граф оболочку на смартфоне.
0
  • avatar
  • kos
  • 15 августа 2014, 22:01
дошел до момента папке /boot лежит файл script.bin — в нем хранятся настройки железа, это своеобразный BIOS.
а файлик такой не могу найти. в каком пакете он? может что-то недоставил
0
возможно для А10 чуть подругому собрано, на флешке может быть еще один раздел — первый. так вот его смонтироовать и там смотреть.
0
у меня на флешке две партиции одна линуксовая вторая фат32 что ли…
0
да точно! на первой партиции это файлик оказался…
0
Не собирается примерчик с такой ошибкой. такая папка /lib/modules/3.0.76/ есть но в ней нет bin подпапки. Она сама должна создаться или у меня чего-то не хватает из библиотек?
make -C /lib/modules/3.0.76/build M=/tmp/Kexamples.BOOK/first_hello modules
make[1]: *** /lib/modules/3.0.76/build: No such file or directory. Stop.
Makefile:10: recipe for target 'default' failed
make: *** [default] Error 2
0
как раз отсутствие папки build (и обычно с ней же headers) говорит об отсутствии заголовочный файлов. так же часто видел что вместо этих папок остаются ссылки на места где они были, судя по всему, при сборке образа
0
светодиодик замигал gcc И make стали без ошибок. А на каком этапе тогда сбой произошел то. Делал все как написано в статье
Долго мучиля с обновлением ядра но и оно в конце номрально прошло
0
pacman -S linux-sun7i-headers
но если у вас А10 то
pacman -S linux-sun4i-headers
Разные процы — разные ядра — разные исходники. не забывайте:)
0
и какое то старое ядро у вас. для А10 последнее в репах 3.4.90-2
0
у меня 3.0.76 пишет. Обновление ядра pacman делает? Либы через pacman -S linux-sun4i-headers поставил но все равно не работает. Или мне как-то еще перекомплиавать ядро нужно?
0
Linux 3.0.76 armv7l вот инфа о моей системе
0
ага в /usr/src/ нашел исходники
drwxr-xr-x 21 root root 4096 Jun 14 15:28 linux-3.4.90-4-ARCH
0
linux-sunxi.org/Linux_Kernel#Kernel_versions этим путем ставим?
или как-то содержимое /usr/src компилим?
0
зачем? у вас ядро через pacman не устанавливается и не обновляется чтоль?
Пакет linux-sun4i утанавливается?
0
пакет становится через pacman без ошибок и апдейт через Pacman -Syu тоже проходит без ошибок. Но версия после перезагрузки такая же как и была
Linux 3.0.76 armv7l. Вот и думаю может еще что-то надо делать.
0
[root@alarm first_hello]# pacman -Syu
:: Synchronizing package databases…
core is up to date
extra is up to date
community is up to date
alarm is up to date
aur is up to date
:: Starting full system upgrade…
there is nothing to do
synchronizing filesystem…
[root@alarm first_hello]# uname -mrs
Linux 3.0.76 armv7l
[root@alarm first_hello]#
0
а образ тот что где-то нашли или сами собрали по инстуркции?
Если чей-то советую таки собрать свой. У меня А10 нету, поэтому проверить не смогу никак…
0
собрал свой образ. По умолчанию hdmi выход включен? то никаких признаков жизни на выходе. или неправильный образ (но делал все по инструкции) с lili флешки.
0
выключен. и vga выключен. и воообще даже драйвера на графику никакие не стоят.
0
сетка хоть подцепиться? тогда может мой образ и рабочий-) включем в script.fex?
0
сеть да. и ssh уже поднят, root/root. Яж вроде в статье про это писал…
0
Успешно создал образ для Кубика первого поставил библиотеки настроил кросс-компиляцию в эклипсе. Уперся на установке драйверов Mali. В процессе сборки получаю ошибку — Missing library dependencies: libUMP.so.3. Хотя сам этот файл имеется. Подскажите где рыть то? Битые исходники?
0
Всем привет. Ребяты, кто-нибудь переносил Archlinux на nand Cubieboard_2? Поделитесь опытом.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.