archboot/usr/bin/archboot-update-setup.sh

398 lines
10 KiB
Bash
Raw Normal View History

#!/bin/bash
2011-03-16 20:34:33 +01:00
# Script for updating existing /arch/setup script in the initramfs files of archboot.
# Previously the script for creating grub2 uefi bootable isos - moved to all-in-one script
2011-05-10 07:36:30 +02:00
# Contributed by "Keshav P R" <skodabenz aatt rocketmail ddoott ccoomm>
2011-03-16 20:34:33 +01:00
export archboot_ver="2011.08-2"
export WD="${PWD}/"
APPNAME="$(basename "${0}")"
2011-03-16 20:34:33 +01:00
2011-05-10 07:36:30 +02:00
export archboot_ext="$(mktemp -d /tmp/archboot_ext.XXXXXXXXXX)"
2011-03-16 20:34:33 +01:00
export iso_name="archboot_${archboot_ver}_mod"
export GRUB2_UEFI_APP_MODULES="part_gpt part_msdos fat ext2 iso9660 udf hfsplus btrfs nilfs2 xfs reiserfs relocator reboot multiboot2 fshelp normal gfxterm chain linux ls cat memdisk tar search search_fs_file search_fs_uuid search_label help loopback boot configfile echo png efi_gop efi_uga xzio font help lvm usbms usb_keyboard"
2011-05-10 07:36:30 +02:00
export REPLACE_GRUB2_UEFI="1"
2011-03-16 20:34:33 +01:00
export REPLACE_SETUP="1"
echo
### check for root
if ! [ $UID -eq 0 ]; then
echo "ERROR: Please run as root user!"
exit 1
fi
set -x
2011-09-02 17:01:47 +02:00
## Remove old files
rm -f "${WD}/${iso_name}.iso" || true
2011-03-16 20:34:33 +01:00
echo
2011-05-10 07:36:30 +02:00
cd "${archboot_ext}/"
2011-03-16 20:34:33 +01:00
echo
## Extract the archboot iso using bsdtar
bsdtar xf "${WD}/archlinux-${archboot_ver}-archboot.iso"
# 7z x "${WD}/archlinux-${archboot_ver}-archboot.iso"
2011-03-16 20:34:33 +01:00
echo
2011-06-16 17:49:18 +02:00
rm -rf "${archboot_ext}/[BOOT]/" || true
2011-03-16 20:34:33 +01:00
echo
[ -e "${WD}/splash.png" ] && cp "${WD}/splash.png" "${archboot_ext}/boot/splash.png"
2011-03-16 20:34:33 +01:00
echo
_replace_grub2_uefi_x86_64_iso_files() {
2011-05-10 07:36:30 +02:00
memdisk_64_dir="$(mktemp -d /tmp/grub2_uefi_64_dir.XXX)"
memdisk_64_img="$(mktemp /tmp/grub2_uefi_64_img.XXX)"
2011-05-10 07:36:30 +02:00
rm -f "${grub2_uefi_mp}/efi/boot/bootx64.efi" || true
rm -f "${archboot_ext}/efi/boot/bootx64.efi" || true
2011-05-10 07:36:30 +02:00
2011-06-16 17:49:18 +02:00
rm -rf "${archboot_ext}/efi/grub2/x86_64-efi" || true
2011-05-10 07:36:30 +02:00
cp -r /usr/lib/grub/x86_64-efi "${archboot_ext}/efi/grub2/x86_64-efi"
mkdir -p "${memdisk_64_dir}/efi/grub2/"
cat << EOF > "${memdisk_64_dir}/efi/grub2/grub.cfg"
set _UEFI_ARCH="x86_64"
2011-05-10 07:36:30 +02:00
search --file --no-floppy --set=uefi64 /efi/grub2/x86_64-efi/grub.cfg
set prefix=(\${uefi64})/efi/grub2/x86_64-efi
2011-05-10 07:36:30 +02:00
source \${prefix}/grub.cfg
EOF
cat << EOF > "${archboot_ext}/efi/grub2/x86_64-efi/grub.cfg"
search --file --no-floppy --set=uefi64 /efi/grub2/x86_64-efi/grub.cfg
source (\${uefi64})/efi/grub2/grub.cfg
2011-05-10 07:36:30 +02:00
EOF
tar -C "${memdisk_64_dir}" -cf - efi > "${memdisk_64_img}"
"$(which grub-mkimage)" --directory="/usr/lib/grub/x86_64-efi" --memdisk="${memdisk_64_img}" --prefix='(memdisk)/efi/grub2' --output="${grub2_uefi_mp}/efi/boot/bootx64.efi" --format=x86_64-efi ${GRUB2_UEFI_APP_MODULES}
2011-09-02 17:01:47 +02:00
mkdir -p "${archboot_ext}/efi/boot/"
cp "${grub2_uefi_mp}/efi/boot/bootx64.efi" "${archboot_ext}/efi/boot/bootx64.efi"
2011-05-10 07:36:30 +02:00
2011-09-02 17:01:47 +02:00
rm -rf "${memdisk_64_dir}/"
rm -f "${memdisk_64_img}"
echo
2011-05-10 07:36:30 +02:00
unset memdisk_64_dir
unset memdisk_64_img
echo
2011-09-02 17:01:47 +02:00
2011-05-10 07:36:30 +02:00
}
_replace_grub2_uefi_i386_iso_files() {
2011-05-10 07:36:30 +02:00
memdisk_32_dir="$(mktemp -d /tmp/grub2_uefi_32_dir.XXX)"
memdisk_32_img="$(mktemp /tmp/grub2_uefi_32_img.XXX)"
2011-05-10 07:36:30 +02:00
rm -f "${grub2_uefi_mp}/efi/boot/bootia32.efi" || true
rm -f "${archboot_ext}/efi/boot/bootia32.efi" || true
2011-05-10 07:36:30 +02:00
2011-06-16 17:49:18 +02:00
rm -rf "${archboot_ext}/efi/grub2/i386-efi" || true
2011-05-10 07:36:30 +02:00
cp -r /usr/lib/grub/i386-efi "${archboot_ext}/efi/grub2/i386-efi"
mkdir -p "${memdisk_32_dir}/efi/grub2/"
cat << EOF > "${memdisk_32_dir}/efi/grub2/grub.cfg"
set _UEFI_ARCH="i386"
2011-05-10 07:36:30 +02:00
search --file --no-floppy --set=uefi32 /efi/grub2/i386-efi/grub.cfg
set prefix=(\${uefi32})/efi/grub2/i386-efi
2011-05-10 07:36:30 +02:00
source \${prefix}/grub.cfg
EOF
2011-09-02 17:01:47 +02:00
cat << EOF > "${archboot_ext}/efi/grub2/i386-efi/grub.cfg"
search --file --no-floppy --set=uefi32 /efi/grub2/i386-efi/grub.cfg
source (\${uefi32})/efi/grub2/grub.cfg
2011-05-10 07:36:30 +02:00
EOF
tar -C "${memdisk_32_dir}" -cf - efi > "${memdisk_32_img}"
"$(which grub-mkimage)" --directory="/usr/lib/grub/i386-efi" --memdisk="${memdisk_32_img}" --prefix='(memdisk)/efi/grub2' --format=i386-efi --compression=xz --output="${grub2_uefi_mp}/efi/boot/bootia32.efi" ${GRUB2_UEFI_APP_MODULES}
2011-05-10 07:36:30 +02:00
2011-09-02 17:01:47 +02:00
rm -rf "${memdisk_32_dir}/"
rm -f "${memdisk_32_img}"
echo
2011-05-10 07:36:30 +02:00
unset memdisk_32_dir
unset memdisk_32_img
echo
}
_replace_grub2_uefi_iso_files() {
2011-05-10 07:36:30 +02:00
grub2_uefi_mp="$(mktemp -d /tmp/grub2_uefi_mp.XXX)"
2011-05-10 07:36:30 +02:00
modprobe -q loop
LOOP_DEVICE="$(losetup --show --find ${archboot_ext}/efi/grub2/grub2_uefi.bin)"
mount -o rw,users -t vfat "${LOOP_DEVICE}" "${grub2_uefi_mp}"
2011-05-10 07:36:30 +02:00
echo
_replace_grub2_uefi_x86_64_iso_files
2011-05-10 07:36:30 +02:00
echo
# _replace_grub2_uefi_i386_iso_files
2011-05-10 07:36:30 +02:00
echo
2011-05-27 20:51:36 +02:00
# umount images and loop
umount "${grub2_uefi_mp}"
2011-06-16 17:49:18 +02:00
losetup --detach "${LOOP_DEVICE}"
2011-05-10 07:36:30 +02:00
rm -f "${archboot_ext}/efi/boot/grub.cfg" || true
rm -f "${archboot_ext}/efi/grub2/grub.cfg"
2011-06-08 08:12:29 +02:00
2011-09-02 17:01:47 +02:00
cp /usr/share/grub/unicode.pf2 "${archboot_ext}/efi/grub2/"
2011-09-02 17:01:47 +02:00
rm -rf "${archboot_ext}/efi/grub2/locale/"
mkdir -p "${archboot_ext}/efi/grub2/locale/"
## Taken from /sbin/grub-install
for dir in "/usr/share/locale"/*
do
if test -f "${dir}/LC_MESSAGES/grub.mo"
then
2011-09-02 17:01:47 +02:00
# cp -f "${dir}/LC_MESSAGES/grub.mo" "${archboot_ext}/efi/grub2/locale/${dir##*/}.mo"
echo
fi
done
2011-06-08 08:12:29 +02:00
cat << EOF > "${archboot_ext}/efi/grub2/grub.cfg"
2011-05-10 07:36:30 +02:00
search --file --no-floppy --set=archboot /arch/archboot.txt
set pager=1
set locale_dir=(\${archboot})/efi/grub2/locale
2011-05-10 07:36:30 +02:00
insmod efi_gop
insmod efi_uga
insmod font
if loadfont (\${archboot})/efi/grub2/unicode.pf2
then
insmod gfxterm
set gfxmode="auto"
set gfxpayload="keep"
terminal_output gfxterm
set color_normal=light-blue/black
set color_highlight=light-cyan/blue
insmod png
background_image (\${archboot})/boot/splash.png
2011-05-10 07:36:30 +02:00
fi
insmod fat
insmod iso9660
insmod udf
insmod search_fs_file
insmod linux
set _kernel_params="add_efi_memmap none=UEFI_ARCH_\${_UEFI_ARCH}"
2011-05-10 07:36:30 +02:00
menuentry "Arch Linux (i686) archboot" {
set root=(\${archboot})
linux /boot/vmlinuz ro \${_kernel_params}
initrd /boot/initrd.img
}
menuentry "Arch Linux (x86_64) archboot" {
set root=(\${archboot})
linux /boot/vm64 ro \${_kernel_params}
initrd /boot/initrd64.img
}
menuentry "Arch Linux LTS (i686) archboot" {
set root=(\${archboot})
linux /boot/vmlts ro \${_kernel_params}
initrd /boot/initrd.img
2011-05-10 07:36:30 +02:00
}
menuentry "Arch Linux LTS (x86_64) archboot" {
set root=(\${archboot})
linux /boot/vm64lts ro \${_kernel_params}
initrd /boot/initrd64.img
2011-05-10 07:36:30 +02:00
}
EOF
2011-09-02 17:01:47 +02:00
rm -rf "${grub2_uefi_mp}/"
echo
unset grub2_uefi_mp
2011-05-10 07:36:30 +02:00
unset LOOP_DEVICE
2011-09-02 17:01:47 +02:00
echo
2011-05-10 07:36:30 +02:00
}
2011-03-16 20:34:33 +01:00
_replace_arch_setup_initramfs() {
2011-03-16 20:34:33 +01:00
2011-05-10 07:36:30 +02:00
initramfs_ext="$(mktemp -d /tmp/${initramfs_name}_ext.XXXXXXXXXX)"
2011-03-16 20:34:33 +01:00
echo
2011-05-10 07:36:30 +02:00
cd "${initramfs_ext}/"
2011-03-16 20:34:33 +01:00
2011-09-02 17:01:47 +02:00
if [ "${initramfs_name}" == "initrd64" ] || [ "${initramfs_name}" == "initrd64lts" ]
then
[ -e "${archboot_ext}/boot/initrd64lts.img" ] && bsdtar xf "${archboot_ext}/boot/initrd64lts.img"
echo
bsdtar xf "${archboot_ext}/boot/initrd64.img"
echo
fi
2011-03-16 20:34:33 +01:00
2011-09-02 17:01:47 +02:00
if [ "${initramfs_name}" == "initrd" ] || [ "${initramfs_name}" == "initrdlts" ]
then
[ -e "${archboot_ext}/boot/initrdlts.img" ] && bsdtar xf "${archboot_ext}/boot/initrdlts.img"
echo
bsdtar xf "${archboot_ext}/boot/initrd.img"
echo
fi
2011-03-16 20:34:33 +01:00
2011-09-02 17:01:47 +02:00
if [ -e "${WD}/setup" ]
then
mv "${initramfs_ext}/arch/setup" "${initramfs_ext}/arch/setup.old"
echo
cp "${WD}/setup" "${initramfs_ext}/arch/setup"
echo
fi
2011-03-16 20:34:33 +01:00
2011-05-10 07:36:30 +02:00
chmod +x "${initramfs_ext}/arch/setup"
2011-03-16 20:34:33 +01:00
echo
cd "${WD}/"
2011-03-16 20:34:33 +01:00
2011-09-02 17:01:47 +02:00
## Generate the actual initramfs file
if [ "${initramfs_name}" == "initrd64" ] || [ "${initramfs_name}" == "initrd64lts" ]
then
cd "${initramfs_ext}/"
find . -print0 | bsdcpio -0oH newc | lzma > "${WD}/initrd64.img"
echo
[ -e "${archboot_ext}/boot/initrd64lts.img" ] && rm -f "${archboot_ext}/boot/initrd64lts.img"
echo
rm -f "${archboot_ext}/boot/initrd64.img"
echo
cp "${WD}/initrd64.img" "${archboot_ext}/boot/initrd64.img"
echo
rm -f "${WD}/initrd64.img"
echo
fi
2011-03-16 20:34:33 +01:00
2011-09-02 17:01:47 +02:00
if [ "${initramfs_name}" == "initrd" ] || [ "${initramfs_name}" == "initrdlts" ]
then
cd "${initramfs_ext}/"
find . -print0 | bsdcpio -0oH newc | lzma > "${WD}/initrd.img"
echo
[ -e "${archboot_ext}/boot/initrdlts.img" ] && rm -f "${archboot_ext}/boot/initrdlts.img"
echo
rm -f "${archboot_ext}/boot/initrd.img"
echo
cp "${WD}/initrd.img" "${archboot_ext}/boot/initrd.img"
echo
rm -f "${WD}/initrd.img"
echo
fi
rm -rf "${initramfs_ext}/"
2011-03-16 20:34:33 +01:00
echo
unset initramfs_ext
2011-05-10 07:36:30 +02:00
unset initramfs_name
2011-03-16 20:34:33 +01:00
echo
}
# Not currently used - simply left untouched for now
_download_pkgs() {
2011-03-16 20:34:33 +01:00
cd "${WD}/"
2011-03-16 20:34:33 +01:00
if [ "${pkg_arch}" = 'any' ]
then
2011-05-10 07:36:30 +02:00
wget -c "http://www.archlinux.org/packages/${repo}/any/${package}/download/"
2011-03-16 20:34:33 +01:00
echo
else
2011-05-10 07:36:30 +02:00
wget -c "http://www.archlinux.org/packages/${repo}/x86_64/${package}/download/"
2011-03-16 20:34:33 +01:00
echo
2011-05-10 07:36:30 +02:00
wget -c "http://www.archlinux.org/packages/${repo}/i686/${package}/download/"
2011-03-16 20:34:33 +01:00
echo
fi
unset repo
unset package
unset pkg_arch
echo
}
[ "${REPLACE_GRUB2_UEFI}" = "1" ] && _replace_grub2_uefi_iso_files
2011-03-16 20:34:33 +01:00
if [ "${REPLACE_SETUP}" = "1" ]
then
cd "${WD}/"
2011-03-16 20:34:33 +01:00
2011-09-02 17:01:47 +02:00
## The old method I tried, mount -o ro -t iso9660 /dev/sr0 /src, mv /arch/setup /arch/setup.old, cp /src/arch/setup /arch/setup, umount /dev/sr0
# cp ${WD}/setup ${archboot_ext}/arch/setup
## Extracting using bsdtar, replacing /arch/setup and recompressing the iniramfs archive does not work. Archive format not compatible with initramfs format.
## Compressing using bsdcpio and using 'newc' archive format works, taken from falconindy's geninit program.
initramfs_name="initrd64"
_replace_arch_setup_initramfs
initramfs_name="initrd"
_replace_arch_setup_initramfs
2011-03-16 20:34:33 +01:00
echo
fi
## Re-create the archboot ISO
cd "${WD}/"
2011-03-16 20:34:33 +01:00
## Generate the BIOS+UEFI+ISOHYBRID ISO image using xorriso (extra/libisoburn package) in mkisofs emulation mode
echo "Generating the modified ISO ..."
xorriso -as mkisofs \
-iso-level 3 -rock -joliet \
2011-03-16 20:34:33 +01:00
-max-iso9660-filenames -omit-period \
-omit-version-number -allow-leading-dots \
-relaxed-filenames -allow-lowercase -allow-multidot \
-volid "ARCHBOOT" \
-p "prepared by ${APPNAME}" \
2011-03-16 20:34:33 +01:00
-eltorito-boot boot/syslinux/isolinux.bin \
-eltorito-catalog boot/syslinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-eltorito-alt-boot --efi-boot efi/grub2/grub2_uefi.bin -no-emul-boot \
-isohybrid-mbr /usr/lib/syslinux/isohdpfx.bin \
-output "${WD}/${iso_name}.iso" "${archboot_ext}/" > /dev/null 2>&1
2011-03-16 20:34:33 +01:00
echo
2011-09-02 17:01:47 +02:00
rm -rf "${archboot_ext}/"
echo
2011-03-16 20:34:33 +01:00
set +x
unset archboot_ver
unset WD
2011-03-16 20:34:33 +01:00
unset archboot_ext
unset iso_name
unset GRUB2_UEFI_APP_MODULES
unset REPLACE_GRUB2_UEFI
2011-03-16 20:34:33 +01:00
unset REPLACE_SETUP