|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
. /lib/dracut-lib.sh
|
|
|
|
[ -f /tmp/root.info ] && . /tmp/root.info
|
|
|
|
|
|
|
|
PATH=$PATH:/sbin:/usr/sbin
|
|
|
|
|
|
|
|
if getarg rdlivedebug; then
|
|
|
|
exec > /tmp/liveroot.$$.out
|
|
|
|
exec 2>> /tmp/liveroot.$$.out
|
|
|
|
set -x
|
|
|
|
fi
|
|
|
|
|
|
|
|
[ -z "$1" ] && exit 1
|
|
|
|
livedev="$1"
|
|
|
|
|
|
|
|
# parse various live image specific options that make sense to be
|
|
|
|
# specified as their own things
|
|
|
|
live_dir=$(getarg live_dir)
|
|
|
|
[ -z "$live_dir" ] && live_dir="LiveOS"
|
|
|
|
getarg live_ram && live_ram="yes"
|
|
|
|
getarg reset_overlay && reset_overlay="yes"
|
|
|
|
overlay=$(getarg overlay)
|
|
|
|
|
|
|
|
# FIXME: we need to be able to hide the plymouth splash for the check really
|
|
|
|
[ -e $livedev ] & fs=$(blkid -s TYPE -o value $livedev)
|
|
|
|
if [ "$fs" = "iso9660" -o "$fs" = "udf" ]; then
|
|
|
|
check="yes"
|
|
|
|
fi
|
|
|
|
getarg check || check=""
|
|
|
|
if [ -n "$check" ]; then
|
|
|
|
checkisomd5 --verbose $livedev || :
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
die "CD check failed!"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
getarg ro && liverw=ro
|
|
|
|
getarg rw && liverw=rw
|
|
|
|
[ -z "$liverw" ] && liverw=ro
|
|
|
|
# mount the backing of the live image first
|
|
|
|
mount -n -t $fstype -o $liverw $livedev $NEWROOT
|
|
|
|
RES=$?
|
|
|
|
if [ "$RES" != "0" ]; then
|
|
|
|
die "Failed to mount block device of live image"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
# overlay setup helper function
|
|
|
|
do_live_overlay() {
|
|
|
|
# create a sparse file for the overlay
|
|
|
|
# overlay: if non-ram overlay searching is desired, do it,
|
|
|
|
# otherwise, create traditional overlay in ram
|
|
|
|
OVERLAY_LOOPDEV=$( losetup -f )
|
|
|
|
|
|
|
|
l=$(blkid -s LABEL -o value $livedev) || l=""
|
|
|
|
u=$(blkid -s UUID -o value $livedev) || u=""
|
|
|
|
|
|
|
|
if [ -z "$overlay" ]; then
|
|
|
|
pathspec="/${live_dir}/overlay-$l-$u"
|
|
|
|
elif ( echo $overlay | grep -q ":" ); then
|
|
|
|
# pathspec specified, extract
|
|
|
|
pathspec=$( echo $overlay | sed -e 's/^.*://' )
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$pathspec" -o "$pathspec" = "auto" ]; then
|
|
|
|
pathspec="/${live_dir}/overlay-$l-$u"
|
|
|
|
fi
|
|
|
|
devspec=$( echo $overlay | sed -e 's/:.*$//' )
|
|
|
|
|
|
|
|
# need to know where to look for the overlay
|
|
|
|
setup=""
|
|
|
|
if [ -n "$devspec" -a -n "$pathspec" -a -n "$overlay" ]; then
|
|
|
|
mkdir /overlayfs
|
|
|
|
mount -n -t auto $devspec /overlayfs || :
|
|
|
|
if [ -f /overlayfs$pathspec -a -w /overlayfs$pathspec ]; then
|
|
|
|
losetup $OVERLAY_LOOPDEV /overlayfs$pathspec
|
|
|
|
if [ -n "$reset_overlay" ]; then
|
|
|
|
dd if=/dev/zero of=$OVERLAY_LOOPDEV bs=64k count=1 2>/dev/null
|
|
|
|
fi
|
|
|
|
setup="yes"
|
|
|
|
fi
|
|
|
|
umount -l /overlayfs || :
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -z "$setup" ]; then
|
|
|
|
if [ -n "$devspec" -a -n "$pathspec" ]; then
|
|
|
|
warn "Unable to find persistent overlay; using temporary"
|
|
|
|
sleep 5
|
|
|
|
fi
|
|
|
|
|
|
|
|
dd if=/dev/null of=/overlay bs=1024 count=1 seek=$((512*1024)) 2> /dev/null
|
|
|
|
losetup $OVERLAY_LOOPDEV /overlay
|
|
|
|
fi
|
|
|
|
|
|
|
|
# set up the snapshot
|
|
|
|
echo 0 `blockdev --getsize $BASE_LOOPDEV` snapshot $BASE_LOOPDEV $OVERLAY_LOOPDEV p 8 | dmsetup create live-rw
|
|
|
|
}
|
|
|
|
|
|
|
|
# live cd helper function
|
|
|
|
do_live_from_base_loop() {
|
|
|
|
do_live_overlay
|
|
|
|
}
|
|
|
|
|
|
|
|
# we might have a genMinInstDelta delta file for anaconda to take advantage of
|
|
|
|
if [ -e $NEWROOT/${live_dir}/osmin.img ]; then
|
|
|
|
OSMINSQFS=$NEWROOT/${live_dir}/osmin.img
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "$OSMINSQFS" ]; then
|
|
|
|
# decompress the delta data
|
|
|
|
dd if=$OSMINSQFS of=/osmin.img 2> /dev/null
|
|
|
|
OSMIN_SQUASHED_LOOPDEV=$( losetup -f )
|
|
|
|
losetup -r $OSMIN_SQUASHED_LOOPDEV /osmin.img
|
|
|
|
mkdir -p /squashfs.osmin
|
|
|
|
mount -n -t squashfs -o ro $OSMIN_SQUASHED_LOOPDEV /squashfs.osmin
|
|
|
|
OSMIN_LOOPDEV=$( losetup -f )
|
|
|
|
losetup -r $OSMIN_LOOPDEV /squashfs.osmin/osmin
|
|
|
|
umount -l /squashfs.osmin
|
|
|
|
fi
|
|
|
|
|
|
|
|
# we might have just an embedded ext3 to use as rootfs (uncompressed live)
|
|
|
|
if [ -e $NEWROOT/${live_dir}/ext3fs.img ]; then
|
|
|
|
EXT3FS="$NEWROOT/${live_dir}/ext3fs.img"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -n "$EXT3FS" ] ; then
|
|
|
|
BASE_LOOPDEV=$( losetup -f )
|
|
|
|
losetup -r $BASE_LOOPDEV $EXT3FS
|
|
|
|
umount -l $NEWROOT
|
|
|
|
|
|
|
|
do_live_from_base_loop
|
|
|
|
fi
|
|
|
|
|
|
|
|
# we might have an embedded ext3 on squashfs to use as rootfs (compressed live)
|
|
|
|
if [ -e $NEWROOT/${live_dir}/squashfs.img ]; then
|
|
|
|
SQUASHED="$NEWROOT/${live_dir}/squashfs.img"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -e "$SQUASHED" ] ; then
|
|
|
|
if [ -n "$live_ram" ] ; then
|
|
|
|
echo "Copying live image to RAM..."
|
|
|
|
echo "(this may take a few minutes)"
|
|
|
|
dd if=$SQUASHED of=/squashed.img bs=512 2> /dev/null
|
|
|
|
umount -n $NEWROOT
|
|
|
|
echo "Done copying live image to RAM."
|
|
|
|
eject -p $livedev || :
|
|
|
|
SQUASHED="/squashed.img"
|
|
|
|
fi
|
|
|
|
|
|
|
|
SQUASHED_LOOPDEV=$( losetup -f )
|
|
|
|
losetup -r $SQUASHED_LOOPDEV $SQUASHED
|
|
|
|
mkdir -p /squashfs
|
|
|
|
mount -n -t squashfs -o ro $SQUASHED_LOOPDEV /squashfs
|
|
|
|
|
|
|
|
BASE_LOOPDEV=$( losetup -f )
|
|
|
|
losetup -r $BASE_LOOPDEV /squashfs/LiveOS/ext3fs.img
|
|
|
|
|
|
|
|
umount -l /squashfs
|
|
|
|
if [ -z "$live_ram" ] ; then
|
|
|
|
umount -l $NEWROOT
|
|
|
|
fi
|
|
|
|
|
|
|
|
do_live_from_base_loop
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ -b "$OSMIN_LOOPDEV" ]; then
|
|
|
|
# set up the devicemapper snapshot device, which will merge
|
|
|
|
# the normal live fs image, and the delta, into a minimzied fs image
|
|
|
|
echo "0 $( blockdev --getsize $BASE_LOOPDEV ) snapshot $BASE_LOOPDEV $OSMIN_LOOPDEV p 8" | dmsetup create --readonly live-osimg-min
|
|
|
|
fi
|
|
|
|
|
|
|
|
ln -s /dev/mapper/live-rw /dev/root
|
|
|
|
printf '/bin/mount /dev/mapper/live-rw %s\n' "$NEWROOT" > /mount/01-$$-live.sh
|
|
|
|
|
|
|
|
exit 0
|