Собирать ядро будем на 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
Скачиваем инструменты для сборки в любую локальную директорию (у меня /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
Для 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
Теперь команда сборки ядра:
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 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");
...
ssh pi@192.168.1.140
sudo umount /media/fat32
Для разрешения доступа к 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/ext4