08d94448 |
#! /bin/bash |
f4d17450 |
#################################################
# Title: mk-install-iso #
# Date: 2014-11-26 #
# Version: 1.0 #
# Author: dthaluru@vmware.com #
# Options: #
################################################# |
ada2a971 |
# Overview
# Generates a photon iso
# End |
f4d17450 |
#
|
2f46569e |
set +x # disable hashall |
ada2a971 |
source config.inc # configuration parameters
source function.inc # commonn functions |
8f19be8a |
PRGNAME=${0##*/} # script name minus the path |
ada2a971 |
LOGFILE=/var/log/"${PRGNAME}-${LOGFILE}" # set log file name |
f4d17450 |
# Grab the name of the iso file
if [ $# -lt 2 ] |
85b82155 |
then
echo "Usage : " $0 " <output-iso-with-path> <rpms-path> <pkg-list-path>"
exit 1 |
f4d17450 |
fi
ISO_OUTPUT_NAME=$1 |
85b82155 |
RPMS_PATH=$2
PACKAGE_LIST_FILE=$3 |
4d6a578d |
RPM_LIST=$4 |
2f46569e |
STAGE_PATH=$5
ADDITIONAL_FILES_TO_COPY_FROM_STAGE=$6 |
07751fba |
LIVE_CD=$7 |
2cbd5a80 |
OUTPUT_DATA_PATH=$8 |
5d05cfcc |
PHOTON_COMMON_DIR=$(dirname "${PACKAGE_LIST_FILE}")
PACKAGE_LIST_FILE_BASE_NAME=$(basename "${PACKAGE_LIST_FILE}") |
f4d17450 |
#- Step 3 Setting up the boot loader |
b84da80d |
WORKINGDIR=${BUILDROOT}
BUILDROOT=${BUILDROOT}/photon-chroot |
f4d17450 |
|
8f19be8a |
run_command "cp isolinux to working directory: ${WORKINGDIR}" "cp -r BUILD_DVD/isolinux ${WORKINGDIR}/" "${LOGFILE}" |
80cad58a |
run_command "cp boot/grub2 to working directory: ${WORKINGDIR}" "cp -r BUILD_DVD/boot ${WORKINGDIR}/" "${LOGFILE}"
run_command "# 1" "mkdir ${WORKINGDIR}/boot/grub2/fonts/" "${LOGFILE}"
run_command "# 2" "cp boot/ascii.pf2 ${WORKINGDIR}/boot/grub2/fonts/" "${LOGFILE}"
run_command "# 3" "mkdir -p ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
run_command "# 4" "cp boot/splash.png ${WORKINGDIR}/boot/grub2/themes/photon/photon.png" "${LOGFILE}"
run_command "# 5" "cp boot/terminal_*.tga ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
run_command "# 6" "cp boot/theme.txt ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}" |
8f19be8a |
run_command "echo : ${WORKINGDIR}" "echo ${WORKINGDIR}" "${LOGFILE}" |
adde0296 |
cp BUILD_DVD/isolinux/splash.png ${BUILDROOT}/installer/boot/. |
a6e91563 |
mkdir -p ${BUILDROOT}/installer/EFI/BOOT |
0f1fdc4b |
cp EFI_$(uname -m)/BOOT/* ${BUILDROOT}/installer/EFI/BOOT/ |
dc75e58c |
|
08d94448 |
#Generate efiboot image
# efiboot is a fat16 image that has at least EFI/BOOT/bootx64.efi
# As a bootx64.efi we use shimx64.efi from shim-12
# # make VENDOR_CERT_FILE=<VMware cert> EFI_PATH=/usr/lib 'DEFAULT_LOADER=\\\\grubx64.efi' shimx64.efi
# # mv shimx64.efi bootx64.efi
# grubx64.efi is generated on Photon OS by using grub2-efi >= 2.02-7: |
9ad0d5b7 |
# # grub2-efi-mkimage -o grubx64.efi -p /boot/grub2 -O x86_64-efi fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efi_uga ls search search_label search_fs_uuid search_fs_file gfxterm gfxterm_background gfxterm_menu test all_video loadenv exfat ext2 udf halt gfxmenu png tga lsefi help linuxefi probe echo |
08d94448 |
# both bootx64.efi and grubx64.efi are signed with VMware key
EFI_IMAGE=boot/grub2/efiboot.img
EFI_FOLDER=`readlink -f ${STAGE_PATH}/efiboot`
dd if=/dev/zero of=${WORKINGDIR}/${EFI_IMAGE} bs=3K count=1024
mkdosfs ${WORKINGDIR}/${EFI_IMAGE}
mkdir $EFI_FOLDER
mount -o loop ${WORKINGDIR}/${EFI_IMAGE} $EFI_FOLDER |
0f1fdc4b |
mkdir $EFI_FOLDER/EFI
cp -r ./EFI_$(uname -m)/BOOT $EFI_FOLDER/EFI |
08d94448 |
ls -lR $EFI_FOLDER
umount $EFI_FOLDER
rm -rf $EFI_FOLDER
#mcopy -s -i ${WORKINGDIR}/${EFI_IMAGE} ./EFI '::/'
|
dc75e58c |
if [ "$LIVE_CD" = true ] ; then
mv ${WORKINGDIR}/isolinux/live-menu.cfg ${WORKINGDIR}/isolinux/menu.cfg
fi
|
4967065a |
cp sample_ks.cfg ${WORKINGDIR}/isolinux/ |
f4d17450 |
|
b84da80d |
find ${BUILDROOT} -name linux-[0-9]*.rpm | head -1 | xargs rpm2cpio | cpio -iv --to-stdout ./boot/vmlinuz* > ${WORKINGDIR}/isolinux/vmlinuz |
f4d17450 |
|
b84da80d |
rm -f ${BUILDROOT}/installer/*.pyc |
4967065a |
rm -rf ${BUILDROOT}/installer/BUILD_DVD |
182ad6e9 |
# Copy package list json files, dereference symlinks |
2cbd5a80 |
cp -rf -L $OUTPUT_DATA_PATH/*.json ${BUILDROOT}/installer/ |
f4d17450 |
#ID in the initrd.gz now is PHOTON_VMWARE_CD . This is how we recognize that the cd is actually ours. touch this file there. |
b84da80d |
touch ${WORKINGDIR}/PHOTON_VMWARE_CD |
f4d17450 |
# Step 4.5 Create necessary devices
mkfifo ${BUILDROOT}/dev/initctl
mknod ${BUILDROOT}/dev/ram0 b 1 0
mknod ${BUILDROOT}/dev/ram1 b 1 1
mknod ${BUILDROOT}/dev/ram2 b 1 2
mknod ${BUILDROOT}/dev/ram3 b 1 3
mknod ${BUILDROOT}/dev/sda b 8 0
#- Step 5 - Creating the boot script
mkdir -p ${BUILDROOT}/etc/systemd/scripts
# Step 6 create fstab
cp BUILD_DVD/fstab ${BUILDROOT}/etc/fstab
|
6860f77c |
mkdir -p ${BUILDROOT}/etc/yum.repos.d |
d5d0d5e8 |
cat >> ${BUILDROOT}/etc/yum.repos.d/photon-iso.repo << EOF |
6860f77c |
[photon-iso]
name=VMWare Photon Linux 1.0(x86_64)
baseurl=file:///mnt/cdrom/RPMS
gpgkey=file:///etc/pki/rpm-gpg/VMWARE-RPM-GPG-KEY
gpgcheck=1
enabled=1 |
d5d0d5e8 |
skip_if_unavailable=True |
6860f77c |
EOF
|
f4d17450 |
#- Step 7 - Create installer script |
07751fba |
if [ "$LIVE_CD" = false ] ; then |
f4d17450 |
|
d3de51b8 |
cat >> ${BUILDROOT}/bin/bootphotoninstaller << EOF |
f4d17450 |
#!/bin/bash |
b84da80d |
cd /installer |
a672bd24 |
[ \$(tty) == '/dev/tty1' ] && LANG=en_US.UTF-8 ./isoInstaller.py --json-file=$PACKAGE_LIST_FILE_BASE_NAME 2> /var/log/installer && shutdown -r now |
f4d17450 |
/bin/bash
EOF
chmod 755 ${BUILDROOT}/bin/bootphotoninstaller
|
07751fba |
fi
|
b84da80d |
cat >> ${BUILDROOT}/init << EOF
mount -t proc proc /proc
/lib/systemd/systemd
EOF
chmod 755 ${BUILDROOT}/init
|
f4d17450 |
#adding autologin to the root user |
f1897db0 |
# and set TERM=linux for installer
sed -i "s/ExecStart.*/ExecStart=-\/sbin\/agetty --autologin root --noclear %I linux/g" ${BUILDROOT}/lib/systemd/system/getty@.service |
f4d17450 |
|
07751fba |
#- Step 7 - Create installer script
if [ "$LIVE_CD" = false ] ; then
sed -i "s/root:.*/root:x:0:0:root:\/root:\/bin\/bootphotoninstaller/g" ${BUILDROOT}/etc/passwd
fi |
f4d17450 |
|
b84da80d |
mkdir -p ${BUILDROOT}/mnt/photon-root/photon-chroot
rm -rf ${BUILDROOT}/RPMS |
4d6a578d |
|
eccee406 |
run_command " echo ${RPMS_PATH}" "echo ${RPMS_PATH}" "${LOGFILE}" |
4d6a578d |
#cp -r ${RPMS_PATH} ${WORKINGDIR}/
(
cd ${RPMS_PATH}
mkdir ${WORKINGDIR}/RPMS
for rpm_name in $RPM_LIST; do |
eccee406 |
if [ -f "$rpm_name" ]; then
cp --parent $rpm_name ${WORKINGDIR}/RPMS/; |
5d05cfcc |
fi |
4d6a578d |
done
) |
f4d17450 |
|
2f46569e |
# Work in sub-shell using ( ... ) to come back to original folder.
(
cd $STAGE_PATH
for file_name in $ADDITIONAL_FILES_TO_COPY_FROM_STAGE; do
if [ -n "$file_name" ]; then
cp $file_name ${WORKINGDIR}/;
fi
done
)
|
f4d17450 |
#creating rpm repo in cd.. |
b84da80d |
createrepo --database ${WORKINGDIR}/RPMS |
f4d17450 |
|
4f7dcd46 |
repodatadir=${WORKINGDIR}/RPMS/repodata
if [ -d $repodatadir ]; then
pushd $repodatadir
metaDataFile=`find -type f -name "*primary.xml.gz"`
ln -sfv $metaDataFile primary.xml.gz
popd
fi
|
b84da80d |
rm -rf ${BUILDROOT}/LOGS |
f4d17450 |
|
07751fba |
if [ "$LIVE_CD" = false ] ; then
# Cleaning up
#Remove our rpm database as it fills up the ramdisk |
8f19be8a |
for filename in ${BUILDROOT}/usr/lib/*; do
#run_command " echo ${filename}" "echo ${filename}" "${LOGFILE}"
if [[ -f ${filename} ]]; then
file ${filename} | grep ELF >/dev/null 2>&1
#run_command " file ${filename}" "echo ${filename}" "${LOGFILE}"
if [[ $? -eq 0 ]]; then
run_command " strip ${filename}" "strip ${filename}" "${LOGFILE}"
fi;
fi;
done
#Remove our rpm database as it fills up the ramdisk
for filename in $(find ${BUILDROOT}/usr/lib/modules); do
#run_command " echo ${filename}" "echo ${filename}" "${LOGFILE}"
if [[ -f ${filename} ]]; then
file ${filename} | grep ELF >/dev/null 2>&1
#run_command " file ${filename}" "echo ${filename}" "${LOGFILE}"
if [[ $? -eq 0 ]]; then
run_command " strip ${filename}" "strip ${filename}" "${LOGFILE}"
fi;
fi;
done |
07751fba |
rm -rf ${BUILDROOT}/home/*
rm -rf ${BUILDROOT}/var/lib/rpm |
b2a012df |
|
07751fba |
# Remove the boot directory
rm -rf ${BUILDROOT}/boot |
b2a012df |
|
07751fba |
#Remove the include files.
rm -rf ${BUILDROOT}/usr/include |
b2a012df |
|
adde0296 |
rm ${BUILDROOT}/lib64/libmvec*
rm ${BUILDROOT}/usr/sbin/sln |
8f19be8a |
rm ${BUILDROOT}/usr/bin/oldfind
|
adde0296 |
rm ${BUILDROOT}/usr/bin/localedef
rm ${BUILDROOT}/usr/bin/systemd-nspawn
rm ${BUILDROOT}/usr/bin/systemd-analyze
rm -rf ${BUILDROOT}/usr/lib64/gconv |
8f19be8a |
rm ${BUILDROOT}/usr/bin/sqlite3
rm ${BUILDROOT}/usr/bin/bsdcpio
rm ${BUILDROOT}/usr/bin/bsdtar
rm ${BUILDROOT}/usr/bin/networkctl
rm ${BUILDROOT}/usr/bin/machinectl
rm ${BUILDROOT}/usr/bin/pkg-config
rm ${BUILDROOT}/usr/bin/openssl
rm ${BUILDROOT}/usr/bin/timedatectl
rm ${BUILDROOT}/usr/bin/localectl
rm ${BUILDROOT}/usr/bin/systemd-cgls
rm ${BUILDROOT}/usr/bin/systemd-inhibit
rm ${BUILDROOT}/usr/bin/systemd-studio-bridge
rm ${BUILDROOT}/usr/bin/iconv |
adde0296 |
rm -rf ${BUILDROOT}/usr/lib/python2.7/lib2to3
rm -rf ${BUILDROOT}/usr/lib/python2.7/lib-tk
rm -rf ${BUILDROOT}/usr/lib/python2.7/ensurepip
rm -rf ${BUILDROOT}/usr/lib/python2.7/distutils
rm -rf ${BUILDROOT}/usr/lib/python2.7/pydoc_data
rm -rf ${BUILDROOT}/usr/lib/python2.7/idlelib
rm -rf ${BUILDROOT}/usr/lib/python2.7/unittest
|
8f19be8a |
rm ${BUILDROOT}/usr/lib/librpmbuild.so*
rm ${BUILDROOT}/usr/lib/libdb_cxx*
rm ${BUILDROOT}/usr/lib/libnss_compat*
|
ada2a971 |
rm ${BUILDROOT}/usr/bin/grub2-*
rm ${BUILDROOT}/usr/lib/grub/i386-pc/*.module
rm ${BUILDROOT}/usr/lib/grub/x86_64-efi/*.module
for j in `ls ${BUILDROOT}/usr/sbin/grub2*`; do
bsname=$(basename "$j") |
94335728 |
if [ $bsname != 'grub2-install' ]; then |
ada2a971 |
rm $j
fi
done |
8f19be8a |
|
07751fba |
# TODO: mbassiouny, Find a clean way to do that
for i in `ls ${BUILDROOT}/usr/share/`; do |
7396fd40 |
if [ $i != 'terminfo' -a $i != 'cracklib' -a $i != 'grub' -a $i != 'factory' -a $i != 'dbus-1' ]; then |
ada2a971 |
rm -rf ${BUILDROOT}/usr/share/$i
fi |
07751fba |
done
fi |
b84da80d |
|
e4d5e715 |
# Set password max days to 99999 (disable aging)
chage -R ${BUILDROOT} -M 99999 root
|
b84da80d |
# Generate the intird |
f4d17450 |
pushd $BUILDROOT |
b84da80d |
(find . | cpio -o -H newc --quiet | gzip -9 ) > ${WORKINGDIR}/isolinux/initrd.img
popd
rm -rf $BUILDROOT
#Step 9 Generate the ISO!!!!
pushd $WORKINGDIR |
f4d17450 |
mkisofs -R -l -L -D -b isolinux/isolinux.bin -c isolinux/boot.cat \ |
ada2a971 |
-no-emul-boot -boot-load-size 4 -boot-info-table \ |
08d94448 |
-eltorito-alt-boot -e ${EFI_IMAGE} -no-emul-boot \ |
ada2a971 |
-V "PHOTON_$(date +%Y%m%d)" \
$WORKINGDIR >$ISO_OUTPUT_NAME |
f4d17450 |
popd |