89360bd70da421818e48dddaa5db5a5f5b440220
[automated-distro-installer] / fai / config / basefiles / mk-basefile
1 #! /bin/bash
2 # mk-basefile, create basefiles for some distributions
3 #
4 # Thomas Lange, Uni Koeln, 2011-2018
5 # based on the Makefile implementation of Michael Goetze
6 #
7 # Usage example: mk-basefile -J STRETCH64
8 # This will create a STRETCH64.tar.xz basefile.
9
10 # Supported distributions (each i386/amd64):
11 # Debian GNU/Linux
12 # Ubuntu 14.04/16.04
13 # CentOS 5/6/7
14 # Scientific Linux Cern 5/6
15 #
16 # Packages you might want to install to use this command:
17 # debootstrap, rinse, xz-utils
18
19
20 # Define your local mirros here
21 # For the first stage, set the CentOS/SLC mirror in /etc/rinse/rinse.conf
22 MIRROR_DEBIAN=http://deb.debian.org/debian/
23 MIRROR_UBUNTU=http://mirror.netcologne.de/ubuntu/
24 MIRROR_TRISQUEL=http://mirror.fsf.org/trisquel/
25 MIRROR_CENTOS=http://mirror.netcologne.de/
26
27 EXCLUDE_SQUEEZE=isc-dhcp-client,isc-dhcp-common,info
28 EXCLUDE_WHEEZY=info
29 EXCLUDE_JESSIE=info
30 EXCLUDE_STRETCH=info
31 EXCLUDE_BUSTER=
32 EXCLUDE_SID=
33
34 EXCLUDE_BELENOS=dhcp3-client,dhcp3-common,info
35 EXCLUDE_TRUSTY=dhcp3-client,dhcp3-common,info
36 EXCLUDE_XENIAL=udhcpc,dibbler-client,info
37 EXCLUDE_FLIDAS=udhcpc,dibbler-client,info
38 EXCLUDE_BIONIC=udhcpc,dibbler-client,info
39
40 # here you can add packages, that are needed very early
41 INCLUDE_DEBIAN=
42
43
44 setarch() {
45
46 l32=
47 if [ X$1 = Xi386 ]; then
48 l32=linux32
49 fi
50 }
51
52 check() {
53
54 if [ `id -u` != 0 ]; then
55 echo "You must be root to create chroots."
56 exit 1
57 fi
58 mknod $xtmp/test-dev-null c 1 3
59 if [ $? -eq 1 ]; then
60 echo "Cannot create device files on $xtmp, aborting."
61 echo "Perhaps this directory is mounted with option nodev."
62 rm -rf $xtmp
63 exit 1
64 fi
65 echo test > $xtmp/test-dev-null
66 if [ $? -eq 1 ]; then
67 echo "Cannot create device files on $xtmp, aborting."
68 echo "Perhaps this directory is mounted with option nodev."
69 rm -rf $xtmp
70 exit 1
71 fi
72 rm -f $xtmp/test-dev-null
73 }
74
75
76 mkpost-centos() {
77
78 # set local mirror for rinse post script
79 [ -z "$MIRROR_CENTOS" ] && return
80 cat <<EOM > $xtmp/post
81 #! /bin/sh
82 mkdir -p $xtmp/etc/yum.repos.d/orig
83 cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig
84 perl -pi -e 's,mirrorlist=,#mirrorlist=,; s,#baseurl=http://mirror.centos.org,baseurl=$MIRROR_CENTOS,;' $xtmp/etc/yum.repos.d/CentOS-Base.repo
85 EOM
86 chmod 555 $xtmp/post
87 }
88
89
90 mkpost-slc() {
91
92 # set local mirror for rinse post script
93 ver=$1
94 [ -z "$MIRROR_SLC" ] && return
95 cat <<EOM > $xtmp/post
96 #! /bin/sh
97 mkdir -p $xtmp/etc/yum.repos.d/orig
98 cp -p $xtmp/etc/yum.repos.d/*.repo $xtmp/etc/yum.repos.d/orig
99 perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-os.repo
100 perl -pi -e 's,baseurl=http://linuxsoft.cern.ch,baseurl=$MIRROR_SLC,;' $xtmp/etc/yum.repos.d/slc$ver-updates.repo
101
102 EOM
103 chmod 555 $xtmp/post
104 }
105
106
107 cleanup-deb() {
108
109 if [[ $cmd ]]; then
110 if [[ -e $cmd ]]; then
111 cp "$cmd" $xtmp/tmp
112 chroot $xtmp "/tmp/$cmd"
113 else
114 chroot $xtmp $cmd
115 fi
116 fi
117 chroot $xtmp apt-get clean
118 rm -f $xtmp/etc/hostname $xtmp/etc/resolv.conf \
119 $xtmp/var/lib/apt/lists/*_* $xtmp/usr/bin/qemu-*-static \
120 $xtmp/etc/udev/rules.d/70-persistent-net.rules
121 > $xtmp/etc/machine-id
122 }
123
124
125 cleanup-rinse() {
126
127 # check if chroot works
128 echo "Installed packages in chroot:"
129 chroot $xtmp rpm -qa|sort
130 echo -n "CHROOT rpm -qa: "
131 chroot $xtmp rpm -qa|wc -l
132
133 rm -f $xtmp/etc/resolv.conf $xtmp/post
134 if [ -d $xtmp/etc/yum.repos.d/orig ]; then
135 mv $xtmp/etc/yum.repos.d/orig/* $xtmp/etc/yum.repos.d/
136 rm -rf $xtmp/etc/yum.repos.d/orig
137 fi
138 }
139
140
141 tarit() {
142
143 tar $attributes --one-file-system -C $xtmp -cf - . | $zip > $target.$ext
144 }
145
146
147 centos() {
148
149 local arch=$1
150 local vers=$2
151 local domain=$(domainname)
152
153 check
154 setarch $arch
155 mkpost-centos
156 $l32 rinse --directory $xtmp --distribution centos-$vers --arch $arch --before-post-install $xtmp/post
157 domainname $domain # workaround for #613377
158 cleanup-rinse
159 tarit
160 }
161
162
163 slc() {
164
165 local arch=$1
166 local vers=$2
167
168 check
169 setarch $arch
170 mkpost-slc $vers
171 $l32 rinse --directory $xtmp --distribution slc-$vers --arch $arch --before-post-install $xtmp/post
172 cleanup-rinse
173 tarit
174 }
175
176
177 debgeneric() {
178
179 local DIST=$1
180 shift
181 local mirror=$1
182 shift
183 local arch=$1
184
185 dist=${DIST%%[0-9][0-9]}
186 local exc="EXCLUDE_$dist"
187 dist=${dist,,}
188
189 check
190 if [ -n "$INCLUDE_DEBIAN" ]; then
191 local inc="--include=$INCLUDE_DEBIAN"
192 fi
193
194 if [ -n "$arch" ]; then
195 qemu-debootstrap --arch $arch --exclude=${!exc} $inc $dist $xtmp $mirror
196 target="${target}_${arch^^}"
197 else
198 if [[ $DIST =~ 64 ]]; then
199 arch=amd64
200 else
201 arch=i386
202 fi
203 debootstrap --arch $arch --exclude=${!exc} $dist $xtmp $mirror
204 fi
205 cleanup-deb
206 tarit
207 }
208
209 prtdists() {
210
211 echo "Available:
212
213 CENTOS5_32 CENTOS5_64
214 CENTOS6_32 CENTOS6_64
215 CENTOS7_32 CENTOS7_64
216 SLC5_32 SLC5_64
217 SLC6_32 SLC6_64
218 SLC7_64
219 TRUSTY32 TRUSTY64
220 XENIAL32 XENIAL64
221 BIONIC64
222 SQUEEZE32 SQUEEZE64
223 WHEEZY32 WHEEZY64
224 JESSIE32 JESSIE64
225 STRETCH32 STRETCH64
226 BUSTER32 BUSTER64
227 SID32 SID64
228 "
229 }
230
231 usage() {
232
233 cat <<EOF
234 mk-basefile, create minimal base files for a Linux distritubtion
235
236 Copyright (C) 2011-2018 by Thomas Lange
237
238 Usage: mk-basefile [OPTION] ... DISTRIBUTION
239
240 -s Show list of supported linux distributions
241 -f ARCH Build for foreign architecture ARCH.
242 -d DIR Use DIR for creating the temporary subtree structure.
243 -z Use gzip for compressing the tar file.
244 -J Use xz for compressing the tar file.
245 -k Keep the temporary subtree structure, do not remove it.
246 -x CMD Run CMD in chroot. If CMD exists as a file, copy it and run it.
247 Debian based only
248 -h Print help.
249
250 Usage example: mk-basefile -J STRETCH64
251 This will create a STRETCH64.tar.xz basefile.
252
253 EOF
254 exit 0
255 }
256
257 # main routine
258
259 ext=tar
260 zip=cat
261 attributes=
262 cleanup=1
263 attributes="--xattrs --selinux --acls"
264
265 while getopts ashzJd:kf:x: opt ; do
266 case "$opt" in
267 a) echo "$0: Warning. -a is ignored, because xtattrs, acls and selinux are always added." ;;
268 d) export TMPDIR=$OPTARG ;;
269 f) export ARCH=$OPTARG ;;
270 z) zip="gzip -9"; ext=tar.gz ;;
271 J) zip="xz -8" ext=tar.xz ;;
272 k) cleanup=0 ;;
273 h) usage ;;
274 s) prtdists ; exit 0;;
275 x) cmd="$OPTARG" ;;
276 ?) exit 3 ;; # error in option parsing
277 esac
278 done
279 shift $(($OPTIND - 1))
280
281 xtmp=$(mktemp --tmpdir -d basefiles.XXXXXXXX)
282 if [ $? -eq 1 ]; then
283 echo "mktemp failed. Aborting."
284 exit 2
285 fi
286 chmod 755 $xtmp
287
288 target=$1 # also the name of the output file
289
290 [ -z "$target" ] && usage
291 case "$target" in
292 CENTOS5_32) centos i386 5 ;;
293 CENTOS5_64) centos amd64 5 ;;
294 CENTOS6_32) centos i386 6 ;;
295 CENTOS6_64) centos amd64 6 ;;
296 CENTOS7_32) centos i386 7 ;;
297 CENTOS7_64) centos amd64 7 ;;
298 SLC5_32) slc i386 5 ;;
299 SLC5_64) slc amd64 5 ;;
300 SLC6_32) slc i386 6 ;;
301 SLC6_64) slc amd64 6 ;;
302 SLC7_64) slc amd64 7 ;;
303 BELENOS*|FLIDAS*)
304 debgeneric $target $MIRROR_TRISQUEL ;;
305 TRUSTY*|XENIAL*|BIONIC*)
306 debgeneric $target $MIRROR_UBUNTU ;;
307 SQUEEZE*|WHEEZY*|JESSIE*|STRETCH*|BUSTER*|SID*)
308 debgeneric $target $MIRROR_DEBIAN $ARCH;;
309 *) echo "Unknown distribution. Aborting."
310 prtdists
311 exit 99 ;;
312 esac
313
314 # cleanup
315 if [ $cleanup -eq 1 ]; then
316 rm -rf $xtmp
317 fi