add: сборка ядра Linux для opi5plus (fin)
This commit is contained in:
parent
b470dcdd5d
commit
84a6ba4c92
@ -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`. |
|
||||
|
||||
ВСË!
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user