From ac0ee6f22806a46ba69b3b126deacc555377c4c5 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Tue, 11 Apr 2017 18:12:47 +0200 Subject: [PATCH 1/3] Rework package bundling mechanism Setting PACKAGE_DIR without PACKAGES will default to bundling all packages in PACKAGE_DIR. PKG_INFO is also mandatory now. --- releasetools/image.functions | 92 +++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/releasetools/image.functions b/releasetools/image.functions index 77e1d78e4..d2b89815a 100644 --- a/releasetools/image.functions +++ b/releasetools/image.functions @@ -45,30 +45,35 @@ add_link_spec() # $1 : sets to extract build_workdir() { - # Extract sets mkdir -p ${ROOT_DIR} - for set in $1; do - if [ ! -e ${SETS_DIR}/${set}.tgz ]; then - echo "Missing ${SETS_DIR}/${set}.tgz, aborting" - echo "Are the release sets tarballs created?" - exit 1 + + # Don't do anything if we don't use sets + if [ -n "$1" ] + then + # Extract sets + for set in $1; do + if [ ! -e ${SETS_DIR}/${set}.tgz ]; then + echo "Missing ${SETS_DIR}/${set}.tgz, aborting" + echo "Are the release sets tarballs created?" + exit 1 + fi + echo " * Extracting $set..." + (cd ${ROOT_DIR}; ${CROSS_TOOLS}/nbpax -rnz -f ${SETS_DIR}/${set}.tgz .) + done + + # add rc (if any) + if [ -f ${RC} ]; then + cp ${RC} ${ROOT_DIR}/usr/etc/rc.local fi - echo " * Extracting $set..." - (cd ${ROOT_DIR}; ${CROSS_TOOLS}/nbpax -rnz -f ${SETS_DIR}/${set}.tgz .) - done - # add rc (if any) - if [ -f ${RC} ]; then - cp ${RC} ${ROOT_DIR}/usr/etc/rc.local + # Build login/password files + ${CROSS_TOOLS}/nbpwd_mkdb -V 0 -p -d ${ROOT_DIR} ${ROOT_DIR}/etc/master.passwd + + # Build specifications files + cp ${ROOT_DIR}/etc/mtree/set* ${WORK_DIR} + ${ROOT_DIR}/usr/bin/MAKEDEV -s -m all >> ${WORK_DIR}/extra.dev fi - # Build login/password files - ${CROSS_TOOLS}/nbpwd_mkdb -V 0 -p -d ${ROOT_DIR} ${ROOT_DIR}/etc/master.passwd - - # Build specifications files - cp ${ROOT_DIR}/etc/mtree/set* ${WORK_DIR} - ${ROOT_DIR}/usr/bin/MAKEDEV -s -m all >> ${WORK_DIR}/extra.dev - if [ ${BUNDLE_SETS} -eq 1 ] then echo " * Bundling sets..." @@ -210,7 +215,12 @@ workdir_add_kernel() # create_input_spec() { - cat ${WORK_DIR}/set* ${WORK_DIR}/extra* | ${CROSS_TOOLS}/nbmtree -N ${ROOT_DIR}/etc -C -K device > ${WORK_DIR}/input + if [ -n "$SETS" ] + then + cat ${WORK_DIR}/set* ${WORK_DIR}/extra* | ${CROSS_TOOLS}/nbmtree -N ${ROOT_DIR}/etc -C -K device > ${WORK_DIR}/input + else + cat ${WORK_DIR}/extra* | ${CROSS_TOOLS}/nbmtree -C > ${WORK_DIR}/input + fi if [ ${ASR_HACK} -eq 1 ] then @@ -350,18 +360,28 @@ create_ramdisk_image() # $1 : packages to bundle bundle_packages() { - if [ -z "$1" ] + if [ -z $PACKAGE_DIR ] then + echo " * PACKAGE_DIR not set, skipping package bundling..." return fi - if [ -z $PACKAGE_DIR ] + if [ ! -x "$(which $PKG_INFO)" ] then - echo "Error: PACKAGE_DIR is not set while trying to bundle packages." - echo "Please fetch binary packages to bundle and set PACKAGE_DIR to continue." + echo "Error: PKG_INFO ("$(which $PKG_INFO)") not executable." + echo "Can't create package index without pkg_info." + echo "Bootstrap pkgsrc on host to get pkg_info." exit 1 fi + # Bundle all available packages if no list was given + if [ -z "$1" ] + then + PACKAGES=$(for i in $(echo "$PACKAGE_DIR"/*.tgz); do basename $i | sed s/\.tgz//; done) + else + PACKAGES=$1 + fi + DESTPACKAGES="usr/packages/$RELEASE_VERSION/$ARCH/All" RELEASEPACKAGE="${ROOT_DIR}/$DESTPACKAGES" index=pkg_summary @@ -373,7 +393,7 @@ bundle_packages() add_dir_spec "usr/packages/$RELEASE_VERSION/$ARCH" extra.pkgsrc add_dir_spec "usr/packages/$RELEASE_VERSION/$ARCH/All" extra.pkgsrc add_link_spec "packages" "usr/packages" extra.pkgsrc - for pkgprefix in $1 + for pkgprefix in $PACKAGES do realfn=$(echo $PACKAGE_DIR/${pkgprefix}*.tgz | cut -d' ' -f1) if [ -f "$realfn" ] @@ -389,21 +409,15 @@ bundle_packages() fi done - if [ -x "$(which $PKG_INFO)" ] - then - # Create packages index - echo " * Generating package index..." - indexname=$indexpath/$p.$index - $PKG_INFO -X $RELEASEPACKAGE/*.tgz >> $RELEASEPACKAGE/$index + # Create packages index + echo " * Generating package index..." + indexname=$indexpath/$p.$index + $PKG_INFO -X $RELEASEPACKAGE/*.tgz >> $RELEASEPACKAGE/$index - # Compress index - echo " * Compressing index..." - bzip2 -f $RELEASEPACKAGE/$index - add_file_spec "$DESTPACKAGES/$index.bz2" extra.pkgsrc - else - echo " * Skipping package index generation." - echo " PKG_INFO ("$(which $PKG_INFO)") not executable." - fi + # Compress index + echo " * Compressing index..." + bzip2 -f $RELEASEPACKAGE/$index + add_file_spec "$DESTPACKAGES/$index.bz2" extra.pkgsrc } # From 69b57caa7097834c81e23989978b7736cf6faf56 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Tue, 11 Apr 2017 18:19:55 +0200 Subject: [PATCH 2/3] Add releasetools/pkgsrc_cdimage.sh This script uses the image generation framework to create a pkgsrc CD image, useful for MINIX installations without Internet connectivity. --- releasetools/pkgsrc_cdimage.sh | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 releasetools/pkgsrc_cdimage.sh diff --git a/releasetools/pkgsrc_cdimage.sh b/releasetools/pkgsrc_cdimage.sh new file mode 100755 index 000000000..2ebbae305 --- /dev/null +++ b/releasetools/pkgsrc_cdimage.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash +set -e + +# +# This script creates a bootable image and should at some point in the future +# be replaced by the proper NetBSD infrastructure. +# + +: ${ARCH=i386} +: ${OBJ=../obj.${ARCH}} +: ${TOOLCHAIN_TRIPLET=i586-elf32-minix-} +: ${BUILDSH=build.sh} + +: ${IMG=minix_pkgsrc.iso} +: ${SETS=} +: ${CREATE_IMAGE_ONLY=1} + +if [ ! -f ${BUILDSH} ] +then + echo "Please invoke me from the root source dir, where ${BUILDSH} is." + exit 1 +fi + +# set up disk creation environment +. releasetools/image.defaults +. releasetools/image.functions + +echo "Building work directory..." +build_workdir "$SETS" + +echo "Bundling packages..." +bundle_packages "$BUNDLE_PACKAGES" + +echo "Creating specification files..." +cat > ${WORK_DIR}/extra.base < Date: Tue, 11 Apr 2017 18:21:50 +0200 Subject: [PATCH 3/3] Fix pkgin_cd.sh --- minix/commands/pkgin_cd/pkgin_cd.sh | 58 ++++++++++++++--------------- minix/commands/setup/setup.sh | 23 +++--------- 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/minix/commands/pkgin_cd/pkgin_cd.sh b/minix/commands/pkgin_cd/pkgin_cd.sh index 697d45192..c4a0341c8 100644 --- a/minix/commands/pkgin_cd/pkgin_cd.sh +++ b/minix/commands/pkgin_cd/pkgin_cd.sh @@ -4,41 +4,41 @@ # the installation CD-ROM. RC=/usr/etc/rc.package -CDMP=/mnt -CDPACK=${CDMP}/install/packages +CDPATH=packages/$(uname -r)/$(uname -m)/All PACKSUM=pkg_summary.bz2 -cdpackages="" -cdmounted="" +# Run user rc script if [ -f "$RC" ] -then . "$RC" +then + . "$RC" fi -# Is there a usable CD to install packages from? +# Mount CD if [ -n "$cddrive" ] -then pack=${cddrive}p2 - umount $pack >/dev/null 2>&1 || true - echo "Checking for CD in $pack." - if mount -r $pack $CDMP 2>/dev/null - then fn="$CDPACK/$PACKSUM" - echo "Found." - cdmounted=1 - cdpackages=$fn - if [ ! -f $cdpackages ] - then cdpackages="" - echo "No package summary found on CD in $fn." - exit 1 - fi - else echo "Not found." - exit 1 - fi -else echo "Don't know where the install CD is. You can set it in $RC." - exit 1 +then + if [ -z $(mount | grep 'on /mnt ') ] + then + echo "Mounting $cddrive on /mnt." + mount $cddrive /mnt + fi fi -# Set package repo to CD and populate package db -export PKG_REPOS=${CDPACK} -pkgin update +# Find package summary +for i in / /mnt +do + if [ -f $i/$CDPATH/$PACKSUM ] + then + (>&2 echo "Found package summary at $i/$CDPATH/$PACKSUM.") -# Run pkgin -pkgin $@ + # Set package repo to CD and populate package db + export PKG_REPOS=$i/$CDPATH/ + pkgin update + + # Run pkgin + exec pkgin $@ + fi +done + +echo "Can't find package summary. Please mount CD first at /mnt and make sure" +echo "that $CDPATH/$PACKSUM exists on the CD." +exit 1 diff --git a/minix/commands/setup/setup.sh b/minix/commands/setup/setup.sh index cdf80c5bb..2a7e76fe1 100644 --- a/minix/commands/setup/setup.sh +++ b/minix/commands/setup/setup.sh @@ -560,10 +560,6 @@ then ln -sf minix_default /mnt/boot/minix_latest fi chroot /mnt update_bootcfg -# Save name of CD drive -cddrive="`mount | fgrep ' /usr ' | awk '{ print $1 }' | sed 's/p.*//'`" -echo "cddrive=$cddrive" >>/mnt/usr/etc/rc.package - bios="`echo $primary | sed -e 's/d./dX/g' -e 's/c.//g'`" echo "Saving random data.." @@ -576,26 +572,19 @@ echo "" /bin/netconf -p /mnt || echo FAILED TO CONFIGURE NETWORK -PACKAGES_DIR="/usr/packages/$(uname -v | cut -f2 -d' ')/$(uname -p)/All" +PACKAGES_DIR="/packages/$(uname -v | cut -f2 -d' ')/$(uname -p)/All" if [ -e "$PACKAGES_DIR" ] then echo "Installing pkgin..." - sh -c "cp $PACKAGES_DIR/pkgin-* $PACKAGES_DIR/pkg_install-* $PACKAGES_DIR/libarchive-* /mnt/tmp && chroot /mnt pkg_add /tmp/pkgin-*" rm -f /mnt/tmp/* - if [ -f "$PACKAGES_DIR/pkg_summary.bz2" ] - then - echo "" - echo "Packages are bundled on this installation media." - echo "They are available under the directory $PACKAGES_DIR" - echo "To install them after rebooting, mount this CD, set PKG_PATH to this directory" - echo "and use pkg_add." - echo "If you mount the CD at /mnt, PKG_PATH should be:" - echo "/mnt$PACKAGES_DIR" - echo "" - fi + # Save name of CD drive + cddrive=$(mount | grep ' on / ' | cut -f1 -d' ') + echo "cddrive=$cddrive" >>/mnt/usr/etc/rc.package +else + echo "Package dir not found, skipping pkgin installation..." fi if [ "$nohome" = 0 ]; then