From: Larry M. <Larry@GlueLogix.com> - 2014-06-28 20:17:17
|
To my original question, "Is there an easy way to make a UBI image from a working MMC?" the answer is, "Yes, but only in hindsight." The key is proper use of UBIFS user space tools from infradead.org. The best instructions are here: http://gumstix.org/how-to/70-writing-images-to-flash.html http://gumstix.8.x6.nabble.com/Is-there-an-easy-way-to-make-a-UBI-image-from-a-working-MMC-tp4969113p4969201.html But they don't quite give the right parameters for some things circa 2014. Here's a little obvious background and a summary of how I solved my problem in Overo Airstorm and Linaro 3.5 for Gumstix: Gumstix Overo models that have NAND Flash give you access to the Flash via the Memory Technology Device (MTD) API. Flash is partitioned for access by devices /dev/mtd*. You need the linux-mtd tools from infradead.org. In Linaro, get them with apt-get install mtd-utils. The Flash partition table is set in your kernel's board support package. In our case, the file is arch/arm/mach-omap2/board-overo.c. This table appears about halfway down in my Linaro source: [code] static struct mtd_partition overo_nand_partitions[] = { { .name = "xloader", .offset = 0, /* Offset = 0x00000 */ .size = 4 * NAND_BLOCK_SIZE, .mask_flags = MTD_WRITEABLE }, { .name = "uboot", .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */ .size = 14 * NAND_BLOCK_SIZE, }, { .name = "uboot environment", .offset = MTDPART_OFS_APPEND, /* Offset = 0x240000 */ .size = 2 * NAND_BLOCK_SIZE, }, { .name = "linux", .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */ .size = 64 * NAND_BLOCK_SIZE, }, { .name = "rootfs", .offset = MTDPART_OFS_APPEND, /* Offset = 0xa80000 */ .size = MTDPART_SIZ_FULL, }, }; [/code] The partitions are mapped to /dev/mtd0 through /dev/mtd4. Partition 3, called "linux" here, is where the kernel goes. There is no place for an initrd. Other distros may differ. The Angstrom setup on my last AirStorm has a different size for MTD3, so rootfs starts in a different place. Given this background knowledge, it is easy to understand and follow HowTo#70, linked above. MTD0: This is x-loader, don't mess with it. MTD1: This is u-boot.bin. It is NOT the same as u-boot.img on your MMC FAT partition, it is a different format file built in your u-boot tree. If you are not changing any pin mux settings, you can leave the one that came with your Gumstix in here. If you mess up, reboot from MMC and try again. This is "nandwrite -p /dev/mtd1 $uboot" in HowTo #70. MTD2: This seems to be the u-boot environment, i.e. where things go when you enter saveenv in u-boot. I erased mine, and everything seems ok with compiled-in u-boot defaults. flash_erase /dev/mtd2 0 0 MTD3: This is the same uImage you boot from on MMC. It is in the FAT partition 0 of your MMC. Mine is called uImage, but yours might be different. The boot.scr in the same partition points to the kernel that will be booted. This is "nandwrite -p /dev/mtd3 $uimage" in HowTo#70. MTD4: This is a UBI version of the root filesystem from your MMC. Making this image was the subject of my OP. This is the answer: If your Linaro rootfs is too big, use dpkg to get rid of X and other stuff, then use "du -sk /" to find the biggest wads of deletable files on the MMC. Do not delete perl - it would be bad. Do not delete lib/firmware/libertas if you plan to use wifi. All the other firmware files can be deleted AFAIK. Once your rootfs is small enough to fit in MTD4 (my AirStorm MTD4 is 525860864 bytes), move the MMC to a Linux PC and do this to make UBI (assuming everything mounts on /media): > sudo mkfs.ubifs -v -r /media/rootfs1 -o rootfs.ubifs -m 2048 -e 129024 -c 4010 > sudo ubinize -v -o rootfs.ubi -m 2048 -p 128KiB -s 512 ubi.cfg > sudo cp rootfs.ubi /media/rootfs1 where ubi.cfg is: > [ubifs] > mode=ubi > image=rootfs.ubifs > vol_id=0 > vol_type=dynamic > vol_name=rootfs > vol_flags=autoresize > The original instruction from Adam Magulak was almost perfect, except he suggested -c 1996. That was too short, and led to a truncated volume and misleading error messages on bootup. The -c 4010 here is one block shorter than my actual memory, so anything that fits in memory gets in the image. The -c parameter is the maximum number of Logical Erase Blocks (LEBs) that mkfs will put in your image. If you feed it fewer, it will make a smaller image. The -e parameter is a 126 KB Logical Erase Block size. I think that fits inside a 128 KB Physical Erase Block size, allowing some room for flash erase management bits. Use the ubinized rootfs.ubi as the input to ubiformat in Howto #70. That is a UBI volume that contains the filesystem generated in the first step. It starts with "UBI#" as a magic number. After running ubiformat, you can mount MNT4 in your running MMC boot session. This may be a good way to check things before jumping to a reboot. This is from a TI support page that has great examples but wrong parameters for some things on Gumstix: http://processors.wiki.ti.com/index.php/UBIFS_Support#Mounting_UBIFS_image_as_a_regular_NAND_partition > ubiattach /dev/ubi_ctrl -m 4 > mount -t ubifs ubi0:rootfs /mnt assuming you have an empty /mnt folder. I guess this turned into a guide. I hope it helps someone. Thanks, Larry |