From fb2e8cc81820b9d3ec327d46f85922cf56f493a4 Mon Sep 17 00:00:00 2001 From: Thomas Backlund Date: Sun, 11 Mar 2012 23:48:04 +0000 Subject: add mgalive dracut module based on dmsquash-live module (needs more cleaning) --- files/90mgalive/mgalive-genrules.sh | 19 ++++ files/90mgalive/mgalive-parse.sh | 51 ++++++++++ files/90mgalive/mgalive-root.sh | 172 +++++++++++++++++++++++++++++++++ files/90mgalive/mgaliveiso-genrules.sh | 9 ++ files/90mgalive/module-setup.sh | 36 +++++++ 5 files changed, 287 insertions(+) create mode 100755 files/90mgalive/mgalive-genrules.sh create mode 100755 files/90mgalive/mgalive-parse.sh create mode 100755 files/90mgalive/mgalive-root.sh create mode 100755 files/90mgalive/mgaliveiso-genrules.sh create mode 100755 files/90mgalive/module-setup.sh (limited to 'files') diff --git a/files/90mgalive/mgalive-genrules.sh b/files/90mgalive/mgalive-genrules.sh new file mode 100755 index 0000000..afbddd3 --- /dev/null +++ b/files/90mgalive/mgalive-genrules.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh +case "$root" in + live:/dev/*) + { + printf 'KERNEL=="%s", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/mgalive-root $env{DEVNAME}"\n' \ + ${root#live:/dev/} + printf 'SYMLINK=="%s", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/mgalive-root $env{DEVNAME}"\n' \ + ${root#live:/dev/} + } >> /etc/udev/rules.d/99-mgalive.rules + wait_for_dev "${root#live:}" + ;; + live:*) + if [ -f "${root#live:}" ]; then + /sbin/initqueue --settled --onetime --unique /sbin/mgalive-root "${root#live:}" + fi + ;; +esac diff --git a/files/90mgalive/mgalive-parse.sh b/files/90mgalive/mgalive-parse.sh new file mode 100755 index 0000000..cbe0a1b --- /dev/null +++ b/files/90mgalive/mgalive-parse.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh +# live images are specified with +# root=live:backingdev + +[ -z "$root" ] && root=$(getarg root=) + +# support legacy syntax of passing liveimg and then just the base root +if getargbool 0 rd.live.image -y liveimg; then + liveroot="live:$root" +fi + +if [ "${root%%:*}" = "live" ] ; then + liveroot=$root +fi + +[ "${liveroot%%:*}" = "live" ] || return + +modprobe -q loop + +case "$liveroot" in + live:LABEL=*|LABEL=*) \ + root="${root#live:}" + root="$(echo $root | sed 's,/,\\x2f,g')" + root="live:/dev/disk/by-label/${root#LABEL=}" + rootok=1 ;; + live:CDLABEL=*|CDLABEL=*) \ + root="${root#live:}" + root="$(echo $root | sed 's,/,\\x2f,g')" + root="live:/dev/disk/by-label/${root#CDLABEL=}" + rootok=1 ;; + live:UUID=*|UUID=*) \ + root="${root#live:}" + root="live:/dev/disk/by-uuid/${root#UUID=}" + rootok=1 ;; + live:/*.[Ii][Ss][Oo]|/*.[Ii][Ss][Oo]) + root="${root#live:}" + root="liveiso:${root}" + rootok=1 ;; + live:/dev/*) + rootok=1 ;; + live:/*.[Ii][Mm][Gg]|/*.[Ii][Mm][Gg]) + [ -f "${root#live:}" ] && rootok=1 ;; +esac +info "root was $liveroot, is now $root" + +# make sure that init doesn't complain +[ -z "$root" ] && root="live" + +#wait_for_dev /dev/mapper/live-rw diff --git a/files/90mgalive/mgalive-root.sh b/files/90mgalive/mgalive-root.sh new file mode 100755 index 0000000..5c2a061 --- /dev/null +++ b/files/90mgalive/mgalive-root.sh @@ -0,0 +1,172 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh +type det_fs >/dev/null 2>&1 || . /lib/fs-lib.sh + +[ -f /tmp/root.info ] && . /tmp/root.info + +PATH=/usr/sbin:/usr/bin:/sbin:/bin + +if getargbool 0 rd.live.debug -y 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 rd.live.dir live_dir) +[ -z "$live_dir" ] && live_dir="loopbacks" +getargbool 0 rd.live.ram -y live_ram && live_ram="yes" +getargbool 0 rd.live.overlay.reset -y reset_overlay && reset_overlay="yes" +getargbool 0 rd.live.overlay.readonly -y readonly_overlay && readonly_overlay="--readonly" || readonly_overlay="" +overlay=$(getarg rd.live.overlay overlay) + +# CD/DVD media check +[ -b $livedev ] && fs=$(blkid -s TYPE -o value $livedev) +if [ "$fs" = "iso9660" -o "$fs" = "udf" ]; then + check="yes" +fi +getarg rd.live.check check || check="" +if [ -n "$check" ]; then + [ -x /bin/plymouth ] && /bin/plymouth --hide-splash + checkisomd5 --verbose $livedev || : + if [ $? -ne 0 ]; then + die "CD check failed!" + exit 1 + fi + [ -x /bin/plymouth ] && /bin/plymouth --show-splash +fi + +# determine filesystem type for a filesystem image +det_img_fs() { + blkid -s TYPE -u noraid -o value "$1" +} + +for arg in $CMDLINE; do case $arg in ro|rw) liverw=$arg ;; esac; done +# set up paths that we expect +mkdir -m 0755 -p /live/{distrib,media,memory,union} +if [ -f $livedev ]; then + # no mount needed - we've already got the LiveOS image in initramfs + # check filesystem type and handle accordingly + fstype=$(det_img_fs $livedev) + case $fstype in + squashfs) SQUASHED=$livedev;; + auto) die "cannot mount live image (unknown filesystem type)" ;; + *) FSIMG=$livedev ;; + esac + [ -e /sys/fs/$fstype ] || modprobe $fstype +else + mount -n -t $fstype -o ${liverw:-ro} $livedev /live + if [ "$?" != "0" ]; then + die "Failed to mount block device of live image" + exit 1 + fi +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 -m 0755 /run/initramfs/overlayfs + mount -n -t auto $devspec /run/initramfs/overlayfs || : + if [ -f /run/initramfs/overlayfs$pathspec -a -w /run/initramfs/overlayfs$pathspec ]; then + losetup $OVERLAY_LOOPDEV /run/initramfs/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 /run/initramfs/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 --getsz $BASE_LOOPDEV` snapshot $BASE_LOOPDEV $OVERLAY_LOOPDEV p 8 | dmsetup create $readonly_overlay live-rw +} + +# live cd helper function +do_live_from_base_loop() { +# do_live_overlay +} + +#### OLD NASH LOAD from Mga1 livecds +# nash-mount -o ro -t iso9660 LABEL=Livecd-1-GNOME /live/media +# /bin/losetup /dev/loop0 /live/media/loopbacks/distrib-lzma.sqfs +# nash-mount -o ro -t squashfs /dev/loop0 /live/distrib +# mount -t tmpfs -o mode=755 /live/memory /live/memory +# sh -c 'mount -o dirs=/live/memory=rw:/live/distrib=ro -t unionfs unionfs /live/union' +# plymouth --newroot=/live/union +# echo 0x0100 > /proc/sys/kernel/real-root-dev +# umount /sys +# sh -c 'umount /proc/bus/usb 2>/dev/null' +# umount /proc +# pivot_root /live/union /live/union/initrd +# sh -c 'rmdir /initrd/live/union' +# sh -c 'cd /initrd/live; for i in `ls -1`; do [ -d $i ] || continue; mkdir -p /live/$i; mount -n --move $i /live/$i; rmdir $i; done' +# rmdir /initrd/live +# nash-mount -o mode=0755 -t tmpfs /dev /dev +# sh -c 'rm -rf /dev/loop' +# sh -c 'mv /initrd/dev/* /dev/' +# + + +### FIXME ### DONT HARDCODE MEDIA NAME +mount -o ro -t iso9660 /dev/disk/by-label/LiveCD-2-KDE4 /live/media +losetup /dev/loop0 /live/media/loopbacks/distrib-lzma.sqfs +mount -o ro -t squashfs /dev/loop0 /live/distrib +mount -t tmpfs -o mode=755 /live/memory /live/memory +sh -c 'mount -o dirs=/live/memory=rw:/live/distrib=ro -t unionfs unionfs /live/union' +plymouth --newroot=/live/union +echo 0x0100 > /proc/sys/kernel/real-root-dev +umount /sys +sh -c 'umount /proc/bus/usb 2>/dev/null' +umount /proc +pivot_root /live/union /live/union/initrd +sh -c 'rmdir /initrd/live/union' +sh -c 'cd /initrd/live; for i in `ls -1`; do [ -d $i ] || continue; mkdir -p /live/$i; mount -n --move $i /live/$i; rmdir $i; done' +rmdir /initrd/live +#mount -o mode=0755 -t tmpfs /dev /dev +# sh -c 'rm -rf /dev/loop' +# sh -c 'mv /initrd/dev/* /dev/' + +#printf '/bin/mount %s /dev/mapper/live-rw %s\n' "$ROOTFLAGS" "$NEWROOT" > $hookdir/mount/01-$$-live.sh + +need_shutdown + +exit 0 diff --git a/files/90mgalive/mgaliveiso-genrules.sh b/files/90mgalive/mgaliveiso-genrules.sh new file mode 100755 index 0000000..946047d --- /dev/null +++ b/files/90mgalive/mgaliveiso-genrules.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh +if [ "${root%%:*}" = "liveiso" ]; then + { + printf 'KERNEL=="loop0", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/mgalive-root `/sbin/losetup -f --show %s`"\n' \ + ${root#liveiso:} + } >> /etc/udev/rules.d/99-mgaliveiso-mount.rules +fi diff --git a/files/90mgalive/module-setup.sh b/files/90mgalive/module-setup.sh new file mode 100755 index 0000000..8a6a2f8 --- /dev/null +++ b/files/90mgalive/module-setup.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh + +check() { + # a live host-only image doesn't really make a lot of sense + [[ $hostonly ]] && return 1 + return 255 +} + +depends() { + return 0 +} + +installkernel() { + instmods squashfs loop unionfs +} + +install() { + dracut_install umount + inst blkid + inst dd + inst losetup + inst grep + + dracut_install -o eject + + inst blockdev + inst_hook cmdline 30 "$moddir/mgalive-parse.sh" + inst_hook pre-udev 30 "$moddir/mgalive-genrules.sh" + inst_hook pre-udev 30 "$moddir/mgaliveiso-genrules.sh" + #inst_hook pre-pivot 20 "$moddir/apply-live-updates.sh" + inst "$moddir/mgalive-root.sh" "/sbin/mgalive-root" + # should probably just be generally included + inst_rules 60-cdrom_id.rules +} -- cgit v1.2.1