blob: 666b8a69f09f9bbcf217699670c990817921356d (
plain) (
tree)
|
|
#!/bin/bash
# Copyright (c) 2013 - OpenSLX GmbH
#
# This program is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found under http://openslx.org
#
# Local hard disk autodetection script for OpenSLX linux stateless clients,
# detecting swap and special partitions
#############################################################################
PERSISTENT="/opt/openslx/persistent"
# General formatter for the /tmp partition on a local harddisk
diskfm () {
mopt="" # Global var!
local target="$1"
local fslist="xfs jfs ext3 ext2 ext4"
local fs
local path
[ $# -ge 2 ] && fslist="$2"
for fs in $fslist ; do
unset available
case $(cat /proc/filesystems) in
*${fs}*) available=yes;;
*) modprobe "${fs}" && available=yes;;
esac
if [ -n "${available}" ]; then
unset found
if which "mkfs.$fs" ; then
found=yes
case "mkfs.$fs" in
mkfs.xfs)
fopt="-f"
mopt="-o noexec"
;;
mkfs.ext2)
fopt="-Fq"
mopt="-o nocheck,noexec"
;;
mkfs.ext3|mkfs.ext4)
fopt="-Fq"
mopt="-o noexec"
;;
mkfs.reiserfs)
fopt="-f"
mopt="-o noexec"
;;
mkfs.jfs)
fopt="-q"
mopt="-o noexec"
;;
esac
mkfs.$fs ${fopt} "${target}"
fi
[ -n "$found" ] && break
fi
done
}
function mount_temp () {
local PRE=$(pwd)
if ! cd /tmp; then
mount_temp_fallback $@
return $?
fi
mount $@ /tmp || return 1
chmod a+rwxt /tmp
# Move stuff from working directory, which is old /tmp, to new /tmp just mounted
mv ./* ./.[!.]* ./..?* /tmp/ 2> /dev/null
local OLD=$(LANG=C ls -alh | grep -v -E ' \.\.?$' | grep -v '^total')
[ -n "$OLD" ] && echo -- "Leftovers:" && echo -- "$OLD"
cd "$PRE"
}
function mount_temp_fallback () {
mkdir -p /tmptmp
mv /tmp/* /tmp/.* /tmptmp/ 2> /dev/null
mount $@ /tmp || return 1
chmod a+rwxt /tmp
mv /tmptmp/* /tmptmp/.* /tmp/
rmdir /tmptmp
return 0
}
fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
# This is an ugly hack as sometimes this script is run too early,
# and fdisk won't report any partitions then. I assumed this would be
# solved by launching this script after udev-trigger finished, but
# apparently then it can still happen that we run too soon. This should
# be removed once someone figures out what fdisk really needs to work
# properly.
if [ ! -s "/etc/disk.partition" ]; then
sleep 3
echo "Retrying fdisk"
fdisk -l | sed -n "/^\/dev\//p" > "/etc/disk.partition"
fi
echo "Partitions:"
cat "/etc/disk.partition"
# Check for standard swap partitions and make them available to the system
for hdpartnr in $(sed -n -e "/ 82 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
echo -e "$hdpartnr\tswap\t\tswap\t\tdefaults\t 0 0" >> "/etc/fstab"
swapon "$hdpartnr"
done
# We use special non assigned partition type (id44) for harddisk scratch
# space, thus no normal filesystem will be incidentally deleted or
# corrupted
for hdpartnr in $(sed -n -e "/ 44 /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
# check for supported filesystem and formatter
if diskfm "$hdpartnr"; then
# echo "$hdpartnr is mounted to /mnt/tmp at $(sysup)" >/tmp/tmpready
mount_temp "$mopt" "$hdpartnr" || continue
echo -e "${hdpartnr}\t/tmp\t\tauto\t\tnoexec\t 0 0" >> "/etc/fstab"
break
else
echo "formatting failed for some reason"
fi # Made this non-forking, systemd should handle it - 2013-05-28
done
# Put detected linux partitions (83) into /etc/fstab with "noauto", special
# partition 45 (persistent scratch) to /var/scratch and 46 to /var/openslx
HAVE_PERSISTENT=no
for partid in 83 45 46 ; do
for hdpartnr in $(sed -n -e "/ ${partid} /p" "/etc/disk.partition" | sed -e "s/[[:space:]].*//"); do
if [ "${partid}" -eq 83 ]; then
mkdir -p "/media/${hdpartnr#/dev/*}"
echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto,noexec\t 0 0" >> "/etc/fstab"
elif [ "${partid}" -eq 45 -a "$HAVE_PERSISTENT" = "no" ]; then
mkdir -p "$PERSISTENT"
if ! mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT"; then
diskfm "$hdpartnr" "jfs xfs ext3" || continue
mount -t auto -o noexec "${hdpartnr}" "$PERSISTENT" || continue
fi
HAVE_PERSISTENT=yes
echo -e "${hdpartnr}\t${PERSISTENT}\tauto\t\tnoauto,noexec\t\t 0 0" >> "/etc/fstab"
elif [ "${partid}" -eq 46 ]; then
mkdir -p "/media/${hdpartnr#/dev/*}"
#mount -t auto ${hdpartnr} /mnt/media/${hdpartnr#/dev/*} \n\
#test -d /mnt/media/${hdpartnr#/dev/*}/home && \
# ln -sf /media/${hdpartnr#/dev/*} /var/home
echo -e "${hdpartnr}\t/media/${hdpartnr#/dev/*}\tauto\t\tnoauto\t\t 0 0" >> "/etc/fstab"
fi
done
done
[ "$HAVE_PERSISTENT" = "no" -a -d "$PERSISTENT" ] && rm -f "$PERSISTENT"
mount -a
# Make huge tmpfs if nothing could be mounted for /tmp
if [ "$(mount | grep -c "on /tmp ")" = "0" ]; then
mount_temp -t tmpfs -o size=10G none
fi
|