[Buildroot] Squashfs boot

Stefan Fröberg stefan.froberg at petroprogram.com
Tue Jan 22 19:39:04 UTC 2013

22.1.2013 21:30, Stephen Turner kirjoitti:
> Dont go out of your way to do this but if you do decide to play with
> it i would love to hear back about your experiences.  I suppose my
> concern now is more less that when the buildroot script makes a system
> such as the bzImage+cpio you expect it to boot and in that case it
> does. So why wouldn't the generated bzImage+squashfs boot?  my
> assumption was that i didn't have the correct grub4dos menu.lst
> entries to properly access it but scouring the Internet turned up next
> to nothing except for modifying your fstab to boot partially
> compressed systems.  As it turns out i was able to compress /usr and
> then cpio the remaining system. i now have a 5mb kernel 2mb cpio
> initrd and a 41mb squashfs usr directory which im fairly certain can
> be smaller with the right commands. Im working on getting the system
> to mount the /usr squash system at boot which i have verified there is
> enough of the system available in the initrd to mount it manually so
> im sure it should be able to be done automatically.
> I do appreciate your help. If you have any pointers to the myserious
> buildroot output images not being bootable i would love to hear about
> it but in the mean time you helped me resolve the issue of shrinking
> my system!

My pleasure. Glad that I could help. :-)

Oh, and before I forgot:

When generating that squashfs /usr be sure to use latest version of
mksquashfs (4.2),
at least kernel version of 2.6.38 (that was the version when they added
xz-compression support for squashfs) and give
-comp xz switch when compressing your usr.

Something like this:

mksquashfs usr/ usr.sqfs -comp xz


> Thanks,
> Stephen
> On Tue, Jan 22, 2013 at 12:49 PM, Stefan Fröberg
> <stefan.froberg at petroprogram.com
> <mailto:stefan.froberg at petroprogram.com>> wrote:
>     It's true that you can use squashfs to compress whole system but
>     even in that case you have to
>     make your own init script that will take care of all the magic of
>     mounting.
>     And because squashfs is read-only filesystem then it get's more
>     trickier because you have to take care
>     of yourself of all those /tmp and /var/log etc.. directories that
>     need to store temporarily stuff.
>     When you mount that squashfs-file with /dev/loop0 it does use very
>     little ram.
>     Like I said only if some files are accessed from it then kernle
>     might use little ram for caching it so that they are accessed
>     much faster next time.
>     So there is no need to separately load it into ram. It's just is
>     there, mounted throught /dev/loop0
>     (which is always there, provided that you did not remove loopback
>     device support from kernel conf)
>     Actually this is quite interesting because I have newer tried to
>     do that whole root squashfs myself before
>     (always just compressed part of the filesystem).
>     I could try that and report later back if it's worth it.
>     Stefan
>     22.1.2013 16:35, Stephen Turner kirjoitti:
>>     well actually, i just did a standard buildroot with squashfs so
>>     everything except the kernel bzImage is in the squashfs.  I
>>     suppose i missunderstood how it worked as i thought having
>>     support in the kernel allowed the reading of this file and if
>>     thats so i didnt expect to need a initrd especially since none
>>     was generated by the buildroot scripts.  I was looking for a
>>     solution that worked like that, where i could load it to ram or
>>     read it from a disk saving ram but in essence compress everything
>>     except perhaps the kernel. I dont suppose there is an option like
>>     that is there?
>>     On Tue, Jan 22, 2013 at 7:41 AM, Stefan Fröberg
>>     <stefan.froberg at petroprogram.com
>>     <mailto:stefan.froberg at petroprogram.com>> wrote:
>>         Hi Stephen
>>         22.1.2013 3:25, Stephen Turner kirjoitti:
>>>         Sorry if my previous email went through. Im having some
>>>         difficulty booting a squashfs with grub4dos on usb and grub2
>>>         from hd. In short im using bzImage for a kernel and trying
>>>         to both boot the squashfs in ram and imaged to a usb drive.
>>>         I havent found much info on how to use the squashfs from
>>>         busybox and what i did find wasnt very helpful. Could
>>>         someone point me to a how to for booting a busybox squash?
>>>         Do i need to make my own initrd Image or edit some files
>>>         such as fstab?
>>>         I appreciate any and all input.
>>>         Thanks
>>>         Stephen
>>         What I usually have is squashfs (xz-compressed) image of the
>>         whole /usr (because that's usually the largest).
>>         And everything else is in xz-compressed initramfs. Kernel
>>         extract and loads the initramfs file(s) that you have
>>         specified in grub to  automatically to ram. squashfs image
>>         does not need to loaded to ram but mounted to
>>         loopback devise /dev/loop0. However, when files are accessed
>>         in that image it's contents can be also cached to ram.
>>         The basic idea is that everything that is absolutely needed
>>         for booting and running, the very minimal core of the
>>         system, is located in that initramfs.
>>         Now, in the /etc/inittab file there is usually a line like
>>         null::sysinit:/bin/mount -a
>>         That will instruct that all stuff in /etc/fstab should be
>>         mounted.
>>         My /etc/fstab look like this
>>         # /etc/fstab: static file system information.
>>         #
>>         # <file system>         <mount pt>    <type>       
>>         <options>        <dump>     <pass>
>>         /modules.sqfs        /lib/modules    squashfs   
>>         defaults,auto,loop,noatime    0    0
>>         /firmware.sqfs      /lib/firmware    squashfs   
>>         defaults,auto,loop,noatime    0    0
>>         /dev/cdrom            /mnt/cdrom    iso9660       
>>         defaults,noatime    0    0
>>         /mnt/cdrom/usr.sqfs        /mnt/ro        squashfs   
>>         defaults,auto,loop,noatime    0    0
>>         proc                /proc               proc        
>>         defaults          0    0
>>         devpts                /dev/pts           devpts      
>>         defaults,gid=5,mode=620    0    0
>>         tmpfs                   /dev/shm           tmpfs      
>>         mode=0777             0          0
>>         tmpfs                   /tmp               tmpfs       
>>         defaults              0          0
>>         sysfs                /sys               sysfs       
>>         defaults          0    0
>>         What that does, is:
>>         1 ) mount ./modules.sqfs (xz-compressed squashfs containing
>>         kernel modules) to /lib/modules
>>         2 ) mount ./firmware.sqfs (xz-compressed squashfs containing
>>         firmware stuff) to /lib/firmware
>>         3 ) mount Live-CD (the system itself that is running) to
>>         /mnt/cdrom. The reason for this is
>>         that storing usr.sqfs (xz-compressed squasfhs containing
>>         /usr) to initramfs is waste of memory
>>         while it can be stored into the root (outside of initramfs)
>>         of live-cd. Just like I have done with kernel.
>>         4 ) Mount /mnt/cdrom/usr.sqfs to /mnt/ro.
>>         The reason for this is that later, in  /etc/init.d/rcS
>>         im going to use unionfs to compine read-writeable /mnt/rw
>>         (just empty directory without nothing mounted in)
>>          and read-only /mnt/ro (the xz-compressed squashfs image from
>>         Live-CD root that just got mounted) to compined
>>         read-write directory in /usr
>>         It's all little compilacted but space and memory saving and
>>         stuff can be written to /usr if need to (for example Xorg
>>         needs at least one location inside/usr to be writable for
>>         fonts if I remember correctly)
>>         If you don't need writable /usr then you can just mount your
>>         usr-squashfs directly to /usr.
>>         If you don't need /usr at all but just want to squashfs your
>>         /  then maybe it's doable but you still have to mount
>>         few places as read-write for tmp files and other stuff.
>>         Like:
>>         mount -t tmpfs tmpfs /tmp
>>         And maybe
>>         mount -t tmpfs tmpfs /var/log
>>         Ofcourse those can be also added to /etc/fstab
>>         What exatcly you have inside that squashfs ? Just busybox and
>>         nothing else ?
>>         In that case it's really not worth all the squashfs setup.
>>         Regards
>>         Stefan
>>>         _______________________________________________
>>>         buildroot mailing list
>>>         buildroot at busybox.net <mailto:buildroot at busybox.net>
>>>         http://lists.busybox.net/mailman/listinfo/buildroot

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20130122/bd3e765d/attachment-0002.html>

More information about the buildroot mailing list