#!/bin/bash set -e set -u TMP="${TMP:-/var/tmp}" DATE=$(date '+%Y-%m-%d-%H%M') DIST="${DIST:-bok}" REPO="${REPO:-http://apt.osdyson.org}" # We will search for usr archive on CD: USR_IMG=usr.img.$(echo $DATE | md5sum | cut -f1 -d ' ') ISONAME="${ISONAME:-dyson-${DIST}-${DATE}}.iso" ROOT="${TMP}/ROOT" BOOTARCH="${ROOT}/boot_archive" if [ -z "${ROOT}" ] || [ "${ROOT}" = / ]; then echo "WTF? Bad root: \`${ROOT}'" >&2 exit 1 fi rm -rf "${ROOT}"/* echo "Preparing base system (debootstrap)..." debootstrap \ --no-check-gpg \ --exclude=syslogd,gawk,aptitude \ --include=illumos-grub,illumos-kernel,mc,vim-nox,openssh-client,wget,bzip2,xz-utils,debootstrap,less \ "${DIST}" \ "${ROOT}" \ "${REPO}" # This stuff does not make sense for LiveCD: rm -rf "${ROOT}"/var/lib/dpkg/info rm -rf "${ROOT}"/var/lib/apt rm -rf "${ROOT}"/var/cache/* rm -rf "${ROOT}"/etc/cron.* rm -rf "${ROOT}"/var/log/* rm -rf "${ROOT}"/var/adm/* rm -rf "${ROOT}"/usr/share/doc/* devfsadm -r "${ROOT}" cat < $ROOT/boot/solaris/bootenv.rc setprop ata-dma-enabled 1 setprop atapi-cd-dma-enabled 1 setprop console 'text' setprop keyboard-layout US-English setprop lba-access-ok 1 setprop prealloc-chunk-size 0x2000 setprop ttya-ignore-cd true setprop ttya-mode 9600,8,n,1,- setprop ttya-rts-dtr-off false setprop ttyb-ignore-cd true setprop ttyb-mode 9600,8,n,1,- setprop ttyb-rts-dtr-off false BOOTENV cat < $ROOT/etc/vfstab #device device mount FS fsck mount mount #to mount to fsck point type pass at boot options # /devices/ramdisk:a - / ufs 1 no rw,nologging VFSTAB echo 'export LD_NOVERSION=1' >> $ROOT/etc/profile echo "dyson-${DIST}-live" > "${ROOT}/etc/nodename" touch "${ROOT}/etc/hostname.e1000g0" touch "${ROOT}/etc/dhcp.e1000g0" # Set root password (just "root"): echo 'root:root' | chpasswd -R "$ROOT" # See http://osdyson.org/issues/107 stty -F /dev/syscon -g > $ROOT/etc/ioctl.syscon # Script to find and mount usr.lzma: sed "s/USR_IMG/$USR_IMG/" "find-usr" > "${ROOT}/lib/svc/method/find-usr" chmod +x "${ROOT}/lib/svc/method/find-usr" sed -i '/readvfstab "\/usr"/i /lib/svc/method/find-usr >/dev/msglog 2>&1' \ "${ROOT}/lib/svc/method/fs-root" # WE DON"T NEED BOOTARCHIVE ON LIVECD. # Thank you! sed -i '/if \[ -f "${UPDATEFILE}" \]; then/ i exit $SMF_EXIT_OK' \ "${ROOT}/lib/svc/method/fs-usr" dummy_prog='#!/sbin/sh exit 0 ' echo "$dummy_prog" > "${ROOT}/lib/svc/method/boot-archive" echo "$dummy_prog" > "${ROOT}/lib/svc/method/boot-archive-update" echo "Importing manifests..." rm "${ROOT}/lib/svc/manifest/system/early-manifest-import.xml" # bash or ksh, please: bash "${ROOT}/lib/svc/method/manifest-import" \ -f "${ROOT}/etc/svc/repository.db" \ -d "${ROOT}/lib/svc/manifest" # Thank you! Bye-bye! echo "$dummy_prog" > "${ROOT}/lib/svc/method/manifest-import" mkdir -p "${BOOTARCH}" mkdir -p "${BOOTARCH}/usr" mkdir -p "${BOOTARCH}/cdrom" ( cd "${ROOT}" march=`dpkg-architecture -qDEB_HOST_MULTIARCH` mkdir -p lib/$march for lib in \ libfmevent \ liblzma \ libsunavl \ libxml2 \ libz \ libzonecfg \ ; do mv -v -f usr/lib/$march/$lib.so.* lib/$march/ || \ mv -v -f usr/lib/$lib.so.* lib/$march/ done # List here files or directories which # should be *moved* to boot archive. # Caution: files from /usr require # special treating: see below. tar --remove-files -c -f - \ boot/solaris/devicedb/master \ boot/solaris/bootenv.rc \ bin \ dev \ devices \ etc \ home \ kernel \ lib \ media \ mnt \ opt \ proc \ root \ run \ sbin \ srv \ system \ tmp \ var \ | tar xf - -C "${BOOTARCH}" # same, but keep source tar -c -f - \ platform \ usr/bin/cat \ usr/bin/dash \ usr/bin/ls \ usr/bin/sh \ usr/lib/fs \ usr/lib/devfsadm \ usr/sbin \ | tar xf - -C "${BOOTARCH}" # We need only kernel itself for GRUB. # BTW, kernel should be in boot archive as well (WTF?) find platform -type f -a ! -name unix -delete ) find "${BOOTARCH}" > bootarch.list echo "Making boot archive..." sync; sync size=$(du -s -m "${BOOTARCH}" | cut -f1) ((size+=10)) # +10 MB of free space dd if=/dev/zero of="${ROOT}/boot/boot_archive" bs=1M count="$size" lofidev=$(lofiadm -a "${ROOT}/boot/boot_archive") rlofidev="${lofidev/lofi/rlofi}" yes | newfs -m 0 "${rlofidev}" mkdir -p "${ROOT}/boot/boot_archive.mount" mount "${lofidev}" "${ROOT}/boot/boot_archive.mount" mv "${BOOTARCH}"/* "${ROOT}/boot/boot_archive.mount"/ umount "${ROOT}/boot/boot_archive.mount" lofiadm -d "${lofidev}" rmdir "${BOOTARCH}" rmdir "${ROOT}/boot/boot_archive.mount" gzip -9 -f "${ROOT}/boot/boot_archive" echo "Making usr archive..." # usr will be mounted from usr.lzma: genisoimage \ -o "${ROOT}/${USR_IMG}" \ -N -l -R -U \ -allow-multidot \ -quiet -no-iso-translate -cache-inodes -d -D \ -V "usr" \ "${ROOT}/usr" rm -rf "${ROOT}/usr" lofiadm -C lzma "${ROOT}/${USR_IMG}" echo "Configuring GRUB..." cat < "${ROOT}/boot/grub/menu.lst" default=0 timeout=3 splashimage=/boot/grub/splash.xpm.gz foreground=ffffff background=215ECA title Dyson ($DIST), $DATE kernel /platform/i86pc/kernel/amd64/unix -k -m verbose module /boot/boot_archive.gz GRUB echo "Making final ${ISONAME}..." genisoimage \ -o "${ISONAME}" \ -b boot/grub/stage2_eltorito \ -c .catalog \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -N -l -R -U \ -allow-multidot \ -no-iso-translate \ -cache-inodes \ -d -D \ -V "${ISONAME}" \ "${ROOT}" ls -lh "${ISONAME}" exit 0