LINUX.ORG.RU

Монтирование образа без разделов? Как добавить разделы?

 , , ,


0

2

Есть одноплатник luckfox pico pro max. Для него есит SDK, который собирает linux. В дальнейшем можно собрать образ для sd-карты, отдельный скриптом. Я поковырял скрипт, он делает следующее:

dd if=env.img of=disk.img bs=1k seek=0
dd if=idblock.img of=disk.img bs=1k seek=32
dd if=uboot.img of=disk.img bs=1k seek=544
dd if=boot.img of=disk.img bs=1k seek=800
dd if=oem.img of=disk.img bs=1k seek=33568
dd if=userdata.img of=disk.img bs=1k seek=557856
dd if=rootfs.img of=disk.img bs=1k seek=820000

А затем можно disk.img залить на sd-карту:

dd if=disk.img of=/dev/sdX bs=1M

И оно будет работать.

Как в образ disk.img добавить таблицу разделов?

Ответ на: комментарий от aol

чтобы что? :)

Вставить sd-карту в компьютер и спокойно смонтировать раздел, {за,вы}грузить файлы.

чтобы он енв хранил в файле - можно будет перенести на раздел

Не понимаю. Куда env?

Jullyfish
() автор топика

никак :) данная прошивка не работает с таблицей разделов. местоположение разделов захардкорено в прошивку (??)

pfg ★★★★★
()

Можно конечно извратиться, взять старенькую MSDOS таблицу разделов и разместить в ней разделы так, чтобы их и девайс понимал без изменений (при условии что в env.img не используются первые 512 байт, в чем я глубоко сомневаюсь), и в комп вставить можно было.

Другой вариант – переконфигурить u-boot чтобы env он брал из другого места, там в этом плане полная свобода действий. Заодно можно и в u-boot включить опцию на парсинг таблицы разделов и отвязаться от хардкода.

a1ba ★★★
()
Последнее исправление: a1ba (всего исправлений: 1)
Ответ на: комментарий от a1ba

переконфигурить u-boot

Это приемлемый вариант.

Подскажете в каком направлении двигаться? Я предполагаю, что надо поковырять config файл uboot и, наверное, изменить bootargs в device-tree, но могу ошибаться.

Jullyfish
() автор топика
Ответ на: комментарий от apt_install_lrzsz

Как-то странно всё это в скрипте сделано.

Это не первый SDK связанный с rockchip, который я ковыряю. Там много странного (скорее даже «сомнительного»). ИМХО, конкретно в данном случае вполне неплохо сделано, ибо в этом возможно разобраться.

Jullyfish
() автор топика
Ответ на: комментарий от cobold

Сделай скрипт для монтирования да залей на свой гитхаб. Вроде же очевидное решение

Как по мне, это решение проблемы, которую изначально не надо создавать.

Jullyfish
() автор топика
dd if=env.img of=disk.img bs=1k seek=0

Избавиться от этого пересобрав U-Boot для хранения переменных в нормальном месте.

Тогда можно GPT использовать для разметки.

dd if=idblock.img of=disk.img bs=1k seek=32

Стартовая позиция для загрузчика в камне.

Можно зафиксировать как раздел или резервная область в GPT.

Вместо разбиения на несколько кусков, можно объединить в один результирующий файл U-Boot.

Пример разметки нормального человека: https://github.com/buildroot/buildroot/blob/master/board/radxa/rock5b/genimage.cfg

AlexVR ★★★★★
()
Ответ на: комментарий от andytux

Таблица разделов это не твоя прихоть. Её должно устройство понимать.

Устройству пофигу.

У него есть стартовая точка (в данном случае по смещению 32К) с которой оно считывает загрузчик (или информацию о нём).

Во всех хоть сколько-то актуальных микропроцессорах эта точка за пределами заголовка GPT.

Так что можно смело информацию с этого смещения или поместить в раздел или сдвинуть первый раздел.

GPT должен понимать U-Boot и Ядро Linux (что они и умеют).

MBR - нафиг не нужен.

В текущей ситуации - вообще идиотизм.

Нормальная таблица разделов нужна, хотя бы для автоматического увеличения последнего раздела.

AlexVR ★★★★★
()
Ответ на: комментарий от a1ba

Увы.

00000000: 7dd9 f1c5 626c 6b64 6576 7061 7274 733d  }...blkdevparts=
00000010: 6d6d 6362 6c6b 313a 3332 4b28 656e 7629  mmcblk1:32K(env)
00000020: 2c35 3132 4b40 3332 4b28 6964 626c 6f63  ,512K@32K(idbloc
00000030: 6b29 2c32 3536 4b28 7562 6f6f 7429 2c33  k),256K(uboot),3
00000040: 324d 2862 6f6f 7429 2c35 3132 4d28 6f65  2M(boot),512M(oe
00000050: 6d29 2c32 3536 4d28 7573 6572 6461 7461  m),256M(userdata
00000060: 292c 3647 2872 6f6f 7466 7329 0073 7973  ),6G(rootfs).sys
00000070: 5f62 6f6f 7461 7267 733d 2072 6f6f 743d  _bootargs= root=
00000080: 2f64 6576 2f6d 6d63 626c 6b31 7037 2072  /dev/mmcblk1p7 r
00000090: 6f6f 7466 7374 7970 653d 6578 7434 2072  ootfstype=ext4 r
000000a0: 6b5f 646d 615f 6865 6170 5f63 6d61 3d36  k_dma_heap_cma=6
000000b0: 364d 0073 645f 7061 7274 733d 6d6d 6362  6M.sd_parts=mmcb
000000c0: 6c6b 303a 3136 4b40 3531 3228 656e 7629  lk0:16K@512(env)
000000d0: 2c35 3132 4b40 3332 4b28 6964 626c 6f63  ,512K@32K(idbloc
000000e0: 6b29 2c34 4d28 7562 6f6f 7429 0000 0000  k),4M(uboot)....

А далее уже нули.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Измени настройки U-Boot. Это переменные для него. Размести их за пределами. Должно быть что-то вроде:

+------------------+
| GPT table        |
+------------------+ 32K
| idblock + u-boot |
+------------------+
| U-Boot env       |
+------------------+
| rootfs           |
+------------------+
| GPT table        |
+------------------+
AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Избавиться от этого пересобрав U-Boot для хранения переменных в нормальном месте.

Благодарю, попробую.

Стартовая позиция для загрузчика в камне.

Благодарю, буду знать.

Можно зафиксировать как раздел или резервная область в GPT.

Не умею в GPT. :^)

По крайней мере пока…

Jullyfish
() автор топика
Ответ на: комментарий от AlexVR

MBR - нафиг не нужен.

В текущей ситуации - вообще идиотизм.

Тут поясните, пожалуйста.

Я бы, может, этот env сдвинул бы на 1К и в начале MBR добавить (хотя бы в качестве факультатива).

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

MBR - прошлый век. Что ещё тут пояснять.

GPT спокойно даст

  • два корня для A/B обновления.
  • оверлей на /etc
  • отдельные /home, /var, /data
  • swap
  • recovery раздел
  • и т.д. что только в голову придёт.
AlexVR ★★★★★
()
Ответ на: комментарий от Jullyfish

чтобы что? :)

Вставить sd-карту в компьютер и спокойно смонтировать раздел, {за,вы}грузить файлы.

А потом вставить обратно и… оно не работает. Просто потому, что устройство не умеет работать с таблицей разделов, разделами и файлами.

mord0d ★★★★★
()

А затем можно disk.img залить на sd-карту:

dd if=disk.img of=/dev/sdX bs=1M

Для этих целей давно уже есть bmaptool. Он и меньше запишет и sync вызовет.

Ну и вишенка:

sudo eject /dev/sdX
AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

вопрос: ты хочешь мучить NPU или просто плату?

Просто плату.

Хотя, на текущем этапе мы с камерами играемся, я к ней подключался, там из коробки (если из SDK собрать) есть какой-то (мега кривой) face recognition.

Jullyfish
() автор топика
Ответ на: комментарий от AlexVR
DDR V1.10 ec2fae0c96 wesley.yao 22/11/15-10:58:09
S5P1
f967
rgef1
DDRConf2
DDR3, BW=16 Col=10 Bk=8 CS0 Row=14 CS=1 Die BW=16 Size=256MB
924MHz
DDR bin out

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
> ENVF: Primary 0x00000000 - 0x00008000
> ENVF: OK
Trying fit image at 0x440 sector
## Verified-boot: 0
## Checking uboot 0x00200000 (lzma @0x00400000) ... sha256(7a82b051e5...) + sha256(db333376af...) + OK
## Checking fdt 0x00261170 ... sha256(9f596c5683...) + OK
Total: 243.154 ms

Похоже нашёл где задаётся расположение env. Это CONFIG_ENV_OFFSET и CONFIG_ENV_SIZE. Сейчас буду пробовать.

Jullyfish
() автор топика
Ответ на: комментарий от AlexVR

Я залил env.img в другую часть:

dd if=env.img of=disk.img bs=1k seek=$(( 800-32 ))

В конфиг u-boot добавил CONFIG_ENV_OFFSET=0xC0000.

Увы:

DDR V1.10 ec2fae0c96 wesley.yao 22/11/15-10:58:09
S5P1
f967
rgef1
DDRConf2
DDR3, BW=16 Col=10 Bk=8 CS0 Row=14 CS=1 Die BW=16 Size=256MB
924MHz
DDR bin out

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
> Trying to boot from MMC2
> ENVF: !bad CRC @ 0x0 
> ENVF: !bad CRC @ 0x0 
> spl: partition error 
Trying to boot from MTD1
ENVF: Primary 0x00000000 - 0x00040000
ENVF: OK
Trying fit image at 0x400 sector
## Verified-boot: 0
## Checking uboot 0x00200000 (lzma @0x00400000) ... sha256(8f1e014ce2...) + sha256(5352c83233...) + OK
## Checking fdt 0x0025bed0 ... sha256(51bba657c3...) + OK
Total: 258.582 ms

Jumping to U-Boot(0x00200000)
Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

В этом env описаны размеры разделов, их тоже надо править/смещать.

Насколько я помню в GPT начало как раз и не используется, обычно там нули. Первые 512 байт точно не используется GPT. Там может быть MBR. Если будет что-то другое то может будет работать, а может не распознает.

Предлагаю сделать пустой файл размера диска, разбить через gparted и потом скопировать только GPT в образ или на карту, не трогая env в начале. У GPT еще в самом конце диска есть копия и некоторым программам не понравится её отсутствие, но при монтировании gparted предложит это исправить.

P.S.: Совсем недавно Luckfox Pico Mini брал у знакомого посмотреть, отсутствие таблицы разделов лично меня не напрягает.

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 2)
Ответ на: комментарий от jpegqs

В этом env описаны размеры разделов, их тоже надо править/смещать.

Поэтому я и запихал между uboot и boot, а остальное не двигал, чтобы как раз не править параметры.

Выглядят они так:

blkdevparts=mmcblk1:32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs) rootfstype=ext4

Хотя 32K(env) смущает, но вроде как хотя бы до загрузки kernel должно дойти. (Хотя я могу ошибаться).

Jullyfish
() автор топика
Ответ на: комментарий от jpegqs

Может таки вообще ничего не двигать?

Может быть.

В GPT эта ситуация заранее предусмотрена, что в начале что-то будет.

В принципе, да, размер env меньше 256 байт. Так что можно уменьшить размер env до 1 сегмента, а всё остальное отдать под GPT.

На словах красиво, но как это сделать я не понимаю. :^)

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

На словах красиво, но как это сделать я не понимаю. :^)

Записать образ на карту, открыть в gparted или другом - создать GPT, добавить там разделы, не форматировать - посмотреть что будет. Если env в начале удалит, то вернуть через dd.

И размер env не трогать нигде, может и так будет работать с GPT в конце.

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 1)
Ответ на: комментарий от Jullyfish

Попытался собрать этот SDK по инструкции… Свалился на depricated функциях при сборке host-утилит…

З.Ы.: пока сохраню сюда:

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

Попытался собрать этот SDK по инструкции… Свалился на depricated функциях при сборке host-утилит…

А вы под какой системой собираете? Это не первый Rockchip SDK, с которым имею дело. Там обычно dependency hell и нужна прям конкретная Ubuntu. Я её качаю через debootstrap, а дальше chroot.

U-Boot, Ядро, rkbin и т.п. от Rockchip, на базе которых сделан SDK

Про эту репу знаю. Им ещё в конце года mpp заблокировали.

Документация на чип:

Про эту репу не знал, благодарю.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Это не первый Rockchip SDK, с которым имею дело. Там обычно dependency hell и нужна прям конкретная Ubuntu.

Ну это проблема старых buildroot в целом.

И один фиг, в прод это закидывать так себе идея. Куча старых дырявых пакетов + старые компиляторы. Предпочитаю, после демо запуска, переходить на актуальные buildroot/yocto.

Из последних порадовал RK3568. Всё нужное в Mainline.

T113 вынес мозги, совсем уж минимальная поддержка. Приходится таскать пачку патчей и в драйвера регулярно заползать.

AlexVR ★★★★★
()
Ответ на: комментарий от Jullyfish

Не знаю u-boot, но как-то странно. Вроде, размер блока env равен 32 кБайт, что по содержимому, что по выводу «ENVF: Primary», а вы пишете через dd всего 1 кБайт. Может у этого блока CRC посчитан для всех 32 кБайт, а у вас там на 769 килобайт какой-нибудь мусор, а не нули.

Вроде, вам нужно fw_printenv и fw_setenv, настроить их на этот disk.img и смотреть.

А разделы, в вашем случае, ИМХО, лучше создавать с помощью sgdisk, его в скрипт вставлять. Плюс, надо помнить, что у gpt есть копия в конце, то есть последний раздел не должен быть до конца sd-карточки.

mky ★★★★★
()
Ответ на: комментарий от jpegqs

Сейчас просто попробовал создать пустую GPT на sd-карте. fdisk затирает env, а вот gdisk – нет. Но, увы:

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
spl: partition error
Trying to boot from MTD1

Я посмотрел, gdisk добавляет какой-то «мусор» в первый сектор, поэтому я ещё сделал так:

dd if=env.img of=/dev/sda bs=512 count=1 ; sync

Также увы:

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
ENVF: !bad CRC @ 0x0
ENVF: !bad CRC @ 0x0
spl: partition error

И размер env не трогать нигде

Попробую изменить размер в конфигурации u-boot. И попробую сначала так запустить. Если успех, попробую ещё пустую GPT добавить.

Jullyfish
() автор топика
Ответ на: комментарий от AlexVR

Ну это проблема старых buildroot в целом.

Насколько старых? Если верить luckfoxSDK там версия Buildroot 2023.02.6.

И один фиг, в прод это закидывать так себе идея.

Ну-с, я это в прод запихивать не планирую (но знаю тех, кто так делает). И в идеале планировал с чистым buildroot это сделать.

Предпочитаю, после демо запуска

Я демо запуск провёл как с emmc, так и с sd-карты. :^)

переходить на актуальные buildroot/yocto

А это вообще тяжело? Как я понимаю, это dts надо переносить, мб драйверы какие. Что-то ещё?

T113 вынес мозги, совсем уж минимальная поддержка. Приходится таскать пачку патчей и в драйвера регулярно заползать.

Это Allwinner? Мне казалось, наоборот, у них там полный порядок. Чуть-чуть ковырял Orange Pi PC2 (Allwinner), там с документацией, как по мне, было гораздо лучше, чем у Orange Pi 3B (Rockchip). Но я Linux не собирал, я OpenBSD ставил поиграться.

Jullyfish
() автор топика
Ответ на: комментарий от Jullyfish

Попробую изменить размер в конфигурации u-boot. И попробую сначала так запустить.

Попробовал, как я понимаю, зашло в u-boot на sd-карте:

DDR V1.10 ec2fae0c96 wesley.yao 22/11/15-10:58:09
S5P1
f967
rgef1
DDRConf2
DDR3, BW=16 Col=10 Bk=8 CS0 Row=14 CS=1 Die BW=16 Size=256MB
924MHz
DDR bin out

U-Boot SPL board init
U-Boot SPL 2017.09 (Jul 10 2024 - 14:42:27)
unrecognized JEDEC id bytes: ff, ef, aa
Trying to boot from MMC2
ENVF: Primary 0x00000000 - 0x00008000
ENVF: OK
Trying fit image at 0x440 sector
## Verified-boot: 0
## Checking uboot 0x00200000 (lzma @0x00400000) ... sha256(c49c7043f2...) + sha256(c4fa82749f...) + OK
## Checking fdt 0x00261178 ... sha256(9f596c5683...) + OK
Total: 242.540 ms

Jumping to U-Boot(0x00200000)


U-Boot 2017.09 (Jan 28 2026 - 13:44:31 +0000)

Model: Rockchip RV1106 EVB Board
MPIDR: 0xf00
PreSerial: 2, raw, 0xff4c0000
DRAM:  256 MiB
Sysmem: init
Relocation Offset: 0fd80000
Relocation fdt: 0edf9f58 - 0edfede0
CR: M/C/I
Using default environment

no mmc device at slot 1
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
mmc@ffa90000: 0, mmc@ffaa0000: 1 (SD)
Bootdev(atags): mmc 1
MMC1: Legacy, 52Mhz
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
## Unknown partition table type 0
PartType: <NULL>
ENVF: !bad CRC @ 0x200
DM: v2
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
No misc partition
boot mode: None
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
FIT: No boot partition
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
Failed to load DTB, ret=-19
No valid DTB, ret=-22
Failed to get kernel dtb, ret=-22
Model: Rockchip RV1106 EVB Board
rockchip_set_serialno: could not find efuse/otp device
## retrieving sd_update.txt ...
bad MBR sector signature 0x0000
** Invalid partition 1 **
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
CLK: (sync kernel. arm: enter 816000 KHz, init 816000 KHz, kernel 0N/A)
  apll 816000 KHz
  dpll 924000 KHz
  gpll 1188000 KHz
  cpll 1000000 KHz
  aclk_peri_root 400000 KHz
  hclK_peri_root 200000 KHz
  pclk_peri_root 100000 KHz
  aclk_bus_root 300000 KHz
  pclk_top_root 100000 KHz
  pclk_pmu_root 100000 KHz
  hclk_pmu_root 200000 KHz
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
No misc partition
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
Net:   eth0: ethernet@ffa80000
Hit key to stop autoboot('CTRL+C'):  0 
## Booting FIT Image ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
FIT: No boot partition
FIT: No fit blob
FIT: No FIT image
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
Could not find misc partition
ANDROID: reboot reason: "(none)"
ENVF: !bad CRC @ 0x200
ENVF: !bad CRC @ 0x200
No env partition table
android_image_load_by_partname: Can't find part: boot
Android image load failed
Android boot failed, error -1.
=> env print
arch=arm
autoload=no
baudrate=115200
board=evb_rv1106
board_name=evb_rv1106
bootargs=storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal 
bootcmd=boot_fit;boot_android ${devtype} ${devnum};
bootdelay=0
cpu=armv7
devnum=1
devtype=mmc
eth1addr=f2:9f:dd:35:b2:06
ethaddr=ee:9f:dd:35:b2:06
fdt_addr_r=0x00c00000
kernel_addr_c=0x00808000
kernel_addr_r=0x00008000
pxefile_addr_r=0x00c00000
ramdisk_addr_r=0x000e00000
rkimg_bootdev=if mmc dev 1 && rkimgtest mmc 1; then setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;elif mmc dev 0; then setenv devtype mmc; setenv devnum 0;elif mtd_blk dev 0; then setenv devtype mtd; setenv devnum 0;elif mtd_blk dev 1; then setenv devtype mtd; setenv devnum 1;elif mtd_blk dev 2; then setenv devtype mtd; setenv devnum 2;elif rknand dev 0; then setenv devtype rknand; setenv devnum 0;elif rksfc dev 0; then setenv devtype spinand; setenv devnum 0;elif rksfc dev 1; then setenv devtype spinor; setenv devnum 1;else;setenv devtype ramdisk; setenv devnum 0;fi; 
scriptaddr=0x00b00000
soc=rockchip
stderr=serial
stdin=serial
stdout=serial
vendor=rockchip

Environment size: 1159/262140 bytes
=>

Интересно, SPL запускается с emmc или с sd…

Jullyfish
() автор топика