-
-
Save vkanevska/fd624f708cde7d7c172a576b10bc6966 to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# create custom bootable iso for CentOS 7 with kickstart | |
if [ $# -lt 2 ] | |
then | |
echo "Usage1: $0 path2iso path2kickstart" | |
exit 1 | |
else | |
if [ ! -f $1 ] | |
then | |
echo "File $1 does not exist!" | |
exit 0 | |
elif [ ! -f $2 ] | |
then | |
echo "File $2 does not exist!" | |
exit 0 | |
else | |
INNAME="$1" | |
echo "Source file - $INNAME" | |
KSFILE="$2" | |
echo "Kickstart file - $KSFILE" | |
fi | |
fi | |
# original ISO file of CentOS 7 | |
ISO_ORIGINAL=$INNAME | |
# out file name | |
OUTNAME=$(basename "$INNAME" | cut -d. -f1)"-KS-UEFI".iso | |
# working directory | |
WORK=$PWD/WORK | |
# Delete possible previous results | |
rm -rf $WORK | |
# create a new working directory | |
echo "Create working directory - $WORK" | |
mkdir $WORK | |
# dir to mount original ISO - SRC | |
SRC=$WORK/SRC | |
# dir for customised ISO | |
DST=$WORK/DST | |
# Dir for mount EFI image | |
EFI=$WORK/EFI | |
# mount ISO to SRC dir | |
echo "Create $SRC" | |
mkdir $SRC | |
echo "Mount original $ISO_ORIGINAL to $SRC" | |
mount -o loop $ISO_ORIGINAL $SRC | |
# create dir for ISO customisation | |
echo "Create dir $DST for customisation" | |
mkdir $DST | |
# copy orginal files to destination dir | |
# use dot after SRC dir (SRC/.) to help copy hidden files also | |
cp -v -r $SRC/. $DST/ | |
echo "Umount original ISO $SRC" | |
umount $SRC | |
# create dir for EFI image | |
echo "Create dir for EFIBOOT image - $EFI" | |
mkdir $EFI | |
# change rights for rw | |
echo "Make EFIBOOT RW" | |
chmod 644 $DST/images/efiboot.img | |
echo "Mount EFIBOOT image to $EFI" | |
mount -o loop $DST/images/efiboot.img $EFI/ | |
# add boot menu grab.cfg for UEFI mode | |
cp -v $(dirname $0)/cfg/efi-boot-grub.cfg $EFI/EFI/BOOT/grub.cfg | |
# unmount image | |
echo "Unmount $EFI" | |
umount $EFI/ | |
# back RO rights | |
echo "Make EFIBOOT RO" | |
chmod 444 $DST/images/efiboot.img | |
# add boot menu grab.cfg for UEFI mode | |
# It is the second place where boot menu is exists for EFI. | |
# /images/efiboot.img/{grub.cfg} has the working menu | |
# /EFI/BOOT/grub.cfg just present (this case has to be discovered) | |
cp -v $(dirname $0)/cfg/efi-boot-grub.cfg $DST/EFI/BOOT/grub.cfg | |
# add boot menu with kickstart option to /isolinux (BIOS) | |
cp -v $(dirname $0)/cfg/isolinux.cfg $DST/isolinux/isolinux.cfg | |
# put kickstart file custom-ks.cfg to isolinux/ks.cfg | |
cp -v $KSFILE $DST/isolinux/ks.cfg | |
# create dir for custom scripts | |
mkdir -p $DST/extras/ansible/ | |
cp -v -r $(dirname $0)/../ansible/. $DST/extras/ansible/ | |
# copy custom rc.local | |
cp -v -r $(dirname $0)/cfg/rc.local $DST/extras/ | |
# copy extra RPM to Packages | |
echo "Copy custom RPM to $DST/Packages" | |
PACKAGES="$(dirname $0)/packages.txt" | |
while IFS='' read -r pname || [[ -n "$pname" ]]; do | |
cp -v $(dirname $0)/Packages/$pname $DST/Packages/ | |
done < "$PACKAGES" | |
# update RPM repository index | |
echo "Update repository index" | |
( | |
cd $DST/; | |
chmod u+w repodata/*; | |
createrepo -g repodata/*comps.xml . --update; | |
) | |
# create output directory | |
OUTPUT=$WORK/OUTPUT | |
mkdir $OUTPUT | |
( | |
echo "$PWD - Create custom ISO"; | |
cd $DST; | |
genisoimage \ | |
-V "CentOS 7 x86_64" \ | |
-A "CentOS 7 x86_64" \ | |
-o $OUTPUT/$OUTNAME \ | |
-joliet-long \ | |
-b isolinux/isolinux.bin \ | |
-c isolinux/boot.cat \ | |
-no-emul-boot \ | |
-boot-load-size 4 \ | |
-boot-info-table \ | |
-eltorito-alt-boot -e images/efiboot.img \ | |
-no-emul-boot \ | |
-R -J -v -T \ | |
$DST \ | |
> $WORK/out.log 2>&1 | |
) | |
echo "Isohybrid - make custom iso bootable" | |
sudo isohybrid --uefi $OUTPUT/$OUTNAME |
set default="0" | |
function load_video { | |
insmod efi_gop | |
insmod efi_uga | |
insmod video_bochs | |
insmod video_cirrus | |
insmod all_video | |
} | |
load_video | |
set gfxpayload=keep | |
insmod gzio | |
insmod part_gpt | |
insmod ext2 | |
set timeout=60 | |
### END /etc/grub.d/00_header ### | |
search --no-floppy --set=root -l 'CentOS 7 x86_64' | |
### BEGIN /etc/grub.d/10_linux ### | |
menuentry 'Install CentOS 7 KS' --class fedora --class gnu-linux --class gnu --class os { | |
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 inst.ks=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg text | |
initrdefi /images/pxeboot/initrd.img | |
} | |
menuentry 'Test this media & install CentOS 7' --class fedora --class gnu-linux --class gnu --class os { | |
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet | |
initrdefi /images/pxeboot/initrd.img | |
} | |
submenu 'Troubleshooting -->' { | |
menuentry 'Install CentOS 7 in basic graphics mode' --class fedora --class gnu-linux --class gnu --class os { | |
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet | |
initrdefi /images/pxeboot/initrd.img | |
} | |
menuentry 'Rescue a CentOS system' --class fedora --class gnu-linux --class gnu --class os { | |
linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet | |
initrdefi /images/pxeboot/initrd.img | |
} | |
} |
default vesamenu.c32 | |
timeout 600 | |
display boot.msg | |
# Clear the screen when exiting the menu, instead of leaving the menu displayed. | |
# For vesamenu, this means the graphical background is still displayed without | |
# the menu itself for as long as the screen remains in graphics mode. | |
menu clear | |
menu background splash.png | |
menu title CentOS 7 | |
menu vshift 8 | |
menu rows 18 | |
menu margin 8 | |
#menu hidden | |
menu helpmsgrow 15 | |
menu tabmsgrow 13 | |
# Border Area | |
menu color border * #00000000 #00000000 none | |
# Selected item | |
menu color sel 0 #ffffffff #00000000 none | |
# Title bar | |
menu color title 0 #ff7ba3d0 #00000000 none | |
# Press [Tab] message | |
menu color tabmsg 0 #ff3a6496 #00000000 none | |
# Unselected menu item | |
menu color unsel 0 #84b8ffff #00000000 none | |
# Selected hotkey | |
menu color hotsel 0 #84b8ffff #00000000 none | |
# Unselected hotkey | |
menu color hotkey 0 #ffffffff #00000000 none | |
# Help text | |
menu color help 0 #ffffffff #00000000 none | |
# A scrollbar of some type? Not sure. | |
menu color scrollbar 0 #ffffffff #ff355594 none | |
# Timeout msg | |
menu color timeout 0 #ffffffff #00000000 none | |
menu color timeout_msg 0 #ffffffff #00000000 none | |
# Command prompt text | |
menu color cmdmark 0 #84b8ffff #00000000 none | |
menu color cmdline 0 #ffffffff #00000000 none | |
# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message. | |
menu tabmsg Press Tab for full configuration options on menu items. | |
menu separator # insert an empty line | |
menu separator # insert an empty line | |
label linux | |
menu label ^Install CentOS 7 KS | |
menu default | |
kernel vmlinuz | |
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 inst.stage2=hd:LABEL=CentOS\x207\x20x86_64:/isolinux/ks.cfg text | |
label check | |
menu label Test this ^media & install CentOS 7 | |
kernel vmlinuz | |
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet | |
menu separator # insert an empty line | |
# utilities submenu | |
menu begin ^Troubleshooting | |
menu title Troubleshooting | |
label vesa | |
menu indent count 5 | |
menu label Install CentOS 7 in ^basic graphics mode | |
text help | |
Try this option out if you're having trouble installing | |
CentOS 7. | |
endtext | |
kernel vmlinuz | |
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 xdriver=vesa nomodeset quiet | |
label rescue | |
menu indent count 5 | |
menu label ^Rescue a CentOS system | |
text help | |
If the system will not boot, this lets you access files | |
and edit config files to try to get it booting again. | |
endtext | |
kernel vmlinuz | |
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rescue quiet | |
label memtest | |
menu label Run a ^memory test | |
text help | |
If your system is having issues, a problem with your | |
system's memory may be the cause. Use this utility to | |
see if the memory is working correctly. | |
endtext | |
kernel memtest | |
menu separator # insert an empty line | |
label local | |
menu label Boot from ^local drive | |
localboot 0xffff | |
menu separator # insert an empty line | |
menu separator # insert an empty line | |
label returntomain | |
menu label Return to ^main menu | |
menu exit | |
menu end |
#version=DEVEL | |
# System authorization information | |
auth --enableshadow --passalgo=sha512 | |
# Use CDROM installation media | |
cdrom | |
# Use text install | |
text | |
# Run the Setup Agent on first boot | |
firstboot --enable | |
ignoredisk --only-use=sdb,sdc | |
# Keyboard layouts | |
keyboard --vckeymap=us --xlayouts='us' | |
# System language | |
lang en_US.UTF-8 | |
# Network information | |
network --bootproto=dhcp --device=eno1 --noipv6 --activate | |
network --bootproto=dhcp --device=enp5s0 --onboot=off --noipv6 | |
network --hostname=localhost.localdomain | |
# Root password | |
rootpw --iscrypted $6$jlaU.DRbpb/lugun$JfnIkJadI.fFfd3WX9ktSLeRwerGgTiykdvVWS.jmSz1RakRS86Wpo1OL2fP2M0SkFCf0b3ki34Pmt3cYU6Ii0 | |
# System timezone | |
timezone America/New_York --isUtc | |
# System bootloader configuration | |
bootloader --location=mbr --boot-drive=sdb | |
# Partition clearing information | |
clearpart --all --initlabel --drives=sdb,sdc | |
# Disk partitioning information | |
part /boot --fstype="xfs" --size=500 | |
part pv.764 --fstype="lvmpv" --ondisk=sdb --size=476239 | |
part pv.770 --fstype="lvmpv" --ondisk=sdc --size=2861587 | |
part /boot/efi --fstype="efi" --size=200 --fsoptions="umask=0077,shortname=winnt" | |
volgroup centos00 --pesize=4096 pv.764 pv.770 | |
logvol /home --fstype="xfs" --grow --size=500 --name=home --vgname=centos00 | |
logvol / --fstype="xfs" --grow --maxsize=51200 --size=1024 --name=root --vgname=centos00 | |
logvol swap --fstype="swap" --size=32192 --name=swap --vgname=centos00 | |
%packages --nobase | |
ansible | |
%end | |
%post --nochroot | |
# redirect the output to the log file | |
exec >/mnt/sysimage/root/ks-post-anaconda-chroot.log 2>&1 | |
# show the output on the 7th console | |
tail -f /mnt/sysimage/root/ks-post-anaconda-chroot.log >/dev/tty7 & | |
# changing to VT 7 that we can see what's going on | |
/usr/bin/chvt 7 | |
export SRCDIR="/run/install/repo" | |
export DSTDIR="/mnt/sysimage" | |
cp -v -r $SRCDIR/extras/. $DSTDIR/root/ | |
find $DSTDIR/root/ -name "TRANS.TBL" -delete | |
mv -v $DSTDIR/etc/rc.d/rc.local $DSTDIR/etc/rc.d/rc.local-backup | |
mv -v $SRCDIR/extras/rc.local $DSTDIR/etc/rc.d/rc.local | |
chmod +x $DSTDIR/etc/rc.d/rc.local | |
echo "Ready to reboot!" | |
%end | |
%post | |
# redirect the output to the log file | |
exec >/root/ks-post-anaconda-chroot.log 2>&1 | |
# show the output on the 8th console | |
tail -f /root/ks-post-anaconda-chroot.log >/dev/tty8 & | |
# changing to VT 8 that we can see what's going on | |
/usr/bin/chvt 8 | |
mv -v /root/bin/custom-setup.service /usr/lib/systemd/system/custom-setup.service | |
systemctl enable custom-setup.service | |
echo "Ready to reboot!" | |
%end | |
%addon com_redhat_kdump --disable --reserve-mb='auto' | |
%end |
#!/bin/bash | |
# Put custom instructions in the script. Keep copy of previous rc.local in /etc/rc.d/rc.local-backup to replace after booting | |
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure | |
# that this script will be executed during boot. | |
/bin/ansible-playbook -i /root/ansible/localhost /root/ansible/bootstrap.yml -vvvv > /root/ansible-run.log | |
mv /etc/rc.d/rc.local-backup /etc/rc.d/rc.local | |
Mount EFIBOOT image to /home/msh/WORK/EFI
cp: cannot stat ‘./cfg/efi-boot-grub.cfg’: No such file or directory
Unmount /home/msh/WORK/EFI
Make EFIBOOT RO
cp: cannot stat ‘./cfg/efi-boot-grub.cfg’: No such file or directory
cp: cannot stat ‘./cfg/isolinux.cfg’: No such file or directory
‘custom-ks.cfg’ -> ‘/home/msh/WORK/DST/ks.cfg’
cp: cannot stat ‘./../ansible/.’: No such file or directory
cp: cannot stat ‘./cfg/rc.local’: No such file or directory
Copy custom RPM to /home/msh/WORK/DST/Packages
./bstick.sh: line 114: ./packages.txt: No such file or directory
Update repository index
Spawning worker 0 with 4021 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
I'm using CentOS-7-x86_64-DVD-1810.iso. The ISO boots up fine Anaconda can't find the kickstart file. I mounted the image ( CentOS-7-x86_64-DVD-1810-KS-UEFI.iso ) and ks.cfg is in isolinux. I think you need to change the append syntax in isolinux.cfg to point at ks.cfg.
append initrd=initrd.img inst.repo=cdrom ks=cdrom:/ks.cfg
Thank you for producing a nice clean example.
Can you add copyright and a license to this code. I know this is in public but I would like to make sure I don't step on your copyright.
GPL, BSD or CC are preferred.
Nick
2020.04.04 - :)
Why
$ sudo mount -o loop efiboot.img efiboot
[sudo] password for rongtao:
mount: /home/rongtao/efiboot: wrong fs type, bad option, bad superblock on /dev/loop1, missing codepage or helper program, or other error.
hi, can we have a more brief explanation of this? i noticed that unless you create a directory on ../ansible the script wont terminate well. same as we need a file under ./packages.txt. i managed to put these in place but the boot fails (dracut...) before anaconda starts, well you guessed it. so can i find a more detailed howto of this?
thank you so much
mkdir efi
mount -o loop $ISO_MNT_DIR_DEST/images/efiboot.img efi
cp cfg/efi-boot-grub.cfg efi/EFI/BOOT/grub.cfg
umount efi