Обновление Linux В Устройстве На Базе Fpga-Чипа Altera Soc И Получение Доступа К Общим Ресурсам Сервера Windows



Обновление Linux в устройстве на базе FPGA-чипа Altera SoC и получение доступа к общим ресурсам сервера Windows

Недавно компания Терасич начал продавать очень интересную плату
Комплект DE0-Nano-SoC .

Он интересен тем, что за весьма скромную цену предлагает очень мощный и функционально насыщенный комплект для разработки на базе FPGA-чипа Altera Cyclone V SoC со встроенным двухъядерным процессором ARM Cortex-A9. Кроме того, производитель комплектует плату ОС Linux, развернутой на карте памяти MicroSD. Но получив в свое распоряжение эту плату, я быстро столкнулся с несколькими проблемами из-за того, что Linux собирался из исходников.

Йокто Проект .

В основном все проблемы были связаны с отсутствием публичных репозиториев, из которых можно было бы добавить в систему недостающие компоненты.

Например, чтобы получить доступ с этого устройства по сети к общим ресурсам Windows-сервера, в ядре не хватало модуля поддержки файловой системы Cifs. Поэтому в первую очередь было решено обновить ядро, заменить Yocto на более привычный Debian Wheezy и установить всё необходимое для доступа к общим ресурсам Windows-сервера.

Процесс сборки был изучен мной и с соблюдением рекомендаций от Эта статья , почему его автор Дес333 большое спасибо! Полный редизайн не входил в мои планы, поэтому было решено оставить на карте загрузчики оригинальные - из образа Linux 3.13, который шел в комплекте с платой.

Поэтому раздел с типом А2 было решено вообще не трогать.



Задания

  • Обновить ядро Linux
  • Замените RootFS на Debian 7.
  • Доработайте образ, чтобы его можно было обновлять из Интернета
  • Подключите общий каталог на сервере Windows


Сборка ядра

Так как моя основная рабочая среда в жизни — Windows, все действия по сборке Linux производились из ОС Linux Mint 17.2 Cinnamon, установленной на виртуальной машине.

1. Запускаем терминал и входим в root-режим — чтобы не вводить каждый раз команду sudo:

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

sudo -i

В данном случае /root будет нашим домашним каталогом — все будем делать в нем.

2. Скомпилируем ядро с помощью кросс-компилятора, входящего в состав Altera SoC Embedded Design Suite (EDS).

Поэтому скачиваем и устанавливаем последнюю версию пакета Altera SoC EDS. На данный момент Altera SoC EDS имеет версию 15.0. Вы можете скачать этот пакет прямо с Сайт Альтера .

Altera SoC EDS будет установлен в каталог /root/altera/15.0. 3. Установите build-essential:

apt-get install build-essential

4. Установите libncurses:

apt-get install libncurses5-dev

5. Загрузите исходники linux-socfpga из репозиториев Altera и распакуйте их в свой домашний каталог:

  • Пойдем Релизы linux-socfpga в репозиториях Altera
  • Находим нужный релиз.

    Я выбрал версию 4.1 - так как это была последняя стабильная версия на данный момент

  • Скачать архив с исходниками
  • Распакуйте исходники в свой домашний каталог.

В результате появится каталог /root/linux-socfpga-4.1 с исходниками ядра Linux версии 4.1. Поправка (11.02.2016):
Нет необходимости брать владелец и не теги и струны socfpga-* .

Например, socfpga-4.3 Здесь применяются патчи с необходимым для SoC функционалом.

Поэтому нужно идти за исходниками здесь .

Большое спасибо Дес333 за подсказку! 6. Запустите скрипт Alter, который запустит новый BASH и исправит в нем некоторые переменные среды (например, PATH).

Все действия компиляции будем проводить не выходя из этого BASH:

cd /root/altera/15.0/embedded .

/embedded_command_shell.sh

7. Создайте несколько переменных среды:

export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export LOADADDR=0x8000

8. Создайте конфигурацию по умолчанию для socfpga:

cd /root/linux-socfpga-4.1 make socfpga_defconfig

Это создаст файл конфигурации .

config, предназначенный для компиляции для ARM. 9. Добавляем недостающие компоненты в конфигурацию ядра (или удаляем ненужные):

make menuconfig

Откроется псевдографическое окно с меню.



Обновление Linux в устройстве на базе FPGA-чипа Altera SoC и получение доступа к общим ресурсам сервера Windows

Нам нужно добавить драйвер файловой системы КИФС - иметь возможность доступа к общим сетевым ресурсам.

Есть два способа добавить драйвера в систему — добавить их непосредственно в ядро или добавить в виде внешних плагинов.

Итак, пойдем по тропинке Файловые системы -> Сетевые файловые системы , давай встанем Поддержка CIFS и нажмите пробел напротив строки Поддержка CIFS должно появиться письмо М - это означает, что будет использоваться подключаемый внешний модуль.

Позже вам нужно будет скомпилировать его отдельно и поместить в каталог внешних модулей.

Если еще раз нажать пробел, буква М изменится на символ звездочки, что означает, что драйвер будет встроен непосредственно в ядро.

Примечание : позже при проверке работоспособности системы выяснилось, что внешний модуль cifs зависал при попытке копирования файла с общего диска на Windows-сервере.

Драйвер cifs, встроенный в ядро, работал совершенно нормально.

Хотя при использовании внешних модулей с другими версиями ядра (например, 3.19) таких проблем не возникало.

Я так и не смог понять причину происходящего.

Также необходимо включить поддержку ХайМем - иначе система не сможет использовать верхние 256 мегабайт оперативной памяти.

Для этого мы идем по пути Возможности ядра -> Поддержка большого объема памяти а также нажмите пробел.

Выйти из меню - нажать ВЫХОД пока мы не уйдем.

На вопрос - нужно ли сохранять конфигурацию - отвечаем Да .

10. Скомпилируем ядро:

make uImage

В моем случае виртуальной машине было отдано только одно ядро.

Процесс компиляции занял около 20 минут. Если компиляция будет производиться на машине с несколькими ядрами, то для скорости можно распараллелить процесс компиляции на нескольких ядрах.

Для этого нужно явно задать количество ядер с помощью опции -j .

Например, для компиляции с использованием трех ядер:

make -j 3 uImage

11. Скомпилируем dtb-файл, соответствующий нашему устройству.

Если использовать старый файл dtb, то либо устройство будет зависать при загрузке, либо при работе будут жуткие глюки:

  • Ищем все файлы, в названии которых есть cyclone5 и которые заканчиваются на dts:

    find ~/linux-socfpga-4.1 -name "*cyclone5*dts"

  • Выбираем наиболее подходящий из найденных файлов.

    Я просто просматривал их содержимое и в одном из них увидел слово терасический .

    Я подумал, что это самый подходящий файл для этого устройства - вот и воспользовался им.

    Файл назывался socfpga_cyclone5_sockit.dts .

  • Начинаем компилировать socfpga_cyclone5_sockit.dtb:

    make socfpga_cyclone5_sockit.dtb

В результате компиляции было создано два файла:

/root/linux-socfpga-4.1/arch/arm/boot/zImage /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb

12. Если на этапе настройки вы выбрали вариант использования внешних модулей, то вам необходимо их скомпилировать.

Компиляция модуля КИФС :

make M=fs/cifs

и скомпилируйте модули шифрования — они понадобятся при монтировании общих ресурсов Windows:

make M=crypto

13. Копируем на карту файлы ядра и dtb. Изначально карту обрезали так, чтобы ядро и файл DTB находились на отдельном разделе FAT32. Сюда мы пишем эти файлы.

Единственное замечание: файл DTB нужно переименовать так, чтобы он имел то же имя, что и тот, который уже находится в FAT32-разделе карты:

  • Подключаем карту к виртуальной машине.

    Мне пришлось использовать внешний кард-ридер, подключенный напрямую к порту USB2 компьютера.

    Через встроенный в компьютер картридер сделать то же самое почему-то не удалось.

    Также не удалось подключить к виртуальной машине внешний картридер, если он был подключен через порт USB3.

  • Разделы карты будут автоматически смонтированы — размонтировать разделы через графический интерфейс невозможно, поскольку в этом случае картридер будет полностью отключен от виртуальной машины.

  • Посмотрим на названия смонтированных разделов:

    mount

    Мы увидим что-то вроде этого:

    /dev/sdb1 on /media/user/F725-1429 type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2) /dev/sdb2 on /media/user/41cad05c-898e-49a3-9d00-02b92fa817ba type ext3 (rw,nosuid,nodev,uhelper=udisks2)

    Раздел типа vfat (первая строка) — это то, что нас интересует на данный момент.
  • Посмотрим, что находится на разделе vfat:

    ll /media/user/F725-1429

    Мы видим что-то вроде этого:

    -rw-r--r-- 1 user user 1164128 Apr 20 20:23 de0_nano_soc.rbf -rw-r--r-- 1 user user 15274 Jul 26 17:08 socfpga.dtb -rw-r--r-- 1 user user 176 Apr 20 19:59 u-boot.scr -rw-r--r-- 1 user user 3371472 Jul 29 16:50 zImage

    Итак, файл dtb называется socfpga.dtb.
  • Копируем наши файлы на карту:

    cp /root/linux-socfpga-4.1/arch/arm/boot/zImage /media/user/F725-1429/ cp /root/linux-socfpga-4.1/arch/arm/boot/dts/socfpga_cyclone5_sockit.dtb /media/user/F725-1429/socfpga.dtb



Сборка файловой системы

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

Соберем Debian 7 Wheezy: 1. Установите пакеты, которые понадобятся для сборки файловой системы:

apt-get install debootstrap qemu-user-static binfmt-support

2. Создайте каталог и загрузите в него все необходимые файлы:

cd /root mkdir debian7 debootstrap --arch armel --foreign wheezy debian7 http://ftp.debian.org/debian

3. Для запуска приложений, созданных для архитектуры ARM, мы будем использовать qemu статический .

Для этого скопируйте файл в нашу директорию debian7:

cp /usr/bin/qemu-arm-static debian7/usr/bin/

4. Перейдем к нашей новой файловой системе:

chroot debian7 /bin/bash

5. Если подсказка интерпретатора изменится на «У меня нет имени!@имя_хоста:/#», значит, все прошло успешно.

Завершаем процесс сборки:

/debootstrap/debootstrap --second-stage

6. Б /etc/inittab оставьте следующие строки:

/etc/inittab id:5:initdefault: si::sysinit:/etc/init.d/rcS ~~:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin S:2345:respawn:/sbin/getty 115200 console

7. Установите пароль для учетной записи root:

passwd

8. Упаковываем новую файловую систему в архив:

tar -cpzf debian7.tar.gz --exclude=debian7.tar.gz /

9. Выходим из chroot:

exit

10. Размонтируем, а затем форматируем раздел ext3 на карте (названия разделов см.

в пункте 13 сборки ядра):

umount /dev/sdb2 mkfs.ext3 /dev/sdb2

11. Смонтируйте раздел ext3:

mount /dev/sdb2 /mnt/

12. Распаковываем архив с файловой системой на карту в раздел ext3:

tar -xzf /root/debian7/debian7.tar.gz -C /mnt/

13. Если при сборке ядра был выбран вариант использования внешних модулей, то нужно записать на карту внешние модули, скомпилированные на 12 этапе процесса сборки ядра:

cd /mnt/lib mkdir modules mkdir modules/4.1.0 mkdir modules/4.1.0/extra mkdir modules/4.1.0/kernel mkdir modules/4.1.0/kernel/crypto cp /root/linux-socfpga-4.1/fs/cifs/cifs.ko .

/modules/4.1.0/extra/ cp /root/linux-socfpga-4.1/crypto/*.

ko .

/modules/4.1.0/kernel/crypto/

14. Размонтируем разделы:

umount /dev/sdb1 umount /dev/sdb2

Вот и все — карта готова, можно устанавливать ее в устройство и загружаться.



Финальная отделка

После загрузки устройства дорабатываем образ на месте: 1. Войдите в Debian на устройстве, подключившись к нему через встроенный последовательный порт. 2. Если при сборке ядра был выбран вариант использования внешних модулей, то необходимо сгенерировать файлы с информацией о внешних модулях ядра:

depmod -a

3. Добавьте в список репозиториев репозиторий Debian 7 (я добавил немецкий сервер):

echo "deb http://ftp.de.debian.org/debian wheezy main" > /etc/apt/sources.list

4. Подключите устройство к сети Ethernet. Получаем адрес по DHCP:

dhclient -4 eth0

5. Поднимаем NTP, так как при неправильном времени смонтировать общие ресурсы не получится:

apt-get update apt-get install ntp

6. Установите наш часовой пояс:

dpkg-reconfigure tzdata

7. Чтобы убедиться, что все прошло успешно, смонтируйте общий ресурс сервера.

Например, в моем случае я сделал это так:

mount //192.168.48.4/distrib /mnt -o username=jok40

8. Установите SSH-сервер.

Использовать последовательный порт неудобно, так как при работе через него вводимые команды переносятся в начало строки после достижения 80-го столбца:

apt-get install openssh

9. Назначаем статический адрес интерфейсу eth0 — чтобы в дальнейшем было проще подключаться к устройству по SSH. Для этого отредактируйте файл интерфейсов:

nano /etc/network/interfaces

В моем случае это стало выглядеть так:

# interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback # The primary network interface allow-hotplug eth0 iface eth0 inet static address 192.168.48.27 netmask 255.255.255.0 gateway 192.168.48.1 network 192.168.48.0 broadcast 192.168.48.255 auto eth0

10. Отредактируйте файл resolv.conf, чтобы DNS-клиент работал нормально:

nano /etc/resolv.conf

Добавьте к нему строки:

nameserver 192.168.48.1 nameserver 8.8.8.8

11. Перезагрузите устройство.

12. Проверить, что все сделано правильно подключаемся к устройству по SSH через Ethernet:

Обновление Linux в устройстве на базе FPGA-чипа Altera SoC и получение доступа к общим ресурсам сервера Windows

Всем спасибо за внимание! Теги: #linux #настройка Linux #soc #FPGA #pls #FPGA #pls #altera #altera #embedded

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.