OSDN Git Service

Remove i686 boot options
[boonux/boonux.git] / build-dual.sh
1 #!/bin/bash
2
3 set -e -u
4
5 iso_name=archlinux
6 iso_label="ARCH_$(date +%Y%m)"
7 iso_version=$(date +%Y.%m.%d)
8 install_dir=arch
9 work_dir=work
10 out_dir=out
11 gpg_key=
12
13 arch=$(uname -m)
14 verbose=""
15 script_path=$(readlink -f ${0%/*})
16
17 _usage ()
18 {
19     echo "usage ${0} [options]"
20     echo
21     echo " General options:"
22     echo "    -N <iso_name>      Set an iso filename (prefix)"
23     echo "                        Default: ${iso_name}"
24     echo "    -V <iso_version>   Set an iso version (in filename)"
25     echo "                        Default: ${iso_version}"
26     echo "    -L <iso_label>     Set an iso label (disk label)"
27     echo "                        Default: ${iso_label}"
28     echo "    -D <install_dir>   Set an install_dir (directory inside iso)"
29     echo "                        Default: ${install_dir}"
30     echo "    -w <work_dir>      Set the working directory"
31     echo "                        Default: ${work_dir}"
32     echo "    -o <out_dir>       Set the output directory"
33     echo "                        Default: ${out_dir}"
34     echo "    -v                 Enable verbose output"
35     echo "    -h                 This help message"
36     exit ${1}
37 }
38
39 # Helper function to run make_*() only one time per architecture.
40 run_once() {
41     if [[ ! -e ${work_dir}/build.${1}_${arch} ]]; then
42         $1
43         touch ${work_dir}/build.${1}_${arch}
44     fi
45 }
46
47 # Setup custom pacman.conf with current cache directories.
48 make_pacman_conf() {
49     local _cache_dirs
50     _cache_dirs=($(pacman -v 2>&1 | grep '^Cache Dirs:' | sed 's/Cache Dirs:\s*//g'))
51     sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${_cache_dirs[@]})|g" ${script_path}/pacman.conf > ${work_dir}/pacman.conf
52 }
53
54 # Base installation, plus needed packages (airootfs)
55 make_basefs() {
56     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${work_dir}/pacman.conf" -D "${install_dir}" init
57     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${work_dir}/pacman.conf" -D "${install_dir}" -p "haveged intel-ucode memtest86+ mkinitcpio-nfs-utils nbd zsh" install
58 }
59
60 # Additional packages (airootfs)
61 make_packages() {
62     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${work_dir}/pacman.conf" -D "${install_dir}" -p "$(grep -h -v ^# ${script_path}/packages.{both,${arch}})" install
63 }
64
65 # Needed packages for x86_64 EFI boot
66 make_packages_efi() {
67     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${work_dir}/pacman.conf" -D "${install_dir}" -p "efitools" install
68 }
69
70 # Copy mkinitcpio archiso hooks and build initramfs (airootfs)
71 make_setup_mkinitcpio() {
72     local _hook
73     mkdir -p ${work_dir}/${arch}/airootfs/etc/initcpio/hooks
74     mkdir -p ${work_dir}/${arch}/airootfs/etc/initcpio/install
75     for _hook in archiso archiso_shutdown archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs archiso_loop_mnt; do
76         cp /usr/lib/initcpio/hooks/${_hook} ${work_dir}/${arch}/airootfs/etc/initcpio/hooks
77         cp /usr/lib/initcpio/install/${_hook} ${work_dir}/${arch}/airootfs/etc/initcpio/install
78     done
79     sed -i "s|/usr/lib/initcpio/|/etc/initcpio/|g" ${work_dir}/${arch}/airootfs/etc/initcpio/install/archiso_shutdown
80     cp /usr/lib/initcpio/install/archiso_kms ${work_dir}/${arch}/airootfs/etc/initcpio/install
81     cp /usr/lib/initcpio/archiso_shutdown ${work_dir}/${arch}/airootfs/etc/initcpio
82     cp ${script_path}/mkinitcpio.conf ${work_dir}/${arch}/airootfs/etc/mkinitcpio-archiso.conf
83     gnupg_fd=
84     if [[ ${gpg_key} ]]; then
85       gpg --export ${gpg_key} >${work_dir}/gpgkey
86       exec 17<>${work_dir}/gpgkey
87     fi
88     ARCHISO_GNUPG_FD=${gpg_key:+17} setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${work_dir}/pacman.conf" -D "${install_dir}" -r 'mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img' run
89     if [[ ${gpg_key} ]]; then
90       exec 17<&-
91     fi
92 }
93
94 # Customize installation (airootfs)
95 make_customize_airootfs() {
96     cp -af ${script_path}/airootfs ${work_dir}/${arch}
97
98     curl -o ${work_dir}/${arch}/airootfs/etc/pacman.d/mirrorlist 'https://www.archlinux.org/mirrorlist/?country=all&protocol=http&use_mirror_status=on'
99
100     lynx -dump -nolist 'https://wiki.archlinux.org/index.php/Installation_Guide?action=render' >> ${work_dir}/${arch}/airootfs/root/install.txt
101
102     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${work_dir}/pacman.conf" -D "${install_dir}" -r '/root/customize_airootfs.sh' run
103     rm ${work_dir}/${arch}/airootfs/root/customize_airootfs.sh
104 }
105
106 # Prepare kernel/initramfs ${install_dir}/boot/
107 make_boot() {
108     mkdir -p ${work_dir}/iso/${install_dir}/boot/${arch}
109     cp ${work_dir}/${arch}/airootfs/boot/archiso.img ${work_dir}/iso/${install_dir}/boot/${arch}/archiso.img
110     cp ${work_dir}/${arch}/airootfs/boot/vmlinuz-linux ${work_dir}/iso/${install_dir}/boot/${arch}/vmlinuz
111 }
112
113 # Add other aditional/extra files to ${install_dir}/boot/
114 make_boot_extra() {
115     cp ${work_dir}/${arch}/airootfs/boot/memtest86+/memtest.bin ${work_dir}/iso/${install_dir}/boot/memtest
116     cp ${work_dir}/${arch}/airootfs/usr/share/licenses/common/GPL2/license.txt ${work_dir}/iso/${install_dir}/boot/memtest.COPYING
117     cp ${work_dir}/${arch}/airootfs/boot/intel-ucode.img ${work_dir}/iso/${install_dir}/boot/intel_ucode.img
118     cp ${work_dir}/${arch}/airootfs/usr/share/licenses/intel-ucode/LICENSE ${work_dir}/iso/${install_dir}/boot/intel_ucode.LICENSE
119 }
120
121 # Prepare /${install_dir}/boot/syslinux
122 make_syslinux() {
123     mkdir -p ${work_dir}/iso/${install_dir}/boot/syslinux
124     for _cfg in ${script_path}/syslinux/*.cfg; do
125         sed "s|%ARCHISO_LABEL%|${iso_label}|g;
126              s|%INSTALL_DIR%|${install_dir}|g" ${_cfg} > ${work_dir}/iso/${install_dir}/boot/syslinux/${_cfg##*/}
127     done
128     cp ${script_path}/syslinux/splash.png ${work_dir}/iso/${install_dir}/boot/syslinux
129     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/*.c32 ${work_dir}/iso/${install_dir}/boot/syslinux
130     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/lpxelinux.0 ${work_dir}/iso/${install_dir}/boot/syslinux
131     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/memdisk ${work_dir}/iso/${install_dir}/boot/syslinux
132     mkdir -p ${work_dir}/iso/${install_dir}/boot/syslinux/hdt
133     gzip -c -9 ${work_dir}/${arch}/airootfs/usr/share/hwdata/pci.ids > ${work_dir}/iso/${install_dir}/boot/syslinux/hdt/pciids.gz
134     gzip -c -9 ${work_dir}/${arch}/airootfs/usr/lib/modules/*-ARCH/modules.alias > ${work_dir}/iso/${install_dir}/boot/syslinux/hdt/modalias.gz
135 }
136
137 # Prepare /isolinux
138 make_isolinux() {
139     mkdir -p ${work_dir}/iso/isolinux
140     sed "s|%INSTALL_DIR%|${install_dir}|g" ${script_path}/isolinux/isolinux.cfg > ${work_dir}/iso/isolinux/isolinux.cfg
141     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/isolinux.bin ${work_dir}/iso/isolinux/
142     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/isohdpfx.bin ${work_dir}/iso/isolinux/
143     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/ldlinux.c32 ${work_dir}/iso/isolinux/
144 }
145
146 # Prepare /EFI
147 make_efi() {
148     mkdir -p ${work_dir}/iso/EFI/boot
149     cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/PreLoader.efi ${work_dir}/iso/EFI/boot/bootx64.efi
150     cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/HashTool.efi ${work_dir}/iso/EFI/boot/
151
152     cp ${work_dir}/x86_64/airootfs/usr/lib/systemd/boot/efi/systemd-bootx64.efi ${work_dir}/iso/EFI/boot/loader.efi
153
154     mkdir -p ${work_dir}/iso/loader/entries
155     cp ${script_path}/efiboot/loader/loader.conf ${work_dir}/iso/loader/
156     cp ${script_path}/efiboot/loader/entries/uefi-shell-v2-x86_64.conf ${work_dir}/iso/loader/entries/
157     cp ${script_path}/efiboot/loader/entries/uefi-shell-v1-x86_64.conf ${work_dir}/iso/loader/entries/
158
159     sed "s|%ARCHISO_LABEL%|${iso_label}|g;
160          s|%INSTALL_DIR%|${install_dir}|g" \
161         ${script_path}/efiboot/loader/entries/archiso-x86_64-usb.conf > ${work_dir}/iso/loader/entries/archiso-x86_64.conf
162
163     # EFI Shell 2.0 for UEFI 2.3+
164     curl -o ${work_dir}/iso/EFI/shellx64_v2.efi https://raw.githubusercontent.com/tianocore/edk2/master/ShellBinPkg/UefiShell/X64/Shell.efi
165     # EFI Shell 1.0 for non UEFI 2.3+
166     curl -o ${work_dir}/iso/EFI/shellx64_v1.efi https://raw.githubusercontent.com/tianocore/edk2/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi
167 }
168
169 # Prepare efiboot.img::/EFI for "El Torito" EFI boot mode
170 make_efiboot() {
171     mkdir -p ${work_dir}/iso/EFI/archiso
172     truncate -s 40M ${work_dir}/iso/EFI/archiso/efiboot.img
173     mkfs.fat -n ARCHISO_EFI ${work_dir}/iso/EFI/archiso/efiboot.img
174
175     mkdir -p ${work_dir}/efiboot
176     mount ${work_dir}/iso/EFI/archiso/efiboot.img ${work_dir}/efiboot
177
178     mkdir -p ${work_dir}/efiboot/EFI/archiso
179     cp ${work_dir}/iso/${install_dir}/boot/x86_64/vmlinuz ${work_dir}/efiboot/EFI/archiso/vmlinuz.efi
180     cp ${work_dir}/iso/${install_dir}/boot/x86_64/archiso.img ${work_dir}/efiboot/EFI/archiso/archiso.img
181
182     cp ${work_dir}/iso/${install_dir}/boot/intel_ucode.img ${work_dir}/efiboot/EFI/archiso/intel_ucode.img
183
184     mkdir -p ${work_dir}/efiboot/EFI/boot
185     cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/PreLoader.efi ${work_dir}/efiboot/EFI/boot/bootx64.efi
186     cp ${work_dir}/x86_64/airootfs/usr/share/efitools/efi/HashTool.efi ${work_dir}/efiboot/EFI/boot/
187
188     cp ${work_dir}/x86_64/airootfs/usr/lib/systemd/boot/efi/systemd-bootx64.efi ${work_dir}/efiboot/EFI/boot/loader.efi
189
190     mkdir -p ${work_dir}/efiboot/loader/entries
191     cp ${script_path}/efiboot/loader/loader.conf ${work_dir}/efiboot/loader/
192     cp ${script_path}/efiboot/loader/entries/uefi-shell-v2-x86_64.conf ${work_dir}/efiboot/loader/entries/
193     cp ${script_path}/efiboot/loader/entries/uefi-shell-v1-x86_64.conf ${work_dir}/efiboot/loader/entries/
194
195     sed "s|%ARCHISO_LABEL%|${iso_label}|g;
196          s|%INSTALL_DIR%|${install_dir}|g" \
197         ${script_path}/efiboot/loader/entries/archiso-x86_64-cd.conf > ${work_dir}/efiboot/loader/entries/archiso-x86_64.conf
198
199     cp ${work_dir}/iso/EFI/shellx64_v2.efi ${work_dir}/efiboot/EFI/
200     cp ${work_dir}/iso/EFI/shellx64_v1.efi ${work_dir}/efiboot/EFI/
201
202     umount -d ${work_dir}/efiboot
203 }
204
205 # Build airootfs filesystem image
206 make_prepare() {
207     cp -a -l -f ${work_dir}/${arch}/airootfs ${work_dir}
208     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" pkglist
209     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" ${gpg_key:+-g ${gpg_key}} prepare
210     rm -rf ${work_dir}/airootfs
211     # rm -rf ${work_dir}/${arch}/airootfs (if low space, this helps)
212 }
213
214 # Build ISO
215 make_iso() {
216     mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -L "${iso_label}" -o "${out_dir}" iso "${iso_name}-${iso_version}-dual.iso"
217 }
218
219 if [[ ${EUID} -ne 0 ]]; then
220     echo "This script must be run as root."
221     _usage 1
222 fi
223
224 if [[ ${arch} != x86_64 ]]; then
225     echo "This script needs to be run on x86_64"
226     _usage 1
227 fi
228
229 while getopts 'N:V:L:D:w:o:g:vh' arg; do
230     case "${arg}" in
231         N) iso_name="${OPTARG}" ;;
232         V) iso_version="${OPTARG}" ;;
233         L) iso_label="${OPTARG}" ;;
234         D) install_dir="${OPTARG}" ;;
235         w) work_dir="${OPTARG}" ;;
236         o) out_dir="${OPTARG}" ;;
237         g) gpg_key="${OPTARG}" ;;
238         v) verbose="-v" ;;
239         h) _usage 0 ;;
240         *)
241            echo "Invalid argument '${arg}'"
242            _usage 1
243            ;;
244     esac
245 done
246
247 mkdir -p ${work_dir}
248
249 run_once make_pacman_conf
250
251 # Do all stuff for each airootfs
252 for arch in i686 x86_64; do
253     run_once make_basefs
254     run_once make_packages
255 done
256
257 run_once make_packages_efi
258
259 for arch in i686 x86_64; do
260     run_once make_setup_mkinitcpio
261     run_once make_customize_airootfs
262 done
263
264 for arch in i686 x86_64; do
265     run_once make_boot
266 done
267
268 # Do all stuff for "iso"
269 run_once make_boot_extra
270 run_once make_syslinux
271 run_once make_isolinux
272 run_once make_efi
273 run_once make_efiboot
274
275 for arch in i686 x86_64; do
276     run_once make_prepare
277 done
278
279 run_once make_iso