Magellan Linux

Contents of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


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