LINUX.ORG.RU

Как загрузить другой образ ядра через u-boot?

 


0

1

Имеется флешка с разделами для U-Boot, DTB (device tree) и RootFS. При загрузке с этой флешки запускается U-Boot. Этот U-Boot, как мне кажется, монтирует RootFS и из каталога /boot берёт zImage, распаковывает его и грузит как ядро Linux.

Перед загрузкой ядра Linux я могу выйти в консоль U-Boot и через setenv/saveenv работать с переменными uboot. Одной из таких переменных является zimage, по умолчанию равная строке «zImage».

Теперь вопрос. Имея другой образ ядра, скажем zImage-2, я же могу записать его в /boot и как-то заставить U-Boot из консоли загрузить именно его?

Я пробовал менять переменную через «setenv zimage zImage-2; saveenv», пробовал задавать переменную kernel напрямую. Но всё равно грузит старое ядро. Не получается.

Имея другой образ ядра, скажем zImage-2, я же могу записать его в /boot и как-то заставить U-Boot из консоли загрузить именно его?

Именно записать в /boot? Вряд ли, обычно ФС доступна из U-Boot только на чтение. Можно загрузить другое ядро через fsload - наверняка так и делается в U-Boot, который у тебя. Посмотри внимательно на вывод printenv.

tailgunner ★★★★★
()

Для начала смотри что в переменной bootcmd. Дальше раскручивай пока не разберёшься что грузится и куда.

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

Да-да, раскручивал. Оттуда у меня уверенность, что kernel и zimage работают.

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

=)

=> printenv
addcma=setenv bootargs ${bootargs} cma=${cma_size}
addfb=setenv bootargs ${bootargs} ${fbdrv}.legacyfb_depth=${fbdepth} consoleblank=0
addip=if test "${ipmode}" != static; then run addip_dynamic; else run addip_static; fi
addip_dynamic=setenv bootargs ${bootargs} ip=dhcp
addip_static=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off
addmmc=setenv bootargs ${bootargs} root=/dev/mmcblk${mmcblkdev}p${mmcpart} ${rootfsmode} rootwait
addnfs=setenv bootargs ${bootargs} root=/dev/nfs rw nfsroot=${serverip}:${rootpath},v3,tcp;
addtty=setenv bootargs ${bootargs} console=${console},${baudrate}
baudrate=115200
board=tqma6
board_name=TQMa6Q
boardtype=TQMa6Q-AA.0202
boot_dev=mmc
boot_type=bootz
bootcmd=run mmcboot; run netboot; run panicboot
bootdelay=3
cma_size=160M
console=ttymxc1
ethact=FEC
ethaddr=00:d0:93:39:3a:2a
ethprime=FEC
fbdepth=32
fbdrv=imxdrm
fdt_addr=0x18000000
fdt_file=imx6q-mba6x.dtb
fdt_high=0xffffffff
fdt_name=if test "${fdt_type}" != single; then setenv fdtimg ${fitfdt_file}; else setenv fdtimg ${fdt_file}; fi
fdt_size=0x800
fdt_start=0x1000
fdt_type=single
fitfdt_file=imx6q-mba6x.dtb.fit
fitfdt_part=fdt@0
get_fdt=run fdt_name; if test "${fdt_type}" != single; then echo use dtb from fit; if ${getcmd} ${loadaddr} ${fdtimg}; then imxtrg
initrd_high=0xffffffff
ipmode=static
kernel_name=if test "${boot_type}" != bootz; then setenv kernel ${uimage}; else setenv kernel ${zimage}; fi
kernel_size=0x2000
kernel_start=0x2000
loadaddr=0x12000000
loadfdt=if test "${fdt_type}" != single; then run loadfdtfit; else run loadfdtsingle; fi
loadfdtfit=mmc dev ${mmcdev}; mmc read ${loadaddr} ${fdt_start} ${fdt_size}; imxtract ${loadaddr} ${fitfdt_part} ${fdt_addr}
loadfdtsingle=mmc dev ${mmcdev}; mmc read ${fdt_addr} ${fdt_start} ${fdt_size};
loadimage=mmc dev ${mmcdev}; mmc read ${loadaddr} ${kernel_start} ${kernel_size};
mmcargs=run addmmc addtty addfb addcma
mmcblkdev=1
mmcboot=echo Booting from mmc ...; setenv bootargs; run mmcargs; if run loadfdt; then echo boot device tree kernel ...; if run lo;
mmcdev=1
mmcpart=2
netargs=run addnfs addip addtty addfb addcma
netboot=echo Booting from net ...; run kernel_name; run set_getcmd; setenv bootargs; run netargs; if run get_fdt; then if ${getcmd
netdev=eth0
panicboot=echo No boot device !!! reset
rootfsmode=ro
rootpath=/srv/nfs/tqma6
serial#=63218372
set_getcmd=if test "${ipmode}" != static; then setenv getcmd dhcp; setenv autoload yes; else setenv getcmd tftp; setenv autoload i
stderr=serial
stdin=serial
stdout=serial
uboot=u-boot.imx
uboot_size=0x7fe
uboot_start=0x2
uimage=uImage
update_fdt=run fdt_name; if tftp ${fdtimg}; then if itest ${filesize} > 0; then mmc dev ${mmcdev}; mmc rescan; setexpr blkc ${fil 
update_kernel=run kernel_name; if tftp ${kernel}; then if itest ${filesize} > 0; then mmc dev ${mmcdev}; mmc rescan; setexpr blkc 
update_uboot=if tftp ${uboot}; then if itest ${filesize} > 0; then mmc dev ${mmcdev}; mmc rescan; setexpr blkc ${filesize} / 0x20 
usbethaddr=00:d0:93:37:0c:f9
zimage=zImage
dmitryshm
() автор топика
Ответ на: =) от dmitryshm

loadimage=mmc dev ${mmcdev}; mmc read ${loadaddr} ${kernel_start} ${kernel_size};

ядро грузится с определённого адреса на mmc, а не с файловой системы

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

Есть такая возможность. Просто я хотел положить несколько ядер в /boot на флешку и из u-boot грузить то одно, то другое, в зависимости от необходимости. Например когда одна сборка с одним набором программ и разными ядрами для разных устройств. Не всё получается разрулить на уровне Device Tree, поэтому иногда приходится иметь несколько ядер на флешке, и определяя что за устройство, грузить разные ядра.

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

Понял почему считается обрезанным. Вот ещё раз.

addcma=setenv bootargs ${bootargs} cma=${cma_size}
addfb=setenv bootargs ${bootargs} ${fbdrv}.legacyfb_depth=${fbdepth} consoleblank=0
addip=if test "${ipmode}" != static; then run addip_dynamic; else run addip_static; fi
addip_dynamic=setenv bootargs ${bootargs} ip=dhcp
addip_static=setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off
addmmc=setenv bootargs ${bootargs} root=/dev/mmcblk${mmcblkdev}p${mmcpart} ${rootfsmode} rootwait
addnfs=setenv bootargs ${bootargs} root=/dev/nfs rw nfsroot=${serverip}:${rootpath},v3,tcp;
addtty=setenv bootargs ${bootargs} console=${console},${baudrate}
baudrate=115200
board=tqma6
board_name=TQMa6Q
boardtype=TQMa6Q-AA.0202
boot_dev=mmc
boot_type=bootz
bootcmd=run mmcboot; run netboot; run panicboot
bootdelay=3
cma_size=160M
console=ttymxc1
ethact=FEC
ethaddr=00:d0:93:39:3a:2a
ethprime=FEC
fbdepth=32
fbdrv=imxdrm
fdt_addr=0x18000000
fdt_file=imx6q-mba6x.dtb
fdt_high=0xffffffff
fdt_name=if test "${fdt_type}" != single; then setenv fdtimg ${fitfdt_file}; else setenv fdtimg ${fdt_file}; fi
fdt_size=0x800
fdt_start=0x1000
fdt_type=single
fitfdt_file=imx6q-mba6x.dtb.fit
fitfdt_part=fdt@0
get_fdt=run fdt_name; if test "${fdt_type}" != single; then echo use dtb from fit; if ${getcmd} ${loadaddr} ${fdtimg}; then imxtract ${loadaddr} ${fitfdt_part} ${fdt_addr}; fi; else echo use dtb; ${getcmd} ${fdt_addr} ${fdtimg}; fi; setenv fdtimg
initrd_high=0xffffffff
ipmode=static
kernel_name=if test "${boot_type}" != bootz; then setenv kernel ${uimage}; else setenv kernel ${zimage}; fi
kernel_size=0x2000
kernel_start=0x2000
loadaddr=0x12000000
loadfdt=if test "${fdt_type}" != single; then run loadfdtfit; else run loadfdtsingle; fi
loadfdtfit=mmc dev ${mmcdev}; mmc read ${loadaddr} ${fdt_start} ${fdt_size}; imxtract ${loadaddr} ${fitfdt_part} ${fdt_addr}
loadfdtsingle=mmc dev ${mmcdev}; mmc read ${fdt_addr} ${fdt_start} ${fdt_size};
loadimage=mmc dev ${mmcdev}; mmc read ${loadaddr} ${kernel_start} ${kernel_size};
mmcargs=run addmmc addtty addfb addcma
mmcblkdev=1
mmcboot=echo Booting from mmc ...; setenv bootargs; run mmcargs; if run loadfdt; then echo boot device tree kernel ...; if run loadimage; then ${boot_type} ${loadaddr} - ${fdt_addr}; fi; else if run loadimage; then ${boot_type}; fi; fi;
mmcdev=1
mmcpart=2
netargs=run addnfs addip addtty addfb addcma
netboot=echo Booting from net ...; run kernel_name; run set_getcmd; setenv bootargs; run netargs; if run get_fdt; then if ${getcmd} ${loadaddr} ${kernel}; then ${boot_type} ${loadaddr} - ${fdt_addr}; fi; fi; echo ... failed
netdev=eth0
panicboot=echo No boot device !!! reset
rootfsmode=ro
rootpath=/srv/nfs/tqma6
serial#=63218372
set_getcmd=if test "${ipmode}" != static; then setenv getcmd dhcp; setenv autoload yes; else setenv getcmd tftp; setenv autoload no; fi
stderr=serial
stdin=serial
stdout=serial
uboot=u-boot.imx
uboot_size=0x7fe
uboot_start=0x2
uimage=uImage
update_fdt=run fdt_name; if tftp ${fdtimg}; then if itest ${filesize} > 0; then mmc dev ${mmcdev}; mmc rescan; setexpr blkc ${filesize} / 0x200; setexpr blkc ${blkc} + 1; if itest ${blkc} <= ${fdt_size}; then mmc write ${loadaddr} ${fdt_start} ${blkc}; fi; fi; fi; setenv filesize; setenv blkc 
update_kernel=run kernel_name; if tftp ${kernel}; then if itest ${filesize} > 0; then mmc dev ${mmcdev}; mmc rescan; setexpr blkc ${filesize} / 0x200; setexpr blkc ${blkc} + 1; if itest ${blkc} <= ${kernel_size}; then mmc write ${loadaddr} ${kernel_start} ${blkc}; fi; fi; fi; setenv filesize; setenv blkc 
update_uboot=if tftp ${uboot}; then if itest ${filesize} > 0; then mmc dev ${mmcdev}; mmc rescan; setexpr blkc ${filesize} / 0x200; setexpr blkc ${blkc} + 1; if itest ${blkc} <= ${uboot_size}; then mmc write ${loadaddr} ${uboot_start} ${blkc}; fi; fi; fi; setenv filesize; setenv blkc 
usbethaddr=00:d0:93:37:0c:f9
zimage=zImage-rel_imx_3.10.17_1.0.2_ga
dmitryshm
() автор топика
16 февраля 2017 г.
Ответ на: комментарий от dmitryshm

В u-boot есть команда bootmenu,по умолчанию выключена,но можно включить в конфигураторе. Это я про mainline u-boot,январского выпуска. Само меню пишется в виде специфических переменных через setenv. Видел в интернете парочку примеров. Сам хочу на днях попробовать ибо тоже хочется два ядра - одно гарантированно работающее,а второе - для экспериментов,чтобы всегда можно было легко вернуться обратно если эксперимент окончился повисом.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.