Create a FLASH partition to store user's HOME
If you ever did some hacking/devt on your APF board and used /root/ to download or install your experiments, I'm sure you got frustrated when it comes the time where you had to reflash the whole rootfs. Indeed, by default, /root/ is located in the same partition as the rootfs image and so everything you did will be overwritten. Well, you can always backup your data on a SD/microSD or through NFS before doing the rootfs flashing, but I think that, like me, you are little bit lazy ;-).
So in this small tutorial I will explain you how to modify the FLASH setup to store your personnal data on a separated partition and so avoid the backup process when updating your rootfs.
Declare partition in U-Boot
Warning: You may loose the content of your current rootfs partition if going further. So be sure to have backuped your data before. |
APF27
APF9328 | APF27 | APF51 | APF28 |
---|---|---|---|
* Check your NAND FLASH size:
BIOS> nand info Device 0: NAND 256MiB 1,8V 16-bit, sector size 128 KiB
BIOS> printenv mtdparts mtdparts=mtdparts=mxc_nand.0:640k(U-boot)ro,384k(U-boot_env),512k(firmware),5M(kernel),-(rootfs)
U-Boot 1.3.4: BIOS> setenv mtdparts mtdparts=mxc_nand.0:640k(U-boot)ro,384k(U-boot_env),512k(firmware),5M(kernel),200M(rootfs),-(user) BIOS> printenv mtdparts mtdparts=mtdparts=mxc_nand.0:640k(U-boot)ro,384k(U-boot_env),512k(firmware),5M(kernel),200M(rootfs),-(user) BIOS> setenv rootfs_len 0x0C800000 U-Boot 2011.12: BIOS> setenv mtdparts mtdparts=mxc_nand.0:1M(u-boot)ro,512K(env),512K(env2),512k(firmware),512K(dtb),5M(kernel),200M(rootfs),-(user) BIOS> setenv addubifsargs 'setenv bootargs ${bootargs} ubi.mtd=rootfs ubi.mtd=user root=ubi0:rootfs rootfstype=ubifs' BIOS> printenv mtdparts mtdparts=mtdparts=mxc_nand.0:1M(u-boot)ro,512K(env),512K(env2),512k(firmware),512K(dtb),5M(kernel),200M(rootfs),-(user)
U-Boot 1.3.4: BIOS> nand erase 0x0CE80000 U-Boot 2011.12: BIOS> nand erase.part user
|
* Check your NAND FLASH size:
BIOS> reset U-Boot 2013.04 (... NAND: 512 MiB ...
BIOS> printenv mtdparts mtdparts=mtdparts=mxc_nand:1M(u-boot)ro,512K(env),512K(env2),1M(firmware),512K(dtb),512K(splash),8M(kernel),-(rootfs)
BIOS> setenv mtdparts 'mtdparts=mxc_nand:1M(u-boot)ro,512K(env),512K(env2),1M(firmware) ,512K(dtb),512K(splash),8M(kernel),450M(rootfs),-(user)' BIOS> nand erase.part user NAND erase.part: device 0 offset 0x1ce00000, size 0x3200000 OK BIOS> setenv addubifsargs 'setenv bootargs ${bootargs} ubi.mtd=rootfs ubi.mtd=user root=ubi0:rootfs rootfstype=ubifs' |
BIOS> saveenv BIOS> run update_rootfs BIOS> boot
Linux
- In Linux boot message you should see your newly created partition is detected:
Boards with U-Boot 1.3.4 (offset may vary) | All boards with U-Boot >= 2013.xx (offset may vary) |
---|---|
6 cmdlinepart partitions found on MTD device mxc_nand.0 Creating 6 MTD partitions on "mxc_nand.0": 0x000000000000-0x0000000a0000 : "U-boot" 0x0000000a0000-0x000000100000 : "U-boot_env" 0x000000100000-0x000000180000 : "firmware" 0x000000180000-0x000000680000 : "kernel" 0x000000680000-0x00000ce80000 : "rootfs" 0x00000ce80000-0x000010000000 : "user" |
9 cmdlinepart partitions found on MTD device mxc_nand Creating 9 MTD partitions on "mxc_nand": 0x000000000000-0x000000100000 : "u-boot" 0x000000100000-0x000000180000 : "env" 0x000000180000-0x000000200000 : "env2" 0x000000200000-0x000000300000 : "firmware" 0x000000300000-0x000000380000 : "dtb" 0x000000380000-0x000000400000 : "splash" 0x000000400000-0x000000c00000 : "kernel" 0x000000c00000-0x00001ce00000 : "rootfs" 0x00001ce00000-0x000020000000 : "user" |
- you can also see it in /proc/mtd (here for example on an APF28 + U-Boot 2012.02 system):
Example for APF28 with U-Boot 2012.02 | Example for APF51 with U-Boot 2013.04 |
---|---|
# cat /proc/mtd dev: size erasesize name mtd0: 00300000 00020000 "u-boot" mtd1: 00080000 00020000 "env" mtd2: 00080000 00020000 "env2" mtd3: 00080000 00020000 "dtb" mtd4: 00080000 00020000 "splash" mtd5: 00800000 00020000 "kernel" mtd6: 1c200000 00020000 "rootfs" mtd7: 03200000 00020000 "user" |
# cat /proc/mtd dev: size erasesize name mtd0: 00100000 00020000 "u-boot" mtd1: 00080000 00020000 "env" mtd2: 00080000 00020000 "env2" mtd3: 00100000 00020000 "firmware" mtd4: 00080000 00020000 "dtb" mtd5: 00080000 00020000 "splash" mtd6: 00800000 00020000 "kernel" mtd7: 1c200000 00020000 "rootfs" mtd8: 03200000 00020000 "user" |
- Check a device node was created for your new partition (U-Boot 1.3.4: /dev/mtdblock5 - U-Boot 2011.12: /dev/mtdblock7):
# ls /dev/mtdblock* /dev/mtdblock0 /dev/mtdblock2 /dev/mtdblock4 /dev/mtdblock1 /dev/mtdblock3 /dev/mtdblock5
- For JFFS2: create a temporary mount point and mount the partition (U-Boot 1.3.4: /dev/mtdblock5 - U-Boot 2011.12: /dev/mtdblock7). It will be automatically formatted to JFSS2:
# mkdir /tmp/nand # mount -t jffs2 /dev/mtdblock7 /tmp/nand # ls /tmp/nand/
- For UBIFS: create a temporary mount point, format and mount the partition (U-Boot 1.3.4: replace mtd7 by mtd5 and '-m 7' by '-m 5'):
# mkdir /tmp/nand # ubiformat /dev/mtd7 # ubiattach /dev/ubi_ctrl -m 7 # ubimkvol /dev/ubi1 -s 40MiB -N user # mount -t ubifs ubi1:user /mnt/nand # ls /tmp/nand/
- Move your user data to the partition:
# cp -r /root/* /tmp/nand/ # cp -r /root/.[ab]* /tmp/nand/
- Makes it automatically mounted at every boot by adding it to /etc/fstab:
JFFS2:
# vi /etc/fstab ... sysfs /sys sysfs defaults 0 0 usbfs /proc/bus/usb usbfs defaults 0 0 /dev/mtdblock7 /root jffs2 defaults 0 0 <<-----------------
UBIFS:
# vi /etc/fstab ... sysfs /sys sysfs defaults 0 0 usbfs /proc/bus/usb usbfs defaults 0 0 ubi1:user /mnt/nand ubifs defaults,noatime,rw 0 0 <<-----------------
- Now you're done. Reboot and enjoy ! ;-)
# reboot ... # df -h Filesystem Size Used Available Use% Mounted on rootfs 200.0M 17.8M 182.2M 9% / /dev/root 200.0M 17.8M 182.2M 9% / none 64.0k 0 64.0k 0% /dev tmpfs 61.2M 44.0k 61.1M 0% /tmp >>> /dev/mtdblock7 49.5M 4.0M 45.5M 8% /root <<< # ls /root/
- Of course if you reflash your rootfs, even if you keep your personnal data, you will have to repeat the /etc/fstab modification step above !