#!/bin/bash -e chroot_run() { mount_pseudofs cp -L /etc/resolv.conf $LFS/etc/ chroot $LFS $@ retval=$? umount_pseudofs return $retval } mount_pseudofs() { mount --bind /dev $LFS/dev mount -t devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -t proc proc $LFS/proc mount -t sysfs sysfs $LFS/sys mount -t tmpfs tmpfs $LFS/run } umount_pseudofs() { unmount $LFS/dev/pts unmount $LFS/dev unmount $LFS/run unmount $LFS/proc unmount $LFS/sys } unmount() { while true; do mountpoint -q $1 || break umount $1 2>/dev/null done } interrupted() { die "Abort by user." } cleanup() { rm -fr $WDIR } die() { [ "$@" ] && printerror $@ umount_pseudofs cleanup exit 1 } printstep() { echo -e "\e[0;36m::\e[0m $*" } printerror() { echo -e "\e[0;31mERROR:\e[0m $*" } CWD=$PWD if [ -f $CWD/config ]; then source $CWD/config fi WDIR="$WORKDIR/iso" LABEL="LFSLIVECD" OUTPUT="lfs-livecd-$(date +"%Y%m%d").iso" FILEDIR="$CWD/files" MAKEFLAGS="${MAKEFLAGS:--j$(nproc)}" LFS="${LFS:-/mnt/lfs}" PKGDIR="${PKGDIR:-$CWD/pkg}" SRCDIR="${SRCDIR:-$CWD/src}" WORKDIR="${WORKDIR:-/tmp}" isolinux_files="chain.c32 isolinux.bin ldlinux.c32 libutil.c32 reboot.c32 menu.c32 libcom32.c32 poweroff.c32" rm -fr $WDIR mkdir -p $WDIR printstep "Preparing isolinux files..." mkdir -p $WDIR/{lfs,isolinux,boot} for file in $isolinux_files; do cp $LFS/usr/share/syslinux/$file $WDIR/isolinux || die "failed copying '$file'" done #cp isolinux/splash.png $WDIR/isolinux cp $FILEDIR/isolinux.cfg $WDIR/isolinux [ -d rootfs ] && cp -Ra rootfs $WDIR printstep "Make squash filesystem..." mksquashfs $LFS $WDIR/lfs/root.sfs \ -b 1048576 -comp xz -Xdict-size 100% \ -e $LFS/var/lib/pkg/src/* \ -e $LFS/var/lib/pkg/pkg/* \ -e $LFS/var/lib/pkg/work/* \ -e $LFS/tools/ \ -e $LFS/tmp/* 2>/dev/null || die "failed create squashed filesystem" printstep "Preparing kernel and initramfs..." cp $LFS/boot/vmlinuz-lfs $WDIR/boot/vmlinuz || die "failed copying kernel" cp files/livecd.hook $LFS/etc/mkinitramfs.d kernver=$(file $LFS/boot/vmlinuz-lfs | cut -d ' ' -f9) chroot_run mkinitramfs -k $kernver -a livecd -o /boot/initrd-live.img || die "failed create initramfs" mv $LFS/boot/initrd-live.img $WDIR/boot/initrd || die "failed copying initrd" printstep "Setup UEFI mode..." mkdir -p $WDIR/boot/{grub/{fonts,x86_64-efi},EFI} if [ -f $LFS/usr/share/grub/unicode.pf2 ];then cp $LFS/usr/share/grub/unicode.pf2 $WDIR/boot/grub/fonts fi if [ -f $WDIR/isolinux/splash.png ]; then cp $WDIR/isolinux/splash.png $WDIR/boot/grub/ fi echo "set prefix=/boot/grub" > $WDIR/boot/grub-early.cfg cp -a $LFS/usr/lib/grub/x86_64-efi/*.{mod,lst} $WDIR/boot/grub/x86_64-efi || die "Failed copying efi files" cp $FILEDIR/grub.cfg $WDIR/boot/grub/ grub-mkimage -c $WDIR/boot/grub-early.cfg -o $WDIR/boot/EFI/bootx64.efi -O x86_64-efi -p "" iso9660 normal search search_fs_file modprobe loop dd if=/dev/zero of=$WDIR/boot/efiboot.img count=4096 mkdosfs -n LFSLIVECD-UEFI $WDIR/boot/efiboot.img || die "Failed mkdosfs" mkdir -p $WDIR/boot/efiboot mount -o loop $WDIR/boot/efiboot.img $WDIR/boot/efiboot || die "Failed mount efiboot.img" mkdir -p $WDIR/boot/efiboot/EFI/boot cp $WDIR/boot/EFI/bootx64.efi $WDIR/boot/efiboot/EFI/boot umount $WDIR/boot/efiboot rm -fr $WDIR/boot/efiboot printstep "Making the iso..." rm -f $OUTPUT xorriso -as mkisofs \ -isohybrid-mbr $LFS/usr/share/syslinux/isohdpfx.bin \ -c isolinux/boot.cat \ -b isolinux/isolinux.bin \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -eltorito-alt-boot \ -e boot/efiboot.img \ -no-emul-boot \ -isohybrid-gpt-basdat \ -volid $LABEL \ -o $OUTPUT $WDIR || die "failed create iso" printstep "Cleaning up..." cleanup exit 0