-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathbootdisk.bash
executable file
·216 lines (176 loc) · 5.85 KB
/
bootdisk.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
#!/bin/bash
# Script to generate a Linux bootdisk with asmutils binaries
#
# Copyright (C) 2001 Karsten Scheibler <[email protected]>
#
# $Id: bootdisk.bash,v 1.5 2002/08/17 08:14:35 konst Exp $
TMP_DIR=/tmp/bootdisk-$$
LOG_FILE="$TMP_DIR"/cmdlog
MOUNT_POINT="$TMP_DIR"/mnt
BOOTDISK_IMAGE="$TMP_DIR"/bootdisk
ROOT_IMAGE="$TMP_DIR"/rootraw
ROOT_IMAGE_SIZE=1024
function echo2
{
echo "$1" 1>&2 | cat >/dev/null
}
function echo2n
{
echo -n "$1" 1>&2 | cat >/dev/null
}
function error
{
echo2 "$1"
exit 1
}
function check
{
eval $@ 2>"$LOG_FILE"
if [ $? -ne 0 ]; then
echo2 "error"
sed -e 's/^/ /' "$LOG_FILE" 1>&2 | cat >/dev/null
exit 1
else
echo2 "ok"
fi
}
function check2
{
eval $@ >"$LOG_FILE" 2>&1
if [ $? -ne 0 ]; then
echo2 "error"
sed -e 's/^/ /' "$LOG_FILE" 1>&2 | cat >/dev/null
exit 1
else
echo2 "ok"
fi
}
function create_rc
{
cat <<EOF >"$1"
#!/bin/sh
export TERM=linux
export PATH=/bin:/sbin
export HOME=/tmp
export SHELL=/bin/sh
echo -e "\033[2J\033[3;1H\t\033[1;37mWelcome to the \033[34masmutils\033[37m bootdisk! [\033[32mhttp://linuxassembly.org\033[37m]\033[0;37m\n\n\n"
echo -e "mounting /proc..\c"
mount -t proc none /proc
&& echo -e "done"
hostname alpha
echo -e "configuring network..\c"
ifconfig lo 127.0.0.1
&& ifconfig eth0 192.168.0.1
&& echo -e "starting daemons..\c"
&& httpd /etc/httpd/ 80 /etc/httpd/404.html
&& ftpd /etc/ftpd.conf 20
&& echo -e "done\n"
EOF
chmod 555 "$1"
}
if [ `id -u` -ne 0 -o `uname` != "Linux" ]; then
error "this script must be run as root under Linux"
fi
if [ $# -ne 2 ]; then
echo2 "Usage: $0 kernelfile path_to_asmutils_binaries"
echo2
echo2 "Given kernel must support ramdisk, minix fs and floppy drive."
error "Resulting bootdisk is written to stdout."
fi
KERNEL_FILE="$1"
ASMUTILS_PATH="$2"
trap 'umount "$ROOT_IMAGE" >/dev/null 2>&1; rm -rf "$TMP_DIR"' 0
if ! mkdir "$TMP_DIR" 2>/dev/null; then
error "can't create '$TMP_DIR'"
fi
echo2n "creating root image mount point ... "
check2 'mkdir -m 755 "$MOUNT_POINT"'
echo2n "creating root image ... "
check2 'dd if=/dev/zero of="$ROOT_IMAGE" bs=1k count="$ROOT_IMAGE_SIZE"'
echo2n "creating root filesystem ... "
check2 'echo y | mkfs.minix "$ROOT_IMAGE"'
echo2n "mounting root image ... "
check2 'mount -o loop -t minix "$ROOT_IMAGE" "$MOUNT_POINT"'
echo2n "copying data to root filesystem ... "
check2 '
mkdir -m 755 "$MOUNT_POINT"/bin &&
mkdir -m 755 "$MOUNT_POINT"/dev &&
mkdir -m 755 "$MOUNT_POINT"/etc &&
mkdir -m 755 "$MOUNT_POINT"/proc &&
mkdir -m 777 "$MOUNT_POINT"/tmp &&
chmod 1777 "$MOUNT_POINT"/tmp &&
mkdir -m 755 "$MOUNT_POINT"/dev/pts &&
mknod -m 600 "$MOUNT_POINT"/dev/console c 4 0 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty c 5 0 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty0 c 4 0 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty1 c 4 1 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty2 c 4 2 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty3 c 4 3 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty4 c 4 4 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty5 c 4 5 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty6 c 4 6 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty7 c 4 7 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty8 c 4 8 &&
mknod -m 600 "$MOUNT_POINT"/dev/tty9 c 4 9 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs0 c 7 0 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs1 c 7 1 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs2 c 7 2 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs3 c 7 3 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs4 c 7 4 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs5 c 7 5 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs6 c 7 6 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs7 c 7 7 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs8 c 7 8 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcs9 c 7 9 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa0 c 7 128 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa1 c 7 129 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa2 c 7 130 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa3 c 7 131 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa4 c 7 132 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa5 c 7 133 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa6 c 7 134 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa7 c 7 135 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa8 c 7 136 &&
mknod -m 600 "$MOUNT_POINT"/dev/vcsa9 c 7 137 &&
mknod -m 600 "$MOUNT_POINT"/dev/mem c 1 1 &&
mknod -m 600 "$MOUNT_POINT"/dev/audio c 14 4 &&
mknod -m 600 "$MOUNT_POINT"/dev/dsp c 14 3 &&
mknod -m 600 "$MOUNT_POINT"/dev/fb0 c 29 0 &&
create_rc "$MOUNT_POINT/etc/rc" &&
echo "/dev/ram0 / minix rw 0 0" > "$MOUNT_POINT"/etc/mtab &&
( cd "$ASMUTILS_PATH"; ls -1 | while read FILE; do if [ -x "$FILE" ]; then
cp -a "$FILE" "$MOUNT_POINT"/bin/; fi; done;
chown root.root "$MOUNT_POINT"/bin/*; chmod 555 "$MOUNT_POINT"/bin/* )'
echo2n "copying kernel ... "
check2 'dd if="$KERNEL_FILE" of="$BOOTDISK_IMAGE" bs=1024'
echo2n "umounting root image ... "
check2 'umount "$ROOT_IMAGE"'
echo2n "compressing root image ... "
check2 'gzip -9 "$ROOT_IMAGE"'
set `ls -li $BOOTDISK_IMAGE`
let KERNEL_SIZE=$6/1024+1
echo2 "Kernelsize: $KERNEL_SIZE KB"
let RAMDISK_WORD=$KERNEL_SIZE+16384
echo2 "Ramdisk Flags: $RAMDISK_WORD"
set `ls -li $ROOT_IMAGE.gz`
let COMPRESSED_ROOT_IMAGE_SIZE=$6/1024+1
echo2 "compressed root image size: $COMPRESSED_ROOT_IMAGE_SIZE KB"
let ROOT_AND_KERNEL=$COMPRESSED_ROOT_IMAGE_SIZE+$KERNEL_SIZE
echo2 "compressed root image + kernel: $ROOT_AND_KERNEL KB"
if [ "$ROOT_AND_KERNEL" -le 1440 ]; then
echo2 "disk image fits on 1.44MB floppy disk ;-)"
else
error "disk image is too large for a 1.44MB floppy disk ;-O"
fi
echo2n "setting kernel root device ... "
check2 'rdev "$BOOTDISK_IMAGE" /dev/fd0'
echo2n "setting kernel root filesystem to rw ... "
check2 'rdev -R "$BOOTDISK_IMAGE" 0'
echo2n "setting kernel ramdisk word ... "
check2 'rdev -r "$BOOTDISK_IMAGE" "$RAMDISK_WORD"'
echo2n "setting kernel video mode ... "
check2 'rdev -v "$BOOTDISK_IMAGE" 768'
echo2n "appending root filesystem to kernel ... "
check2 'dd if="$ROOT_IMAGE".gz of="$BOOTDISK_IMAGE" bs=1024 seek="$KERNEL_SIZE"'
echo2n "outputting bootdisk ... "
check 'cat "$BOOTDISK_IMAGE"'