Magellan Linux

Contents of /branches/mlivecdbuild-1_x_branch/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 464 - (show annotations) (download) (as text)
Sat Apr 14 15:23:27 2007 UTC (17 years ago) by niro
Original Path: trunk/mlivecdbuild/mlivecdbuild2.sh
File MIME type: application/x-sh
File size: 8785 byte(s)
-removed deprecated comments
-added dvd support

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) continue;;
56 *) die "custom_services: unkown command ${cmd}";;
57 esac
58
59 # add given services from profile
60 if [[ -n ${services} ]]
61 then
62 local i
63 for i in ${services}
64 do
65 MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}"
66 done
67 fi
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) continue;;
86 *) die "custom_packages: unkown command ${cmd}";;
87 esac
88
89 if [[ -n ${packages} ]]
90 then
91
92 :> ${CDCHROOTDIR}/.installrc
93 local i
94 for i in ${packages}
95 do
96 add_initrc "mage install ${i}"
97 done
98 add_initrc "mage clean"
99
100 # now run the .installrc script
101 mount -t proc proc ${CDCHROOTDIR}/proc || die "mount proc"
102 mount -t sysfs sysfs ${CDCHROOTDIR}/sys || die "mount sys"
103 mount -o bind /dev ${CDCHROOTDIR}/dev || die "mount dev"
104 chroot ${CDCHROOTDIR} /bin/bash -i /.installrc || die "chr00ting"
105 umount ${CDCHROOTDIR}/dev || die "umount dev"
106 umount ${CDCHROOTDIR}/proc || die "umount proc"
107 umount ${CDCHROOTDIR}/sys || die "umount sys"
108 [ -f ${CDCHROOTDIR}/.installrc ] && rm ${CDCHROOTDIR}/.installrc
109 fi
110 }
111
112 read_config()
113 {
114 local file="$1"
115 local pkg
116
117 ( cat ${file}; echo ) | while read pkg
118 do
119 case "${pkg}" in
120 \#*|"") continue ;;
121 esac
122 echo "${pkg}"
123 done
124 }
125
126 prepare_iso()
127 {
128 echo Preparing LiveCD ISO Image ...
129
130 # fixes some issues with xfree/xorg xkb
131 if [ -L "${CDCHROOTDIR}/etc/X11/xkb" -a -d "/usr/X11R6/lib/X11/xkb" ]
132 then
133 rm ${CDCHROOTDIR}/etc/X11/xkb || die
134 mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die
135 ln -s ../../../../etc/X11/xkb ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb || die
136 fi
137
138 install -m 0644 $(get_profile inittab) ${CDCHROOTDIR}/etc/inittab || die
139 install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die
140 install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die
141 install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die
142 echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
143
144 echo Setting up services ...
145
146 # add hardware detection
147 MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
148
149 # del checkfs
150 MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
151
152 # add custom packages
153 [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}"
154 [ -f $(get_profile add_packages) ] && custom_packages install "$(read_config $(get_profile add_packages))"
155
156 # del custom packages
157 [[ -n ${DEL_PACKAGES} ]] && custom_packages uninstall "${DEL_PACKAGES}"
158 [ -f $(get_profile del_packages) ] && custom_packages uninstall "$(read_config $(get_profile del_packages))"
159
160 # add given services from profile
161 [[ -n ${ADD_SERVICES} ]] && custom_services add "${ADD_SERVICES}"
162 [ -f $(get_profile add_services) ] && custom_services add "$(read_config $(get_profile add_services))"
163
164 # del given services from profile
165 [[ -n ${DEL_SERVICES} ]] && custom_services del "${DEL_SERVICES}"
166 [ -f $(get_profile del_services) ] && custom_services del "$(read_config $(get_profile del_services))"
167
168 # setup default runlevel
169 [[ -n ${DEFAULT_RUNLEVEL} ]] && custom_services default "${DEFAULT_RUNLEVEL}"
170
171 if [ -f $(get_profile prepare_custom) ]
172 then
173 echo Running custom user script ...
174 source $(get_profile prepare_custom) || die "running custom user script"
175 fi
176
177 echo Cleaning unwanted files ...
178 :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"
179 [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
180 }
181
182 generate_rootfs()
183 {
184 echo Generating squashfs compressed rootfs loopfile ...
185 mksquashfs ${CDCHROOTDIR} ${LIVECDROOT}/livecdrootfs.sqsh #>/dev/null 2>&1
186
187 echo Moving rootfs loopfile to isoroot ...
188 install -d ${CDISOROOT}
189 mv ${LIVECDROOT}/livecdrootfs.sqsh ${CDISOROOT}
190 }
191
192 install_bootloader()
193 {
194 echo Installing Bootloader ...
195
196 # iso linux binary
197 install -d ${CDISOROOT}/isolinux
198 install /usr/lib/mkinitrd/isolinux.bin ${CDISOROOT}/isolinux || die
199
200 # kernel
201 local kimg="$(basename $(readlink ${CDCHROOTDIR}/boot/vmlinuz))"
202 install ${CDCHROOTDIR}/boot/${kimg} ${CDISOROOT}/isolinux/${CDKERNELNAME} || die
203
204 install -m 0644 $(get_profile isolinux.cfg) ${CDISOROOT}/isolinux || die
205 install -m 0644 $(get_profile boot.lss) ${CDISOROOT}/isolinux || die
206 install -m 0644 $(get_profile boot.msg) ${CDISOROOT}/isolinux || die
207 install -m 0644 $(get_profile help.msg) ${CDISOROOT}/isolinux || die
208
209 return 0
210 }
211
212 generate_initrd()
213 {
214 local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})"
215
216 echo Generating initrd image ...
217 echo '#!/bin/bash' > ${CHROOTSH} || die
218 echo 'kv="$(readlink /boot/vmlinuz)"' >> ${CHROOTSH} || die
219 echo 'kv="${kv/kernel-}/"' >> ${CHROOTSH} || die
220 echo 'mkinitrd-livecd -f --initramfs /initrd.gz ${kv}' >> ${CHROOTSH} || die
221 chmod +x ${CHROOTSH} || die
222 chroot ${CDCHROOTDIR} /$(basename ${CHROOTSH}) || die
223 [[ -f ${CHROOTSH} ]] && rm ${CHROOTSH} || die
224
225 # move initrd to isoroot
226 install -d ${CDISOROOT}/isolinux || die
227 mv ${CDCHROOTDIR}/initrd.gz ${CDISOROOT}/isolinux || die
228 }
229
230 generate_iso()
231 {
232 echo Generating ISO Image ...
233 install -d ${CDISOROOT}
234 pushd ${CDISOROOT} &&
235 mkisofs -rock \
236 -full-iso9660-filenames \
237 -allow-leading-dots \
238 -disable-deep-relocation \
239 -output ${LIVECDROOT}/${CDISONAME} \
240 -eltorito-boot isolinux/isolinux.bin \
241 -eltorito-catalog isolinux/boot.cat \
242 -no-emul-boot \
243 -boot-load-size 4 \
244 -boot-info-table \
245 -volid "${CDID}" \
246 ${CDISOROOT} #&> /dev/null
247 popd
248 }
249
250 generate_dvd()
251 {
252 echo Generating DVD Image ...
253 install -d ${CDISOROOT}
254 pushd ${CDISOROOT} &&
255 growisofs -dvd-compat \
256 -rock \
257 -full-iso9660-filenames \
258 -allow-leading-dots \
259 -disable-deep-relocation \
260 -output ${LIVECDROOT}/${CDISONAME} \
261 -eltorito-boot isolinux/isolinux.bin \
262 -eltorito-catalog isolinux/boot.cat \
263 -no-emul-boot \
264 -boot-load-size 4 \
265 -boot-info-table \
266 -volid "${CDID}" \
267 ${CDISOROOT} #&> /dev/null
268 popd
269 }
270
271 enter_livecd()
272 {
273 mount -t sysfs sysfs ${CDCHROOTDIR}/proc
274 mount -t proc proc ${CDCHROOTDIR}/proc
275 mount -o bind /dev ${CDCHROOTDIR}/dev
276
277 chroot ${CDCHROOTDIR} \
278 /usr/bin/env -i \
279 HOME=/root \
280 TERM=$TERM PS1='\u:\w\$ ' \
281 PATH=/bin:/usr/bin:/sbin:/usr/sbin \
282 /bin/bash -i
283 }
284
285 usage()
286 {
287 echo "Usage: $(basename $0) [command] [profile] ..."
288 echo
289 echo "Commands:"
290 echo " bootstrap - bootstraps the rootfs for the livecd"
291 echo " prepare - prepare the rootfs to run from a livecd"
292 echo " rootfs - generates the squashfs rootfs image"
293 echo " initrd - generates a livecd suitable initrd"
294 echo " bootloader - installs the bootloader"
295 echo " isogen - generate the final livecd iso image"
296 echo " dvdgen - same as isogen but creates a dvd-image"
297 echo " all - runs all tasks to get a livecd from zero"
298 echo
299 echo " for example '$(basename $0) all default'"
300 echo " creates a livecd using the default profile."
301 echo
302 }
303
304 # source profile config - overrides all other vars
305 [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
306
307 case $1 in
308 bootstrap) bootstrap_system;;
309 prepare) prepare_iso;;
310 rootfs) generate_rootfs;;
311 initrd) generate_initrd;;
312 bootloader) install_bootloader;;
313 isogen) generate_iso;;
314 dvdgen) generate_dvd;;
315 all)
316 bootstrap_system
317 prepare_iso
318 generate_rootfs
319 generate_initrd
320 install_bootloader
321 if [[ ${DEFINE_DVD} = 1 ]]
322 then
323 generate_dvd
324 else
325 generate_iso
326 fi
327 ;;
328 *|'') usage;;
329 esac