unixwz0r

Archiso - build.sh

Feb 9th, 2015
440
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.92 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. set -e -u
  4.  
  5. iso_name=Tux-Hat-Linux
  6. iso_label="THL_$(date +%Y%m)"
  7. iso_version=$(date +%Y.%m.%d)
  8. install_dir=arch
  9. work_dir=work
  10. out_dir=out
  11.  
  12. arch=$(uname -m)
  13. verbose=""
  14. pacman_conf=${work_dir}/pacman.conf
  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 > ${pacman_conf}
  52. }
  53.  
  54. # Base installation, plus needed packages (airootfs)
  55. make_basefs() {
  56.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${pacman_conf}" -D "${install_dir}" init
  57.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${pacman_conf}" -D "${install_dir}" -p "memtest86+ mkinitcpio-nfs-utils nbd" install
  58. }
  59.  
  60. # Additional packages (airootfs)
  61. make_packages() {
  62.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${pacman_conf}" -D "${install_dir}" -p "$(grep -h -v ^# ${script_path}/packages.{both,${arch}})" install
  63. }
  64.  
  65. # Copy mkinitcpio archiso hooks and build initramfs (airootfs)
  66. make_setup_mkinitcpio() {
  67.     local _hook
  68.     mkdir -p ${work_dir}/${arch}/airootfs/etc/initcpio/hooks
  69.     mkdir -p ${work_dir}/${arch}/airootfs/etc/initcpio/install
  70.     for _hook in archiso archiso_shutdown archiso_pxe_common archiso_pxe_nbd archiso_pxe_http archiso_pxe_nfs archiso_loop_mnt; do
  71.         cp /usr/lib/initcpio/hooks/${_hook} ${work_dir}/${arch}/airootfs/etc/initcpio/hooks
  72.         cp /usr/lib/initcpio/install/${_hook} ${work_dir}/${arch}/airootfs/etc/initcpio/install
  73.     done
  74.     sed -i "s|/usr/lib/initcpio/|/etc/initcpio/|g" ${work_dir}/${arch}/airootfs/etc/initcpio/install/archiso_shutdown
  75.     cp /usr/lib/initcpio/install/archiso_kms ${work_dir}/${arch}/airootfs/etc/initcpio/install
  76.     cp /usr/lib/initcpio/archiso_shutdown ${work_dir}/${arch}/airootfs/etc/initcpio
  77.     cp ${script_path}/mkinitcpio.conf ${work_dir}/${arch}/airootfs/etc/mkinitcpio-archiso.conf
  78.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${pacman_conf}" -D "${install_dir}" -r 'mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img' run
  79. }
  80.  
  81. # Customize installation (airootfs)
  82. make_customize_airootfs() {
  83.     cp -af ${script_path}/airootfs ${work_dir}/${arch}
  84.  
  85.     curl -o ${work_dir}/${arch}/airootfs/etc/pacman.d/mirrorlist 'https://www.archlinux.org/mirrorlist/?country=all&protocol=http&use_mirror_status=on'
  86.  
  87.     lynx -dump -nolist 'https://wiki.archlinux.org/index.php/Installation_Guide?action=render' >> ${work_dir}/${arch}/airootfs/root/install.txt
  88.  
  89.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}/${arch}" -C "${pacman_conf}" -D "${install_dir}" -r '/root/customize_airootfs.sh' run
  90.     rm ${work_dir}/${arch}/airootfs/root/customize_airootfs.sh
  91. }
  92.  
  93. # Prepare kernel/initramfs ${install_dir}/boot/
  94. make_boot() {
  95.     mkdir -p ${work_dir}/iso/${install_dir}/boot/${arch}
  96.     cp ${work_dir}/${arch}/airootfs/boot/archiso.img ${work_dir}/iso/${install_dir}/boot/${arch}/archiso.img
  97.     cp ${work_dir}/${arch}/airootfs/boot/vmlinuz-linux ${work_dir}/iso/${install_dir}/boot/${arch}/vmlinuz
  98. }
  99.  
  100. # Add other aditional/extra files to ${install_dir}/boot/
  101. make_boot_extra() {
  102.     cp ${work_dir}/${arch}/airootfs/boot/memtest86+/memtest.bin ${work_dir}/iso/${install_dir}/boot/memtest
  103.     cp ${work_dir}/${arch}/airootfs/usr/share/licenses/common/GPL2/license.txt ${work_dir}/iso/${install_dir}/boot/memtest.COPYING
  104. }
  105.  
  106. # Prepare /${install_dir}/boot/syslinux
  107. make_syslinux() {
  108.     mkdir -p ${work_dir}/iso/${install_dir}/boot/syslinux
  109.     for _cfg in ${script_path}/syslinux/*.cfg; do
  110.         sed "s|%ARCHISO_LABEL%|${iso_label}|g;
  111.             s|%INSTALL_DIR%|${install_dir}|g" ${_cfg} > ${work_dir}/iso/${install_dir}/boot/syslinux/${_cfg##*/}
  112.     done
  113.     cp ${script_path}/syslinux/splash.png ${work_dir}/iso/${install_dir}/boot/syslinux
  114.     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/*.c32 ${work_dir}/iso/${install_dir}/boot/syslinux
  115.     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/lpxelinux.0 ${work_dir}/iso/${install_dir}/boot/syslinux
  116.     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/memdisk ${work_dir}/iso/${install_dir}/boot/syslinux
  117.     mkdir -p ${work_dir}/iso/${install_dir}/boot/syslinux/hdt
  118.     gzip -c -9 ${work_dir}/${arch}/airootfs/usr/share/hwdata/pci.ids > ${work_dir}/iso/${install_dir}/boot/syslinux/hdt/pciids.gz
  119.     gzip -c -9 ${work_dir}/${arch}/airootfs/usr/lib/modules/*-ARCH/modules.alias > ${work_dir}/iso/${install_dir}/boot/syslinux/hdt/modalias.gz
  120. }
  121.  
  122. # Prepare /isolinux
  123. make_isolinux() {
  124.     mkdir -p ${work_dir}/iso/isolinux
  125.     sed "s|%INSTALL_DIR%|${install_dir}|g" ${script_path}/isolinux/isolinux.cfg > ${work_dir}/iso/isolinux/isolinux.cfg
  126.     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/isolinux.bin ${work_dir}/iso/isolinux/
  127.     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/isohdpfx.bin ${work_dir}/iso/isolinux/
  128.     cp ${work_dir}/${arch}/airootfs/usr/lib/syslinux/bios/ldlinux.c32 ${work_dir}/iso/isolinux/
  129. }
  130.  
  131. # Build airootfs filesystem image
  132. make_prepare() {
  133.     cp -a -l -f ${work_dir}/${arch}/airootfs ${work_dir}
  134.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" pkglist
  135.     setarch ${arch} mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" prepare
  136.     rm -rf ${work_dir}/airootfs
  137.     # rm -rf ${work_dir}/${arch}/airootfs (if low space, this helps)
  138. }
  139.  
  140. # Build ISO
  141. make_iso() {
  142.     mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -L "${iso_label}" -o "${out_dir}" iso "${iso_name}-${iso_version}-dual.iso"
  143. }
  144.  
  145. if [[ ${EUID} -ne 0 ]]; then
  146.     echo "This script must be run as root."
  147.     _usage 1
  148. fi
  149.  
  150. if [[ ${arch} != x86_64 ]]; then
  151.     echo "This script needs to be run on x86_64"
  152.     _usage 1
  153. fi
  154.  
  155. while getopts 'N:V:L:D:w:o:vh' arg; do
  156.     case "${arg}" in
  157.         N) iso_name="${OPTARG}" ;;
  158.         V) iso_version="${OPTARG}" ;;
  159.         L) iso_label="${OPTARG}" ;;
  160.         D) install_dir="${OPTARG}" ;;
  161.         w) work_dir="${OPTARG}" ;;
  162.         o) out_dir="${OPTARG}" ;;
  163.         v) verbose="-v" ;;
  164.         h) _usage 0 ;;
  165.         *)
  166.            echo "Invalid argument '${arg}'"
  167.            _usage 1
  168.            ;;
  169.     esac
  170. done
  171.  
  172. mkdir -p ${work_dir}
  173.  
  174. run_once make_pacman_conf
  175.  
  176. # Do all stuff for each airootfs
  177. for arch in x86_64; do
  178.     run_once make_basefs
  179.     run_once make_packages
  180.     run_once make_setup_mkinitcpio
  181.     run_once make_customize_airootfs
  182. done
  183.  
  184. for arch in x86_64; do
  185.     run_once make_boot
  186. done
  187.  
  188. # Do all stuff for "iso"
  189. run_once make_boot_extra
  190. run_once make_syslinux
  191. run_once make_isolinux
  192.  
  193. for arch in x86_64; do
  194.     run_once make_prepare
  195. done
  196.  
  197. run_once make_iso
Advertisement
Add Comment
Please, Sign In to add comment