[arch-releng] [RFCv2] [PATCH] [archiso] Add checksum= boot param

Gerardo Exequiel Pozzi vmlinuz386 at yahoo.com.ar
Sat Aug 13 22:02:42 EDT 2011


On 08/12/2011 05:08 PM, Gerardo Exequiel Pozzi wrote:
> v2: Fixed paths inside checksums.md5 (thanks Pierre). Also fix find arguments,
> and make a separate function in archiso hook for md5sum.
>
> NOTE 1: Needs md5sum, not added here (Waiting for rebuild of mkinitcpio-busybox)
> NOTE 2: This is a draft without testing, but should works(tm).
>
> Signed-off-by: Gerardo Exequiel Pozzi<vmlinuz386 at yahoo.com.ar>
> ---
>   README                    |    4 ++++
>   archiso/hooks/archiso     |   25 +++++++++++++++++++++++++
>   archiso/mkarchiso         |   17 +++++++++++++++++
>   configs/baseline/build.sh |    1 +
>   configs/releng/build.sh   |    2 ++
>   5 files changed, 49 insertions(+), 0 deletions(-)
>
> diff --git a/README b/README
> index 4eaf904..852f3bd 100644
> --- a/README
> +++ b/README
> @@ -31,6 +31,10 @@ INDEX
>   * copytoram=        If set to "y" or just "copytoram" without arguments,
>                       all SquashFS are copied to "RAM".
>                       Default: (unset)
> +* checksum=         If set to "y" or just "checksum" without arguments,
> +                    performs a self-test of all files inside ${install_dir},
> +                    and continue booting if ok.
> +                    Default: (unset)
>   * cowspace_size=    Set the size of tmpfs /cowspace. This space is used for
>                       Copy-On-Write files of dm-snapshot.
>                       (directory not visible outside initramfs)
> diff --git a/archiso/hooks/archiso b/archiso/hooks/archiso
> index 66dbafd..0495195 100644
> --- a/archiso/hooks/archiso
> +++ b/archiso/hooks/archiso
> @@ -77,6 +77,16 @@ _mnt_sfs() {
>       fi
>   }
>
> +_verify_checksum() {
> +    local _status
> +    cd "/bootmnt/${archisobasedir}"
> +    md5sum -c checksum.md5>  /checksum.log 2>&1
> +    _status=$?
> +    cd "${OLDPWD}"
> +    return ${_status}
> +}
> +
> +
>   run_hook() {
>       [[ -z "${arch}" ]]&&  arch="$(uname -m)"
>       [[ -z "${cowspace_size}" ]]&&  cowspace_size="75%"
> @@ -135,6 +145,21 @@ archiso_mount_handler() {
>           launch_interactive_shell
>       fi
>
> +    if [[ "${checksum}" == "y" ]]; then
> +        if [[ -f "/bootmnt/${archisobasedir}/checksum.md5" ]]; then
> +            echo ":: Self-test requested, please wait..."
> +            if _verify_checksum; then
> +                echo "done. Checksum is OK, continue booting."
> +            else
> +                echo "ERROR: one or more files are corrupted, see /checksum.log for details"
> +                launch_interactive_shell
> +            fi
> +        else
> +            echo "ERROR: checksum=y option specified but checksum.md5 not found"
> +            launch_interactive_shell
> +        fi
> +    fi
> +
>       if [[ "${copytoram}" == "y" ]]; then
>           msg -n ":: Mounting /copytoram (tmpfs) filesystem, size=${copytoram_size}..."
>           mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /copytoram
> diff --git a/archiso/mkarchiso b/archiso/mkarchiso
> index 12d8936..6826441 100755
> --- a/archiso/mkarchiso
> +++ b/archiso/mkarchiso
> @@ -112,6 +112,8 @@ _usage ()
>       echo "      includes all specified packages"
>       echo "   prepare<dir>"
>       echo "      build all images"
> +    echo "   checksum<dir>"
> +    echo "      make a checksum.md5 for self-test"
>       echo "   iso<dir>  <image name>"
>       echo "      build an iso image from the working dir"
>       exit ${1}
> @@ -134,6 +136,8 @@ _show_config () {
>               ;;
>           prepare)
>               ;;
> +        checksum)
> +            ;;
>           iso)
>               _msg_info "               Image name:   ${img_name}"
>               _msg_info "               Disk label:   ${iso_label}"
> @@ -286,6 +290,16 @@ _mkfs () {
>       _umount_fs "${work_dir}/mnt/${_src}"
>   }
>
> +command_checksum () {
> +    _show_config checksum
> +
> +    _msg_info "Creating checksum file for self-test"
> +    cd "${work_dir}/iso/${install_dir}"
> +    find -type f ! -name checksum.md5 -print0 | xargs -0 md5sum>  checksum.md5
> +    cd ${OLDPWD}
> +    _msg_info "Done!"
> +}
> +
>   # Create an ISO9660 filesystem from "iso" directory.
>   command_iso () {
>       if [[ ! -f "${work_dir}/iso/isolinux/isolinux.bin" ]]; then
> @@ -428,6 +442,9 @@ case "${command_name}" in
>       prepare)
>           command_prepare
>           ;;
> +    checksum)
> +        command_checksum
> +        ;;
>       iso)
>           if [[ $# -lt 3 ]]; then
>               _msg_error "No image specified" 0
> diff --git a/configs/baseline/build.sh b/configs/baseline/build.sh
> index a07599c..eabe21f 100755
> --- a/configs/baseline/build.sh
> +++ b/configs/baseline/build.sh
> @@ -86,6 +86,7 @@ make_prepare() {
>
>   # Build ISO
>   make_iso() {
> +    mkarchiso ${verbose} checksum "${work_dir}"
>       mkarchiso ${verbose} -D "${install_dir}" -L "${iso_label}" iso "${work_dir}" "${name}-${version}-${arch}.iso"
>   }
>
> diff --git a/configs/releng/build.sh b/configs/releng/build.sh
> index d078ee2..44e41f6 100755
> --- a/configs/releng/build.sh
> +++ b/configs/releng/build.sh
> @@ -163,6 +163,7 @@ make_prepare() {
>   # args: $1 (core | netinstall)
>   make_iso() {
>       local _iso_type=${1}
> +    mkarchiso ${verbose} checksum "${work_dir}"
>       mkarchiso ${verbose} -D "${install_dir}" -L "${iso_label}" iso "${work_dir}" "${name}-${version}-${_iso_type}-${arch}.iso"
>   }
>
> @@ -206,6 +207,7 @@ make_dual() {
>               sed "s|%ARCHISO_LABEL%|${iso_label}|g;
>                    s|%INSTALL_DIR%|${install_dir}|g" ${_cfg}>  ${work_dir}/dual/iso/${install_dir}/boot/syslinux/${_cfg##*/}
>           done
> +        mkarchiso ${verbose} checksum "${work_dir}/dual"
>           mkarchiso ${verbose} -D "${install_dir}" -L "${iso_label}" iso "${work_dir}/dual" "${name}-${version}-${_iso_type}-dual.iso"
>           :>  ${work_dir}/dual/build.${FUNCNAME}_${_iso_type}
>       fi
I will merge this in 24 hours. (An improved version, only changed how 
messages are displayed). It's safe even if newer mkinitcpio-busybox does 
not hit [core], since is not enabled by default.



-- 
Gerardo Exequiel Pozzi
\cos^2\alpha + \sin^2\alpha = 1



More information about the arch-releng mailing list