Překrytí systémového disku - overlay filesystem

From DCEwiki
Revision as of 20:59, 28 January 2013 by Keny (talk | contribs)
Jump to navigation Jump to search
Upozornění Při použití překrývání adresářové struktury na disku přes overlay by měla mít klientská pracovní stanice vždy k dispozici lokální swapovací oddíl, který jí umožní v případě nutnosti uvolnit část dat z docházející fyzické paměti.

Překrytí systémového disku

Překrytí systémového disku zajišťují dva skripty, umístěné v ramdisku.

Vyžadují instalaci nástrojů v initramfs-tools

root_overlay
Překryje systémový disk připojený přes NFS pomocí aufs
nfsrootsetup
Vygeneruje nový obsah souboru /etc/hosts, ve kterém použije doménové jméno nfsroot pro aktuální NFS server

root_overlay

Poznámka
#!/bin/sh
# Remounting root as unionfs or aufs

PREREQ=""
prereqs()
{
     echo "$PREREQ"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac

echo "Preparing overlay filesystem ..."
if ! grep -q aufs /proc/filesystems ; then
    modprobe aufs >/dev/null 2>/dev/null
    if ! grep -q aufs /proc/filesystems ; then
        if ! insmod ${rootmnt}/lib/modules/$(uname -r)/extra/aufs/aufs.ko ; then
	    echo "Cannot insert aufs module."
	    FLAG_NO_AUFS=y
	fi
    fi
fi

if [ "$FLAG_NO_AUFS" == "y" ] ; then
    if ! grep -q unionfs /proc/filesystems ; then
        modprobe unionfs >/dev/null 2>/dev/null
        if ! grep -q unionfs /proc/filesystems ; then
            insmod ${rootmnt}/lib/modules/$(uname -r)/extra/unionfs/unionfs.ko || panic "Cannot insert unionfs module."
        fi
    fi
    FLAG_USE_UNIONFS=y
fi

mkdir /tmp/unirw
mount -n -t tmpfs none /tmp/unirw

if [ "$FLAG_USE_UNIONFS" == "y" ] ; then
    echo "Remounting root as unionfs ..."
    mount -n -t unionfs -o dirs=/tmp/unirw=rw:${rootmnt}=ro unionfs ${rootmnt}
else
    echo "Remounting root as aufs ..."
    mount -n -t aufs -o dirs=/tmp/unirw=rw:${rootmnt}=nfsro unionfs ${rootmnt}
fi
mkdir -p ${rootmnt}/overlay/unirw
mount -n -o move /tmp/unirw ${rootmnt}/overlay/unirw
chmod 755 ${rootmnt} # Disable rw access for non-root users

mkdir -p ${rootmnt}/tmp
mkdir -p ${rootmnt}/var/lock

nfsrootsetup

Poznámka
#!/bin/sh
# Setup hostnames according to IP address and create /etc/hosts

PREREQ="root_overlay"
prereqs()
{
     echo "$PREREQ"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac

echo "Setting hostname..."
# Bring in the main config
. /conf/initramfs.conf
# source relevant ipconfig output
. /tmp/net-*.conf

if [ -z "${HOSTNAME}" ]; then # No hostname sent by DHCP
	case "${IPV4ADDR}" in
		147.32.86.*)	HOSTNAME="dcezam-${IPV4ADDR##*.}";;
		147.32.87.*)	HOSTNAME="dcestud-${IPV4ADDR##*.}";;
		192.168.136.*)	HOSTNAME="k09-${IPV4ADDR##*.}";;
		192.168.202.*)	HOSTNAME="k2-${IPV4ADDR##*.}";;
		*)		HOSTNAME="dcelinux-${IPV4ADDR}";;
	esac
fi

[ -z "${DNSDOMAIN}" ] && DNSDOMAIN=local

rm -f ${rootmnt}/etc/hostname
echo ${HOSTNAME} > ${rootmnt}/etc/hostname

# Create /etc/hosts with correct IP for the server
rm -f ${rootmnt}/etc/hosts
cat <<EOF > ${rootmnt}/etc/hosts
127.0.0.1	localhost
${IPV4ADDR}	${HOSTNAME}.${DNSDOMAIN} ${HOSTNAME}
${nfsroot%%:*}	nfsroot
EOF

exit 0


Doplňkové operace...

k335linux
Skript, který symlinkuje adresář /opt
findswap
Skript, který se snaží najít a aktivovat lokální swap


k335linux

Poznámka
#! /bin/sh
### BEGIN INIT INFO
# Provides:          k335linux
# Required-Start:    $remote_fs
# Required-Stop: 
# Should-Start:
# Should-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Creates symlink in /opt
# Description:
### END INIT INFO

#
# k335linux	K335 diskless linux setup helpers.
#
#		Base on skeleton by Miquel van Smoorenburg <miquels@cistron.nl>.
#		Modified for Debian 
#		by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
# Version:	@(#)k335linux 1.0  12-Jan-2011  pisa@cmp.felk.cvut.cz
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=k335linux
DESC="station configuration"

# Include k335linux defaults if available
if [ -f /etc/default/k335linux ] ; then
	. /etc/default/k335linux
fi

set -e

case "$1" in
  start)
	echo -n "Starting $DESC: "
        #echo -n "xconf"
        #/usr/local/bin/xconf > /dev/null
	echo "."
	;;
  stop)
# 	echo -n "Stopping $DESC: "
# 	echo "."
	;;
  force-reload)
	$0 restart \
	|| exit 0
	;;
  restart)
    echo -n "Restarting $DESC: "
	start-stop-daemon --stop --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON
	sleep 1
	start-stop-daemon --start --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
	;;
  *)
	N=/etc/init.d/$NAME
	echo "Usage: $N {start|stop|restart|force-reload}" >&2
	exit 1
	;;
esac

exit 0

Připojení swapu - findswap

Poznámka
#!/bin/sh
### BEGIN INIT INFO
# Provides:          findswap
# Required-Start:    mountall
# Required-Stop: 
# Should-Start:
# Should-Stop:
# Default-Start:     S
# Default-Stop:
# Short-Description: Find all unused swap partitions to enable swapping on them
# Description:
### END INIT INFO

do_start() {
  SWAPCANDIDATES="$(cat /proc/partitions | sed -n -e 's/^.* \([hs]d[a-z][0-9]\)$/\1/p' -e 's/^.* \(xvd[a-z][0-9]\)$/\1/p')"
  for i in $SWAPCANDIDATES ; do
    if [ "$( blkid -s TYPE /dev/$i -o value )" = "swap" ] ; then
      grep -q "/dev/$i" /proc/swaps
      if [ $? -ne 0 ] ; then
        echo "Adding swap device /dev/$i."
        swapon "/dev/$i"
      fi
    fi
  done
}

case "$1" in
  start|"")
	do_start
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	# No-op
	;;
  *)
	echo "Usage: $0 [start|stop]" >&2
	exit 3
	;;
esac

Mount uživatelských adresářů

Využívá souboru /etc/hosts, který vygeneroval skript v ramdisku

Využití překrytí při přípravě binárních distribučních balíků