This lists the contents of directories from my root and utility diskettes. These lists are provided as an example only of the files included to create a working system. I have added some explanatory notes where it seemed useful.
total 18
drwxr-xr-x 2 root root 1024 Jul 29 21:16 bin/
drwxr-xr-x 2 root root 9216 Jul 28 16:21 dev/
drwxr-xr-x 3 root root 1024 Jul 29 20:25 etc/
drwxr-xr-x 2 root root 1024 Jul 28 19:53 lib/
drwxr-xr-x 2 root root 1024 Jul 24 22:47 mnt/
drwxr-xr-x 2 root root 1024 Jul 24 22:47 proc/
drwxr-xr-x 2 root root 1024 Jul 28 19:07 sbin/
drwxr-xr-x 2 root root 1024 Jul 29 20:57 tmp/
drwxr-xr-x 4 root root 1024 Jul 29 21:35 usr/
drwxr-xr-x 3 root root 1024 Jul 28 19:52 var/
bin:
total 713
-rwxr-xr-x 1 root bin 7737 Jul 24 22:16 cat*
-rwxr-xr-x 1 root bin 9232 Jul 24 22:48 chmod*
-rwxr-xr-x 1 root bin 8156 Jul 24 22:48 chown*
-rwxr-xr-x 1 root bin 19652 Jul 24 22:48 cp*
-rwxr-xr-x 1 root root 8313 Jul 29 21:16 cut*
-rwxr-xr-x 1 root bin 12136 Jul 24 22:48 dd*
-rwxr-xr-x 1 root bin 9308 Jul 24 22:48 df*
-rwxr-xr-x 1 root root 9036 Jul 29 20:24 dircolors*
-rwxr-xr-x 1 root bin 9064 Jul 24 22:48 du*
-rwxr-x--- 1 root bin 69252 Jul 24 22:51 e2fsck*
-rwxr-xr-x 1 root bin 5361 Jul 24 22:48 echo*
-rwxr-xr-x 1 root bin 5696 Jul 24 22:16 hostname*
-rwxr-xr-x 1 root bin 6596 Jul 24 22:49 kill*
-rwxr-xr-x 1 root bin 10644 Jul 24 22:17 ln*
-rwxr-xr-x 1 root bin 13508 Jul 24 22:17 login*
-rwxr-xr-x 1 root bin 26976 Jul 24 22:17 ls*
-rwxr-xr-x 1 root bin 7416 Jul 24 22:49 mkdir*
-rwxr-x--- 1 root bin 34596 Jul 24 22:51 mke2fs*
-rwxr-xr-x 1 root bin 6712 Jul 24 22:49 mknod*
-rwxr-xr-x 1 root bin 20304 Jul 24 22:17 more*
-rwxr-xr-x 1 root bin 24704 Jul 24 22:17 mount*
-rwxr-xr-x 1 root bin 12464 Jul 24 22:17 mv*
-rwxr-xr-x 1 root bin 20829 Jul 24 22:50 ps*
-rwxr-xr-x 1 root bin 9424 Jul 24 22:50 rm*
-rwxr-xr-x 1 root bin 4344 Jul 24 22:50 rmdir*
-rwxr-xr-x 1 root root 299649 Jul 27 14:12 sh*
-rwxr-xr-x 1 root bin 9853 Jul 24 22:17 su*
-rwxr-xr-x 1 root bin 380 Jul 27 14:12 sync*
-rwxr-xr-x 1 root bin 13620 Jul 24 22:17 umount*
-rwxr-xr-x 1 root root 5013 Jul 29 20:03 uname*
dev:
total 0
lrwxrwxrwx 1 root root 10 Jul 24 22:34 cdrom -> /dev/sbpcd
crw--w--w- 1 root tty 4, 0 Jul 24 21:49 console
brw-rw---- 1 root floppy 2, 0 Apr 28 1995 fd0
lrwxrwxrwx 1 root root 4 Jul 24 22:34 ftape -> rft0
crw-rw-rw- 1 root sys 10, 2 Jul 18 1994 inportbm
crw-rw---- 1 root kmem 1, 2 Jul 28 16:21 kmem
crw-rw---- 1 root kmem 1, 1 Jul 18 1994 mem
lrwxrwxrwx 1 root root 4 Jul 24 22:34 modem -> cua0
lrwxrwxrwx 1 root root 4 Jul 24 22:34 mouse -> cua1
crw-rw-rw- 1 root sys 1, 3 Jul 18 1994 null
brw-rw---- 1 root disk 1, 1 Jul 18 1994 ram
crw-rw---- 1 root disk 27, 0 Jul 18 1994 rft0
brw-rw---- 1 root disk 25, 0 Jul 19 1994 sbpcd
*** I have only included devices for the SCSI partitions I use.
*** If you use IDE, then use /dev/hdxx instead.
brw-rw---- 1 root disk 8, 0 Apr 29 1995 sda
brw-rw---- 1 root disk 8, 6 Apr 29 1995 sda6
brw-rw---- 1 root disk 8, 7 Apr 29 1995 sda7
brw-rw---- 1 root disk 8, 8 Apr 29 1995 sda8
lrwxrwxrwx 1 root root 7 Jul 28 12:56 systty -> console
*** this link from systty to console is required
crw-rw-rw- 1 root tty 5, 0 Jul 18 1994 tty
crw--w--w- 1 root tty 4, 0 Jul 18 1994 tty0
crw--w---- 1 root tty 4, 1 Jul 24 22:33 tty1
crw--w---- 1 root tty 4, 2 Jul 24 22:34 tty2
crw--w--w- 1 root root 4, 3 Jul 24 21:49 tty3
crw--w--w- 1 root root 4, 4 Jul 24 21:49 tty4
crw--w--w- 1 root root 4, 5 Jul 24 21:49 tty5
crw--w--w- 1 root root 4, 6 Jul 24 21:49 tty6
crw-rw-rw- 1 root tty 4, 7 Jul 18 1994 tty7
crw-rw-rw- 1 root tty 4, 8 Jul 18 1994 tty8
crw-rw-rw- 1 root tty 4, 9 Jul 19 1994 tty9
crw-rw-rw- 1 root sys 1, 5 Jul 18 1994 zero
etc:
total 20
-rw-r--r-- 1 root root 2167 Jul 29 20:25 DIR_COLORS
-rw-r--r-- 1 root root 20 Jul 28 12:37 HOSTNAME
-rw-r--r-- 1 root root 109 Jul 24 22:57 fstab
-rw-r--r-- 1 root root 271 Jul 24 22:21 group
-rw-r--r-- 1 root root 2353 Jul 24 22:27 inittab
-rw-r--r-- 1 root root 0 Jul 29 21:02 issue
-rw-r--r-- 1 root root 2881 Jul 28 19:38 ld.so.cache
*** Lots of things get upset at boot time if ld.so.cache is missing, but
*** make sure that ldconfig is included and run from rc.x to
*** update it.
-rw-r--r-- 1 root root 12 Jul 24 22:22 motd
-rw-r--r-- 1 root root 606 Jul 28 19:25 passwd
-rw-r--r-- 1 root root 1065 Jul 24 22:21 profile
drwxr-xr-x 2 root root 1024 Jul 29 21:01 rc.d/
-rw-r--r-- 1 root root 18 Jul 24 22:21 shells
-rw-r--r-- 1 root root 774 Jul 28 13:43 termcap
-rw-r--r-- 1 root root 126 Jul 28 13:44 ttys
-rw-r--r-- 1 root root 0 Jul 24 22:47 utmp
etc/rc.d:
total 5
*** I didn't bother with shutdown scripts - everthing runs on a
*** ramdisk, so there's not much point shutting it down.
-rwxr-xr-x 1 root root 1158 Jul 24 22:23 rc.K*
-rwxr-xr-x 1 root root 1151 Jul 28 19:08 rc.M*
-rwxr-xr-x 1 root root 507 Jul 29 20:25 rc.S*
lib:
total 588
*** I have an ELF system, so I include the ELF loader ld-linux.so. if
*** you are still on a.out, then you need ld.so. Use the file command to
*** see which libraries you should include.
lrwxrwxrwx 1 root root 17 Jul 24 23:36 ld-linux.so.1 -> ld-linux.so.1.7.3*
-rwxr-xr-x 1 root root 20722 Aug 15 1995 ld-linux.so.1.7.3*
lrwxrwxrwx 1 root root 13 Jul 24 23:36 libc.so.5 -> libc.so.5.0.9*
-rwxr-xr-x 1 root root 562683 May 19 1995 libc.so.5.0.9*
*** Must include libtermcap
lrwxrwxrwx 1 root root 19 Jul 28 19:53 libtermcap.so.2 -> libtermcap.so.2.0.0*
-rwxr-xr-x 1 root root 11360 May 19 1995 libtermcap.so.2.0.0*
mnt:
total 0
proc:
total 0
sbin:
total 191
*** I use Slackware, which uses agetty. Many systems use getty.
*** Check your /etc/inittab to see which it uses. Note that you
*** need (a)getty and login to be able to start doing much.
-rwxr-xr-x 1 root bin 11309 Jul 24 22:54 agetty*
-rwxr-xr-x 1 root bin 5204 Jul 24 22:19 halt*
*** Must have this to boot
-rwxr-xr-x 1 root bin 20592 Jul 24 22:19 init*
-rwxr-xr-x 1 root root 86020 Jul 28 19:07 ldconfig*
-rwxr-xr-x 1 root bin 5329 Jul 27 14:10 mkswap*
-rwxr-xr-x 1 root root 5204 Jul 24 22:20 reboot*
-rwxr-xr-x 1 root bin 12340 Jul 24 22:20 shutdown*
-rwxr-xr-x 1 root root 5029 Jul 24 22:20 swapoff*
-rwxr-xr-x 1 root bin 5029 Jul 24 22:20 swapon*
-rwxr-xr-x 1 root root 20592 Jul 27 18:18 telinit*
-rwxr-xr-x 1 root root 7077 Jul 24 22:20 update*
tmp:
total 0
usr:
total 2
drwxr-xr-x 2 root root 1024 Jul 29 21:00 adm/
drwxr-xr-x 2 root root 1024 Jul 29 21:16 lib/
usr/adm:
total 0
usr/lib:
total 0
var:
total 1
*** Several things complained until I included this and
*** the /etc/rc.S code to initialise /var/run/utmp, but this
*** won't necessarily apply to your system.
drwxr-xr-x 2 root root 1024 Jul 28 19:52 run/
var/run:
total 0
total 579
-rwxr-xr-x 1 root root 42333 Jul 28 19:05 cpio*
-rwxr-xr-x 1 root root 103560 Jul 29 21:31 elvis*
-rwxr-xr-x 1 root root 56401 Jul 28 19:06 find*
-rw-r--r-- 1 root root 128254 Jul 28 19:03 ftape.o
-rwxr-xr-x 1 root root 64161 Jul 29 20:47 grep*
-rwxr-xr-x 1 root root 45309 Jul 29 20:48 gzip*
-rwxr-xr-x 1 root root 23560 Jul 28 19:04 insmod*
-rwxr-xr-x 1 root root 118 Jul 28 19:04 lsmod*
lrwxrwxrwx 1 root root 5 Jul 28 19:04 mt -> mt-st*
-rwxr-xr-x 1 root root 9573 Jul 28 19:03 mt-st*
lrwxrwxrwx 1 root root 6 Jul 28 19:05 rmmod -> insmod*
-rwxr-xr-x 1 root root 104085 Jul 28 19:05 tar*
lrwxrwxrwx 1 root root 5 Jul 29 21:35 vi -> elvis*
These shell scripts are provided as examples only. I use them on my system to create rescue diskettes. You may find it convenient to use them, but if so, read the instructions carefully - for example, if you specify the wrong swap device, you will find your root filesystem has been throroughly and permanently erased.... so just be darn sure you have it correctly configured before you use it!
The upside of the scripts are that they provide a quick way to get a rescue set together, by doing the following:
There are two shell scripts:
Both are currently configured to run in the parent directory of boot_disk and util_disk, each of which contains everything to be copied to it's diskette. Note that these shell scripts will *NOT* automatically set up and copy all the files for you - you work out which files are needed, set up the directories and copy the files to those directories. The shell scripts are samples which will copy the contents of those directories. Note that they are primitive shell scripts and are not meant for the novice user.
The scripts both contain configuration variables at the start which allow them to be easily configured to run anywhere. First, set up the model directories and copy all the required files into them. To see what directories and files are needed, have a look at the sample directory listings in the previous sections.
Check the configuration variables in the shell scripts and change them as required before running the scripts.
# mkroot: make a root disk - creates a root diskette
# by building a file system on it, then mounting it and
# copying required files from a model.
# Note: the model to copy from from must dirst be set up,
# then change the configuration variables below to suit
# your system.
#
# usage: mkroot [ -d swap | ram ]
# where swap means use $SWAPDEV swap device
# and ram means use $RAMDISKDEV ramdisk device
# Copyright (c) Graham Chapman 1996. All rights reserved.
# Permission is granted for this material to be freely
# used and distributed, provided the source is acknowledged.
# No warranty of any kind is provided. You use this material
# at your own risk.
# Configuration variables - set these to suit your system
#
#### set the device to use to build the root filesystem on.
#### ramdisk is safer - swap is ok only if you have plenty of
#### free memory. If linux can't swap then things get nasty.
USEDEVICE="ramdisk" # set to either "ramdisk" or "swap"
RAMDISKDEV="/dev/ram" # ramdisk device <==== CHANGE if using ramdisk
SWAPDEV="/dev/sda7" # swap device <==== CHANGE if using swap
FSBLOCKS=3072 # desired filesystem size in blocks
#
#### set name or directory where you have set up your rootdisk
#### model
ROOTDISKDIR="./root_disk" # name of root disk directory
MOUNTPOINT="/mnt" # temporary mount point for diskette
DISKETTEDEV="/dev/fd0" # device name of diskette drive
LOGFL="`pwd`/mkroot.log" # log filename
TEMPROOTFS="/tmp/mkrootfs.gz" # temp file for compressed filesystem
# End of Configuration variables
# Internal variables
ROOTDISKDEV=
case $USEDEVICE in
swap|ramdisk) :;;
*) echo "Invalid setting for USEDEVICE variable"
exit;;
esac
clear
echo " ***************** W A R N I N G ******************
Use this script with care. If you don't understand it, then
exit NOW!"
if [ "$USEDEVICE" = "swap" ]
then
ROOTDISKDEV=$SWAPDEV
echo -e "\nThis script will temporarily remove the swap file $SWAPDEV"
echo "and use the space to build a compressed root filesystem from"
echo "the files in the directory tree below $ROOTDISKDIR. To do this"
echo "safely you must have 8Mb or more of memory, and you should"
echo "switch to single user mode via 'init 1'."
echo -e "\nIf you have used a ramdisk since the last reboot, then"
echo "reboot NOW before using this script."
echo -e "\nIf the script fails, you may not have a swap partition. Run 'free'"
echo "and check the total size to see if it is correct. If the swap"
echo "partition $SWAPDEV is missing, do the following:"
echo " umount $MOUNTPOINT"
echo " mkswap $SWAPDEV"
echo " swapon $SWAPDEV"
echo "to restore the swap partition $SWAPDEV."
else
ROOTDISKDEV=$RAMDISKDEV
echo -e "\nThis script will use a ramdisk of $FSBLOCKS Kb. To do this safely"
echo "you must have at least 8Mb of memory. If you have only 8Mb you should"
echo "ensure nothing else is running on the machine."
echo -e "\nWhen the script is complete, the ramdisk will still be present, so"
echo "you should reboot to reclaim the memory allocated to the ramdisk."
fi
echo -e "
Do you want to continue (y/n)? \c"
read ans
if [ "$ans" != "Y" -a $ans != "y" ]
then
echo "not confirmed - aborting"
exit
fi
echo "Starting mkroot at `date`" > $LOGFL
if [ "$USEDEVICE" = "swap" ]
then
echo "Unmounting swap device $SWAPDEV" | tee -a $LOGFL
swapoff $SWAPDEV >> $LOGFL 2>&1
fi
echo "Zeroing device $ROOTDISKDEV" | tee -a $LOGFL
dd if=/dev/zero of=$ROOTDISKDEV bs=1024 count=$FSBLOCKS >> $LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "dd zeroing $ROOTDISKDEV failed" | tee -a $LOGFL
exit 1
fi
echo "Creating filesystem on device $ROOTDISKDEV" | tee -a $LOGFL
mke2fs -m0 $ROOTDISKDEV $FSBLOCKS >> $LOGFL 2>&1
echo "Mounting $ROOTDISKDEV filesystem at $MOUNTPOINT" | tee -a $LOGFL
mount -t ext2 $ROOTDISKDEV $MOUNTPOINT >> $LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "mount failed"
exit 1
fi
# copy the directories containing files
echo "Copying files from $ROOTDISKDIR to $MOUNTPOINT" | tee -a $LOGFL
currdir=`pwd`
cd $ROOTDISKDIR
find . -print | cpio -dpumv $MOUNTPOINT >> $LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "cpio step failed."
cd $currdir
exit 1
fi
cd $currdir
fssize=`du -sk $MOUNTPOINT|cut -d" " -f1`
echo "Uncompressed root filesystem size is $fssize Kb" | tee -a $LOGFL
echo "Unmounting filesystem from $ROOTDISKDEV" | tee -a $LOGFL
umount $MOUNTPOINT >> $LOGFL 2>&1
echo "Compressing filesystem from $ROOTDISKDEV into $TEMPROOTFS
This may take a few minutes..." | tee -a $LOGFL
# We don't bother with gzip -9 here - takes more than twice as long
# and saves less than 1% in space on my root disk...
dd if=$ROOTDISKDEV bs=1024 count=$FSBLOCKS 2>>$LOGFL | gzip -c > $TEMPROOTFS
fssize=`du -k $TEMPROOTFS|cut -d" " -f1`
echo "Compressed root filesystem size is $fssize Kb" | tee -a $LOGFL
echo -e "Insert diskette in $DISKETTEDEV and press any key
*** Warning: data on diskette will be overwritten!\c"
read ans
echo "Copying compressed filesystem from $TEMPROOTFS to $DISKETTEDEV" | tee -a $LOGFL
dd if=$TEMPROOTFS of=$DISKETTEDEV >>$LOGFL 2>&1
if [ $? -ne 0 ]
then
echo "copy step failed."
exit 1
fi
if [ "$USEDEVICE" = "swap" ]
then
echo "Reinitialising swap device $SWAPDEV" | tee -a $LOGFL
mkswap $SWAPDEV >> $LOGFL 2>&1
echo "Starting swapping to swap device $SWAPDEV" | tee -a $LOGFL
swapon $SWAPDEV >> $LOGFL 2>&1
fi
echo "Deleting $TEMPROOTFS" | tee -a $LOGFL
rm $TEMPROOTFS
echo "mkroot completed at `date`" >> $LOGFL
echo "Root diskette creation complete - please read log file $LOGFL"
# mkutil: make a utility diskette - creates a utility diskette
# by building a file system on it, then mounting it and
# copying required files from a model.
# Note: the model to copy from from must first be set up,
# then change the configuration variables below to suit
# your system.
# Copyright (c) Graham Chapman 1996. All rights reserved.
# Permission is granted for this material to be freely
# used and distributed, provided the source is acknowledged.
# No warranty of any kind is provided. You use this material
# at your own risk.
# Configuration variables...
UTILDISKDIR=./util_disk # name of directory containing model
MOUNTPOINT=/mnt # temporary mount point for diskette
DISKETTEDEV=/dev/fd0 # device name of diskette drive
echo $0: create utility diskette
echo Warning: data on diskette will be overwritten!
echo Insert diskette in $DISKETTEDEV and and press any key...
read anything
mke2fs $DISKETTEDEV
if [ $? -ne 0 ]
then
echo mke2fs failed
exit
fi
# Any file system type would do here
mount -t ext2 $DISKETTEDEV $MOUNTPOINT
if [ $? -ne 0 ]
then
echo mount failed
exit
fi
# copy the directories containing files
cp -dpr $UTILDISKDIR/* $MOUNTPOINT
umount $MOUNTPOINT
echo Utility diskette complete