make squashfs overlay support more generic and integrate it for x86-2.6
authorFelix Fietkau <nbd@openwrt.org>
Fri, 2 Mar 2007 01:23:36 +0000 (01:23 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 2 Mar 2007 01:23:36 +0000 (01:23 +0000)
SVN-Revision: 6450

include/image.mk
package/base-files/Makefile
package/base-files/files/bin/firstboot [new file with mode: 0755]
package/base-files/files/etc/preinit [new file with mode: 0755]
package/base-files/files/sbin/mount_root
target/linux/generic-2.6/patches/065-block2mtd_init.patch [new file with mode: 0644]
target/linux/x86-2.6/Makefile
target/linux/x86-2.6/config/default
target/linux/x86-2.6/image/Makefile

index ec0512f..9c170af 100644 (file)
@@ -17,6 +17,19 @@ JFFS2OPTS     :=  --pad --big-endian --squash
 SQUASHFS_OPTS :=  -be
 endif
 
+define add_jffs2_mark
+       echo -ne '\xde\xad\xc0\xde' >> $(1)
+endef
+
+# pad to 64k and add jffs2 end-of-filesystem mark
+# do this twice to make sure that this works with 128k blocksize as well
+define prepare_generic_squashfs
+       dd if=$(1) of=$(KDIR)/tmpfile.1 bs=64k conv=sync
+       $(call add_jffs2_mark,$(KDIR)/tmpfile.1)
+       dd of=$(1) if=$(KDIR)/tmpfile.1 bs=64k conv=sync
+       $(call add_jffs2_mark,$(1))
+endef
+
 ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
   ifeq ($(CONFIG_TARGET_ROOTFS_JFFS2),y)
     define Image/mkfs/jffs2
@@ -25,9 +38,10 @@ ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
                $(STAGING_DIR)/bin/mkfs.jffs2 $(JFFS2OPTS) -e 0x10000 -o $(KDIR)/root.jffs2-64k -d $(BUILD_DIR)/root
                $(STAGING_DIR)/bin/mkfs.jffs2 $(JFFS2OPTS) -e 0x20000 -o $(KDIR)/root.jffs2-128k -d $(BUILD_DIR)/root
 
+               
                # add End-of-Filesystem markers
-               echo -ne '\xde\xad\xc0\xde' >> $(KDIR)/root.jffs2-64k
-               echo -ne '\xde\xad\xc0\xde' >> $(KDIR)/root.jffs2-128k
+               $(call add_jffs2_mark,$(KDIR)/root.jffs2-64k)
+               $(call add_jffs2_mark,$(KDIR)/root.jffs2-128k)
        
                $(call Image/Build,jffs2-64k)
                $(call Image/Build,jffs2-128k)
index 33e6522..5cbef91 100644 (file)
@@ -41,6 +41,11 @@ define Package/base-files$(TARGET)
        This package contains a base filesystem and system scripts for OpenWrt.
   URL:=http://openwrt.org/
   VERSION:=$(PKG_RELEASE)-$(REV)
+  $(call Config,network.lan.proto,string,static,LAN Protocol)
+  $(call Config,network.lan.ipaddr,ip,192.168.1.1,LAN IP Address)
+  $(call Config,network.lan.netmask,netmask,255.255.0.0,LAN Network Mask)
+  $(call Config,network.lan.gateway,ip,,LAN Gateway)
+  $(call Config,network.lan.dns,ip,,LAN DNS server)
 endef
 
 define Package/base-files$(TARGET)/conffiles
@@ -153,3 +158,5 @@ $(eval $(call BuildPackage,base-files$(TARGET)))
 $(eval $(call BuildPackage,libgcc))
 $(eval $(call BuildPackage,libpthread))
 $(eval $(call BuildPackage,uclibc))
+
+
diff --git a/package/base-files/files/bin/firstboot b/package/base-files/files/bin/firstboot
new file mode 100755 (executable)
index 0000000..fe63d1b
--- /dev/null
@@ -0,0 +1,128 @@
+#!/bin/sh
+# $Id: firstboot 5544 2006-11-17 03:07:10Z nbd $
+. /etc/functions.sh
+
+partname="rootfs_data"
+mtdpart="$(find_mtd_part $partname)"
+
+rom=$(awk '/squashfs/ {print $2}' /proc/mounts)
+jffs=$(awk '/jffs2/ {print $2}' /proc/mounts)
+
+dupe() { # <new_root> <old_root>
+       cd $1
+       echo -n "creating directories... "
+       {
+               cd $2 
+               find . -xdev -type d
+               echo "./dev ./jffs ./mnt ./proc ./tmp"
+               # xdev skips mounted directories
+               cd $1 
+       } | xargs mkdir -p
+       echo "done"
+
+       echo -n "setting up symlinks... "
+       for file in $(cd $2; find . -xdev -type f;); do
+               case "$file" in
+               ./rom/note) ;; #nothing
+               ./etc/config*|\
+               ./usr/lib/ipkg/info/*) cp -af $2/$file $file;;
+               *) ln -sf /rom/${file#./*} $file;;
+               esac
+       done
+       for file in $(cd $2; find . -xdev -type l;); do
+               cp -af $2/${file#./*} $file
+       done
+       echo "done"
+}
+
+pivot() { # <new_root> <old_root>
+       mount -o move /proc $1/proc && \
+       pivot_root $1 $1$2 && {
+               mount -o move $2/dev /dev
+               mount -o move $2/tmp /tmp
+               mount -o move $2/jffs /jffs 2>&-
+               return 0
+       }
+}
+
+fopivot() { # <rw_root> <ro_root> <dupe?>
+       root=$1
+       {
+               mount -t mini_fo -o base=/,sto=$1 $1 /mnt 2>&- && root=/mnt
+       } || {
+               [ "$3" = "1" ] && {
+               mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1
+               dupe $1 $rom
+               }
+       }
+       pivot $root $2
+}
+
+ramoverlay() {
+       mkdir -p /tmp/root
+       fopivot /tmp/root /rom 1
+}
+
+# invoked as an executable
+[ "${0##*/}" = "firstboot" ] && {
+
+       [ -z "$mtdpart" ] && {
+               echo "MTD partition not found."
+               exit 1
+       }
+
+       [ -z "$rom" ] && {
+               echo "You do not have a squashfs partition; aborting"
+               echo "(firstboot cannot be run on jffs2 based firmwares)"
+               exit 1
+       }
+
+       [ "$1" = "switch2jffs" ] && {
+               mtd erase "$partname"
+
+               # try to avoid fs changing while copying
+               mount -o remount,ro none / 2>&-
+
+               # copy ramoverlay to jffs2
+               mount "$mtdpart" /rom/jffs -t jffs2
+               echo -n "copying files ... "
+               cp -a /tmp/root/* /rom/jffs 2>&-
+               echo "done"
+
+               # switch back to squashfs (temporarily)
+               # and park the ramdisk ontop of /tmp/root
+               pivot /rom /mnt
+               mount -o move /mnt /tmp/root
+
+               # /jffs is the overlay
+               # /rom is the readonly
+               fopivot /jffs /rom
+
+               # try to get rid of /tmp/root
+               # this will almost always fail
+               umount /tmp/root 2>&-
+
+               # fs is clean
+               jffs2root --clean
+               exit 0
+       }
+
+       # script run manually
+       [ \! -z "$jffs" ] && {
+               echo "firstboot has already been run"
+               echo "jffs2 partition is mounted, only resetting files"
+               grep mini_fo /proc/filesystems >&-
+               [ $? != 0 ] && {
+                       dupe $jffs $rom
+                       exit 0
+               } || { 
+                       rm -rf $jffs/* 2>&-
+                       mount -o remount $jffs / 2>&-
+                       exit 0
+               }
+       }
+
+       mtd erase "$partname"
+       mount "$mtdpart" /jffs -t jffs2
+       fopivot /jffs /rom 1
+}
diff --git a/package/base-files/files/etc/preinit b/package/base-files/files/etc/preinit
new file mode 100755 (executable)
index 0000000..74d4e88
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+# Copyright (C) 2006 OpenWrt.org
+export PATH=/bin:/sbin:/usr/bin:/usr/sbin
+mount_root
+exec /sbin/init
index 81660f0..607877c 100755 (executable)
@@ -1,10 +1,21 @@
 #!/bin/sh
 # Copyright (C) 2006 OpenWrt.org
+. /etc/functions.sh
 
 mount none /proc -t proc
 size=$(awk '/Mem:/ {l=5242880;print((s=$2/2)<l)?$2-l:s}' /proc/meminfo)
 mount none /tmp -t tmpfs -o size=$size,nosuid,nodev,mode=1777
+
+grep rootfs /proc/mtd >/dev/null 2>/dev/null && {
+       mtd unlock rootfs
+       grep rootfs_data /proc/mtd >/dev/null 2>/dev/null && {
+               . /bin/firstboot
+               echo "switching to jffs2"
+               mount "$(find_mtd_part rootfs_data)" /jffs -t jffs2
+               fopivot /jffs /rom
+       }
+} || mount -o remount,rw /dev/root /
+
 mkdir -p /dev/pts
 mount none /dev/pts -t devpts
-mount -t sysfs none /sys 2>&-
-mount -o remount,rw /dev/root /
+grep sysfs /proc/filesystems >/dev/null && mount -t sysfs none /sys 2>&-
diff --git a/target/linux/generic-2.6/patches/065-block2mtd_init.patch b/target/linux/generic-2.6/patches/065-block2mtd_init.patch
new file mode 100644 (file)
index 0000000..ef483be
--- /dev/null
@@ -0,0 +1,112 @@
+--- linux.old/drivers/mtd/devices/block2mtd.c  2007-03-02 01:00:13.866987272 +0100
++++ linux.dev/drivers/mtd/devices/block2mtd.c  2007-03-02 02:03:45.558522080 +0100
+@@ -16,6 +16,7 @@
+ #include <linux/list.h>
+ #include <linux/init.h>
+ #include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
+ #include <linux/buffer_head.h>
+ #include <linux/mutex.h>
+ #include <linux/mount.h>
+@@ -287,10 +288,11 @@
+ /* FIXME: ensure that mtd->size % erase_size == 0 */
+-static struct block2mtd_dev *add_device(char *devname, int erase_size)
++static struct block2mtd_dev *add_device(char *devname, int erase_size, char *mtdname)
+ {
+       struct block_device *bdev;
+       struct block2mtd_dev *dev;
++      struct mtd_partition *part;
+       if (!devname)
+               return NULL;
+@@ -330,14 +332,18 @@
+       /* Setup the MTD structure */
+       /* make the name contain the block device in */
+-      dev->mtd.name = kmalloc(sizeof("block2mtd: ") + strlen(devname),
+-                      GFP_KERNEL);
++
++      if (!mtdname)
++              mtdname = devname;
++
++      dev->mtd.name = kmalloc(strlen(mtdname), GFP_KERNEL);
++
+       if (!dev->mtd.name)
+               goto devinit_err;
++      
++      strcpy(dev->mtd.name, mtdname);
+-      sprintf(dev->mtd.name, "block2mtd: %s", devname);
+-
+-      dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
++      dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK & ~(erase_size - 1);
+       dev->mtd.erasesize = erase_size;
+       dev->mtd.writesize = 1;
+       dev->mtd.type = MTD_RAM;
+@@ -349,15 +355,18 @@
+       dev->mtd.read = block2mtd_read;
+       dev->mtd.priv = dev;
+       dev->mtd.owner = THIS_MODULE;
+-
+-      if (add_mtd_device(&dev->mtd)) {
++      
++      part = kzalloc(sizeof(struct mtd_partition), GFP_KERNEL);
++      part->name = dev->mtd.name;
++      part->offset = 0;
++      part->size = dev->mtd.size;
++      if (add_mtd_partitions(&dev->mtd, part, 1)) {
+               /* Device didnt get added, so free the entry */
+               goto devinit_err;
+       }
+       list_add(&dev->list, &blkmtd_device_list);
+       INFO("mtd%d: [%s] erase_size = %dKiB [%d]", dev->mtd.index,
+-                      dev->mtd.name + strlen("blkmtd: "),
+-                      dev->mtd.erasesize >> 10, dev->mtd.erasesize);
++                      mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
+       return dev;
+ devinit_err:
+@@ -430,9 +439,9 @@
+ static int block2mtd_setup2(const char *val)
+ {
+-      char buf[80 + 12]; /* 80 for device, 12 for erase size */
++      char buf[80 + 12 + 80]; /* 80 for device, 12 for erase size, 80 for name */
+       char *str = buf;
+-      char *token[2];
++      char *token[3];
+       char *name;
+       size_t erase_size = PAGE_SIZE;
+       int i, ret;
+@@ -443,7 +452,7 @@
+       strcpy(str, val);
+       kill_final_newline(str);
+-      for (i = 0; i < 2; i++)
++      for (i = 0; i < 3; i++)
+               token[i] = strsep(&str, ",");
+       if (str)
+@@ -463,8 +472,10 @@
+                       parse_err("illegal erase size");
+               }
+       }
++      if (token[2] && (strlen(token[2]) + 1 > 80))
++              parse_err("mtd device name too long");
+-      add_device(name, erase_size);
++      add_device(name, erase_size, token[2]);
+       return 0;
+ }
+@@ -498,7 +509,7 @@
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>]]\"");
+ static int __init block2mtd_init(void)
+ {
index 88b935f..2b8e497 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 ARCH=i386
 BOARD:=x86
 BOARDNAME:=x86
-FEATURES:=jffs2 ext2
+FEATURES:=squashfs jffs2 ext2
 
 include $(INCLUDE_DIR)/kernel-build.mk
 DEFAULT_PACKAGES += kmod-natsemi
index 768947a..6e2fc2f 100644 (file)
@@ -204,7 +204,7 @@ CONFIG_M486=y
 # CONFIG_MGEODEGX1 is not set
 # CONFIG_MGEODE_LX is not set
 # CONFIG_MICROCODE is not set
-CONFIG_MINI_FO=m
+CONFIG_MINI_FO=y
 # CONFIG_MIXCOMWD is not set
 # CONFIG_MK6 is not set
 # CONFIG_MK7 is not set
index 955a42b..e594464 100644 (file)
@@ -22,18 +22,22 @@ ifeq ($(CONFIG_X86_GRUB_IMAGES),y)
        $(MAKE) -C grub clean
   endef
 
+  define Image/cmdline/squashfs
+    block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=squashfs init=/etc/preinit
+  endef
+
   define Image/cmdline/jffs2-64k
-    block2mtd.block2mtd=$(ROOTPART),65536 root=/dev/mtdblock0 rootfstype=jffs2
+    block2mtd.block2mtd=$(ROOTPART),65536,rootfs root=/dev/mtdblock0 rootfstype=jffs2
   endef
 
   define Image/cmdline/jffs2-128k
-    block2mtd.block2mtd=$(ROOTPART),131072 root=/dev/mtdblock0 rootfstype=jffs2
+    block2mtd.block2mtd=$(ROOTPART),131072,rootfs root=/dev/mtdblock0 rootfstype=jffs2
   endef
 
   define Image/cmdline/ext2
     root=$(ROOTPART) rootfstype=ext2
   endef
-
+  
   define Image/Build/grub
        # left here because the image builder doesnt need these
        $(INSTALL_DIR) $(KDIR)/root.grub/boot/grub
@@ -46,6 +50,7 @@ ifeq ($(CONFIG_X86_GRUB_IMAGES),y)
                -e 's#@BAUDRATE@#$(CONFIG_X86_GRUB_BAUDRATE)#g' \
                ./grub/menu.lst > $(KDIR)/root.grub/boot/grub/menu.lst
        PADDING="$(CONFIG_X86_GRUB_IMAGES_PAD)" PATH="$(STAGING_DIR)/usr/sbin:$(STAGING_DIR)/bin:$(PATH)" ./gen_image.sh $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).image $(CONFIG_X86_GRUB_KERNELPART) $(KDIR)/root.grub $(CONFIG_TARGET_ROOTFS_FSPART) $(KDIR)/root.$(1)
+       $(call Image/Build/grub/$(1))
   endef
 endif
 
@@ -65,8 +70,13 @@ define Image/Prepare
        $(CP) $(LINUX_DIR)/arch/i386/boot/bzImage $(KDIR)/bzImage
        $(call Image/Prepare/grub)
 endef
+  
+define Image/Build/squashfs
+    $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
+endef
 
 define Image/Build
+       $(call Image/Build/$(1))
        $(call Image/Build/grub,$(1))
        $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-$(1).fs
        $(CP) $(KDIR)/bzImage $(BIN_DIR)/openwrt-$(BOARD)-$(KERNEL)-vmlinuz