#!/bin/sh #============================================================================= # # Warning! This is definitely NOT the original version!!! # # DONTCHA USE THIS SCRIPT EXCEPT ON OWN RISK!!! # # Read the following sentence 10 times: # # I have been warned. # # 1999-11-12/Ulf Bartelt # ulf@twc.de #============================================================================= # # Copyright (C) 1997 - 1999 Heinz Mauelshagen, Germany # # June 1999 # # LVM 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, or (at your option) # any later version. # # LVM 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 LVM; see the file COPYING. If not, write to # the Free Software Foundation, 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # # # make it devfs clean # cmd=`basename $0` # # 19991112/UBa: # I decided to generate the image using a loop mount instead of a # ramdisk device and not to put initrd into /boot automagically, so # this has to be done manually now not forgetting to rerun lilo or # whatever bootloader you're using... # DEVRAM=/tmp/initrd INITRD=/tmp/initrd.gz INITRDSIZE=8192 # # 19991113/UBa: # added grep # 19991112/UBa: # added mount and umount # question: what for did Heinz include rm in this list? # INITRDFILES="/bin/grep /bin/mount /bin/umount /sbin/modprobe /sbin/vgchange /sbin/vgscan /bin/bash /bin/sh /bin/rm /sbin/insmod /dev/* /lib/modules/`uname -r`/modules.dep /lib/modules/`uname -r`/block/lvm.o" TMP=/tmp/mnt.$$ trap " cd / umount $DEVRAM rm -rf $TMP echo -e 'Bye bye...\n' " 1 2 3 15 function create_fstab { echo " /dev/ram / ext2 defaults 1 0 none /proc proc defaults 0 0 " > etc/fstab chmod 644 etc/fstab } # # 19991113/UBa: # added scanning /proc/partitions for vg00/root to get major and minor # of root device # 19991112/UBa: # added mounting/umounting proc to echo a hardcoded value of # major*256+minor of root device into /proc/sys/kernel/real-root-dev # function create_linuxrc { echo "\ #!/bin/sh /bin/mount /proc /sbin/insmod lvm /sbin/vgscan /sbin/vgchange -a y /bin/grep vg00/root /proc/partitions | ( read major minor blocks name if [ \$name == vg00/root ] ; then echo found vg00/root with major/minor = \$major/\$minor echo \$((\$major*256+\$minor)) > /proc/sys/kernel/real-root-dev else echo error, cannot find vg00/root in /proc/partitions fi ) /bin/umount /proc " > linuxrc chmod 555 linuxrc } # # Main # # 19991112/UBa: # Heinz shall not be blamed if THIS script fails, so it has to be # echoed that this IS NOT the original version # echo -e "\nLogical Volume Manager 0.7 by Heinz Mauelshagen 01/07/1999\n" echo -e "$cmd -- (hack warning: this script is modified by ulf@twc.de)\n" echo -e "$cmd -- this script creates a LVM initial ram disk in $INITRD\n" # # 19991112/UBa: # I wanted not to use a ramdisk to create initrd, so I changed this # stuff to do it on a file. # Additionally the original script used -N 4096 option of mke2fs to set # the number of inodes. This option is not understood by mke2fs of # Debian-2.1, so using -i 2048 on a 8192 blocks filesystem should do # the same... # echo "$cmd -- making a file of $INITRDSIZE blocks in $DEVRAM" dd if=/dev/zero of=$DEVRAM bs=1024 count=$INITRDSIZE >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR making file for initrd image\n" exit 1 fi echo "$cmd -- making filesystem on $DEVRAM" echo y | mke2fs -m 0 -i 2048 $DEVRAM $INITRDSIZE >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR making filesystem on $DEVRAM\n" exit 1 fi mkdir -p $TMP/ram >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR making $TMP/ram\n" exit 1 fi # # 19991112/UBa: # changed to mount the image via loop # echo "$cmd -- mounting ram filesystem" mount -o loop -t ext2 $DEVRAM $TMP/ram >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR mounting $DEVRAM on $TMP/ram\n" exit 1 fi # # 19991112/UBa: # added mkdir proc, as I need proc to be mounted for scanning for # vg00/root in /proc/partitions, calculate major*256+minor of it and # echo this value to /proc/sys/kernel/ral-root-dev. # cd $TMP/ram [ ! -d etc ] && mkdir etc [ ! -d proc ] && mkdir proc # # create new conf.modules to avoid kmod complaining about nonexsisting modules. # echo "$cmd -- creating etc/conf.modules" i=0 while [ $i -lt 256 ]; do echo "alias block-major-$i off" echo "alias char-major-$i off" let i=i+1 done > etc/conf.modules # # 19991113/UBa: # I got this one as module but not in this initrd... # aliasing ide-cd to off suppresses the lines complaining a missing # ide-cd module. The lines complaining no driver being present still # remain. # echo "alias ide-cd off" >> etc/conf.modules # to ensure, that modprobe doesn complain about timestamps echo "$cmd -- creating new modules.dep" depmod -a >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR depmod\n" exit 1 fi # copy necessary files to ram disk echo "$cmd -- copying files to ram disk" find $INITRDFILES|cpio -pdm $TMP/ram >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR cpio to ram disk\n" exit 1 fi # figure out which actual shared libraries we need in our initrd # # 19991112/UBa: # @@@TODO: # this is incomplete now, as I added some binaries. # ...but it still generates a working initrd, so I put my # hands on this stuff later. # Plan: ldd on bin/* sbin/* or file on all files and ldd on # those which could need libraries (execs and(?) libs)... # echo "$cmd -- figuring out shared libraries" SHLIBS=`ldd sbin/vg* bin/sh|awk '{if(/=>/){print $3}}'|sort -u 2>/dev/null` if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR figuring out needed shared libraries\n" exit 1 fi echo "$cmd -- copying shared libraries to ram disk" find $SHLIBS|cpio -Lpdm $TMP/ram >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR copying needed shared libraries to ram disk\n" exit 1 fi echo "$cmd -- creating linuxrc" create_linuxrc >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR creating linuxrc\n" exit 1 fi echo "$cmd -- creating etc/fstab" create_fstab >/dev/null 2>&1 if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR creating etc/fstab\n" exit 1 fi cd / echo "$cmd -- ummounting ram disk" umount $DEVRAM if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR umounting $DEVRAM\n" exit 1 fi # # 19991114/UBa: # cleanup # echo "$cmd -- removing temporary mount point" rm -rf $TMP if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR removing temporary mount point $TMP\n" exit 1 fi # # 19991114/UBa: # added reminder to manually put the crated initrd to where it is needed. # echo "$cmd -- creating compressed initrd in $INITRD" echo "$cmd -- uncompressed $DEVRAM will NOT automagically be removed" gzip -9 < $DEVRAM > $INITRD 2>/dev/null if [ $? -ne 0 ]; then echo -e "$cmd -- ERROR creating $INITRD\n" exit 1 else echo "$cmd -- sucessfully created $INITRD" echo "$cmd -- this image is NOT automagically activated." echo "$cmd -- $INITRD sure is not the path where your bootloader" echo "$cmd -- expects it." fi