diff --git a/docs/README b/docs/README index 35ec9dc..20d9a77 100644 --- a/docs/README +++ b/docs/README @@ -16,6 +16,9 @@ It should be fine over ethernet, since hardware switches are much faster and eff Future versions, once this project has a dumping ground, will fetch highly compressed snapshotted chroot filesystems instead of dynamically building the entire install chroots (both x86_64 and i686) instead (with the option of building fresh locally, disabled by default). + +Maybe. + Till then, sorry for the inconvenience. !!!!!!!!!!!!!!!!!!!!!! @@ -56,11 +59,6 @@ All commands below should be issued in the root working directory of this git re but also disk space for working, the finished ISO(s), etc.) -The following packages installed on the build host: -(NOTE: future versions will have dependencies checked automatically and installed if necessary, -depending on distro your host build machine is. the OS detection and package installation component of that isn't -done yet though. 2014.10.31) -(NOTE2: Make sure all the packages you specify are valid package names. A mistyped package name will cause the chroot creation to -break and everything else will break as a result.) curl dosfstools @@ -72,9 +70,24 @@ squashfs-tools xorriso (in RPMForge repo for CentOS 7) xz -and *probably* a few others. The scripts run with set -e for the most part, so if something's missed, you'll know. +and maybe a few others. The scripts run with set -e for the most part, so if something's missed, you'll know. Oh, you will know. +If these packages are missing, they will be automatically installed. Currently, the following distros as host build systems +are supported (assumes most recent release): + +Antergos +Arch +CentOS +Debian +Fedora +Gentoo +Mageia +Manjaro +openSUSE +RHEL +SUSE +Ubuntu ## Configuration ## See extra/build.conf.sample. Copy to /build.conf if you wish to modify any of the values, otherwise the defaults @@ -105,6 +118,18 @@ Also note the following files/paths: --/mirror.lst.sh: Builds a fresh mirror list. Note that it is US based. +-docs: + Documentation for BDisk. +--/COPYING: + See LICENSE. +--/README: + This file. +--/LICENSE: + The license file. +--/FAQ: + Several quick questions you might have. +--/TODO: + Some features, bug fixes, etc. I have planned. -examples: Included recommendation for how to lay things out, etc. --/HTTP: @@ -112,7 +137,7 @@ Also note the following files/paths: -extra: Supporting files for the base building system (mirrorlist, etc.). --/${UXNAME}.png: - A 640x480 8-bit RGBA colour PNG which will be used as the background for the bootsplash (if booting via BIOS and not UEFI) +L A 640x480 8-bit RGBA colour PNG which will be used as the background for the bootsplash (if booting via BIOS and not UEFI) --/bootstrap/apacman-*.tar.xz: An AUR-enabled package manager. Necessary for AUR support. --/build.conf.sample: @@ -130,6 +155,8 @@ Also note the following files/paths: --/pre-build.d: Contains files injected into the system. Both 64-bit and 32-bit environments. Note: be sure to place them in hierarchical order (e.g. if you wish to have a file at /usr/foo/bar, you will need to place it in /extra/pre-build.d/usr/foo/bar) + (NOTE: Make sure all the packages you specify are valid package names. A mistyped or nonexistent package name will cause the chroot + creation to break and everything else will break as a result.) --/pre-build.d/32: Same as above, but only for 32-bit environments. --/pre-build.d/64: @@ -143,8 +170,6 @@ Also note the following files/paths: Here you can find full output of the runs. They are prefixed with run's PID number, and named after the function they occur in. -overlay: These files are applied AFTER the initial setup of the chroots. Same hierarchy rules as extra/pre-build.d. --README: - This file. -src: Supporting source code/source code from other projects. --ipxe/: @@ -153,14 +178,12 @@ Also note the following files/paths: Various patches and supporting configs to tweak the iPXE build. -tftpboot: Files to be served via TFTP for PXE booting. This directory is wiped out during any bin/clean.sh operation. --TODO: - This is just what I'm using to track stuff I want to add. You may notice other files come and go; they're mostly there for extra goodies/used to determine other things. ## (Re)Building ## -Building must be done as root, and on an Arch x86_64 system (future versions will allow for non-Arch distros). +Building must be done as root, and on a supported distro (see Prerequisites for a list). # bin/build.sh @@ -168,3 +191,10 @@ Yeah. It's that easy. The finished product is in iso/. If you want more verbosity, check out the logs/ directory. + + +## Submitting Patches ## +If you have a fix or feature you'd like added, please follow the same pull request process for the kernel +(https://www.kernel.org/doc/Documentation/SubmittingPatches) and email to bts@square-r00t.net + +Alternatively, file a bug at https://bugs.square-r00t.net/index.php?project=2 with a patch attached. diff --git a/extra/bootstrap/apacman-2.3-1-any.FIXED.pkg.tar.xz b/extra/bootstrap/apacman-2.3-1-any.FIXED.pkg.tar.xz new file mode 100644 index 0000000..4705468 Binary files /dev/null and b/extra/bootstrap/apacman-2.3-1-any.FIXED.pkg.tar.xz differ diff --git a/extra/mirrorlist b/extra/mirrorlist index c06c32d..e71b908 100644 --- a/extra/mirrorlist +++ b/extra/mirrorlist @@ -1,7 +1,7 @@ -# Server list generated by rankmirrors on 2015-02-26 +# Server list generated by rankmirrors on 2016-07-09 +Server = http://mirror.us.leaseweb.net/archlinux/$repo/os/$arch Server = http://mirrors.advancedhosters.com/archlinux/$repo/os/$arch -Server = http://mirror.umd.edu/archlinux/$repo/os/$arch -Server = http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch -Server = http://mirror.jmu.edu/pub/archlinux/$repo/os/$arch -Server = http://mirror.es.its.nyu.edu/archlinux/$repo/os/$arch +Server = http://ftp.osuosl.org/pub/archlinux/$repo/os/$arch Server = http://mirrors.rutgers.edu/archlinux/$repo/os/$arch +Server = http://mirror.jmu.edu/pub/archlinux/$repo/os/$arch +Server = http://arch.mirrors.ionfish.org/$repo/os/$arch diff --git a/extra/packages.both b/extra/packages.both index b9c5982..a8344bf 100644 --- a/extra/packages.both +++ b/extra/packages.both @@ -43,7 +43,7 @@ cpio cpuburn cpupower crackpkcs12 -#cryptcat +cryptcat cryptsetup csync2 customizepkg-scripting @@ -54,7 +54,7 @@ dd_rescue dd_rhelp debianutils debootstrap -dialog +#dialog #giving a weird dependency issue diffutils djohn dmidecode @@ -107,6 +107,7 @@ gptfdisk gst-libav gst-plugins-ugly hashcat +hashdeep hddtemp hdparm hexcurse @@ -140,23 +141,38 @@ keyutils kismet-allplugins lftp links -#logkeys -logkeys-keymaps +#logkeys-git # requires a /dev/input, which apparently isn't included in the chroots lm_sensors lrzsz lshw -lsiutil +#lsiutil # giving intermittent errors when trying to fetch source lsof lsscsi -lxde +#lxde # apacman currently doesn't like package groups, so... +gpicview +lxappearance +lxappearance-obconf +lxde-common +lxde-icon-theme +lxdm +lxinput +lxlauncher +lxmusic +lxpanel +lxrandr +lxsession +lxtask +lxterminal +openbox +pcmanfm +# end lxde lynx #lzip macchanger -magicrescue +#magicrescue # no longer maintained, upstream down mbr mbuffer mcelog -md5deep mdadm mdcrack # superseded by storcli @@ -164,11 +180,10 @@ mdcrack memtester mfoc minicom -mondo +#mondo # mindi-busybox fails to build 09.23.2016 mtd-utils mtr mtree -#mtx multipath-tools myrescue nbd @@ -208,20 +223,19 @@ php php-fpm php-gd php-mcrypt -#phrasendrescher +phrasendrescher pigz pkgfile pkgtools ppp pptpclient -prebootloader procinfo-ng procps-ng progsreiserfs psmisc pwgen pixz -pyrit-svn +pyrit python2-gnuplot python2-pyx rarcrack @@ -239,6 +253,7 @@ rsnapshot rygel safecopy samba +scalpel-git scapy screen scrounge-ntfs @@ -254,7 +269,7 @@ smartmontools smbclient s-nail socat -#star ## do people even USE tape packups anymore? +#star ## do people even USE tape backups anymore? storcli strace stress @@ -271,7 +286,7 @@ thttpd tmon tmux tre -truecrack-svn +truecrack-git truecrypt tor udftools @@ -296,7 +311,7 @@ vncrack vnstat vpnc weplab -whdd +#whdd #currently depends on dialog, which is broke as shit whois wifite-mod-pixiewps-git wipe diff --git a/extra/pre-build.d/32/etc/pacman.conf b/extra/pre-build.d/32/etc/pacman.conf new file mode 100644 index 0000000..308a2ee --- /dev/null +++ b/extra/pre-build.d/32/etc/pacman.conf @@ -0,0 +1,95 @@ +# +# /etc/pacman.conf +# +# See the pacman.conf(5) manpage for option and repository directives + +# +# GENERAL OPTIONS +# +[options] +# The following paths are commented out with their default values listed. +# If you wish to use different paths, uncomment and update the paths. +#RootDir = / +#DBPath = /var/lib/pacman/ +#CacheDir = /var/cache/pacman/pkg/ +#LogFile = /var/log/pacman.log +#GPGDir = /etc/pacman.d/gnupg/ +HoldPkg = pacman glibc +#XferCommand = /usr/bin/curl -C - -f %u > %o +#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u +#CleanMethod = KeepInstalled +#UseDelta = 0.7 +Architecture = i686 + +# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup +#IgnorePkg = +#IgnoreGroup = + +#NoUpgrade = +#NoExtract = + +# Misc options +UseSyslog +Color +TotalDownload +CheckSpace +VerbosePkgLists + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +#SigLevel = Required DatabaseOptional #RE-ENABLE ME WHEN A NEW SNAPSHOT IS RELEASED WITH FIXED GPG +SigLevel = Never +LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required + +# NOTE: You must run `pacman-key --init` before first using pacman; the local +# keyring can then be populated with the keys of all official Arch Linux +# packagers with `pacman-key --populate archlinux`. + +# +# REPOSITORIES +# - can be defined here or included from another file +# - pacman will search repositories in the order defined here +# - local/custom mirrors can be added here or in separate files +# - repositories listed first will take precedence when packages +# have identical names, regardless of version number +# - URLs will have $repo replaced by the name of the current repo +# - URLs will have $arch replaced by the name of the architecture +# +# Repository entries are of the format: +# [repo-name] +# Server = ServerName +# Include = IncludePath +# +# The header [repo-name] is crucial - it must be present and +# uncommented to enable the repo. +# + +# The testing repositories are disabled by default. To enable, uncomment the +# repo name header and Include lines. You can add preferred servers immediately +# after the header, and they will be used before the default mirrors. + +#[testing] +#Include = /etc/pacman.d/mirrorlist + +[core] +Include = /etc/pacman.d/mirrorlist + +[extra] +Include = /etc/pacman.d/mirrorlist + +#[community-testing] +#Include = /etc/pacman.d/mirrorlist + +[community] +Include = /etc/pacman.d/mirrorlist + +# An example of a custom package repository. See the pacman manpage for +# tips on creating your own repositories. +#[custom] +#SigLevel = Optional TrustAll +#Server = file:///home/custompkgs + +#[archlinuxfr] +#SigLevel = Never +#Server = http://repo.archlinux.fr/$arch diff --git a/extra/pre-build.d/64/etc/pacman.conf b/extra/pre-build.d/64/etc/pacman.conf new file mode 100644 index 0000000..6cfaeb0 --- /dev/null +++ b/extra/pre-build.d/64/etc/pacman.conf @@ -0,0 +1,104 @@ +# +# /etc/pacman.conf +# +# See the pacman.conf(5) manpage for option and repository directives + +# +# GENERAL OPTIONS +# +[options] +# The following paths are commented out with their default values listed. +# If you wish to use different paths, uncomment and update the paths. +#RootDir = / +#DBPath = /var/lib/pacman/ +#CacheDir = /var/cache/pacman/pkg/ +#LogFile = /var/log/pacman.log +#GPGDir = /etc/pacman.d/gnupg/ +HoldPkg = pacman glibc +#XferCommand = /usr/bin/curl -C - -f %u > %o +#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u +#CleanMethod = KeepInstalled +#UseDelta = 0.7 +Architecture = x86_64 + +# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup +#IgnorePkg = +#IgnoreGroup = + +#NoUpgrade = +#NoExtract = + +# Misc options +UseSyslog +Color +TotalDownload +CheckSpace +VerbosePkgLists + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +#SigLevel = Required DatabaseOptional #RE-ENABLE ME WHEN A NEW SNAPSHOT IS RELEASED WITH FIXED GPG +SigLevel = Never +LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required + +# NOTE: You must run `pacman-key --init` before first using pacman; the local +# keyring can then be populated with the keys of all official Arch Linux +# packagers with `pacman-key --populate archlinux`. + +# +# REPOSITORIES +# - can be defined here or included from another file +# - pacman will search repositories in the order defined here +# - local/custom mirrors can be added here or in separate files +# - repositories listed first will take precedence when packages +# have identical names, regardless of version number +# - URLs will have $repo replaced by the name of the current repo +# - URLs will have $arch replaced by the name of the architecture +# +# Repository entries are of the format: +# [repo-name] +# Server = ServerName +# Include = IncludePath +# +# The header [repo-name] is crucial - it must be present and +# uncommented to enable the repo. +# + +# The testing repositories are disabled by default. To enable, uncomment the +# repo name header and Include lines. You can add preferred servers immediately +# after the header, and they will be used before the default mirrors. + +#[testing] +#Include = /etc/pacman.d/mirrorlist + +[core] +Include = /etc/pacman.d/mirrorlist + +[extra] +Include = /etc/pacman.d/mirrorlist + +#[community-testing] +#Include = /etc/pacman.d/mirrorlist + +[community] +Include = /etc/pacman.d/mirrorlist + +# If you want to run 32 bit applications on your x86_64 system, +# enable the multilib repositories as required here. + +#[multilib-testing] +#Include = /etc/pacman.d/mirrorlist + +[multilib] +Include = /etc/pacman.d/mirrorlist + +# An example of a custom package repository. See the pacman manpage for +# tips on creating your own repositories. +#[custom] +#SigLevel = Optional TrustAll +#Server = file:///home/custompkgs + +#[archlinuxfr] +#SigLevel = Never +#Server = http://repo.archlinux.fr/$arch diff --git a/extra/pre-build.d/etc/apacman.conf b/extra/pre-build.d/etc/apacman.conf index 3723234..f9e124a 100644 --- a/extra/pre-build.d/etc/apacman.conf +++ b/extra/pre-build.d/etc/apacman.conf @@ -11,27 +11,26 @@ #buildonly=1 #cachevcs=1 #ignorearch=1 -#needed=1 +#keepkeys=1 +needed=1 +#noaur=1 noconfirm=1 noedit=1 -#noaur=1 -#noconfirm=1 -#noedit=1 -#nofail=1 +nofail=1 #preview=1 -#purgebuild=1 +progress=1 +purgebuild=1 #quiet=1 -#skipcache=1 -skipinteg=1 +skipcache=1 +#skipinteg=1 #skiptest=1 #warn=1 -#tmpdir=/var/tmp/apacman -#TMPDIR=/var/tmp/apacman # # CONFIGURATION # +#builddir="/tmp/pkgbuild-$UID" #tmpdir="/tmp/apacmantmp-$UID" #makepkgconf="/etc/makepkg.conf" #usermakepkgconf="$HOME/.makepkg.conf" @@ -39,19 +38,21 @@ skipinteg=1 #downdir="/var/cache/pacman/pkg" #savedir="/var/cache/apacman/pkg" #editor="nano -w" -editor="vim" +#pager="less -R" #RPCURL="https://aur.archlinux.org/rpc.php?type" #PKGURL="https://aur.archlinux.org" +#WEBURL="https://www.archlinux.org" #ABSURL="rsync.archlinux.org" # # COLORIZATION # -COLOR1='\e[1;39m' -COLOR2='\e[1;32m' -COLOR3='\e[1;35m' -COLOR4='\e[1;36m' -COLOR5='\e[1;34m' -COLOR6='\e[1;33m' -COLOR7='\e[1;31m' +#COLOR1='\e[1;39m' +#COLOR2='\e[1;32m' +#COLOR3='\e[1;35m' +#COLOR4='\e[1;36m' +#COLOR5='\e[1;34m' +#COLOR6='\e[1;33m' +#COLOR7='\e[1;31m' + diff --git a/extra/pre-build.d/etc/customizepkg.d/autopsy b/extra/pre-build.d/etc/customizepkg.d/autopsy new file mode 100755 index 0000000..024dbcf --- /dev/null +++ b/extra/pre-build.d/etc/customizepkg.d/autopsy @@ -0,0 +1,4 @@ +#!/bin/bash + +# original URL at sourceforge chokes out +sed -re 's@^(source=\(").*$@\1ftp://ftp.gnome.org/mirror/temp/sf2015/a/au/autopsy/autopsy/2.24/autopsy-2.24.tar.gz")@g' ${1} diff --git a/extra/pre-build.d/etc/customizepkg.d/etc-update b/extra/pre-build.d/etc/customizepkg.d/etc-update new file mode 100755 index 0000000..a762691 --- /dev/null +++ b/extra/pre-build.d/etc/customizepkg.d/etc-update @@ -0,0 +1,3 @@ +#!/bin/bash + +sed -i -re 's/^(url=)\((.*)\)$/\1\2/g' ${1} diff --git a/extra/pre-build.d/etc/customizepkg.d/fang b/extra/pre-build.d/etc/customizepkg.d/fang new file mode 100755 index 0000000..a762691 --- /dev/null +++ b/extra/pre-build.d/etc/customizepkg.d/fang @@ -0,0 +1,3 @@ +#!/bin/bash + +sed -i -re 's/^(url=)\((.*)\)$/\1\2/g' ${1} diff --git a/extra/pre-build.d/etc/customizepkg.d/libnfc b/extra/pre-build.d/etc/customizepkg.d/libnfc new file mode 100755 index 0000000..a762691 --- /dev/null +++ b/extra/pre-build.d/etc/customizepkg.d/libnfc @@ -0,0 +1,3 @@ +#!/bin/bash + +sed -i -re 's/^(url=)\((.*)\)$/\1\2/g' ${1} diff --git a/extra/pre-build.d/etc/customizepkg.d/ms-sys b/extra/pre-build.d/etc/customizepkg.d/ms-sys new file mode 100755 index 0000000..4addea7 --- /dev/null +++ b/extra/pre-build.d/etc/customizepkg.d/ms-sys @@ -0,0 +1,4 @@ +#!/bin/bash + +# original URL at sourceforge chokes out +sed -re 's@^(source=\(").*$@\1http://fossies.org/linux/privat/${pkgname}-${pkgver}.tar.gz")@g' ${1} diff --git a/extra/pre-build.d/etc/mkinitcpio.conf b/extra/pre-build.d/etc/mkinitcpio.conf index f151ea1..22c7305 100644 --- a/extra/pre-build.d/etc/mkinitcpio.conf +++ b/extra/pre-build.d/etc/mkinitcpio.conf @@ -64,4 +64,4 @@ COMPRESSION="xz" # COMPRESSION_OPTIONS # Additional options for the compressor -#COMPRESSION_OPTIONS="" +COMPRESSION_OPTIONS="-9" diff --git a/extra/pre-build.d/etc/pacman.d/mirrorlist b/extra/pre-build.d/etc/pacman.d/mirrorlist index 6fefe45..0d60fc3 100644 --- a/extra/pre-build.d/etc/pacman.d/mirrorlist +++ b/extra/pre-build.d/etc/pacman.d/mirrorlist @@ -1,7 +1,6 @@ -# Server list generated by rankmirrors on 2014-11-10 -Server = http://mirror.rit.edu/archlinux/$repo/os/$arch -Server = http://mirror.cc.columbia.edu/pub/linux/archlinux/$repo/os/$arch -Server = http://mirrors.acm.wpi.edu/archlinux/$repo/os/$arch -Server = http://mirror.jmu.edu/pub/archlinux/$repo/os/$arch -Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch -Server = http://mirror.vtti.vt.edu/archlinux/$repo/os/$arch +Server = http://mirrors.advancedhosters.com/archlinux/$repo/os/$arch +Server = http://mirrors.gigenet.com/archlinux/$repo/os/$arch +Server = http://il.mirrors.linaxe.net/archlinux/$repo/os/$arch +Server = http://mirror.grig.io/archlinux/$repo/os/$arch +Server = http://arch.mirrors.ionfish.org/$repo/os/$arch +Server = http://cosmos.cites.illinois.edu/pub/archlinux/$repo/os/$arch diff --git a/src/ipxe_local/patches/ipxe-0002-banner.patch b/src/ipxe_local/patches/ipxe-0002-banner.patch index 6db1e86..aaead6d 100644 --- a/src/ipxe_local/patches/ipxe-0002-banner.patch +++ b/src/ipxe_local/patches/ipxe-0002-banner.patch @@ -1,6 +1,8 @@ ---- a/src/usr/autoboot.c 2015-06-29 04:18:17.055394598 -0400 -+++ b/src/usr/autoboot.c 2015-06-29 22:04:28.692916217 -0400 -@@ -71,6 +71,7 @@ +diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c +index e93b015..758e187 100644 +--- a/src/usr/autoboot.c ++++ b/src/usr/autoboot.c +@@ -71,6 +71,7 @@ static int ( * is_autoboot_device ) ( struct net_device *netdev ); #define NORMAL "\033[0m" #define BOLD "\033[1m" #define CYAN "\033[36m" @@ -8,16 +10,27 @@ /** The "scriptlet" setting */ const struct setting scriptlet_setting __setting ( SETTING_MISC, scriptlet ) = { -@@ -560,9 +561,9 @@ +@@ -521,7 +522,6 @@ static int shell_banner ( void ) { + * @ret rc Return status code + */ + int ipxe ( struct net_device *netdev ) { +- struct feature *feature; + struct image *image; + char *scriptlet; + int rc; +@@ -538,11 +538,11 @@ int ipxe ( struct net_device *netdev ) { * do so. * */ - printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD PRODUCT_SHORT_NAME " %s" -- NORMAL " -- " PRODUCT_TAG_LINE " -- " ++ printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD PRODUCT_SHORT_NAME + NORMAL " -- " PRODUCT_TAG_LINE " -- " - CYAN PRODUCT_URI NORMAL "\nFeatures:", product_version ); -+ printf ( NORMAL "\n\n" PRODUCT_NAME "\n" BOLD PRODUCT_SHORT_NAME -+ CYAN PRODUCT_URI NORMAL "\n" -+ BOLD BLUE "http://bdisk.square-r00t.net/" NORMAL "\n" ); - for_each_table_entry ( feature, FEATURES ) - printf ( " %s", feature->name ); +- for_each_table_entry ( feature, FEATURES ) +- printf ( " %s", feature->name ); ++ CYAN PRODUCT_URI NORMAL "\n" ++ BOLD "BDisk" BLUE "LiveDistro" NORMAL " -- Welp, Yer Boned!(TM) -- " ++ BOLD BLUE "https://bdisk.square-r00t.net/" NORMAL "\n" ); printf ( "\n" ); + + /* Boot system */ diff --git a/src/ipxe_local/patches/ipxe-0004-eiso.patch b/src/ipxe_local/patches/ipxe-0004-eiso.patch new file mode 100644 index 0000000..2105776 --- /dev/null +++ b/src/ipxe_local/patches/ipxe-0004-eiso.patch @@ -0,0 +1,120 @@ +From 189652b03032305a2db860e76fb58e81e3420c4d Mon Sep 17 00:00:00 2001 +From: Christian Hesse +Date: Wed, 24 Feb 2016 09:16:51 +0100 +Subject: [PATCH] allow to build ISO image with EFI support (ipxe.eiso) + +--- + src/arch/x86/Makefile.pcbios | 6 +++++ + src/util/geniso | 52 ++++++++++++++++++++++++++++++++++---------- + 2 files changed, 46 insertions(+), 12 deletions(-) + +diff --git a/src/arch/x86/Makefile.pcbios b/src/arch/x86/Makefile.pcbios +index f8c2253..1e01636 100644 +--- a/src/arch/x86/Makefile.pcbios ++++ b/src/arch/x86/Makefile.pcbios +@@ -86,6 +86,12 @@ NON_AUTO_MEDIA += iso + $(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) LDLINUX_C32=$(LDLINUX_C32) \ + VERSION="$(VERSION)" bash util/geniso -o $@ $< + ++# rule to make a non-emulation ISO boot image with EFI support ++NON_AUTO_MEDIA += eiso ++%eiso: %lkrn bin-i386-efi/ipxe.efi bin-x86_64-efi/ipxe.efi util/geniso ++ $(QM)$(ECHO) " [GENISO] $@" ++ $(Q)ISOLINUX_BIN=$(ISOLINUX_BIN) VERSION="$(VERSION)" bash util/geniso -e -o $@ $< ++ + # rule to make a floppy emulation ISO boot image + NON_AUTO_MEDIA += liso + %liso: %lkrn util/geniso +diff --git a/src/util/geniso b/src/util/geniso +index ff090d4..7694036 100755 +--- a/src/util/geniso ++++ b/src/util/geniso +@@ -6,16 +6,21 @@ function help() { + echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]" + echo + echo "where OPTIONS are:" ++ echo " -e build image with EFI support" + echo " -h show this help" + echo " -l build legacy image with floppy emulation" + echo " -o FILE save iso image to file" + } + ++EFI=0 + LEGACY=0 + FIRST="" + +-while getopts "hlo:" opt; do ++while getopts "ehlo:" opt; do + case ${opt} in ++ e) ++ EFI=1 ++ ;; + h) + help + exit 0 +@@ -37,17 +42,25 @@ if [ -z "${OUT}" ]; then + exit 1 + fi + +-# There should either be mkisofs or the compatible genisoimage program +-for command in genisoimage mkisofs; do +- if ${command} --version >/dev/null 2>/dev/null; then +- mkisofs=(${command}) +- break +- fi +-done +- +-if [ -z "${mkisofs}" ]; then +- echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2 ++# We need xorriso (from libisoburn) for EFI support, so try that first. ++if xorriso --version >/dev/null 2>/dev/null; then ++ mkisofs=(xorriso -as mkisofs) ++elif [ ${EFI} -eq 1 ]; then ++ echo "${0}: xorriso not found, but required for EFI support. Please install." >&2 + exit 1 ++else ++ # fall back to mkisofs or the compatible genisoimage program ++ for command in genisoimage mkisofs; do ++ if ${command} --version >/dev/null 2>/dev/null; then ++ mkisofs=(${command}) ++ break ++ fi ++ done ++ ++ if [ -z "${mkisofs}" ]; then ++ echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2 ++ exit 1 ++ fi + fi + + dir=$(mktemp -d bin/iso.dir.XXXXXX) +@@ -122,13 +135,28 @@ case "${LEGACY}" in + # copy isolinux bootloader + cp ${ISOLINUX_BIN} ${dir} + ++ mkisofs+=(-b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table) ++ ++ if [ "${EFI}" -eq 1 ]; then ++ # generate EFI image ++ img=${dir}/efiboot.img ++ ++ mformat -f 2880 -C -i ${img} :: ++ mmd -i ${img} "::/EFI" ++ mmd -i ${img} "::/EFI/BOOT" ++ mcopy -m -i ${img} bin-x86_64-efi/ipxe.efi "::EFI/BOOT/BOOTX64.EFI" ++ mcopy -m -i ${img} bin-i386-efi/ipxe.efi "::EFI/BOOT/BOOTIA32.EFI" ++ ++ mkisofs+=(-eltorito-alt-boot -e efiboot.img -isohybrid-gpt-basdat -no-emul-boot) ++ fi ++ + # syslinux 6.x needs a file called ldlinux.c32 + if [ -n "${LDLINUX_C32}" -a -s "${LDLINUX_C32}" ]; then + cp ${LDLINUX_C32} ${dir} + fi + + # generate the iso image +- "${mkisofs[@]}" -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -output ${OUT} ${dir} ++ "${mkisofs[@]}" -output ${OUT} ${dir} + + # isohybrid will be used if available + if isohybrid --version >/dev/null 2>/dev/null; then