Овер ride mtdparts, настроенные в дереве устройств ядра

Вопрос или проблема

Я установил Debian Buster на “ReadyNAS 102” через u-boot / последовательную консоль. Я следовал этому руководству. Но заменил используемые ссылки для загрузки актуального установщика Debian и Device Tree Blob:

Установка прошла успешно, за исключением установки grub (которая, как известно, не удается согласно руководству). Вместо этого вам нужно вручную установить/настроить пакет flash-kernel.

Мне также пришлось вручную вызвать “mtdpart”, чтобы создать разделы uImage и minirootfs, чтобы в конечном итоге успешно выполнить “update-initramfs”:

# mtdpart add /dev/mtd0 uImage 0x200000 0x600000
# mtdpart add /dev/mtd0 minirootfs 0x800000 0x1000000
# update-initramfs -u

Пока что все хорошо. Я получил загрузку ядра, но после загрузки у меня есть несколько преднастроенных “mtd разделов”, которые, кажется, происходят из дерева устройств ядра:

~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00180000 00020000 "u-boot"
mtd1: 00020000 00020000 "u-boot-env"
mtd2: 00600000 00020000 "uImage"
mtd3: 00400000 00020000 "minirootfs"
mtd4: 07400000 00020000 "ubifs"

Проблема в том, что “minirootfs” слишком мал (всего 4 МБ) для сгенерированного initramfs:

 # update-initramfs -u -k 4.19.0-6-armmp
 update-initramfs: Generating /boot/initrd.img-4.19.0-6-armmp
 Using DTB: armada-370-netgear-rn102.dtb
 Installing /usr/lib/linux-image-4.19.0-6-armmp/armada-370-netgear-rn102.dtb into /boot/dtbs/4.19.0-6-armmp/./armada-370-netgear-rn102.dtb
 Taking backup of armada-370-netgear-rn102.dtb.
 Installing new armada-370-netgear-rn102.dtb.
 Installing /usr/lib/linux-image-4.19.0-6-armmp/armada-370-netgear-rn102.dtb into /boot/dtbs/4.19.0-6-armmp/./armada-370-netgear-rn102.dtb
 Taking backup of armada-370-netgear-rn102.dtb.
 Installing new armada-370-netgear-rn102.dtb.
 flash-kernel: installing version 4.19.0-6-armmp

 The initial ramdisk is too large. This is often due to the unnecessary inclusion
 of all kernel modules in the image. To fix this set MODULES=dep in one or both
 /etc/initramfs-tools/conf.d/driver-policy (if it exists) and
 /etc/initramfs-tools/initramfs.conf and then run 'update-initramfs -u -k 4.19.0-6-armmp'

 Not enough space for initrd in MTD 'minirootfs' (need 4971360 but is actually 4194304).
 run-parts: /etc/initramfs/post-update.d//flash-kernel exited with return code 1

Новые устройства /dev/mtd0 до /dev/mtd4 не могут быть удалены, отредактированы или переосмыслены с помощью mtdpart. Я также попробовал установить параметр ядра mtdparts (который необходимо указывать как ‘cmdlinepart.mtdparts’ из-за ошибки в buster; я также пробовал ‘mtdparts=”):

# cat /proc/cmdline
console=ttyS0,115200 cmdlinepart.mtdparts=armada-nand:0x180000@0(u-boot),0x20000@0x180000(u-boot-env),(uImage),0x1000000@0x800000(minirootfs),-(ubi)

Разделы mtd, похоже, определены в файле *.dtb, который поставляется с ядром:

В следующем сообщении отображается в “dmesg”, говорящем о “5 фиксированных разделах”.

   [   18.310935] 5 fixed-partitions partitions found on MTD device pxa3xx_nand-0
   [   18.318030] Creating 5 MTD partitions on "pxa3xx_nand-0":
   root@ReadyNAS102:~# dmesg | grep "MTD' -A 3
   [   18.310935] 5 fixed-partitions partitions found on MTD device pxa3xx_nand-0
   [   18.318030] Creating 5 MTD partitions on "pxa3xx_nand-0":
   (...другие строки...)
   [   18.443214] 0x000000000000-0x000000180000 : "u-boot"
   [   18.497255] 0x000000180000-0x0000001a0000 : "u-boot-env"
   [   18.543756] 0x000000200000-0x000000800000 : "uImage"
   [   18.601234] 0x000000800000-0x000000c00000 : "minirootfs"
   [   18.661169] 0x000000c00000-0x000008000000 : "ubifs"

Я попытался отредактировать файл *.dtb, который идет с ядром (/boot/dtbs/4.19.0-6-armmp/armada-370-netgear-rn102.dts), используя инструмент dtc:

# dtc -I dtb -O dts armada-370-netgear-rn102.dtb > armada-370-netgear-rn102.dts
# редактирование файла *.dts
# dtc -I dts -O dtb armada-370-netgear-rn102.dts > armada-370-netgear-rn102.dtb

Я изменил файл *.dts следующим образом:

 nand-controller@d0000 {
       compatible = "marvell,armada370-nand-controller";
       reg = < 0xd0000 0x54 >;
       #address-cells = < 0x01 >;
       #size-cells = < 0x00 >;
       interrupts = < 0x71 >;
       clocks = < 0x0d 0x00 >;
       status = "okay";

       nand@0 {
               reg = < 0x00 >;
               label = "pxa3xx_nand-0";
               nand-rb = < 0x00 >;
               marvell,nand-keep-config;
               nand-on-flash-bbt;
               nand-ecc-strength = < 0x04 >;
               nand-ecc-step-size = < 0x200 >;

               partitions {
                       compatible = "fixed-partitions";
                       #address-cells = < 0x01 >;
                       #size-cells = < 0x01 >;

                       partition@0 {
                               label = "u-boot";
                               reg = < 0x00 0x180000 >;
                               read-only;
                       };

                       partition@180000 {
                               label = "u-boot-env";
                               reg = < 0x180000 0x20000 >;
                               read-only;
                       };

                       partition@200000 {
                               label = "uImage";
                               reg = < 0x200000 0x600000 >;
                       };

                       partition@800000 {
                               label = "minirootfs";
                               reg = < 0x800000 0x1000000 >;
                       };

                       partition@c00000 {
                               label = "ubifs";
                               reg = < 0xc00000 0x7400000 >;
                       };
               };
       };
};

В частности, я изменил “reg = < 0x800000 0x400000 >;” на “reg = < 0x800000 0x1000000 >;” для partition@800000:

                       partition@800000 {
                               label = "minirootfs";
                               reg = < 0x800000 0x1000000 >;
                       };

Достаточно места перед разделом “ubifs”, и я всё равно его не использую. Но после перезагрузки ядро все еще сообщает мне об старых настройках. Как я могу это исправить?

Я, вероятно, мог бы вручную установить “vmlinuz + *.dtb” в NAND через uboot. Но это исчезнет, как только будет установлено следующее обновление ядра.

Я бы предпочел, чтобы ядро интерпретировало параметр командной строки “mtdparts”.

Есть идеи?

РЕДАКТИРОВАНИЕ #1:

Я теперь (зло) использую раздел “ubifs” вместо “minirootfs” для initramfs. Это работает, но я хотел бы знать, есть ли более чистое решение. Конечно, мне также пришлось изменить мой “bootcmd” в u-boot, чтобы загружать/использовать данные из этого раздела:

setenv bootcmd 'nand read 0x2000000 0x200000 0x600000; nand read 0x3000000 0xc00000 0x800000; bootm 0x2000000 0x3000000'
saveenv
reset

Должно быть достаточно просто отредактировать dtb так, как вы уже пробовали.

    partition@800000 {
      label = "minirootfs";
      reg = <0x0800000 0x800000>;    /* 8MB */
    };

    /* Последний МБ для BBT, т.е. нельзя записывать */
    partition@1000000 {
      label = "ubifs";
      reg = <0x01000000 0x7000000>; /* 112MB */
    };

Я подозреваю, что вы просто забыли прикрепить dtb к ядру.

mtdinfo затем сообщает:

    mtd3
    Name:                           minirootfs
    Type:                           nand
    Eraseblock size:                131072 bytes, 128.0 KiB
    Amount of eraseblocks:          64 (8388608 bytes, 8.0 MiB)
    Minimum input/output unit size: 2048 bytes
    Sub-page size:                  2048 bytes
    OOB size:                       64 bytes
    Character device major/minor:   90:6
    Bad blocks are allowed:         true
    Device is writable:             true

Это использование ядра debian 4.19.0-10

Ответ или решение

Чтобы изменить конфигурацию разделов MTD (MTD partitions), настроенных в дереве устройств ядра (Device Tree), вам необходимо внести изменения в файл Device Tree Blob (DTB), сохранив его в виде нового DTB, а затем убедиться, что загрузчик использует этот измененный DTB при загрузке системы. Рассмотрим процесс более подробно.

1. Извлечение и редактирование файла DTB

  1. Извлечение DTB в DTS файл:
    Для начала вам нужно будет извлечь имеющийся DTB файл в виде источника (DTS):

    dtc -I dtb -O dts /boot/dtbs/4.19.0-6-armmp/armada-370-netgear-rn102.dtb > armada-370-netgear-rn102.dts
  2. Редактирование DTS:
    Откройте полученный armada-370-netgear-rn102.dts файл для редактирования и найдите секцию, отвечающую за ваш NAND-контроллер и его разделы. Измените размер для раздела minirootfs так, чтобы он стал достаточным для вашей инициализационной ram-диски (initramfs). Например:

    partition@800000 {
       label = "minirootfs";
       reg = <0x800000 0x1000000>;  // Увеличиваем на 8MB
    };

    Убедитесь, что раздел ubifs идет после minirootfs и что у него корректно указаны значения.

  3. Компиляция обратно в DTB:
    После внесения изменений сохраните файл и скомпилируйте его обратно в бинарный формат:

    dtc -I dts -O dtb armada-370-netgear-rn102.dts > /boot/dtbs/4.19.0-6-armmp/armada-370-netgear-rn102.dtb

2. Убедитесь, что загрузчик использует измененный DTB

Проверьте, что при загрузке U-Boot использует этот новый DTB файл. Убедитесь, что переменные окружения, такие как bootargs и bootcmd, корректно настроены для использования нового DTB. Пример настройки:

setenv bootargs 'console=ttyS0,115200'  
setenv bootcmd 'nand read 0x2000000 0x200000 0x600000; nand read 0x3000000 0x800000 0x1000000; bootm 0x2000000 0x3000000'
saveenv
reset

3. Применение параметров mtdparts

Вы также можете использовать командную строку ядра для указания параметров разделов MTD, однако ваш предыдущий опыт показывает, что это может не функционировать должным образом в текущей конфигурации. Попробуйте установить mtdparts как командный аргумент ядра. Например:

cmdlinepart.mtdparts=armada-nand:0x180000@0(u-boot),0x20000@0x180000(u-boot-env),0x600000@0x200000(uImage),0x1000000@0x800000(minirootfs),-(ubi)

Здесь важно, чтобы вы перезагрузили устройство после внесения изменений и убедились, что они вступили в силу, проверив вывод cat /proc/mtd.

4. Проверка

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

cat /proc/mtd

Это позволит вам убедиться, что размер раздела minirootfs изменился.

Заключение

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

Таким образом, редактируя DTB и корректно настраивая загрузчик, вы сможете убедиться, что ваша система будет работать с нужными разделами MTD и будет в состоянии обрабатывать необходимое пространство для инициализационной ram-диски.

Оцените материал
Добавить комментарий

Капча загружается...