diff options
author | James Meyer <james.meyer@operamail.com> | 2014-10-13 17:03:13 (GMT) |
---|---|---|
committer | James Meyer <james.meyer@operamail.com> | 2014-10-13 17:03:13 (GMT) |
commit | 2e7abbab92370a4a99ad68e460c476d02296e665 (patch) | |
tree | 1d6273195dd2c4f2e22d71d26a486cbfaa77052c /build_tools/archiso-19/archiso | |
parent | 8bef8020a022c52a8d1d4bb373b5c8cdc256284f (diff) | |
download | linhes_dev-2e7abbab92370a4a99ad68e460c476d02296e665.zip |
archiso-19 + configs for linhes iso.
This provides archiso-19 but doesn't install it inside the dev env.
Diffstat (limited to 'build_tools/archiso-19/archiso')
17 files changed, 975 insertions, 0 deletions
diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso b/build_tools/archiso-19/archiso/initcpio/hooks/archiso new file mode 100644 index 0000000..4c50566 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso @@ -0,0 +1,185 @@ +# args: source, newroot, mountpoint +_mnt_fs() { + local img="${1}" + local newroot="${2}" + local mnt="${3}" + local img_fullname="${img##*/}"; + local img_name="${img_fullname%%.*}" + local dm_snap_name="${dm_snap_prefix}_${img_name}" + local ro_dev ro_dev_size rw_dev + + ro_dev=$(losetup --find --show --read-only "${img}") + echo ${ro_dev} >> /run/archiso/used_block_devices + ro_dev_size=$(blockdev --getsz ${ro_dev}) + if [[ "${cowfile_size}" == "100" ]]; then + rw_dev_size=${ro_dev_size} + else + # size calculation done in this way to avoid integer overflow when ro_dev_size is > 10.2G + rw_dev_size=$((ro_dev_size/100*cowfile_size)) + fi + + if [[ "${cow_persistent}" == "P" ]]; then + if [[ -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" ]]; then + msg ":: Found '/run/archiso/cowspace/${cow_directory}/${img_name}.cow', using as persistent." + else + msg ":: Creating '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' as persistent." + dd of="/run/archiso/cowspace/${cow_directory}/${img_name}.cow" count=0 seek=${rw_dev_size} &> /dev/null + fi + else + if [[ -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" ]]; then + msg ":: Found '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' but non-persistent requested, removing." + rm -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" + fi + msg ":: Creating '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' as non-persistent." + dd of="/run/archiso/cowspace/${cow_directory}/${img_name}.cow" count=0 seek=${rw_dev_size} &> /dev/null + fi + + rw_dev=$(losetup --find --show "/run/archiso/cowspace/${cow_directory}/${img_name}.cow") + echo ${rw_dev} >> /run/archiso/used_block_devices + + echo "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} 8" | dmsetup create ${dm_snap_name} + + _mnt_dev "/dev/mapper/${dm_snap_name}" "${newroot}${mnt}" "-w" + echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/archiso/used_block_devices +} + +# args: /path/to/image_file, mountpoint +_mnt_sfs() { + local img="${1}" + local mnt="${2}" + local img_fullname="${img##*/}" + local sfs_dev + + if [[ "${copytoram}" == "y" ]]; then + msg -n ":: Copying squashfs image to RAM..." + if ! cp "${img}" "/run/archiso/copytoram/${img_fullname}" ; then + echo "ERROR: while copy '${img}' to '/run/archiso/copytoram/${img_fullname}'" + launch_interactive_shell + fi + img="/run/archiso/copytoram/${img_fullname}" + msg "done." + fi + sfs_dev=$(losetup --find --show --read-only "${img}") + echo ${sfs_dev} >> /run/archiso/used_block_devices + _mnt_dev "${sfs_dev}" "${mnt}" "-r" +} + +# args: device, mountpoint, flags +_mnt_dev() { + local dev="${1}" + local mnt="${2}" + local flg="${3}" + + mkdir -p "${mnt}" + + msg ":: Mounting '${dev}' to '${mnt}'" + + while ! poll_device "${dev}" 30; do + echo "ERROR: '${dev}' device did not show up after 30 seconds..." + echo " Falling back to interactive prompt" + echo " You can try to fix the problem manually, log out when you are finished" + launch_interactive_shell + done + + if mount "${flg}" "${dev}" "${mnt}"; then + msg ":: Device '${dev}' mounted successfully." + else + echo "ERROR; Failed to mount '${dev}'" + echo " Falling back to interactive prompt" + echo " You can try to fix the problem manually, log out when you are finished" + launch_interactive_shell + fi +} + +_verify_checksum() { + local _status + cd "/run/archiso/bootmnt/${archisobasedir}/${arch}" + md5sum -c airootfs.md5 > /tmp/checksum.log 2>&1 + _status=$? + cd "${OLDPWD}" + return ${_status} +} + +run_hook() { + [[ -z "${arch}" ]] && arch="$(uname -m)" + [[ -z "${cowspace_size}" ]] && cowspace_size="75%" + [[ -z "${copytoram_size}" ]] && copytoram_size="75%" + [[ -z "${archisobasedir}" ]] && archisobasedir="arch" + [[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="arch" + [[ -z "${archisodevice}" ]] && archisodevice="/dev/disk/by-label/${archisolabel}" + if [[ -z "${cowfile_size}" ]]; then + cowfile_size="100" + else + cowfile_size=${cowfile_size/%} + fi + + if [[ -n "${cow_label}" ]]; then + cow_device="/dev/disk/by-label/${cow_label}" + [[ -z "${cow_persistent}" ]] && cow_persistent="P" + elif [[ -n "${cow_device}" ]]; then + [[ -z "${cow_persistent}" ]] && cow_persistent="P" + else + cow_persistent="N" + fi + + [[ -z "${cow_directory}" ]] && cow_directory="persistent_${archisolabel}/${arch}" + + # set mount handler for archiso + mount_handler="archiso_mount_handler" +} + +# This function is called normally from init script, but it can be called +# as chain from other mount handlers. +# args: /path/to/newroot +archiso_mount_handler() { + local newroot="${1}" + + if ! mountpoint -q "/run/archiso/bootmnt"; then + _mnt_dev "${archisodevice}" "/run/archiso/bootmnt" "-r" + if [[ "${copytoram}" != "y" ]]; then + echo $(readlink -f ${archisodevice}) >> /run/archiso/used_block_devices + fi + fi + + if [[ "${checksum}" == "y" ]]; then + if [[ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.md5" ]]; then + msg -n ":: Self-test requested, please wait..." + if _verify_checksum; then + msg "done. Checksum is OK, continue booting." + else + echo "ERROR: one or more files are corrupted" + echo "see /tmp/checksum.log for details" + launch_interactive_shell + fi + else + echo "ERROR: checksum=y option specified but ${archisobasedir}/${arch}/airootfs.md5 not found" + launch_interactive_shell + fi + fi + + if [[ "${copytoram}" == "y" ]]; then + msg ":: Mounting /run/archiso/copytoram (tmpfs) filesystem, size=${copytoram_size}" + mkdir -p /run/archiso/copytoram + mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /run/archiso/copytoram + fi + + if [[ -n "${cow_device}" ]]; then + _mnt_dev "${cow_device}" "/run/archiso/cowspace" "-r" + echo $(readlink -f ${cow_device}) >> /run/archiso/used_block_devices + mount -o remount,rw "/run/archiso/cowspace" + else + msg ":: Mounting /run/archiso/cowspace (tmpfs) filesystem, size=${cowspace_size}..." + mkdir -p /run/archiso/cowspace + mount -t tmpfs -o "size=${cowspace_size}",mode=0755 cowspace /run/archiso/cowspace + fi + mkdir -p "/run/archiso/cowspace/${cow_directory}" + + _mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" "/run/archiso/sfs/airootfs" + _mnt_fs "/run/archiso/sfs/airootfs/airootfs.img" "${newroot}" "/" + + if [[ "${copytoram}" == "y" ]]; then + umount /run/archiso/bootmnt + fi +} + +# vim:ft=sh:ts=4:sw=4:et: diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso_loop_mnt b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_loop_mnt new file mode 100644 index 0000000..a02cfac --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_loop_mnt @@ -0,0 +1,32 @@ +# vim: set ft=sh: + +run_hook () { + [[ -n "${img_label}" ]] && img_dev="/dev/disk/by-label/${img_label}" + if [[ -n "${img_dev}" && -n "${img_loop}" ]]; then + mount_handler="archiso_loop_mount_handler" + fi +} + +archiso_loop_mount_handler () { + newroot="${1}" + + local _dev_loop + + msg ":: Setup a loop device from ${img_loop} located at device ${img_dev}" + _mnt_dev "${img_dev}" "/run/archiso/img_dev" "-r" + if [[ "${copytoram}" != "y" ]]; then + echo $(readlink -f ${img_dev}) >> /run/archiso/used_block_devices + fi + + if ! _dev_loop=$(losetup --find --show --read-only "/run/archiso/img_dev/${img_loop}"); then + echo "ERROR: Setting loopback device for file '/run/archiso/img_dev/${img_loop}'" + launch_interactive_shell + fi + + archiso_mount_handler ${newroot} + + if [[ "${copytoram}" == "y" ]]; then + losetup -d ${_dev_loop} + umount /run/archiso/img_dev + fi +} diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_common b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_common new file mode 100644 index 0000000..d8ac709 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_common @@ -0,0 +1,50 @@ +# vim: set ft=sh: + +run_hook () { + local i net_mac bootif_mac bootif_dev + # These variables will be parsed from /tmp/net-*.conf generated by ipconfig + local DEVICE + local IPV4ADDR IPV4BROADCAST IPV4NETMASK IPV4GATEWAY IPV4DNS0 IPV4DNS1 + local HOSTNAME DNSDOMAIN NISDOMAIN ROOTSERVER ROOTPATH + local filename + # /tmp/net-*.conf + + if [[ -n "${ip}" ]]; then + if [[ -n "${BOOTIF}" ]]; then + bootif_mac=${BOOTIF#01-} + bootif_mac=${bootif_mac//-/:} + for i in /sys/class/net/*/address; do + read net_mac < ${i} + if [[ "${bootif_mac}" == "${net_mac}" ]]; then + bootif_dev=${i#/sys/class/net/} + bootif_dev=${bootif_dev%/address} + break + fi + done + ip="${ip}::${bootif_dev}" + fi + + # setup network and save some values + ipconfig "ip=${ip}" + + . /tmp/net-*.conf + + pxeserver=${ROOTSERVER} + + # setup DNS resolver + if [[ "${IPV4DNS0}" != "0.0.0.0" ]]; then + echo "nameserver ${IPV4DNS0}" > /etc/resolv.conf + fi + if [[ "${IPV4DNS1}" != "0.0.0.0" ]]; then + echo "nameserver ${IPV4DNS1}" >> /etc/resolv.conf + fi + fi +} + +run_latehook () { + [[ -z "${copy_resolvconf}" ]] && copy_resolvconf="y" + + if [[ "${copy_resolvconf}" != "n" && -f /etc/resolv.conf ]]; then + cp /etc/resolv.conf /new_root/etc/resolv.conf + fi +} diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_http b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_http new file mode 100644 index 0000000..e36fa21 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_http @@ -0,0 +1,47 @@ +# vim: set ft=sh: + +run_hook() { + if [[ -n "${ip}" && -n "${archiso_http_srv}" ]]; then + + archiso_http_srv=$(eval echo ${archiso_http_srv}) + [[ -z "${archiso_http_spc}" ]] && archiso_http_spc="75%" + + mount_handler="archiso_pxe_http_mount_handler" + fi +} + +# Fetch a file with CURL +# +# $1 URL +# $2 Destination directory inside httpspace/${archisobasedir} +_curl_get() { + local _url="${1}" + local _dst="${2}" + + msg ":: Downloading '${_url}'" + if ! curl -L -f -o "/run/archiso/httpspace/${archisobasedir}${_dst}/${_url##*/}" --create-dirs "${_url}"; then + echo "ERROR: Downloading '${_url}'" + echo " Falling back to interactive prompt" + echo " You can try to fix the problem manually, log out when you are finished" + launch_interactive_shell + fi +} + +archiso_pxe_http_mount_handler () { + newroot="${1}" + + msg ":: Mounting /run/archiso/httpspace (tmpfs) filesystem, size='${archiso_http_spc}'" + mkdir -p "/run/archiso/httpspace" + mount -t tmpfs -o size="${archiso_http_spc}",mode=0755 httpspace "/run/archiso/httpspace" + + _curl_get "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.sfs" "/${arch}" + + if [[ "${checksum}" == "y" ]]; then + _curl_get "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.md5" "/${arch}" + fi + + mkdir -p "/run/archiso/bootmnt" + mount -o bind /run/archiso/httpspace /run/archiso/bootmnt + + archiso_mount_handler ${newroot} +} diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_nbd b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_nbd new file mode 100644 index 0000000..d9bc6d8 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_nbd @@ -0,0 +1,40 @@ +# vim: set ft=sh: + +run_hook() { + if [[ -n "${ip}" && -n "${archiso_nbd_srv}" ]]; then + + archiso_nbd_srv=$(eval echo ${archiso_nbd_srv}) + [[ -z "${archiso_nbd_name}" ]] && archiso_nbd_name="archiso" + + mount_handler="archiso_pxe_nbd_mount_handler" + fi +} + +archiso_pxe_nbd_mount_handler () { + newroot="${1}" + + # Module autoloading like with loop devices does not work, doing manually... + modprobe nbd 2> /dev/null + + msg ":: Waiting for boot device..." + while ! poll_device /dev/nbd0 30; do + echo "ERROR: boot device didn't show up after 30 seconds..." + echo " Falling back to interactive prompt" + echo " You can try to fix the problem manually, log out when you are finished" + launch_interactive_shell + done + + msg ":: Setup NBD from ${archiso_nbd_srv} at /dev/nbd0" + nbd-client ${archiso_nbd_srv} -N ${archiso_nbd_name} /dev/nbd0 + + if [[ "${copytoram}" != "n" ]]; then + copytoram="y" + fi + + archisodevice=/dev/nbd0 + + archiso_mount_handler ${newroot} + + msg ":: Disconnect NBD from ${archiso_nbd_srv} at /dev/nbd0" + nbd-client -d /dev/nbd0 +} diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_nfs b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_nfs new file mode 100644 index 0000000..67874ec --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_pxe_nfs @@ -0,0 +1,30 @@ +# vim: set ft=sh: + +run_hook() { + if [[ -n "${ip}" && -n "${archiso_nfs_srv}" ]]; then + + archiso_nfs_srv=$(eval echo ${archiso_nfs_srv}) + [[ -n "${archiso_nfs_opt}" ]] && archiso_nfs_opt="-o ${archiso_nfs_opt}" + + mount_handler="archiso_nfs_mount_handler" + fi +} + +archiso_nfs_mount_handler() { + newroot="${1}" + mkdir -p "/run/archiso/bootmnt" + msg ":: Mounting '${archiso_nfs_srv}'" + # Do not put "${archiso_nfs_opt}" nfsmount fails! + if ! nfsmount ${archiso_nfs_opt} "${archiso_nfs_srv}" "/run/archiso/bootmnt"; then + echo "ERROR: Mounting '${archiso_nfs_srv}'" + echo " Falling back to interactive prompt" + echo " You can try to fix the problem manually, log out when you are finished" + launch_interactive_shell + fi + + if [[ "${copytoram}" != "n" ]]; then + copytoram="y" + fi + + archiso_mount_handler ${newroot} +} diff --git a/build_tools/archiso-19/archiso/initcpio/hooks/archiso_shutdown b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_shutdown new file mode 100644 index 0000000..e50dedb --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/hooks/archiso_shutdown @@ -0,0 +1,6 @@ +run_cleanuphook() { + rm -rf /usr/lib/modules + cp -ax / /run/initramfs +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso b/build_tools/archiso-19/archiso/initcpio/install/archiso new file mode 100644 index 0000000..8893667 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso @@ -0,0 +1,22 @@ +#!/bin/bash + +build() { + add_module "cdrom" + add_module "loop" + add_module "dm-snapshot" + + add_runscript + + add_binary /usr/lib/udev/cdrom_id + add_binary blockdev + add_binary dmsetup + add_binary losetup + add_binary mountpoint + + add_file /usr/lib/udev/rules.d/60-cdrom_id.rules + add_file /usr/lib/udev/rules.d/10-dm.rules + add_file /usr/lib/udev/rules.d/95-dm-notify.rules + add_file /usr/lib/initcpio/udev/11-dm-initramfs.rules /usr/lib/udev/rules.d/11-dm-initramfs.rules +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_kms b/build_tools/archiso-19/archiso/initcpio/install/archiso_kms new file mode 100644 index 0000000..3ff31f3 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_kms @@ -0,0 +1,26 @@ +#!/bin/bash + +build() { + add_module "radeon" + add_module "nouveau" + add_module "i915" + add_module "via-agp" + add_module "sis-agp" + add_module "intel-agp" + + if [[ $(uname -m) == i686 ]]; then + add_module "amd64-agp" + add_module "ati-agp" + add_module "sworks-agp" + add_module "ali-agp" + add_module "amd-k7-agp" + add_module "nvidia-agp" + add_module "efficeon-agp" + fi +} + +help() { + cat << HELPEOF +Adds all common KMS drivers to the initramfs image. +HELPEOF +} diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_loop_mnt b/build_tools/archiso-19/archiso/initcpio/install/archiso_loop_mnt new file mode 100644 index 0000000..59f1d94 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_loop_mnt @@ -0,0 +1,13 @@ +#!/bin/bash + +build() { + add_runscript +} + +help() { +cat<<HELPEOF + This hook loads the necessary modules for boot via loop device. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_common b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_common new file mode 100644 index 0000000..eec9a7e --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_common @@ -0,0 +1,26 @@ +#!/bin/bash + +build() { + add_checked_modules -f "(irda|phy|wimax|wireless|ppp_|plip|pppoe)" "/drivers/net/" + + add_runscript + + add_binary /usr/lib/initcpio/ipconfig /bin/ipconfig + + # Add hosts support files+dns + add_symlink /usr/lib/libnss_files.so.2 $(readlink /usr/lib/libnss_files.so.2) + add_binary $(readlink -f /usr/lib/libnss_files.so.2) + add_symlink /usr/lib/libnss_dns.so.2 $(readlink /usr/lib/libnss_dns.so.2) + add_binary $(readlink -f /usr/lib/libnss_dns.so.2) + + add_dir /etc + echo "hosts: files dns" > $BUILDROOT/etc/nsswitch.conf +} + +help() { +cat<<HELPEOF + This hook loads the necessary modules for boot via PXE. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_http b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_http new file mode 100644 index 0000000..4e02f98 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_http @@ -0,0 +1,15 @@ +#!/bin/bash + +build() { + add_runscript + + add_binary curl +} + +help() { +cat<<HELPEOF + This hook loads the necessary modules for boot via PXE and HTTP. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_nbd b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_nbd new file mode 100644 index 0000000..47d98ce --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_nbd @@ -0,0 +1,17 @@ +#!/bin/bash + +build() { + add_module "nbd" + + add_runscript + + add_binary nbd-client +} + +help() { +cat<<HELPEOF + This hook loads the necessary modules for boot via PXE and NBD. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_nfs b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_nfs new file mode 100644 index 0000000..f8226e5 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_pxe_nfs @@ -0,0 +1,17 @@ +#!/bin/bash + +build() { + add_module "nfs" + + add_runscript + + add_binary /usr/lib/initcpio/nfsmount /bin/nfsmount +} + +help() { + cat <<HELPEOF + This hook loads the necessary modules for boot via PXE and NFS. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/install/archiso_shutdown b/build_tools/archiso-19/archiso/initcpio/install/archiso_shutdown new file mode 100644 index 0000000..5ae976a --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/install/archiso_shutdown @@ -0,0 +1,20 @@ +#!/bin/bash + +build() { + add_binary cp + + add_runscript + + add_file /usr/lib/initcpio/archiso_shutdown /shutdown +} + +help() { + cat <<HELPEOF +This hook will create a shutdown initramfs in /run/initramfs +that we can pivot to on shutdown in order to unmount / and +and others mount points, dm-snapshot devices and loopback devices. +Mostly usefull for dm-snapshot persistent. +HELPEOF +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/build_tools/archiso-19/archiso/initcpio/script/archiso_shutdown b/build_tools/archiso-19/archiso/initcpio/script/archiso_shutdown new file mode 100644 index 0000000..41b3945 --- /dev/null +++ b/build_tools/archiso-19/archiso/initcpio/script/archiso_shutdown @@ -0,0 +1,37 @@ +#!/bin/ash + +# /oldroot depends on things inside /oldroot/run/archiso... +mkdir /oldrun +mount -n --move /oldroot/run /oldrun + +# Unmount all mounts now. +umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r) + +# Remove all dm-snapshot devices. +dmsetup remove_all + +# Remove all loopback devices. +for _lup in $(grep ^/dev/loop /oldrun/archiso/used_block_devices | tac); do + if ! losetup -d ${_lup} 2> /dev/null; then + umount -d ${_lup} + fi +done + +# Unmount the space used to store *.cow. +umount /oldrun/archiso/cowspace + +# Unmount boot device if needed (no copytoram=y used) +if [[ ! -d /oldrun/archiso/copytoram ]]; then + if [[ -d /oldrun/archiso/img_dev ]]; then + umount /oldrun/archiso/img_dev + else + umount /oldrun/archiso/bootmnt + fi +fi + +# reboot / poweroff / halt, depending on the argument passed by init +# if something invalid is passed, we halt +case "$1" in + reboot|poweroff|halt) "$1" -f ;; + *) halt -f;; +esac diff --git a/build_tools/archiso-19/archiso/mkarchiso b/build_tools/archiso-19/archiso/mkarchiso new file mode 100755 index 0000000..5643525 --- /dev/null +++ b/build_tools/archiso-19/archiso/mkarchiso @@ -0,0 +1,392 @@ +#!/bin/bash + +set -e -u + +export LANG=C + +app_name=${0##*/} +arch=$(uname -m) +pkg_list="" +run_cmd="" +quiet="y" +pacman_conf="/etc/pacman.conf" +export iso_label="ARCH_$(date +%Y%m)" +iso_publisher="Arch Linux <http://www.archlinux.org>" +iso_application="Arch Linux Live/Rescue CD" +install_dir="arch" +work_dir="work" +out_dir="out" +sfs_comp="xz" + +# Show an INFO message +# $1: message string +_msg_info() { + local _msg="${1}" + echo "[mkarchiso] INFO: ${_msg}" +} + +# Show an ERROR message then exit with status +# $1: message string +# $2: exit code number (with 0 does not exit) +_msg_error() { + local _msg="${1}" + local _error=${2} + echo + echo "[mkarchiso] ERROR: ${_msg}" + echo + if [[ ${_error} -gt 0 ]]; then + exit ${_error} + fi +} + +_chroot_init() { + mkdir -p ${work_dir}/airootfs + _pacman "base syslinux" +} + +_chroot_run() { + eval arch-chroot ${work_dir}/airootfs "${run_cmd}" +} + +_mount_airootfs() { + trap "_umount_airootfs" EXIT HUP INT TERM + mkdir -p "${work_dir}/mnt/airootfs" + _msg_info "Mounting '${work_dir}/airootfs.img' on '${work_dir}/mnt/airootfs'" + mount "${work_dir}/airootfs.img" "${work_dir}/mnt/airootfs" + _msg_info "Done!" +} + +_umount_airootfs() { + _msg_info "Unmounting '${work_dir}/mnt/airootfs'" + umount "${work_dir}/mnt/airootfs" + _msg_info "Done!" + rmdir "${work_dir}/mnt/airootfs" + trap - EXIT HUP INT TERM +} + +# Show help usage, with an exit status. +# $1: exit status number. +_usage () +{ + echo "usage ${app_name} [options] command <command options>" + echo " general options:" + echo " -p PACKAGE(S) Package(s) to install, can be used multiple times" + echo " -r <command> Run <command> inside airootfs" + echo " -C <file> Config file for pacman." + echo " Default: '${pacman_conf}'" + echo " -L <label> Set a label for the disk" + echo " Default: '${iso_label}'" + echo " -P <publisher> Set a publisher for the disk" + echo " Default: '${iso_publisher}'" + echo " -A <application> Set an application name for the disk" + echo " Default: '${iso_application}'" + echo " -D <install_dir> Set an install_dir. All files will by located here." + echo " Default: '${install_dir}'" + echo " NOTE: Max 8 characters, use only [a-z0-9]" + echo " -w <work_dir> Set the working directory" + echo " Default: '${work_dir}'" + echo " -o <out_dir> Set the output directory" + echo " Default: '${out_dir}'" + echo " -c <comp_type> Set SquashFS compression type (gzip, lzma, lzo, xz)" + echo " Default: '${sfs_comp}'" + echo " -v Enable verbose output" + echo " -h This message" + echo " commands:" + echo " init" + echo " Make base layout and install base group" + echo " install" + echo " Install all specified packages (-p)" + echo " run" + echo " run command specified by -r" + echo " prepare" + echo " build all images" + echo " pkglist" + echo " make a pkglist.txt of packages installed on airootfs" + echo " iso <image name>" + echo " build an iso image from the working dir" + exit ${1} +} + +# Shows configuration according to command mode. +# $1: init | install | run | prepare | iso +_show_config () { + local _mode="$1" + echo + _msg_info "Configuration settings" + _msg_info " Command: ${command_name}" + _msg_info " Architecture: ${arch}" + _msg_info " Working directory: ${work_dir}" + _msg_info " Installation directory: ${install_dir}" + case "${_mode}" in + init) + _msg_info " Pacman config file: ${pacman_conf}" + ;; + install) + _msg_info " Pacman config file: ${pacman_conf}" + _msg_info " Packages: ${pkg_list}" + ;; + run) + _msg_info " Run command: ${run_cmd}" + ;; + prepare) + ;; + pkglist) + ;; + iso) + _msg_info " Image name: ${img_name}" + _msg_info " Disk label: ${iso_label}" + _msg_info " Disk publisher: ${iso_publisher}" + _msg_info " Disk application: ${iso_application}" + ;; + esac + echo +} + +# Install desired packages to airootfs +_pacman () +{ + _msg_info "Installing packages to '${work_dir}/airootfs/'..." + + if [[ "${quiet}" = "y" ]]; then + pacstrap -C "${pacman_conf}" -c -d -G -M "${work_dir}/airootfs" $* &> /dev/null + else + pacstrap -C "${pacman_conf}" -c -d -G -M "${work_dir}/airootfs" $* + fi + + _msg_info "Packages installed successfully!" +} + +# Cleanup airootfs +_cleanup () { + _msg_info "Cleaning up what we can on airootfs..." + + # Delete initcpio image(s) + if [[ -d "${work_dir}/airootfs/boot" ]]; then + find "${work_dir}/airootfs/boot" -type f -name '*.img' -delete + fi + # Delete kernel(s) + if [[ -d "${work_dir}/airootfs/boot" ]]; then + find "${work_dir}/airootfs/boot" -type f -name 'vmlinuz*' -delete + fi + # Delete pacman database sync cache files (*.tar.gz) + if [[ -d "${work_dir}/airootfs/var/lib/pacman" ]]; then + find "${work_dir}/airootfs/var/lib/pacman" -maxdepth 1 -type f -delete + fi + # Delete pacman database sync cache + if [[ -d "${work_dir}/airootfs/var/lib/pacman/sync" ]]; then + find "${work_dir}/airootfs/var/lib/pacman/sync" -delete + fi + # Delete pacman package cache + if [[ -d "${work_dir}/airootfs/var/cache/pacman/pkg" ]]; then + find "${work_dir}/airootfs/var/cache/pacman/pkg" -type f -delete + fi + # Delete all log files, keeps empty dirs. + if [[ -d "${work_dir}/airootfs/var/log" ]]; then + find "${work_dir}/airootfs/var/log" -type f -delete + fi + # Delete all temporary files and dirs + if [[ -d "${work_dir}/airootfs/var/tmp" ]]; then + find "${work_dir}/airootfs/var/tmp" -mindepth 1 -delete + fi + # Delete package pacman related files. + find "${work_dir}" \( -name "*.pacnew" -o -name "*.pacsave" -o -name "*.pacorig" \) -delete + _msg_info "Done!" +} + +# Makes a filesystem from a source directory. +_mkairootfs () { + if [[ ! -e "${work_dir}/airootfs" ]]; then + _msg_error "The path '${work_dir}/airootfs' does not exist" 1 + fi + + _msg_info "Creating ext4 image of 32GiB..." + truncate -s 32G "${work_dir}/airootfs.img" + local _qflag="" + if [[ ${quiet} == "y" ]]; then + _qflag="-q" + fi + mkfs.ext4 ${_qflag} -O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0 -F "${work_dir}/airootfs.img" + tune2fs -c 0 -i 0 "${work_dir}/airootfs.img" &> /dev/null + _msg_info "Done!" + _mount_airootfs + _msg_info "Copying '${work_dir}/airootfs/' to '${work_dir}/mnt/airootfs/'..." + cp -aT "${work_dir}/airootfs/" "${work_dir}/mnt/airootfs/" + _msg_info "Done!" + _umount_airootfs + mkdir -p "${work_dir}/iso/${install_dir}/${arch}" + _msg_info "Creating SquashFS image, this may take some time..." + if [[ "${quiet}" = "y" ]]; then + mksquashfs "${work_dir}/airootfs.img" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress &> /dev/null + else + mksquashfs "${work_dir}/airootfs.img" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress + fi + _msg_info "Done!" + rm ${work_dir}/airootfs.img +} + +_mkchecksum () { + _msg_info "Creating checksum file for self-test..." + cd "${work_dir}/iso/${install_dir}/${arch}" + md5sum airootfs.sfs > airootfs.md5 + cd ${OLDPWD} + _msg_info "Done!" +} + +command_pkglist () { + _show_config pkglist + + _msg_info "Creating a list of installed packages on live-enviroment..." + pacman -Sl -r "${work_dir}/airootfs" --config "${pacman_conf}" | \ + awk '/\[installed\]$/ {print $1 "/" $2 "-" $3}' > \ + "${work_dir}/iso/${install_dir}/pkglist.${arch}.txt" + _msg_info "Done!" + +} + +# Create an ISO9660 filesystem from "iso" directory. +command_iso () { + local _iso_efi_boot_args="" + + if [[ ! -f "${work_dir}/iso/isolinux/isolinux.bin" ]]; then + _msg_error "The file '${work_dir}/iso/isolinux/isolinux.bin' does not exist." 1 + fi + if [[ ! -f "${work_dir}/iso/isolinux/isohdpfx.bin" ]]; then + _msg_error "The file '${work_dir}/iso/isolinux/isohdpfx.bin' does not exist." 1 + fi + + # If exists, add an EFI "El Torito" boot image (FAT filesystem) to ISO-9660 image. + if [[ -f "${work_dir}/iso/EFI/archiso/efiboot.img" ]]; then + _iso_efi_boot_args="-eltorito-alt-boot + -e EFI/archiso/efiboot.img + -no-emul-boot + -isohybrid-gpt-basdat" + fi + + _show_config iso + + mkdir -p ${out_dir} + _msg_info "Creating ISO image..." + local _qflag="" + if [[ ${quiet} == "y" ]]; then + _qflag="-quiet" + fi + xorriso -as mkisofs ${_qflag} \ + -iso-level 3 \ + -full-iso9660-filenames \ + -volid "${iso_label}" \ + -appid "${iso_application}" \ + -publisher "${iso_publisher}" \ + -preparer "prepared by mkarchiso" \ + -eltorito-boot isolinux/isolinux.bin \ + -eltorito-catalog isolinux/boot.cat \ + -no-emul-boot -boot-load-size 4 -boot-info-table \ + -isohybrid-mbr ${work_dir}/iso/isolinux/isohdpfx.bin \ + ${_iso_efi_boot_args} \ + -output "${out_dir}/${img_name}" \ + "${work_dir}/iso/" + _msg_info "Done! | $(ls -sh ${out_dir}/${img_name})" +} + +# create airootfs.sfs filesystem, and push it in "iso" directory. +command_prepare () { + _show_config prepare + + _cleanup + _mkairootfs + _mkchecksum +} + +# Install packages on airootfs. +# A basic check to avoid double execution/reinstallation is done via hashing package names. +command_install () { + if [[ ! -f "${pacman_conf}" ]]; then + _msg_error "Pacman config file '${pacman_conf}' does not exist" 1 + fi + + #trim spaces + pkg_list="$(echo ${pkg_list})" + + if [[ -z ${pkg_list} ]]; then + _msg_error "Packages must be specified" 0 + _usage 1 + fi + + _show_config install + + _pacman "${pkg_list}" +} + +command_init() { + _show_config init + _chroot_init +} + +command_run() { + _show_config run + _chroot_run +} + +if [[ ${EUID} -ne 0 ]]; then + _msg_error "This script must be run as root." 1 +fi + +while getopts 'p:r:C:L:P:A:D:w:o:c:vh' arg; do + case "${arg}" in + p) pkg_list="${pkg_list} ${OPTARG}" ;; + r) run_cmd="${OPTARG}" ;; + C) pacman_conf="${OPTARG}" ;; + L) iso_label="${OPTARG}" ;; + P) iso_publisher="${OPTARG}" ;; + A) iso_application="${OPTARG}" ;; + D) install_dir="${OPTARG}" ;; + w) work_dir="${OPTARG}" ;; + o) out_dir="${OPTARG}" ;; + c) sfs_comp="${OPTARG}" ;; + v) quiet="n" ;; + h|?) _usage 0 ;; + *) + _msg_error "Invalid argument '${arg}'" 0 + _usage 1 + ;; + esac +done + +shift $((OPTIND - 1)) + +if [[ $# -lt 1 ]]; then + _msg_error "No command specified" 0 + _usage 1 +fi +command_name="${1}" + +case "${command_name}" in + init) + command_init + ;; + install) + command_install + ;; + run) + command_run + ;; + prepare) + command_prepare + ;; + pkglist) + command_pkglist + ;; + iso) + if [[ $# -lt 2 ]]; then + _msg_error "No image specified" 0 + _usage 1 + fi + img_name="${2}" + command_iso + ;; + *) + _msg_error "Invalid command name '${command_name}'" 0 + _usage 1 + ;; +esac + +# vim:ts=4:sw=4:et: |