OSDN Git Service

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