minix/releasetools/image.functions

356 lines
9.5 KiB
Plaintext

#
# spec file handling
#
#
# Add a directory to a spec file
#
# $1 : directory to add
# $2 : spec file
add_dir_spec() {
echo "./$1 type=dir uid=0 gid=0 mode=0755" >> ${WORK_DIR}/$2
}
#
# Add a file to a spec file
#
# $1 : file to add
# $2 : spec file
add_file_spec() {
echo "./$1 type=file uid=0 gid=0 mode=0755 size=$(wc -c < ${ROOT_DIR}/${1})" >> ${WORK_DIR}/$2
}
#
# Add a symbolic link to a spec file
#
# $1 : symlink to add
# $2 : link to
# $3 : spec file
add_link_spec() {
echo "./$1 type=link uid=0 gid=0 mode=0755 link=$2" >> ${WORK_DIR}/$3
}
#
# workdir handling
#
#
# Create the workdir (a directory where Minix is built using sets)
# spec files are put in WORK_DIR, the file system created in ROOT_DIR
#
# $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
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
# 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
}
#
# Add tarball sets to the workdir (for installation CD)
#
workdir_add_sets() {
# Add sets to the root
mkdir -p ${ROOT_DIR}/${ARCH}/binary/sets;
add_dir_spec "${ARCH}" extra.sets
add_dir_spec "${ARCH}/binary" extra.sets
add_dir_spec "${ARCH}/binary/sets" extra.sets
DEST_SETS_DIR="${ARCH}/binary/sets"
for set in ${SETS_DIR}/*.tgz; do
# Copy set itself
cp ${set} ${ROOT_DIR}/${DEST_SETS_DIR}
add_file_spec "${DEST_SETS_DIR}/$(basename ${set})" extra.sets
# Add file count
COUNT_SRC=$(echo $(basename ${set}) | sed -e "s/\(.*\)\.tgz/\set.\1/")
COUNT_NAME=$(echo $(basename ${set}) | sed -e "s/\.tgz/\.count/")
if [ -e "${DESTDIR}/etc/mtree/${COUNT_SRC}" ]
then
wc -l < ${DESTDIR}/etc/mtree/${COUNT_SRC} > ${ROOT_DIR}/${DEST_SETS_DIR}/${COUNT_NAME}
else
# Can't find mtree file, set bogus number
echo 1 > ${ROOT_DIR}/${DEST_SETS_DIR}/${COUNT_NAME}
fi
add_file_spec "${DEST_SETS_DIR}/${COUNT_NAME}" extra.sets
done
# Add checksums
cp ${SETS_DIR}/MD5 ${ROOT_DIR}/${DEST_SETS_DIR}
add_file_spec "${DEST_SETS_DIR}/MD5" extra.sets
cp ${SETS_DIR}/SHA512 ${ROOT_DIR}/${DEST_SETS_DIR}
add_file_spec "${DEST_SETS_DIR}/SHA512" extra.sets
}
#
# Add CD boot files to the workdir
#
workdir_add_cdfiles() {
# Add boot monitor
cp ${DESTDIR}/usr/mdec/boot_monitor ${ROOT_DIR}/minixboot
add_file_spec "minixboot" extra.cdfiles
# Add README
cp releasetools/release/cd/README.TXT ${ROOT_DIR}/README.TXT
add_file_spec "README.TXT" extra.cdfiles
}
#
# Extract kernel to designated directory
#
# $1: Directory where to extract
workdir_add_kernel()
{
(cd ${ROOT_DIR}; ${CROSS_TOOLS}/nbpax -rnz -f ${SETS_DIR}/minix-kernel.tgz .)
# Move kernel files to the correct directory
if [ ! -d ${ROOT_DIR}/boot/$1 ]
then
mkdir -p ${ROOT_DIR}/boot/$1
add_dir_spec "boot/$1" extra.kernel
fi
mv ${ROOT_DIR}/boot/minix/.temp/* ${ROOT_DIR}/boot/$1
rm -rf ${ROOT_DIR}/boot/minix/.temp
for i in $(cd ${ROOT_DIR}/boot/$1 && echo *)
do
add_file_spec "boot/$1/$i" extra.kernel
done
}
#
# Read METALOG and use mtree to convert the user and group names into uid and gids.
# Used as the reference mtree for building file systems.
#
create_input_spec()
{
cat ${WORK_DIR}/set* ${WORK_DIR}/extra* | ${CROSS_TOOLS}/nbmtree -N ${ROOT_DIR}/etc -C -K device > ${WORK_DIR}/input
if [ ${ASR_HACK} -eq 1 ]
then
# Hacky workaround for ASR-randomized service binaries since they don't get nicely packaged in a tarball
# add any generated ASR-randomized service binaries (but not their root directory, which is already there)
# TODO: apply stricter file permissions for both these and the base /service binaries, against local attacks
(cd ${DESTDIR} && find ./usr/service/asr -type d | sed '1d;s/$/ type=dir uid=0 gid=0 mode=0755/') >> ${WORK_DIR}/input
(cd ${DESTDIR} && find ./usr/service/asr -type f | sed 's/$/ type=file uid=0 gid=0 mode=0755/') >> ${WORK_DIR}/input
cp -r ${DESTDIR}/usr/service/asr ${ROOT_DIR}/usr/service
fi
}
#
# Split mtree into partitions and create proto files for nbmkfs.mfs
#
# $1 : partitions to create (example: usr home)
create_protos()
{
# build filter
FILTER_COMMAND="cat ${WORK_DIR}/input"
for i in $1
do
FILTER_COMMAND="$FILTER_COMMAND | grep -v \"^./$i/\" "
done
# fill root.img (skipping entries inside partitions while keeping partition mount points)
eval $FILTER_COMMAND | ${CROSS_TOOLS}/nbtoproto -b ${ROOT_DIR} -o ${WORK_DIR}/proto.root
# create proto files for partitions using toproto
for i in $1
do
cat ${WORK_DIR}/input | grep "^\./$i/\|^. " | sed "s,\./$i,\.,g" | ${CROSS_TOOLS}/nbtoproto -b ${ROOT_DIR}/$i -o ${WORK_DIR}/proto.$i
done
}
#
# Bundle packages (won't preinstall them)
#
# $1 : packages to bundle
bundle_packages()
{
if [ -z "$1" ]
then
return
fi
if [ -z $PACKAGE_DIR ]
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."
exit 1
fi
DESTPACKAGES="usr/packages/$RELEASE_VERSION/$ARCH/All"
RELEASEPACKAGE="${ROOT_DIR}/$DESTPACKAGES"
index=pkg_summary
# create directories
mkdir -p $RELEASEPACKAGE
add_dir_spec "usr/packages" extra.pkgsrc
add_dir_spec "usr/packages/$RELEASE_VERSION" extra.pkgsrc
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
do
realfn=$(echo $PACKAGE_DIR/${pkgprefix}*.tgz | cut -d' ' -f1)
if [ -f "$realfn" ]
then
# Copy package
p="$(basename $realfn)"
echo " * Bundling $p..."
cp "$realfn" "$RELEASEPACKAGE/$p"
add_file_spec "$DESTPACKAGES/$p" extra.pkgsrc
else
echo "Error: Can't find $pkgprefix in directory $PACKAGE_DIR for bundling package."
exit 1
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
# 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
}
#
# stuff executed automatically to set up environment
#
usage() {
echo "Usage: $0 [options]"
echo " -X xsrc Build with X11 located in \"xsrc\" and extract its sets for image"
echo " (do not automatically extract for installation CD)"
echo " -b Add ASR service binaries to the image"
echo " (said binaries must be built beforehand)"
echo ""
echo "Environment variables:"
echo " CREATE_IMAGE_ONLY If set to 1, skip invocation of build.sh (default: 0)"
echo " JOBS Number of CPUs to use for build.sh to use (default: 1)"
echo " SETS Sets to extract for image (default: depends on script)"
echo " BUILDVARS Extra options passed to build.sh (default: none)"
echo ""
echo " PACKAGE_DIR Path to packages to bundle (default: none)"
echo " BUNDLE_PACKAGES List of packages to bundle (default: none)"
echo " PKG_INFO Path to 'pkg_info' for bundling (default: pkg_info)"
}
# parse options
while getopts "iX:bh" c
do
case "$c" in
i) echo "This method of generating the ISO installation media is obsolete."
echo "Run ./releasetools/x86_cdimage.sh instead."
exit 1;;
X) # we don't want to extract X sets by default for the installation CD
if [ $0 != "releasetools/x86_cdimage.sh" ]
then
SETS="$SETS xbase xcomp xetc xfont xserver"
fi
MKX11=yes
export MKX11
BUILDVARS="$BUILDVARS -X $OPTARG";;
b) # bitcode build: increase partition sizes
ROOT_SIZE="$((${ROOT_SIZE} + 192*(2**20) / 512))"
USR_SIZE="$((${USR_SIZE} + 256*(2**20) / 512))"
ASR_HACK=1;;
h) usage
exit 0;;
:) usage
exit 2;;
\?)
usage
exit 2;;
esac
done
#
# Are we going to build the minix sources?
#
if [ ${CREATE_IMAGE_ONLY} -eq 1 ]
then
if [ ! -d ${DESTDIR} ]
then
echo "Minix source code doesn't appear to have been built."
echo "Please try with \$CREATE_IMAGE_ONLY set to 0."
exit 1
fi
if [ ! -d ${RELEASEDIR} ]
then
echo "Minix release tarball sets don't appear to have been created."
echo "Please try with \$CREATE_IMAGE_ONLY set to 0."
exit 1
fi
# FIXME: this won't change anything for tarballs
#${CROSS_TOOLS}/nbmake-i386 -C releasetools do-hdboot
else
echo "Going to build Minix source code..."
#
# Remove the generated files to allow us call build.sh without '-V SLOPPY_FLIST=yes'.
#
rm -f ${FSTAB}
#
# Now start the build.
#
sh ${BUILDSH} -j ${JOBS} -m ${ARCH} -O ${OBJ} -D ${DESTDIR} ${BUILDVARS} -U -u release
fi
# sanity check
if [ -d "${WORK_DIR}/.git" ]
then
echo "WORK_DIR directory has a Git repository in it, abort!"
exit 1
fi
# clean working directory
if [ -e "${WORK_DIR}" ]
then
rm -rf "${WORK_DIR}"
fi
mkdir -p ${WORK_DIR}
# get absolute paths to those directories
CROSS_TOOLS=$(cd ${CROSS_TOOLS} && pwd)
DESTDIR=$(cd ${DESTDIR} && pwd)
OBJ=$(cd ${OBJ} && pwd)
SETS_DIR=$(cd ${SETS_DIR} && pwd)
WORK_DIR=$(cd ${WORK_DIR} && pwd)
ROOT_DIR=${WORK_DIR}/fs