]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - tools/mkflash/mkflash
git-svn-id: http://svn.ipfire.org/svn/ipfire/IPFire/source@16 ea5c0bd1-69bd-2848...
[people/pmueller/ipfire-2.x.git] / tools / mkflash / mkflash
diff --git a/tools/mkflash/mkflash b/tools/mkflash/mkflash
new file mode 100644 (file)
index 0000000..87c51f2
--- /dev/null
@@ -0,0 +1,460 @@
+#!/bin/bash
+#
+# This file is part of the IPCop Firewall.
+#
+# IPCop is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# IPCop is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with IPCop; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# Originally by Guy Ellis and Steve Bauer
+# Copyright 2001 Traverse Technologies Australia - http://www.traverse.com.au/
+#
+# Copyright (C) 2002-04-08 Mark Wormgoor <mark@wormgoor.com>
+#               - Modified to use loopback filesystem
+#              - Modified to easily change partition sizes
+# Copyright (C) 2003-04-04 Nick Shore <nick.shore@multithread.co.uk>
+#              - Added disksize calculations
+# Copyright (C) 2003-04-09 Simon Turner <simont@angledata.co.uk>
+#              - Modified to easily change partition sizes and fix
+#                some bugs.
+# Copyright (C) 2004-01-29 Mark Wormgoor <mark@wormgoor.com>
+#               - Modified for IPCop 1.4 (grub, etc)
+# Copyright (C) 2004-08-17 Dale Haag <dhaag@net-defender.net>
+#               - Fixed grub stage2 problem for CF disks
+#               - Added command line option to select target CF drive
+#               - Modified for creating 256mb, 512mb and 1gb CF disks
+#               - Modified routines for building sym links
+#               - Added ability to define kernel loading parameters needed for large CF disks
+#               - Added ability to define grub install parameters needed for large CF disks
+#               - Flash file is created as /tmp/[size]flash.img to allow storing multiple development images
+# Copyright (C) 2004-08-30 Dale Haag <dhaag@net-defender.net>        
+#               - Fixed issue with ramdisk sym link not properly being created for rc.flash.up
+#               - Added ability to configure ethernet settings for a LEX with 3 RTL8139 during flash build
+# Copyright (C) 2005-08-13 Gilles Espinasse <g.esp.ipcop@free.fr>
+#               - Use a bigger /boot partition to allow easier kernel upgrade and support smp kernel
+#               - Define zlog_MB at 30MB for 512 and 1gb like with 256 flash
+# Features
+# - ext3 file system
+# - auto grub install to CF
+# - compressed logs on flash + log to ramdisk
+#
+#   Some SiS chipset don't like ide=nodma parameter (bug SF 1098510), remove in case of problem
+
+VERSION="0.4.3"
+SIZE="$1"
+CF="$2"
+
+# See what we're supposed to do
+# 32 & 64 are too small now for this current script and IPCop 1.4.0
+case "$SIZE" in
+#32)
+#      echo "`date '+%b %e %T'`: Creating 32MB Compact Flash"
+#      flash_MB=30
+#      ramdisk_MB=64
+#      boot_MB=3
+#      zlog_MB=4
+#      root_MB=$(( $flash_MB - $boot_MB - $zlog_MB ))
+#      heads=8
+#      sectors=32
+#      ;;
+#64)
+#      echo "`date '+%b %e %T'`: Creating 64MB Compact Flash"
+#      flash_MB=61
+#      ramdisk_MB=64
+#      boot_MB=3
+#      zlog_MB=4
+#      root_MB=$(( $flash_MB - $boot_MB - $zlog_MB ))
+#      heads=8
+#      sectors=32
+#      ;;
+128)
+       echo "`date '+%b %e %T'`: Creating 128MB Compact Flash"
+       flash_MB=122
+       ramdisk_MB=64
+       boot_MB=8
+       zlog_MB=10
+       root_MB=$(( $flash_MB - $boot_MB - $zlog_MB ))
+       heads=8
+       sectors=32
+       ;;
+256)
+       echo "`date '+%b %e %T'`: Creating 256MB Compact Flash"
+       flash_MB=222
+       ramdisk_MB=64
+       boot_MB=8
+       zlog_MB=30
+       root_MB=$(( $flash_MB - $boot_MB - $zlog_MB ))
+       heads=16
+       sectors=32
+       #kernel_PARMS="idebus=100 ide=nodma ide0=0x177-0x177,0x376" #specific to LEX with CF on secondary master
+       #kernel_PARMS=""                # Sis chipset workaround, don't use nodma
+       kernel_PARMS="ide=nodma"        # Generic
+       grub_PARMS="--force-lba"
+       ;;
+512)
+       echo "`date '+%b %e %T'`: Creating 512MB Compact Flash"
+       flash_MB=485
+       ramdisk_MB=64
+       boot_MB=8
+       zlog_MB=30
+       root_MB=$(( $flash_MB - $boot_MB - $zlog_MB ))
+       heads=16
+       sectors=32
+       #kernel_PARMS="idebus=100 ide=nodma ide0=0x177-0x177,0x376" #specific to LEX with CF on secondary master
+       #kernel_PARMS=""                # Sis chipset workaround, don't use nodma
+       kernel_PARMS="ide=nodma"        # Generic
+       grub_PARMS="--force-lba"
+       ;;
+1gb)
+       echo "`date '+%b %e %T'`: Creating 1 Gigabyte Compact Flash"
+       flash_MB=978
+       ramdisk_MB=64
+       boot_MB=8
+       zlog_MB=30
+       root_MB=$(( $flash_MB - $boot_MB - $zlog_MB ))
+       heads=16
+       sectors=32
+       #kernel_PARMS="idebus=100 ide=nodma ide0=0x177-0x177,0x376" #specific to LEX with CF on secondary master
+       #kernel_PARMS=""                # Sis chipset workaround, don't use nodma
+       kernel_PARMS="ide=nodma"        Generic
+       grub_PARMS="--force-lba"
+       ;;
+
+*)
+#      echo "Usage: $0 {32|64|128|256|512|1gb} {hda|hdb|hdc|hdd}"
+       echo "Usage: $0 {128|256|512|1gb} {hda|hdb|hdc|hdd}"
+       exit 1
+       ;;
+esac
+
+case "$CF" in
+hda)
+       echo "`date '+%b %e %T'`: Creating hda Compact Flash"
+       drive_ID=hda4
+       ;;
+hdb)
+       echo "`date '+%b %e %T'`: Creating hdb Compact Flash"
+       drive_ID=hdb4
+       ;;
+hdc)
+       echo "`date '+%b %e %T'`: Creating hdc Compact Flash"
+       drive_ID=hdc4
+       ;;
+hdd)
+       echo "`date '+%b %e %T'`: Creating hdd Compact Flash"
+       drive_ID=hdd4
+       ;;
+*)
+       echo "Usage: $0 {32|64|128|256|512|1gb} {hda|hdb|hdc|hdd}"
+       exit 1
+       ;;
+esac
+
+
+# Calculate all the required derived variables...
+bs=512         # do not change!
+
+flash_blocks=$(( $flash_MB * 1024 * 1024 / $bs ))
+
+boot_blocks=$(( $boot_MB * 1024 * 1024 / $bs - 1 ))
+zlog_blocks=$(( $zlog_MB * 1024 * 1024 / $bs ))
+root_blocks=$(( $root_MB * 1024 * 1024 / $bs ))
+
+boot_block_offset=1
+zlog_block_offset=$(( $boot_block_offset + $boot_blocks ))
+root_block_offset=$(( $zlog_block_offset + $zlog_blocks ))
+
+boot_byte_offset=$(( $boot_block_offset * $bs ))
+zlog_byte_offset=$(( $zlog_block_offset * $bs ))
+root_byte_offset=$(( $root_block_offset * $bs ))
+
+cylinders=$(( $flash_blocks / $heads / $sectors ))
+
+# RAM Disk
+ramdisk_KB=$(( $ramdisk_MB * 1024 ))
+
+############################################################################
+#                                                                          #
+# Loading loopback kernel module                                           #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Loading loopback kernel module"
+modprobe loop
+
+
+############################################################################
+#                                                                          #
+# Creating empty flash image in /tmp/cf-image                              #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Creating empty flash image in /tmp"
+dd if=/dev/zero of=/tmp/flash.img bs=$bs count=$flash_blocks >/dev/null
+dd if=/dev/zero of=/var/log/part1.img bs=$bs count=$boot_blocks  >/dev/null
+dd if=/dev/zero of=/var/log/part2.img bs=$bs count=$zlog_blocks  >/dev/null
+dd if=/dev/zero of=/var/log/part3.img bs=$bs count=$root_blocks  >/dev/null
+
+
+############################################################################
+#                                                                          #
+# Making filesystems                                                       #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Making filesystems"
+mke2fs -F -j -m 0 -b 1024 /var/log/part1.img >/dev/null
+mke2fs -F -j -m 0 -b 1024 /var/log/part2.img >/dev/null
+mke2fs -F -j -m 0 -b 1024 /var/log/part3.img >/dev/null
+
+
+############################################################################
+#                                                                          #
+# Creating and partitioning Compact Flash image                            #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Creating and partitioning Compact Flash image"
+sfdisk -H $heads -S $sectors -C $cylinders -uM /tmp/flash.img <<EOF >/dev/null 2>&1
+# Start Size    Type    Bootable
+,$boot_MB,,*                   # /boot
+,$zlog_MB,,                    # /var/log_compressed
+,0,,                           # Unused
+,$root_MB,,                    # /
+EOF
+dd if=/var/log/part1.img of=/tmp/flash.img seek=$boot_block_offset  bs=$bs
+dd if=/var/log/part2.img of=/tmp/flash.img seek=$zlog_block_offset  bs=$bs
+dd if=/var/log/part3.img of=/tmp/flash.img seek=$root_block_offset  bs=$bs
+rm -f /var/log/part?.img
+
+
+############################################################################
+#                                                                          #
+# Mounting loopback flash image under /mnt                                 #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Mounting loopback flash image under /mnt"
+rm -rf /mnt/flash
+mkdir -p /mnt/flash
+mount -o loop,offset=$root_byte_offset /tmp/flash.img /mnt/flash
+mkdir -p /mnt/flash/boot
+mount -o loop,offset=$boot_byte_offset /tmp/flash.img /mnt/flash/boot
+mkdir -p /mnt/flash/var/log_compressed
+mount -o loop,offset=$zlog_byte_offset /tmp/flash.img /mnt/flash/var/log_compressed
+
+
+############################################################################
+#                                                                          #
+# Creating flash image directory structure                                 #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Creating flash image directory structure"
+mkdir -p /mnt/flash/{ram/,proc/,mnt/}
+
+
+############################################################################
+#                                                                          #
+# Copying files into flash image                                           #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Copying files into flash image"
+# /boot
+cp -a /boot /mnt/flash/
+
+# /var
+mkdir -p /mnt/flash/var/{log,log_compressed,spool,www/icons}
+cp -a /var/ipcop /var/lib /var/state /var/lock /var/log /mnt/flash/var
+
+#######################################################################################
+# Configure flash image ethernet settings                                             #
+# this allows you to stage on one system and build flash for LEX with 3 RTL8139 NIC's #
+# if a settings file named settings.8139 is placed in your /root directory it will be #
+# used to configure the flash image with the correct ethernet settings for the LEX    #
+# a default settings.8139 file is provided for your use                               # 
+#######################################################################################
+if [ -f /root/settings.8139 ]
+then
+       /bin/echo ""    
+    /bin/echo "Configuring Flash With LEX RTL8139 Ethernet Settings"
+    /bin/echo ""
+    /bin/echo ""
+    cat /root/settings.8139 > /mnt/flash/var/ipcop/ethernet/settings
+else
+    /bin/echo ""    
+    /bin/echo "Flash Is Using Build System Ethernet Settings"
+    /bin/echo ""
+    /bin/echo ""
+
+fi
+
+rm -rf /mnt/flash/var/log/lost+found
+cp -a  /var/run /var/empty /mnt/flash/var
+cp -a  /var/spool/cron /mnt/flash/var/spool
+ln -s  /tmp /mnt/flash/var/patches
+ln -sf /ram/squid /var/log/cache
+rm -f  /mnt/flash/var/lib/logrotate.status
+rm -f  /mnt/flash/var/state/dhcp/*
+touch  /mnt/flash/var/state/dhcp/dhcpd.leases
+find /mnt/flash/var/run \( -type f -o -type s \) -exec rm -f {} \;
+touch /mnt/flash/var/run/utmp
+chmod 644 /mnt/flash/var/run/utmp
+chown root:utmp /mnt/flash/var/run/utmp
+touch /mnt/flash/var/log/wtmp
+chmod 664 /mnt/flash/var/log/wtmp
+chown root:utmp /mnt/flash/var/log/wtmp
+
+# /var/log
+rm -rf /mnt/flash/var/log/snort/*
+find /mnt/flash/var/log -type f -exec rm -f {} \;
+tar -C /mnt/flash -czf /mnt/flash/var/log_compressed/log.tgz var/log/
+rm -rf /mnt/flash/var/log/
+ln -sf /ram/log /mnt/flash/var/log
+
+# Other files
+cp -a  /sbin /mnt/flash/
+cp -a  /bin  /mnt/flash/
+cp -a  /lib  /mnt/flash/
+cp -a  /dev  /mnt/flash/
+
+# create the symlinks
+echo "`date '+%b %e %T'`: Creating $CF Sym Link"
+ln -sf /dev/"$CF" /mnt/flash/dev/harddisk
+
+echo "`date '+%b %e %T'`: Creating "$CF'1'" Sym Link"
+ln -sf /dev/$CF'1' /mnt/flash/dev/harddisk1
+
+echo "`date '+%b %e %T'`: Creating "$CF'2'" Sym Link"
+ln -sf /dev/$CF'2' /mnt/flash/dev/harddisk2
+
+echo "`date '+%b %e %T'`: Creating "$CF'3'" Sym Link"
+ln -sf /dev/$CF'3' /mnt/flash/dev/harddisk3
+
+echo "`date '+%b %e %T'`: Creating "$CF'4'" Sym Link"
+ln -sf /dev/$CF'4' /mnt/flash/dev/harddisk4
+
+
+cp -a  /root /mnt/flash/
+rm -f  /mnt/flash/root/.bash_history
+cp -a  /etc  /mnt/flash/
+rm -rf /mnt/flash/etc/{httpd/conf/ssl*,makedev.d/}
+rm -f  /mnt/flash/etc/ssh/*key
+rm -f  /mnt/flash/etc/httpd/server.*
+cp -a  /home /mnt/flash/
+rm -f  /home/httpd/html/graphs/*
+rm -f  /home/httpd/html/sgraph/*
+cp -a  /usr /mnt/flash
+rm -rf /mnt/flash/{tmp/,usr/tmp/,var/tmp/}
+ln -sf /ram/tmp/ /mnt/flash/tmp
+ln -sf /ram/tmp/ /mnt/flash/usr/tmp
+ln -sf /ram/tmp/ /mnt/flash/var/tmp
+ln -sf /dev/ram0 /mnt/flash/dev/ramdisk
+
+############################################################################
+#                                                                          #
+# Installing log backup cron job                                           #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Installing log backup cron job"
+cat >> /mnt/flash/var/spool/cron/root.orig <<EOF
+
+# Backup logs to flash
+02 * * * *     /etc/rc.d/rc.flash.down
+EOF
+chroot /mnt/flash /usr/bin/fcrontab -z >/dev/null 2>&1
+
+
+############################################################################
+#                                                                          #
+# Reconfiguring logrotate                                                  #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Reconfiguring logrotate"
+cp -pf logrotate.conf /mnt/flash/etc/
+
+
+############################################################################
+#                                                                          #
+# Installing new fstab                                                     #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Installing new fstab"
+cat /etc/fstab | sed -e 's/log\t/log_compressed/' > /mnt/flash/etc/fstab
+df | grep /mnt/flash
+
+
+############################################################################
+#                                                                          #
+# Touching /etc/FLASH                                                      #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Touching /etc/FLASH"
+touch /mnt/flash/etc/FLASH
+
+############################################################################
+#                                                                          #
+# Create the Grub.conf file with our parameters                            #
+#                                                                          #
+############################################################################
+cat > /mnt/flash/boot/grub/grub.conf <<EOF
+timeout 5
+default saved
+foreground = 16064e
+background = ffffff
+splashimage (hd0,0)/grub/ipcop.xpm.gz
+title IPCop
+  root (hd0,0)
+  kernel /vmlinuz root=/dev/$drive_ID panic=10 acpi=off ro $kernel_PARMS ramdisk_size=$ramdisk_KB
+  savedefault
+title IPCop SMP
+  root (hd0,0)
+  kernel /vmlinuz-smp root=/dev/$drive_ID panic=10 acpi=off ro $kernel_PARMS ramdisk_size=$ramdisk_KB
+  savedefault
+title IPCop (ACPI enabled)
+  root (hd0,0)
+  kernel /vmlinuz root=/dev/$drive_ID panic=10 ro $kernel_PARMS ramdisk_size=$ramdisk_KB
+  savedefault
+title IPCop SMP (ACPI HT enabled)
+  root (hd0,0)
+  kernel /vmlinuz-smp root=/dev/$drive_ID panic=10 acpi=ht ro $kernel_PARMS ramdisk_size=$ramdisk_KB
+  savedefault
+EOF
+
+
+############################################################################
+#                                                                          #
+# Installing grub                                                          #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Installing Grub"
+
+/usr/sbin/grub --batch <<EOF >/dev/null 2>&1
+device (hd0) /tmp/flash.img
+geometry (hd0)
+root (hd0,0)
+makeactive
+install $grub_PARMS (hd0,0)/grub/stage1 (hd0) (hd0,0)/grub/stage2 0x8000 p /grub/grub.conf
+quit
+EOF
+
+############################################################################
+#                                                                          #
+# Cleaning up                                                              #
+#                                                                          #
+############################################################################
+echo "`date '+%b %e %T'`: Cleaning up"
+rm -f verinfo
+umount /mnt/flash/var/log_compressed
+umount /mnt/flash/boot
+umount /mnt/flash
+losetup -d /dev/loop0
+losetup -d /dev/loop1
+losetup -d /dev/loop2
+mv /tmp/flash.img /tmp/$SIZE'flash.img'
+
+echo "`date '+%b %e %T'`: Mkflash For $SIZE Flash Drive On $CF Complete"