[arch-releng] [RFC] [PATCH 1/3] [archiso] Implement own chroot functions in mkarchiso
Gerardo Exequiel Pozzi
vmlinuz386 at yahoo.com.ar
Sun Mar 18 20:29:59 EDT 2012
On 03/16/2012 02:26 AM, Gerardo Exequiel Pozzi wrote:
> * Remove devtools dependency.
> * Better control over what files are touched inside chroot (root-image).
> Now: NONE :)
> * Two new commands:
> + init: To install {base} group and other needed packages (syslinux for now)
> + run: If we want to run some command inside chroot
> (mkinitcpio, locale-gen, useradd, etc etc...)
> * Renamed command: "created" to "install", says much better what does.
>
> Signed-off-by: Gerardo Exequiel Pozzi<vmlinuz386 at yahoo.com.ar>
> ---
> archiso/mkarchiso | 103 +++++++++++++++++++++++++++++++++++++--------
> configs/baseline/build.sh | 7 +--
> configs/releng/build.sh | 19 ++++++---
> 3 files changed, 102 insertions(+), 27 deletions(-)
>
> diff --git a/archiso/mkarchiso b/archiso/mkarchiso
> index b3aa5cd..df3d354 100755
> --- a/archiso/mkarchiso
> +++ b/archiso/mkarchiso
> @@ -5,6 +5,7 @@ set -e -u
> app_name=${0##*/}
> arch=$(uname -m)
> pkg_list=""
> +run_cmd=""
> quiet="y"
> pacman_conf="/etc/pacman.conf"
> export iso_label="ARCH_$(date +%Y%m)"
> @@ -44,6 +45,44 @@ _show_space_usage () {
> _msg_info "Total: ${_total} MiB (100%) | Used: ${_used} MiB (${_pct_u}) | Avail: ${_avail} MiB ($((100 - ${_pct_u%\%}))%)"
> }
>
> +_chroot_mount () {
> + mount -t devtmpfs dev "${work_dir}/root-image/dev"
> + mount -t devpts devpts "${work_dir}/root-image/dev/pts"
> + mount -t tmpfs devshm "${work_dir}/root-image/dev/shm"
> + mount -t proc proc "${work_dir}/root-image/proc"
> + mount -t tmpfs run "${work_dir}/root-image/run"
> + mount -t sysfs sys "${work_dir}/root-image/sys"
> + mount -t tmpfs tmp "${work_dir}/root-image/tmp"
> +
> + trap '_chroot_umount' EXIT HUP INT TERM
> +}
> +
> +_chroot_umount () {
> + umount "${work_dir}/root-image/tmp"
> + umount "${work_dir}/root-image/sys"
> + umount "${work_dir}/root-image/run"
> + umount "${work_dir}/root-image/proc"
> + umount "${work_dir}/root-image/dev/shm"
> + umount "${work_dir}/root-image/dev/pts"
> + umount "${work_dir}/root-image/dev"
> +
> + trap - EXIT HUP INT TERM
> +}
> +
> +_chroot_init() {
> + if [[ ! -d ${work_dir}/root-image/var/cache/pacman ]]; then
> + mkdir -p ${work_dir}/root-image/{dev,proc,run,sys,tmp,var/lib/pacman}
> + _pacman "base"
> + _pacman "syslinux"
> + fi
> +}
> +
> +_chroot_run() {
> + _chroot_mount
> + eval chroot ${work_dir}/root-image "${run_cmd}"
> + _chroot_umount
> +}
> +
> # Mount a filesystem (trap signals in case of error for unmounting it
> # $1: source image
> # $2: mount-point
> @@ -99,6 +138,7 @@ _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 root-image"
> echo " -C<file> Config file for pacman. Default ${pacman_conf}"
> echo " -L<label> Set a label for the disk"
> echo " -P<publisher> Set a publisher for the disk"
> @@ -113,9 +153,12 @@ _usage ()
> echo " -v Enable verbose output"
> echo " -h This message"
> echo " commands:"
> - echo " create"
> - echo " create a base directory layout to work with"
> - echo " includes all specified packages"
> + 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 " checksum"
> @@ -126,7 +169,7 @@ _usage ()
> }
>
> # Shows configuration according to command mode.
> -# $1: create | prepare | iso
> +# $1: init | install | run | prepare | checksum | iso
> _show_config () {
> local _mode="$1"
> echo
> @@ -136,10 +179,16 @@ _show_config () {
> _msg_info " Working directory: ${work_dir}"
> _msg_info " Installation directory: ${install_dir}"
> case "${_mode}" in
> - create)
> + 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)
> ;;
> checksum)
> @@ -159,20 +208,23 @@ _pacman ()
> {
> _msg_info "Installing packages to '${work_dir}/root-image/'..."
>
> + _chroot_mount
> +
> if [[ "${quiet}" = "y" ]]; then
> - mkarchroot -n -C "${pacman_conf}" -f "${work_dir}/root-image" $*&> /dev/null
> + pacman -Sy -r "${work_dir}/root-image" --config "${pacman_conf}" --needed --noconfirm $*&> /dev/null
> else
> - mkarchroot -n -C "${pacman_conf}" -f "${work_dir}/root-image" $*
> + pacman -Sy -r "${work_dir}/root-image" --config "${pacman_conf}" --needed --noconfirm $*
> fi
>
> - # Cleanup
> - find "${work_dir}" -name "*.pacnew" -name "*.pacsave" -name "*.pacorig" -delete
> + _chroot_umount
> +
> _msg_info "Packages installed successfully!"
> }
>
> # Cleanup root-image
> _cleanup () {
> _msg_info "Cleaning up what we can on root-image"
> +
> # remove the initcpio images that were generated for the host system
> if [[ -d "${work_dir}/root-image/boot" ]]; then
> find "${work_dir}/root-image/boot" -name '*.img' -delete
> @@ -201,6 +253,8 @@ _cleanup () {
> if [[ -d "${work_dir}/root-image/tmp" ]]; then
> find "${work_dir}/root-image/tmp" -mindepth 1 -delete
> fi
> + # Delete package pacman related files.
> + find "${work_dir}" -name "*.pacnew" -name "*.pacsave" -name "*.pacorig" -delete
> # Create etc/mtab if not is a symlink.
> if [[ ! -L "${work_dir}/root-image/etc/mtab" ]]; then
> ln -sf "/proc/self/mounts" "${work_dir}/root-image/etc/mtab"
> @@ -384,7 +438,7 @@ command_prepare () {
>
> # Install packages on root-image.
> # A basic check to avoid double execution/reinstallation is done via hashing package names.
> -command_create () {
> +command_install () {
> if [[ ! -f "${pacman_conf}" ]]; then
> _msg_error "Pacman config file '${pacman_conf}' does not exist" 1
> fi
> @@ -397,27 +451,36 @@ command_create () {
> _usage 1
> fi
>
> - _show_config create
> + _show_config install
>
> local _pkg_list_hash
> _pkg_list_hash=$(echo ${pkg_list} | sort -u | md5sum | cut -c1-32)
> - if [[ -f "${work_dir}/create.${_pkg_list_hash}" ]]; then
> + if [[ -f "${work_dir}/install.${_pkg_list_hash}" ]]; then
> _msg_info "These packages are already installed, skipping."
> else
> - mkdir -p "${work_dir}/root-image/"
> _pacman "${pkg_list}"
> - :> "${work_dir}/create.${_pkg_list_hash}"
> + :> "${work_dir}/install.${_pkg_list_hash}"
> fi
> }
>
> +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:C:L:P:A:D:w:o:vh' arg; do
> +while getopts 'p:r:C:L:P:A:D:w:o: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}" ;;
> @@ -443,8 +506,14 @@ fi
> command_name="${1}"
>
> case "${command_name}" in
> - create)
> - command_create
> + init)
> + command_init
> + ;;
> + install)
> + command_install
> + ;;
> + run)
> + command_run
> ;;
> prepare)
> command_prepare
> diff --git a/configs/baseline/build.sh b/configs/baseline/build.sh
> index 1f2251d..f7f7abf 100755
> --- a/configs/baseline/build.sh
> +++ b/configs/baseline/build.sh
> @@ -15,8 +15,7 @@ script_path=$(readlink -f ${0%/*})
>
> # Base installation (root-image)
> make_basefs() {
> - mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "base" create
> - mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "syslinux" create
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" init
> }
>
> # Copy mkinitcpio archiso hooks (root-image)
> @@ -33,7 +32,9 @@ make_setup_mkinitcpio() {
> make_boot() {
> if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then
> mkdir -p ${work_dir}/iso/${install_dir}/boot/${arch}
> - mkarchroot -n -r "mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img" ${work_dir}/root-image
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" \
> + -r 'mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img' \
> + run
> cp ${work_dir}/root-image/boot/archiso.img ${work_dir}/iso/${install_dir}/boot/${arch}/archiso.img
> cp ${work_dir}/root-image/boot/vmlinuz-linux ${work_dir}/iso/${install_dir}/boot/${arch}/vmlinuz
> :> ${work_dir}/build.${FUNCNAME}
> diff --git a/configs/releng/build.sh b/configs/releng/build.sh
> index 42836a9..f206caf 100755
> --- a/configs/releng/build.sh
> +++ b/configs/releng/build.sh
> @@ -15,13 +15,13 @@ script_path=$(readlink -f ${0%/*})
>
> # Base installation (root-image)
> make_basefs() {
> - mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "base" create
> - mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "memtest86+ syslinux mkinitcpio-nfs-utils nbd curl" create
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" init
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "memtest86+ mkinitcpio-nfs-utils nbd curl" install
> }
>
> # Additional packages (root-image)
> make_packages() {
> - mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "$(grep -v ^# ${script_path}/packages.${arch})" create
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" -p "$(grep -v ^# ${script_path}/packages.${arch})" install
> }
>
> # Copy mkinitcpio archiso hooks (root-image)
> @@ -46,7 +46,9 @@ make_boot() {
> local _src=${work_dir}/root-image
> local _dst_boot=${work_dir}/iso/${install_dir}/boot
> mkdir -p ${_dst_boot}/${arch}
> - mkarchroot -n -r "mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img" ${_src}
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" \
> + -r 'mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img' \
> + run
> mv ${_src}/boot/archiso.img ${_dst_boot}/${arch}/archiso.img
> mv ${_src}/boot/vmlinuz-linux ${_dst_boot}/${arch}/vmlinuz
> cp ${_src}/boot/memtest86+/memtest.bin ${_dst_boot}/memtest
> @@ -90,7 +92,6 @@ make_isolinux() {
> }
>
> # Customize installation (root-image)
> -# NOTE: mkarchroot should not be executed after this function is executed, otherwise will overwrites some custom files.
> make_customize_root_image() {
> if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then
> cp -af ${script_path}/root-image ${work_dir}
> @@ -99,8 +100,12 @@ make_customize_root_image() {
> mkdir -p ${work_dir}/root-image/etc/pacman.d
> wget -O ${work_dir}/root-image/etc/pacman.d/mirrorlist http://www.archlinux.org/mirrorlist/all/
> sed -i "s/#Server/Server/g" ${work_dir}/root-image/etc/pacman.d/mirrorlist
> - chroot ${work_dir}/root-image /usr/sbin/locale-gen
> - chroot ${work_dir}/root-image /usr/sbin/useradd -m -p "" -g users -G "audio,disk,optical,wheel" arch
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" \
> + -r 'locale-gen' \
> + run
> + mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" \
> + -r 'useradd -m -p "" -g users -G "audio,disk,optical,wheel" arch' \
> + run
> :> ${work_dir}/build.${FUNCNAME}
> fi
> }
I will push this to master tomorrow plus other fixes. releng scripts
should not be affected since there are no changes in "build.sh interface
specifications (?)" ;)
--
Gerardo Exequiel Pozzi
\cos^2\alpha + \sin^2\alpha = 1
More information about the arch-releng
mailing list