forked from Stichting-MINIX-Research-Foundation/minix
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmkboot
More file actions
executable file
·150 lines (124 loc) · 3.12 KB
/
Copy pathmkboot
File metadata and controls
executable file
·150 lines (124 loc) · 3.12 KB
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
#!/bin/sh
#
# mkboot 2.0 - make boot floppy, make root device bootable, etc.
# Author: Kees J. Bot
usage() {
echo "Usage: $0 [bootable | hdboot [minix or image] | fdboot [device]]" >&2
exit 1
}
rotate_oldest() {
base_dir="$1"
set -- `ls -t "$base_dir"`
case $# in
0|1|2|3)
# Not much there, do not remove a thing.
;;
*)
# Remove the third-newest $hdboot_t in /boot/$hdboot_t, but
# only if there's an older one (which is kept).
echo "rm $root:$base_dir/$3"
rm -rf "$base_dir/$3"
esac
}
trap 'e=$?; rm -f /tmp/mkb.$$; exit $e' 0 2
mdec=/usr/mdec # bootstraps
# Check arguments.
case "$#:$1" in
1:bootable | 2:hdboot | [12]:fdboot )
action=$1 dev=$2 size=$3
;;
*) usage
esac
if [ "$1" = "hdboot" ]
then
if [ "$2" != "image" -a "$2" != "minix" ]
then usage
fi
hdboot_t="$2"
fi
# Get the device table.
FSTAB=/etc/fstab
touch $FSTAB
if grep -q "Poor man" $FSTAB
then . $FSTAB
else root="`awk <$FSTAB '{ if($2=="/") { print $1 } }'`"
fi
# The real root device may be the RAM disk.
realroot=`printroot -r`
# If it's an initial fstab, pretend root is real root
if [ "$root" = "/dev/ROOT" -o -z "$root" ]
then root=$realroot
fi
case $action in
bootable | hdboot)
# We need the root device.
if [ $realroot = $root ]
then
rootdir=
else
umount $root 2>/dev/null
mount $root /mnt || exit
rootdir=/mnt
fi
esac
case $action in
hdboot)
# Install a new image on the root device.
if [ -e $rootdir/boot/$hdboot_t -a ! -d $rootdir/boot/$hdboot_t ]
then
# /boot/$hdboot_t is not yet a directory! Fix it.
su root -c \
"exec mv $rootdir/boot/$hdboot_t /M"
install -d $rootdir/boot/$hdboot_t
su root -c \
"exec mv $rootdir/M $rootdir/boot/$hdboot_t/`uname -r`"
fi
sh tell_config OS_RELEASE . OS_VERSION >/tmp/mkb.$$
version=`sed 's/[" ]//g;/^$/d' </tmp/mkb.$$`
# Retrieve the git revision; this only succeeds
# if git is available, it's a git checkout, *and*
# there are no uncommitted changes.
if git diff --quiet 2>/dev/null
then gitrev="-`git describe --always`"
fi
revision=`cat revision 2>/dev/null`
if [ -z "$revision" ]
then rrevision=""
gitrev=""
else rrevision=r$revision
fi
oldrev=$revision
if [ -z "$revision" ]
then
revision=0
rrevision=""
else
revision=`expr $revision + 1`
rrevision=r$revision
fi
target="${version}${rrevision}${gitrev}"
rotate_oldest "$rootdir/boot/$hdboot_t"
# rotate system processes. We assume latest ones are in
# /boot/modules/.temp and we maintain /boot/modules/ by ourselves.
if [ "$hdboot_t" = "minix" ]
then
[ -d /boot/minix/.temp ] || exit 1
rm -rf /boot/minix/"$target"/
mv /boot/minix/.temp /boot/minix/"$target"
rm -f /boot/minix_latest
ln -s minix/"$target" /boot/minix_latest
else
# Install the new image.
echo "install $hdboot_t $root:/boot/$hdboot_t/$target"
install -o root -m 600 $hdboot_t $rootdir/boot/$hdboot_t/$target || exit 1
# Tell bootloader which image is newest
ln -f $rootdir/boot/$hdboot_t/$target $rootdir/boot/${hdboot_t}_latest
fi
# Save the revision number.
test "$revision" != "$oldrev" && echo $revision >revision
test $realroot != $root && umount $root
echo "Done."
;;
esac
sync
exit 0