* Confused about how to make a UBIFS root filesystem @ 2008-04-11 22:06 Bruce_Leonard 2008-04-12 9:00 ` Artem Bityutskiy 2008-04-12 9:02 ` Artem Bityutskiy 0 siblings, 2 replies; 4+ messages in thread From: Bruce_Leonard @ 2008-04-11 22:06 UTC (permalink / raw) To: linux-mtd I'm sorry if this is a basic/dumb question but I'm not really strong yet on the higher layer/user space aspects of running the kernel. I've got my NAND flash driver done and now I want to get my root filesystem on the NAND flash. I sort of asked this question a couple of weeks ago when I asked about ubimkvol but I didn't know enough then to ask the right questions. I've gotten all the tools I'm just not sure what order to use them in and on what devices/files. If I understand it correctly, I use mkfs.ubifs on a filesystem that I want to ultimately be my rfs and output that to someother file (say ubi_rootfs.img). I then process that through ubinize which produces a config file (say ubi_rootfs.cfg). I then use ubiupdatevol to write ubi_rootfs.img to the NAND using ubi_rootfs.cfg to control the parameters of how the image gets written. Where I get lost (if I'm not already lost) is how do I prep the NAND device to receive the image? Do I use ubimkvol or mkfs.ubifs? I've looked through the FAQ at infradead and if I knew more about filesystems and the kernel it might all make sense, but I'm afraid I'm one of those folks that has to have his nose rubbed in it to understand, kind of like an irish setter. Any help or pointers to good references are greatly appreciated. Thanks. Bruce ------------------------------------------------ This e-mail may contain SEL confidential information. The opinions expressed are not necessarily those of SEL. Any unauthorized disclosure, distribution or other use is prohibited. If you received this e-mail in error, please notify the sender, permanently delete it, and destroy any printout. Thank you. ------------------------------------------------ ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Confused about how to make a UBIFS root filesystem 2008-04-11 22:06 Confused about how to make a UBIFS root filesystem Bruce_Leonard @ 2008-04-12 9:00 ` Artem Bityutskiy 2008-04-12 11:22 ` Carl-Daniel Hailfinger 2008-04-12 9:02 ` Artem Bityutskiy 1 sibling, 1 reply; 4+ messages in thread From: Artem Bityutskiy @ 2008-04-12 9:00 UTC (permalink / raw) To: Bruce_Leonard; +Cc: linux-mtd Hi, On Fri, 2008-04-11 at 15:06 -0700, Bruce_Leonard@selinc.com wrote: > I've gotten all the tools I'm just not sure what order to use them in and > on what devices/files. If I understand it correctly, I use mkfs.ubifs on > a filesystem that I want to ultimately be my rfs and output that to > someother file (say ubi_rootfs.img). I then process that through ubinize > which produces a config file (say ubi_rootfs.cfg). I then use > ubiupdatevol to write ubi_rootfs.img to the NAND using ubi_rootfs.cfg to > control the parameters of how the image gets written. Where I get lost > (if I'm not already lost) is how do I prep the NAND device to receive the > image? Do I use ubimkvol or mkfs.ubifs? I've looked through the FAQ at > infradead and if I knew more about filesystems and the kernel it might all > make sense, but I'm afraid I'm one of those folks that has to have his > nose rubbed in it to understand, kind of like an irish setter. Any help > or pointers to good references are greatly appreciated. Thanks. Well, it seems I did not explain things too at the MTD web site. As you know, UBIFS works on top of UBI, which works on top of MTD. So this is kind of a stack. You have your mtd device (e.g., /dev/mtd0), which is basically bare NAND flash. It may has eraseblocks, it may have bad blocks, etc. First lets talk about JFFS2, to make a better picture of what is going on. JFFS2 works on top of MTD devices. When you prepare JFFS2 images, you use mkfs.jffs2, and then put them to MTD devices with help of "nandwrite" utility (you cannot use "dd" because it is unable to skip bad eraseblocks). Also, JFFS2 does not _require_ you to prepare any image, you may just erase your flash using flash_eraseall, and mount it, using an "mount -t jffs2 mtd0 /mnt/jffs2" command. In this case JFFS2 automatically detects that the flash is empty, and automatically formats it. So when you mount it, you end up with an empty file-system. Just note, UBI/UBIFS can do the same. So far so good and simple, right? Now let's talk a bit about UBI/UBIFS. As I said, UBI works on top of MTD. When you load UBI and attach an MTD device to it, you end up with an UBI device, e.g. /dev/ubi0. For example, if you have /dev/mtd0, you may attach it to UBI using "ubiattach" utility, and /dev/ubi0 will be created (if you have udev in your system). There is no much you can do with UBI device (/dev/ubi0), though. Most interesting things may be done with UBI _volumes_. You may create UBI volumes on your UBI device using the "ubimkvol" tool. For example, you may create a /dev/ubi0_0 volume. You may create many volume on one UBI device. Then you may delete them or re-size. There are tools for this. And of course you could have 2 flashes on your board, say NOR and NAND, so you would have 2 MTD devices (e.g., /dev/mtd0 and /dev/mtd1). You could attach them to UBI, which would and result give you /dev/ubi0 and /dev/ubi1. You could create volumes on these UBI devices, e.g. /dev/ubi0_0, /dev/ubi0_1, /dev/ubi0_2, or /deve/ubi1_0, /dev/ubi1_1, etc. The first number id the UBI device number, the second one is volume number within this UBI device. So /dev/ubi0 sits on top of /dev/mtd0 and actually uses whole /dev/mtd0. You should never write anything directly to /dev/mtd0 if you have UBI on top of it. But reading it is harmless, although it might only be needed when debugging or doing something hacky. UBI has its internal data-structures which is stores on flash, for example erase counters and volume table. So if you read /dev/mtd0, you will read those internal data structures as well. Now UBIFS. It works on top of UBI volumes, like /dev/ubi0_0. You may mount /dev/ubi0_0 using "mount -t ubifs ubi0_0 /mnt/ubifs". Well, UBI volumes may have names, which you may specify when you create them, so you may also mount volumes by their names, e.g.: "mount -t ubifs ubi0:i_like_free_beer /mnt/ubifs". UBIFS of course has its own internal data structures which it stores at the UBI volume, for example the superblock, the file-system indexing B-tree, etc. Now tools. So you have your bare flash, your poor /dev/mtd0, which only gives you read/write/erase operations, which have bad eraseblocks, which requires you to spread all I/O load evenly, and which have other restrictions (horrible thing, isn't it?). And you want to have a normal file-system on top of it, which is doing all difficult job for you, and you just store your data precious files and do not even want to know about the complex things which being done inside. :-) Sou have your "/home/bruce/root_img/" directory, where you store the root file-system for your device, and you want to create a raw image, which you will send to the factory, and they would simply put this raw image to flash of the newly produced cool devices which will conquer the whole target market segment. To do this, you first create an UBIFS image (step 1) using the "mkfs.ubifs" utility (see FAQ for options). It gives you, say, "ubifs.img" file. This file is basically the contents of the _UBI volume_, _not_ contents of the raw flash. I mean, if you put "ubifs.img" to a /dev/ubi0_0 (which exactly is what "ubiupdatevol" does), you may then mount this /dev/ubi0_0 and see exactly the same as in "/home/bruce/root_img/". But you _cannot_ put this image to your /dev/mtd0 device. It simply won't work - you have to turn ubifs.img to an UBI image first!. And this is where you use the "ubinize" utility. This utility creates UBI images. It requires a configuration file (which you found confusing), where you describe the parameters of your NAND flash, the volumes which "ubinize" has to create, the images which it should put to these volumes, etc. So, if you use "ubinize", you'll get, say, ubi.img file (see FAQ for details and examples), which now you may send to the factory. If you wipe out your /dev/mtd0, then put ubi.img on it, then attach it to UBI - you'll see a volume on it. This is the volume which you described in the configuration file of "ubinize". If you mount that volume, you'll find your "/home/bruce/root_img/", because you said "ubinize" to put ubifs.img to the created volume. Why "ubinize" need a config file? Because you may want to create an UBI image with _many_ volumes, and put different contents to each of them. E.g., have "/home" and "/" on separate UBI volumes. Each volume may have different characteristics. It is difficult to pass all the needed parameters for complex configurations via command line, so we just use a configuration file. And finally, similarly to JFFS2, UBI/UBIFS do not require you to prepare any images. You may start with an empty flash, attach it to UBI, in which case UBI will format it automatically, then create a volume, which will be empty (i.e., dd if=/dev/ubi0_0 of=file will give you only 0xFF bytes). Then you may mount empty this volume, and UBIFS will automatically format it, and you will end up with an empty FS. I think, after reading this, and re-reading http://www.linux-mtd.infradead.org/faq/ubifs.html#L_mkfubifs, you'll have complete picture. Sorry if I put made the mail too long, instead of just answer your questions with short answers. I know that my English is far from perfect, so you could help and contribute to the project by creating few FAQ entries for us. I'd put them to the MTD web site. I mean, just describe the things you found confusing and difficult to grasp, give them a title (e.g., "What is this <name_of_the_confusing_thing> about?") and send it to us. That would be great. -- Best regards, Artem Bityutskiy (Битюцкий Артём) ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Confused about how to make a UBIFS root filesystem 2008-04-12 9:00 ` Artem Bityutskiy @ 2008-04-12 11:22 ` Carl-Daniel Hailfinger 0 siblings, 0 replies; 4+ messages in thread From: Carl-Daniel Hailfinger @ 2008-04-12 11:22 UTC (permalink / raw) To: dedekind; +Cc: linux-mtd, Bruce_Leonard Hi Artem, On 12.04.2008 11:00, Artem Bityutskiy wrote: > Well, it seems I did not explain things too at the MTD web site. > > As you know, UBIFS works on top of UBI, which works on top of MTD. So > this is kind of a stack. You have your mtd device (e.g., /dev/mtd0), > which is basically bare NAND flash. It may has eraseblocks, it may have > bad blocks, etc. > > First lets talk about JFFS2, to make a better picture of what is going > on. JFFS2 works on top of MTD devices. When you prepare JFFS2 images, > you use mkfs.jffs2, and then put them to MTD devices with help of > "nandwrite" utility (you cannot use "dd" because it is unable to skip > bad eraseblocks). Also, JFFS2 does not _require_ you to prepare any > image, you may just erase your flash using flash_eraseall, and mount it, > using an "mount -t jffs2 mtd0 /mnt/jffs2" command. In this case JFFS2 > automatically detects that the flash is empty, and automatically formats > it. So when you mount it, you end up with an empty file-system. Just > note, UBI/UBIFS can do the same. So far so good and simple, right? > > Now let's talk a bit about UBI/UBIFS. As I said, UBI works on top of > MTD. When you load UBI and attach an MTD device to it, you end up with > an UBI device, e.g. /dev/ubi0. For example, if you have /dev/mtd0, you > may attach it to UBI using "ubiattach" utility, and /dev/ubi0 will be > created (if you have udev in your system). There is no much you can do > with UBI device (/dev/ubi0), though. Most interesting things may be done > with UBI _volumes_. You may create UBI volumes on your UBI device using > the "ubimkvol" tool. For example, you may create a /dev/ubi0_0 volume. > You may create many volume on one UBI device. Then you may delete them > or re-size. There are tools for this. > > And of course you could have 2 flashes on your board, say NOR and NAND, > so you would have 2 MTD devices (e.g., /dev/mtd0 and /dev/mtd1). You > could attach them to UBI, which would and result give you /dev/ubi0 > and /dev/ubi1. You could create volumes on these UBI devices, > e.g. /dev/ubi0_0, /dev/ubi0_1, /dev/ubi0_2, > or /deve/ubi1_0, /dev/ubi1_1, etc. The first number id the UBI device > number, the second one is volume number within this UBI device. > > So /dev/ubi0 sits on top of /dev/mtd0 and actually uses whole /dev/mtd0. > You should never write anything directly to /dev/mtd0 if you have UBI on > top of it. But reading it is harmless, although it might only be needed > when debugging or doing something hacky. UBI has its internal > data-structures which is stores on flash, for example erase counters and > volume table. So if you read /dev/mtd0, you will read those internal > data structures as well. > > Now UBIFS. It works on top of UBI volumes, like /dev/ubi0_0. You may > mount /dev/ubi0_0 using "mount -t ubifs ubi0_0 /mnt/ubifs". Well, UBI > volumes may have names, which you may specify when you create them, so > you may also mount volumes by their names, e.g.: "mount -t ubifs > ubi0:i_like_free_beer /mnt/ubifs". UBIFS of course has its own internal > data structures which it stores at the UBI volume, for example the > superblock, the file-system indexing B-tree, etc. > > Now tools. So you have your bare flash, your poor /dev/mtd0, which only > gives you read/write/erase operations, which have bad eraseblocks, which > requires you to spread all I/O load evenly, and which have other > restrictions (horrible thing, isn't it?). And you want to have a normal > file-system on top of it, which is doing all difficult job for you, and > you just store your data precious files and do not even want to know > about the complex things which being done inside. :-) > > Sou have your "/home/bruce/root_img/" directory, where you store the > root file-system for your device, and you want to create a raw image, > which you will send to the factory, and they would simply put this raw > image to flash of the newly produced cool devices which will conquer the > whole target market segment. > > To do this, you first create an UBIFS image (step 1) using the > "mkfs.ubifs" utility (see FAQ for options). It gives you, say, > "ubifs.img" file. This file is basically the contents of the _UBI > volume_, _not_ contents of the raw flash. I mean, if you put "ubifs.img" > to a /dev/ubi0_0 (which exactly is what "ubiupdatevol" does), you may > then mount this /dev/ubi0_0 and see exactly the same as in > "/home/bruce/root_img/". But you _cannot_ put this image to > your /dev/mtd0 device. It simply won't work - you have to turn ubifs.img > to an UBI image first!. And this is where you use the "ubinize" utility. > This utility creates UBI images. It requires a configuration file (which > you found confusing), where you describe the parameters of your NAND > flash, the volumes which "ubinize" has to create, the images which it > should put to these volumes, etc. So, if you use "ubinize", you'll get, > say, ubi.img file (see FAQ for details and examples), which now you may > send to the factory. If you wipe out your /dev/mtd0, then put ubi.img on > it, then attach it to UBI - you'll see a volume on it. This is the > volume which you described in the configuration file of "ubinize". If > you mount that volume, you'll find your "/home/bruce/root_img/", because > you said "ubinize" to put ubifs.img to the created volume. > > Why "ubinize" need a config file? Because you may want to create an UBI > image with _many_ volumes, and put different contents to each of them. > E.g., have "/home" and "/" on separate UBI volumes. Each volume may have > different characteristics. It is difficult to pass all the needed > parameters for complex configurations via command line, so we just use a > configuration file. > > And finally, similarly to JFFS2, UBI/UBIFS do not require you to prepare > any images. You may start with an empty flash, attach it to UBI, in > which case UBI will format it automatically, then create a volume, which > will be empty (i.e., dd if=/dev/ubi0_0 of=file will give you only 0xFF > bytes). Then you may mount empty this volume, and UBIFS will > automatically format it, and you will end up with an empty FS. > > I think, after reading this, and re-reading > http://www.linux-mtd.infradead.org/faq/ubifs.html#L_mkfubifs, you'll > have complete picture. Sorry if I put made the mail too long, instead of > just answer your questions with short answers. > > I know that my English is far from perfect, so you could help and > contribute to the project by creating few FAQ entries for us. I'd put > them to the MTD web site. I mean, just describe the things you found > confusing and difficult to grasp, give them a title (e.g., "What is this > <name_of_the_confusing_thing> about?") and send it to us. That would be > great. > That's a great writeup! Can you put that online at the MTD web site? You might even want to consider sending it in to LWN as a featured article because it explains the concept really well even for people who know hardly anything about MTD/UBI/UBIFS. Regards, Carl-Daniel ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Confused about how to make a UBIFS root filesystem 2008-04-11 22:06 Confused about how to make a UBIFS root filesystem Bruce_Leonard 2008-04-12 9:00 ` Artem Bityutskiy @ 2008-04-12 9:02 ` Artem Bityutskiy 1 sibling, 0 replies; 4+ messages in thread From: Artem Bityutskiy @ 2008-04-12 9:02 UTC (permalink / raw) To: Bruce_Leonard; +Cc: linux-mtd > This e-mail may contain SEL confidential information. The opinions > expressed are not necessarily those of SEL. Any unauthorized disclosure, > distribution or other use is prohibited. If you received this e-mail in > error, please notify the sender, permanently delete it, and destroy any > printout. FYI, we usually do not like when people attach disclaimers like this to mails they send to public mailing list for obvious reasons - it just makes no sense. -- Best regards, Artem Bityutskiy (Битюцкий Артём) ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-04-12 11:22 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-04-11 22:06 Confused about how to make a UBIFS root filesystem Bruce_Leonard 2008-04-12 9:00 ` Artem Bityutskiy 2008-04-12 11:22 ` Carl-Daniel Hailfinger 2008-04-12 9:02 ` Artem Bityutskiy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox