-
Notifications
You must be signed in to change notification settings - Fork 41
/
grml-live-remaster
executable file
·173 lines (140 loc) · 4.97 KB
/
grml-live-remaster
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
#!/bin/sh
# Filename: grml-live-remaster
# Purpose: remaster a grml from the live cd
# Authors: grml-team (grml.org),
# (c) Michael Schierl <schierlm@gmx.de>,
# (c) Michael Prokop <mika@grml.org>,
# (c) Thorsten Glaser <tg@mirbsd.org>
# Bug-Reports: see http://grml.org/bugs/
# License: This file is licensed under the GPL v2 or any later version.
################################################################################
# DISCLAIMER:
# this script currently lacks LOTS of error checking code... any help welcome...
################################################################################
# define function getfilesize before "set -e"
if stat --help >/dev/null 2>&1; then
getfilesize='stat -c %s' # GNU stat
else
getfilesize='stat -f %z' # BSD stat
fi
set -e # exit on any error
VERSION='0.0.3'
GRML_LIVE_EDITOR=${VISUAL:-${EDITOR:-vi}}
# source core functions {{{
if ! [ -r /etc/grml/lsb-functions ] || ! [ -r /etc/grml/script-functions ] ; then
echo "Error: could not read /etc/grml/lsb-functions and/or /etc/grml/script-functions." >&2
echo "Error: $0 can run only in Grml live session. Exiting." >&2
exit 1
fi
. /etc/grml/lsb-functions
. /etc/grml/script-functions
# }}}
if ! isgrmlcd ; then
echo "Error: $0 can run only in Grml live session. Exiting." >&2
exit 1
fi
# make sure we have what we need {{{
if check4progs mkisofs >/dev/null 2>&1 ; then
MKISO=mkisofs
fi
if check4progs genisoimage >/dev/null 2>&1 ; then
MKISO=genisoimage
fi
if [ -z "$MKISO" ] ; then
echo "Error: neither mkisofs nor genisoimage available. Exiting." >&2
exit 1
fi
check4progs stat || exit 1
# allow overriding via environment:
if [ -z "$MKSQUASHFS" ] ; then
if which mksquashfs >/dev/null 2>&1 ; then
MKSQUASHFS=mksquashfs
else
echo "Error: mksquashfs is not available. Exiting." >&2
exit 1
fi
fi
check4root || exit 1
# }}}
if [ -z "$1" ]; then
echo "$0 - version $VERSION
Usage: $0 destination.iso
destination.iso should point to a path that is on a hard disk,
you might want to mount some swap partitions or swap files
first, because grml-live-remaster will need a lot ot RAM.
Please report bugs and feature requests: http://grml.org/bugs/" >&2
exit 1
fi
if [ ! -d /remaster ]; then
mkdir -p /remaster/chroot /remaster/tmp /remaster/cdrom
mount -t tmpfs tmpfs /remaster/tmp
echo "#:# edit the following two lines to change the boot message" \
>/remaster/msg
echo "#:#" >>/remaster/msg
if [ -r /live/image/boot/isolinux/boot.msg ] ; then
sed 1,2d /live/image/boot/isolinux/boot.msg >>/remaster/msg
else
sed 1,2d /live/image/boot.msg >>/remaster/msg
fi
fi
SQUASHFS_FILE="$(find /live/image/live -name \*.squashfs | head -1)"
if ! grep -q "/remaster/cdrom squashfs" /proc/mounts ; then
mount -t squashfs "$SQUASHFS_FILE" /remaster/cdrom -o ro,loop
fi
if ! grep -q "aufs /remaster/chroot" /proc/mounts ; then
mount -t aufs aufs /remaster/chroot -o br:/remaster/tmp=rw:/remaster/cdrom=rr
fi
for i in dev proc root sys tmp; do
mount --bind /$i /remaster/chroot/$i
done
echo "Now edit the contents of the live CD in this chrooted shell:"
chroot /remaster/chroot
for i in dev proc root sys tmp; do
umount /remaster/chroot/$i
done
${GRML_LIVE_EDITOR} /remaster/msg
[ -d /remaster/iso ] || mkdir /remaster/iso
for i in /live/image/*; do
if [ ! $i = /live/image/live ]; then
cp -R $i /remaster/iso
fi
done
if [ -r /remaster/iso/boot/isolinux/boot.msg ] ; then
rm /remaster/iso/boot/isolinux/boot.msg
fi
# make sure we support usb sticks as well:
if [ -d /live/image/boot/isolinux ] ; then
BOOTSTUFF=/live/image/boot/isolinux
else
BOOTSTUFF=/live/image
fi
[ -d /remaster/iso/boot/isolinux ] || mkdir -p /remaster/iso/boot/isolinux
sed 3,4d "${BOOTSTUFF}"/boot.msg \
>/remaster/iso/boot/isolinux/boot.msg
sed 1,2d /remaster/msg >>/remaster/iso/boot/isolinux/boot.msg
mkdir /remaster/iso/live
$MKSQUASHFS /remaster/chroot /remaster/iso/live/"$(basename $SQUASHFS_FILE)"
umount /remaster/chroot /remaster/cdrom
if [ -f /remaster/iso/boot/isolinux/isolinux.bin ] ; then
ISOLINUX=boot/isolinux/isolinux.bin
ISOLINUX_BOOTCAT=boot/isolinux/boot.cat
else
ISOLINUX=isolinux.bin
ISOLINUX_BOOTCAT=boot.cat
fi
$MKISO -b $ISOLINUX -no-emul-boot -c $ISOLINUX_BOOTCAT \
-boot-info-table -boot-load-size 4 -no-pad \
-l -r -J -o "$1" /remaster/iso
# pad for partition table
siz=$($getfilesize "$1")
cyls=$((siz / 512 / 32 / 16 + 1)) # C=$cyls H=16 S=32 (= 256 KiB units)
siz=$((cyls * 16 * 32 * 512)) # size after padding
dd if=/dev/zero bs=1 count=1 seek=$((siz - 1)) of="$1" 2>/dev/null
rm -R /remaster/iso
# here is the place where we could apply bootgrub.mksh
echo ""
echo "ISO generation complete:"
ls --color -l "$1"
echo "If you want to customize your ISO, just call grml-live-remaster again."
## END OF FILE #################################################################
# vim: ai filetype=sh expandtab