SwitchBox is a minimal NSLU2 ramdisk used to switch between root filesystems on boot. It can also be used as a recovery console ramdisk (allowing you to reflash partitions).
It is required because the stock Redboot will always load a ramdisk from the first block of the Ramdisk partition into memory before the kernel boots. Switchbox without network support (i.e. requiring a serial console) is smaller than one erase block size. We have decided to use two blocks (256Kb) to enable network support.
The following portion of the chat log describes a change to switchbox that will allow the Slug to be booted into ramdisk instead of jffs2. This allows us to upgrade a jffs2 slug with new firmware using the web interface.
[16:17] <rwhitby-web> 1) test mount jffs2 from mtdblock4
[16:18] <rwhitby-web> 2) if that mounts, then look for a /.ramdisk file in the jffs2 rootfs
[16:18] <rwhitby-web> 3) if /.ramdisk exists, then create a /dev/ram1 and copy the contents of jffs2 to it, and tell the kernel to boot from that instead (using real-root-dev)
[16:19] <rwhitby-web> 4) if /.ramdisk does not exist, then set real-root-dev to mtdblock4
[16:19] <rwhitby-web> 5) the rest of /linuxrc in switchbox is unchanged
I don't need mke2fs in switchbox, cause the jffs2 rootfs that I am copying already has it in there - I can just use it directly (but remember that it is dynamically linked, so we need to copy the libraries over to the right place first).
This can also be extended to look for /.recovery on the jffs2, and drop to recovery console if it exists.
By default, the kernel's settings (e.g. set in the kernel file with rdev or compiled into the kernel file), or the boot loader option setting is used for the normal root file systems.
It is possible for the /linuxrc executable to change the normal root device. For /linuxrc to change the normal root device, /proc must be mounted. After mounting /proc, /linuxrc changes the normal root device by writing into the proc file /proc/sys/kernel/real-root-dev. For a physical root device, the root device is changed by having /linuxrc write the new root file system device number into /proc/sys/kernel/real-root-dev. Note that to support NFS rootfs we need to change to a pivot_root based approach.
Making a generic ram disk
Make sure ram disk support is compiled in your kernel. If you don't have it, see the miniroot HOWTO for mounting via loopback.
Create a ramdisk device if one does not already exist in /dev:
/home/tony# mknod -m 660 /dev/ram b 1 1 /home/tony# chown root.disk /dev/ram
Zero out the space you need on the ramdisk device:
/home/tony# dd if=/dev/zero of=/dev/ram bs=1k count=4k 4096+0 records in 4096+0 records out
Make a file system on the ram disk, specifying the size:
/home/tony# /sbin/mkfs -t ext2 -m 0 /dev/ram 4096 mke2fs 1.18, 11-Nov-1999 for EXT2? FS 0.5b, 95/08/09 Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) 1024 inodes, 4096 blocks 204 blocks (4.98%) reserved for the super user First data block=1 1 block group 8192 blocks per group, 8192 fragments per group 1024 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done
Mount the ram disk as you would a regular device:
/home/tony# mount -t ext2 /dev/ram /mnt/disk