Author: alexander
Date: 2007-05-08 10:05:11 -0600 (Tue, 08 May 2007)
New Revision: 1883

Modified:
   trunk/packages/initramfs/Makefile
   trunk/packages/initramfs/init.in
Log:
Initial support for copying the whole CD to RAM.
Shutdown is currently unclean in this situation.


Modified: trunk/packages/initramfs/Makefile
===================================================================
--- trunk/packages/initramfs/Makefile   2007-05-08 13:26:58 UTC (rev 1882)
+++ trunk/packages/initramfs/Makefile   2007-05-08 16:05:11 UTC (rev 1883)
@@ -25,6 +25,7 @@
        sed -i 's/, *GROUP="[^"]*"//' $(WDIR)/etc/udev/rules.d/*
        sed s/@VERSION@/$(VERSION)/ init.in >$(WDIR)/init
        chmod 755 $(WDIR)/init
+       cp fakecd.iso.head $(WDIR)
        mknod -m 640 $(WDIR)/dev/console c 5 1
        mknod -m 664 $(WDIR)/dev/null c 1 3
        cp /bin/{sh,dd,cat,cp,mkdir,mount,umount,sed,sleep,ln,rm,uname} 
$(WDIR)/bin

Modified: trunk/packages/initramfs/init.in
===================================================================
--- trunk/packages/initramfs/init.in    2007-05-08 13:26:58 UTC (rev 1882)
+++ trunk/packages/initramfs/init.in    2007-05-08 16:05:11 UTC (rev 1883)
@@ -13,6 +13,7 @@
 noresume=0
 resume=
 all_generic_ide=0
+toram=0
 
 find_cd() {
        for SYS in /sys/block/hd* /sys/block/sr* ; do
@@ -39,6 +40,46 @@
        esac
 }
 
+copy_cd_to_ram() {
+       mount -n -t iso9660 -o ro,norock /dev/lfs-cd /.tmpfs/.cdrom
+       cat /fakecd.iso.head >/.tmpfs/.fakecd.iso
+       dd if=/.tmpfs/.cdrom/root.ext2 bs=2048 conv=sync >>/.tmpfs/.fakecd.iso
+       # Update volume size
+       vsize=`stat -c '%s' /.tmpfs/.fakecd.iso`
+       vsize=$(( $vsize >> 11 ))
+       printf $(printf '\\x%x\\x%x\\x%x\\x%x\\x%x\\x%x\\x%x\\x%x\n' \
+               $(( vsize & 0xff )) $(( ( vsize >> 8 ) & 0xff )) \
+               $(( ( vsize >> 16 ) & 0xff )) $(( ( vsize >> 24 ) & 0xff )) \
+               $(( ( vsize >> 24 ) & 0xff )) $(( ( vsize >> 16 ) & 0xff )) \
+               $(( ( vsize >> 8 ) & 0xff )) $(( vsize & 0xff )) \
+       ) | dd of=/.tmpfs/.fakecd.iso bs=1 seek=32848 conv=notrunc 2>/dev/null
+       # Update compressed size
+       csize=`stat -c '%s' /.tmpfs/.cdrom/root.ext2`
+       printf $(printf '\\x%x\\x%x\\x%x\\x%x\\x%x\\x%x\\x%x\\x%x\n' \
+               $(( csize & 0xff )) $(( ( csize >> 8 ) & 0xff )) \
+               $(( ( csize >> 16 ) & 0xff )) $(( ( csize >> 24 ) & 0xff )) \
+               $(( ( csize >> 24 ) & 0xff )) $(( ( csize >> 16 ) & 0xff )) \
+               $(( ( csize >> 8 ) & 0xff )) $(( csize & 0xff )) \
+       ) | dd of=/.tmpfs/.fakecd.iso bs=1 seek=47352 conv=notrunc 2>/dev/null
+       # Update compression parameters
+       dd if=/.tmpfs/.cdrom/root.ext2 of=of=/.tmpfs/.fakecd.iso \
+               bs=1 count=2 skip=12 seek=47473 conv=notrunc 2>/dev/null
+       # Update uncompressed size
+       dd if=/.tmpfs/.cdrom/root.ext2 of=of=/.tmpfs/.fakecd.iso \
+               bs=1 count=4 skip=8 seek=47475 conv=notrunc 2>/dev/null
+       dd if=/.tmpfs/.cdrom/root.ext2 of=of=/.tmpfs/.fakecd.iso \
+               bs=1 count=1 skip=11 seek=47479 conv=notrunc 2>/dev/null
+       dd if=/.tmpfs/.cdrom/root.ext2 of=of=/.tmpfs/.fakecd.iso \
+               bs=1 count=1 skip=10 seek=47480 conv=notrunc 2>/dev/null
+       dd if=/.tmpfs/.cdrom/root.ext2 of=of=/.tmpfs/.fakecd.iso \
+               bs=1 count=1 skip=9 seek=47481 conv=notrunc 2>/dev/null
+       dd if=/.tmpfs/.cdrom/root.ext2 of=of=/.tmpfs/.fakecd.iso \
+               bs=1 count=1 skip=8 seek=47482 conv=notrunc 2>/dev/null
+       umount -n /.tmpfs/.cdrom
+       /sbin/losetup /dev/loop2 /.tmpfs/.fakecd.iso
+       ln -sf /dev/loop2 /dev/lfs-cd
+}
+
 do_mount_cd() {
        while [ ! -L /dev/lfs-cd ] ; do
                find_cd
@@ -60,6 +101,7 @@
        mkdir /.tmpfs
        mount -n -t tmpfs -o size=90% tmpfs /.tmpfs
        mkdir /.tmpfs/.cdrom
+       if [ "$toram" = 1 ] ; then copy_cd_to_ram ; fi
        mount -n -t iso9660 -o ro /dev/lfs-cd /.tmpfs/.cdrom
        /sbin/losetup /dev/loop0 /.tmpfs/.cdrom/root.ext2
        SIZE=`/sbin/blockdev --getsize /dev/loop0`
@@ -70,7 +112,7 @@
        echo "0 $SIZE snapshot /dev/loop0 /dev/loop1 p 8" | /sbin/dmsetup 
create lfs-cd
        mount -n -t ext2 /dev/mapper/lfs-cd /.root
        mount -n --move /.tmpfs /.root/dev/shm
-       cp -a /dev/lfs-cd /.root/dev/lfs-cd
+       if [ "$toram" != 1 ] ; then cp -a /dev/lfs-cd /.root/dev/lfs-cd ; fi
        cat /etc/modprobe.conf >>/.root/etc/modprobe.conf
 }
 
@@ -138,6 +180,9 @@
        resume=*)
                resume=${param#resume=}
                ;;
+       toram)
+               toram=1
+               ;;
        esac
 done
 
@@ -185,6 +230,6 @@
 umount /proc
 cd /.root
 # Clean up and free some memory
-rm -rf /bin /sbin /lib /sys /proc /dev /.tmpfs /init
+rm -rf /bin /sbin /lib /sys /proc /dev /.tmpfs /init /fakecd.iso.head
 ./lib/ld-linux.so.2 --library-path ./lib ./bin/mount -n --move . /
 exec ../lib/ld-linux.so.2 --library-path ./lib ./usr/sbin/chroot . /sbin/init 
"$@"

-- 
http://linuxfromscratch.org/mailman/listinfo/livecd
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to