mod: типограф и беджики
This commit is contained in:
@@ -1,8 +1,11 @@
|
|||||||
# Прозрачный прокси контейнера через Shadowsocks и tun2socks
|
# Прозрачный прокси контейнера через Shadowsocks и tun2socks
|
||||||
|
|
||||||
[](#)
|
[](#)
|
||||||
|
[](#)
|
||||||
|
[](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md)
|
||||||
[](https://typograph.cube2.ru/)
|
[](https://typograph.cube2.ru/)
|
||||||
|
|
||||||
|
|
||||||
У меня есть Docker-контейнер Audiobookshelf, в котором я слушаю аудиокниги и подкасты. Он сам скачивает подкасты
|
У меня есть Docker-контейнер Audiobookshelf, в котором я слушаю аудиокниги и подкасты. Он сам скачивает подкасты
|
||||||
из интернета, и это очень удобно (все нужные мне подкасты в одном месте). Работал контейнер на домашнем NAS Synology
|
из интернета, и это очень удобно (все нужные мне подкасты в одном месте). Работал контейнер на домашнем NAS Synology
|
||||||
(в нем есть Docker Station с веб-интерфейсом). Книг у меня в «библиотеке» уже более тысячи, а подкастов и того больше,
|
(в нем есть Docker Station с веб-интерфейсом). Книг у меня в «библиотеке» уже более тысячи, а подкастов и того больше,
|
||||||
|
|||||||
@@ -1,38 +1,41 @@
|
|||||||
# Orange Pi 5 Plus: установка (перенос) системы на eMMC или SSD NVMe (M.2)
|
# Orange Pi 5 Plus: установка (перенос) системы на eMMC или SSD NVMe (M.2)
|
||||||
|
|
||||||
По правде сказать, приведенный ниже рецепт не только для переноса системы с MicroSD (она же MicroSDHC или MicroSDXC) на
|
[](#)
|
||||||
eMMC-носитель или SSD-накопитель NVMe. Он отлично сработает и для установки чистой системы на eMMC или SSD. Причем,
|
[](#)
|
||||||
установка чистой системы будет намного проще и быстрее.
|
[](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/raspberry-and-orange-pi/opi5plus-move-system-to-nvme-or-emmc.md)
|
||||||
|
[](https://typograph.cube2.ru/)
|
||||||
|
|
||||||
Процедура немного напоминает магию, но это результат глубокого заныривания в интернет, и проверено срабатывает и для
|
|
||||||
SSD NVMe, и для eMMC. Но, как и всякая магия, она может не сработать, и тогда придется начинать все сначала и повторить.
|
По правде сказать, приведенный ниже рецепт не только для переноса системы с MicroSD (она же MicroSDHC или MicroSDXC) на eMMC-носитель или SSD-накопитель NVMe. Он отлично сработает и для установки чистой системы на eMMC или SSD. Причем
|
||||||
|
установка чистой системы будет намного проще и быстрее.
|
||||||
|
|
||||||
|
Процедура немного напоминает магию, но это результат глубокого заныривания в интернет, и проверено срабатывает и для SSD NVMe, и для eMMC. Но, как и всякая магия, она может не сработать, и тогда придется начинать все сначала и повторить.
|
||||||
|
|
||||||
## Установка накопителей
|
## Установка накопителей
|
||||||
|
|
||||||
Выключим Orange Pi 5 Plus и установим в него eMMC-носитель…
|
Выключим Orange Pi 5 Plus и установим в него eMMC-носитель…
|
||||||
|
|
||||||
| Фото до и после установки eMMC. Внимание, устанавливайте до щелчка с обоих сторон! |
|
| Фото до и после установки eMMC. Внимание, устанавливайте до щелчка с обеих сторон! |
|
||||||
|:-------------------------------------------------------------------------------------|
|
|:--------------------------------------------------------------------------------------|
|
||||||
|  |
|
|  |
|
||||||
|  |
|
|  |
|
||||||
|
|
||||||
…и/или SSD-накопитель NVMe
|
…и/или SSD-накопитель NVMe
|
||||||
|
|
||||||
| Фото до и после установки NVMe. Более просто в установке. Для надёжности закрепить винтиком. |
|
| Фото до и после установки NVMe. Более просто в установке. Для надёжности закрепить винтом. |
|
||||||
|:---------------------------------------------------------------------------------------------------|
|
|:----------------------------------------------------------------------------------------------------|
|
||||||
|  |
|
|  |
|
||||||
|  |
|
|  |
|
||||||
|
|
||||||
Кстати, производительность (скорость чтения и записи) eMMC-носителей и SSD-накопителей NVMe может сильно отличаться.
|
Кстати, производительность (скорость чтения и записи) eMMC-носителей и SSD-накопителей NVMe может сильно отличаться. Лично мой выбор — SSD-накопитель NVMe. По опыту он в пять-шесть раз быстрее eMMC.
|
||||||
Лично мой выбор — SSD-накопитель NVMe. По опыту он в пять-шесть раз быстрее eMMC.
|
Вот специальная заметка [как замерить производительность накопителя](measuring-performance-storage-devices.md).
|
||||||
Вот специальная заметка [как замерить производительность накопителя](measuring-performance-storage-devices.md).
|
|
||||||
|
|
||||||
После этого включим Orange Pi 5 Plus. И после того как он загрузится, посмотрим какие устройства и тома есть в системе:
|
После этого включим Orange Pi 5 Plus. И после того как он загрузится, посмотрим какие устройства и тома есть в системе:
|
||||||
```shell
|
```shell
|
||||||
sudo lsblk
|
sudo lsblk
|
||||||
```
|
```
|
||||||
|
|
||||||
Увидим что-то подобное:
|
Увидим что-то подобное:
|
||||||
```text
|
```text
|
||||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
|
||||||
mtdblock0 31:0 0 16M 0 disk
|
mtdblock0 31:0 0 16M 0 disk
|
||||||
@@ -48,39 +51,39 @@ zram0 254:0 0 7.7G 0 disk [SWAP]
|
|||||||
zram1 254:1 0 200M 0 disk /var/log
|
zram1 254:1 0 200M 0 disk /var/log
|
||||||
```
|
```
|
||||||
|
|
||||||
Важно обратить внимание на объемы накопителей. В данном случае, у нас есть MicroSD-носитель `mmcblk1` (59.7G — это
|
Важно обратить внимание на объемы накопителей. В данном случае, у нас есть MicroSD-носитель `mmcblk1` (59.7G — это
|
||||||
64Gb флешка) и eMMC-носитель `mmcblk0` (233G — это 256Gb eMMC). У вас могут быть другие объемы и другие имена
|
64Gb флешка) и eMMC-носитель `mmcblk0` (233G — это 256Gb eMMC). У вас могут быть другие объемы и другие имена
|
||||||
устройств. Так же обратите внимание, ещё у нас есть `mtdblock0` — это внутренняя SPI-флеш, которая
|
устройств. Так же обратите внимание, ещё у нас есть `mtdblock0` — это внутренняя SPI-флеш, которая
|
||||||
используется для загрузки системы. Если у вас есть SSD-накопитель NVMe, он будет иметь имя вроде `nvme0n1`.
|
используется для загрузки системы. Если у вас есть SSD-накопитель NVMe, он будет иметь имя вроде `nvme0n1`.
|
||||||
|
|
||||||
На этом этапе, если мы хотим именно перенести систему, самое время сделать образ нашей MicroSD на внешний
|
На этом этапе, если мы хотим именно перенести систему, самое время сделать образ нашей MicroSD на внешний
|
||||||
носитель (например, на USB-диск или сетевое хранилище). Смонтируем внешний накопитель, например для сетевого
|
носитель (например, на USB-диск или сетевое хранилище). Смонтируем внешний накопитель, например для сетевого
|
||||||
хранилища c Samba:
|
хранилища с Samba:
|
||||||
```shell
|
```shell
|
||||||
mount -t cifs -o username=NAS_USERNAME,password=SECRET //xxx.xxx.xxx.xxx/путь-к-месту-для-сохранения-образа /media/backup/
|
mount -t cifs -o username=NAS_USERNAME,password=SECRET //xxx.xxx.xxx.xxx/путь-к-месту-для-сохранения-образа /media/backup/
|
||||||
```
|
```
|
||||||
|
|
||||||
Где:
|
Где:
|
||||||
- `NAS_USERNAME` — имя пользователя для доступа к сетевому хранилищу;
|
- `NAS_USERNAME` — имя пользователя для доступа к сетевому хранилищу;
|
||||||
- `SECRET` — пароль для доступа к сетевому хранилищу;
|
- `SECRET` — пароль для доступа к сетевому хранилищу;
|
||||||
- `xxx.xxx.xxx.xxx` — IP-адрес сетевого хранилища;
|
- `xxx.xxx.xxx.xxx` — IP-адрес сетевого хранилища;
|
||||||
- `путь-к-каталогу-для-сохраненияь-обраа` — путь к каталогу на сетевом хранилище, куда будет сохранен образ;
|
- `путь-к-каталогу-для-сохраненияь-обраа` — путь к каталогу на сетевом хранилище, куда будет сохранен образ;
|
||||||
- `/media/backup/` — точка монтирования сетевого хранилища.
|
- `/media/backup/` — точка монтирования сетевого хранилища.
|
||||||
|
|
||||||
Сделаем образ MicroSD в файл `flash-disk.img` на этом внешнем накопителе:
|
Сделаем образ MicroSD в файл `flash-disk.img` на этом внешнем накопителе:
|
||||||
```shell
|
```shell
|
||||||
sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress
|
sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress
|
||||||
```
|
```
|
||||||
|
|
||||||
Это займет некоторое время (и иногда, в зависимости от скорости внешнего накопителя и размера MicroSD, довольно
|
Это займет некоторое время (и иногда, в зависимости от скорости внешнего накопителя и размера MicroSD, довольно
|
||||||
продолжительное). После того как образ будет готов, установим в систему `gdisk` — утилиту для работы
|
продолжительное). После того как образ будет готов, установим в систему `gdisk` — утилиту для работы
|
||||||
с таблицами разделов:
|
с таблицами разделов:
|
||||||
```shell
|
```shell
|
||||||
sudo apt install gdisk
|
sudo apt install gdisk
|
||||||
```
|
```
|
||||||
## Очистим разделы на SPI-флеш (внутренней флеш-памяти с загрузчиками)
|
## Очистим разделы на SPI-флеш (внутренней флеш-памяти с загрузчиками)
|
||||||
|
|
||||||
Запустим `gdisk` для работы с заделами на SPI `mtdblock0` (загрузчиками):
|
Запустим `gdisk` для работы с заделами на SPI `mtdblock0` (загрузчиками):
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo gdisk /dev/mtdblock0
|
sudo gdisk /dev/mtdblock0
|
||||||
@@ -101,7 +104,7 @@ Found valid GPT with protective MBR; using GPT.
|
|||||||
Command (? for help):
|
Command (? for help):
|
||||||
```
|
```
|
||||||
|
|
||||||
Если введем `?` и нажмем Enter, увидим список команд:
|
Если введем `?` и нажмем Enter, увидим список команд:
|
||||||
```text
|
```text
|
||||||
b back up GPT data to a file
|
b back up GPT data to a file
|
||||||
c change a partition's name
|
c change a partition's name
|
||||||
@@ -121,7 +124,7 @@ x extra functionality (experts only)
|
|||||||
? print this menu
|
? print this menu
|
||||||
```
|
```
|
||||||
|
|
||||||
Выполним команду `p` и Enter, чтобы увидеть список разделов:
|
Выполним команду `p` и Enter, чтобы увидеть список разделов:
|
||||||
```text
|
```text
|
||||||
Disk /dev/mtdblock0: 32768 sectors, 16.0 MiB
|
Disk /dev/mtdblock0: 32768 sectors, 16.0 MiB
|
||||||
Sector size (logical/physical): 512/512 bytes
|
Sector size (logical/physical): 512/512 bytes
|
||||||
@@ -139,23 +142,23 @@ Number Start (sector) End (sector) Size Code Name
|
|||||||
Command (? for help):
|
Command (? for help):
|
||||||
```
|
```
|
||||||
|
|
||||||
Как видим, у нас есть два раздела: `idbloader` и `uboot`. Нам нужно удалить их. Для этого выполним команду `d` и Enter.
|
Как видим, у нас есть два раздела: `idbloader` и `uboot`. Нам нужно удалить их. Для этого выполним команду `d` и Enter.
|
||||||
Увидим:
|
Увидим:
|
||||||
```text
|
```text
|
||||||
Partition number (1-2):
|
Partition number (1-2):
|
||||||
```
|
```
|
||||||
|
|
||||||
Введем номер раздела `1` и Enter. Раздел будет удален. Повторим для раздела `2`. Снова выполним команду `d` и Enter.
|
Введем номер раздела `1` и Enter. Раздел будет удалён. Повторим для раздела `2`. Снова выполним команду `d` и Enter.
|
||||||
Теперь нас не спросят номер раздела, оставшийся раздел будет удален без лишних вопросов. Если у вас, вдруг, было
|
Теперь нас не спросят номер раздела, оставшийся раздел будет удален без лишних вопросов. Если у вас, вдруг, было
|
||||||
больше двух разделов, надо последовательно удалить их все.
|
больше двух разделов, надо последовательно удалить их все.
|
||||||
|
|
||||||
Теперь нам нужно сохранить изменения. Для этого выполним команду `w` и Enter. Увидим:
|
Теперь нам нужно сохранить изменения. Для этого выполним команду `w` и Enter. Увидим:
|
||||||
```text
|
```text
|
||||||
Warning! Secondary header is placed too early on the disk! Do you want to
|
Warning! Secondary header is placed too early on the disk! Do you want to
|
||||||
correct this problem? (Y/N):
|
correct this problem? (Y/N):
|
||||||
```
|
```
|
||||||
|
|
||||||
Подтверждаем наше намерения перезаписать таблицу разделов. Вводим введя `y` и Enter. Увидим:
|
Подтверждаем наше намерения перезаписать таблицу разделов. Вводим введя `y` и Enter. Увидим:
|
||||||
```text
|
```text
|
||||||
Have moved second header and partition table to correct location.
|
Have moved second header and partition table to correct location.
|
||||||
|
|
||||||
@@ -165,7 +168,7 @@ PARTITIONS!!
|
|||||||
Do you want to proceed? (Y/N):
|
Do you want to proceed? (Y/N):
|
||||||
```
|
```
|
||||||
|
|
||||||
Еще раз подтверждаем наше намерение перезаписать таблицу разделов. Вводим `y` и Enter. Увидим:
|
Еще раз подтверждаем наше намерение перезаписать таблицу разделов. Вводим `y` и Enter. Увидим:
|
||||||
```text
|
```text
|
||||||
OK; writing new GUID partition table (GPT) to /dev/mtdblock0.
|
OK; writing new GUID partition table (GPT) to /dev/mtdblock0.
|
||||||
Warning: The kernel is still using the old partition table.
|
Warning: The kernel is still using the old partition table.
|
||||||
@@ -174,26 +177,24 @@ run partprobe(8) or kpartx(8)
|
|||||||
The operation has completed successfully.
|
The operation has completed successfully.
|
||||||
```
|
```
|
||||||
|
|
||||||
## Очистим разделы на целевом eMMC (или SSD NVMe)
|
## Очистим разделы на целевом eMMC (или SSD NVMe)
|
||||||
|
|
||||||
Теперь нам нужно очистить разделы на целевом накопителе. Для этого запустим `gdisk` для работы с разделами на eMMC
|
Теперь нам нужно очистить разделы на целевом накопителе. Для этого запустим `gdisk` для работы с разделами на eMMC (в нашем случае это `mmcblk0`):
|
||||||
(в нашем случае это `mmcblk0`):
|
|
||||||
```shell
|
```shell
|
||||||
sudo gdisk /dev/mmcblk0
|
sudo gdisk /dev/mmcblk0
|
||||||
```
|
```
|
||||||
|
|
||||||
Проделаем те же операции, что и с SPI-флешем. Не буду повторяться, так как процедура аналогична. Важно помнить, что
|
Проделаем те же операции, что и с SPI-флешем. Не буду повторяться, так как процедура аналогична. Важно помнить, что нам нужно удалить все(!) разделы.
|
||||||
нам нужно удалить все(!) разделы.
|
|
||||||
|
|
||||||
## Выравняем разделы на eMMC (или SSD NVMe)
|
## Выравняем разделы на eMMC (или SSD NVMe)
|
||||||
|
|
||||||
Выравнивание секторов eMMC гарантирует правильное распознавание загрузочного диска. Снова запустим `gdisk` для нашего
|
Выравнивание секторов eMMC гарантирует правильное распознавание загрузочного диска. Снова запустим `gdisk` для нашего
|
||||||
eMMC:
|
eMMC:
|
||||||
```shell
|
```shell
|
||||||
sudo gdisk /dev/mmcblk0
|
sudo gdisk /dev/mmcblk0
|
||||||
```
|
```
|
||||||
|
|
||||||
Дадим команду `p` и Enter, чтобы, чтобы увидеть список разделов, и обратим внимание, на текст над таблицей разделов:
|
Дадим команду `p` и Enter, чтобы, чтобы увидеть список разделов, и обратим внимание, на текст над таблицей разделов:
|
||||||
```text
|
```text
|
||||||
Disk /dev/mmcblk0: 488570880 sectors, 233.0 GiB
|
Disk /dev/mmcblk0: 488570880 sectors, 233.0 GiB
|
||||||
Sector size (logical/physical): 512/512 bytes
|
Sector size (logical/physical): 512/512 bytes
|
||||||
@@ -205,13 +206,11 @@ Partitions will be aligned on 2048-sector boundaries
|
|||||||
Total free space is 4974559 sectors (2.4 GiB)
|
Total free space is 4974559 sectors (2.4 GiB)
|
||||||
```
|
```
|
||||||
|
|
||||||
В данном случае все нормально: как видим выше, основная таблицы разделов начинается с сектора 2 и заканчивается на 33,
|
В данном случае все нормально: как видим выше, основная таблицы разделов начинается с сектора 2 и заканчивается на 33, а первый используемый сектор — это любое число, кроме 34 (в нашем случае 2048). Можно пропустить следующие шаги. Но если у вас нет так, то необходимо переформатировать сектора перед записью новой таблицы разделов на диск.
|
||||||
а первый используемый сектор — это любое число, кроме 34 (в нашем случае 2048). Можно пропустить следующие шаги. Но
|
|
||||||
если у вас нет так, то необходимо переформатировать сектора перед записью новой таблицы разделов на диск.
|
|
||||||
|
|
||||||
Для этого выполним следующие шаги:
|
Для этого выполним следующие шаги:
|
||||||
|
|
||||||
Вводим команду `x` и Enter, чтобы перейти в экспертный режими. В режиме доступны следующие команды:
|
Вводим команду `x` и Enter, чтобы перейти в экспертный режими. В режиме доступны следующие команды:
|
||||||
```text
|
```text
|
||||||
a set attributes
|
a set attributes
|
||||||
b byte-swap a partition's name
|
b byte-swap a partition's name
|
||||||
@@ -239,100 +238,92 @@ z zap (destroy) GPT data structures and exit
|
|||||||
? print this menu
|
? print this menu
|
||||||
```
|
```
|
||||||
|
|
||||||
Переместите основную таблицу разделов. Для этого введите `j` и Enter. Будет предложено задать сектор для расположения
|
Переместите основную таблицу разделов. Для этого введите `j` и Enter. Будет предложено задать сектор для расположения начала основной таблицы разделов:
|
||||||
начала основной таблицы разделов:
|
|
||||||
```text
|
```text
|
||||||
Currently, main partition table begins at sector 2 and ends at sector 33
|
Currently, main partition table begins at sector 2 and ends at sector 33
|
||||||
Enter new starting location (2 to 61408; default is 2; 1 to abort):
|
Enter new starting location (2 to 61408; default is 2; 1 to abort):
|
||||||
```
|
```
|
||||||
|
Вводим `2` и Enter. Затем сохраняем изменения, выполнив команду `w` и Enter. И пройдя два подтверждения (`y` и Enter) выходим из `gdisk`.
|
||||||
|
|
||||||
Вводим `2` и Enter. Затем сохраняем изменения, выполнив команду `w` и Enter. И пройдя два подтверждения (`y` и Enter)
|
## Перезаписываем загрузчик
|
||||||
выходим из `gdisk`.
|
|
||||||
|
|
||||||
## Перезаписываем загрузчик
|
|
||||||
|
|
||||||
Несколькими попытками проверено, что только такой порядок действий (обновление загрузчика) гарантирует, что
|
Несколькими попытками проверено, что только такой порядок действий (обновление загрузчика) гарантирует, что
|
||||||
Orange Pi 5 будет загружаться с eMMC. Надо запустить встроенное приложение конфигурации Orange Pi 5:
|
Orange Pi 5 будет загружаться с eMMC. адо запустить встроенное приложение конфигурации Orange НPi Н5:
|
||||||
```shell
|
```shell
|
||||||
sudo orangepi-config
|
sudo orangepi-config
|
||||||
```
|
```
|
||||||
|
|
||||||
Панель orangepi-config на Orange Pi 5 выглядит так:
|
Панель orangepi–config на Orange Pi 5 выглядит так:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Выбираем пункт '**System: System and security settings**' и заходим в панель '**System Settings**'. Выбираем в ней
|
Выбираем пункт '**System: System and security settings**' и заходим в панель '**System Settings**'. Выбираем в ней
|
||||||
пункт '**Install: Install to/update boot loader**':
|
пункт '**Install: Install to/update boot loader**':
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Выбираем последний пункт '**Install/Update the bootloader on SPI Flash**':
|
Выбираем последний пункт '**Install/Update the bootloader on SPI Flash**':
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Подтверждаем наше намерение обновить загрузчик:
|
Подтверждаем наше намерение обновить загрузчик:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Спустя несколько минут мы снова увидим панель '**System Settings**' приложения `orangepi-config`. На этом этапе
|
Спустя несколько минут мы снова увидим панель '**System Settings**' приложения `orangepi–config`. На этом этапе
|
||||||
можно обновить пакеты системы, выбрав пункт '**Firmware: Run apt update & apt upgrade**'. Но это не обязательно,
|
можно обновить пакеты системы, выбрав пункт '**Firmware: Run apt update & apt upgrade**'. Но это не обязательно,
|
||||||
можно просто выйти из `orangepi-config`.
|
можно просто выйти из `orangepi–config`.
|
||||||
|
|
||||||
Перезагружаем наш Orange Pi 5. Все еще не извлекая MicroSD:
|
Перезагружаем наш Orange Pi 5. Все еще не извлекая MicroSD:
|
||||||
```shell
|
```shell
|
||||||
sudo reboot
|
sudo reboot
|
||||||
```
|
```
|
||||||
|
| Важно! |
|
||||||
|
|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| Возможно Orange Pi не загрузится. Просто извлеките MicroSD, перезапишите не неё образ системы (лучше чистой, [с официального сайта производителя](http://www.orangepi.org/html/serviceAndSupport/index.html)), загрузитесь снова и проделайте все вышеперечисленное ещё раз. |
|
||||||
|
|
||||||
| Важно! |
|
## Записываем образ чистой системы на eMMC
|
||||||
|:-------|
|
|
||||||
| Возможно Orange Pi не загрузится. Просто извлеките MicroSD, перезапишите не неё образ системы (лучше чистой, [с официального сайта производителя](http://www.orangepi.org/html/serviceAndSupport/index.html)), загрузитесь снова и проделайте все вышеперечисленное ещё раз. |
|
|
||||||
|
|
||||||
## Записываем образ чистой системы на eMMC
|
Самый простой, быстрый и проверенный способ — записать на eMMC образ чистой системы, скаченный с официального сайта. К слову сказать, образы официальных сборок для Orannge Pi лежать на Goolge Drive, так что самое оптимальное скачать образ на каком-нибудь другом компьютере и перенести его на Orange Pi с помощью USB-накопителя или NAS.
|
||||||
|
|
||||||
Самый простой, быстрый и проверенный способ — записать на eMMC образ чистой системы, скаченный с официального сайта.
|
Записываем файл с образом на eMMC:
|
||||||
К слову сказать, образы официальных сборок для Orannge Pi лежать на Goolge Drive, так что самое оптимальное скачать
|
|
||||||
образ на каком-нибудь другом компьютере и перенести его на Orange Pi с помощью USB-накопителя или NAS.
|
|
||||||
|
|
||||||
Записываем файл с образом на eMMC:
|
|
||||||
```shell
|
```shell
|
||||||
sudo dd bs=1M if=Orangepi5plus_1.0.8_ubuntu_jammy_server_linux6.1.43.img of=/dev/mmcblk0 status=progress
|
sudo dd bs=1M if=Orangepi5plus_1.0.8_ubuntu_jammy_server_linux6.1.43.img of=/dev/mmcblk0 status=progress
|
||||||
```
|
```
|
||||||
|
|
||||||
Все. Можно выключить Orange Pi 5 Plus:
|
Все. Можно выключить Orange Pi 5 Plus:
|
||||||
```shell
|
```shell
|
||||||
sudo shutdown 0
|
sudo shutdown 0
|
||||||
```
|
```
|
||||||
|
|
||||||
Извлекаем MicroSD и включаем Orange Pi 5. Он должен загрузиться с eMMC.
|
Извлекаем MicroSD и включаем Orange Pi 5. Он должен загрузиться с eMMC.
|
||||||
|
|
||||||
## Перенос системы с MicroSD (или с резервной копии) на eMMC
|
## Перенос системы с MicroSD (или с резервной копии) на eMMC
|
||||||
|
|
||||||
Если установка чистой системы на eMMC не подходит (наприер, если на MicroSD уже настроена и отлажена система), то
|
Если установка чистой системы на eMMC не подходит (наприер, если на MicroSD уже настроена и отлажена система), то можно перенести систему с MicroSD на eMMC. Правда это не сработает, если размер eMMC меньше размера MicroSD (1), а если сработает (размер eMMC больше размера MicroSD), то на eMMC, после копирования, будут созданы тома и разделы
|
||||||
можно перенести систему с MicroSD на eMMC. Правда это не сработает, если размер eMMC меньше размера MicroSD (1), а
|
ровно такого же размера, как на MicroSD (2).
|
||||||
если сработает (размер eMMC больше размера MicroSD), то на eMMC, после копирования, будут созданы тома и разделы
|
|
||||||
ровно такого же размера, как на MicroSD (2).
|
|
||||||
|
|
||||||
Для копирования раздела с MicroSD на eMMC:
|
Для копирования раздела с MicroSD на eMMC:
|
||||||
```shell
|
```shell
|
||||||
sudo dd bs=1M if=/dev/mmcblk1 of=/dev/mmcblk0 status=progress
|
sudo dd bs=1M if=/dev/mmcblk1 of=/dev/mmcblk0 status=progress
|
||||||
```
|
```
|
||||||
|
|
||||||
а для восстановления из резервной копии (не забываем смонтировать внешний накопитель с резервными копиями) что-то типа:
|
а для восстановления из резервной копии (не забываем смонтировать внешний накопитель с резервными копиями) что-то типа:
|
||||||
```shell
|
```shell
|
||||||
sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress
|
sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress
|
||||||
```
|
```
|
||||||
|
|
||||||
Это займет продолжительное время. Если мы делали восстановление из резервной копии, то можно будет сразу извлечь
|
Это займет продолжительное время. Если мы делали восстановление из резервной копии, то можно будет сразу извлечь
|
||||||
MicroSD и перезагрузиться. Но если мы копировали с MicroSD на eMMC, то нам надо будет еще расширить раздел на eMMC
|
MicroSD и перезагрузиться. Но если мы копировали с MicroSD на eMMC, то нам надо будет еще расширить раздел на eMMC
|
||||||
на весь объем накопителя, и расширить файловую систему. Так как она еще не смонтирована, то сделать это не сложно.
|
на весь объем накопителя и расширить файловую систему. Так как она еще не смонтирована, то сделать это несложно.
|
||||||
|
|
||||||
Установим в систему пакет утилит `cloud-guest-utils`. Из ее состава нас интересует утилита `growpart`
|
Установим в систему пакет утилит `cloud-guest-utils`. Из ее состава нас интересует утилита `growpart`
|
||||||
для автоматического увеличения размеров разделов на диске.
|
для автоматического увеличения размеров разделов на диске.
|
||||||
```shell
|
```shell
|
||||||
sudo apt install cloud-guest-utils
|
sudo apt install cloud-guest-utils
|
||||||
```
|
```
|
||||||
|
|
||||||
Увеличиваем второй раздел на eMMC (на первом у нас загрузчик):
|
Увеличиваем второй раздел на eMMC (на первом у нас загрузчик):
|
||||||
```shell
|
```shell
|
||||||
sudo growpart /dev/mmcblk0 2
|
sudo growpart /dev/mmcblk0 2
|
||||||
```
|
```
|
||||||
@@ -342,7 +333,7 @@ sudo growpart /dev/mmcblk0 2
|
|||||||
CHANGED: partition=2 start=2158592 old: size=121737216 end=123895808 new: size=486412255 end=488570847
|
CHANGED: partition=2 start=2158592 old: size=121737216 end=123895808 new: size=486412255 end=488570847
|
||||||
```
|
```
|
||||||
|
|
||||||
Теперь нужно "растянуть" файловую систему на этом разделе. Но для начала проведем проверки файловой системы раздела:
|
Теперь нужно «растянуть» файловую систему на этом разделе. Но для начала проведем проверки файловой системы раздела:
|
||||||
```shell
|
```shell
|
||||||
sudo e2fsck -f /dev/mmcblk0p2
|
sudo e2fsck -f /dev/mmcblk0p2
|
||||||
```
|
```
|
||||||
@@ -365,8 +356,8 @@ opi_root: ***** FILE SYSTEM WAS MODIFIED *****
|
|||||||
opi_root: 48812/3779520 files (0.2% non-contiguous), 1711779/15217152 blocks
|
opi_root: 48812/3779520 files (0.2% non-contiguous), 1711779/15217152 blocks
|
||||||
```
|
```
|
||||||
|
|
||||||
Как видим, нам показали две ошибки и предложили их исправить, и мы согласились (`y`). Теперь, после проверок
|
Как видим, нам показали две ошибки и предложили их исправить, и мы согласились (`y`). Теперь, после проверок
|
||||||
и исправлений, "растянем" файловую систему:
|
и исправлений, «растянем» файловую систему:
|
||||||
```shell
|
```shell
|
||||||
sudo resize2fs /dev/mmcblk0p2
|
sudo resize2fs /dev/mmcblk0p2
|
||||||
```
|
```
|
||||||
@@ -378,18 +369,17 @@ Resizing the filesystem on /dev/mmcblk0p2 to 60801531 (4k) blocks.
|
|||||||
The filesystem on /dev/mmcblk0p2 is now 60801531 (4k) blocks long.
|
The filesystem on /dev/mmcblk0p2 is now 60801531 (4k) blocks long.
|
||||||
```
|
```
|
||||||
|
|
||||||
Все. Раздел на eMMC увеличен на весь объем накопителя, и файловая система на нем тоже "растянута". Теперь можно
|
Все. Раздел на eMMC увеличен на весь объем накопителя, и файловая система на нем тоже «растянута». Теперь можно
|
||||||
выключить Orange Pi:
|
выключить Orange Pi:
|
||||||
```shell
|
```shell
|
||||||
sudo shutdown 0
|
sudo shutdown 0
|
||||||
```
|
```
|
||||||
|
|
||||||
Извлекаем MicroSD и включаем Orange Pi снова. Он должен загрузиться уже с eMMC.
|
Извлекаем MicroSD и включаем Orange Pi снова. Он должен загрузиться уже с eMMC.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## PS
|
## PS
|
||||||
|
|
||||||
В составлении этой заметки большую помощь оказала инструкция [Kaveh Kaviani](
|
В составлении этой заметки большую помощь оказала инструкция [Kaveh Kaviani](
|
||||||
https://github.com/kaveh-kaviani/Tutorials/blob/main/content/sbc/orange-pi/orange-pi-5/boot-linux-from-emmc/README.md).
|
https://github.com/kaveh-kaviani/Tutorials/blob/main/content/sbc/orange-pi/orange-pi-5/boot-linux-from-emmc/README.md).
|
||||||
Большое спасибо ему.
|
Большое спасибо ему.
|
||||||
|
|||||||
@@ -1,50 +1,55 @@
|
|||||||
# Сборка ядра Linux для Orange Pi 5 Plus (и других устройств на Rockchip RK3588) с поддержкой iSCSI
|
# Сборка ядра Linux для Orange Pi 5 Plus (и других устройств на Rockchip RK3588) с поддержкой iSCSI
|
||||||
|
|
||||||
Для моего проекта (k3s на Orange Pi 5 Plus) потребовалась поддержка система управления блочным хранилищем 'longhorn'
|
[](#)
|
||||||
(longhorn.io). _Longhorn_ позволяет создавать надёжные тома для контейнеров, автоматически реплицируя их между узлами
|
[](#)
|
||||||
и обеспечения высокую доступности приложений (если один узел выходит из строя, данные остаются доступны на репликах
|
[](https://git.cube2.ru/erjemin/doc_memo/src/branch/master/raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md)
|
||||||
на других узлах).
|
[](https://typograph.cube2.ru/)
|
||||||
|
|
||||||
Для _longhorn_ нужен `iSCSI` (**Internet Small Computer System Interface**) — сетевой протокол, который по TCP/IP
|
Для моего проекта (k3s на Orange Pi 5 Plus) потребовалась поддержка система управления блочным хранилищем 'longhorn'
|
||||||
подсоединяет удалённые диски так, будто они подключены физически. Longhorn через iSCSI обеспечивает передачу
|
(longhorn.io). _Longhorn_ позволяет создавать надёжные тома для контейнеров, автоматически реплицируя их между узлами
|
||||||
данных между узлами по сети.
|
и обеспечения высокую доступности приложений (если один узел выходит из строя, данные остаются доступны на репликах
|
||||||
|
на других узлах).
|
||||||
|
|
||||||
В ядре Linux поддержка _iSCSI_ реализована через модули, такие как `iscsi_tcp` и `scsi_transport_iscsi`. Однако,
|
Для _longhorn_ нужен `iSCSI` (**Internet Small Computer System Interface**) — сетевой протокол, который по TCP/IP
|
||||||
в большинстве дистрибутивов для одноплатных компьютеров, включая и Orange Pi 5 Plus, эти модули отключены. Это делают
|
подсоединяет удалённые диски так, будто они подключены физически. Longhorn через iSCSI обеспечивает передачу
|
||||||
для экономии ресурсов, да и в целом, это нетипичный сценарий использования Orange Pi. В версии Ubuntu 22.04
|
данных между узлами по сети.
|
||||||
для Orange Pi 5 Plus (в ядре от Xunlong), поддержка iSCSI тоже отключена, и это делает невозможным запуск Longhorn
|
|
||||||
из коробки.
|
|
||||||
|
|
||||||
**А значит нужно компиляция ядра (сбока)**
|
В ядре Linux поддержка _iSCSI_ реализована через модули, такие как `iscsi_tcp` и `scsi_transport_iscsi`. Однако,
|
||||||
|
в большинстве дистрибутивов для одноплатных компьютеров, включая и Orange Pi 5 Plus, эти модули отключены. Это делают
|
||||||
|
для экономии ресурсов, да и в целом, это нетипичный сценарий использования Orange Pi. В версии Ubuntu 22.04
|
||||||
|
для Orange Pi 5 Plus (в ядре от Xunlong), поддержка iSCSI тоже отключена, и это делает невозможным запуск Longhorn
|
||||||
|
из коробки.
|
||||||
|
|
||||||
Мы вручную включим поддержку _iSCSI_ (модули `iscsi_tcp` и `scsi_transport_iscsi`), и cможем настроить
|
**А значит нужно компиляция ядра (сбока)**
|
||||||
ядро под свои задачи. Однако компиляция и его замена требует осторожности и внимательности, ошибка в процессе может
|
|
||||||
привести к тому, что система не загрузится (но мы сделаем резервную копию текущего ядра, загрузчика, чтобы можно
|
Мы вручную включим поддержку _iSCSI_ (модули `iscsi_tcp` и `scsi_transport_iscsi`), и cможем настроить
|
||||||
|
ядро под свои задачи. Однако компиляция и его замена требует осторожности и внимательности, ошибка в процессе может
|
||||||
|
привести к тому, что система не загрузится (но мы сделаем резервную копию текущего ядра, загрузчика, чтобы можно
|
||||||
было восстановить систему).
|
было восстановить систему).
|
||||||
|
|
||||||
Обновления системы (например, через `apt`) с новым ядром будет проходить, как обычно: пакеты, утилиты и приложения
|
Обновления системы (например, через `apt`) с новым ядром будет проходить, как обычно: пакеты, утилиты и приложения
|
||||||
обновятся без проблем. Однако пересобранное ядро больше не будет автоматически обновляться через стандартные средства
|
обновятся без проблем. Однако пересобранное ядро больше не будет автоматически обновляться через стандартные средства
|
||||||
дистрибутива. Если выйдет новая версия ядра, то придётся вручную повторить процесс компиляции. К счастью,
|
дистрибутива. Если выйдет новая версия ядра, то придётся вручную повторить процесс компиляции. К счастью,
|
||||||
поставщик (это Xunlong) обновляет ядро не часто.
|
поставщик (это Xunlong) обновляет ядро не часто.
|
||||||
|
|
||||||
| ✎ Заметка |
|
| ✎ Заметка |
|
||||||
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Orange Pi 5 Plus использует процессор **Rockchip RK3588** (как и многие другие устройства под брендом Orange). Процесс компиляции ядра для всех RK35xx почти идентичен, и базируется на одном и том же дистрибутиве. Однако, разные периферийные устройства: например, GPIO, USB или Ethernet-контроллеры могут отличаться. Мы будем использовать `.config` от текущего, рабочего ядра, так что настройки будут актуальны. Но следует иметь в виду, что возможно, в будущем могут появиться изменения в конфигурации, дистрибутива и т.п. Следует учитывать, это и **никто ничего не гарантирует**. |
|
| Orange Pi 5 Plus использует процессор **Rockchip RK3588** (как и многие другие устройства под брендом Orange). Процесс компиляции ядра для всех RK35xx почти идентичен, и базируется на одном и том же дистрибутиве. Однако, разные периферийные устройства: например, GPIO, USB или Ethernet-контроллеры могут отличаться. Мы будем использовать `.config` от текущего, рабочего ядра, так что настройки будут актуальны. Но следует иметь в виду, что возможно, в будущем могут появиться изменения в конфигурации, дистрибутива и т. п. Следует учитывать, это и **никто ничего не гарантирует**. |
|
||||||
|
|
||||||
## План сборки ядра с iSCSI
|
## План сборки ядра с iSCSI
|
||||||
|
|
||||||
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т.п.
|
* Резервное копирование текущего ядра, загрузчика, дерева устройств, /boot и т. п.
|
||||||
* Установить инструментарий для настройки и компиляции ядра
|
* Установить инструментарий для настройки и компиляции ядра
|
||||||
* Скачать исходники.
|
* Скачать исходники.
|
||||||
* Настроить конфиг для включения модулей iSCSI (и мониторинга NVMe).
|
* Настроить конфиг для включения модулей iSCSI (и мониторинга NVMe).
|
||||||
* Скомпилировать ядро и модули.
|
* Скомпилировать ядро и модули.
|
||||||
* Установить новое ядро.
|
* Установить новое ядро.
|
||||||
* Перезагрузиться в новое ядро.
|
* Перезагрузиться в новое ядро.
|
||||||
* Проверка.
|
* Проверка.
|
||||||
|
|
||||||
## Резервное копирование текущего ядра и /boot
|
## Резервное копирование текущего ядра и /boot
|
||||||
|
|
||||||
Архивируем том `/boot` на нашем Orange Pi 5 Plus во временный каталог `/tmp`:
|
Архивируем том `/boot` на нашем Orange Pi 5 Plus во временный каталог `/tmp`:
|
||||||
```bash
|
```bash
|
||||||
sudo tar -czf /tmp/boot-backup.tar.gz /boot
|
sudo tar -czf /tmp/boot-backup.tar.gz /boot
|
||||||
```
|
```
|
||||||
@@ -59,19 +64,18 @@ ls -al /tmp/boot-backup.tar.gz
|
|||||||
-rw-r--r-- 1 root root 62116591 мар 23 20:33 /tmp/boot-backup.tar.gz
|
-rw-r--r-- 1 root root 62116591 мар 23 20:33 /tmp/boot-backup.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
Теперь нам нужно скопировать его на какой-нибудь внешний хост (или носитель, но я буду копировать на хост другого
|
Теперь нам нужно скопировать его на какой-нибудь внешний хост (или носитель, но я буду копировать на хост другого
|
||||||
компьютера). Если что-то пойдёт не так (например, после обновления ядра система не загрузится) можно будет восстановить
|
компьютера). Если что-то пойдёт не так (например, после обновления ядра система не загрузится) можно будет восстановить
|
||||||
файлы из этого архива. Мой Orange Pi 5 Plus, на котором я буду компилировать ядро имеет хост — `opi5plus-3` (замени
|
файлы из этого архива. Мой Orange Pi 5 Plus, на котором я буду компилировать ядро имеет хост — `opi5plus-3` (замени
|
||||||
на свой хост), а имя пользователя от которого я работаю — `opi` (замени на свой). На рабочем компьютере, с которого
|
на свой хост), а имя пользователя от которого я работаю — `opi` (замени на свой). На рабочем компьютере, с которого
|
||||||
я захожу по SSH на Orange, у меня есть папка `~/backup/` (`mkdir -p ~/backup`). Скачиваю в неё архив:
|
я захожу по SSH на Orange, у меня есть папка `~/backup/` (`mkdir -p ~/backup`). Скачиваю в неё архив:
|
||||||
```bash
|
```bash
|
||||||
scp opi@opi5plus-3.local:/tmp/boot-backup.tar.gz ~/backup/opi5plus-3-boot-backup.tar.gz
|
scp opi@opi5plus-3.local:/tmp/boot-backup.tar.gz ~/backup/opi5plus-3-boot-backup.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
### Что в архиве?
|
### Что в архиве?
|
||||||
|
|
||||||
Если что-то пойдет не так, нам надо знать какие файлы в `/boot` важны и для чего предназначены. Вот список файлов
|
Если что-то пойдет не так, нам надо знать какие файлы в `/boot` важны и для чего предназначены. Вот список файлов ('ls -al /boot'):
|
||||||
('ls -al /boot'):
|
|
||||||
```text
|
```text
|
||||||
drwxr-xr-x 4 root root 4096 янв 1 1970 ./
|
drwxr-xr-x 4 root root 4096 янв 1 1970 ./
|
||||||
drwxr-xr-x 19 root root 4096 фев 16 19:59 ../
|
drwxr-xr-x 19 root root 4096 фев 16 19:59 ../
|
||||||
@@ -93,42 +97,40 @@ drwxr-xr-x 3 root root 4096 ноя 21 09:55 dtb-6.1.43-rockchip-rk3588/
|
|||||||
```
|
```
|
||||||
|
|
||||||
Ключевые файлы:
|
Ключевые файлы:
|
||||||
* `Image` — собственно ядро Linux (в данном случае версия 6.1.43 для Rockchip RK3588). При старте компьютера загрузчик
|
* `Image` — собственно ядро Linux (в данном случае версия 6.1.43 для Rockchip RK3588). При старте компьютера загрузчик
|
||||||
U-Boot загрузит его в память и передаст ему управление. Без этого файла система не запустится.
|
U-Boot загрузит его в память и передаст ему управление. Без этого файла система не запустится.
|
||||||
* `vmlinuz-6.1.43-rockchip-rk3588` — копия ядра (в системе уже есть резервная копия).
|
* `vmlinuz-6.1.43-rockchip-rk3588` — копия ядра (в системе уже есть резервная копия).
|
||||||
* `dtb/` — Каталог файлами **Device Tree Blob** (`DTB`). Это бинарные файлы, описывающие аппаратное обеспечение устройства.
|
* `dtb/` — Каталог файлами **Device Tree Blob** (`DTB`). Это бинарные файлы, описывающие аппаратное обеспечение устройства.
|
||||||
Для Orange Pi 5 Plus используется файл вроде `rk3588-orangepi-5-plus.dtb` (находится в подкаталоге `dtb/rockchip/`).
|
Для Orange Pi 5 Plus используется файл вроде `rk3588-orangepi-5-plus.dtb` (находится в подкаталоге `dtb/rockchip/`).
|
||||||
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/` — это дополнительные файлы, которые могут использоваться для добавления
|
в подкаталоге dtb/rockchip/ есть `overlay/` — это дополнительные файлы, которые могут использоваться для добавления
|
||||||
и/или изменения функциональности устройства. Например, можно добавить поддержку новых периферийных устройств (камеру,
|
и/или изменения функциональности устройства. Например, можно добавить поддержку новых периферийных устройств (камеру,
|
||||||
дисплей и т.п.).
|
дисплей и т. п.).
|
||||||
* `uInitrd` — Начальный RAM-диск (initrd), адаптированный для U-Boot. Содержит модули и скрипты, необходимые для
|
* `uInitrd` — Начальный RAM-диск (initrd), адаптированный для U-Boot. Содержит модули и скрипты, необходимые для пред-загрузки (выбор накопителя, монтирование корневой файловой системы и т. п.). Если он повреждён или несовместим
|
||||||
пред-загрузки (выбор накопителя, монтирование корневой файловой системы и т.п.). Если он повреждён или несовместим
|
с ядром, загрузка может упасть на этапе инициализации.
|
||||||
с ядром, загрузка может упасть на этапе инициализации.
|
* `orangepiEnv.txt` — Конфигурационный файл для U-Boot. Здесь задаются параметры загрузки, такие как путь расположение
|
||||||
* `orangepiEnv.txt` — Конфигурационный файл для U-Boot. Здесь задаются параметры загрузки, такие как путь расположение
|
дерева DTB, UUID корневой файловой системы, тип файловой системы… Без правильных настроек в этом файле U-Boot не найдёт нужные для загрузки файлы.
|
||||||
дерева DTB, UUID корневой файловой системы, тип файловой системы… Без правильных настроек в этом файле U-Boot не
|
* `boot.scr` — Скрипт загрузки для U-Boot. Содержит команды для загрузки ядра, initrd и DTB. U-Boot выполняет его
|
||||||
найдёт нужные для загрузки файлы.
|
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
|
||||||
* `boot.scr` — Скрипт загрузки для U-Boot. Содержит команды для загрузки ядра, initrd и DTB. U-Boot выполняет его
|
U-Boot не сможет загрузить систему.
|
||||||
при старте системы. Этот файл создаётся из `boot.cmd` с помощью утилиты `mkimage`. Если он повреждён или отсутствует,
|
* `dtb-6.1.43-rockchip-rk3588/` — Копия каталога `dtb/`, обычно появляется, когда ядро устанавливается или обновляется
|
||||||
U-Boot не сможет загрузить систему.
|
через пакетный менеджер (например, `apt`). Она привязана к конкретной версии ядра — в данном случае
|
||||||
* `dtb-6.1.43-rockchip-rk3588/` — Копия каталога `dtb/`, обычно появляется, когда ядро устанавливается или обновляется
|
`6.1.43-rockchip-rk3588`, для того, чтобы: Хранить DTB-файлы, соответствующие этой версии ядра и избегать конфликты
|
||||||
через пакетный менеджер (например, `apt`). Она привязана к конкретной версии ядра — в данном случае
|
между DTB от разных версий ядра (если используется несколько ядер на одной системе).
|
||||||
`6.1.43-rockchip-rk3588`, для того, чтобы: Хранить DTB-файлы, соответствующие этой версии ядра и избегать конфликты
|
|
||||||
между DTB от разных версий ядра (если используется несколько ядер на одной системе).
|
|
||||||
|
|
||||||
Менее критичные, но полезные файлы:
|
Менее критичные, но полезные файлы:
|
||||||
* `config-6.1.43-rockchip-rk3588` — Конфигурация ядра, использованная при его сборке (он нам понадобится, чтобы
|
* `config-6.1.43-rockchip-rk3588` — Конфигурация ядра, использованная при его сборке (он нам понадобится, чтобы
|
||||||
пересобрать ядро с iSCSI).
|
пересобрать ядро с iSCSI).
|
||||||
* `System.map-6.1.43-rockchip-rk3588` — Карта меток (символов) ядра, полезна для отладки.
|
* `System.map-6.1.43-rockchip-rk3588` — Карта меток (символов) ядра, полезна для отладки.
|
||||||
* `initrd.img-6.1.43-rockchip-rk3588` — Обычный initrd, из которого генерируется uInitrd.
|
* `initrd.img-6.1.43-rockchip-rk3588` — Обычный initrd, из которого генерируется uInitrd.
|
||||||
* `boot.bmp` и `logo.bmp` — Изображения для экрана загрузки (не влияют на работу системы).
|
* `boot.bmp` и `logo.bmp` — Изображения для экрана загрузки (не влияют на работу системы).
|
||||||
|
|
||||||
## Устанавливать инструменты для сборки ядра
|
## Устанавливать инструменты для сборки ядра
|
||||||
|
|
||||||
Обновим репозитории и установим минимальный инструментарий для сборки ядра:
|
Обновим репозитории и установим минимальный инструментарий для сборки ядра:
|
||||||
```bash
|
```bash
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install -y build-essential bc flex bison libssl-dev libncurses-dev git
|
sudo apt install -y build-essential bc flex bison libssl-dev libncurses-dev git
|
||||||
@@ -136,26 +138,26 @@ sudo apt install -y build-essential bc flex bison libssl-dev libncurses-dev git
|
|||||||
|
|
||||||
Нам понадобятся следующие пакеты:
|
Нам понадобятся следующие пакеты:
|
||||||
|
|
||||||
* `build-essential` — Включает `gcc` (для ARM64, make и другие базовые инструменты компиляции.
|
* `build-essential` — Включает `gcc` (для ARM64, make и другие базовые инструменты компиляции.
|
||||||
* `bc` — Утилита для точных математических вычислений в командной строке. Используется для вычислений в скриптах сборки ядра.
|
* `bc` — Утилита для точных математических вычислений в командной строке. Используется для вычислений в скриптах сборки ядра.
|
||||||
* `flex` и `bison` — генератор лексических анализаторов и парсер. Нужны для обработки конфигурационных файлов ядра.
|
* `flex` и `bison` — генератор лексических анализаторов и парсер. Нужны для обработки конфигурационных файлов ядра.
|
||||||
* `libssl-dev` — Для поддержки криптографии в ядре и `OpenSSL`.
|
* `libssl–dev` — Для поддержки криптографии в ядре и `OpenSSL`.
|
||||||
* `libncurses-dev` — Библиотека для создания текстовых интерфейсов в терминале. Необходимо для работы интерфейса
|
* `libncurses-dev` — Библиотека для создания текстовых интерфейсов в терминале. Необходимо для работы интерфейса
|
||||||
`menuconfig` при настройке параметров ядра.
|
`menuconfig` при настройке параметров ядра.
|
||||||
* `git` — Для клонирования исходного кода ядра из репозитория Xunlong.
|
* `git` — Для клонирования исходного кода ядра из репозитория Xunlong.
|
||||||
|
|
||||||
> **Примечание:** Если вы хотите собрать ядро на x86-системе, установите кросс-компилятор `gcc-aarch64-linux-gnu` (`sudo apt install gcc-aarch64-linux-gnu`) и используйте его вместо обычного gcc в командах сборки. Он позволит собрать ядро для ARM64-архитектуры на x86-системе.
|
> **Примечание:** Если вы хотите собрать ядро на x86-системе, установите кросс-компилятор `gcc-aarch64-linux-gnu` (`sudo apt install gcc-aarch64-linux-gnu`) и используйте его вместо обычного gcc в командах сборки. Он позволит собрать ядро для ARM64-архитектуры на x86-системе.
|
||||||
|
|
||||||
|
|
||||||
## Скачивание и подготавливаем исходники ядра
|
## Скачивание и подготавливаем исходники ядра
|
||||||
|
|
||||||
Клонируем репозиторий Orange Pi для ядра 6.1 из репозитория Xunlong. Мы будем брать ветку (branch)
|
Клонируем репозиторий Orange Pi для ядра 6.1 из репозитория Xunlong. Мы будем брать ветку (branch)
|
||||||
`orange-pi-6.1-rk35xx`. Это ветка с исходниками для всех устройств на базе Rockchip RK35xx (включая Orange Pi 5 Plus):
|
`orange-pi-6.1-rk35xx`. Это ветка с исходниками для всех устройств на базе Rockchip RK35xx (включая Orange Pi 5 Plus):
|
||||||
```bash
|
```bash
|
||||||
git clone --depth 1 https://github.com/orangepi-xunlong/linux-orangepi -b orange-pi-6.1-rk35xx ~/linux-orangepi
|
git clone --depth 1 https://github.com/orangepi-xunlong/linux-orangepi -b orange-pi-6.1-rk35xx ~/linux-orangepi
|
||||||
```
|
```
|
||||||
|
|
||||||
После клонирования репозитория, переходим в каталог с ним:
|
После клонирования репозитория, переходим в каталог с ним:
|
||||||
```bash
|
```bash
|
||||||
cd ~/linux-orangepi
|
cd ~/linux-orangepi
|
||||||
```
|
```
|
||||||
@@ -165,7 +167,7 @@ cd ~/linux-orangepi
|
|||||||
uname -r
|
uname -r
|
||||||
```
|
```
|
||||||
|
|
||||||
Я на своем Orange Pi 5 Plus вижу (у вас может быть другая версия):
|
Я на своем Orange Pi 5 Plus вижу (у вас может быть другая версия):
|
||||||
```text
|
```text
|
||||||
6.1.43-rockchip-rk3588
|
6.1.43-rockchip-rk3588
|
||||||
```
|
```
|
||||||
@@ -175,42 +177,41 @@ uname -r
|
|||||||
nano Makefile
|
nano Makefile
|
||||||
```
|
```
|
||||||
|
|
||||||
И устанавливаем модификатор версии ядра, строку `XTRAVERSION =` (у меня это пятая строчка):
|
И устанавливаем модификатор версии ядра, строку `XTRAVERSION =` (у меня это пятая строчка):
|
||||||
```text
|
```text
|
||||||
EXTRAVERSION = -rockchip-rk3588
|
EXTRAVERSION = -rockchip-rk3588
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Затем копируем конфиг текущего ядра в конфиг для сборки.
|
Затем копируем конфиг текущего ядра в конфиг для сборки.
|
||||||
```bash
|
```bash
|
||||||
zcat /proc/config.gz > .config
|
zcat /proc/config.gz > .config
|
||||||
```
|
```
|
||||||
|
|
||||||
`.config` содержит все текущие настройки ядра. Это очень удобно, так как нужно добавить только поддержку нужных модулей
|
`.config` содержит все текущие настройки ядра. Это очень удобно, так как нужно добавить только поддержку нужных модулей
|
||||||
(в нашем случае `iSCSI`), а не настраивать всё с нуля.
|
(в нашем случае `iSCSI`), а не настраивать всё с нуля.
|
||||||
|
|
||||||
## Настройка конфига с iSCSI
|
## Настройка конфига с iSCSI
|
||||||
|
|
||||||
Теперь нужно отредактировать, `.config` чтобы включить `iSCSI`. Заходим в интерфейс конфигуратора ядра `menuconfig`:
|
Теперь нужно отредактировать, `.config` чтобы включить `iSCSI`. Заходим в интерфейс конфигуратора ядра `menuconfig`:
|
||||||
```bash
|
```bash
|
||||||
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
|
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
|
||||||
```
|
```
|
||||||
|
|
||||||
Используя стрелки на клавиатуре, чтобы двигаться по пунктам меню.
|
Используя стрелки на клавиатуре, чтобы двигаться по пунктам меню.
|
||||||
1. Перейди в `Device Drivers` → `SCSI device support` → `SCSI Transports`.
|
1. Перейди в `Device Drivers` → `SCSI device support` → `SCSI Transports`.
|
||||||
2. Найти внутри `iSCSI Transport Attributes`, с помощью стрелок выбрать его.
|
2. Найти внутри `iSCSI Transport Attributes`, с помощью стрелок выбрать его.
|
||||||
3. Нажимает `M` (для модуля) — появится `<M>` рядом с пунктом. Это означает, что модуль будет собираться как модуль,
|
3. Нажимает `M` (для модуля) — появится `<m>` рядом с пунктом. Это означает, что модуль будет собираться как модуль, а не встраиваться в ядро. Модуль (`iscsi_tcp.ko`) проще протестировать без перезагрузки.
|
||||||
а не встраиваться в ядро. Модуль (`iscsi_tcp.ko`) проще протестировать без перезагрузки.
|
4. В нижнем меню выбрать `<save>` и подтвердим сохранение в `.config`.
|
||||||
4. В нижнем меню выбрать `<Save>` и подтвердим сохранение в `.config`.
|
6. Вернуться в меню выше `SCSI device support` (через нижнее меню `<exit>`).
|
||||||
6. Вернуться в меню выше `SCSI device support` (через нижнее меню `<Exit>`).
|
7. Зайти в раздел `SCSI low-level drivers`.
|
||||||
7. Зайти в раздел `SCSI low-level drivers`.
|
8. Выбрать `iSCSI Initiator over TCP/IP` и нажать `M` (для модуля).
|
||||||
8. Выбрать `iSCSI Initiator over TCP/IP` и нажать `M` (для модуля).
|
9. Снова сохраняем конфиг в `.config` (через нижнее меню `<save>`).
|
||||||
9. Снова сохраняем конфиг в `.config` (через нижнее меню `<Save>`).
|
10. Выйти из `menuconfig` (через нижнее меню `<exit>`, три раза).
|
||||||
10. Выйти из `menuconfig` (через нижнее меню `<Exit>`, три раза).
|
|
||||||
|
|
||||||
| ✎ Может быть полезно: |
|
| ✎ Может быть полезно: |
|
||||||
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| На моём Orange Pi 5 Plus загрузка идет с NVMe диска ([см. как настроить](opi5plus-move-system-to-nvme-or-emmc.md)), и мне было полезно так же включить ещё и систему мониторинга NVMe: `Device Drivers` → `NVME Support`, найти пункт `SNVMe hardware monitoring` и включить его. В нижнем меню выбрать `<Save>` и подтвердим сохранение в `.config`. Выйти из `menuconfig` (через нижнее меню `<Exit>`, три раза). Теперь у меня будет возможность отслеживать состояние NVMe-диска (температуру, износ и т.д.) через инструменты вроде `nvme-cli`. |
|
| На моём Orange Pi 5 Plus загрузка идет с NVMe диска ([см. как настроить](opi5plus-move-system-to-nvme-or-emmc.md)), и мне было полезно так же включить ещё и систему мониторинга NVMe: `Device Drivers` → `NVME Support`, найти пункт `SNVMe hardware monitoring` и включить его. В нижнем меню выбрать `<save>` и подтвердим сохранение в `.config`. Выйти из `menuconfig` (через нижнее меню `<exit>`, три раза). Теперь у меня будет возможность отслеживать состояние NVMe-диска (температуру, износ и т. д.) через инструменты вроде `nvme-cli`.</exit></save> |
|
||||||
|
|
||||||
Проверим, что iSCSI включён:
|
Проверим, что iSCSI включён:
|
||||||
```bash
|
```bash
|
||||||
@@ -235,21 +236,18 @@ CONFIG_ISCSI_TCP=m
|
|||||||
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
|
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
|
```bash
|
||||||
sudo make modules_install
|
sudo make modules_install
|
||||||
```
|
```
|
||||||
|
|
||||||
После завершения ядро будет находиться в каталоге `~/linux-orangepi/arch/arm64/boot/` (файл `Image`), а дерево описания
|
После завершения ядро будет находиться в каталоге `~/linux-orangepi/arch/arm64/boot/` (файл `Image`), а дерево описания
|
||||||
устройства в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/` (наш файл для Orange Pi 5 Plus --
|
устройства в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/` (наш файл для Orange Pi 5 Plus – `rk3588-orangepi-5-plus.dtb`, дле версий 5, 5 Max, AI, Ultra соответствующие файлы там же).
|
||||||
`rk3588-orangepi-5-plus.dtb`, дле версий 5, 5 Max, AI, Ultra соответствующие файлы там же).
|
|
||||||
|
|
||||||
Проверим, что ядро скомпилировалось:
|
|
||||||
```bash
|
```bash
|
||||||
ls -l arch/arm64/boot/Image
|
ls -l arch/arm64/boot/Image
|
||||||
```
|
```
|
||||||
@@ -259,7 +257,7 @@ ls -l arch/arm64/boot/Image
|
|||||||
-rw-rw-r-- 1 opi opi 40579584 Mar 22 19:09 arch/arm64/boot/Image
|
-rw-rw-r-- 1 opi opi 40579584 Mar 22 19:09 arch/arm64/boot/Image
|
||||||
```
|
```
|
||||||
|
|
||||||
Размер должен почти совпасть (или полностью совпадать) с размером текущего ядра:
|
Размер должен почти совпасть (или полностью совпадать) с размером текущего ядра:
|
||||||
```bash
|
```bash
|
||||||
ls -l /boot/Image
|
ls -l /boot/Image
|
||||||
```
|
```
|
||||||
@@ -267,60 +265,58 @@ 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`) почти не увеличивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали `<M>`,
|
но само ядро (`Image`) почти не увеличивается, ведь `.ko`-модуль iSCSI не встраивается в ядро (мы выбрали `<m>`,
|
||||||
а не `<*>`). Кроме того, Linux выравнивает размеры файлов по блокам (например, 4 Кб), и добавление
|
а не `<*>`). Кроме того, Linux выравнивает размеры файлов по блокам (например, 4 Кб), и добавление
|
||||||
пары небольших модулей могут не повлиять на итоговый размер.
|
пары небольших модулей могут не повлиять на итоговый размер.
|
||||||
|
|
||||||
## Устанавливаем новое ядро рядом со старым
|
## Устанавливаем новое ядро рядом со старым
|
||||||
|
|
||||||
Мы должны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и оно скомпилировалось в каталог
|
Мы должны скопировать два файла в `/boot`. Первый — это `Image`. Это само ядро, и оно скомпилировалось в каталог
|
||||||
`~/linux-orangepi/arch/arm64/boot/`. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится
|
`~/linux-orangepi/arch/arm64/boot/`. Второй файл — это `rk3588-orangepi-5-plus.dtb`. Он находится
|
||||||
в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`. Как было сказано выше, это дерево описания оборудования
|
в `~/linux-orangepi/arch/arm64/boot/dts/rockchip/`. Как было сказано выше, это дерево описания оборудования
|
||||||
(Device Tree Blob), и нужно при загрузке ядра. Кстати, при компиляции мы получили `.dtb` для всех моделей Orange Pi 5
|
(Device Tree Blob), и нужно при загрузке ядра. Кстати, при компиляции мы получили `.dtb` для всех моделей 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`):
|
Копируем новые файлы в `/boot` с уникальными именами (с суффиксом `-iscsi`):</m>
|
||||||
```bash
|
```bash
|
||||||
sudo cp ~/linux-orangepi/arch/arm64/boot/Image /boot/Image-iscsi
|
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
|
sudo cp ~/linux-orangepi/arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dtb /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-iscsi
|
||||||
```
|
```
|
||||||
|
|
||||||
Старое ядро и дерево описания переименуем (это будет резервная копия, с суффиксом `-original`):
|
Старое ядро и дерево описания переименуем (это будет резервная копия, с суффиксом `-original`):
|
||||||
```bash
|
```bash
|
||||||
sudo mv /boot/Image /boot/Image-original
|
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
|
sudo mv /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-original
|
||||||
```
|
```
|
||||||
|
|
||||||
Устанавливаем новые ядро и дерево:
|
Устанавливаем новые ядро и дерево:
|
||||||
```bash
|
```bash
|
||||||
sudo cp /boot/Image-iscsi /boot/Image
|
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
|
sudo cp /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb-iscsi /boot/dtb/rockchip/rk3588-orangepi-5-plus.dtb
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Важно**: Не обновляйте `uInitrd`, если текущий работает, — его замена может сломать загрузку системы.
|
> **Важно**: Не обновляйте `uInitrd`, если текущий работает, — его замена может сломать загрузку системы.
|
||||||
|
|
||||||
Все готово.
|
Все готово.
|
||||||
|
|
||||||
## Перезагрузка в новое ядро
|
## Перезагрузка в новое ядро
|
||||||
|
|
||||||
Тут все просто:
|
Тут все просто:
|
||||||
```bash
|
```bash
|
||||||
sudo reboot
|
sudo reboot
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Если что-то пошло не так и система не загрузилась
|
#### Если что-то пошло не так и система не загрузилась
|
||||||
|
|
||||||
Если вы все делали правильно, то такого быть не должно. Но, тем не менее, если загрузка не произошла, то это может
|
Если вы все делали правильно, то такого быть не должно. Но, тем не менее, если загрузка не произошла, то это может
|
||||||
выглядеть двумя способами:
|
выглядеть двумя способами:
|
||||||
* Система зависает на этапе загрузки: синенький огонек на Orange Pi не загорается и Ethernet тоже не мигает —
|
* Система зависает на этапе загрузки: синенький огонек на Orange Pi не загорается и Ethernet тоже не мигает — _вы неправильно собрали ядро или испортили загрузчик.
|
||||||
_вы неправильно собрали ядро или испортили загрузчик.
|
* Система, вроде как, грузится, но все никак… огоньки весело мигают, но не получается подключиться ни по SSH, ни другим способом, пинги на IP-адрес не проходят — вы забыли подключить модули, накосячили с конфигом или с `.dtb`_.
|
||||||
* Система, вроде как, грузится, но все никак… огоньки весело мигают, но не получается подключиться ни по SSH, ни
|
|
||||||
другим способом, пинги на IP-адрес не проходят — вы забыли подключить модули, накосячили с конфигом или с `.dtb`_.
|
|
||||||
|
|
||||||
Чтобы починить, загружайтесь с MicroSD-карты (не забудьте отключить питание перед тем как вставить MicroSD-карту).
|
Чтобы починить, загружайтесь с MicroSD-карты (не забудьте отключить питание перед тем как вставить MicroSD-карту).
|
||||||
Затем смонтируйте, в зависимости где у вас система, eMMC:
|
Затем смонтируйте, в зависимости где у вас система, eMMC:
|
||||||
```bash
|
```bash
|
||||||
mkdir -p /mnt/emmc
|
mkdir -p /mnt/emmc
|
||||||
mount /dev/mmcblk2p1 /mnt/emmc
|
mount /dev/mmcblk2p1 /mnt/emmc
|
||||||
@@ -334,7 +330,7 @@ mount /dev/nvme0n1p1 /mnt/nvme
|
|||||||
cd /mnt/nvme
|
cd /mnt/nvme
|
||||||
```
|
```
|
||||||
|
|
||||||
И восстанавливаем старое ядро и дерево описания:
|
И восстанавливаем старое ядро и дерево описания:
|
||||||
```bash
|
```bash
|
||||||
sudo cp Image-original Image
|
sudo cp Image-original Image
|
||||||
sudo cp dtb/rockchip/rk3588-orangepi-5-plus.dtb-original dtb/rockchip/rk3588-orangepi-5-plus.dtb
|
sudo cp dtb/rockchip/rk3588-orangepi-5-plus.dtb-original dtb/rockchip/rk3588-orangepi-5-plus.dtb
|
||||||
@@ -345,21 +341,21 @@ sudo cp dtb/rockchip/rk3588-orangepi-5-plus.dtb-original dtb/rockchip/rk3588-ora
|
|||||||
sudo poweroff
|
sudo poweroff
|
||||||
```
|
```
|
||||||
|
|
||||||
Вынимаем MicroSD-карту, включаем, и загрузиться старая система.
|
Вынимаем MicroSD-карту, включаем, и загрузиться старая система.
|
||||||
|
|
||||||
## Проверка нового ядра
|
## Проверка нового ядра
|
||||||
|
|
||||||
Если же иситма поле обновления ядра загрузилась, проверим текущую версию ядра:
|
Если же иситма поле обновления ядра загрузилась, проверим текущую версию ядра:
|
||||||
```bash
|
```bash
|
||||||
uname -r
|
uname -r
|
||||||
```
|
```
|
||||||
|
|
||||||
Она должна остаться той же:
|
Она должна остаться той же:
|
||||||
```text
|
```text
|
||||||
6.1.43-rockchip-rk3588
|
6.1.43-rockchip-rk3588
|
||||||
```
|
```
|
||||||
|
|
||||||
Проверим, работает ли iSCSI:
|
Проверим, работает ли iSCSI:
|
||||||
```bash
|
```bash
|
||||||
sudo systemctl status iscsid
|
sudo systemctl status iscsid
|
||||||
```
|
```
|
||||||
@@ -389,11 +385,11 @@ TriggeredBy: ● iscsid.socket
|
|||||||
|
|
||||||
| ✎ Заметка |
|
| ✎ Заметка |
|
||||||
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| Если вы включили мониторинг NVMe, то проверим и его. Установим nvme-cli: `sudo apt install nvme-cli` и проверим состояние нашего накопителя `sudo nvme smart-log /dev/nvme0n1`. |
|
| Если вы включили мониторинг NVMe, то проверим и его. Установим nvme-cli: `sudo apt install nvme-cli` и проверим состояние нашего накопителя `sudo nvme smart-log /dev/nvme0n1`. |
|
||||||
|
|
||||||
**ВСË!**
|
**ВСË!**
|
||||||
|
|
||||||
А, да, не забудьте удалить репозиторий с исходниками ядра, если он вам больше не нужен:
|
А, да, не забудьте удалить репозиторий с исходниками ядра, если он вам больше не нужен:
|
||||||
```bash
|
```bash
|
||||||
rm -rf ~/linux-orangepi
|
rm -rf ~/linux-orangepi
|
||||||
```
|
```
|
||||||
Reference in New Issue
Block a user