Magellan Linux

Contents of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 712 - (show annotations) (download) (as text)
Thu Apr 10 20:50:31 2008 UTC (16 years ago) by niro
File MIME type: application/x-sh
File size: 9484 byte(s)
-added default eth0 file

1 #!/bin/bash
2
3 # some default settings - gets overidden with the profile config
4 CDPROFILE="$2"
5 [[ -z ${CDPROFILE} ]] && CDPROFILE="default"
6 LIVECDROOT="/mnt/MLIVECDBUILD/${CDPROFILE}"
7 CDCHROOTDIR="${LIVECDROOT}/chroot"
8 CDISONAME="livecd-${CDPROFILE}.iso"
9 CDISOROOT="${LIVECDROOT}/isoroot"
10 CDKERNELNAME="magelive"
11 CDHOSTNAME="livecd-${CDPROFILE}"
12 MAGERC="/etc/mage.rc"
13 MAGE_PROFILE="$(basename $(readlink /etc/mage-profile))"
14 #TOOLCHAIN=toolchain
15 BASESYSTEM=livecdsystem26
16 CDID="mlcd-$(date +%F-%k%M)"
17
18 # global profile pathes
19 PROFILES_DIR="/usr/lib/mlivecdbuild/profiles"
20 GLOBAL_PROFILE="${PROFILES_DIR}/global"
21
22 die() { echo "ERROR: $@"; exit 1; }
23
24 # get_profile $filename
25 get_profile()
26 {
27 local file="$1"
28
29 if [[ -z ${file} ]] || [[ ! -e ${PROFILES_DIR}/${CDPROFILE}/${file} ]]
30 then
31 echo "${GLOBAL_PROFILE}/${file}"
32 return 0
33 fi
34
35 echo "${PROFILES_DIR}/${CDPROFILE}/${file}"
36 }
37
38 bootstrap_system()
39 {
40 mage-bootstrap \
41 --root "${CDCHROOTDIR}" \
42 --magerc "${MAGERC}" \
43 --profile "${MAGE_PROFILE}" \
44 --toolchain "${TOOLCHAIN}" \
45 --basesystem "${BASESYSTEM}" \
46 || die "bootstrapping toolchain"
47 }
48
49 custom_services()
50 {
51 local cmd="$1"
52 local services="$2"
53
54 case ${cmd} in
55 add|del|default)
56 # add given services from profile
57 if [[ -n ${services} ]]
58 then
59 local i
60 for i in ${services}
61 do
62 MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}"
63 done
64 fi
65 ;;
66 *) die "custom_services: unkown command ${cmd}";;
67 esac
68 }
69
70 add_initrc()
71 {
72 local var="$1"
73
74 # sanity checks
75 [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given."
76 echo "${var}" >> ${CDCHROOTDIR}/.installrc || die "add_initrc() adding \$var"
77 }
78
79 custom_packages()
80 {
81 local cmd="$1"
82 local packages="$2"
83
84 case ${cmd} in
85 install|uninstall)
86 if [[ -n ${packages} ]]
87 then
88 :> ${CDCHROOTDIR}/.installrc
89
90 # respect proxies
91 [[ -n ${http_proxy} ]] && add_initrc "export http_proxy=${http_proxy}"
92 [[ -n ${ftp_proxy} ]] && add_initrc "export ftp_proxy=${ftp_proxy}"
93 [[ -n ${no_proxy} ]] && add_initrc "export no_proxy=${no_proxy}"
94
95 # do not auto-start any services!
96 add_initrc "export MAGE_BOOTSTRAP=true"
97
98 local i
99 for i in ${packages}
100 do
101 add_initrc "mage ${cmd} ${i}"
102 done
103 add_initrc "mage clean"
104
105 # now run the .installrc script
106 mount -t proc proc ${CDCHROOTDIR}/proc || die "mount proc"
107 mount -t sysfs sysfs ${CDCHROOTDIR}/sys || die "mount sys"
108 mount -o bind /dev ${CDCHROOTDIR}/dev || die "mount dev"
109 chroot ${CDCHROOTDIR} /bin/bash -i /.installrc || die "chr00ting"
110 umount ${CDCHROOTDIR}/dev || die "umount dev"
111 umount ${CDCHROOTDIR}/proc || die "umount proc"
112 umount ${CDCHROOTDIR}/sys || die "umount sys"
113 [ -f ${CDCHROOTDIR}/.installrc ] && rm ${CDCHROOTDIR}/.installrc
114 fi
115 ;;
116 *) die "custom_packages: unkown command ${cmd}";;
117 esac
118 }
119
120 read_config()
121 {
122 local file="$1"
123 local pkg
124
125 ( cat ${file}; echo ) | while read pkg
126 do
127 case "${pkg}" in
128 \#*|"") continue ;;
129 esac
130 echo "${pkg}"
131 done
132 }
133
134 prepare_iso()
135 {
136 echo Preparing LiveCD ISO Image ...
137
138 # fixes some issues with xfree/xorg xkb
139 if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]
140 then
141 rm ${CDCHROOTDIR}/etc/X11/xkb || die
142 mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die
143 ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die
144 fi
145
146 install -m 0644 $(get_profile inittab) ${CDCHROOTDIR}/etc/inittab || die
147 install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die
148 install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die
149 install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die
150 install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die
151 echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
152
153 echo Setting up services ...
154
155 # add hardware detection
156 MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
157
158 # del checkfs
159 MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
160
161 # add custom packages
162 [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"
163 [ -f $(get_profile add_packages) ] && custom_packages install "$(read_config $(get_profile add_packages))"
164
165 # del custom packages
166 [[ -n ${DEL_PACKAGES} ]] && custom_packages uninstall "${DEL_PACKAGES}"
167 [ -f $(get_profile del_packages) ] && custom_packages uninstall "$(read_config $(get_profile del_packages))"
168
169 # add given services from profile
170 [[ -n ${ADD_SERVICES} ]] && custom_services add "${ADD_SERVICES}"
171 [ -f $(get_profile add_services) ] && custom_services add "$(read_config $(get_profile add_services))"
172
173 # del given services from profile
174 [[ -n ${DEL_SERVICES} ]] && custom_services del "${DEL_SERVICES}"
175 [ -f $(get_profile del_services) ] && custom_services del "$(read_config $(get_profile del_services))"
176
177 # setup default runlevel
178 [[ -n ${DEFAULT_RUNLEVEL} ]] && custom_services default "${DEFAULT_RUNLEVEL}"
179
180 if [ -f $(get_profile prepare_custom) ]
181 then
182 echo Running custom user script ...
183 source $(get_profile prepare_custom) || die "running custom user script"
184 fi
185
186 echo Cleaning unwanted files ...
187 :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"
188 [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
189 }
190
191 generate_rootfs()
192 {
193 echo Generating squashfs compressed rootfs loopfile ...
194 mksquashfs ${CDCHROOTDIR} ${LIVECDROOT}/livecdrootfs.sqsh #>/dev/null 2>&1
195
196 echo Moving rootfs loopfile to isoroot ...
197 install -d ${CDISOROOT}
198 mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}
199 }
200
201 install_bootloader()
202 {
203 echo Installing Bootloader ...
204
205 # iso linux binary
206 install -d ${CDISOROOT}/isolinux
207 install /usr/lib/mkinitrd/isolinux.bin ${CDISOROOT}/isolinux || die
208
209 # kernel
210 local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"
211 install ${CDCHROOTDIR}/boot/${kimg} ${CDISOROOT}/isolinux/${CDKERNELNAME} || die
212
213 install -m 0644 $(get_profile isolinux.cfg) ${CDISOROOT}/isolinux || die
214 install -m 0644 $(get_profile boot.lss) ${CDISOROOT}/isolinux || die
215 install -m 0644 $(get_profile boot.msg) ${CDISOROOT}/isolinux || die
216 install -m 0644 $(get_profile help.msg) ${CDISOROOT}/isolinux || die
217
218 return 0
219 }
220
221 generate_initrd()
222 {
223 local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})"
224
225 echo Generating initrd image ...
226 echo '#!/bin/bash' > ${CHROOTSH} || die
227 echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
228 echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
229 echo 'mkinitrd-livecd -f --initramfs /initrd.gz ${kv}' >> ${CHROOTSH} || die
230 chmod +x ${CHROOTSH} || die
231 chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
232 [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die
233
234 # move initrd to isoroot
235 install -d ${CDISOROOT}/isolinux || die
236 mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die
237 }
238
239 generate_iso()
240 {
241 echo Generating ISO Image ...
242 install -d ${CDISOROOT}
243 pushd ${CDISOROOT} &&
244 mkisofs -rock \
245 -full-iso9660-filenames \
246 -allow-leading-dots \
247 -disable-deep-relocation \
248 -output ${LIVECDROOT}/${CDISONAME} \
249 -eltorito-boot isolinux/isolinux.bin \
250 -eltorito-catalog isolinux/boot.cat \
251 -no-emul-boot \
252 -boot-load-size 4 \
253 -boot-info-table \
254 -volid "${CDID}" \
255 ${CDISOROOT} #&> /dev/null
256 popd
257 }
258
259 generate_dvd()
260 {
261 echo Generating DVD Image ...
262 install -d ${CDISOROOT}
263 pushd ${CDISOROOT} &&
264 growisofs -dvd-compat \
265 -rock \
266 -full-iso9660-filenames \
267 -allow-leading-dots \
268 -disable-deep-relocation \
269 -output ${LIVECDROOT}/${CDISONAME} \
270 -eltorito-boot isolinux/isolinux.bin \
271 -eltorito-catalog isolinux/boot.cat \
272 -no-emul-boot \
273 -boot-load-size 4 \
274 -boot-info-table \
275 -volid "${CDID}" \
276 ${CDISOROOT} #&> /dev/null
277 popd
278 }
279
280 enter_livecd()
281 {
282 mount -t sysfs sysfs ${CDCHROOTDIR}/sys
283 mount -t proc proc ${CDCHROOTDIR}/proc
284 mount -o bind /dev ${CDCHROOTDIR}/dev
285
286 chroot ${CDCHROOTDIR} \
287 /usr/bin/env -i \
288 HOME=/root \
289 TERM=$TERM PS1='\u:\w\$ ' \
290 PATH=/bin:/usr/bin:/sbin:/usr/sbin \
291 http_proxy=${http_proxy} \
292 ftp_proxy=${ftp_proxy} \
293 no_proxy=${no_proxy} \
294 /bin/bash -i
295
296 umount ${CDCHROOTDIR}/dev
297 umount ${CDCHROOTDIR}/proc
298 umount ${CDCHROOTDIR}/sys
299 }
300
301 usage()
302 {
303 echo "Usage: $(basename $0) [command] [profile] ..."
304 echo
305 echo "Commands:"
306 echo " bootstrap - bootstraps the rootfs for the livecd"
307 echo " prepare - prepare the rootfs to run from a livecd"
308 echo " rootfs - generates the squashfs rootfs image"
309 echo " initrd - generates a livecd suitable initrd"
310 echo " bootloader - installs the bootloader"
311 echo " isogen - generate the final livecd iso image"
312 echo " dvdgen - same as isogen but creates a dvd-image"
313 echo " all - runs all tasks to get a livecd from zero"
314 echo " enter - enters the rootfs of a livecd"
315 echo
316 echo " for example '$(basename $0) all default'"
317 echo " creates a livecd using the default profile."
318 echo
319 }
320
321 # source profile config - overrides all other vars
322 [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
323
324 case $1 in
325 bootstrap) bootstrap_system;;
326 prepare) prepare_iso;;
327 rootfs) generate_rootfs;;
328 initrd) generate_initrd;;
329 bootloader) install_bootloader;;
330 isogen) generate_iso;;
331 dvdgen) generate_dvd;;
332 all)
333 bootstrap_system
334 prepare_iso
335 generate_rootfs
336 generate_initrd
337 install_bootloader
338 if [[ ${DEFINE_DVD} = 1 ]]
339 then
340 generate_dvd
341 else
342 generate_iso
343 fi
344 ;;
345 enter) enter_livecd ;;
346 *|'') usage;;
347 esac