001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045 print_usage () {
046 echo "Usage: $0 [X:|image] path/to/loader option path/to/modules..."
047 echo " where X: is a valid floppy drive on your computer"
048 echo " where image is any file name"
049 exit 1
050 }
051
052 grub_dirs_common="/usr/local/share/grub/i386-freebsd /usr/local/share/grub/i386-pc /usr/share/grub/i386-pc /usr/lib/grub/i386-pc /usr/local/grub /usr/share/grub/i386-redhat /usr/local/src/grub-0.5.94 $HOME/share/grub/i386-pc/"
053 sbin_grub_path="/usr/local/sbin /usr/sbin /sbin $HOME/sbin"
054
055 PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin
056 export PATH
057
058 MTOOLSRC=mtoolsrc
059 export MTOOLSRC
060
061
062 FLOPPY_DRIVE=A:
063 IMG_FNAME=fd.img
064
065
066
067
068 init_image () {
069 echo "Initialize disk image $IMG_FILE..."
070 if [ ! -f $IMG_FNAME ] ; then
071 dd if=/dev/zero of=$IMG_FNAME bs=18k count=80 1>/dev/null 2>&1
072 fi
073
074 rm -f $MTOOLSRC
075 echo "drive u: file=\"$IMG_FNAME\" 1.44M filter" > $MTOOLSRC
076
077 if mformat U: ; then : ; else
078 rm -f $MTOOLSRC
079 echo "drive u: file=\"$IMG_FNAME\" 1.44M" > $MTOOLSRC
080 if mformat U: ; then : ; else
081 rm -f $MTOOLSRC
082 echo "drive u: file=\"$IMG_FNAME\"" > $MTOOLSRC
083 mformat U:
084 fi
085 fi
086 }
087
088
089
090
091
092 init_floppy () {
093 echo "Formatting floppy..."
094 mformat $FLOPPY_DRIVE || exit 1
095 }
096
097
098 lookup_grub () {
099
100 for d in $grub_dirs_common ; do
101 if [ -d $d ] ; then
102 GRUBDIR=$d
103 break
104 fi
105 done
106
107
108 if [ ! -d "$GRUBDIR" ] ; then
109 GRUBDIR=`locate stage2 | head -1 | xargs dirname 2>/dev/null`
110 fi
111
112
113 for d in $sbin_grub_path ; do
114 if [ -x $d/grub ] ; then
115 SBIN_GRUB=$d/grub
116 break
117 fi
118 done
119
120 if [ -d "$GRUBDIR" -a -x "$SBIN_GRUB" ] ; then
121 echo "Found correct grub installation in $GRUBDIR"
122 echo "Found correct /sbin/grub at $SBIN_GRUB"
123 else
124 echo "Couldn't find a correct grub installation."
125 exit 1
126 fi
127 }
128
129
130
131
132
133 setup_disk () {
134 echo "Setup destination disk..."
135
136 mmd $1/boot
137 mmd $1/boot/grub
138
139 if [ -d $GRUBDIR/stage1 ] ; then
140 mcopy $GRUBDIR/stage1/stage1 $1/boot/grub/
141 mcopy $GRUBDIR/stage2/stage2 $1/boot/grub/
142 else
143 mcopy $GRUBDIR/stage1 $1/boot/grub/
144 mcopy $GRUBDIR/stage2 $1/boot/grub/
145 fi
146 mmd $1/system
147 mmd $1/modules
148
149 $SBIN_GRUB --batch <<EOT 1>/dev/null 2>/dev/null || exit 1
150 device (fd0) $IMG_FNAME
151 install (fd0)/boot/grub/stage1 (fd0) (fd0)/boot/grub/stage2 p (fd0)/boot/grub/menu.txt
152 quit
153 EOT
154 }
155
156
157
158
159
160
161
162
163 lookup_grub
164
165 dest="$1" ; shift
166 loader_fname="$1" ; shift
167 options="$1" ; shift
168 modules="$*"
169
170
171 case x$dest in
172 x*:)
173 drive=$dest
174 IMG_FNAME=$dest
175 FLOPPY_DRIVE=$dest
176 init_floppy
177 ;;
178 x*)
179 drive=U:
180 IMG_FNAME=$dest
181 init_image
182 ;;
183 esac
184
185
186 setup_disk $drive
187
188
189 mcopy -bo $loader_fname $drive/system/`basename $loader_fname`
190
191
192 rm -f menu.txt
193 cat <<EOF > menu.txt
194 timeout 0
195 default 0
196 title Simple OS
197 root (fd0)
198 kernel /system/`basename $loader_fname` $options
199 EOF
200
201
202 for f in $modules ; do
203 if [ ! -f $f ] ; then
204 echo "ERROR: module $f not correctly compiled in."
205 exit 1
206 fi
207 if ! mcopy -bo $f $drive/modules/`basename $f` ; then
208 echo "ERROR: module $f could not be transferred to floppy."
209 exit 1
210 fi
211 echo module /modules/`basename $f` >> menu.txt
212 done
213
214
215 mcopy -bo menu.txt $drive/boot/grub/