99 lines
3 KiB
Bash
Executable file
99 lines
3 KiB
Bash
Executable file
#!/bin/sh
|
|
# Copyright (c) 2015, 2016, 2017, 2023 Jonas 'Sortie' Termansen.
|
|
#
|
|
# Permission to use, copy, modify, and distribute this software for any
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
# copyright notice and this permission notice appear in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
#
|
|
# update-initrd
|
|
# Generate an initrd(7) that locates and chain boots the real root filesystem.
|
|
|
|
# This script will run on the previous stable release during a sysmerge(8).
|
|
|
|
set -e
|
|
|
|
sysroot=
|
|
sysmerge=false
|
|
|
|
dashdash=
|
|
previous_option=
|
|
for argument do
|
|
if test -n "$previous_option"; then
|
|
eval $previous_option=\$argument
|
|
previous_option=
|
|
continue
|
|
fi
|
|
case $argument in
|
|
*=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
|
|
*=) parameter= ;;
|
|
*) parameter=yes ;;
|
|
esac
|
|
case $dashdash$argument in
|
|
--) dashdash=yes ;;
|
|
--sysmerge) sysmerge=true ;;
|
|
--sysroot=*) sysroot=$parameter ;;
|
|
--sysroot) previous_option=sysroot ;;
|
|
-*) echo "$0: unrecognized option $argument" >&2
|
|
$option_checking && exit 1 ;;
|
|
*) echo "$0: unexpected operand $argument" >&2
|
|
exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if test -n "$previous_option"; then
|
|
echo "$0: option '$argument' requires an argument" >&2
|
|
exit 1
|
|
fi
|
|
|
|
root="$sysroot"
|
|
output="$sysroot"
|
|
if $sysmerge; then
|
|
root="$sysroot/sysmerge"
|
|
output="$root"
|
|
# TODO: After releasing Sortix 1.1, remove the check for /sysmerge as the old
|
|
# update-initrd will invoke the newer version and expect the new version
|
|
# to notice that it is the version in /sysmerge. However, write the new
|
|
# initrd to /boot rather than /sysmerge/boot since 1.0 doesn't implement
|
|
# the new scheme.
|
|
elif [ -e /sysmerge -a "$0" = /sysmerge/sbin/update-initrd ]; then
|
|
sysmerge=true
|
|
root="$sysroot/sysmerge"
|
|
output="$sysroot"
|
|
fi
|
|
if [ ! -e "$sysroot/etc/fstab" ]; then
|
|
echo "$0: $sysroot/etc/fstab: Need a filesystem table to make an initrd" >&2
|
|
exit 1
|
|
fi
|
|
tmp=$(mktemp -d)
|
|
trap 'rm -rf "$tmp"' EXIT HUP INT QUIT TERM
|
|
mkdir "$tmp/bin"
|
|
mkdir "$tmp/sbin"
|
|
cp "$root/sbin/init" "$tmp/sbin"
|
|
cp "$root/sbin/extfs" "$tmp/sbin"
|
|
test -f "$root/sbin/fsck.ext2" &&
|
|
cp "$root/sbin/fsck.ext2" "$tmp/sbin"
|
|
mkdir "$tmp/etc"
|
|
cp "$sysroot/etc/fstab" "$tmp/etc/fstab"
|
|
mkdir "$tmp/etc/init"
|
|
if $sysmerge; then
|
|
cat > "$tmp/etc/init/default" << EOF
|
|
require chain-sysmerge exit-code
|
|
EOF
|
|
else
|
|
cat > "$tmp/etc/init/default" << EOF
|
|
require chain exit-code
|
|
EOF
|
|
fi
|
|
mkdir -p "$output/boot"
|
|
LC_AL=C ls -A "$tmp" |
|
|
tar -C "$tmp" -cf "$output/boot/sortix.initrd.new" \
|
|
--numeric-owner --owner=0 --group=0 -T -
|
|
mv "$output/boot/sortix.initrd.new" "$output/boot/sortix.initrd"
|