Magellan Linux

Annotation of /trunk/mlivecdbuild/mlivecdbuild2.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1402 - (hide annotations) (download) (as text)
Sun Jun 5 02:31:52 2011 UTC (12 years, 11 months ago) by niro
File MIME type: application/x-sh
File size: 9157 byte(s)
-be multilib friendly
1 niro 346 #!/bin/bash
2    
3     # some default settings - gets overidden with the profile config
4 niro 360 CDPROFILE="$2"
5 niro 346 [[ -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 niro 1402 # 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 niro 346 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 niro 360 custom_services()
58     {
59     local cmd="$1"
60     local services="$2"
61    
62     case ${cmd} in
63 niro 471 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 niro 360 *) die "custom_services: unkown command ${cmd}";;
75     esac
76     }
77    
78     add_initrc()
79     {
80     local var="$1"
81    
82     # sanity checks
83 niro 473 [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given."
84 niro 360 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 niro 471 install|uninstall)
94     if [[ -n ${packages} ]]
95     then
96     :> ${CDCHROOTDIR}/.installrc
97 niro 472
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 niro 580 # do not auto-start any services!
104     add_initrc "export MAGE_BOOTSTRAP=true"
105 niro 863 add_initrc 'die() { if [ $? -eq 1 ]; then echo "ERROR: $@"; exit 1; fi; }'
106 niro 580
107 niro 471 local i
108     for i in ${packages}
109     do
110 niro 863 add_initrc "mage ${cmd} ${i} || die ${i}"
111 niro 471 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 niro 360 *) 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 niro 346 prepare_iso()
144     {
145     echo Preparing LiveCD ISO Image ...
146    
147     # fixes some issues with xfree/xorg xkb
148 niro 473 if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]]
149 niro 346 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 niro 712 install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die
160 niro 346 echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die
161    
162     echo Setting up services ...
163    
164 niro 978 # # add hardware detection
165     # MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect"
166 niro 346
167     # del checkfs
168     MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs"
169    
170 niro 360 # 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 niro 346 echo Cleaning unwanted files ...
196     :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab"
197 niro 360 [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history
198 niro 346 }
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 niro 1402 install ${ISOLINUX_BIN} ${CDISOROOT}/isolinux || die
217 niro 346
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 niro 609 mount -t sysfs sysfs ${CDCHROOTDIR}/sys
271 niro 346 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 niro 472 http_proxy=${http_proxy} \
280     ftp_proxy=${ftp_proxy} \
281     no_proxy=${no_proxy} \
282 niro 346 /bin/bash -i
283 niro 609
284     umount ${CDCHROOTDIR}/dev
285     umount ${CDCHROOTDIR}/proc
286     umount ${CDCHROOTDIR}/sys
287 niro 346 }
288    
289 niro 360 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 niro 472 echo " enter - enters the rootfs of a livecd"
302 niro 360 echo
303     echo " for example '$(basename $0) all default'"
304     echo " creates a livecd using the default profile."
305     echo
306     }
307    
308 niro 346 # source profile config - overrides all other vars
309     [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config
310    
311 niro 360 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 niro 713 generate_iso
325 niro 360 ;;
326 niro 472 enter) enter_livecd ;;
327 niro 360 *|'') usage;;
328     esac