Problems with large amount of partitions on SD
Mauro Condarelli
mc5686 at mclink.it
Fri Oct 2 10:59:00 CEST 2020
I am having huge problems with my system *possibly* due to fact I have 10 partitions on a single SD card.
I'm getting an unreliable behavior (issuing the same commands do *not* result in consistent behavior) which *seem* to point to some overwrite/cache problem.
First of all: is a configuration with 10 partitions on SD supported?
I tried perusing files in disk/part*, but I failed to see where extended partitions are handled.
Here follows one (typical) example:
This is one example of a boot after a long time off, no key touched:
================================================================================
> U-Boot SPL 2020.10-rc5 (Oct 01 2020 - 17:14:04 +0200)
> Trying to boot from NOR
>
>
> U-Boot 2020.10-rc5 (Oct 01 2020 - 17:14:04 +0200)
>
> CPU: MediaTek MT7628A ver:1 eco:2
> Boot: DDR2, SPI-NOR 3-Byte Addr, CPU clock from XTAL
> Clock: CPU: 580MHz, Bus: 193MHz, XTAL: 40MHz
> DRAM: 128 MiB
> WDT: Started with servicing (60s timeout)
> MMC: mmc at 10130000: 0
> Loading Environment from SPIFlash... SF: Detected w25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
> OK
> In: uart2 at e00
> Out: uart2 at e00
> Err: uart2 at e00
> Model: VoCore2
> Net:
> Warning: eth at 10110000 (eth0) using random MAC address - 0a:92:ae:d0:9b:c2
> eth0: eth at 10110000
> Hit any key to stop autoboot: 0
> Loading System B
>
> Partition Map for MMC device 0 -- Partition Type: DOS
>
> Part Start Sector Num Sectors UUID Type
> 1 2048 262144 30f8737b-01 0c
> 2 264192 4194304 30f8737b-02 83
> 3 4458496 32768 30f8737b-03 83
> 4 4491264 11268096 30f8737b-04 05 Extd
> ** Can't read partition table on 0:4491264 **
> ** Can't read partition table on 0:4902912 **
> ** Invalid partition 7 **
> Loading Recovery
================================================================================
here recovery system is loaded from Flash, not mmc.
After a "reboot" from linux I get:
================================================================================
> [48634.981029] reboot: Restarting system
> [48634.984764] ralink_restart
>
> U-Boot SPL 2020.10-rc5 (Oct 01 2020 - 17:14:04 +0200)
> Trying to boot from NOR
>
>
> U-Boot 2020.10-rc5 (Oct 01 2020 - 17:14:04 +0200)
>
> CPU: MediaTek MT7628A ver:1 eco:2
> Boot: DDR2, SPI-NOR 3-Byte Addr, CPU clock from XTAL
> Clock: CPU: 580MHz, Bus: 193MHz, XTAL: 40MHz
> DRAM: 128 MiB
> WDT: Started with servicing (60s timeout)
> MMC: mmc at 10130000: 0
> Loading Environment from SPIFlash... SF: Detected w25q128 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
> OK
> In: uart2 at e00
> Out: uart2 at e00
> Err: uart2 at e00
> Model: VoCore2
> Net:
> Warning: eth at 10110000 (eth0) using random MAC address - be:c5:7e:06:ca:a1
> eth0: eth at 10110000
> Hit any key to stop autoboot: 0
================================================================================
Here I stop autoboot.
This is my complete environment.
================================================================================
> => printenv
> BOOT_CURRENT=B
> SYSTEM_R=/dev/mtdblock5
> arch=mips
> baudrate=115200
> board=vocore2
> board_name=vocore2
> boot_a=echo "Loading System A";part=6;run boot_x
> boot_b=echo "Loading System B";part=7;run boot_x
> boot_now=if test "${BOOT_CURRENT}" = A; then run boot_a; elif test "${BOOT_CURRENT}" = B; then run boot_b; fi; if env exists BOOT_A_GOOD; then run boot_a; fi; if env exists BOOT_B_GOOD; then run boot_b; fi; run boot_r
> boot_r=echo "Loading Recovery"; setenv bootargs "${default_bootargs} mtdparts=${mtdparts} root=/dev/mtdblock5"; bootm bc050000
> boot_x=mmc rescan && mmc part && ls mmc 0:${part} && load mmc 0:${part} 85000000 /boot/uImage && setenv bootargs "${default_bootargs} mtdparts=${mtdparts} root=/dev/mmcblk0p${part}" && bootm ${fileaddr}
> bootcmd=mmc rescan && sleep 1 && run do_boot
> bootcount=1
> bootdelay=2
> cpu=mips32
> default_bootargs=earlyprintk rootwait console=ttyS2,115200
> do_boot=test ${bootcount} -gt 1 && run remove_boot; run boot_now
> fdtcontroladdr=86f6d350
> fileaddr=85000000
> filesize=268c63
> fupdate=mmc rescan && load mmc 0:1 84000000 uboot.scr && fatrm mmc 0:1 uboot.scr && source 84000000 && echo Flash updated
> mtdids=nor0=spi0.0
> mtdparts=spi0.0:312k(u-boot),4k(env),4k(factory),2368k(kernel),-(filesystem)
> remove_boot=if env exists BOOT_CURRENT; then setenv BOOT_CURRENT; saveenv; elif env exists BOOT_A_GOOD; then setenv BOOT_A_GOOD; saveenv; elif env exists BOOT_B_GOOD; then setenv BOOT_B_GOOD; saveenv; fi
> soc=mt7628
> stderr=uart2 at e00
> stdin=uart2 at e00
> stdout=uart2 at e00
> vendor=vocore
> ver=U-Boot 2020.10-rc5 (Oct 01 2020 - 17:14:04 +0200)
>
> Environment size: 1558/4092 bytes
================================================================================
I have two full systems on SD (partitions 6 and 7) and a fallback on Flash.
Idea is to try to boot from BOOT_CURRENT System, if possible, fallback to
the other, if "GOOD" and boot Recovery as last resort.
I modified "boot_x"to do some printouts before booting (first 3 commands)
Here I manually start "B" system boot:
================================================================================
> => run boot_b
> Loading System B
>
> Partition Map for MMC device 0 -- Partition Type: DOS
>
> Part Start Sector Num Sectors UUID Type
> 1 2048 262144 30f8737b-01 0c
> 2 264192 4194304 30f8737b-02 83
> 3 4458496 32768 30f8737b-03 83
> 4 4491264 11268096 30f8737b-04 05 Extd
> 5 4493312 409600 30f8737b-05 83
> 6 4904960 102400 30f8737b-06 83
> 7 5009408 102400 30f8737b-07 83
> 8 5113856 102400 30f8737b-08 83
> 9 5218304 102400 30f8737b-09 83
> 10 5322752 4194304 30f8737b-0a 83
> bin/
> boot/
> dev/
> etc/
> lib/
> <SYM> lib32
> media/
> mnt/
> opt/
> over/
> proc/
> root/
> run/
> sbin/
> sys/
> tmp/
> usr/
> var/
>
> 1 file(s), 17 dir(s)
>
> Error: too many data blocks to be read.
> Failed to load '/boot/uImage'
================================================================================
... which fails in a different way.
I do again the same command (nothing in between)
================================================================================
> => run boot_b
> Loading System B
>
> Partition Map for MMC device 0 -- Partition Type: DOS
>
> Part Start Sector Num Sectors UUID Type
> 1 2048 262144 30f8737b-01 0c
> 2 264192 4194304 30f8737b-02 83
> 3 4458496 32768 30f8737b-03 83
> 4 4491264 11268096 30f8737b-04 05 Extd
> 5 4493312 409600 30f8737b-05 83
> 6 4904960 102400 30f8737b-06 83
> 7 5009408 102400 30f8737b-07 83
> 8 5113856 102400 30f8737b-08 83
> 9 5218304 102400 30f8737b-09 83
> 10 5322752 4194304 30f8737b-0a 83
> bin/
> boot/
> dev/
> etc/
> lib/
> <SYM> lib32
> media/
> mnt/
> opt/
> over/
> proc/
> root/
> run/
> sbin/
> sys/
> tmp/
> usr/
> var/
>
> 1 file(s), 17 dir(s)
>
> 2526307 bytes read in 260 ms (9.3 MiB/s)
> ## Booting kernel from Legacy Image at 85000000 ...
> Image Name: Linux-5.8.0
> Image Type: MIPS Linux Kernel Image (gzip compressed)
================================================================================
... and it succeeds.
I originally blamed this to my tweaks to SquashFS (part 6 and 7 are SquashFS),
but it seems problem happens at partition level, before filesystem is touched.
Please advise.
Mauro
More information about the U-Boot
mailing list