2011-07-24 09:23:25 +02:00
#!/bin/bash
2011-03-16 20:34:33 +01:00
# Script for updating existing /arch/setup script in the initramfs files of archboot.
2011-07-24 09:23:25 +02:00
# 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
2011-09-01 06:44:53 +02: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 "
2011-07-24 09:23:25 +02:00
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
2011-07-24 09:23:25 +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
2011-09-01 06:44:53 +02:00
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
2011-09-01 06:44:53 +02:00
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
2011-09-01 06:44:53 +02:00
[ -e " ${ WD } /splash.png " ] && cp " ${ WD } /splash.png " " ${ archboot_ext } /boot/splash.png "
2011-03-16 20:34:33 +01:00
echo
2011-09-01 06:44:53 +02:00
_replace_grub2_uefi_x86_64_iso_files( ) {
2011-05-10 07:36:30 +02:00
2011-07-24 09:23:25 +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
2011-07-24 09:23:25 +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 "
2011-07-24 09:23:25 +02:00
set _UEFI_ARCH = "x86_64"
2011-05-10 07:36:30 +02:00
2011-09-01 06:44:53 +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 "
2011-09-01 06:44:53 +02:00
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 } "
2011-07-24 09:23:25 +02:00
" $( 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/ "
2011-07-24 09:23:25 +02:00
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
}
2011-09-01 06:44:53 +02:00
_replace_grub2_uefi_i386_iso_files( ) {
2011-05-10 07:36:30 +02:00
2011-07-24 09:23:25 +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
2011-07-24 09:23:25 +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 "
2011-07-24 09:23:25 +02:00
set _UEFI_ARCH = "i386"
2011-05-10 07:36:30 +02:00
2011-09-01 06:44:53 +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 "
2011-09-01 06:44:53 +02:00
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 } "
2011-07-24 09:23:25 +02:00
" $( 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
}
2011-09-01 06:44:53 +02:00
_replace_grub2_uefi_iso_files( ) {
2011-05-10 07:36:30 +02:00
2011-07-24 09:23:25 +02:00
grub2_uefi_mp = " $( mktemp -d /tmp/grub2_uefi_mp.XXX) "
2011-05-10 07:36:30 +02:00
2011-07-24 09:23:25 +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
2011-09-01 06:44:53 +02:00
_replace_grub2_uefi_x86_64_iso_files
2011-05-10 07:36:30 +02:00
echo
2011-09-01 06:44:53 +02:00
# _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
2011-07-24 09:23:25 +02:00
umount " ${ grub2_uefi_mp } "
2011-06-16 17:49:18 +02:00
losetup --detach " ${ LOOP_DEVICE } "
2011-05-10 07:36:30 +02:00
2011-07-24 09:23:25 +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-01 06:44:53 +02:00
2011-09-02 17:01:47 +02:00
rm -rf " ${ archboot_ext } /efi/grub2/locale/ "
mkdir -p " ${ archboot_ext } /efi/grub2/locale/ "
2011-09-01 06:44:53 +02:00
## 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"
2011-09-01 06:44:53 +02:00
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
2011-09-01 06:44:53 +02:00
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
2011-09-01 06:44:53 +02:00
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
2011-07-24 09:23:25 +02:00
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}
2011-08-31 15:57:21 +02:00
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}
2011-08-31 15:57:21 +02:00
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
2011-07-24 09:23:25 +02:00
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
2011-09-01 06:44:53 +02: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
2011-09-01 06:44:53 +02:00
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
2011-09-01 06:44:53 +02:00
_download_pkgs( ) {
2011-03-16 20:34:33 +01:00
2011-09-01 06:44:53 +02: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
}
2011-09-01 06:44:53 +02:00
[ " ${ REPLACE_GRUB2_UEFI } " = "1" ] && _replace_grub2_uefi_iso_files
2011-03-16 20:34:33 +01:00
if [ " ${ REPLACE_SETUP } " = "1" ]
then
2011-09-01 06:44:53 +02:00
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
2011-09-01 06:44:53 +02:00
cd " ${ WD } / "
2011-03-16 20:34:33 +01:00
2011-04-02 08:21:54 +02:00
## Generate the BIOS+UEFI+ISOHYBRID ISO image using xorriso (extra/libisoburn package) in mkisofs emulation mode
2011-09-01 06:44:53 +02:00
echo "Generating the modified ISO ..."
2011-04-02 08:21:54 +02:00
xorriso -as mkisofs \
2011-09-01 06:44:53 +02:00
-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" \
2011-09-01 06:44:53 +02:00
-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 \
2011-07-24 09:23:25 +02:00
-eltorito-alt-boot --efi-boot efi/grub2/grub2_uefi.bin -no-emul-boot \
2011-04-02 08:21:54 +02:00
-isohybrid-mbr /usr/lib/syslinux/isohdpfx.bin \
2011-09-01 06:44:53 +02:00
-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
2011-09-01 06:44:53 +02:00
unset WD
2011-03-16 20:34:33 +01:00
unset archboot_ext
unset iso_name
2011-07-24 09:23:25 +02:00
unset GRUB2_UEFI_APP_MODULES
unset REPLACE_GRUB2_UEFI
2011-03-16 20:34:33 +01:00
unset REPLACE_SETUP