forked from vmware/photon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmk-install-iso.sh
executable file
·300 lines (251 loc) · 10.4 KB
/
mk-install-iso.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
#! /bin/bash
#################################################
# Title: mk-install-iso #
# Date: 2014-11-26 #
# Version: 1.0 #
# Author: [email protected] #
# Options: #
#################################################
# Overview
# Generates a photon iso
# End
#
set +x # disable hashall
SCRIPT_PATH=$(dirname $(realpath -s $0))
source $SCRIPT_PATH/config.inc # configuration parameters
source $SCRIPT_PATH/function.inc # commonn functions
PRGNAME=${0##*/} # script name minus the path
LOGFILE=/var/log/"${PRGNAME}-${LOGFILE}" # set log file name
# Grab the name of the iso file
if [ $# -lt 2 ]
then
echo "Usage : " $0 " <output-iso-with-path> <rpms-path> <pkg-list-path>"
exit 1
fi
ISO_OUTPUT_NAME=$1
RPMS_PATH=$2
PACKAGE_LIST_FILE=$3
RPM_LIST=$4
STAGE_PATH=$5
ADDITIONAL_FILES_TO_COPY_FROM_STAGE=$6
OUTPUT_DATA_PATH=$7
PHOTON_COMMON_DIR=$(dirname "${PACKAGE_LIST_FILE}")
PACKAGE_LIST_FILE_BASE_NAME=$(basename "${PACKAGE_LIST_FILE}")
#- Step 3 Setting up the boot loader
WORKINGDIR=${BUILDROOT}
BUILDROOT=${BUILDROOT}/photon-chroot
run_command "cp isolinux to working directory: ${WORKINGDIR}" "cp -r $SCRIPT_PATH/BUILD_DVD/isolinux ${WORKINGDIR}/" "${LOGFILE}"
run_command "cp boot/grub2 to working directory: ${WORKINGDIR}" "cp -r $SCRIPT_PATH/BUILD_DVD/boot ${WORKINGDIR}/" "${LOGFILE}"
run_command "# 1" "mkdir ${WORKINGDIR}/boot/grub2/fonts/" "${LOGFILE}"
run_command "# 2" "cp $SCRIPT_PATH/boot/ascii.pf2 ${WORKINGDIR}/boot/grub2/fonts/" "${LOGFILE}"
run_command "# 3" "mkdir -p ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
run_command "# 4" "cp $SCRIPT_PATH/boot/splash.png ${WORKINGDIR}/boot/grub2/themes/photon/photon.png" "${LOGFILE}"
run_command "# 5" "cp $SCRIPT_PATH/boot/terminal_*.tga ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
run_command "# 6" "cp $SCRIPT_PATH/boot/theme.txt ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
run_command "echo : ${WORKINGDIR}" "echo ${WORKINGDIR}" "${LOGFILE}"
cp $SCRIPT_PATH/BUILD_DVD/isolinux/splash.png ${BUILDROOT}/installer/boot/.
mkdir -p ${BUILDROOT}/installer/EFI/BOOT
cp $SCRIPT_PATH/EFI_$(uname -m)/BOOT/* ${BUILDROOT}/installer/EFI/BOOT/
#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:
# # 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
# grubaa64.efi is generated on Photon OS by using grub2-efi >= 2.02-7:
#grub2-mkimage -o bootaa64.efi -p /boot/grub2 -O arm64-efi fat iso9660 part_gpt part_msdos normal boot linux configfile loopback chain efifwsetup efi_gop efinet 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 all_video probe echo
# 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
mkdir $EFI_FOLDER/EFI
mkdir ${WORKINGDIR}/EFI
cp -r $SCRIPT_PATH/EFI_$(uname -m)/BOOT $EFI_FOLDER/EFI/
cp -r $SCRIPT_PATH/EFI_$(uname -m)/BOOT ${WORKINGDIR}/EFI/
ls -lR $EFI_FOLDER
umount $EFI_FOLDER
rm -rf $EFI_FOLDER
#mcopy -s -i ${WORKINGDIR}/${EFI_IMAGE} ./EFI '::/'
cp $SCRIPT_PATH/sample_ks.cfg ${WORKINGDIR}/isolinux/
find ${BUILDROOT} -name linux-[0-9]*.rpm | head -1 | xargs rpm2cpio | cpio -iv --to-stdout ./boot/vmlinuz* > ${WORKINGDIR}/isolinux/vmlinuz
rm -f ${BUILDROOT}/installer/*.pyc
rm -rf ${BUILDROOT}/installer/BUILD_DVD
# Copy package list json files, dereference symlinks
cp -rf -L $OUTPUT_DATA_PATH/*.json ${BUILDROOT}/installer/
#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.
touch ${WORKINGDIR}/PHOTON_VMWARE_CD
# 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 $SCRIPT_PATH/BUILD_DVD/fstab ${BUILDROOT}/etc/fstab
mkdir -p ${BUILDROOT}/etc/yum.repos.d
cat >> ${BUILDROOT}/etc/yum.repos.d/photon-iso.repo << EOF
[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
skip_if_unavailable=True
EOF
#- Step 7 - Create installer script
cat >> ${BUILDROOT}/bin/bootphotoninstaller << EOF
#!/bin/bash
cd /installer
ACTIVE_CONSOLE="\$(< /sys/devices/virtual/tty/console/active)"
install() {
LANG=en_US.UTF-8 ./isoInstaller.py --json-file=$PACKAGE_LIST_FILE_BASE_NAME 2> /var/log/installer && shutdown -r now
}
try_run_installer() {
if [ "\$ACTIVE_CONSOLE" == "tty0" ]; then
[ "\$(tty)" == '/dev/tty1' ] && install
else
[ "\$(tty)" == "/dev/\$ACTIVE_CONSOLE" ] && install
fi
}
try_run_installer || exec /bin/bash
EOF
chmod 755 ${BUILDROOT}/bin/bootphotoninstaller
cat >> ${BUILDROOT}/init << EOF
mount -t proc proc /proc
/lib/systemd/systemd
EOF
chmod 755 ${BUILDROOT}/init
#adding autologin to the root user
# and set TERM=linux for installer
sed -i "s/ExecStart.*/ExecStart=-\/sbin\/agetty --autologin root --noclear %I linux/g" ${BUILDROOT}/lib/systemd/system/[email protected]
sed -i "s/ExecStart.*/ExecStart=-\/sbin\/agetty --autologin root --keep-baud 115200,38400,9600 %I screen/g" ${BUILDROOT}/lib/systemd/system/[email protected]
#- Step 7 - Create installer script
sed -i "s/root:.*/root:x:0:0:root:\/root:\/bin\/bootphotoninstaller/g" ${BUILDROOT}/etc/passwd
mkdir -p ${BUILDROOT}/mnt/photon-root/photon-chroot
rm -rf ${BUILDROOT}/RPMS
run_command " echo ${RPMS_PATH}" "echo ${RPMS_PATH}" "${LOGFILE}"
#cp -r ${RPMS_PATH} ${WORKINGDIR}/
(
cd ${RPMS_PATH}
mkdir ${WORKINGDIR}/RPMS
for rpm_name in $RPM_LIST; do
if [ -f "$rpm_name" ]; then
cp --parent $rpm_name ${WORKINGDIR}/RPMS/;
fi
done
)
# 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
)
#creating rpm repo in cd..
createrepo --database ${WORKINGDIR}/RPMS
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
rm -rf ${BUILDROOT}/LOGS
# Cleaning up
#Remove our rpm database as it fills up the ramdisk
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
rm -rf ${BUILDROOT}/home/*
rm -rf ${BUILDROOT}/var/lib/rpm
# Remove the boot directory
rm -rf ${BUILDROOT}/boot
#Remove the include files.
rm -rf ${BUILDROOT}/usr/include
rm ${BUILDROOT}/lib64/libmvec*
rm ${BUILDROOT}/usr/sbin/sln
rm ${BUILDROOT}/usr/bin/oldfind
rm ${BUILDROOT}/usr/bin/localedef
rm ${BUILDROOT}/usr/bin/systemd-nspawn
rm ${BUILDROOT}/usr/bin/systemd-analyze
rm -rf ${BUILDROOT}/usr/lib64/gconv
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
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
rm ${BUILDROOT}/usr/lib/librpmbuild.so*
rm ${BUILDROOT}/usr/lib/libdb_cxx*
rm ${BUILDROOT}/usr/lib/libnss_compat*
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")
if [ $bsname != 'grub2-install' ]; then
rm $j
fi
done
# TODO: mbassiouny, Find a clean way to do that
for i in `ls ${BUILDROOT}/usr/share/`; do
if [ $i != 'terminfo' -a $i != 'cracklib' -a $i != 'grub' -a $i != 'factory' -a $i != 'dbus-1' ]; then
rm -rf ${BUILDROOT}/usr/share/$i
fi
done
# Set password max days to 99999 (disable aging)
chroot ${BUILDROOT} /bin/bash -c "chage -M 99999 root"
# Generate the initrd
pushd $BUILDROOT
(find . | cpio -o -H newc --quiet | gzip -9 ) > ${WORKINGDIR}/isolinux/initrd.img
popd
rm -rf $BUILDROOT
#Step 9 Generate the ISO!!!!
pushd $WORKINGDIR
mkisofs -R -l -L -D -b isolinux/isolinux.bin -c isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-eltorito-alt-boot -e ${EFI_IMAGE} -no-emul-boot \
-V "PHOTON_$(date +%Y%m%d)" \
$WORKINGDIR >$ISO_OUTPUT_NAME
popd