add: сборка ядра Linux для opi5plus (fin)
This commit is contained in:
parent
b470dcdd5d
commit
84a6ba4c92
@ -32,13 +32,13 @@ Xunlong обновляет ядро не часто.
|
|||||||
## План сборки ядра с iSCSI
|
## План сборки ядра с iSCSI
|
||||||
|
|
||||||
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
|
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
|
||||||
* Устанавливать инструменты.
|
* Установить инструментарий для настройки и компиляции ядра
|
||||||
* Скачивать исходники.
|
* Скачать исходники.
|
||||||
* Настраивать конфиг с iSCSI.
|
* Настроить конфиг для включения модулей iSCSI (и мониторинга NVMe).
|
||||||
* Компилировать ядро и модули.
|
* Скомпилировать ядро и модули.
|
||||||
* Устанавливать новое ядро рядом.
|
* Устанавливать новое ядро.
|
||||||
* Тестировать без перезагрузки.
|
* Перезагрузить в новое ядро.
|
||||||
* Заменять ядро и перезагружать.
|
* Проверить.
|
||||||
|
|
||||||
|
|
||||||
## Резервное копирование текущего ядра и /boot
|
## Резервное копирование текущего ядра и /boot
|
||||||
@ -100,7 +100,10 @@ drwxr-xr-x 3 root root 4096 ноя 21 09:55 dtb-6.1.43-rockchip-rk3588/
|
|||||||
DTB передаётся ядру, чтобы оно знало, как работать с процессором (количество ядер, частоты), памятью (RAM, её объём
|
DTB передаётся ядру, чтобы оно знало, как работать с процессором (количество ядер, частоты), памятью (RAM, её объём
|
||||||
и адреса), периферией (UART, I2C, SPI, Ethernet, USB, GPIO, прерывания и тому подобное). На ARM-устройствах
|
и адреса), периферией (UART, I2C, SPI, Ethernet, USB, GPIO, прерывания и тому подобное). На ARM-устройствах
|
||||||
(в отличие от x86, где есть ACPI) нет стандартного способа обнаружения оборудования. DTB решает эту проблему,
|
(в отличие от x86, где есть ACPI) нет стандартного способа обнаружения оборудования. DTB решает эту проблему,
|
||||||
предоставляя ядру "карту" железа. U-Boot загружает DTB из /boot/dtb/ и передаёт его ядру при старте.
|
предоставляя ядру "карту" железа. U-Boot загружает DTB из `/boot/dtb/ `и передаёт его ядру при старте. Кстати,
|
||||||
|
в подкаталоге dtb/rockchip/ есть `overlay/` -- это дополнительные файлы, которые могут использоваться для добавления
|
||||||
|
и/или изменения функциональности устройства. Например, можно добавить поддержку новых периферийных устройств (камеру,
|
||||||
|
дисплей и т.п.).
|
||||||
* `uInitrd` -- Начальный RAM-диск (initrd), адаптированный для U-Boot. Содержит модули и скрипты, необходимые для
|
* `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.scr` -- Скрипт загрузки для U-Boot. Содержит команды для загрузки ядра, initrd и DTB. U-Boot выполняет его
|
||||||
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
|
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
|
||||||
U-Boot не сможет загрузить систему.
|
U-Boot не сможет загрузить систему.
|
||||||
|
* `dtb-6.1.43-rockchip-rk3588/` -- Копия каталога `dtb/`, обычно появляется, когда ядро устанавливается или обновляется
|
||||||
|
через пакетный менеджер (например, `apt`). Она привязана к конкретной версии ядра — в данном случае
|
||||||
|
`6.1.43-rockchip-rk3588`, для того, чтобы: Хранить DTB-файлы, соответствующие этой версии ядра и избегать конфликты
|
||||||
|
между DTB от разных версий ядра (если используется несколько ядер на одной системе).
|
||||||
|
|
||||||
Менее критичные, но полезные файлы:
|
Менее критичные, но полезные файлы:
|
||||||
* `config-6.1.43-rockchip-rk3588` -- Конфигурация ядра, использованная при его сборке (он нам понадобится, чтобы
|
* `config-6.1.43-rockchip-rk3588` -- Конфигурация ядра, использованная при его сборке (он нам понадобится, чтобы
|
||||||
@ -214,7 +221,7 @@ CONFIG_ISCSI_TCP=m
|
|||||||
# CONFIG_ISCSI_BOOT_SYSFS is not set
|
# CONFIG_ISCSI_BOOT_SYSFS is not set
|
||||||
```
|
```
|
||||||
|
|
||||||
| ✎ Проверка, что включен мониторинг NVMe (если включили): |
|
| ✎ Проверка, что включен мониторинг NVMe (если включали): |
|
||||||
|---------------------------------------------------------------|
|
|---------------------------------------------------------------|
|
||||||
| `grep -E "NVME_HWMON" .config` и увидим `CONFIG_NVME_HWMON=y` |
|
| `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 восемь ядер. Но, например,
|
`-j8` — это количество потоков, используем столько, сколько у нас ядер. На Orange Pi 5 Plus восемь ядер. Но, например,
|
||||||
если у вас четыре ядра, то `-j4`.
|
если у вас четыре ядра, то `-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
|
```bash
|
||||||
ls -l arch/arm64/boot/Image
|
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
|
-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`),
|
И это не ошибка. Мы добавили только `CONFIG_ISCSI_TCP=m` и `CONFIG_SCSI_ISCSI_ATTRS=m`. Это подключит модули (`iscsi_tcp.ko`),
|
||||||
но само ядро (`Image`) почти не увеличивается, так как iSCSI идёт как отдельный файл `.ko`, а не встраивается в `Image`
|
но само ядро (`Image`) почти не увеличивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали `<M>`,
|
||||||
(мы выбрали `<M>`, а не `<*>`). Кроме того, Linux выравнивает размер файла по блокам (например, 4 Кб), и добавление
|
а не `<*>`). Кроме того, Linux выравнивает размеры файлов по блокам (например, 4 Кб), и добавление
|
||||||
пары модулей могут не повлиять на итоговый размер. Разные даты файлов и права пользователей подтверждают,
|
пары небольших модулей могут не повлиять на итоговый размер.
|
||||||
что файл новый — компиляция прошла, и `Image` обновился.
|
|
||||||
|
|
||||||
## Устанавливаем новое ядро рядом со старым
|
## Устанавливаем новое ядро рядом со старым
|
||||||
|
|
||||||
Мы доджны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и скомпилированное нами ядро
|
Мы должны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и оно скомпилировалось в каталог
|
||||||
скомпилиролось в каталог `~/linux-orangepi/arch/arm64/boot/`.Оно универсальное для всех микрокомпьютеров на базе
|
`~/linux-orangepi/arch/arm64/boot/`. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится
|
||||||
Rockchip RK3588. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`
|
в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`. Как было сказано выше, это дерево описания оборудования
|
||||||
Это дерево описания оборудования (Device Tree Blob), и этот файл нужен для загрузки ядра. При сборке мы получили `.dtb`
|
(Device Tree Blob), и нужно при загрузке ядра. Кстати, при компиляции мы получили `.dtb` для всех моделей Orange Pi 5
|
||||||
для всех моделей Orange Pi 5 (5, 5 Plus, 5 Max, AI, Ultra), но нам нужен только для Orange Pi 5 Plus (`rk3588-orangepi-5-plus.dtb`).
|
(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