summaryrefslogtreecommitdiff
path: root/src/core/libs/lib-blockdevices-filesystems.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/libs/lib-blockdevices-filesystems.sh')
-rw-r--r--src/core/libs/lib-blockdevices-filesystems.sh285
1 files changed, 285 insertions, 0 deletions
diff --git a/src/core/libs/lib-blockdevices-filesystems.sh b/src/core/libs/lib-blockdevices-filesystems.sh
new file mode 100644
index 0000000..a3bc099
--- /dev/null
+++ b/src/core/libs/lib-blockdevices-filesystems.sh
@@ -0,0 +1,285 @@
+#!/bin/sh
+
+# procedural code from quickinst functionized and fixed.
+# there were functions like this in the setup script too, with some subtle differences. see below
+# NOTE: why were the functions in the setup called CHROOT_mount/umount? this is not chrooting ?
+target_special_fs ()
+{
+ [ "$1" = on -o "$1" = off ] || die_error "special_fs needs on/off argument"
+ if [ "$1" = on ]
+ then
+ # mount proc/sysfs first, so mkinitrd can use auto-detection if it wants
+ ! [ -d $var_TARGET_DIR/proc ] && mkdir $var_TARGET_DIR/proc
+ ! [ -d $var_TARGET_DIR/sys ] && mkdir $var_TARGET_DIR/sys
+ ! [ -d $var_TARGET_DIR/dev ] && mkdir $var_TARGET_DIR/dev
+ #mount, if not mounted yet
+ mount | grep -q "$var_TARGET_DIR/proc" || mount -t proc none $var_TARGET_DIR/proc || die_error "Could not mount $var_TARGET_DIR/proc" #NOTE: setup script uses mount -t proc proc ? what's best?
+ mount | grep -q "$var_TARGET_DIR/sys" || mount -t sysfs none $var_TARGET_DIR/sys || die_error "Could not mount $var_TARGET_DIR/sys" # NOTE: setup script uses mount -t sysfs sysfs ? what's best?
+ mount | grep -q "$var_TARGET_DIR/dev" || mount -o bind /dev $var_TARGET_DIR/dev || die_error "Could not mount $var_TARGET_DIR/dev"
+ elif [ "$1" = off ]
+ then
+ umount $var_TARGET_DIR/proc || die_error "Could not umount $var_TARGET_DIR/proc"
+ umount $var_TARGET_DIR/sys || die_error "Could not umount $var_TARGET_DIR/sys"
+ umount $var_TARGET_DIR/dev || die_error "Could not umount $var_TARGET_DIR/dev"
+ fi
+}
+
+
+# taken from setup
+# Disable swap and all mounted partitions for the destination system. Unmount
+# the destination root partition last!
+target_umountall()
+{
+ notify "Disabling swapspace, unmounting already mounted disk devices..."
+ swapoff -a >/dev/null 2>&1
+ umount $(mount | grep -v "${var_TARGET_DIR} " | grep "${var_TARGET_DIR}" | sed 's|\ .*||g') >/dev/null 2>&1
+ umount $(mount | grep "${var_TARGET_DIR} " | sed 's|\ .*||g') >/dev/null 2>&1
+}
+
+
+# literally taken from setup script
+finddisks() {
+ workdir="$PWD"
+ cd /sys/block
+ # ide devices
+ for dev in $(ls | egrep '^hd'); do
+ if [ "$(cat $dev/device/media)" = "disk" ]; then
+ echo "/dev/$dev"
+ [ "$1" ] && echo $1
+ fi
+ done
+ #scsi/sata devices
+ for dev in $(ls | egrep '^sd'); do
+ # TODO: what is the significance of 5?
+ if ! [ "$(cat $dev/device/type)" = "5" ]; then
+ echo "/dev/$dev"
+ [ "$1" ] && echo $1
+ fi
+ done
+ # cciss controllers
+ if [ -d /dev/cciss ] ; then
+ cd /dev/cciss
+ for dev in $(ls | egrep -v 'p'); do
+ echo "/dev/cciss/$dev"
+ [ "$1" ] && echo $1
+ done
+ fi
+ # Smart 2 controllers
+ if [ -d /dev/ida ] ; then
+ cd /dev/ida
+ for dev in $(ls | egrep -v 'p'); do
+ echo "/dev/ida/$dev"
+ [ "$1" ] && echo $1
+ done
+ fi
+ cd "$workdir"
+}
+
+
+# getuuid(). taken and modified from setup. this can probably be more improved. return an exit code, rely on blkid's exit codes etc.
+# converts /dev/[hs]d?[0-9] devices to UUIDs
+#
+# parameters: device file
+# outputs: UUID on success
+# nothing on failure
+# returns: nothing
+getuuid()
+{
+ [ -z "$1" ] && die_error "getuuid needs an argument"
+ [ "${1%%/[hs]d?[0-9]}" != "${1}" ] && echo "$(blkid -s UUID -o value ${1})"
+}
+
+# taken from setup. slightly optimized. TODO: fix identation + can be improved more
+findpartitions() {
+ workdir="$PWD"
+ for devpath in $(finddisks)
+ do
+ disk=$(echo $devpath | sed 's|.*/||')
+ cd /sys/block/$disk
+ for part in $disk*
+ do
+ # check if not already assembled to a raid device
+ if ! [ "$(cat /proc/mdstat 2>/dev/null | grep $part)" -o "$(fstype 2>/dev/null </dev/$part | grep "lvm2")" \
+ -o "$(sfdisk -c /dev/$disk $(echo $part | sed -e "s#$disk##g") 2>/dev/null | grep "5")" ]
+ then
+ if [ -d $part ]
+ then
+ echo "/dev/$part"
+ [ "$1" ] && echo $1
+ fi
+ fi
+ done
+ done
+ # include any mapped devices
+ for devpath in $(ls /dev/mapper 2>/dev/null | grep -v control)
+ do
+ echo "/dev/mapper/$devpath"
+ [ "$1" ] && echo $1
+ done
+ # include any raid md devices
+ for devpath in $(ls -d /dev/md* | grep '[0-9]' 2>/dev/null)
+ do
+ if grep -qw $(echo $devpath /proc/mdstat | sed -e 's|/dev/||g')
+ then
+ echo "$devpath"
+ [ "$1" ] && echo $1
+ fi
+ done
+ # inlcude cciss controllers
+ if [ -d /dev/cciss ]
+ then
+ cd /dev/cciss
+ for dev in $(ls | egrep 'p')
+ do
+ echo "/dev/cciss/$dev"
+ [ "$1" ] && echo $1
+ done
+ fi
+ # inlcude Smart 2 controllers
+ if [ -d /dev/ida ]
+ then
+ cd /dev/ida
+ for dev in $(ls | egrep 'p')
+ do
+ echo "/dev/ida/$dev"
+ [ "$1" ] && echo $1
+ done
+ fi
+
+ cd "$workdir"
+}
+
+
+# taken from setup
+get_grub_map() {
+ rm /tmp/dev.map
+ $var_TARGET_DIR/sbin/grub --no-floppy --device-map /tmp/dev.map >/tmp/grub.log 2>&1 <<EOF
+quit
+EOF
+}
+
+
+# TODO: $1 is what??
+# taken from setup. slightly edited.
+mapdev() {
+ partition_flag=0
+ device_found=0
+ devs=$( grep -v fd /tmp/dev.map | sed 's/ *\t/ /' | sed ':a;$!N;$!ba;s/\n/ /g')
+ linuxdevice=$(echo $1 | cut -b1-8)
+ if [ "$(echo $1 | egrep '[0-9]$')" ]; then
+ # /dev/hdXY
+ pnum=$(echo $1 | cut -b9-)
+ pnum=$(($pnum-1))
+ partition_flag=1
+ fi
+ for dev in $devs
+ do
+ if [ "(" = $(echo $dev | cut -b1) ]; then
+ grubdevice="$dev"
+ else
+ if [ "$dev" = "$linuxdevice" ]; then
+ device_found=1
+ break
+ fi
+ fi
+ done
+ if [ "$device_found" = "1" ]; then
+ if [ "$partition_flag" = "0" ]; then
+ echo "$grubdevice"
+ else
+ grubdevice_stringlen=${#grubdevice}
+ grubdevice_stringlen=$(($grubdevice_stringlen - 1))
+ grubdevice=$(echo $grubdevice | cut -b1-$grubdevice_stringlen)
+ echo "$grubdevice,$pnum)"
+ fi
+ else
+ echo "DEVICE NOT FOUND" >&2
+ fi
+}
+
+# _mkfs() taken from setup code and slightly improved.
+# Create and mount filesystems in our destination system directory.
+#
+# args:
+# $1 domk: Whether to make the filesystem or use what is already there (yes/no)
+# $2 device: Device filesystem is on
+# $3 fstype: type of filesystem located at the device (or what to create)
+# $4 dest: Mounting location for the destination system
+# $5 mountpoint: Mount point inside the destination system, e.g. '/boot'
+
+# returns: 1 on failure
+_mkfs() {
+ local _domk=$1
+ local _device=$2
+ local _fstype=$3
+ local _dest=$4
+ local _mountpoint=$5
+
+ # we have two main cases: "swap" and everything else.
+ if [ "${_fstype}" = "swap" ]; then
+ swapoff ${_device} >/dev/null 2>&1
+ if [ "${_domk}" = "yes" ]; then
+ mkswap ${_device} >$LOG 2>&1 || show_warning "Error creating swap: mkswap ${_device}" && return 1
+ fi
+ swapon ${_device} >$LOG 2>&1 || show_warning "Error activating swap: swapon ${_device}" && return 1
+ else
+ # make sure the fstype is one we can handle
+ local knownfs=0
+ for fs in xfs jfs reiserfs ext2 ext3 vfat; do
+ [ "${_fstype}" = "${fs}" ] && knownfs=1 && break
+ done
+
+ [ $knownfs -eq 0 ] && show_warning "unknown fstype ${_fstype} for ${_device}" && return 1
+ # if we were tasked to create the filesystem, do so
+ if [ "${_domk}" = "yes" ]; then
+ local ret
+ case ${_fstype} in
+ xfs) mkfs.xfs -f ${_device} >$LOG 2>&1; ret=$? ;;
+ jfs) yes | mkfs.jfs ${_device} >$LOG 2>&1; ret=$? ;;
+ reiserfs) yes | mkreiserfs ${_device} >$LOG 2>&1; ret=$? ;;
+ ext2) mke2fs "${_device}" >$LOG 2>&1; ret=$? ;;
+ ext3) mke2fs -j ${_device} >$LOG 2>&1; ret=$? ;;
+ vfat) mkfs.vfat ${_device} >$LOG 2>&1; ret=$? ;;
+ # don't handle anything else here, we will error later
+ esac
+ [ $ret != 0 ] && show_warning "Error creating filesystem ${_fstype} on ${_device}" && return 1
+ sleep 2
+ fi
+ # create our mount directory
+ mkdir -p ${_dest}${_mountpoint}
+ # mount the bad boy
+ mount -t ${_fstype} ${_device} ${_dest}${_mountpoint} >$LOG 2>&1
+ [ $? != 0 ] && show_warning "Error mounting ${_dest}${_mountpoint}" && return 1
+ fi
+
+ # add to temp fstab
+ local _uuid="$(getuuid ${_device})"
+ if [ -n "${_uuid}" ]; then
+ _device="UUID=${_uuid}"
+ fi
+ echo -n "${_device} ${_mountpoint} ${_fstype} defaults 0 " >>/tmp/.fstab
+
+ if [ "${_fstype}" = "swap" ]; then
+ echo "0" >>/tmp/.fstab
+ else
+ echo "1" >>/tmp/.fstab
+ fi
+}
+
+
+# auto_fstab(). taken from setup
+# preprocess fstab file
+# comments out old fields and inserts new ones
+# according to partitioning/formatting stage
+#
+auto_fstab()
+{
+ if [ "$S_MKFS" = "1" -o "$S_MKFSAUTO" = "1" ]; then
+ if [ -f /tmp/.fstab ]; then
+ # comment out stray /dev entries
+ sed -i 's/^\/dev/#\/dev/g' $var_TARGET_DIR/etc/fstab
+ # append entries from new configuration
+ sort /tmp/.fstab >>$var_TARGET_DIR/etc/fstab
+ fi
+ fi
+}