doc_memo/raspberry-and-orange-pi/opi5plus-move-sistem-to-emmc.md

13 KiB
Raw Blame History

Orange Pi 5 Plus: перенос системы на eMMC (или M.2 NVMe)

По правде сказать, приведенный ниже рецепт не совсем перенос системы с MicroSD (она же MicroSDHC или MicroSDXC) на eMMC-носитель или SSD-накопитель NVMe. Это, скорее, установка чистой системы на eMMC или SSD. Но, тем не менее, в процессе описания будут комментарии, и пояснения, благодаря которым можно будет перенести и уже работающую и отлаженную систему.

Процедура немного напоминает магию, но это результат глубокого заныривания в интернет, и проверено сработает.

Выключим Orange Pi 5 Plus и установим в него eMMC-носитель и/или SSD-накопитель NVMe.

Orange Pi 5 Plus

После этого включим Orange Pi 5 Plus. И после того как он загрузится, посмотрим какие устройства и тома есть в системе:

sudo lsblk

Увидим что-то подобное:

NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mtdblock0     31:0    0    16M  0 disk 
mmcblk1      179:0    0  59.7G  0 disk 
├─mmcblk1p1  179:1    0     1G  0 part /boot
└─mmcblk1p2  179:2    0    58G  0 part /var/log.hdd
                                       /
mmcblk0      179:32   0   233G  0 disk 
└─mmcblk0p1  179:33   0 230.6G  0 part 
mmcblk0boot0 179:64   0     4M  1 disk 
mmcblk0boot1 179:96   0     4M  1 disk 
zram0        254:0    0   7.7G  0 disk [SWAP]
zram1        254:1    0   200M  0 disk /var/log

Важно обратить внимание на объемы накопителей. В данном случае, у нас есть MicroSD-носитель mmcblk1 (59.7G — это 64Gb флешка) и eMMC-носитель mmcblk0 (233G — это 256Gb eMMC). У вас могут быть другие объемы и другие имена устройств. Так же обратите внимание, ещё у нас есть mtdblock0 — это внутренняя SPI-флеш, которая используется для загрузки системы. Если у вас есть SSD-накопитель NVMe, он будет иметь имя вроде nvme0n1.

На этом этапе, если мы хотим именно перенести систему, самое время сделать образ нашей MicroSD на внешний носитель (например, на USB-диск или сетевое хранилище). Смонтируем внешний накопитель, например для сетевого хранилища c Samba:

mount -t cifs -o username=NAS_USERNAME,password=SECRET //xxx.xxx.xxx.xxx/путь-к-месту-для-сохранения-образа /media/backup/

Где:

  • NAS_USERNAME — имя пользователя для доступа к сетевому хранилищу;
  • SECRET — пароль для доступа к сетевому хранилищу;
  • xxx.xxx.xxx.xxx — IP-адрес сетевого хранилища;
  • путь-к-каталогу-для-сохраненияь-обраа — путь к каталогу на сетевом хранилище, куда будет сохранен образ;
  • /media/backup/ — точка монтирования сетевого хранилища.

Сделаем образ MicroSD в файл flash-disk.img на этом внешнем накопителе:

sudo dd if=/dev/mmcblk1 of=/media/backup/flash-disk.img status=progress

Это займет некоторое время (и иногда, в зависимости от скорости внешнего накопителя и размера MicroSD, довольно продолжительное). После того как образ будет готов, установим в систему gdisk — утилиту для работы с таблицами разделов:

sudo apt install gdisk

Очистим разделы на SPI-флеш (внутренней флеш-памяти с загрузчиками)

Запустим gdisk для работы с заделами на SPI mtdblock0 (загрузчиками):

sudo gdisk /dev/mtdblock0

Увидим что-то подобное:

GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): 

Если введем ? и нажмем Enter, увидим список команд:

b       back up GPT data to a file
c       change a partition's name
d       delete a partition
i       show detailed information on a partition
l       list known partition types
n       add a new partition
o       create a new empty GUID partition table (GPT)
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       sort partitions
t       change a partition's type code
v       verify disk
w       write table to disk and exit
x       extra functionality (experts only)
?       print this menu

Выполним команду p и Enter, чтобы увидеть список разделов:

Disk /dev/mtdblock0: 32768 sectors, 16.0 MiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 8158
Partitions will be aligned on 64-sector boundaries
Total free space is 1021 sectors (510.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              64            1023   480.0 KiB   8300  idbloader
   2            1024            7167   3.0 MiB     8300  uboot

Command (? for help):

Как видим, у нас есть два раздела: idbloader и uboot. Нам нужно удалить их. Для этого выполним команду d и Enter. Увидим:

Partition number (1-2):

Введем номер раздела 1 и Enter. Раздел будет удален. Повторим для раздела 2. Снова выполним команду d и Enter. Теперь нас не спросят номер раздела, оставшийся раздел будет удален без лишних вопросов. Если у вас, вдруг, было больше двух разделов, надо последовательно удалить их все.

Теперь нам нужно сохранить изменения. Для этого выполним команду w и Enter. Увидим:

Warning! Secondary header is placed too early on the disk! Do you want to
correct this problem? (Y/N):

Подтверждаем наше намерения перезаписать таблицу разделов. Вводим введя y и Enter. Увидим:

Have moved second header and partition table to correct location.

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N):

Еще раз подтверждаем наше намерение перезаписать таблицу разделов. Вводим y и Enter. Увидим:

OK; writing new GUID partition table (GPT) to /dev/mtdblock0.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

Очистим разделы на целевом eMMC (или SSD NVMe)

Теперь нам нужно очистить разделы на целевом накопителе. Для этого запустим gdisk для работы с разделами на eMMC (в нашем случае это mmcblk0):

sudo gdisk /dev/mmcblk0

Проделаем те же операции, что и с SPI-флешем. Не буду повторяться, так как процедура аналогична. Важно помнить, что нам нужно удалить все(!) разделы.

Выравняем разделы на eMMC (или SSD NVMe)

Выравнивание секторов eMMC гарантирует правильное распознавание загрузочного диска. Снова запустим gdisk для нашего eMMC:

sudo gdisk /dev/mmcblk0

Дадим команду p и Enter, чтобы, чтобы увидеть список разделов, и обратим внимание, на текст над таблицей разделов:

Disk /dev/mmcblk0: 488570880 sectors, 233.0 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 488570846
Partitions will be aligned on 2048-sector boundaries
Total free space is 4974559 sectors (2.4 GiB)

В данном случае все нормально: как видим выше, основная таблицы разделов начинается с сектора 2 и заканчивается на 33, а первый используемый сектор — это любое число, кроме 34 (в нашем случае 2048). Можно пропустить следующие шаги. Но если у вас нет так, то необходимо переформатировать сектора перед записью новой таблицы разделов на диск.

Для этого выполним следующие шаги:

Вводим команду x и Enter, чтобы перейти в экспертный режими. В режиме доступны следующие команды:

a       set attributes
b       byte-swap a partition's name
c       change partition GUID
d       display the sector alignment value
e       relocate backup data structures to the end of the disk
f       randomize disk and partition unique GUIDs
g       change disk GUID
h       recompute CHS values in protective/hybrid MBR
i       show detailed information on a partition
j       move the main partition table
l       set the sector alignment value
m       return to main menu
n       create a new protective MBR
o       print protective MBR data
p       print the partition table
q       quit without saving changes
r       recovery and transformation options (experts only)
s       resize partition table
t       transpose two partition table entries
u       replicate partition table on new device
v       verify disk
w       write table to disk and exit
z       zap (destroy) GPT data structures and exit
?       print this menu

Переместите основную таблицу разделов. Для этого введите j и Enter. Будет предложено задать сектор для расположения начала основной таблицы разделов:

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):

Вводим 2 и Enter. Затем сохраняем изменения, выполнив команду w и Enter. И пройдя два подтверждения (y и Enter) выходим из gdisk.

ls /dev/mmcblk0boot0 | cut -c1-12
/dev/mmcblk0
sudo sync
sudo fdisk -l
...
...

Disk /dev/mmcblk0: 232.97 GiB, 250148290560 bytes, 488570880 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

Device           Start     End Sectors  Size Type
/dev/mmcblk0p1   61440 2158591 2097152    1G Linux extended boot
/dev/mmcblk0p2 2158592 7610334 5451743  2.6G Linux filesystem

...
...

https://github.com/kaveh-kaviani/Tutorials/blob/main/content/sbc/orange-pi/orange-pi-5/boot-linux-from-emmc/README.md