You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.6 KiB
79 lines
2.6 KiB
7 years ago
|
#!/bin/sh
|
||
|
|
||
|
die() { warn "$*"; exit 1; }
|
||
|
|
||
|
upgradedir="${NEWROOT}/system-upgrade-root"
|
||
|
|
||
|
[ -d "$upgradedir" ] || die "'$upgradedir' doesn't exist"
|
||
|
|
||
|
echo "saving initramfs to $upgradedir"
|
||
|
|
||
|
mount -t tmpfs -o mode=755 tmpfs "$upgradedir" \
|
||
|
|| die "Can't mount tmpfs for $upgradedir"
|
||
|
|
||
|
cp -ax / "$upgradedir" || die "failed to save initramfs to $upgradedir"
|
||
|
|
||
|
# switch off initrd mode
|
||
|
rm -f "$upgradedir/etc/initrd-release"
|
||
|
# make sure we have os-release
|
||
|
ln -sf "system-upgrade-release" "$upgradedir/etc/os-release"
|
||
|
|
||
|
create_newroot_dir() {
|
||
|
local newdir="$1"
|
||
|
|
||
|
# Save the current mount options
|
||
|
# mountinfo consists of lines of the form:
|
||
|
# <mount-ID> <parent-ID> <major>:<minor> <root> <mount point> <options> <optional fields> ... - <fstype> <source> <super options>
|
||
|
#
|
||
|
# This loops assumes that $NEWROOT is a mount point and that we can
|
||
|
# ignore <root>, since nothing should be mounted in a chroot jail yet
|
||
|
local old_opts=""
|
||
|
local mount_id parent_id major_minor root mount_point options rest
|
||
|
while read -r mount_id parent_id major_minor root mount_point options \
|
||
|
rest ; do
|
||
|
if [ "$mount_point" = "$NEWROOT" ]; then
|
||
|
old_opts="$options"
|
||
|
break
|
||
|
fi
|
||
|
done < /proc/self/mountinfo
|
||
|
if [ -z "$old_opts" ]; then
|
||
|
old_opts="defaults"
|
||
|
fi
|
||
|
|
||
|
if [ ! -d "$NEWROOT/$newdir" ]; then
|
||
|
# attempt to create the dir if it's not already present.
|
||
|
# NOTE: this is somewhat unreliable and should be avoided if possible,
|
||
|
# e.g. by making sure the required dirs exist before reboot
|
||
|
mount -o remount,rw "$NEWROOT"
|
||
|
mkdir -p "$NEWROOT/$newdir"
|
||
|
mount -o remount,"$old_opts" "$NEWROOT"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
bind_into_newroot() {
|
||
|
local dir="$1"
|
||
|
echo "making /$dir available inside $NEWROOT"
|
||
|
create_newroot_dir "$dir"
|
||
|
mount --bind $upgradedir/$dir $NEWROOT/$dir \
|
||
|
|| warn "failed to bind /$dir into $NEWROOT"
|
||
|
# leave a note for upgrade-prep.service
|
||
|
> $NEWROOT/$dir/.please-unmount
|
||
|
}
|
||
|
|
||
|
# make our kernel modules available inside the system so we can load drivers
|
||
|
bind_into_newroot lib/modules/$(uname -r)
|
||
|
|
||
|
# plymouthd will crash if it tries to load a plymouth module from a previous
|
||
|
# version that was ABI-incompatible (e.g. F17 label.so in F18 plymouthd).
|
||
|
plydir=lib/plymouth
|
||
|
[ -d /$plydir ] || plydir=lib64/plymouth
|
||
|
bind_into_newroot $plydir
|
||
|
|
||
|
# Create /run in $NEWROOT if not already available
|
||
|
create_newroot_dir run
|
||
|
|
||
|
# If $NEWROOT does not use systemd, mask out initrd-udevadm-cleanup-db since
|
||
|
# nothing will be repopulating the data
|
||
|
[ -x "$NEWROOT/usr/lib/systemd/systemd" ] || \
|
||
|
ln -sf /dev/null /etc/systemd/system/initrd-udevadm-cleanup-db.service
|