From 84a6ba4c9277fdaf75072fa66becaf718cf5b5e3 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 24 Mar 2025 18:25:01 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=8F=D0=B4=D1=80=D0=B0=20Linux=20=D0=B4=D0=BB=D1=8F=20opi5plu?= =?UTF-8?q?s=20(fin)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5plus-rebuilding-linux-kernel-for-iscsi.md | 171 ++++++++++++++++-- 1 file changed, 151 insertions(+), 20 deletions(-) diff --git a/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md b/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md index d672f12..29dd43c 100644 --- a/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md +++ b/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md @@ -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` -(мы выбрали ``, а не `<*>`). Кроме того, Linux выравнивает размер файла по блокам (например, 4 Кб), и добавление -пары модулей могут не повлиять на итоговый размер. Разные даты файлов и права пользователей подтверждают, -что файл новый — компиляция прошла, и `Image` обновился. +И это не ошибка. Мы добавили только `CONFIG_ISCSI_TCP=m` и `CONFIG_SCSI_ISCSI_ATTRS=m`. Это подключит модули (`iscsi_tcp.ko`), +но само ядро (`Image`) почти не увеличивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали ``, +а не `<*>`). Кроме того, 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`. | + +ВСË! + + + +