Сборка и установка Linux Ubuntu на BeagleBone Black

Как я и обещал, в этой статье описано, как собрать и установить на плату BeagleBone Black дистрибутив Linux Ubuntu.

Для этого, кроме самой платы, понадобятся: установленный на компьютере Linux (у меня это Ubuntu 14.04), карта microSD или microSDHC (я использую последнюю, обьемом 8Гб) и кардридер. По идее, медленно и со скрежетом, можно делать это и из-под виртуальной машины, но, т.к. я терпеть не могу долго ждать, то сам я этого не пробовал.
Сразу успокою начинающих: сам процесс я проверил дважды по уже написанной мной инструкции — т.е. Вам вряд ли придется ломать себе голову над моими ошибками. Если даже при этом, в ходе выполнения описанных ниже действий, вы что-нибудь напартачите — то плата просто не загрузится с созданного Вами образа на карте памяти. Ничего страшного с установленной на вашем компьютере ОС не случится и BeagleBone Вы не сожжете.
Посему, для всех, кто готов к экспериментам — пошагово описанный процесс, лежит под катом.

Начнем… Запускаем терминал (bash) и идем в /home. Так, на всякий случай,
делается это командой:
cd ~

Для сборки ядра нам понадобится GCC. Выкачиваем его и распаковываем:
wget -c https://releases.linaro.org/14.03/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux.tar.xz
tar xf gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux.tar.xz
export CC=`pwd`/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/bin/arm-linux-gnueabihf-

Устанавливаем GCC под Ubuntu вот так:
sudo apt-get update
sudo apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386 

Если Вы используете Debian, а не Ubuntu, то установка GCC будет выглядеть несколько по-другому:
sudo apt-get update
sudo dpkg --add-architecture i386 
sudo apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386 

Под Red Hat/Centos/Fedora процедура такая:
yum install libstdc++.i686 ncurses-devel.i686 zlib.i686 

После установки неплохо было бы проверить, что мы установили:
gcc --version

У меня результат выполнения этой команды выглядел так:
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright © 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Следующим этапом выкачиваем u-boot:
git clone git://git.denx.de/u-boot.git

Идем в директорию, в которую мы его скачали:
cd u-boot/

Скачиваем патчи для u-boot и устанавливаем их:
wget -c https://raw.github.com/eewiki/u-boot-patches/master/v2014.04/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_config
make ARCH=arm CROSS_COMPILE=${CC}

Оновляем пакет «device-tree-compiler»:
wget -c https://raw.github.com/RobertCNelson/tools/master/pkgs/dtc.sh
chmod +x dtc.sh
./dtc.sh

Теперь нам очень бы не помешало в хозяйстве ядро Linux.
Идем в /home и скачиваем его туда:
cd ~
git clone https://github.com/RobertCNelson/bb-kernel.git

Переходим в папку /home/bb-kernel и запускаем сборку ядра:
cd bb-kernel/
git checkout origin/am33x-v3.14 -b tmp
./build_kernel.sh

После этого можно расслабиться (на Intel Core i7 это занимает около 20 мин)…
В ходе сборки ядра появится окно «Menuconfig», в котором можно добавлять/удалять установленные компоненты. Если ничего не менять, то и так все будет работать.

Дальше нам нужно собрать файловую систему rootfs.
Скачиваем ее:
cd ~
wget -c https://rcn-ee.net/deb/minfs/trusty/ubuntu-14.04-minimal-armhf-2014-05-07.tar.xz

Проверка контрольной суммы:
md5sum ubuntu-14.04-minimal-armhf-2014-05-07.tar.xz

в ответ, если все нормально, получаем вот такое:
2ca8170aca04ca88ca4b946844a76844 ubuntu-14.04-minimal-armhf-2014-05-07.tar.xz
после чего распаковываем rootfs:
tar xf ubuntu-14.04-minimal-armhf-2014-05-07.tar.xz

Теперь все, что мы тут наворотили, надо записать на microSD-карточку. Для этого сначала вставляем ее в кардридер и удаляем с нее все разделы:
export DISK=/dev/mmcblk0
sudo dd if=/dev/zero of=${DISK} bs=1M count=16

Создаем новую таблицу разделов:
sudo sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__
1,48,0xE,*
,,,-
__EOF__

и форматируем созданные разделы:
sudo mkfs.vfat -F 16 ${DISK}p1 -n boot
sudo mkfs.ext4 ${DISK}p2 -L rootfs

Далее монтируем разделы:
sudo mkdir -p /media/boot/
sudo mkdir -p /media/rootfs/
sudo mount ${DISK}p1 /media/boot/
sudo mount ${DISK}p2 /media/rootfs/

после чего записываем на карту памяти bootloader u-boot:
sudo cp -v ./u-boot/MLO /media/boot/
sudo cp -v ./u-boot/u-boot.img /media/boot/

Теперь создаем и открываем файл uEnv.txt:
nano uEnv.txt

В самом файле прописываем следующее:
#optargs=
#mmcroot=/dev/mmcblk0p2 ro
#mmcrootfstype=ext4 rootwait fixrtc
##Un-comment to enable systemd in Debian Wheezy
#optargs=quiet init=/lib/systemd/systemd
uenvcmd=run loadimage; run loadfdt; run mmcargs; bootz ${loadaddr} — ${fdtaddr}
Для сохранения нажимаем +, для выхода из текстового редактора +.

Копируем uEnv.txt в /media/boot/
sudo cp -v ./uEnv.txt /media/boot/

Копируем на карточку rootfs:
sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/

следом за этим копируем ядро вместе с модулями:
sudo cp -v ./bb-kernel/deploy/3.14.8-bone5.zImage /media/boot/zImage
sudo mkdir -p /media/boot/dtbs/
sudo tar xfov ./bb-kernel/deploy/*-dtbs.tar.gz -C /media/boot/dtbs
sudo tar xfv ./bb-kernel/deploy/*-firmware.tar.gz -C /media/rootfs/lib/firmware/
sudo tar xfv ./bb-kernel/deploy/*-modules.tar.gz -C /media/rootfs/

Дальше нам следует обьявить File Systems Table. Для этого правим файл fstab:
sudo nano /media/rootfs/etc/fstab

Он должен иметь такой вид:
/dev/mmcblk0p2 / auto errors=remount-ro 0 1
/dev/mmcblk0p1 /boot/uboot auto defaults 0 2
Правим файл interfaces:
sudo nano /media/rootfs/etc/network/interfaces

и добавляем в него такие строчки:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

Для того, чтобы сетевой контроллер виделся как eth0, правим файл 70-persistent-net.rules:
sudo nano /media/rootfs/etc/udev/rules.d/70-persistent-net.rules

добавляем в него вот это:
# BeagleBone: net device ()
SUBSYSTEM==«net», ACTION==«add», DRIVERS=="?*", ATTR{dev_id}==«0x0», ATTR{type}==«1», KERNEL==«eth*», NAME=«eth0»
Правим файл serial.conf:
sudo nano /media/rootfs/etc/init/serial.conf

в него дописываем:
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty 115200 ttyO0
Последний штрих:
sync
sudo umount /media/boot
sudo umount /media/rootfs


Теперь извлекаем карту памяти и вставляем ее в BeagleBone. Подключаем плату к компьютеру по USB и подключаемся к ней через SSH:
ssh 192.168.7.2 -l ubuntu

Пароль: temppwd
Если все сделали правильно, то на экране мы увидим вот такое:
Welcome to Ubuntu 14.04 (GNU/Linux 3.8.13-bone21 armv7l)

* Documentation: help.ubuntu.com/
Last login: Thu May 15 02:54:59 2014 from 192.168.7.1
ubuntu@arm:~$

На этом пока все.