вторник, 6 декабря 2016 г.

Сборка ядра Raspbian Jessie из исходников для Raspberry Pi 3 Model B

Собирать ядро будем на 64-битной хост-машине Ubuntu 16.04.

Скачиваем инструменты для сборки в любую локальную директорию (у меня /media/Data2/Kernel/raspberrypi):

cd /media/Data2/Kernel/raspberrypi
git clone https://github.com/raspberrypi/tools

Так как у нас 64-битная платформа, скопируем папку /media/Data2/Kernel/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin в наш путь с инструментами сборки /usr/local/tools :

cp /media/Data2/Kernel/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64 /usr/local/tools/linaro-raspbian-x64

Добавим путь к компилятору в переменную окружения PATH:

export PATH=$PATH:/usr/local/tools/linaro-raspbian-x64/bin

Получаем исходники самого ядра (опять использую директорию /media/Data2/Kernel/raspberrypi):

cd /media/Data2/Kernel/raspberrypi
git clone --depth=1 https://github.com/raspberrypi/linux

Для Raspberry Pi 3 переходим в папку linux, устанавливаем переменную окружения KERNEL и формируем дефолтную конфигурацию сборки ядра:

cd linux 
KERNEL=kernel7 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

Теперь команда сборки ядра:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

После удачной сборки надо записать файлы на загрузочную microsd-карту. Легче всего скачать уже готовый образ (raspbian jessie lite) и записать его, затем модифицировать содержимое карты файлами только что собранного ядра.

Вставим записанную microsd-карту с картридером в компьютер и выполним lsblk:

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0      2:0    1     4K  0 disk 
sda      8:0    0 232,9G  0 disk 
├─sda1   8:1    0   350M  0 part 
├─sda2   8:2    0 106,5G  0 part 
└─sda3   8:3    0   126G  0 part /media/Data2
sdb      8:16   0 465,8G  0 disk 
├─sdb1   8:17   0  97,7G  0 part /
├─sdb2   8:18   0   3,9G  0 part [SWAP]
├─sdb3   8:19   0  97,7G  0 part /media/adil/da1d5824-6b28-4395-a352-02d314a3439c
└─sdb4   8:20   0 266,6G  0 part /media/Data
sdc      8:32   1   7,4G  0 disk 
├─sdc1   8:33   1    63M  0 part /media/adil/boot
└─sdc2   8:34   1   7,4G  0 part /media/adil/0aed834e-8c8f-412d-a276-a265dc676112
sr0     11:0    1  1024M  0 rom  

Создадим папки для монтирования boot-раздела и раздела с файловой системой, и примонтируем к ним физические диски:

sudo mkdir /media/fat32
sudo mkdir /media/ext4
sudo mount /dev/sdc1 /media/fat32
sudo mount /dev/sdc2 /media/ext4

Копируем модули ядра в примонтированную папку (ругается "make: arm-linux-gnueabihf-gcc: Команда не найдена" потому, что для рута в /root/.bashrc в PATH'е не добавлен путь к установленному компилятору, но при копировании это не нужно):

KERNEL=kernel7
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/ext4 modules_install

Копируем бинарники ядра и devicetree в примонтированные папки, не забывая про создание резервных копий:

sudo cp /media/fat32/$KERNEL.img /media/fat32/$KERNEL-backup.img
sudo ./scripts/mkknlimg ./arch/arm/boot/zImage /media/fat32/$KERNEL.img
sudo cp ./arch/arm/boot/dts/*.dtb /media/fat32/
sudo cp ./arch/arm/boot/dts/overlays/*.dtb* /media/fat32/overlays/

Для разрешения доступа к shell'у по ssh создаем пустой файл ssh в папке /media/fat32/ :

touch /media/fat32/ssh

В локальной сети с действующим dhcp-сервером после включения платы мы можем обнаружить присвоенный ip-адрес следующим образом. Получаем:

$ nmap -p 22 -sV --open -n 192.168.1.1-255

Starting Nmap 7.01 ( https://nmap.org ) at 2016-12-06 14:50 MSK
...
Nmap scan report for 192.168.1.140
Host is up (0.00062s latency).
PORT   STATE SERVICE VERSION
22/tcp open  ssh     (protocol 2.0)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port22-TCP:V=7.01%I=7%D=12/6%Time=5846A61D%P=x86_64-pc-linux-gnu%r(NULL
SF:,29,"SSH-2\.0-OpenSSH_6\.7p1\x20Raspbian-5\+deb8u3\r\n");
...

Подключаемся, используя логин pi, пароль raspberry :

ssh pi@192.168.1.140

Отмонтируем папки:

sudo umount /media/fat32
sudo umount /media/ext4

Запись образа raspberry pi на microsd-карту

1. Запись microsd-карты будем производить на Ubuntu 16.04 при помощи microsd-картридера. Скачиваем последний образ (на момент написания это raspbian jessy lite), разархивируем его ( результирующий файл 2016-11-25-raspbian-jessie-lite.img). Вставляем картридер с microsd-картой размером 8GB (у меня есть только такая), запускаем gparted (sudo gparted) и удаляем логические диски с карты. После этого выполняем lsblk :

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0      2:0    1     4K  0 disk 
sda      8:0    0 232,9G  0 disk 
├─sda1   8:1    0   350M  0 part 
├─sda2   8:2    0 106,5G  0 part 
└─sda3   8:3    0   126G  0 part /media/Data2
sdb      8:16   0 465,8G  0 disk 
├─sdb1   8:17   0  97,7G  0 part /
├─sdb2   8:18   0   3,9G  0 part [SWAP]
├─sdb3   8:19   0  97,7G  0 part /media/adil/da1d5824-6b28-4395-a352-02d314a3439c
└─sdb4   8:20   0 266,6G  0 part /media/Data
sdc      8:32   1   7,4G  0 disk 
sr0     11:0    1  1024M  0 rom  

Наш диск имеет имя - /dev/sdc. Переходим в папку со скачанным образом (у меня /media/Data2/Downloads/Images/microsd) и записываем его на диск:

cd /media/Data2/Downloads/Images/microsd
sudo dd bs=4M if=./2016-11-25-raspbian-jessie-lite.img of=/dev/sdc

2. Для записи той же 8-гиговой microsd-карты под windows 10 нам понадобится gpl-программа imager, скачиваем, устанавливаем, вставляем usb-картридер с картой. Запускаем программу, выбираем в комбобоксе "Operating system" либо "Raspbian" (в этом случае прога скачает последний образ), либо "Use custom" и указываем уже скаченный образ (2020-02-13-raspbian-buster-lite.zip) (если вы сделали это самостоятельно). В комбобоксе "SD card" выбираем вставленную карту и нажимаем "Write".

Использованный материал: