From 5df61f0c9e89725b59d0e975d6e320fa0ea579ba Mon Sep 17 00:00:00 2001 From: Gerardo Exequiel Pozzi Date: Sat, 25 Aug 2012 15:14:51 -0300 Subject: [archiso] Rework Makefile / Reorder files Signed-off-by: Gerardo Exequiel Pozzi --- archiso/archiso_shutdown | 37 ------ archiso/hooks/archiso | 198 ---------------------------- archiso/hooks/archiso_loop_mnt | 32 ----- archiso/hooks/archiso_pxe_common | 50 ------- archiso/hooks/archiso_pxe_http | 61 --------- archiso/hooks/archiso_pxe_nbd | 37 ------ archiso/hooks/archiso_pxe_nfs | 27 ---- archiso/hooks/archiso_shutdown | 6 - archiso/initcpio/hooks/archiso | 198 ++++++++++++++++++++++++++++ archiso/initcpio/hooks/archiso_loop_mnt | 32 +++++ archiso/initcpio/hooks/archiso_pxe_common | 50 +++++++ archiso/initcpio/hooks/archiso_pxe_http | 61 +++++++++ archiso/initcpio/hooks/archiso_pxe_nbd | 37 ++++++ archiso/initcpio/hooks/archiso_pxe_nfs | 27 ++++ archiso/initcpio/hooks/archiso_shutdown | 6 + archiso/initcpio/install/archiso | 22 ++++ archiso/initcpio/install/archiso_kms | 26 ++++ archiso/initcpio/install/archiso_loop_mnt | 13 ++ archiso/initcpio/install/archiso_pxe_common | 26 ++++ archiso/initcpio/install/archiso_pxe_http | 15 +++ archiso/initcpio/install/archiso_pxe_nbd | 17 +++ archiso/initcpio/install/archiso_pxe_nfs | 17 +++ archiso/initcpio/install/archiso_shutdown | 20 +++ archiso/initcpio/script/archiso_shutdown | 37 ++++++ archiso/install/archiso | 22 ---- archiso/install/archiso_kms | 26 ---- archiso/install/archiso_loop_mnt | 13 -- archiso/install/archiso_pxe_common | 26 ---- archiso/install/archiso_pxe_http | 15 --- archiso/install/archiso_pxe_nbd | 17 --- archiso/install/archiso_pxe_nfs | 17 --- archiso/install/archiso_shutdown | 20 --- 32 files changed, 604 insertions(+), 604 deletions(-) delete mode 100644 archiso/archiso_shutdown delete mode 100644 archiso/hooks/archiso delete mode 100644 archiso/hooks/archiso_loop_mnt delete mode 100644 archiso/hooks/archiso_pxe_common delete mode 100644 archiso/hooks/archiso_pxe_http delete mode 100644 archiso/hooks/archiso_pxe_nbd delete mode 100644 archiso/hooks/archiso_pxe_nfs delete mode 100644 archiso/hooks/archiso_shutdown create mode 100644 archiso/initcpio/hooks/archiso create mode 100644 archiso/initcpio/hooks/archiso_loop_mnt create mode 100644 archiso/initcpio/hooks/archiso_pxe_common create mode 100644 archiso/initcpio/hooks/archiso_pxe_http create mode 100644 archiso/initcpio/hooks/archiso_pxe_nbd create mode 100644 archiso/initcpio/hooks/archiso_pxe_nfs create mode 100644 archiso/initcpio/hooks/archiso_shutdown create mode 100644 archiso/initcpio/install/archiso create mode 100644 archiso/initcpio/install/archiso_kms create mode 100644 archiso/initcpio/install/archiso_loop_mnt create mode 100644 archiso/initcpio/install/archiso_pxe_common create mode 100644 archiso/initcpio/install/archiso_pxe_http create mode 100644 archiso/initcpio/install/archiso_pxe_nbd create mode 100644 archiso/initcpio/install/archiso_pxe_nfs create mode 100644 archiso/initcpio/install/archiso_shutdown create mode 100644 archiso/initcpio/script/archiso_shutdown delete mode 100644 archiso/install/archiso delete mode 100644 archiso/install/archiso_kms delete mode 100644 archiso/install/archiso_loop_mnt delete mode 100644 archiso/install/archiso_pxe_common delete mode 100644 archiso/install/archiso_pxe_http delete mode 100644 archiso/install/archiso_pxe_nbd delete mode 100644 archiso/install/archiso_pxe_nfs delete mode 100644 archiso/install/archiso_shutdown (limited to 'archiso') diff --git a/archiso/archiso_shutdown b/archiso/archiso_shutdown deleted file mode 100644 index 41b3945..0000000 --- a/archiso/archiso_shutdown +++ /dev/null @@ -1,37 +0,0 @@ -#!/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/archiso/hooks/archiso b/archiso/hooks/archiso deleted file mode 100644 index 9445498..0000000 --- a/archiso/hooks/archiso +++ /dev/null @@ -1,198 +0,0 @@ -# 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 [[ "${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=${ro_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=${ro_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 - echo "/dev/mapper/${dm_snap_name} ${mnt} auto defaults 0 0" >> ${newroot}/etc/fstab -} - -# 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}" - md5sum -c checksum.${arch}.md5 > /tmp/checksum.${arch}.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 "${aitab}" ]]; then - aitab="/run/archiso/bootmnt/${archisobasedir}/aitab" - else - aitab="/run/archiso/bootmnt/${archisobasedir}/${aitab}" - 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 [[ ! -f "${aitab}" ]]; then - echo "ERROR: '${aitab}' file does not exist." - 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 [[ "${checksum}" == "y" ]]; then - if [[ -f "/run/archiso/bootmnt/${archisobasedir}/checksum.${arch}.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.${arch}.log for details" - launch_interactive_shell - fi - else - echo "ERROR: checksum=y option specified but checksum.${arch}.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}" - - local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size - while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do - [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue - [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue - if [[ "${aitab_fs_type}" != "none" ]]; then - _mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/run/archiso/sfs/${aitab_img}" - _mnt_fs "/run/archiso/sfs/${aitab_img}/${aitab_img}.fs" "${newroot}" "${aitab_mnt}" - else - _mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.sfs" "${newroot}${aitab_mnt}" - fi - done < "${aitab}" - - if [[ "${copytoram}" == "y" ]]; then - umount /run/archiso/bootmnt - fi -} - -# vim:ft=sh:ts=4:sw=4:et: diff --git a/archiso/hooks/archiso_loop_mnt b/archiso/hooks/archiso_loop_mnt deleted file mode 100644 index a02cfac..0000000 --- a/archiso/hooks/archiso_loop_mnt +++ /dev/null @@ -1,32 +0,0 @@ -# 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/archiso/hooks/archiso_pxe_common b/archiso/hooks/archiso_pxe_common deleted file mode 100644 index d8ac709..0000000 --- a/archiso/hooks/archiso_pxe_common +++ /dev/null @@ -1,50 +0,0 @@ -# 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/archiso/hooks/archiso_pxe_http b/archiso/hooks/archiso_pxe_http deleted file mode 100644 index 32e8ab0..0000000 --- a/archiso/hooks/archiso_pxe_http +++ /dev/null @@ -1,61 +0,0 @@ -# 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" - - local _aitab_url="${archiso_http_srv}${aitab#/run/archiso/bootmnt/}" - local _aitab_file="/run/archiso/httpspace/${aitab#/run/archiso/bootmnt/}" - - _curl_get "${_aitab_url}" "/" - - local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size - while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do - [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue - [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue - if [[ "${aitab_fs_type}" != "none" ]]; then - _curl_get "${archiso_http_srv}${archisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/${aitab_arch}" - else - _curl_get "${archiso_http_srv}${archisobasedir}/${aitab_arch}/${aitab_img}.sfs" "/${aitab_arch}" - fi - done < "${_aitab_file}" - - if [[ "${checksum}" == "y" ]]; then - _curl_get "${archiso_http_srv}${archisobasedir}/checksum.${arch}.md5" "/" - fi - - mkdir -p "/run/archiso/bootmnt" - mount -o bind /run/archiso/httpspace /run/archiso/bootmnt - - archiso_mount_handler ${newroot} -} diff --git a/archiso/hooks/archiso_pxe_nbd b/archiso/hooks/archiso_pxe_nbd deleted file mode 100644 index a9f84d5..0000000 --- a/archiso/hooks/archiso_pxe_nbd +++ /dev/null @@ -1,37 +0,0 @@ -# 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 - - copytoram="y" - 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/archiso/hooks/archiso_pxe_nfs b/archiso/hooks/archiso_pxe_nfs deleted file mode 100644 index ef41c01..0000000 --- a/archiso/hooks/archiso_pxe_nfs +++ /dev/null @@ -1,27 +0,0 @@ -# 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 - - copytoram="y" - archiso_mount_handler ${newroot} -} diff --git a/archiso/hooks/archiso_shutdown b/archiso/hooks/archiso_shutdown deleted file mode 100644 index e50dedb..0000000 --- a/archiso/hooks/archiso_shutdown +++ /dev/null @@ -1,6 +0,0 @@ -run_cleanuphook() { - rm -rf /usr/lib/modules - cp -ax / /run/initramfs -} - -# vim: set ft=sh ts=4 sw=4 et: diff --git a/archiso/initcpio/hooks/archiso b/archiso/initcpio/hooks/archiso new file mode 100644 index 0000000..9445498 --- /dev/null +++ b/archiso/initcpio/hooks/archiso @@ -0,0 +1,198 @@ +# 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 [[ "${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=${ro_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=${ro_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 + echo "/dev/mapper/${dm_snap_name} ${mnt} auto defaults 0 0" >> ${newroot}/etc/fstab +} + +# 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}" + md5sum -c checksum.${arch}.md5 > /tmp/checksum.${arch}.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 "${aitab}" ]]; then + aitab="/run/archiso/bootmnt/${archisobasedir}/aitab" + else + aitab="/run/archiso/bootmnt/${archisobasedir}/${aitab}" + 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 [[ ! -f "${aitab}" ]]; then + echo "ERROR: '${aitab}' file does not exist." + 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 [[ "${checksum}" == "y" ]]; then + if [[ -f "/run/archiso/bootmnt/${archisobasedir}/checksum.${arch}.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.${arch}.log for details" + launch_interactive_shell + fi + else + echo "ERROR: checksum=y option specified but checksum.${arch}.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}" + + local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size + while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do + [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue + [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue + if [[ "${aitab_fs_type}" != "none" ]]; then + _mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/run/archiso/sfs/${aitab_img}" + _mnt_fs "/run/archiso/sfs/${aitab_img}/${aitab_img}.fs" "${newroot}" "${aitab_mnt}" + else + _mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.sfs" "${newroot}${aitab_mnt}" + fi + done < "${aitab}" + + if [[ "${copytoram}" == "y" ]]; then + umount /run/archiso/bootmnt + fi +} + +# vim:ft=sh:ts=4:sw=4:et: diff --git a/archiso/initcpio/hooks/archiso_loop_mnt b/archiso/initcpio/hooks/archiso_loop_mnt new file mode 100644 index 0000000..a02cfac --- /dev/null +++ b/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/archiso/initcpio/hooks/archiso_pxe_common b/archiso/initcpio/hooks/archiso_pxe_common new file mode 100644 index 0000000..d8ac709 --- /dev/null +++ b/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/archiso/initcpio/hooks/archiso_pxe_http b/archiso/initcpio/hooks/archiso_pxe_http new file mode 100644 index 0000000..32e8ab0 --- /dev/null +++ b/archiso/initcpio/hooks/archiso_pxe_http @@ -0,0 +1,61 @@ +# 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" + + local _aitab_url="${archiso_http_srv}${aitab#/run/archiso/bootmnt/}" + local _aitab_file="/run/archiso/httpspace/${aitab#/run/archiso/bootmnt/}" + + _curl_get "${_aitab_url}" "/" + + local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size + while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type aitab_fs_size; do + [[ "${aitab_img#\#}" != "${aitab_img}" ]] && continue + [[ "${aitab_arch}" != "any" && "${aitab_arch}" != "${arch}" ]] && continue + if [[ "${aitab_fs_type}" != "none" ]]; then + _curl_get "${archiso_http_srv}${archisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs" "/${aitab_arch}" + else + _curl_get "${archiso_http_srv}${archisobasedir}/${aitab_arch}/${aitab_img}.sfs" "/${aitab_arch}" + fi + done < "${_aitab_file}" + + if [[ "${checksum}" == "y" ]]; then + _curl_get "${archiso_http_srv}${archisobasedir}/checksum.${arch}.md5" "/" + fi + + mkdir -p "/run/archiso/bootmnt" + mount -o bind /run/archiso/httpspace /run/archiso/bootmnt + + archiso_mount_handler ${newroot} +} diff --git a/archiso/initcpio/hooks/archiso_pxe_nbd b/archiso/initcpio/hooks/archiso_pxe_nbd new file mode 100644 index 0000000..a9f84d5 --- /dev/null +++ b/archiso/initcpio/hooks/archiso_pxe_nbd @@ -0,0 +1,37 @@ +# 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 + + copytoram="y" + 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/archiso/initcpio/hooks/archiso_pxe_nfs b/archiso/initcpio/hooks/archiso_pxe_nfs new file mode 100644 index 0000000..ef41c01 --- /dev/null +++ b/archiso/initcpio/hooks/archiso_pxe_nfs @@ -0,0 +1,27 @@ +# 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 + + copytoram="y" + archiso_mount_handler ${newroot} +} diff --git a/archiso/initcpio/hooks/archiso_shutdown b/archiso/initcpio/hooks/archiso_shutdown new file mode 100644 index 0000000..e50dedb --- /dev/null +++ b/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/archiso/initcpio/install/archiso b/archiso/initcpio/install/archiso new file mode 100644 index 0000000..8893667 --- /dev/null +++ b/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/archiso/initcpio/install/archiso_kms b/archiso/initcpio/install/archiso_kms new file mode 100644 index 0000000..3ff31f3 --- /dev/null +++ b/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/archiso/initcpio/install/archiso_loop_mnt b/archiso/initcpio/install/archiso_loop_mnt new file mode 100644 index 0000000..59f1d94 --- /dev/null +++ b/archiso/initcpio/install/archiso_loop_mnt @@ -0,0 +1,13 @@ +#!/bin/bash + +build() { + add_runscript +} + +help() { +cat< $BUILDROOT/etc/nsswitch.conf +} + +help() { +cat< /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/archiso/install/archiso b/archiso/install/archiso deleted file mode 100644 index 8893667..0000000 --- a/archiso/install/archiso +++ /dev/null @@ -1,22 +0,0 @@ -#!/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/archiso/install/archiso_kms b/archiso/install/archiso_kms deleted file mode 100644 index 3ff31f3..0000000 --- a/archiso/install/archiso_kms +++ /dev/null @@ -1,26 +0,0 @@ -#!/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/archiso/install/archiso_loop_mnt b/archiso/install/archiso_loop_mnt deleted file mode 100644 index 59f1d94..0000000 --- a/archiso/install/archiso_loop_mnt +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -build() { - add_runscript -} - -help() { -cat< $BUILDROOT/etc/nsswitch.conf -} - -help() { -cat<