add: сборка ядра Linux для opi5plus (fin)

This commit is contained in:
Sergei Erjemin 2025-03-24 18:25:01 +03:00
parent b470dcdd5d
commit 84a6ba4c92

View File

@ -32,13 +32,13 @@ Xunlong обновляет ядро не часто.
## План сборки ядра с iSCSI
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
* Устанавливать инструменты.
* Скачивать исходники.
* Настраивать конфиг с iSCSI.
* Компилировать ядро и модули.
* Устанавливать новое ядро рядом.
* Тестировать без перезагрузки.
* Заменять ядро и перезагружать.
* Установить инструментарий для настройки и компиляции ядра
* Скачать исходники.
* Настроить конфиг для включения модулей iSCSI (и мониторинга NVMe).
* Скомпилировать ядро и модули.
* Устанавливать новое ядро.
* Перезагрузить в новое ядро.
* Проверить.
## Резервное копирование текущего ядра и /boot
@ -100,7 +100,10 @@ drwxr-xr-x 3 root root 4096 ноя 21 09:55 dtb-6.1.43-rockchip-rk3588/
DTB передаётся ядру, чтобы оно знало, как работать с процессором (количество ядер, частоты), памятью (RAM, её объём
и адреса), периферией (UART, I2C, SPI, Ethernet, USB, GPIO, прерывания и тому подобное). На ARM-устройствах
(в отличие от x86, где есть ACPI) нет стандартного способа обнаружения оборудования. DTB решает эту проблему,
предоставляя ядру "карту" железа. U-Boot загружает DTB из /boot/dtb/ и передаёт его ядру при старте.
предоставляя ядру "карту" железа. U-Boot загружает DTB из `/boot/dtb/ `и передаёт его ядру при старте. Кстати,
в подкаталоге dtb/rockchip/ есть `overlay/` -- это дополнительные файлы, которые могут использоваться для добавления
и/или изменения функциональности устройства. Например, можно добавить поддержку новых периферийных устройств (камеру,
дисплей и т.п.).
* `uInitrd` -- Начальный RAM-диск (initrd), адаптированный для U-Boot. Содержит модули и скрипты, необходимые для
пред-загрузки (выбор накопителя, монтирование корневой файловой системы и т.п.). Если он повреждён или несовместим
с ядром, загрузка может упасть на этапе инициализации.
@ -110,6 +113,10 @@ drwxr-xr-x 3 root root 4096 ноя 21 09:55 dtb-6.1.43-rockchip-rk3588/
* `boot.scr` -- Скрипт загрузки для U-Boot. Содержит команды для загрузки ядра, initrd и DTB. U-Boot выполняет его
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
U-Boot не сможет загрузить систему.
* `dtb-6.1.43-rockchip-rk3588/` -- Копия каталога `dtb/`, обычно появляется, когда ядро устанавливается или обновляется
через пакетный менеджер (например, `apt`). Она привязана к конкретной версии ядра — в данном случае
`6.1.43-rockchip-rk3588`, для того, чтобы: Хранить DTB-файлы, соответствующие этой версии ядра и избегать конфликты
между DTB от разных версий ядра (если используется несколько ядер на одной системе).
Менее критичные, но полезные файлы:
* `config-6.1.43-rockchip-rk3588` -- Конфигурация ядра, использованная при его сборке (он нам понадобится, чтобы
@ -214,7 +221,7 @@ CONFIG_ISCSI_TCP=m
# CONFIG_ISCSI_BOOT_SYSFS is not set
```
| ✎ Проверка, что включен мониторинг NVMe (если включили): |
| ✎ Проверка, что включен мониторинг NVMe (если включали): |
|---------------------------------------------------------------|
| `grep -E "NVME_HWMON" .config` и увидим `CONFIG_NVME_HWMON=y` |
@ -228,7 +235,18 @@ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
`-j8` — это количество потоков, используем столько, сколько у нас ядер. На Orange Pi 5 Plus восемь ядер. Но, например,
если у вас четыре ядра, то `-j4`.
Компиляция займёт 20-40 минут (Orange Pi 5 Plus). После завершения проверим, что ядро скомпилировалось:
Компиляция займёт 20-40 минут (Orange Pi 5 Plus).
Установим модули ядра:
```bash
sudo make modules_install
```
После завершения ядро будет находиться в каталоге `~/linux-orangepi/arch/arm64/boot/` (файл `Image`), а дерево описания
устройства в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/` (наш файл для Orange Pi 5 Plus --
`rk3588-orangepi-5-plus.dtb`, дле версий 5, 5 Max, AI, Ultra соответствующие файлы там же).
Проверим, что ядро скомпилировалось:
```bash
ls -l arch/arm64/boot/Image
```
@ -246,16 +264,129 @@ ls -l /boot/Image
-rwxr-xr-x 1 root root 40579584 Nov 21 07:08 /boot/Image
```
Это не ошибка. Мы добавили только `CONFIG_ISCSI_TCP=m` и `CONFIG_SCSI_ISCSI_ATTRS=m`. Это добавляет модули (`iscsi_tcp.ko`),
но само ядро (`Image`) почти не увеличивается, так как iSCSI идёт как отдельный файл `.ko`, а не встраивается в `Image`
(мы выбрали `<M>`, а не `<*>`). Кроме того, Linux выравнивает размер файла по блокам (например, 4 Кб), и добавление
пары модулей могут не повлиять на итоговый размер. Разные даты файлов и права пользователей подтверждают,
что файл новый — компиляция прошла, и `Image` обновился.
И это не ошибка. Мы добавили только `CONFIG_ISCSI_TCP=m` и `CONFIG_SCSI_ISCSI_ATTRS=m`. Это подключит модули (`iscsi_tcp.ko`),
но само ядро (`Image`) почти не увеличивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали `<M>`,
а не `<*>`). Кроме того, Linux выравнивает размеры файлов по блокам (например, 4 Кб), и добавление
пары небольших модулей могут не повлиять на итоговый размер.
## Устанавливаем новое ядро рядом со старым
Мы доджны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и скомпилированное нами ядро
скомпилиролось в каталог `~/linux-orangepi/arch/arm64/boot/`.Оно универсальное для всех микрокомпьютеров на базе
Rockchip RK3588. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`
Это дерево описания оборудования (Device Tree Blob), и этот файл нужен для загрузки ядра. При сборке мы получили `.dtb`
для всех моделей Orange Pi 5 (5, 5 Plus, 5 Max, AI, Ultra), но нам нужен только для Orange Pi 5 Plus (`rk3588-orangepi-5-plus.dtb`).
Мы должны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и оно скомпилировалось в каталог
`~/linux-orangepi/arch/arm64/boot/`. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится
в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`. Как было сказано выше, это дерево описания оборудования
(Device Tree Blob), и нужно при загрузке ядра. Кстати, при компиляции мы получили `.dtb` для всех моделей Orange Pi 5
(5, 5 Plus, 5 Max, AI, Ultra). Для моей модели (Orange Pi 5 Plus) нужен `rk3588-orangepi-5-plus.dtb`, а вы можете
взять другой, для своей модели.
Копируем новые файлы в `/boot` с уникальными именами (с суффиксом `-iscsi`):
```bash
sudo cp ~/linux-orangepi/arch/arm64/boot/Image /boot/Image-iscsi
sudo cp ~/linux-orangepi/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dtb /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-iscsi
```
Старое ядро и дерево описания переименуем (это будет резервная копия, с суффиксом `-original`):
```bash
sudo mv /boot/Image /boot/Image-original
sudo mv /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-original
```
Устанавливаем новые ядро и дерево:
```bash
sudo cp /boot/Image-iscsi /boot/Image
sudo cp /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-iscsi /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb
```
Все готово.
## Перезагрузка в новое ядро
Тут все просто:
```bash
sudo reboot
```
#### Если что-то пошло не так и система не загрузилась
Если вы все делали правильно, то такого быть не должно. Но тем не менее, если загрузка не произошло, то это может
выглядеть двумя способами:
* Система зависает на этапе загрузки и синенький огонек на Orange Pi не загорается, и Ethernet тоже не мигает --
Это значит, что вы неправильно собрали ядро или испортили загрузчик.
* Система. вроде как загрузилась, огоньки весело мигают но не получается подключиться по SSH и/или другим способом --
вы забыли подключить модули, накосячили с конфигом или с `.dtb`
Чтобы починить, загружайтесь с MicroSD-карты. Затем смонтируйте, в зависимости где у вас система, eMMC:
```bash
mkdir -p /mnt/emmc
mount /dev/mmcblk2p1 /mnt/emmc
cd /mnt/emmc
```
...или NVMe:
```bash
mkdir -p /mnt/nvme
mount /dev/nvme0n1p1 /mnt/nvme
cd /mnt/nvme
```
И восстанавливаем старое ядро и дерево описания:
```bash
sudo cp Image-original Image
sudo cp dtb/rockchip/rk3588-orangepi-5-plus.dtb-original dtb/rockchip/rk3588-orangepi-5-plus.dtb
```
Выклчаем систему:
```bash
sudo poweroff
```
Вынимаем MicroSD-карту, включаем, загрузиться старая система.
## Проверка нового ядра
После перезагрузки, проверим текущую версию ядра:
```bash
uname -r
```
Она должна остаться той же:
```text
6.1.43-rockchip-rk3588
```
Проверим работает ли iSCSI:
```bash
sudo systemctl status iscsid
```
Увидим что-то вроде:
```text
● iscsid.service - iSCSI initiator daemon (iscsid)
Loaded: loaded (/lib/systemd/system/iscsid.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2025-03-24 17:51:59 MSK; 28min ago
TriggeredBy: ● iscsid.socket
Docs: man:iscsid(8)
Main PID: 1070 (iscsid)
Tasks: 2 (limit: 18977)
Memory: 4.6M
CPU: 94ms
CGroup: /system.slice/iscsid.service
├─1069 /sbin/iscsid
└─1070 /sbin/iscsid
мар 24 17:51:58 opi5plus-3 systemd[1]: Starting iSCSI initiator daemon (iscsid)...
мар 24 17:51:59 opi5plus-3 iscsid[1061]: iSCSI logger with pid=1069 started!
мар 24 17:51:59 opi5plus-3 iscsid[1069]: iSCSI daemon with pid=1070 started!
мар 24 17:51:59 opi5plus-3 systemd[1]: Started iSCSI initiator daemon (iscsid).
```
Как видим, `active (running)`, значит iSCSI работает.
| ✎ Заметка |
|----------------------------------------------------------------------------------------------------------|
| Если вы включили мониторинг NVMe, то проверим и его. Установим nvme-cli: `sudo apt install nvme-cli` и проверим состояние нашего некопителя `sudo nvme smart-log /dev/nvme0n1`. |
ВСË!