mid-kid
7 years ago
commit
9cee612f10
15 changed files with 3757 additions and 0 deletions
@ -0,0 +1,25 @@ |
|||
config() { |
|||
NEW="$1" |
|||
OLD="$(dirname $NEW)/$(basename $NEW .new)" |
|||
if [ ! -r $OLD ]; then |
|||
mv $NEW $OLD |
|||
elif [ "$(cat $OLD | md5sum)" = "$(cat $NEW | md5sum)" ]; then |
|||
rm $NEW |
|||
fi |
|||
} |
|||
|
|||
preserve_perms() { |
|||
NEW="$1" |
|||
OLD="$(dirname $NEW)/$(basename $NEW .new)" |
|||
if [ -e $OLD ]; then |
|||
cp -a $OLD ${NEW}.incoming |
|||
cat $NEW > ${NEW}.incoming |
|||
mv ${NEW}.incoming $NEW |
|||
fi |
|||
config $NEW |
|||
} |
|||
|
|||
preserve_perms etc/rc.d/rc.lxc.new |
|||
config etc/lxc/default.conf.new |
|||
config etc/default/lxc.new |
|||
|
Binary file not shown.
@ -0,0 +1,489 @@ |
|||
#!/bin/bash |
|||
|
|||
# |
|||
# lxc: linux Container library |
|||
|
|||
# Authors: |
|||
# Daniel Lezcano <daniel.lezcano@free.fr> |
|||
|
|||
# Template for slackware by Matteo Bernardini <ponce@slackbuilds.org> |
|||
# some parts are taken from the debian one (used as model) |
|||
|
|||
# This library is free software; you can redistribute it and/or |
|||
# modify it under the terms of the GNU Lesser General Public |
|||
# License as published by the Free Software Foundation; either |
|||
# version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
# This library is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
# Lesser General Public License for more details. |
|||
|
|||
# You should have received a copy of the GNU Lesser General Public |
|||
# License along with this library; if not, write to the Free Software |
|||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|||
|
|||
cache=${cache:-/var/cache/lxc/slackware} |
|||
|
|||
# Use the primary Slackware site by default, but please consider changing |
|||
# this to a closer mirror site. |
|||
MIRROR=${MIRROR:-http://ftp.slackware.com/pub/slackware} |
|||
|
|||
if [ -z "$arch" ]; then |
|||
case "$( uname -m )" in |
|||
i?86) arch=i486 ;; |
|||
arm*) arch=arm ;; |
|||
*) arch=$( uname -m ) ;; |
|||
esac |
|||
fi |
|||
|
|||
configure_slackware() |
|||
{ |
|||
rootfs=$1 |
|||
hostname=$2 |
|||
|
|||
echo "Configuring..." ; echo |
|||
|
|||
# The next part contains excerpts taken from SeTconfig (written by |
|||
# Patrick Volkerding) from the slackware setup disk. |
|||
# But before pasting them just set a variable to use them as they are |
|||
T_PX=$rootfs |
|||
|
|||
( cd $T_PX ; chmod 755 ./ ) |
|||
( cd $T_PX ; chmod 755 ./var ) |
|||
if [ -d $T_PX/usr/src/linux ]; then |
|||
chmod 755 $T_PX/usr/src/linux |
|||
fi |
|||
if [ ! -d $T_PX/proc ]; then |
|||
mkdir $T_PX/proc |
|||
chown root.root $T_PX/proc |
|||
fi |
|||
if [ ! -d $T_PX/sys ]; then |
|||
mkdir $T_PX/sys |
|||
chown root.root $T_PX/sys |
|||
fi |
|||
chmod 1777 $T_PX/tmp |
|||
if [ ! -d $T_PX/var/spool/mail ]; then |
|||
mkdir -p $T_PX/var/spool/mail |
|||
chmod 755 $T_PX/var/spool |
|||
chown root.mail $T_PX/var/spool/mail |
|||
chmod 1777 $T_PX/var/spool/mail |
|||
fi |
|||
|
|||
echo "#!/bin/sh" > $T_PX/etc/rc.d/rc.keymap |
|||
echo "# Load the keyboard map. More maps are in /usr/share/kbd/keymaps." \ |
|||
>> $T_PX/etc/rc.d/rc.keymap |
|||
echo "if [ -x /usr/bin/loadkeys ]; then" >> $T_PX/etc/rc.d/rc.keymap |
|||
echo " /usr/bin/loadkeys us" >> $T_PX/etc/rc.d/rc.keymap |
|||
echo "fi" >> $T_PX/etc/rc.d/rc.keymap |
|||
chmod 755 $T_PX/etc/rc.d/rc.keymap |
|||
|
|||
# Network configuration is left to the user, that have to edit |
|||
# /etc/rc.d/rc.inet1.conf and /etc/resolv.conf of the container |
|||
# just set the hostname |
|||
cat <<EOF > $rootfs/etc/HOSTNAME |
|||
$hostname.example.net |
|||
EOF |
|||
cp $rootfs/etc/HOSTNAME $rootfs/etc/hostname |
|||
|
|||
# make needed devices, from Chris Willing's MAKEDEV.sh |
|||
# http://www.vislab.uq.edu.au/howto/lxc/MAKEDEV.sh |
|||
DEV=$rootfs/dev |
|||
mkdir -p ${DEV} |
|||
mknod -m 666 ${DEV}/null c 1 3 |
|||
mknod -m 666 ${DEV}/zero c 1 5 |
|||
mknod -m 666 ${DEV}/random c 1 8 |
|||
mknod -m 666 ${DEV}/urandom c 1 9 |
|||
mkdir -m 755 ${DEV}/pts |
|||
mkdir -m 1777 ${DEV}/shm |
|||
mknod -m 666 ${DEV}/tty c 5 0 |
|||
mknod -m 600 ${DEV}/console c 5 1 |
|||
mknod -m 666 ${DEV}/tty0 c 4 0 |
|||
mknod -m 666 ${DEV}/tty1 c 4 1 |
|||
mknod -m 666 ${DEV}/tty2 c 4 2 |
|||
mknod -m 666 ${DEV}/tty3 c 4 3 |
|||
mknod -m 666 ${DEV}/tty4 c 4 4 |
|||
mknod -m 666 ${DEV}/tty5 c 4 5 |
|||
mknod -m 666 ${DEV}/full c 1 7 |
|||
mknod -m 600 ${DEV}/initctl p |
|||
mknod -m 660 ${DEV}/loop0 b 7 0 |
|||
mknod -m 660 ${DEV}/loop1 b 7 1 |
|||
ln -s pts/ptmx ${DEV}/ptmx |
|||
ln -s /proc/self/fd ${DEV}/fd |
|||
|
|||
echo "Adding an etc/fstab that must be modified later with the" |
|||
echo "full path of the container's rootfs if you decide to move it." |
|||
cat >$rootfs/etc/fstab <<EOF |
|||
lxcpts $rootfs/dev/pts devpts defaults,newinstance 0 0 |
|||
none $rootfs/proc proc defaults 0 0 |
|||
none $rootfs/sys sysfs defaults 0 0 |
|||
none /dev/shm tmpfs defaults 0 0 |
|||
none /run tmpfs defaults,mode=0755 0 0 |
|||
EOF |
|||
|
|||
# Back up the existing init scripts and install the lxc versions: |
|||
( cd $rootfs/etc/rc.d |
|||
cp -a /usr/share/lxc/scripts/slackware/* . |
|||
chmod 755 *.lxc |
|||
for file in *.lxc ; do |
|||
cp -a $(basename $file .lxc) $(basename $file .lxc).orig |
|||
cp -a $file $(basename $file .lxc) |
|||
done |
|||
) |
|||
|
|||
# restart rc.inet1 to have routing for the loop device |
|||
echo "/etc/rc.d/rc.inet1 restart" >> $rootfs/etc/rc.d/rc.local |
|||
|
|||
# reduce the number of local consoles: two should be enough |
|||
sed -i '/^c3\|^c4\|^c5\|^c6/s/^/# /' $rootfs/etc/inittab |
|||
|
|||
# In a container, use shutdown for powerfail conditions. LXC sends the SIGPWR |
|||
# signal to init to shut down the container with lxc-stop and without this the |
|||
# container will be force stopped after a one minute timeout. |
|||
sed -i "s,pf::powerfail:/sbin/genpowerfail start,pf::powerfail:/sbin/shutdown -h now,g" $rootfs/etc/inittab |
|||
sed -i "s,pg::powerokwait:/sbin/genpowerfail stop,pg::powerokwait:/sbin/shutdown -c,g" $rootfs/etc/inittab |
|||
|
|||
# set a default combination for the luggage |
|||
echo "root:root" | chroot $rootfs chpasswd |
|||
echo "Root default password is 'root', please change it!" |
|||
|
|||
# borrow the time configuration from the local machine |
|||
cp -a /etc/localtime $rootfs/etc/localtime |
|||
|
|||
return 0 |
|||
} |
|||
|
|||
copy_slackware() |
|||
{ |
|||
rootfs=$1 |
|||
|
|||
# make a local copy of the installed filesystem |
|||
echo -n "Copying rootfs to $rootfs..." |
|||
mkdir -p $rootfs |
|||
cp -a $cache/rootfs-$release-$arch/* $rootfs/ || exit 1 |
|||
|
|||
# fix fstab with the actual path |
|||
sed -i "s|$cache/rootfs-$release-$arch|$rootfs|" $rootfs/etc/fstab |
|||
|
|||
return 0 |
|||
} |
|||
|
|||
install_slackware() |
|||
{ |
|||
rootfs=$1 |
|||
mkdir -p /var/lock/subsys/ |
|||
( |
|||
flock -n -x 200 |
|||
if [ $? -ne 0 ]; then |
|||
echo "Cache repository is busy." |
|||
return 1 |
|||
fi |
|||
|
|||
if [ "$arch" == "x86_64" ]; then |
|||
PKGMAIN=slackware64 |
|||
elif [ "$arch" == "arm" ]; then |
|||
PKGMAIN=slackwarearm |
|||
else |
|||
PKGMAIN=slackware |
|||
fi |
|||
|
|||
export CONF=$cache/slackpkg-conf |
|||
export ROOT=$cache/rootfs-$release-$arch |
|||
|
|||
mkdir -p $cache/cache-$release-$arch $cache/rootfs-$release-$arch \ |
|||
$cache/slackpkg-$release-$arch $CONF/templates |
|||
|
|||
echo "$MIRROR/$PKGMAIN-$release/" > $CONF/mirrors |
|||
touch $CONF/blacklist |
|||
|
|||
cat <<EOF > $CONF/slackpkg.conf |
|||
# v2.8 |
|||
ARCH=$arch |
|||
TEMP=$cache/cache-$release-$arch |
|||
WORKDIR=$cache/slackpkg-$release-$arch |
|||
DELALL=off |
|||
CHECKMD5=on |
|||
CHECKGPG=on |
|||
CHECKSIZE=off |
|||
PRIORITY=( patches %PKGMAIN extra pasture testing ) |
|||
POSTINST=on |
|||
ONLY_NEW_DOTNEW=off |
|||
ONOFF=on |
|||
DOWNLOAD_ALL=on |
|||
DIALOG=off |
|||
BATCH=on |
|||
DEFAULT_ANSWER=y |
|||
USE_INCLUDES=on |
|||
SPINNING=off |
|||
EOF |
|||
|
|||
# thanks to Vincent Batts for this list of packages |
|||
# (that I modified a little :P) |
|||
# http://connie.slackware.com/~vbatts/minimal/ |
|||
cat <<EOF > $CONF/templates/minimal-lxc.template |
|||
aaa_base |
|||
aaa_elflibs |
|||
aaa_terminfo |
|||
bash |
|||
bin |
|||
bzip2 |
|||
coreutils |
|||
dcron |
|||
dhcpcd |
|||
dialog |
|||
diffutils |
|||
e2fsprogs |
|||
elvis |
|||
etc |
|||
eudev |
|||
findutils |
|||
gawk |
|||
glibc-solibs |
|||
gnupg |
|||
grep |
|||
gzip |
|||
iputils |
|||
logrotate |
|||
mpfr |
|||
net-tools |
|||
network-scripts |
|||
ncurses |
|||
openssh |
|||
openssl-solibs |
|||
pkgtools |
|||
procps-ng |
|||
sed |
|||
shadow |
|||
sharutils |
|||
slackpkg |
|||
sysklogd |
|||
sysvinit |
|||
sysvinit-functions |
|||
sysvinit-scripts |
|||
tar |
|||
util-linux |
|||
wget |
|||
which |
|||
xz |
|||
EOF |
|||
|
|||
TEMPLATE=${TEMPLATE:-minimal-lxc} |
|||
if [ ! "$TEMPLATE" = "minimal-lxc" ]; then |
|||
if [ -f /etc/slackpkg/templates/$TEMPLATE.template ]; then |
|||
cat /etc/slackpkg/templates/$TEMPLATE.template \ |
|||
> $CONF/templates/$TEMPLATE.template |
|||
else |
|||
TEMPLATE="minimal-lxc" |
|||
fi |
|||
fi |
|||
|
|||
# clean previous installs |
|||
rm -fR $ROOT/* |
|||
|
|||
slackpkg -default_answer=n update |
|||
slackpkg install-template $TEMPLATE |
|||
|
|||
# add a slackpkg default mirror |
|||
echo "$MIRROR/$PKGMAIN-$release/" >> $ROOT/etc/slackpkg/mirrors |
|||
|
|||
# blacklist the devs package (we have to use our premade devices). |
|||
# do the same with the kernel packages (we use the host's one), |
|||
# but leave available headers and sources |
|||
echo "devs" >> $ROOT/etc/slackpkg/blacklist |
|||
sed -i \ |
|||
-e "s|^#kernel-|kernel-|" \ |
|||
-e "s|^kernel-headers|#kernel-headers|" \ |
|||
-e "s|^kernel-source|#kernel-source|" \ |
|||
$ROOT/etc/slackpkg/blacklist |
|||
|
|||
return 0 |
|||
|
|||
) 200>/var/lock/subsys/lxc |
|||
|
|||
return $? |
|||
} |
|||
|
|||
copy_configuration() |
|||
{ |
|||
path=$1 |
|||
rootfs=$2 |
|||
name=$3 |
|||
|
|||
cat <<EOF >> $path/config |
|||
|
|||
lxc.utsname = $name |
|||
|
|||
lxc.mount = $rootfs/etc/fstab |
|||
|
|||
lxc.tty = 4 |
|||
lxc.pts = 1024 |
|||
lxc.rootfs = $rootfs |
|||
|
|||
lxc.cgroup.devices.deny = a |
|||
# /dev/null and zero |
|||
lxc.cgroup.devices.allow = c 1:3 rwm |
|||
lxc.cgroup.devices.allow = c 1:5 rwm |
|||
# consoles |
|||
lxc.cgroup.devices.allow = c 5:1 rwm |
|||
lxc.cgroup.devices.allow = c 5:0 rwm |
|||
lxc.cgroup.devices.allow = c 4:0 rwm |
|||
lxc.cgroup.devices.allow = c 4:1 rwm |
|||
# /dev/{,u}random |
|||
lxc.cgroup.devices.allow = c 1:9 rwm |
|||
lxc.cgroup.devices.allow = c 1:8 rwm |
|||
lxc.cgroup.devices.allow = c 136:* rwm |
|||
lxc.cgroup.devices.allow = c 5:2 rwm |
|||
# rtc |
|||
lxc.cgroup.devices.allow = c 254:0 rwm |
|||
|
|||
# we don't trust even the root user in the container, better safe than sorry. |
|||
# comment out only if you know what you're doing. |
|||
lxc.cap.drop = sys_module mknod mac_override mac_admin sys_time setfcap setpcap |
|||
|
|||
# you can try also this alternative to the line above, whatever suits you better. |
|||
# lxc.cap.drop=sys_admin |
|||
EOF |
|||
|
|||
if [ $? -ne 0 ]; then |
|||
echo "Failed to add configuration." |
|||
return 1 |
|||
fi |
|||
|
|||
return 0 |
|||
} |
|||
|
|||
clean() |
|||
{ |
|||
if [ ! -e $cache ]; then |
|||
exit 0 |
|||
fi |
|||
|
|||
# lock, so we won't purge while someone is creating a repository |
|||
( |
|||
flock -n -x 200 |
|||
if [ $? != 0 ]; then |
|||
echo "Cache repository is busy." |
|||
exit 1 |
|||
fi |
|||
|
|||
echo -n "Purging the download cache..." |
|||
rm --preserve-root --one-file-system -rf $cache && echo "Done." || exit 1 |
|||
exit 0 |
|||
|
|||
) 200>/var/lock/subsys/lxc |
|||
} |
|||
|
|||
usage() |
|||
{ |
|||
cat <<EOF |
|||
$1 -h|--help -p|--path=<path> --clean |
|||
EOF |
|||
return 0 |
|||
} |
|||
|
|||
options=$(getopt -o hp:n:a:r:c -l help,rootfs:,path:,name:,arch:,release:,clean -- "$@") |
|||
if [ $? -ne 0 ]; then |
|||
usage $(basename $0) |
|||
exit 1 |
|||
fi |
|||
eval set -- "$options" |
|||
|
|||
while true |
|||
do |
|||
case "$1" in |
|||
-h|--help) usage $0 && exit 0;; |
|||
-p|--path) path=$2; shift 2;; |
|||
--rootfs) rootfs=$2; shift 2;; |
|||
-a|--arch) arch=$2; shift 2;; |
|||
-r|--release) release=$2; shift 2;; |
|||
-n|--name) name=$2; shift 2;; |
|||
-c|--clean) clean=$2; shift 2;; |
|||
--) shift 1; break ;; |
|||
*) break ;; |
|||
esac |
|||
done |
|||
|
|||
if [ ! -z "$clean" -a -z "$path" ]; then |
|||
clean || exit 1 |
|||
exit 0 |
|||
fi |
|||
|
|||
type installpkg |
|||
if [ $? -ne 0 ]; then |
|||
echo "'installpkg' command is missing." |
|||
exit 1 |
|||
fi |
|||
|
|||
type slackpkg |
|||
if [ $? -ne 0 ]; then |
|||
echo "'slackpkg' command is missing." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ -z "$path" ]; then |
|||
echo "'path' parameter is required." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ "$(id -u)" != "0" ]; then |
|||
echo "This script should be run as 'root'." |
|||
exit 1 |
|||
fi |
|||
|
|||
# If no release version was specified, use current |
|||
release=${release:-current} |
|||
|
|||
if [ -z "$name" ]; then |
|||
# no name given? set a default one |
|||
name=slackwarecontainer |
|||
fi |
|||
|
|||
# detect rootfs |
|||
config="$path/config" |
|||
if [ -z "$rootfs" ]; then |
|||
if grep -q '^lxc.rootfs' $config 2>/dev/null ; then |
|||
rootfs=$(awk -F= '/^lxc.rootfs =/{ print $2 }' $config) |
|||
else |
|||
rootfs=$path/rootfs |
|||
fi |
|||
fi |
|||
|
|||
echo |
|||
|
|||
set -e |
|||
|
|||
install_slackware $rootfs |
|||
if [ $? -ne 0 ]; then |
|||
echo "Failed to install slackware." |
|||
exit 1 |
|||
fi |
|||
|
|||
echo |
|||
|
|||
configure_slackware $cache/rootfs-$release-$arch $name |
|||
if [ $? -ne 0 ]; then |
|||
echo "Failed to configure slackware for a container." |
|||
exit 1 |
|||
fi |
|||
|
|||
echo |
|||
|
|||
rootfs=$path/rootfs |
|||
copy_slackware $rootfs |
|||
if [ $? -ne 0 ]; then |
|||
echo "Failed to copy rootfs." |
|||
exit 1 |
|||
fi |
|||
|
|||
echo |
|||
|
|||
copy_configuration $path $rootfs $name |
|||
if [ $? -ne 0 ]; then |
|||
echo "Failed to write configuration file." |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ ! -z $clean ]; then |
|||
clean || exit 1 |
|||
exit 0 |
|||
fi |
@ -0,0 +1,182 @@ |
|||
#!/bin/sh |
|||
|
|||
# Copyright 2011, 2012, 2013, 2014, 2015, 2016 Patrick J. Volkerding, Sebeka, Minnesota, USA |
|||
# All rights reserved. |
|||
# |
|||
# Redistribution and use of this script, with or without modification, is |
|||
# permitted provided that the following conditions are met: |
|||
# |
|||
# 1. Redistributions of this script must retain the above copyright |
|||
# notice, this list of conditions and the following disclaimer. |
|||
# |
|||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
|||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
|||
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
|||
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
|||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
|||
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
# Modified by Matteo Bernardini <ponce@slackbuilds.org> (2014) |
|||
|
|||
PKGNAM=lxc |
|||
VERSION=${VERSION:-$(echo $PKGNAM-*.tar.?z* | rev | cut -f 3- -d . | rev | cut -f 2- -d -)} |
|||
BUILD=${BUILD:-4} |
|||
|
|||
# Automatically determine the architecture we're building on: |
|||
if [ -z "$ARCH" ]; then |
|||
case "$( uname -m )" in |
|||
i?86) export ARCH=i586 ;; |
|||
arm*) export ARCH=arm ;; |
|||
# Unless $ARCH is already set, use uname -m for all other archs: |
|||
*) export ARCH=$( uname -m ) ;; |
|||
esac |
|||
fi |
|||
|
|||
NUMJOBS=${NUMJOBS:-" -j7 "} |
|||
|
|||
if [ "$ARCH" = "i586" ]; then |
|||
SLKCFLAGS="-O2 -march=i586 -mtune=i686" |
|||
LIBDIRSUFFIX="" |
|||
elif [ "$ARCH" = "s390" ]; then |
|||
SLKCFLAGS="-O2" |
|||
LIBDIRSUFFIX="" |
|||
elif [ "$ARCH" = "x86_64" ]; then |
|||
SLKCFLAGS="-O2 -fPIC" |
|||
LIBDIRSUFFIX="64" |
|||
else |
|||
SLKCFLAGS="-O2" |
|||
LIBDIRSUFFIX="" |
|||
fi |
|||
|
|||
CWD=$(pwd) |
|||
TMP=${TMP:-/tmp} |
|||
PKG=$TMP/package-$PKGNAM |
|||
|
|||
rm -rf $PKG |
|||
mkdir -p $TMP $PKG |
|||
|
|||
cd $TMP |
|||
rm -rf $PKGNAM-$VERSION |
|||
tar xvf $CWD/$PKGNAM-$VERSION.tar.?z* || exit 1 |
|||
cd $PKGNAM-$VERSION |
|||
|
|||
chown -R root:root . |
|||
find . \ |
|||
\( -perm 777 -o -perm 775 -o -perm 711 -o -perm 555 -o -perm 511 \) \ |
|||
-exec chmod 755 {} \; -o \ |
|||
\( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \ |
|||
-exec chmod 644 {} \; |
|||
|
|||
# Add the template file: |
|||
cat $CWD/lxc-slackware.in > templates/lxc-slackware.in |
|||
|
|||
# Our python package is not split: |
|||
sed -i "s|PKG_CHECK_MODULES(\[PYTHONDEV.*||" configure.ac || exit 1 |
|||
|
|||
autoreconf -fi |
|||
|
|||
# Enable python stuff only if python3 is installed |
|||
python="" |
|||
[ -x /usr/bin/python3 ] && export PYTHON=/usr/bin/python3 && python="--enable-python" |
|||
|
|||
# Configure: |
|||
# lua is autodetected |
|||
CFLAGS="$SLKCFLAGS" \ |
|||
./configure \ |
|||
--prefix=/usr \ |
|||
--sysconfdir=/etc \ |
|||
--libdir=/usr/lib${LIBDIRSUFFIX} \ |
|||
--localstatedir=/var \ |
|||
--mandir=/usr/man \ |
|||
--docdir=/usr/doc/$PKGNAM-$VERSION \ |
|||
--infodir=/usr/info \ |
|||
--with-global-conf=/etc/lxc/lxc.conf \ |
|||
--with-rootfs-path=/var/lib/rootfs-lxc \ |
|||
$python \ |
|||
--build=$ARCH-slackware-linux |
|||
|
|||
# Build and install: |
|||
make $NUMJOBS || make || exit 1 |
|||
make install DESTDIR=$PKG || exit 1 |
|||
|
|||
# Add the modified Slackware startup scripts: |
|||
mkdir -p $PKG/usr/share/lxc/scripts/slackware |
|||
cp -a $CWD/scripts/*.lxc $PKG/usr/share/lxc/scripts/slackware |
|||
chown root:root $PKG/usr/share/lxc/scripts/slackware/* |
|||
chmod 644 $PKG/usr/share/lxc/scripts/slackware/* |
|||
|
|||
# Make the default configuration directories and an empty rootfs folder: |
|||
mkdir -p $PKG/var/lib/lxc $PKG/etc/lxc $PKG/var/lib/rootfs-lxc |
|||
|
|||
# Create a sample default configuration file: |
|||
echo "lxcpath = /var/lib/lxc" > $PKG/etc/lxc/lxc.conf.sample |
|||
|
|||
# Move the other config files to .new: |
|||
mv $PKG/etc/lxc/default.conf $PKG/etc/lxc/default.conf.new |
|||
mv $PKG/etc/default/lxc $PKG/etc/default/lxc.new |
|||
|
|||
# Install an init script (non executable by default): |
|||
install -D -m 0644 $CWD/rc.lxc $PKG/etc/rc.d/rc.lxc.new |
|||
|
|||
# Put bash completion file in system directory: |
|||
mkdir -p $PKG/usr/share/bash-completion/completions/ |
|||
mv $PKG/etc/bash_completion.d/lxc \ |
|||
$PKG/usr/share/bash-completion/completions/lxc |
|||
rmdir --parents $PKG/etc/bash_completion.d 2>/dev/null |
|||
# Replace illegal characters in the bash completion file: |
|||
sed -i "s/lxc-generic-/lxc_generic_/g" $PKG/usr/share/bash-completion/completions/lxc |
|||
|
|||
# Strip binaries: |
|||
( cd $PKG |
|||
find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null |
|||
find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null |
|||
) |
|||
|
|||
# Add a documentation directory: |
|||
mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION |
|||
cp -a \ |
|||
AUTHORS CONTRIBUTING COPYING* INSTALL MAINTAINERS NEWS README* TODO \ |
|||
doc/FAQ.txt \ |
|||
$PKG/usr/doc/${PKGNAM}-$VERSION |
|||
|
|||
mkdir -p $PKG/usr/doc/${PKGNAM}-$VERSION/examples |
|||
cp -a doc/examples/*.conf $PKG/usr/doc/${PKGNAM}-$VERSION/examples |
|||
|
|||
# Fix up man pages to stop 'man' from barfing a warning: |
|||
( cd $PKG/usr/man |
|||
fgrep -lr -- '-*- coding: us-ascii -*-' . | xargs sed -i '/-*- coding: us-ascii -*-/d' ) |
|||
|
|||
# Compress and if needed symlink the man pages: |
|||
if [ -d $PKG/usr/man ]; then |
|||
( cd $PKG/usr/man |
|||
for manpagedir in $(find . -type d -name "man*") ; do |
|||
( cd $manpagedir |
|||
for eachpage in $( find . -type l -maxdepth 1) ; do |
|||
ln -s $( readlink $eachpage ).gz $eachpage.gz |
|||
rm $eachpage |
|||
done |
|||
gzip -9 *.? |
|||
) |
|||
done |
|||
) |
|||
fi |
|||
|
|||
# If there's a ChangeLog, installing at least part of the recent history |
|||
# is useful, but don't let it get totally out of control: |
|||
if [ -r ChangeLog ]; then |
|||
DOCSDIR=$(echo $PKG/usr/doc/${PKGNAM}-$VERSION) |
|||
cat ChangeLog | head -n 1000 > $DOCSDIR/ChangeLog |
|||
touch -r ChangeLog $DOCSDIR/ChangeLog |
|||
fi |
|||
|
|||
mkdir -p $PKG/install |
|||
cat $CWD/slack-desc > $PKG/install/slack-desc |
|||
cat $CWD/doinst.sh > $PKG/install/doinst.sh |
|||
|
|||
cd $PKG |
|||
/sbin/makepkg -l y -c n $TMP/$PKGNAM-$(echo $VERSION | tr - _)-$ARCH-$BUILD.txz |
|||
|
@ -0,0 +1,63 @@ |
|||
#!/bin/sh |
|||
# rc.lxc init script |
|||
# Written by Matteo Bernardini <ponce@slackbuilds.org> |
|||
# |
|||
# This script checks for the presence of the parameter lxc.start.auto |
|||
# in the available container configurations: if it's set to 1 the |
|||
# container is started (in an auto-detached screen session if |
|||
# screen is available) when rc.lxc is called with the "start" param. |
|||
# |
|||
# To stop the container it uses lxc-attach to execute /sbin/halt |
|||
# inside of it. |
|||
|
|||
. /usr/share/lxc/lxc.functions |
|||
|
|||
start_lxc() { |
|||
for CONTAIN in $(/usr/bin/lxc-ls); do |
|||
if [ "$(lxc-info -n $CONTAIN -c lxc.start.auto)" = "lxc.start.auto = 1" ]; then |
|||
if [ "$(/usr/bin/lxc-info -s -n $CONTAIN | grep STOPPED$)" ]; then |
|||
echo "Starting LXC container ${CONTAIN}." |
|||
if [ -x /usr/bin/screen ]; then |
|||
/usr/bin/screen -dmS init-${CONTAIN} /usr/bin/lxc-start -n $CONTAIN |
|||
else |
|||
/usr/bin/lxc-start -n $CONTAIN -d |
|||
fi |
|||
/usr/bin/lxc-wait -n $CONTAIN -s RUNNING |
|||
if [ $? -gt 0 ]; then |
|||
return 2 |
|||
fi |
|||
fi |
|||
fi |
|||
done |
|||
} |
|||
|
|||
stop_lxc() { |
|||
for CONTAIN in $(/usr/bin/lxc-ls --active); do |
|||
echo "Stopping LXC container ${CONTAIN}." |
|||
/usr/bin/lxc-stop -n $CONTAIN |
|||
/usr/bin/lxc-wait -n $CONTAIN -s STOPPED |
|||
if [ $? -gt 0 ]; then |
|||
return 2 |
|||
fi |
|||
done |
|||
} |
|||
|
|||
restart_lxc() { |
|||
stop_lxc |
|||
sleep 2 |
|||
start_lxc |
|||
} |
|||
|
|||
case "$1" in |
|||
'start') |
|||
start_lxc |
|||
;; |
|||
'stop') |
|||
stop_lxc |
|||
;; |
|||
restart) |
|||
restart_lxc |
|||
;; |
|||
*) |
|||
echo "usage $0 start|stop|restart" |
|||
esac |
@ -0,0 +1,11 @@ |
|||
These are modified versions of some sysvinit-scripts and network-scripts for |
|||
Slackware for use in a container (although they should also work for a regular |
|||
non-container system as well). |
|||
|
|||
Versions ending in .lxc are the scripts to be used in a container. |
|||
Versions ending in .orig are the scripts from the sysvinit-scripts and |
|||
network-scripts packages that the .lxc scripts are based on. |
|||
|
|||
Any changes made to the original scripts in sysvinit-scripts or network-scripts |
|||
*may* need to be ported to these versions. |
|||
|
@ -0,0 +1,316 @@ |
|||
#! /bin/sh |
|||
# |
|||
# rc.6 This file is executed by init when it goes into runlevel |
|||
# 0 (halt) or runlevel 6 (reboot). It kills all processes, |
|||
# unmounts file systems and then either halts or reboots. |
|||
# |
|||
# Version: @(#)/etc/rc.d/rc.6 2.47 Sat Jan 13 13:37:26 PST 2001 |
|||
# |
|||
# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> |
|||
# Modified by: Patrick J. Volkerding, <volkerdi@slackware.com> |
|||
# |
|||
|
|||
# Set the path. |
|||
PATH=/sbin:/etc:/bin:/usr/bin |
|||
|
|||
# Set $container variable since this is a modified version of rc.6 with |
|||
# changes for running in an lxc container. A check to see if this variable |
|||
# is set will be used to skip parts of the script that we don't want to run |
|||
# in a container. Thanks to Matteo Bernardini <ponce@slackbuilds.org> and |
|||
# Chris Willing for the initial work making this script lxc compatible. |
|||
container="lxc" |
|||
|
|||
# If there are SystemV init scripts for this runlevel, run them. |
|||
if [ -x /etc/rc.d/rc.sysvinit ]; then |
|||
. /etc/rc.d/rc.sysvinit |
|||
fi |
|||
|
|||
# Set linefeed mode to avoid staircase effect. |
|||
/bin/stty onlcr |
|||
|
|||
echo "Running shutdown script $0:" |
|||
|
|||
# Find out how we were called. |
|||
case "$0" in |
|||
*0) |
|||
shutdown_command="halt" |
|||
;; |
|||
*6) |
|||
shutdown_command=reboot |
|||
;; |
|||
*) |
|||
echo "$0: call me as \"rc.0\" or \"rc.6\" please!" |
|||
exit 1 |
|||
;; |
|||
esac |
|||
|
|||
# Save the system time to the hardware clock using hwclock --systohc. |
|||
# This will also create or update the timestamps in /etc/adjtime. |
|||
if [ -x /sbin/hwclock -a -z "$container" ]; then |
|||
# Check for a broken motherboard RTC clock (where ioports for rtc are |
|||
# unknown) to prevent hwclock causing a hang: |
|||
if ! grep -q " : rtc" /proc/ioports ; then |
|||
CLOCK_OPT="--directisa" |
|||
fi |
|||
if [ /etc/adjtime -nt /etc/hardwareclock ]; then |
|||
if grep -q "^LOCAL" /etc/adjtime ; then |
|||
echo "Saving system time to the hardware clock (localtime)." |
|||
else |
|||
echo "Saving system time to the hardware clock (UTC)." |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --systohc |
|||
elif grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then |
|||
echo "Saving system time to the hardware clock (UTC)." |
|||
if [ ! -r /etc/adjtime ]; then |
|||
echo "Creating system time correction file /etc/adjtime." |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --utc --systohc |
|||
else |
|||
echo "Saving system time to the hardware clock (localtime)." |
|||
if [ ! -r /etc/adjtime ]; then |
|||
echo "Creating system time correction file /etc/adjtime." |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --localtime --systohc |
|||
fi |
|||
fi |
|||
|
|||
# Run any local shutdown scripts: |
|||
if [ -x /etc/rc.d/rc.local_shutdown ]; then |
|||
/etc/rc.d/rc.local_shutdown stop |
|||
fi |
|||
|
|||
# Stop the Apache web server: |
|||
if [ -x /etc/rc.d/rc.httpd ]; then |
|||
/etc/rc.d/rc.httpd stop |
|||
fi |
|||
|
|||
# Stop the MySQL database: |
|||
if [ -r /var/run/mysql/mysql.pid ]; then |
|||
. /etc/rc.d/rc.mysqld stop |
|||
fi |
|||
|
|||
# Stop the Samba server: |
|||
if [ -x /etc/rc.d/rc.samba ]; then |
|||
. /etc/rc.d/rc.samba stop |
|||
fi |
|||
|
|||
# Shut down the NFS server: |
|||
if [ -x /etc/rc.d/rc.nfsd ]; then |
|||
/etc/rc.d/rc.nfsd stop |
|||
fi |
|||
|
|||
# Shut down the SSH server: |
|||
if [ -x /etc/rc.d/rc.sshd ]; then |
|||
/etc/rc.d/rc.sshd stop |
|||
fi |
|||
|
|||
# Shut down the SASL authentication daemon: |
|||
if [ -x /etc/rc.d/rc.saslauthd ]; then |
|||
/etc/rc.d/rc.saslauthd stop |
|||
fi |
|||
|
|||
# Shut down OpenLDAP: |
|||
if [ -x /etc/rc.d/rc.openldap ]; then |
|||
/etc/rc.d/rc.openldap stop |
|||
fi |
|||
|
|||
# Stop D-Bus: |
|||
if [ -x /etc/rc.d/rc.messagebus ]; then |
|||
sh /etc/rc.d/rc.messagebus stop |
|||
fi |
|||
|
|||
# Kill any processes (typically gam) that would otherwise prevent |
|||
# unmounting NFS volumes: |
|||
unset FUSER_DELAY |
|||
for dir in $(/bin/mount | grep 'type nfs ' | cut -d ' ' -f 3 ) ; do |
|||
echo "Killing processes holding NFS mount $dir open..." |
|||
# Background this to prevent fuser from also blocking shutdown: |
|||
/usr/bin/fuser -k -m $dir & |
|||
FUSER_DELAY=5 |
|||
done |
|||
# If fuser was run, let it have some delay: |
|||
if [ ! -z "$FUSER_DELAY" ]; then |
|||
sleep $FUSER_DELAY |
|||
fi |
|||
|
|||
# Unmount any NFS, SMB, or CIFS filesystems: |
|||
echo "Unmounting remote filesystems:" |
|||
/bin/umount -v -a -l -f -r -t nfs,smbfs,cifs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" |
|||
|
|||
# Try to shut down pppd: |
|||
PS="$(ps ax)" |
|||
if echo "$PS" | /bin/grep -q -w pppd ; then |
|||
if [ -x /usr/sbin/ppp-off ]; then |
|||
/usr/sbin/ppp-off |
|||
fi |
|||
fi |
|||
|
|||
# Shut down YP services: |
|||
if [ -x /etc/rc.d/rc.yp ]; then |
|||
if grep -wq stop /etc/rc.d/rc.yp ; then |
|||
/etc/rc.d/rc.yp stop |
|||
fi |
|||
fi |
|||
|
|||
# Bring down the networking system, but first make sure that this |
|||
# isn't a diskless client with the / partition mounted via NFS: |
|||
if ! /bin/mount | /bin/grep -q 'on / type nfs' ; then |
|||
if [ -x /etc/rc.d/rc.inet1 ]; then |
|||
. /etc/rc.d/rc.inet1 stop |
|||
fi |
|||
fi |
|||
|
|||
# In case dhcpcd might have been manually started on the command line, |
|||
# look for the .pid file, and shut dhcpcd down if it's found: |
|||
if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then |
|||
/sbin/dhcpcd -k 1> /dev/null 2> /dev/null |
|||
# A little time for /etc/resolv.conf and/or other files to |
|||
# restore themselves. |
|||
sleep 2 |
|||
fi |
|||
|
|||
# Shut down PCMCIA devices: |
|||
if [ -x /etc/rc.d/rc.pcmcia -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.pcmcia stop |
|||
# The cards might need a little extra time here to deactivate: |
|||
/bin/sleep 5 |
|||
fi |
|||
|
|||
# Turn off process accounting: |
|||
if [ -x /sbin/accton -a -r /var/log/pacct ]; then |
|||
/sbin/accton off |
|||
fi |
|||
|
|||
# Terminate acpid before syslog: |
|||
if [ -x /etc/rc.d/rc.acpid -a -r /var/run/acpid.pid -a -z "$container" ]; then # quit |
|||
. /etc/rc.d/rc.acpid stop |
|||
fi |
|||
|
|||
# Stop udev: |
|||
if [ -x /etc/rc.d/rc.udev -a -z "$container" ]; then |
|||
sh /etc/rc.d/rc.udev force-stop |
|||
fi |
|||
|
|||
# Kill all remaining processes. |
|||
OMITPIDS="$(for p in $(pgrep mdmon); do echo -o $p; done)" # Don't kill mdmon |
|||
if [ ! "$1" = "fast" ]; then |
|||
echo "Sending all processes the SIGTERM signal." |
|||
/sbin/killall5 -15 $OMITPIDS |
|||
/bin/sleep 5 |
|||
echo "Sending all processes the SIGKILL signal." |
|||
/sbin/killall5 -9 $OMITPIDS |
|||
fi |
|||
|
|||
# Try to turn off quota. |
|||
if /bin/grep -q quota /etc/fstab ; then |
|||
if [ -x /sbin/quotaoff -a -z "$container" ]; then |
|||
echo "Turning off filesystem quotas." |
|||
/sbin/quotaoff -a |
|||
fi |
|||
fi |
|||
|
|||
# Carry a random seed between reboots. |
|||
echo "Saving random seed from /dev/urandom in /etc/random-seed." |
|||
# Use the pool size from /proc, or 4096 bits: |
|||
if [ -r /proc/sys/kernel/random/poolsize ]; then |
|||
/bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(expr $(cat /proc/sys/kernel/random/poolsize) / 8) 2> /dev/null |
|||
else |
|||
/bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null |
|||
fi |
|||
/bin/chmod 600 /etc/random-seed |
|||
|
|||
# Before unmounting file systems write a reboot or halt record to wtmp. |
|||
$shutdown_command -w |
|||
|
|||
# Turn off swap: |
|||
if [ -z "$container" ]; then |
|||
echo "Turning off swap." |
|||
/sbin/swapoff -a |
|||
/bin/sync |
|||
fi |
|||
|
|||
# Stop cgmanager and cgproxy: |
|||
if [ -x /etc/rc.d/rc.cgmanager -a -z "$container" ]; then |
|||
sh /etc/rc.d/rc.cgmanager stop |
|||
fi |
|||
|
|||
if [ -z "$container" ]; then |
|||
echo "Unmounting local file systems:" |
|||
/bin/umount -v -a -t no,proc,sysfs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" 2> /dev/null |
|||
echo "Remounting root filesystem read-only:" |
|||
/bin/mount -v -n -o remount,ro / |
|||
fi |
|||
|
|||
# This never hurts: |
|||
/bin/sync |
|||
|
|||
# Close any volumes opened by cryptsetup: |
|||
if [ -f /etc/crypttab -a -x /sbin/cryptsetup ]; then |
|||
cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do |
|||
# NOTE: we only support LUKS formatted volumes (except for swap)! |
|||
LUKS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ') |
|||
DEV=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ') |
|||
OPTS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ') |
|||
if /sbin/cryptsetup isLuks $DEV 2>/dev/null ; then |
|||
echo "Locking LUKS crypt volume '${LUKS}':" |
|||
/sbin/cryptsetup luksClose ${LUKS} |
|||
elif echo $OPTS | grep -wq swap ; then |
|||
# If any of the volumes was used as encrypted swap, |
|||
# then run mkswap on the underlying device - |
|||
# in case other Linux installations on this computer should use it: |
|||
echo "Erasing encrypted swap '${LUKS}' and restoring normal swap on ${DEV}:" |
|||
/sbin/cryptsetup remove ${LUKS} |
|||
mkswap $DEV |
|||
fi |
|||
done |
|||
fi |
|||
|
|||
# Deactivate LVM volume groups: |
|||
if [ -z "$container" ]; then |
|||
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then |
|||
echo "Deactivating LVM volume groups:" |
|||
/sbin/vgchange -an --ignorelockingfailure |
|||
fi |
|||
fi |
|||
|
|||
# This never hurts again (especially since root-on-LVM always fails |
|||
# to deactivate the / logical volume... but at least it was |
|||
# remounted as read-only first) |
|||
/bin/sync |
|||
|
|||
# sleep 3 fixes problems with some hard drives that don't |
|||
# otherwise finish syncing before reboot or poweroff |
|||
/bin/sleep 3 |
|||
|
|||
# This is to ensure all processes have completed on SMP machines: |
|||
wait |
|||
|
|||
if [ -x /sbin/genpowerd -a -z "$container" ]; then |
|||
# See if this is a powerfail situation: |
|||
if /bin/egrep -q "FAIL|SCRAM" /etc/upsstatus 2> /dev/null ; then |
|||
# Signal UPS to shut off the inverter: |
|||
/sbin/genpowerd -k |
|||
if [ ! $? = 0 ]; then |
|||
echo |
|||
echo "There was an error signaling the UPS." |
|||
echo "Perhaps you need to edit /etc/genpowerd.conf to configure" |
|||
echo "the serial line and UPS type." |
|||
# Wasting 15 seconds of precious power: |
|||
/bin/sleep 15 |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
if [ "$container" = "lxc" ]; then |
|||
# confirm successful shutdown of the container |
|||
echo "LXC container stopped." |
|||
fi |
|||
|
|||
# Now halt (poweroff with APM or ACPI enabled kernels) or reboot. |
|||
if [ "$shutdown_command" = "reboot" ]; then |
|||
echo "Rebooting." |
|||
/sbin/reboot |
|||
else |
|||
/sbin/poweroff |
|||
fi |
|||
|
@ -0,0 +1,299 @@ |
|||
#! /bin/sh |
|||
# |
|||
# rc.6 This file is executed by init when it goes into runlevel |
|||
# 0 (halt) or runlevel 6 (reboot). It kills all processes, |
|||
# unmounts file systems and then either halts or reboots. |
|||
# |
|||
# Version: @(#)/etc/rc.d/rc.6 2.47 Sat Jan 13 13:37:26 PST 2001 |
|||
# |
|||
# Author: Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org> |
|||
# Modified by: Patrick J. Volkerding, <volkerdi@slackware.com> |
|||
# |
|||
|
|||
# Set the path. |
|||
PATH=/sbin:/etc:/bin:/usr/bin |
|||
|
|||
# If there are SystemV init scripts for this runlevel, run them. |
|||
if [ -x /etc/rc.d/rc.sysvinit ]; then |
|||
. /etc/rc.d/rc.sysvinit |
|||
fi |
|||
|
|||
# Set linefeed mode to avoid staircase effect. |
|||
/bin/stty onlcr |
|||
|
|||
echo "Running shutdown script $0:" |
|||
|
|||
# Find out how we were called. |
|||
case "$0" in |
|||
*0) |
|||
shutdown_command="halt" |
|||
;; |
|||
*6) |
|||
shutdown_command=reboot |
|||
;; |
|||
*) |
|||
echo "$0: call me as \"rc.0\" or \"rc.6\" please!" |
|||
exit 1 |
|||
;; |
|||
esac |
|||
|
|||
# Save the system time to the hardware clock using hwclock --systohc. |
|||
# This will also create or update the timestamps in /etc/adjtime. |
|||
if [ -x /sbin/hwclock ]; then |
|||
# Check for a broken motherboard RTC clock (where ioports for rtc are |
|||
# unknown) to prevent hwclock causing a hang: |
|||
if ! grep -q " : rtc" /proc/ioports ; then |
|||
CLOCK_OPT="--directisa" |
|||
fi |
|||
if [ /etc/adjtime -nt /etc/hardwareclock ]; then |
|||
if grep -q "^LOCAL" /etc/adjtime ; then |
|||
echo "Saving system time to the hardware clock (localtime)." |
|||
else |
|||
echo "Saving system time to the hardware clock (UTC)." |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --systohc |
|||
elif grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then |
|||
echo "Saving system time to the hardware clock (UTC)." |
|||
if [ ! -r /etc/adjtime ]; then |
|||
echo "Creating system time correction file /etc/adjtime." |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --utc --systohc |
|||
else |
|||
echo "Saving system time to the hardware clock (localtime)." |
|||
if [ ! -r /etc/adjtime ]; then |
|||
echo "Creating system time correction file /etc/adjtime." |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --localtime --systohc |
|||
fi |
|||
fi |
|||
|
|||
# Run any local shutdown scripts: |
|||
if [ -x /etc/rc.d/rc.local_shutdown ]; then |
|||
/etc/rc.d/rc.local_shutdown stop |
|||
fi |
|||
|
|||
# Stop the Apache web server: |
|||
if [ -x /etc/rc.d/rc.httpd ]; then |
|||
/etc/rc.d/rc.httpd stop |
|||
fi |
|||
|
|||
# Stop the MySQL database: |
|||
if [ -r /var/run/mysql/mysql.pid ]; then |
|||
. /etc/rc.d/rc.mysqld stop |
|||
fi |
|||
|
|||
# Stop the Samba server: |
|||
if [ -x /etc/rc.d/rc.samba ]; then |
|||
. /etc/rc.d/rc.samba stop |
|||
fi |
|||
|
|||
# Shut down the NFS server: |
|||
if [ -x /etc/rc.d/rc.nfsd ]; then |
|||
/etc/rc.d/rc.nfsd stop |
|||
fi |
|||
|
|||
# Shut down the SSH server: |
|||
if [ -x /etc/rc.d/rc.sshd ]; then |
|||
/etc/rc.d/rc.sshd stop |
|||
fi |
|||
|
|||
# Shut down the SASL authentication daemon: |
|||
if [ -x /etc/rc.d/rc.saslauthd ]; then |
|||
/etc/rc.d/rc.saslauthd stop |
|||
fi |
|||
|
|||
# Shut down OpenLDAP: |
|||
if [ -x /etc/rc.d/rc.openldap ]; then |
|||
/etc/rc.d/rc.openldap stop |
|||
fi |
|||
|
|||
# Stop D-Bus: |
|||
if [ -x /etc/rc.d/rc.messagebus ]; then |
|||
sh /etc/rc.d/rc.messagebus stop |
|||
fi |
|||
|
|||
# Kill any processes (typically gam) that would otherwise prevent |
|||
# unmounting NFS volumes: |
|||
unset FUSER_DELAY |
|||
for dir in $(/bin/mount | grep 'type nfs ' | cut -d ' ' -f 3 ) ; do |
|||
echo "Killing processes holding NFS mount $dir open..." |
|||
# Background this to prevent fuser from also blocking shutdown: |
|||
/usr/bin/fuser -k -m $dir & |
|||
FUSER_DELAY=5 |
|||
done |
|||
# If fuser was run, let it have some delay: |
|||
if [ ! -z "$FUSER_DELAY" ]; then |
|||
sleep $FUSER_DELAY |
|||
fi |
|||
|
|||
# Unmount any NFS, SMB, or CIFS filesystems: |
|||
echo "Unmounting remote filesystems:" |
|||
/bin/umount -v -a -l -f -r -t nfs,smbfs,cifs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" |
|||
|
|||
# Try to shut down pppd: |
|||
PS="$(ps ax)" |
|||
if echo "$PS" | /bin/grep -q -w pppd ; then |
|||
if [ -x /usr/sbin/ppp-off ]; then |
|||
/usr/sbin/ppp-off |
|||
fi |
|||
fi |
|||
|
|||
# Shut down YP services: |
|||
if [ -x /etc/rc.d/rc.yp ]; then |
|||
if grep -wq stop /etc/rc.d/rc.yp ; then |
|||
/etc/rc.d/rc.yp stop |
|||
fi |
|||
fi |
|||
|
|||
# Bring down the networking system, but first make sure that this |
|||
# isn't a diskless client with the / partition mounted via NFS: |
|||
if ! /bin/mount | /bin/grep -q 'on / type nfs' ; then |
|||
if [ -x /etc/rc.d/rc.inet1 ]; then |
|||
. /etc/rc.d/rc.inet1 stop |
|||
fi |
|||
fi |
|||
|
|||
# In case dhcpcd might have been manually started on the command line, |
|||
# look for the .pid file, and shut dhcpcd down if it's found: |
|||
if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then |
|||
/sbin/dhcpcd -k 1> /dev/null 2> /dev/null |
|||
# A little time for /etc/resolv.conf and/or other files to |
|||
# restore themselves. |
|||
sleep 2 |
|||
fi |
|||
|
|||
# Shut down PCMCIA devices: |
|||
if [ -x /etc/rc.d/rc.pcmcia ]; then |
|||
. /etc/rc.d/rc.pcmcia stop |
|||
# The cards might need a little extra time here to deactivate: |
|||
/bin/sleep 5 |
|||
fi |
|||
|
|||
# Turn off process accounting: |
|||
if [ -x /sbin/accton -a -r /var/log/pacct ]; then |
|||
/sbin/accton off |
|||
fi |
|||
|
|||
# Terminate acpid before syslog: |
|||
if [ -x /etc/rc.d/rc.acpid -a -r /var/run/acpid.pid ]; then # quit |
|||
. /etc/rc.d/rc.acpid stop |
|||
fi |
|||
|
|||
# Stop udev: |
|||
if [ -x /etc/rc.d/rc.udev ]; then |
|||
sh /etc/rc.d/rc.udev force-stop |
|||
fi |
|||
|
|||
# Kill all remaining processes. |
|||
OMITPIDS="$(for p in $(pgrep mdmon); do echo -o $p; done)" # Don't kill mdmon |
|||
if [ ! "$1" = "fast" ]; then |
|||
echo "Sending all processes the SIGTERM signal." |
|||
/sbin/killall5 -15 $OMITPIDS |
|||
/bin/sleep 5 |
|||
echo "Sending all processes the SIGKILL signal." |
|||
/sbin/killall5 -9 $OMITPIDS |
|||
fi |
|||
|
|||
# Try to turn off quota. |
|||
if /bin/grep -q quota /etc/fstab ; then |
|||
if [ -x /sbin/quotaoff ]; then |
|||
echo "Turning off filesystem quotas." |
|||
/sbin/quotaoff -a |
|||
fi |
|||
fi |
|||
|
|||
# Carry a random seed between reboots. |
|||
echo "Saving random seed from /dev/urandom in /etc/random-seed." |
|||
# Use the pool size from /proc, or 4096 bits: |
|||
if [ -r /proc/sys/kernel/random/poolsize ]; then |
|||
/bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(expr $(cat /proc/sys/kernel/random/poolsize) / 8) 2> /dev/null |
|||
else |
|||
/bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null |
|||
fi |
|||
/bin/chmod 600 /etc/random-seed |
|||
|
|||
# Before unmounting file systems write a reboot or halt record to wtmp. |
|||
$shutdown_command -w |
|||
|
|||
# Turn off swap: |
|||
echo "Turning off swap." |
|||
/sbin/swapoff -a |
|||
/bin/sync |
|||
|
|||
# Stop cgmanager and cgproxy: |
|||
if [ -x /etc/rc.d/rc.cgmanager ]; then |
|||
sh /etc/rc.d/rc.cgmanager stop |
|||
fi |
|||
|
|||
echo "Unmounting local file systems:" |
|||
/bin/umount -v -a -t no,proc,sysfs | tr -d ' ' | grep successfully | sed "s/:successfullyunmounted/ has been successfully unmounted./g" 2> /dev/null |
|||
|
|||
echo "Remounting root filesystem read-only:" |
|||
/bin/mount -v -n -o remount,ro / |
|||
|
|||
# This never hurts: |
|||
/bin/sync |
|||
|
|||
# Close any volumes opened by cryptsetup: |
|||
if [ -f /etc/crypttab -a -x /sbin/cryptsetup ]; then |
|||
cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do |
|||
# NOTE: we only support LUKS formatted volumes (except for swap)! |
|||
LUKS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ') |
|||
DEV=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ') |
|||
OPTS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ') |
|||
if /sbin/cryptsetup isLuks $DEV 2>/dev/null ; then |
|||
echo "Locking LUKS crypt volume '${LUKS}':" |
|||
/sbin/cryptsetup luksClose ${LUKS} |
|||
elif echo $OPTS | grep -wq swap ; then |
|||
# If any of the volumes was used as encrypted swap, |
|||
# then run mkswap on the underlying device - |
|||
# in case other Linux installations on this computer should use it: |
|||
echo "Erasing encrypted swap '${LUKS}' and restoring normal swap on ${DEV}:" |
|||
/sbin/cryptsetup remove ${LUKS} |
|||
mkswap $DEV |
|||
fi |
|||
done |
|||
fi |
|||
|
|||
# Deactivate LVM volume groups: |
|||
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then |
|||
echo "Deactivating LVM volume groups:" |
|||
/sbin/vgchange -an --ignorelockingfailure |
|||
fi |
|||
|
|||
# This never hurts again (especially since root-on-LVM always fails |
|||
# to deactivate the / logical volume... but at least it was |
|||
# remounted as read-only first) |
|||
/bin/sync |
|||
|
|||
# sleep 3 fixes problems with some hard drives that don't |
|||
# otherwise finish syncing before reboot or poweroff |
|||
/bin/sleep 3 |
|||
|
|||
# This is to ensure all processes have completed on SMP machines: |
|||
wait |
|||
|
|||
if [ -x /sbin/genpowerd ]; then |
|||
# See if this is a powerfail situation: |
|||
if /bin/egrep -q "FAIL|SCRAM" /etc/upsstatus 2> /dev/null ; then |
|||
# Signal UPS to shut off the inverter: |
|||
/sbin/genpowerd -k |
|||
if [ ! $? = 0 ]; then |
|||
echo |
|||
echo "There was an error signaling the UPS." |
|||
echo "Perhaps you need to edit /etc/genpowerd.conf to configure" |
|||
echo "the serial line and UPS type." |
|||
# Wasting 15 seconds of precious power: |
|||
/bin/sleep 15 |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Now halt (poweroff with APM or ACPI enabled kernels) or reboot. |
|||
if [ "$shutdown_command" = "reboot" ]; then |
|||
echo "Rebooting." |
|||
/sbin/reboot |
|||
else |
|||
/sbin/poweroff |
|||
fi |
|||
|
@ -0,0 +1,397 @@ |
|||
#!/bin/sh |
|||
# |
|||
# rc.M This file is executed by init(8) when the system is being |
|||
# initialized for one of the "multi user" run levels (i.e. |
|||
# levels 1 through 6). It usually does mounting of file |
|||
# systems et al. |
|||
# |
|||
# Version: @(#)/etc/rc.d/rc.M 2.23 Wed Feb 26 19:20:58 PST 2003 |
|||
# |
|||
# Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> |
|||
# Heavily modified by Patrick Volkerding <volkerdi@slackware.com> |
|||
# |
|||
|
|||
# Tell the viewers what's going to happen. |
|||
echo "Going multiuser..." |
|||
|
|||
# Set $container variable since this is a modified version of rc.M with |
|||
# changes for running in an lxc container. A check to see if this variable |
|||
# is set will be used to skip parts of the script that we don't want to run |
|||
# in a container. Thanks to Matteo Bernardini <ponce@slackbuilds.org> and |
|||
# Chris Willing for the initial work making this script lxc compatible. |
|||
container="lxc" |
|||
|
|||
# Update all the shared library links: |
|||
if [ -x /sbin/ldconfig ]; then |
|||
echo "Updating shared library links: /sbin/ldconfig &" |
|||
/sbin/ldconfig & |
|||
fi |
|||
|
|||
# Screen blanks after 15 minutes idle time, and powers down in one hour |
|||
# if the kernel supports APM or ACPI power management: |
|||
if [ -z "$container" ]; then |
|||
/bin/setterm -blank 15 -powersave powerdown -powerdown 60 |
|||
fi |
|||
|
|||
# Set the hostname. |
|||
if [ -z "$container" ]; then |
|||
if [ -r /etc/HOSTNAME ]; then |
|||
/bin/hostname $(cat /etc/HOSTNAME | cut -f1 -d .) |
|||
else |
|||
# fall back on this old default: |
|||
echo "darkstar.example.net" > /etc/HOSTNAME |
|||
/bin/hostname darkstar |
|||
fi |
|||
fi |
|||
|
|||
# Set the permissions on /var/log/dmesg according to whether the kernel |
|||
# permits non-root users to access kernel dmesg information: |
|||
if [ -r /proc/sys/kernel/dmesg_restrict ]; then |
|||
if [ $(cat /proc/sys/kernel/dmesg_restrict) = 1 ]; then |
|||
touch /var/log/dmesg |
|||
chmod 640 /var/log/dmesg |
|||
fi |
|||
else |
|||
touch /var/log/dmesg |
|||
chmod 644 /var/log/dmesg |
|||
fi |
|||
# Save the contents of 'dmesg': |
|||
/bin/dmesg -s 65536 > /var/log/dmesg |
|||
|
|||
# Initialize PCMCIA devices: |
|||
# |
|||
# NOTE: This used to be started near the top of rc.S so that PCMCIA devices |
|||
# could be fsck'ed along with the other drives. This had some unfortunate |
|||
# side effects, however, since root isn't yet read-write, and /var might not |
|||
# even be mounted the .pid files can't be correctly written in /var/run and |
|||
# the pcmcia system can't be correctly shut down. If you want some PCMCIA |
|||
# partition to be mounted at boot (or when the card is inserted) then add |
|||
# the appropriate lines to /etc/pcmcia/scsi.opts. |
|||
# |
|||
# Note that the stuff in /etc/pcmcia/ is only for 2.4.x kernels using |
|||
# 16-bit PCMCIA cards (not 32-bit Cardbus cards!). For example, with a |
|||
# wireless card you might need to set options in /etc/pcmcia OR in |
|||
# /etc/rc.d/rc.wireless.conf, or even in /etc/rc.d/rc.inet1.conf (with |
|||
# extra options if needed for the encryption key, ESSID, etc.) |
|||
# |
|||
# Hopefully this situation will be unified in the future, but for now |
|||
# that's how it is... |
|||
# |
|||
if [ -x /etc/rc.d/rc.pcmcia -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.pcmcia start |
|||
# The cards might need a little extra time here to initialize. |
|||
sleep 5 |
|||
fi |
|||
|
|||
# Start the system logger. |
|||
if [ -x /etc/rc.d/rc.syslog -a -x /usr/sbin/syslogd -a -d /var/log ]; then |
|||
. /etc/rc.d/rc.syslog start |
|||
fi |
|||
|
|||
# Update the X font indexes: |
|||
if [ -x /usr/bin/fc-cache ]; then |
|||
echo "Updating X font indexes: /usr/bin/fc-cache -f &" |
|||
/usr/bin/fc-cache -f & |
|||
fi |
|||
|
|||
# Run rc.udev again. This will start udev if it is not already running |
|||
# (for example, upon return from runlevel 1), otherwise it will trigger it |
|||
# to look for device changes and to generate persistent rules if needed. |
|||
if grep -wq sysfs /proc/mounts && grep -q devtmpfs /proc/filesystems ; then |
|||
if ! grep -wq nohotplug /proc/cmdline ; then |
|||
if [ -x /etc/rc.d/rc.udev -a -z "$container" ]; then |
|||
/bin/sh /etc/rc.d/rc.udev start |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Initialize the networking hardware. |
|||
if [ -x /etc/rc.d/rc.inet1 ]; then |
|||
. /etc/rc.d/rc.inet1 |
|||
fi |
|||
|
|||
# Start D-Bus: |
|||
if [ -x /etc/rc.d/rc.messagebus ]; then |
|||
sh /etc/rc.d/rc.messagebus start |
|||
fi |
|||
|
|||
# Start Bluetooth: |
|||
if [ -x /etc/rc.d/rc.bluetooth ]; then |
|||
sh /etc/rc.d/rc.bluetooth start |
|||
fi |
|||
|
|||
# Start wicd or networkmanager: |
|||
if [ -x /etc/rc.d/rc.wicd -a -x /usr/sbin/wicd ]; then |
|||
sh /etc/rc.d/rc.wicd start |
|||
elif [ -x /etc/rc.d/rc.networkmanager ]; then |
|||
sh /etc/rc.d/rc.networkmanager start |
|||
fi |
|||
|
|||
# Start networking daemons: |
|||
if [ -x /etc/rc.d/rc.inet2 ]; then |
|||
. /etc/rc.d/rc.inet2 |
|||
fi |
|||
|
|||
# Look for additional USB/SCSI/IEEE1394/etc devices on multiple LUNs: |
|||
if [ -x /etc/rc.d/rc.scanluns ]; then |
|||
. /etc/rc.d/rc.scanluns |
|||
fi |
|||
|
|||
# Mount any additional filesystem types that haven't already been mounted: |
|||
mount -a -v 2> /dev/null | grep -v -e "already mounted" -e "ignored" | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done |
|||
|
|||
# Start the Control Script for automounter: |
|||
if [ -x /etc/rc.d/rc.autofs ]; then |
|||
sh /etc/rc.d/rc.autofs start |
|||
fi |
|||
|
|||
# Start the Network Time Protocol daemon: |
|||
if [ -x /etc/rc.d/rc.ntpd ]; then |
|||
sh /etc/rc.d/rc.ntpd start |
|||
fi |
|||
|
|||
# Remove stale locks and junk files (must be done after mount -a!) |
|||
/bin/rm -f /var/lock/* /var/spool/uucp/LCK..* /tmp/.X*lock /tmp/core /core 2> /dev/null |
|||
/bin/rm -rf /var/spool/cron/cron.?????? 2> /dev/null |
|||
|
|||
# Remove stale hunt sockets so the game can start. |
|||
if [ -r /tmp/hunt -o -r /tmp/hunt.stats ]; then |
|||
echo "Removing your stale hunt sockets from /tmp." |
|||
/bin/rm -f /tmp/hunt* |
|||
fi |
|||
|
|||
# Ensure basic filesystem permissions sanity. |
|||
chmod 755 / 2> /dev/null |
|||
chmod 1777 /tmp /var/tmp |
|||
|
|||
# Start ACPI daemon. |
|||
if [ -x /etc/rc.d/rc.acpid -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.acpid start |
|||
fi |
|||
|
|||
# Enable CPU frequency scaling: |
|||
if [ -x /etc/rc.d/rc.cpufreq -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.cpufreq start |
|||
fi |
|||
|
|||
# Update any existing icon cache files: |
|||
if find /usr/share/icons -maxdepth 2 2> /dev/null | grep -q icon-theme.cache ; then |
|||
for theme_dir in /usr/share/icons/* ; do |
|||
if [ -r ${theme_dir}/icon-theme.cache ]; then |
|||
echo "Updating icon-theme.cache in ${theme_dir}..." |
|||
/usr/bin/gtk-update-icon-cache -t -f ${theme_dir} 1> /dev/null 2> /dev/null & |
|||
fi |
|||
done |
|||
# This would be a large file and probably shouldn't be there. |
|||
if [ -r /usr/share/icons/icon-theme.cache ]; then |
|||
echo "Deleting icon-theme.cache in /usr/share/icons..." |
|||
#/usr/bin/gtk-update-icon-cache -t -f /usr/share/icons 1> /dev/null 2> /dev/null & |
|||
rm -f /usr/share/icons/icon-theme.cache |
|||
fi |
|||
fi |
|||
|
|||
# Update mime database: |
|||
if [ -x /usr/bin/update-mime-database -a -d /usr/share/mime ]; then |
|||
echo "Updating MIME database: /usr/bin/update-mime-database /usr/share/mime &" |
|||
/usr/bin/update-mime-database /usr/share/mime 1> /dev/null 2> /dev/null & |
|||
fi |
|||
|
|||
# Start console-kit-daemon: |
|||
if [ -x /etc/rc.d/rc.consolekit ]; then |
|||
sh /etc/rc.d/rc.consolekit start |
|||
fi |
|||
|
|||
# Start HAL: |
|||
if [ -x /etc/rc.d/rc.hald ]; then |
|||
sh /etc/rc.d/rc.hald start |
|||
fi |
|||
|
|||
# Start system-wide PulseAudio daemon (not recommended, nor required in |
|||
# order to use PulseAudio -- see the script for details): |
|||
if [ -x /etc/rc.d/rc.pulseaudio ]; then |
|||
. /etc/rc.d/rc.pulseaudio start |
|||
fi |
|||
|
|||
# These GTK+/pango files need to be kept up to date for |
|||
# proper input method, pixbuf loaders, and font support. |
|||
if [ -x /usr/bin/update-gtk-immodules ]; then |
|||
echo "Updating gtk.immodules:" |
|||
echo " /usr/bin/update-gtk-immodules &" |
|||
/usr/bin/update-gtk-immodules > /dev/null 2>&1 & |
|||
fi |
|||
if [ -x /usr/bin/update-gdk-pixbuf-loaders ]; then |
|||
echo "Updating gdk-pixbuf.loaders:" |
|||
echo " /usr/bin/update-gdk-pixbuf-loaders &" |
|||
/usr/bin/update-gdk-pixbuf-loaders > /dev/null 2>&1 & |
|||
fi |
|||
if [ -x /usr/bin/update-pango-querymodules ]; then |
|||
echo "Updating pango.modules:" |
|||
echo " /usr/bin/update-pango-querymodules &" |
|||
/usr/bin/update-pango-querymodules > /dev/null 2>&1 & |
|||
fi |
|||
if [ -x /usr/bin/glib-compile-schemas ]; then |
|||
echo "Compiling GSettings XML schema files:" |
|||
echo " /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas &" |
|||
/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas >/dev/null 2>&1 & |
|||
fi |
|||
|
|||
# Start dnsmasq, a simple DHCP/DNS server: |
|||
if [ -x /etc/rc.d/rc.dnsmasq ]; then |
|||
/etc/rc.d/rc.dnsmasq start |
|||
fi |
|||
|
|||
# Start snmpd: |
|||
if [ -x /etc/rc.d/rc.snmpd ]; then |
|||
/etc/rc.d/rc.snmpd start |
|||
fi |
|||
|
|||
# Start the print spooling system. This will usually be LPRng (lpd) or CUPS. |
|||
if [ -x /etc/rc.d/rc.cups ]; then |
|||
# Start CUPS: |
|||
/etc/rc.d/rc.cups start |
|||
elif [ -x /etc/rc.d/rc.lprng ]; then |
|||
# Start LPRng (lpd): |
|||
. /etc/rc.d/rc.lprng start |
|||
fi |
|||
|
|||
# Start netatalk. (a file/print server for Macs using Appletalk) |
|||
if [ -x /etc/rc.d/rc.atalk ]; then |
|||
/etc/rc.d/rc.atalk start |
|||
fi |
|||
|
|||
# Start smartd, which monitors the status of S.M.A.R.T. compatible |
|||
# hard drives and reports any problems. Note some devices (which aren't |
|||
# smart, I guess ;) will hang if probed by smartd, so it's commented out |
|||
# by default. |
|||
#if [ -x /usr/sbin/smartd ]; then |
|||
# /usr/sbin/smartd |
|||
#fi |
|||
|
|||
# Monitor the UPS with genpowerd. |
|||
# To use this, uncomment this section and edit your settings in |
|||
# /etc/genpowerd.conf (serial device, UPS type, etc). For more information, |
|||
# see "man genpowerd" or the extensive documentation in the |
|||
# /usr/doc/genpower-*/ directory. |
|||
# You'll also need to configure a similar block in /etc/rc.d/rc.6 if you want |
|||
# support for stopping the UPS's inverter after the machine halts. |
|||
#if [ -x /sbin/genpowerd ]; then |
|||
# echo "Starting genpowerd daemon..." |
|||
# /sbin/genpowerd |
|||
#fi |
|||
|
|||
# Turn on process accounting. To enable process accounting, make sure the |
|||
# option for BSD process accounting is enabled in your kernel, and then |
|||
# create the file /var/log/pacct (touch /var/log/pacct). By default, process |
|||
# accounting is not enabled (since /var/log/pacct does not exist). This is |
|||
# because the log file can get VERY large. |
|||
if [ -x /sbin/accton -a -r /var/log/pacct ]; then |
|||
chmod 640 /var/log/pacct |
|||
/sbin/accton /var/log/pacct |
|||
fi |
|||
|
|||
# Start crond (Dillon's crond): |
|||
# If you want cron to actually log activity to /var/log/cron, then change |
|||
# -l notice to -l info to increase the logging level. |
|||
if [ -x /usr/sbin/crond ]; then |
|||
/usr/sbin/crond -l notice |
|||
fi |
|||
|
|||
# Start atd (manages jobs scheduled with 'at'): |
|||
if [ -x /usr/sbin/atd ]; then |
|||
/usr/sbin/atd -b 15 -l 1 |
|||
fi |
|||
|
|||
# Slackware-Mini-Quota-HOWTO: |
|||
# To really activate quotas, you'll need to add 'usrquota' and/or 'grpquota' to |
|||
# the appropriate partitions as listed in /etc/fstab. Here's an example: |
|||
# |
|||
# /dev/hda2 /home ext3 defaults,usrquota 1 1 |
|||
# |
|||
# You'll then need to setup initial quota files at the top of the partitions |
|||
# to support quota, like this: |
|||
# touch /home/aquota.user /home/aquota.group |
|||
# chmod 600 /home/aquota.user /home/aquota.group |
|||
# |
|||
# Then, reboot to activate the system. |
|||
# To edit user quotas, use 'edquota'. See 'man edquota'. Also, the |
|||
# official Quota Mini-HOWTO has lots of useful information. That can be found |
|||
# here: /usr/doc/Linux-HOWTOs/Quota |
|||
|
|||
# Check quotas and then turn quota system on: |
|||
if grep -q quota /etc/fstab ; then |
|||
for quotafs in $(awk '/quota/ {print $2}' /etc/fstab) ; do |
|||
/bin/rm -f $quotafs/{a,}quota.{group,user}.new |
|||
done |
|||
if [ -x /sbin/quotacheck ]; then |
|||
echo "Checking filesystem quotas: /sbin/quotacheck -avugm" |
|||
/sbin/quotacheck -avugm |
|||
fi |
|||
if [ -x /sbin/quotaon ]; then |
|||
echo "Activating filesystem quotas: /sbin/quotaon -avug" |
|||
/sbin/quotaon -avug |
|||
fi |
|||
fi |
|||
|
|||
# Start the SASL authentication server. This provides SASL |
|||
# authentication services for sendmail: |
|||
if [ -x /etc/rc.d/rc.saslauthd ]; then |
|||
. /etc/rc.d/rc.saslauthd start |
|||
fi |
|||
|
|||
# Start the sendmail daemon: |
|||
if [ -x /etc/rc.d/rc.sendmail ]; then |
|||
. /etc/rc.d/rc.sendmail start |
|||
fi |
|||
|
|||
# Load ALSA (sound) defaults: |
|||
if [ -x /etc/rc.d/rc.alsa -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.alsa |
|||
fi |
|||
|
|||
# Load a custom screen font if the user has an rc.font script. |
|||
if [ -x /etc/rc.d/rc.font ]; then |
|||
. /etc/rc.d/rc.font |
|||
fi |
|||
|
|||
# Load a custom keymap if the user has an rc.keymap script. |
|||
if [ -x /etc/rc.d/rc.keymap ]; then |
|||
. /etc/rc.d/rc.keymap |
|||
fi |
|||
|
|||
# Start the MySQL database: |
|||
if [ -x /etc/rc.d/rc.mysqld ]; then |
|||
. /etc/rc.d/rc.mysqld start |
|||
fi |
|||
|
|||
# Start Apache web server: |
|||
if [ -x /etc/rc.d/rc.httpd ]; then |
|||
. /etc/rc.d/rc.httpd start |
|||
fi |
|||
|
|||
# Start OpenLDAP: |
|||
if [ -x /etc/rc.d/rc.openldap ]; then |
|||
. /etc/rc.d/rc.openldap start |
|||
fi |
|||
|
|||
# Start Samba (a file/print server for Win95/NT machines). |
|||
# Samba can be started in /etc/inetd.conf instead. |
|||
if [ -x /etc/rc.d/rc.samba ]; then |
|||
. /etc/rc.d/rc.samba start |
|||
fi |
|||
|
|||
# Start the GPM mouse server: |
|||
if [ -x /etc/rc.d/rc.gpm ]; then |
|||
. /etc/rc.d/rc.gpm start |
|||
fi |
|||
|
|||
# If there are SystemV init scripts for this runlevel, run them. |
|||
if [ -x /etc/rc.d/rc.sysvinit ]; then |
|||
. /etc/rc.d/rc.sysvinit |
|||
fi |
|||
|
|||
# Start the local setup procedure. |
|||
if [ -x /etc/rc.d/rc.local ]; then |
|||
. /etc/rc.d/rc.local |
|||
fi |
|||
|
|||
# All done. |
@ -0,0 +1,386 @@ |
|||
#!/bin/sh |
|||
# |
|||
# rc.M This file is executed by init(8) when the system is being |
|||
# initialized for one of the "multi user" run levels (i.e. |
|||
# levels 1 through 6). It usually does mounting of file |
|||
# systems et al. |
|||
# |
|||
# Version: @(#)/etc/rc.d/rc.M 2.23 Wed Feb 26 19:20:58 PST 2003 |
|||
# |
|||
# Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> |
|||
# Heavily modified by Patrick Volkerding <volkerdi@slackware.com> |
|||
# |
|||
|
|||
# Tell the viewers what's going to happen. |
|||
echo "Going multiuser..." |
|||
|
|||
# Update all the shared library links: |
|||
if [ -x /sbin/ldconfig ]; then |
|||
echo "Updating shared library links: /sbin/ldconfig &" |
|||
/sbin/ldconfig & |
|||
fi |
|||
|
|||
# Screen blanks after 15 minutes idle time, and powers down in one hour |
|||
# if the kernel supports APM or ACPI power management: |
|||
/bin/setterm -blank 15 -powersave powerdown -powerdown 60 |
|||
|
|||
# Set the hostname. |
|||
if [ -r /etc/HOSTNAME ]; then |
|||
/bin/hostname $(cat /etc/HOSTNAME | cut -f1 -d .) |
|||
else |
|||
# fall back on this old default: |
|||
echo "darkstar.example.net" > /etc/HOSTNAME |
|||
/bin/hostname darkstar |
|||
fi |
|||
|
|||
# Set the permissions on /var/log/dmesg according to whether the kernel |
|||
# permits non-root users to access kernel dmesg information: |
|||
if [ -r /proc/sys/kernel/dmesg_restrict ]; then |
|||
if [ $(cat /proc/sys/kernel/dmesg_restrict) = 1 ]; then |
|||
touch /var/log/dmesg |
|||
chmod 640 /var/log/dmesg |
|||
fi |
|||
else |
|||
touch /var/log/dmesg |
|||
chmod 644 /var/log/dmesg |
|||
fi |
|||
# Save the contents of 'dmesg': |
|||
/bin/dmesg -s 65536 > /var/log/dmesg |
|||
|
|||
# Initialize PCMCIA devices: |
|||
# |
|||
# NOTE: This used to be started near the top of rc.S so that PCMCIA devices |
|||
# could be fsck'ed along with the other drives. This had some unfortunate |
|||
# side effects, however, since root isn't yet read-write, and /var might not |
|||
# even be mounted the .pid files can't be correctly written in /var/run and |
|||
# the pcmcia system can't be correctly shut down. If you want some PCMCIA |
|||
# partition to be mounted at boot (or when the card is inserted) then add |
|||
# the appropriate lines to /etc/pcmcia/scsi.opts. |
|||
# |
|||
# Note that the stuff in /etc/pcmcia/ is only for 2.4.x kernels using |
|||
# 16-bit PCMCIA cards (not 32-bit Cardbus cards!). For example, with a |
|||
# wireless card you might need to set options in /etc/pcmcia OR in |
|||
# /etc/rc.d/rc.wireless.conf, or even in /etc/rc.d/rc.inet1.conf (with |
|||
# extra options if needed for the encryption key, ESSID, etc.) |
|||
# |
|||
# Hopefully this situation will be unified in the future, but for now |
|||
# that's how it is... |
|||
# |
|||
if [ -x /etc/rc.d/rc.pcmcia ]; then |
|||
. /etc/rc.d/rc.pcmcia start |
|||
# The cards might need a little extra time here to initialize. |
|||
sleep 5 |
|||
fi |
|||
|
|||
# Start the system logger. |
|||
if [ -x /etc/rc.d/rc.syslog -a -x /usr/sbin/syslogd -a -d /var/log ]; then |
|||
. /etc/rc.d/rc.syslog start |
|||
fi |
|||
|
|||
# Update the X font indexes: |
|||
if [ -x /usr/bin/fc-cache ]; then |
|||
echo "Updating X font indexes: /usr/bin/fc-cache -f &" |
|||
/usr/bin/fc-cache -f & |
|||
fi |
|||
|
|||
# Run rc.udev again. This will start udev if it is not already running |
|||
# (for example, upon return from runlevel 1), otherwise it will trigger it |
|||
# to look for device changes and to generate persistent rules if needed. |
|||
if grep -wq sysfs /proc/mounts && grep -q devtmpfs /proc/filesystems ; then |
|||
if ! grep -wq nohotplug /proc/cmdline ; then |
|||
if [ -x /etc/rc.d/rc.udev ]; then |
|||
/bin/sh /etc/rc.d/rc.udev start |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Initialize the networking hardware. |
|||
if [ -x /etc/rc.d/rc.inet1 ]; then |
|||
. /etc/rc.d/rc.inet1 |
|||
fi |
|||
|
|||
# Start D-Bus: |
|||
if [ -x /etc/rc.d/rc.messagebus ]; then |
|||
sh /etc/rc.d/rc.messagebus start |
|||
fi |
|||
|
|||
# Start Bluetooth: |
|||
if [ -x /etc/rc.d/rc.bluetooth ]; then |
|||
sh /etc/rc.d/rc.bluetooth start |
|||
fi |
|||
|
|||
# Start wicd or networkmanager: |
|||
if [ -x /etc/rc.d/rc.wicd -a -x /usr/sbin/wicd ]; then |
|||
sh /etc/rc.d/rc.wicd start |
|||
elif [ -x /etc/rc.d/rc.networkmanager ]; then |
|||
sh /etc/rc.d/rc.networkmanager start |
|||
fi |
|||
|
|||
# Start networking daemons: |
|||
if [ -x /etc/rc.d/rc.inet2 ]; then |
|||
. /etc/rc.d/rc.inet2 |
|||
fi |
|||
|
|||
# Look for additional USB/SCSI/IEEE1394/etc devices on multiple LUNs: |
|||
if [ -x /etc/rc.d/rc.scanluns ]; then |
|||
. /etc/rc.d/rc.scanluns |
|||
fi |
|||
|
|||
# Mount any additional filesystem types that haven't already been mounted: |
|||
mount -a -v 2> /dev/null | grep -v -e "already mounted" -e "ignored" | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done |
|||
|
|||
# Start the Control Script for automounter: |
|||
if [ -x /etc/rc.d/rc.autofs ]; then |
|||
sh /etc/rc.d/rc.autofs start |
|||
fi |
|||
|
|||
# Start the Network Time Protocol daemon: |
|||
if [ -x /etc/rc.d/rc.ntpd ]; then |
|||
sh /etc/rc.d/rc.ntpd start |
|||
fi |
|||
|
|||
# Remove stale locks and junk files (must be done after mount -a!) |
|||
/bin/rm -f /var/lock/* /var/spool/uucp/LCK..* /tmp/.X*lock /tmp/core /core 2> /dev/null |
|||
/bin/rm -rf /var/spool/cron/cron.?????? 2> /dev/null |
|||
|
|||
# Remove stale hunt sockets so the game can start. |
|||
if [ -r /tmp/hunt -o -r /tmp/hunt.stats ]; then |
|||
echo "Removing your stale hunt sockets from /tmp." |
|||
/bin/rm -f /tmp/hunt* |
|||
fi |
|||
|
|||
# Ensure basic filesystem permissions sanity. |
|||
chmod 755 / 2> /dev/null |
|||
chmod 1777 /tmp /var/tmp |
|||
|
|||
# Start ACPI daemon. |
|||
if [ -x /etc/rc.d/rc.acpid ]; then |
|||
. /etc/rc.d/rc.acpid start |
|||
fi |
|||
|
|||
# Enable CPU frequency scaling: |
|||
if [ -x /etc/rc.d/rc.cpufreq ]; then |
|||
. /etc/rc.d/rc.cpufreq start |
|||
fi |
|||
|
|||
# Update any existing icon cache files: |
|||
if find /usr/share/icons -maxdepth 2 2> /dev/null | grep -q icon-theme.cache ; then |
|||
for theme_dir in /usr/share/icons/* ; do |
|||
if [ -r ${theme_dir}/icon-theme.cache ]; then |
|||
echo "Updating icon-theme.cache in ${theme_dir}..." |
|||
/usr/bin/gtk-update-icon-cache -t -f ${theme_dir} 1> /dev/null 2> /dev/null & |
|||
fi |
|||
done |
|||
# This would be a large file and probably shouldn't be there. |
|||
if [ -r /usr/share/icons/icon-theme.cache ]; then |
|||
echo "Deleting icon-theme.cache in /usr/share/icons..." |
|||
#/usr/bin/gtk-update-icon-cache -t -f /usr/share/icons 1> /dev/null 2> /dev/null & |
|||
rm -f /usr/share/icons/icon-theme.cache |
|||
fi |
|||
fi |
|||
|
|||
# Update mime database: |
|||
if [ -x /usr/bin/update-mime-database -a -d /usr/share/mime ]; then |
|||
echo "Updating MIME database: /usr/bin/update-mime-database /usr/share/mime &" |
|||
/usr/bin/update-mime-database /usr/share/mime 1> /dev/null 2> /dev/null & |
|||
fi |
|||
|
|||
# Start console-kit-daemon: |
|||
if [ -x /etc/rc.d/rc.consolekit ]; then |
|||
sh /etc/rc.d/rc.consolekit start |
|||
fi |
|||
|
|||
# Start HAL: |
|||
if [ -x /etc/rc.d/rc.hald ]; then |
|||
sh /etc/rc.d/rc.hald start |
|||
fi |
|||
|
|||
# Start system-wide PulseAudio daemon (not recommended, nor required in |
|||
# order to use PulseAudio -- see the script for details): |
|||
if [ -x /etc/rc.d/rc.pulseaudio ]; then |
|||
. /etc/rc.d/rc.pulseaudio start |
|||
fi |
|||
|
|||
# These GTK+/pango files need to be kept up to date for |
|||
# proper input method, pixbuf loaders, and font support. |
|||
if [ -x /usr/bin/update-gtk-immodules ]; then |
|||
echo "Updating gtk.immodules:" |
|||
echo " /usr/bin/update-gtk-immodules &" |
|||
/usr/bin/update-gtk-immodules > /dev/null 2>&1 & |
|||
fi |
|||
if [ -x /usr/bin/update-gdk-pixbuf-loaders ]; then |
|||
echo "Updating gdk-pixbuf.loaders:" |
|||
echo " /usr/bin/update-gdk-pixbuf-loaders &" |
|||
/usr/bin/update-gdk-pixbuf-loaders > /dev/null 2>&1 & |
|||
fi |
|||
if [ -x /usr/bin/update-pango-querymodules ]; then |
|||
echo "Updating pango.modules:" |
|||
echo " /usr/bin/update-pango-querymodules &" |
|||
/usr/bin/update-pango-querymodules > /dev/null 2>&1 & |
|||
fi |
|||
if [ -x /usr/bin/glib-compile-schemas ]; then |
|||
echo "Compiling GSettings XML schema files:" |
|||
echo " /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas &" |
|||
/usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas >/dev/null 2>&1 & |
|||
fi |
|||
|
|||
# Start dnsmasq, a simple DHCP/DNS server: |
|||
if [ -x /etc/rc.d/rc.dnsmasq ]; then |
|||
/etc/rc.d/rc.dnsmasq start |
|||
fi |
|||
|
|||
# Start snmpd: |
|||
if [ -x /etc/rc.d/rc.snmpd ]; then |
|||
/etc/rc.d/rc.snmpd start |
|||
fi |
|||
|
|||
# Start the print spooling system. This will usually be LPRng (lpd) or CUPS. |
|||
if [ -x /etc/rc.d/rc.cups ]; then |
|||
# Start CUPS: |
|||
/etc/rc.d/rc.cups start |
|||
elif [ -x /etc/rc.d/rc.lprng ]; then |
|||
# Start LPRng (lpd): |
|||
. /etc/rc.d/rc.lprng start |
|||
fi |
|||
|
|||
# Start netatalk. (a file/print server for Macs using Appletalk) |
|||
if [ -x /etc/rc.d/rc.atalk ]; then |
|||
/etc/rc.d/rc.atalk start |
|||
fi |
|||
|
|||
# Start smartd, which monitors the status of S.M.A.R.T. compatible |
|||
# hard drives and reports any problems. Note some devices (which aren't |
|||
# smart, I guess ;) will hang if probed by smartd, so it's commented out |
|||
# by default. |
|||
#if [ -x /usr/sbin/smartd ]; then |
|||
# /usr/sbin/smartd |
|||
#fi |
|||
|
|||
# Monitor the UPS with genpowerd. |
|||
# To use this, uncomment this section and edit your settings in |
|||
# /etc/genpowerd.conf (serial device, UPS type, etc). For more information, |
|||
# see "man genpowerd" or the extensive documentation in the |
|||
# /usr/doc/genpower-*/ directory. |
|||
# You'll also need to configure a similar block in /etc/rc.d/rc.6 if you want |
|||
# support for stopping the UPS's inverter after the machine halts. |
|||
#if [ -x /sbin/genpowerd ]; then |
|||
# echo "Starting genpowerd daemon..." |
|||
# /sbin/genpowerd |
|||
#fi |
|||
|
|||
# Turn on process accounting. To enable process accounting, make sure the |
|||
# option for BSD process accounting is enabled in your kernel, and then |
|||
# create the file /var/log/pacct (touch /var/log/pacct). By default, process |
|||
# accounting is not enabled (since /var/log/pacct does not exist). This is |
|||
# because the log file can get VERY large. |
|||
if [ -x /sbin/accton -a -r /var/log/pacct ]; then |
|||
chmod 640 /var/log/pacct |
|||
/sbin/accton /var/log/pacct |
|||
fi |
|||
|
|||
# Start crond (Dillon's crond): |
|||
# If you want cron to actually log activity to /var/log/cron, then change |
|||
# -l notice to -l info to increase the logging level. |
|||
if [ -x /usr/sbin/crond ]; then |
|||
/usr/sbin/crond -l notice |
|||
fi |
|||
|
|||
# Start atd (manages jobs scheduled with 'at'): |
|||
if [ -x /usr/sbin/atd ]; then |
|||
/usr/sbin/atd -b 15 -l 1 |
|||
fi |
|||
|
|||
# Slackware-Mini-Quota-HOWTO: |
|||
# To really activate quotas, you'll need to add 'usrquota' and/or 'grpquota' to |
|||
# the appropriate partitions as listed in /etc/fstab. Here's an example: |
|||
# |
|||
# /dev/hda2 /home ext3 defaults,usrquota 1 1 |
|||
# |
|||
# You'll then need to setup initial quota files at the top of the partitions |
|||
# to support quota, like this: |
|||
# touch /home/aquota.user /home/aquota.group |
|||
# chmod 600 /home/aquota.user /home/aquota.group |
|||
# |
|||
# Then, reboot to activate the system. |
|||
# To edit user quotas, use 'edquota'. See 'man edquota'. Also, the |
|||
# official Quota Mini-HOWTO has lots of useful information. That can be found |
|||
# here: /usr/doc/Linux-HOWTOs/Quota |
|||
|
|||
# Check quotas and then turn quota system on: |
|||
if grep -q quota /etc/fstab ; then |
|||
for quotafs in $(awk '/quota/ {print $2}' /etc/fstab) ; do |
|||
/bin/rm -f $quotafs/{a,}quota.{group,user}.new |
|||
done |
|||
if [ -x /sbin/quotacheck ]; then |
|||
echo "Checking filesystem quotas: /sbin/quotacheck -avugm" |
|||
/sbin/quotacheck -avugm |
|||
fi |
|||
if [ -x /sbin/quotaon ]; then |
|||
echo "Activating filesystem quotas: /sbin/quotaon -avug" |
|||
/sbin/quotaon -avug |
|||
fi |
|||
fi |
|||
|
|||
# Start the SASL authentication server. This provides SASL |
|||
# authentication services for sendmail: |
|||
if [ -x /etc/rc.d/rc.saslauthd ]; then |
|||
. /etc/rc.d/rc.saslauthd start |
|||
fi |
|||
|
|||
# Start the sendmail daemon: |
|||
if [ -x /etc/rc.d/rc.sendmail ]; then |
|||
. /etc/rc.d/rc.sendmail start |
|||
fi |
|||
|
|||
# Load ALSA (sound) defaults: |
|||
if [ -x /etc/rc.d/rc.alsa ]; then |
|||
. /etc/rc.d/rc.alsa |
|||
fi |
|||
|
|||
# Load a custom screen font if the user has an rc.font script. |
|||
if [ -x /etc/rc.d/rc.font ]; then |
|||
. /etc/rc.d/rc.font |
|||
fi |
|||
|
|||
# Load a custom keymap if the user has an rc.keymap script. |
|||
if [ -x /etc/rc.d/rc.keymap ]; then |
|||
. /etc/rc.d/rc.keymap |
|||
fi |
|||
|
|||
# Start the MySQL database: |
|||
if [ -x /etc/rc.d/rc.mysqld ]; then |
|||
. /etc/rc.d/rc.mysqld start |
|||
fi |
|||
|
|||
# Start Apache web server: |
|||
if [ -x /etc/rc.d/rc.httpd ]; then |
|||
. /etc/rc.d/rc.httpd start |
|||
fi |
|||
|
|||
# Start OpenLDAP: |
|||
if [ -x /etc/rc.d/rc.openldap ]; then |
|||
. /etc/rc.d/rc.openldap start |
|||
fi |
|||
|
|||
# Start Samba (a file/print server for Win95/NT machines). |
|||
# Samba can be started in /etc/inetd.conf instead. |
|||
if [ -x /etc/rc.d/rc.samba ]; then |
|||
. /etc/rc.d/rc.samba start |
|||
fi |
|||
|
|||
# Start the GPM mouse server: |
|||
if [ -x /etc/rc.d/rc.gpm ]; then |
|||
. /etc/rc.d/rc.gpm start |
|||
fi |
|||
|
|||
# If there are SystemV init scripts for this runlevel, run them. |
|||
if [ -x /etc/rc.d/rc.sysvinit ]; then |
|||
. /etc/rc.d/rc.sysvinit |
|||
fi |
|||
|
|||
# Start the local setup procedure. |
|||
if [ -x /etc/rc.d/rc.local ]; then |
|||
. /etc/rc.d/rc.local |
|||
fi |
|||
|
|||
# All done. |
@ -0,0 +1,474 @@ |
|||
#!/bin/sh |
|||
# |
|||
# /etc/rc.d/rc.S: System initialization script. |
|||
# |
|||
# Mostly written by: Patrick J. Volkerding, <volkerdi@slackware.com> |
|||
# |
|||
|
|||
# Set $container variable since this is a modified version of rc.S with |
|||
# changes for running in an lxc container. A check to see if this variable |
|||
# is set will be used to skip parts of the script that we don't want to run |
|||
# in a container. Thanks to Matteo Bernardini <ponce@slackbuilds.org> and |
|||
# Chris Willing for the initial work making this script lxc compatible. |
|||
container="lxc" |
|||
|
|||
PATH=/sbin:/usr/sbin:/bin:/usr/bin |
|||
|
|||
# Try to mount /proc: |
|||
if [ -z "$container" ]; then |
|||
/sbin/mount -v proc /proc -n -t proc 2> /dev/null |
|||
fi |
|||
|
|||
# Mount sysfs next, if the kernel supports it: |
|||
if [ -d /sys -a -z "$container" ]; then |
|||
if grep -wq sysfs /proc/filesystems ; then |
|||
if ! grep -wq sysfs /proc/mounts ; then |
|||
/sbin/mount -v sysfs /sys -n -t sysfs |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# If /run exists, mount a tmpfs on it (unless the |
|||
# initrd has already done so): |
|||
if [ -d /run -a -z "$container" ]; then |
|||
if ! grep -wq "tmpfs /run tmpfs" /proc/mounts ; then |
|||
/sbin/mount -v -n -t tmpfs tmpfs /run -o mode=0755 |
|||
fi |
|||
fi |
|||
|
|||
# Load the loop device kernel module: |
|||
if [ -x /etc/rc.d/rc.loop -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.loop start |
|||
fi |
|||
|
|||
# Initialize udev to manage /dev entries and hotplugging. |
|||
# You may turn off udev by making the /etc/rc.d/rc.udev file non-executable |
|||
# or giving the "nohotplug" option at boot, but realize that if you turn off |
|||
# udev that you will have to load all the kernel modules that you need |
|||
# yourself (possibly in /etc/rc.d/rc.modules.local), and make any additional |
|||
# device nodes that you need in the /dev directory. Even USB and IEEE1394 |
|||
# devices will need to have the modules loaded by hand if udev is not used. |
|||
# So use it. :-) |
|||
if grep -wq sysfs /proc/mounts && grep -q devtmpfs /proc/filesystems ; then |
|||
if ! grep -wq nohotplug /proc/cmdline ; then |
|||
if [ -x /etc/rc.d/rc.udev -a -z "$container" ]; then |
|||
/bin/sh /etc/rc.d/rc.udev start |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Mount Control Groups filesystem interface: |
|||
if [ -z "$container" ]; then |
|||
if grep -wq cgroup /proc/filesystems ; then |
|||
if [ -d /sys/fs/cgroup ]; then |
|||
# See linux-*/Documentation/cgroups/cgroups.txt (section 1.6) |
|||
# Check if we have some tools to autodetect the available cgroup controllers |
|||
if [ -x /bin/cut -a -x /bin/tail ]; then |
|||
# Mount a tmpfs as the cgroup filesystem root |
|||
mount -t tmpfs -o mode=0755 cgroup_root /sys/fs/cgroup |
|||
# Autodetect available controllers and mount them in subfolders |
|||
controllers="$(/bin/cut -f 1 /proc/cgroups | /bin/tail -n +2)" |
|||
for i in $controllers; do |
|||
mkdir /sys/fs/cgroup/$i |
|||
mount -t cgroup -o $i $i /sys/fs/cgroup/$i |
|||
done |
|||
unset i controllers |
|||
else |
|||
# We can't use autodetection so fall back mounting them all together |
|||
mount -t cgroup cgroup /sys/fs/cgroup |
|||
fi |
|||
else |
|||
mkdir -p /dev/cgroup |
|||
mount -t cgroup cgroup /dev/cgroup |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Initialize the Logical Volume Manager. |
|||
# This won't start unless we find /etc/lvmtab (LVM1) or |
|||
# /etc/lvm/backup/ (LVM2). This is created by /sbin/vgscan, so to |
|||
# use LVM you must run /sbin/vgscan yourself the first time (and |
|||
# create some VGs and LVs). |
|||
if [ -z "$container" ]; then |
|||
# Create LVM lock/run directories: |
|||
mkdir -p -m 0700 /run/lvm /run/lock /run/lock/lvm |
|||
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then |
|||
echo "Initializing LVM (Logical Volume Manager):" |
|||
# Check for device-mapper support. |
|||
if ! grep -wq device-mapper /proc/devices ; then |
|||
# Try to load a device-mapper kernel module: |
|||
/sbin/modprobe -q dm-mod |
|||
fi |
|||
# Scan for new volume groups: |
|||
/sbin/vgscan --mknodes --ignorelockingfailure 2> /dev/null |
|||
if [ $? = 0 ]; then |
|||
# Make volume groups available to the kernel. |
|||
# This should also make logical volumes available. |
|||
/sbin/vgchange -ay --ignorelockingfailure |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Open any volumes created by cryptsetup. |
|||
# |
|||
# Some notes on /etc/crypttab in Slackware: |
|||
# Only LUKS formatted volumes are supported (except for swap) |
|||
# crypttab follows the following format: |
|||
# <luks_name> <device> <password> <options> |
|||
# |
|||
# <luks_name>: This is the name of your LUKS volume. |
|||
# For example: crypt-home |
|||
# |
|||
# <device>: This is the device containing your LUKS volume. |
|||
# For example: /dev/sda2 |
|||
# |
|||
# <password>: This is either the volume password in plain text, or the name of |
|||
# a key file. Use 'none' to interactively enter password on boot. |
|||
# |
|||
# <options>: Comma-separated list of options. Note that there must be a |
|||
# password field for any options to be picked up (use a password of 'none' to |
|||
# get a password prompt at boot). The following options are supported: |
|||
# |
|||
# discard -- this will cause --allow-discards to be passed to the cryptsetup |
|||
# program while opening the LUKS volume. |
|||
# |
|||
# ro -- this will cause --readonly to be passed to the cryptsetup program while |
|||
# opening the LUKS volume. |
|||
# |
|||
# swap -- this option cannot be used with other options. The device given will |
|||
# be formatted as a new encrypted volume with a random key on boot, and used as |
|||
# swap. |
|||
# |
|||
if [ -f /etc/crypttab -a -x /sbin/cryptsetup -a -z "$container" ]; then |
|||
# First, check for device-mapper support. |
|||
if ! grep -wq device-mapper /proc/devices ; then |
|||
# If device-mapper exists as a module, try to load it. |
|||
# Try to load a device-mapper kernel module: |
|||
/sbin/modprobe -q dm-mod |
|||
fi |
|||
# NOTE: we only support LUKS formatted volumes (except for swap)! |
|||
cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do |
|||
eval LUKSARRAY=( $line ) |
|||
LUKS="${LUKSARRAY[0]}" |
|||
DEV="${LUKSARRAY[1]}" |
|||
PASS="${LUKSARRAY[2]}" |
|||
OPTS="${LUKSARRAY[3]}" |
|||
LUKSOPTS="" |
|||
if echo $OPTS | grep -wq ro ; then LUKSOPTS="${LUKSOPTS} --readonly" ; fi |
|||
if echo $OPTS | grep -wq discard ; then LUKSOPTS="${LUKSOPTS} --allow-discards" ; fi |
|||
# Skip LUKS volumes that were already unlocked (in the initrd): |
|||
/sbin/cryptsetup status $LUKS 2>/dev/null | head -n 1 | grep -q "is active" && continue |
|||
if /sbin/cryptsetup isLuks $DEV 2>/dev/null ; then |
|||
if [ -z "${LUKSOPTS}" ]; then |
|||
echo "Unlocking LUKS encrypted volume '${LUKS}' on device '$DEV':" |
|||
else |
|||
echo "Unlocking LUKS encrypted volume '${LUKS}' on device '$DEV' with options '${LUKSOPTS}':" |
|||
fi |
|||
if [ -n "${PASS}" -a "${PASS}" != "none" ]; then |
|||
if [ -f "${PASS}" ]; then |
|||
# A password was given a key-file filename |
|||
/sbin/cryptsetup ${LUKSOPTS} --key-file=${PASS} luksOpen $DEV $LUKS |
|||
else |
|||
# A password was provided in plain text |
|||
echo "${PASS}" | /sbin/cryptsetup ${LUKSOPTS} luksOpen $DEV $LUKS |
|||
fi |
|||
else |
|||
# No password was given, or a password of 'none' was given |
|||
/sbin/cryptsetup ${LUKSOPTS} luksOpen $DEV $LUKS </dev/tty0 >/dev/tty0 2>&1 |
|||
fi |
|||
elif echo $OPTS | grep -wq swap ; then |
|||
# If any of the volumes is to be used as encrypted swap, |
|||
# then encrypt it using a random key and run mkswap: |
|||
echo "Creating encrypted swap volume '${LUKS}' on device '$DEV':" |
|||
/sbin/cryptsetup --cipher=aes --key-file=/dev/urandom --key-size=256 create $LUKS $DEV |
|||
mkswap /dev/mapper/$LUKS |
|||
fi |
|||
done |
|||
fi |
|||
|
|||
# Enable swapping: |
|||
if [ -z "$container" ]; then |
|||
/sbin/swapon -a 2> /dev/null |
|||
fi |
|||
|
|||
# Start FUSE, if requested: |
|||
if [ -x /etc/rc.d/rc.fuse -a -z "$container" ]; then |
|||
sh /etc/rc.d/rc.fuse start |
|||
fi |
|||
|
|||
# Set the tick and frequency for the system clock. |
|||
# Default values are: TICK=10000 and FREQ=0 |
|||
if [ -z "$container" ]; then |
|||
TICK=10000 |
|||
FREQ=0 |
|||
# If there's a /etc/default/adjtimex config file, source it to override |
|||
# the default TICK and FREQ: |
|||
if [ -r /etc/default/adjtimex ]; then |
|||
. /etc/default/adjtimex |
|||
fi |
|||
if /sbin/adjtimex --tick $TICK --frequency $FREQ; then |
|||
echo "Setting the system clock rate: /sbin/adjtimex --tick $TICK --frequency $FREQ" |
|||
else |
|||
echo "Failed to set system clock with adjtimex, possibly invalid parameters? (TICK=$TICK FREQ=$FREQ)" |
|||
fi |
|||
fi |
|||
|
|||
# Set the system time from the hardware clock using hwclock --hctosys. |
|||
if [ -x /sbin/hwclock -a -z "$container" ]; then |
|||
# Check for a broken motherboard RTC clock (where ioports for rtc are |
|||
# unknown) to prevent hwclock causing a hang: |
|||
if ! grep -q " : rtc" /proc/ioports ; then |
|||
CLOCK_OPT="--directisa" |
|||
fi |
|||
if [ /etc/adjtime -nt /etc/hardwareclock ]; then |
|||
if grep -q "^LOCAL" /etc/adjtime ; then |
|||
echo -n "Setting system time from the hardware clock (localtime): " |
|||
else |
|||
echo -n "Setting system time from the hardware clock (UTC): " |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --hctosys |
|||
elif grep -wq "^localtime" /etc/hardwareclock 2> /dev/null ; then |
|||
echo -n "Setting system time from the hardware clock (localtime): " |
|||
/sbin/hwclock $CLOCK_OPT --localtime --hctosys |
|||
else |
|||
echo -n "Setting system time from the hardware clock (UTC): " |
|||
/sbin/hwclock $CLOCK_OPT --utc --hctosys |
|||
fi |
|||
date |
|||
fi |
|||
|
|||
# Test to see if the root partition is read-only, like it ought to be. |
|||
if [ -z "$container" ]; then |
|||
READWRITE=no |
|||
if touch /fsrwtestfile 2>/dev/null; then |
|||
rm -f /fsrwtestfile |
|||
READWRITE=yes |
|||
else |
|||
echo "Testing root filesystem status: read-only filesystem" |
|||
fi |
|||
fi |
|||
|
|||
# See if a forced filesystem check was requested at shutdown: |
|||
if [ -r /etc/forcefsck -a -z "$container" ]; then |
|||
FORCEFSCK="-f" |
|||
fi |
|||
|
|||
# Check the root filesystem: |
|||
if [ -z "$container" ]; then |
|||
if [ ! $READWRITE = yes ]; then |
|||
RETVAL=0 |
|||
if [ ! -r /etc/fastboot ]; then |
|||
echo "Checking root filesystem:" |
|||
/sbin/fsck $FORCEFSCK -C -a / |
|||
RETVAL=$? |
|||
fi |
|||
# An error code of 2 or higher will require a reboot. |
|||
if [ $RETVAL -ge 2 ]; then |
|||
# An error code equal to or greater than 4 means that some errors |
|||
# could not be corrected. This requires manual attention, so we |
|||
# offer a chance to try to fix the problem in single-user mode: |
|||
if [ $RETVAL -ge 4 ]; then |
|||
echo |
|||
echo "***********************************************************" |
|||
echo "*** An error occurred during the root filesystem check. ***" |
|||
echo "*** You will now be given a chance to log into the ***" |
|||
echo "*** system in single-user mode to fix the problem. ***" |
|||
echo "*** ***" |
|||
echo "*** If you are using the ext2 filesystem, running ***" |
|||
echo "*** 'e2fsck -v -y <partition>' might help. ***" |
|||
echo "***********************************************************" |
|||
echo |
|||
echo "Once you exit the single-user shell, the system will reboot." |
|||
echo |
|||
PS1="(Repair filesystem) \#"; export PS1 |
|||
sulogin |
|||
else # With an error code of 2 or 3, reboot the machine automatically: |
|||
echo |
|||
echo "***********************************" |
|||
echo "*** The filesystem was changed. ***" |
|||
echo "*** The system will now reboot. ***" |
|||
echo "***********************************" |
|||
echo |
|||
fi |
|||
echo "Unmounting file systems." |
|||
/sbin/umount -a -r |
|||
/sbin/mount -n -o remount,ro / |
|||
echo "Rebooting system." |
|||
sleep 2 |
|||
reboot -f |
|||
fi |
|||
# Remount the root filesystem in read-write mode |
|||
echo "Remounting root device with read-write enabled." |
|||
/sbin/mount -w -v -n -o remount / |
|||
if [ $? -gt 0 ] ; then |
|||
echo "FATAL: Attempt to remount root device as read-write failed! This is going to" |
|||
echo "cause serious problems." |
|||
fi |
|||
else |
|||
echo "Testing root filesystem status: read-write filesystem" |
|||
echo |
|||
echo "ERROR: Root partition has already been mounted read-write. Cannot check!" |
|||
echo |
|||
echo "For filesystem checking to work properly, your system must initially mount" |
|||
echo "the root partition as read only. If you're booting with LILO, add a line:" |
|||
echo |
|||
echo " read-only" |
|||
echo |
|||
echo "to the Linux section in your /etc/lilo.conf and type 'lilo' to reinstall it." |
|||
fi |
|||
fi # Done checking root filesystem |
|||
|
|||
# Any /etc/mtab that exists here is old, so we start with a new one: |
|||
/bin/rm -f /etc/mtab{,~,.tmp} && /bin/touch /etc/mtab |
|||
|
|||
# Add entry for / to /etc/mtab: |
|||
if [ -z "$container" ]; then |
|||
/sbin/mount -f -w / |
|||
fi |
|||
|
|||
# Add /proc, /sys, and /dev/shm mounts to /etc/mtab: |
|||
if [ -z "$container" ]; then |
|||
if [ -d /proc/sys ]; then |
|||
/sbin/mount -f -t proc proc /proc |
|||
fi |
|||
if [ -d /sys/bus ]; then |
|||
/sbin/mount -f -t sysfs sysfs /sys |
|||
fi |
|||
if grep -q '^[^ ]\+ /dev/shm ' /proc/mounts 2> /dev/null ; then |
|||
/sbin/mount -f -t tmpfs tmpfs /dev/shm |
|||
fi |
|||
fi |
|||
|
|||
# Configure ISA Plug-and-Play devices: |
|||
if [ -r /etc/isapnp.conf -a -z "$container" ]; then |
|||
if [ -x /sbin/isapnp ]; then |
|||
/sbin/isapnp /etc/isapnp.conf |
|||
fi |
|||
fi |
|||
|
|||
# Run the kernel module script. This updates the module dependencies and |
|||
# also supports manually loading kernel modules through rc.modules.local. |
|||
if [ -x /etc/rc.d/rc.modules -a -z "$container" ]; then |
|||
. /etc/rc.d/rc.modules |
|||
fi |
|||
|
|||
# Configure kernel parameters: |
|||
if [ -x /sbin/sysctl -a -r /etc/sysctl.conf -a -z "$container" ]; then |
|||
echo "Configuring kernel parameters: /sbin/sysctl -e --system" |
|||
/sbin/sysctl -e --system |
|||
elif [ -x /sbin/sysctl -a -z "$container" ]; then |
|||
echo "Configuring kernel parameters: /sbin/sysctl -e --system" |
|||
# Don't say "Applying /etc/sysctl.conf" or complain if the file doesn't exist |
|||
/sbin/sysctl -e --system 2> /dev/null | grep -v "Applying /etc/sysctl.conf" |
|||
fi |
|||
|
|||
# Check all the non-root filesystems: |
|||
if [ ! -r /etc/fastboot -a -z "$container" ]; then |
|||
echo "Checking non-root filesystems:" |
|||
/sbin/fsck $FORCEFSCK -C -R -A -a |
|||
fi |
|||
|
|||
# Mount usbfs only if it is found in /etc/fstab: |
|||
if [ -z "$container" ]; then |
|||
if grep -wq usbfs /proc/filesystems; then |
|||
if ! grep -wq usbfs /proc/mounts ; then |
|||
if grep -wq usbfs /etc/fstab; then |
|||
/sbin/mount -v /proc/bus/usb |
|||
fi |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Mount non-root file systems in fstab, but not NFS or SMB |
|||
# because TCP/IP is not yet configured, and not proc or sysfs |
|||
# because those have already been mounted. Also check that |
|||
# devpts is not already mounted before attempting to mount |
|||
# it. With a 2.6.x or newer kernel udev mounts devpts. |
|||
# We also need to wait a little bit to let USB and other |
|||
# hotplugged devices settle (sorry to slow down the boot): |
|||
if [ -z "$container" ]; then |
|||
echo "Mounting non-root local filesystems:" |
|||
sleep 3 |
|||
if /bin/grep -wq devpts /proc/mounts ; then |
|||
# This pipe after the mount command is just to convert the new |
|||
# mount verbose output back to the old format that contained |
|||
# more useful information: |
|||
/sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs,nodevpts | grep successfully | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done |
|||
else |
|||
/sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs | grep successfully | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done |
|||
fi |
|||
fi |
|||
|
|||
# Enable swapping again. This is needed in case a swapfile is used, |
|||
# as it can't be enabled until the filesystem it resides on has been |
|||
# mounted read-write. |
|||
if [ -z "$container" ]; then |
|||
/sbin/swapon -a 2> /dev/null |
|||
fi |
|||
|
|||
# Start cgmanager (or cgproxy in a container): |
|||
if [ -x /etc/rc.d/rc.cgmanager -a -d /sys/fs/cgroup ]; then |
|||
sh /etc/rc.d/rc.cgmanager start |
|||
fi |
|||
|
|||
# Clean up some temporary files: |
|||
rm -f /var/run/* /var/run/*/* /var/run/*/*/* /etc/nologin \ |
|||
/etc/dhcpc/*.pid /etc/forcefsck /etc/fastboot \ |
|||
/var/state/saslauthd/saslauthd.pid \ |
|||
/tmp/.Xauth* 1> /dev/null 2> /dev/null |
|||
( cd /var/log/setup/tmp && rm -rf * ) |
|||
( cd /tmp && rm -rf kde-[a-zA-Z]* ksocket-[a-zA-Z]* hsperfdata_[a-zA-Z]* plugtmp* ) |
|||
|
|||
# Clear /var/lock/subsys: |
|||
if [ -d /var/lock/subsys ]; then |
|||
rm -f /var/lock/subsys/* |
|||
fi |
|||
|
|||
# Create /tmp/{.ICE-unix,.X11-unix} if they are not present: |
|||
if [ ! -e /tmp/.ICE-unix ]; then |
|||
mkdir -p /tmp/.ICE-unix |
|||
chmod 1777 /tmp/.ICE-unix |
|||
fi |
|||
if [ ! -e /tmp/.X11-unix ]; then |
|||
mkdir -p /tmp/.X11-unix |
|||
chmod 1777 /tmp/.X11-unix |
|||
fi |
|||
|
|||
# Create a fresh utmp file: |
|||
touch /var/run/utmp |
|||
chown root:utmp /var/run/utmp |
|||
chmod 664 /var/run/utmp |
|||
|
|||
# Update the current kernel level in the /etc/motd (Message Of The Day) file, |
|||
# if the first line of that file begins with the word 'Linux'. |
|||
# You are free to modify the rest of the file as you see fit. |
|||
if [ -x /bin/sed ]; then |
|||
/bin/sed -i "{1s/^Linux.*/$(/bin/uname -sr)\./}" /etc/motd |
|||
fi |
|||
|
|||
# If there are SystemV init scripts for this runlevel, run them. |
|||
if [ -x /etc/rc.d/rc.sysvinit ]; then |
|||
. /etc/rc.d/rc.sysvinit |
|||
fi |
|||
|
|||
# Run serial port setup script: |
|||
# CAREFUL! This can make some systems hang if the rc.serial script isn't |
|||
# set up correctly. If this happens, you may have to edit the file from a |
|||
# boot disk, and/or set it as non-executable: |
|||
if [ -x /etc/rc.d/rc.serial -a -z "$container" ]; then |
|||
sh /etc/rc.d/rc.serial start |
|||
fi |
|||
|
|||
# Carry an entropy pool between reboots to improve randomness. |
|||
if [ -f /etc/random-seed ]; then |
|||
echo "Using /etc/random-seed to initialize /dev/urandom." |
|||
cat /etc/random-seed > /dev/urandom |
|||
fi |
|||
# Use the pool size from /proc, or 4096 bits: |
|||
if [ -r /proc/sys/kernel/random/poolsize ]; then |
|||
dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(expr $(cat /proc/sys/kernel/random/poolsize) / 8) 2> /dev/null |
|||
else |
|||
dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null |
|||
fi |
|||
chmod 600 /etc/random-seed |
|||
|
@ -0,0 +1,445 @@ |
|||
#!/bin/sh |
|||
# |
|||
# /etc/rc.d/rc.S: System initialization script. |
|||
# |
|||
# Mostly written by: Patrick J. Volkerding, <volkerdi@slackware.com> |
|||
# |
|||
|
|||
PATH=/sbin:/usr/sbin:/bin:/usr/bin |
|||
|
|||
# Try to mount /proc: |
|||
/sbin/mount -v proc /proc -n -t proc 2> /dev/null |
|||
|
|||
# Mount sysfs next, if the kernel supports it: |
|||
if [ -d /sys ]; then |
|||
if grep -wq sysfs /proc/filesystems ; then |
|||
if ! grep -wq sysfs /proc/mounts ; then |
|||
/sbin/mount -v sysfs /sys -n -t sysfs |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# If /run exists, mount a tmpfs on it (unless the |
|||
# initrd has already done so): |
|||
if [ -d /run ]; then |
|||
if ! grep -wq "tmpfs /run tmpfs" /proc/mounts ; then |
|||
/sbin/mount -v -n -t tmpfs tmpfs /run -o mode=0755 |
|||
fi |
|||
fi |
|||
|
|||
# Load the loop device kernel module: |
|||
if [ -x /etc/rc.d/rc.loop ]; then |
|||
. /etc/rc.d/rc.loop start |
|||
fi |
|||
|
|||
# Initialize udev to manage /dev entries and hotplugging. |
|||
# You may turn off udev by making the /etc/rc.d/rc.udev file non-executable |
|||
# or giving the "nohotplug" option at boot, but realize that if you turn off |
|||
# udev that you will have to load all the kernel modules that you need |
|||
# yourself (possibly in /etc/rc.d/rc.modules.local), and make any additional |
|||
# device nodes that you need in the /dev directory. Even USB and IEEE1394 |
|||
# devices will need to have the modules loaded by hand if udev is not used. |
|||
# So use it. :-) |
|||
if grep -wq sysfs /proc/mounts && grep -q devtmpfs /proc/filesystems ; then |
|||
if ! grep -wq nohotplug /proc/cmdline ; then |
|||
if [ -x /etc/rc.d/rc.udev ]; then |
|||
/bin/sh /etc/rc.d/rc.udev start |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Mount Control Groups filesystem interface: |
|||
if grep -wq cgroup /proc/filesystems ; then |
|||
if [ -d /sys/fs/cgroup ]; then |
|||
# See linux-*/Documentation/cgroups/cgroups.txt (section 1.6) |
|||
# Check if we have some tools to autodetect the available cgroup controllers |
|||
if [ -x /bin/cut -a -x /bin/tail ]; then |
|||
# Mount a tmpfs as the cgroup filesystem root |
|||
mount -t tmpfs -o mode=0755 cgroup_root /sys/fs/cgroup |
|||
# Autodetect available controllers and mount them in subfolders |
|||
controllers="$(/bin/cut -f 1 /proc/cgroups | /bin/tail -n +2)" |
|||
for i in $controllers; do |
|||
mkdir /sys/fs/cgroup/$i |
|||
mount -t cgroup -o $i $i /sys/fs/cgroup/$i |
|||
done |
|||
unset i controllers |
|||
else |
|||
# We can't use autodetection so fall back mounting them all together |
|||
mount -t cgroup cgroup /sys/fs/cgroup |
|||
fi |
|||
else |
|||
mkdir -p /dev/cgroup |
|||
mount -t cgroup cgroup /dev/cgroup |
|||
fi |
|||
fi |
|||
|
|||
|
|||
# Initialize the Logical Volume Manager. |
|||
# This won't start unless we find /etc/lvmtab (LVM1) or |
|||
# /etc/lvm/backup/ (LVM2). This is created by /sbin/vgscan, so to |
|||
# use LVM you must run /sbin/vgscan yourself the first time (and |
|||
# create some VGs and LVs). |
|||
# Create LVM lock/run directories: |
|||
mkdir -p -m 0700 /run/lvm /run/lock /run/lock/lvm |
|||
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then |
|||
echo "Initializing LVM (Logical Volume Manager):" |
|||
# Check for device-mapper support. |
|||
if ! grep -wq device-mapper /proc/devices ; then |
|||
# Try to load a device-mapper kernel module: |
|||
/sbin/modprobe -q dm-mod |
|||
fi |
|||
# Scan for new volume groups: |
|||
/sbin/vgscan --mknodes --ignorelockingfailure 2> /dev/null |
|||
if [ $? = 0 ]; then |
|||
# Make volume groups available to the kernel. |
|||
# This should also make logical volumes available. |
|||
/sbin/vgchange -ay --ignorelockingfailure |
|||
fi |
|||
fi |
|||
|
|||
# Open any volumes created by cryptsetup. |
|||
# |
|||
# Some notes on /etc/crypttab in Slackware: |
|||
# Only LUKS formatted volumes are supported (except for swap) |
|||
# crypttab follows the following format: |
|||
# <luks_name> <device> <password> <options> |
|||
# |
|||
# <luks_name>: This is the name of your LUKS volume. |
|||
# For example: crypt-home |
|||
# |
|||
# <device>: This is the device containing your LUKS volume. |
|||
# For example: /dev/sda2 |
|||
# |
|||
# <password>: This is either the volume password in plain text, or the name of |
|||
# a key file. Use 'none' to interactively enter password on boot. |
|||
# |
|||
# <options>: Comma-separated list of options. Note that there must be a |
|||
# password field for any options to be picked up (use a password of 'none' to |
|||
# get a password prompt at boot). The following options are supported: |
|||
# |
|||
# discard -- this will cause --allow-discards to be passed to the cryptsetup |
|||
# program while opening the LUKS volume. |
|||
# |
|||
# ro -- this will cause --readonly to be passed to the cryptsetup program while |
|||
# opening the LUKS volume. |
|||
# |
|||
# swap -- this option cannot be used with other options. The device given will |
|||
# be formatted as a new encrypted volume with a random key on boot, and used as |
|||
# swap. |
|||
# |
|||
if [ -f /etc/crypttab -a -x /sbin/cryptsetup ]; then |
|||
# First, check for device-mapper support. |
|||
if ! grep -wq device-mapper /proc/devices ; then |
|||
# If device-mapper exists as a module, try to load it. |
|||
# Try to load a device-mapper kernel module: |
|||
/sbin/modprobe -q dm-mod |
|||
fi |
|||
# NOTE: we only support LUKS formatted volumes (except for swap)! |
|||
cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do |
|||
eval LUKSARRAY=( $line ) |
|||
LUKS="${LUKSARRAY[0]}" |
|||
DEV="${LUKSARRAY[1]}" |
|||
PASS="${LUKSARRAY[2]}" |
|||
OPTS="${LUKSARRAY[3]}" |
|||
LUKSOPTS="" |
|||
if echo $OPTS | grep -wq ro ; then LUKSOPTS="${LUKSOPTS} --readonly" ; fi |
|||
if echo $OPTS | grep -wq discard ; then LUKSOPTS="${LUKSOPTS} --allow-discards" ; fi |
|||
# Skip LUKS volumes that were already unlocked (in the initrd): |
|||
/sbin/cryptsetup status $LUKS 2>/dev/null | head -n 1 | grep -q "is active" && continue |
|||
if /sbin/cryptsetup isLuks $DEV 2>/dev/null ; then |
|||
if [ -z "${LUKSOPTS}" ]; then |
|||
echo "Unlocking LUKS encrypted volume '${LUKS}' on device '$DEV':" |
|||
else |
|||
echo "Unlocking LUKS encrypted volume '${LUKS}' on device '$DEV' with options '${LUKSOPTS}':" |
|||
fi |
|||
if [ -n "${PASS}" -a "${PASS}" != "none" ]; then |
|||
if [ -f "${PASS}" ]; then |
|||
# A password was given a key-file filename |
|||
/sbin/cryptsetup ${LUKSOPTS} --key-file=${PASS} luksOpen $DEV $LUKS |
|||
else |
|||
# A password was provided in plain text |
|||
echo "${PASS}" | /sbin/cryptsetup ${LUKSOPTS} luksOpen $DEV $LUKS |
|||
fi |
|||
else |
|||
# No password was given, or a password of 'none' was given |
|||
/sbin/cryptsetup ${LUKSOPTS} luksOpen $DEV $LUKS </dev/tty0 >/dev/tty0 2>&1 |
|||
fi |
|||
elif echo $OPTS | grep -wq swap ; then |
|||
# If any of the volumes is to be used as encrypted swap, |
|||
# then encrypt it using a random key and run mkswap: |
|||
echo "Creating encrypted swap volume '${LUKS}' on device '$DEV':" |
|||
/sbin/cryptsetup --cipher=aes --key-file=/dev/urandom --key-size=256 create $LUKS $DEV |
|||
mkswap /dev/mapper/$LUKS |
|||
fi |
|||
done |
|||
fi |
|||
|
|||
# Enable swapping: |
|||
/sbin/swapon -a 2> /dev/null |
|||
|
|||
# Start FUSE, if requested: |
|||
if [ -x /etc/rc.d/rc.fuse ]; then |
|||
sh /etc/rc.d/rc.fuse start |
|||
fi |
|||
|
|||
# Set the tick and frequency for the system clock. |
|||
# Default values are: TICK=10000 and FREQ=0 |
|||
TICK=10000 |
|||
FREQ=0 |
|||
# If there's a /etc/default/adjtimex config file, source it to override |
|||
# the default TICK and FREQ: |
|||
if [ -r /etc/default/adjtimex ]; then |
|||
. /etc/default/adjtimex |
|||
fi |
|||
if /sbin/adjtimex --tick $TICK --frequency $FREQ; then |
|||
echo "Setting the system clock rate: /sbin/adjtimex --tick $TICK --frequency $FREQ" |
|||
else |
|||
echo "Failed to set system clock with adjtimex, possibly invalid parameters? (TICK=$TICK FREQ=$FREQ)" |
|||
fi |
|||
|
|||
# Set the system time from the hardware clock using hwclock --hctosys. |
|||
if [ -x /sbin/hwclock ]; then |
|||
# Check for a broken motherboard RTC clock (where ioports for rtc are |
|||
# unknown) to prevent hwclock causing a hang: |
|||
if ! grep -q " : rtc" /proc/ioports ; then |
|||
CLOCK_OPT="--directisa" |
|||
fi |
|||
if [ /etc/adjtime -nt /etc/hardwareclock ]; then |
|||
if grep -q "^LOCAL" /etc/adjtime ; then |
|||
echo -n "Setting system time from the hardware clock (localtime): " |
|||
else |
|||
echo -n "Setting system time from the hardware clock (UTC): " |
|||
fi |
|||
/sbin/hwclock $CLOCK_OPT --hctosys |
|||
elif grep -wq "^localtime" /etc/hardwareclock 2> /dev/null ; then |
|||
echo -n "Setting system time from the hardware clock (localtime): " |
|||
/sbin/hwclock $CLOCK_OPT --localtime --hctosys |
|||
else |
|||
echo -n "Setting system time from the hardware clock (UTC): " |
|||
/sbin/hwclock $CLOCK_OPT --utc --hctosys |
|||
fi |
|||
date |
|||
fi |
|||
|
|||
# Test to see if the root partition is read-only, like it ought to be. |
|||
READWRITE=no |
|||
if touch /fsrwtestfile 2>/dev/null; then |
|||
rm -f /fsrwtestfile |
|||
READWRITE=yes |
|||
else |
|||
echo "Testing root filesystem status: read-only filesystem" |
|||
fi |
|||
|
|||
# See if a forced filesystem check was requested at shutdown: |
|||
if [ -r /etc/forcefsck ]; then |
|||
FORCEFSCK="-f" |
|||
fi |
|||
|
|||
# Check the root filesystem: |
|||
if [ ! $READWRITE = yes ]; then |
|||
RETVAL=0 |
|||
if [ ! -r /etc/fastboot ]; then |
|||
echo "Checking root filesystem:" |
|||
/sbin/fsck $FORCEFSCK -C -a / |
|||
RETVAL=$? |
|||
fi |
|||
# An error code of 2 or higher will require a reboot. |
|||
if [ $RETVAL -ge 2 ]; then |
|||
# An error code equal to or greater than 4 means that some errors |
|||
# could not be corrected. This requires manual attention, so we |
|||
# offer a chance to try to fix the problem in single-user mode: |
|||
if [ $RETVAL -ge 4 ]; then |
|||
echo |
|||
echo "***********************************************************" |
|||
echo "*** An error occurred during the root filesystem check. ***" |
|||
echo "*** You will now be given a chance to log into the ***" |
|||
echo "*** system in single-user mode to fix the problem. ***" |
|||
echo "*** ***" |
|||
echo "*** If you are using the ext2 filesystem, running ***" |
|||
echo "*** 'e2fsck -v -y <partition>' might help. ***" |
|||
echo "***********************************************************" |
|||
echo |
|||
echo "Once you exit the single-user shell, the system will reboot." |
|||
echo |
|||
PS1="(Repair filesystem) \#"; export PS1 |
|||
sulogin |
|||
else # With an error code of 2 or 3, reboot the machine automatically: |
|||
echo |
|||
echo "***********************************" |
|||
echo "*** The filesystem was changed. ***" |
|||
echo "*** The system will now reboot. ***" |
|||
echo "***********************************" |
|||
echo |
|||
fi |
|||
echo "Unmounting file systems." |
|||
/sbin/umount -a -r |
|||
/sbin/mount -n -o remount,ro / |
|||
echo "Rebooting system." |
|||
sleep 2 |
|||
reboot -f |
|||
fi |
|||
# Remount the root filesystem in read-write mode |
|||
echo "Remounting root device with read-write enabled." |
|||
/sbin/mount -w -v -n -o remount / |
|||
if [ $? -gt 0 ] ; then |
|||
echo "FATAL: Attempt to remount root device as read-write failed! This is going to" |
|||
echo "cause serious problems." |
|||
fi |
|||
else |
|||
echo "Testing root filesystem status: read-write filesystem" |
|||
echo |
|||
echo "ERROR: Root partition has already been mounted read-write. Cannot check!" |
|||
echo |
|||
echo "For filesystem checking to work properly, your system must initially mount" |
|||
echo "the root partition as read only. If you're booting with LILO, add a line:" |
|||
echo |
|||
echo " read-only" |
|||
echo |
|||
echo "to the Linux section in your /etc/lilo.conf and type 'lilo' to reinstall it." |
|||
fi # Done checking root filesystem |
|||
|
|||
|
|||
# Any /etc/mtab that exists here is old, so we start with a new one: |
|||
/bin/rm -f /etc/mtab{,~,.tmp} && /bin/touch /etc/mtab |
|||
|
|||
# Add entry for / to /etc/mtab: |
|||
/sbin/mount -f -w / |
|||
|
|||
# Add /proc, /sys, and /dev/shm mounts to /etc/mtab: |
|||
if [ -d /proc/sys ]; then |
|||
/sbin/mount -f -t proc proc /proc |
|||
fi |
|||
if [ -d /sys/bus ]; then |
|||
/sbin/mount -f -t sysfs sysfs /sys |
|||
fi |
|||
if grep -q '^[^ ]\+ /dev/shm ' /proc/mounts 2> /dev/null ; then |
|||
/sbin/mount -f -t tmpfs tmpfs /dev/shm |
|||
fi |
|||
|
|||
# Configure ISA Plug-and-Play devices: |
|||
if [ -r /etc/isapnp.conf ]; then |
|||
if [ -x /sbin/isapnp ]; then |
|||
/sbin/isapnp /etc/isapnp.conf |
|||
fi |
|||
fi |
|||
|
|||
# Run the kernel module script. This updates the module dependencies and |
|||
# also supports manually loading kernel modules through rc.modules.local. |
|||
if [ -x /etc/rc.d/rc.modules ]; then |
|||
. /etc/rc.d/rc.modules |
|||
fi |
|||
|
|||
# Configure kernel parameters: |
|||
if [ -x /sbin/sysctl -a -r /etc/sysctl.conf ]; then |
|||
echo "Configuring kernel parameters: /sbin/sysctl -e --system" |
|||
/sbin/sysctl -e --system |
|||
elif [ -x /sbin/sysctl ]; then |
|||
echo "Configuring kernel parameters: /sbin/sysctl -e --system" |
|||
# Don't say "Applying /etc/sysctl.conf" or complain if the file doesn't exist |
|||
/sbin/sysctl -e --system 2> /dev/null | grep -v "Applying /etc/sysctl.conf" |
|||
fi |
|||
|
|||
# Check all the non-root filesystems: |
|||
if [ ! -r /etc/fastboot ]; then |
|||
echo "Checking non-root filesystems:" |
|||
/sbin/fsck $FORCEFSCK -C -R -A -a |
|||
fi |
|||
|
|||
# Mount usbfs only if it is found in /etc/fstab: |
|||
if grep -wq usbfs /proc/filesystems; then |
|||
if ! grep -wq usbfs /proc/mounts ; then |
|||
if grep -wq usbfs /etc/fstab; then |
|||
/sbin/mount -v /proc/bus/usb |
|||
fi |
|||
fi |
|||
fi |
|||
|
|||
# Mount non-root file systems in fstab, but not NFS or SMB |
|||
# because TCP/IP is not yet configured, and not proc or sysfs |
|||
# because those have already been mounted. Also check that |
|||
# devpts is not already mounted before attempting to mount |
|||
# it. With a 2.6.x or newer kernel udev mounts devpts. |
|||
# We also need to wait a little bit to let USB and other |
|||
# hotplugged devices settle (sorry to slow down the boot): |
|||
echo "Mounting non-root local filesystems:" |
|||
sleep 3 |
|||
if /bin/grep -wq devpts /proc/mounts ; then |
|||
# This pipe after the mount command is just to convert the new |
|||
# mount verbose output back to the old format that contained |
|||
# more useful information: |
|||
/sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs,nodevpts | grep successfully | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done |
|||
else |
|||
/sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs | grep successfully | cut -f 1 -d : | tr -d ' ' | while read dev ; do mount | grep "${dev} " ; done |
|||
fi |
|||
|
|||
# Enable swapping again. This is needed in case a swapfile is used, |
|||
# as it can't be enabled until the filesystem it resides on has been |
|||
# mounted read-write. |
|||
/sbin/swapon -a 2> /dev/null |
|||
|
|||
# Start cgmanager (or cgproxy in a container): |
|||
if [ -x /etc/rc.d/rc.cgmanager -a -d /sys/fs/cgroup ]; then |
|||
sh /etc/rc.d/rc.cgmanager start |
|||
fi |
|||
|
|||
# Clean up some temporary files: |
|||
rm -f /var/run/* /var/run/*/* /var/run/*/*/* /etc/nologin \ |
|||
/etc/dhcpc/*.pid /etc/forcefsck /etc/fastboot \ |
|||
/var/state/saslauthd/saslauthd.pid \ |
|||
/tmp/.Xauth* 1> /dev/null 2> /dev/null |
|||
( cd /var/log/setup/tmp && rm -rf * ) |
|||
( cd /tmp && rm -rf kde-[a-zA-Z]* ksocket-[a-zA-Z]* hsperfdata_[a-zA-Z]* plugtmp* ) |
|||
|
|||
# Clear /var/lock/subsys: |
|||
if [ -d /var/lock/subsys ]; then |
|||
rm -f /var/lock/subsys/* |
|||
fi |
|||
|
|||
# Create /tmp/{.ICE-unix,.X11-unix} if they are not present: |
|||
if [ ! -e /tmp/.ICE-unix ]; then |
|||
mkdir -p /tmp/.ICE-unix |
|||
chmod 1777 /tmp/.ICE-unix |
|||
fi |
|||
if [ ! -e /tmp/.X11-unix ]; then |
|||
mkdir -p /tmp/.X11-unix |
|||
chmod 1777 /tmp/.X11-unix |
|||
fi |
|||
|
|||
# Create a fresh utmp file: |
|||
touch /var/run/utmp |
|||
chown root:utmp /var/run/utmp |
|||
chmod 664 /var/run/utmp |
|||
|
|||
# Update the current kernel level in the /etc/motd (Message Of The Day) file, |
|||
# if the first line of that file begins with the word 'Linux'. |
|||
# You are free to modify the rest of the file as you see fit. |
|||
if [ -x /bin/sed ]; then |
|||
/bin/sed -i "{1s/^Linux.*/$(/bin/uname -sr)\./}" /etc/motd |
|||
fi |
|||
|
|||
# If there are SystemV init scripts for this runlevel, run them. |
|||
if [ -x /etc/rc.d/rc.sysvinit ]; then |
|||
. /etc/rc.d/rc.sysvinit |
|||
fi |
|||
|
|||
# Run serial port setup script: |
|||
# CAREFUL! This can make some systems hang if the rc.serial script isn't |
|||
# set up correctly. If this happens, you may have to edit the file from a |
|||
# boot disk, and/or set it as non-executable: |
|||
if [ -x /etc/rc.d/rc.serial ]; then |
|||
sh /etc/rc.d/rc.serial start |
|||
fi |
|||
|
|||
# Carry an entropy pool between reboots to improve randomness. |
|||
if [ -f /etc/random-seed ]; then |
|||
echo "Using /etc/random-seed to initialize /dev/urandom." |
|||
cat /etc/random-seed > /dev/urandom |
|||
fi |
|||
# Use the pool size from /proc, or 4096 bits: |
|||
if [ -r /proc/sys/kernel/random/poolsize ]; then |
|||
dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(expr $(cat /proc/sys/kernel/random/poolsize) / 8) 2> /dev/null |
|||
else |
|||
dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null |
|||
fi |
|||
chmod 600 /etc/random-seed |
|||
|
@ -0,0 +1,331 @@ |
|||
#! /bin/sh |
|||
# /etc/rc.d/rc.inet1 |
|||
# This script is used to bring up the various network interfaces. |
|||
# |
|||
# @(#)/etc/rc.d/rc.inet1 10.2 Sun Jul 24 12:45:56 PDT 2005 (pjv) |
|||
|
|||
# Set $container variable since this is a modified version of rc.inet1 with |
|||
# changes for running in an lxc container. A check to see if this variable |
|||
# is set will be used to skip parts of the script that we don't want to run |
|||
# in a container. Thanks to Matteo Bernardini <ponce@slackbuilds.org> and |
|||
# Chris Willing for the initial work making this script lxc compatible. |
|||
container="lxc" |
|||
|
|||
############################ |
|||
# READ NETWORK CONFIG FILE # |
|||
############################ |
|||
|
|||
# Get the configuration information from /etc/rc.d/rc.inet1.conf: |
|||
. /etc/rc.d/rc.inet1.conf |
|||
|
|||
########### |
|||
# LOGGING # |
|||
########### |
|||
|
|||
# If possible, log events in /var/log/messages: |
|||
if [ -f /var/run/syslogd.pid -a -x /usr/bin/logger ]; then |
|||
LOGGER=/usr/bin/logger |
|||
else # output to stdout/stderr: |
|||
LOGGER=/bin/cat |
|||
fi |
|||
|
|||
############################ |
|||
# DETERMINE INTERFACE LIST # |
|||
############################ |
|||
|
|||
# Compose a list of interfaces from /etc/rc.d/rc.inet1.conf (with a maximum |
|||
# of 6 interfaces, but you can easily enlarge the interface limit |
|||
# - send me a picture of such a box :-). |
|||
# If a value for IFNAME[n] is not set, we assume it is an eth'n' interface. |
|||
# This way, the new script is compatible with older rc.inet1.conf files. |
|||
# The IFNAME array will be used to determine which interfaces to bring up/down. |
|||
MAXNICS=${MAXNICS:-6} |
|||
i=0 |
|||
while [ $i -lt $MAXNICS ]; |
|||
do |
|||
IFNAME[$i]=${IFNAME[$i]:=eth${i}} |
|||
i=$(($i+1)) |
|||
done |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: List of interfaces: '${IFNAME[@]}'" | $LOGGER |
|||
fi |
|||
|
|||
###################### |
|||
# LOOPBACK FUNCTIONS # |
|||
###################### |
|||
|
|||
# Function to bring up the loopback interface. If loopback is |
|||
# already up, do nothing. |
|||
lo_up() { |
|||
if grep lo: /proc/net/dev 1> /dev/null ; then |
|||
if ! /sbin/ifconfig | grep "^lo" 1> /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig lo 127.0.0.1" | $LOGGER |
|||
/sbin/ifconfig lo 127.0.0.1 |
|||
echo "/etc/rc.d/rc.inet1: /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo" | $LOGGER |
|||
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
# Function to take down the loopback interface: |
|||
lo_down() { |
|||
if grep lo: /proc/net/dev 1> /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig lo down" | $LOGGER |
|||
/sbin/ifconfig lo down |
|||
fi |
|||
} |
|||
|
|||
####################### |
|||
# INTERFACE FUNCTIONS # |
|||
####################### |
|||
|
|||
# Function to assemble a bridge interface. |
|||
br_open() { |
|||
# argument is 'i' - the position of this interface in the IFNAME array. |
|||
/sbin/brctl addbr ${IFNAME[$1]} |
|||
for BRIF in $(echo ${BRNICS[$1]}); do |
|||
/sbin/ifconfig $BRIF down |
|||
/sbin/ifconfig $BRIF 0.0.0.0 promisc up |
|||
/sbin/brctl addif ${IFNAME[$1]} $BRIF |
|||
done |
|||
} |
|||
|
|||
# Function to disassemble a bridge interface. |
|||
br_close() { |
|||
# argument is 'i' - the position of this interface in the IFNAME array. |
|||
#for BRIF in $(echo ${BRNICS[$1]}); do |
|||
for BRIF in $(ls --indicator-style=none /sys/class/net/${IFNAME[$1]}/brif/) |
|||
do |
|||
/sbin/brctl delif ${IFNAME[$1]} $BRIF |
|||
done |
|||
/sbin/ifconfig ${IFNAME[$1]} down |
|||
/sbin/brctl delbr ${IFNAME[$1]} |
|||
} |
|||
|
|||
# Function to bring up a network interface. If the interface is |
|||
# already up or does not yet exist (perhaps because the kernel driver |
|||
# is not loaded yet), do nothing. |
|||
if_up() { |
|||
# Determine position 'i' of this interface in the IFNAME array: |
|||
i=0 |
|||
while [ $i -lt $MAXNICS ]; do |
|||
[ "${IFNAME[$i]}" = "${1}" ] && break |
|||
i=$(($i+1)) |
|||
done |
|||
|
|||
if [ -z "$container" ]; then |
|||
# If the interface is a bridge, then create it first: |
|||
[ -n "${BRNICS[$i]}" ] && br_open $i |
|||
# If the interface isn't in the kernel yet (but there's an alias for it in |
|||
# modules.conf), then it should be loaded first: |
|||
if ! grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then # no interface yet |
|||
if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${1}" | grep -vw "alias ${1} off" > /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/modprobe ${1}" | $LOGGER |
|||
/sbin/modprobe ${1} |
|||
fi |
|||
fi |
|||
fi # end check container |
|||
|
|||
if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then # interface exists |
|||
if ! /sbin/ifconfig | grep -w "${1}" 1>/dev/null || \ |
|||
! /sbin/ifconfig ${1} | grep -w inet 1> /dev/null ; then # interface not up or not configured |
|||
if [ ! "${HWADDR[$i]}" = "" ]; then # Set hardware address _before_ the interface goes up: |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} hw ether ${HWADDR[$i]}" | $LOGGER |
|||
/sbin/ifconfig ${1} hw ether ${HWADDR[$i]} |
|||
fi |
|||
if [ ! "${MTU[$i]}" = "" ]; then # Set MTU to something else than 1500 |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} mtu ${MTU[$i]}" | $LOGGER |
|||
/sbin/ifconfig ${1} mtu ${MTU[$i]} |
|||
fi |
|||
if [ -x /etc/rc.d/rc.wireless ]; then |
|||
. /etc/rc.d/rc.wireless ${1} start # Initialize any wireless parameters |
|||
fi |
|||
if [ "${USE_DHCP[$i]}" = "yes" ]; then # use DHCP to bring interface up |
|||
# Clear DHCP_OPTIONS before adding new options to it: |
|||
unset DHCP_OPTIONS |
|||
# Set DHCP_OPTIONS for this interface: |
|||
[ ${DHCP_HOSTNAME[$i]} ] && DHCP_OPTIONS="-h ${DHCP_HOSTNAME[$i]}" |
|||
[ "${DHCP_KEEPRESOLV[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C resolv.conf" |
|||
[ "${DHCP_KEEPNTP[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C ntp.conf" |
|||
[ "${DHCP_KEEPGW[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -G" |
|||
[ "${DHCP_DEBUG[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -d" |
|||
[ "${DHCP_NOIPV4LL[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -L" |
|||
[ ${DHCP_IPADDR[$i]} ] && DHCP_OPTIONS="$DHCP_OPTIONS -r ${DHCP_IPADDR[$i]}" |
|||
echo "Polling for DHCP server on interface ${1}:" |
|||
# If you set a timeout, you get one, even if the kernel doesn't think that |
|||
# your device is connected, in case /sys isn't right (which it usually isn't |
|||
# except right after the device is loaded, when it usually is): |
|||
#### (start commented out) |
|||
# This is deactivated for now since the kernel has been returning incorrect |
|||
# results concerning whether the interface carrier is detected. |
|||
#if [ "${DHCP_TIMEOUT[$i]}" = "" ]; then |
|||
# ifconfig ${1} up && sleep 1 |
|||
# CONNSTATUS="$(cat /sys/class/net/${1}/carrier 2> /dev/null)" |
|||
# ifconfig ${1} down |
|||
# if [ "$CONNSTATUS" = "0" ]; then |
|||
# # The kernel has just told us the cable isn't even plugged in, but we will |
|||
# # give any DHCP server a short chance to reply anyway: |
|||
# echo "No carrier detected on ${1}. Reducing DHCP timeout to 10 seconds." |
|||
# DHCP_TIMEOUT[$i]=10 |
|||
# fi |
|||
#fi |
|||
#### (end commented out) |
|||
# 10 seconds should be a reasonable default DHCP timeout. 30 was too much. |
|||
echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-10} ${DHCP_OPTIONS} ${1}" | $LOGGER |
|||
/sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-10} ${DHCP_OPTIONS} ${1} |
|||
else # bring up interface using a static IP address |
|||
if [ ! "${IPADDR[$i]}" = "" ]; then # skip unconfigured interfaces |
|||
# Determine broadcast address from the IP address and netmask: |
|||
BROADCAST[$i]=`/bin/ipmask ${NETMASK[$i]} ${IPADDR[$i]}|cut -f1 -d' '` |
|||
# Set up the network card: |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]}" | $LOGGER |
|||
/sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]} |
|||
else |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: ${1} interface is not configured in /etc/rc.d/rc.inet1.conf" | $LOGGER |
|||
fi |
|||
fi |
|||
fi |
|||
else |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: ${1} is already up, skipping" | $LOGGER |
|||
fi |
|||
fi |
|||
else |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: ${1} interface does not exist (yet)" | $LOGGER |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
# Function to take down a network interface: |
|||
if_down() { |
|||
# Determine position 'i' of this interface in the IFNAME array: |
|||
i=0 |
|||
while [ $i -lt $MAXNICS ]; do |
|||
[ "${IFNAME[$i]}" = "${1}" ] && break |
|||
i=$(($i+1)) |
|||
done |
|||
if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then |
|||
if [ "${USE_DHCP[$i]}" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -k -d ${1}" | $LOGGER |
|||
/sbin/dhcpcd -k -d ${1} 2> /dev/null || /sbin/ifconfig ${1} down |
|||
sleep 1 |
|||
else |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} down" | $LOGGER |
|||
/sbin/ifconfig ${1} down |
|||
fi |
|||
if [ -x /etc/rc.d/rc.wireless ]; then |
|||
. /etc/rc.d/rc.wireless ${1} stop # Kill wireless daemons if any. |
|||
fi |
|||
# If the interface is a bridge, then destroy it now: |
|||
if [ -n "${BRNICS[$i]}" ]; then |
|||
br_close $i |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
##################### |
|||
# GATEWAY FUNCTIONS # |
|||
##################### |
|||
|
|||
# Function to bring up the gateway if there is not yet a default route: |
|||
gateway_up() { |
|||
if ! /sbin/route -n | grep "^0.0.0.0" 1> /dev/null ; then |
|||
if [ ! "$GATEWAY" = "" ]; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/route add default gw ${GATEWAY} metric 1" | $LOGGER |
|||
/sbin/route add default gw ${GATEWAY} metric 1 2>&1 | $LOGGER |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
# Function to take down an existing default gateway: |
|||
gateway_down() { |
|||
if /sbin/route -n | grep "^0.0.0.0" 1> /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/route del default" | $LOGGER |
|||
/sbin/route del default |
|||
fi |
|||
} |
|||
|
|||
# Function to start the network: |
|||
start() { |
|||
lo_up |
|||
for i in ${IFNAME[@]} ; do |
|||
if_up $i |
|||
done |
|||
gateway_up |
|||
} |
|||
|
|||
# Function to stop the network: |
|||
stop() { |
|||
gateway_down |
|||
for i in ${IFNAME[@]} ; do |
|||
if_down $i |
|||
done |
|||
lo_down |
|||
} |
|||
|
|||
|
|||
############ |
|||
### MAIN ### |
|||
############ |
|||
|
|||
case "$1" in |
|||
'start') # "start" brings up all configured interfaces: |
|||
start |
|||
;; |
|||
'stop') # "stop" takes down all configured interfaces: |
|||
stop |
|||
;; |
|||
'restart') # "restart" restarts the network: |
|||
stop |
|||
start |
|||
;; |
|||
'lo_start') # Start the loopback interface: |
|||
lo_up |
|||
;; |
|||
*_start) # Example: "eth1_start" will start the specified interface 'eth1' |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_up $INTERFACE |
|||
gateway_up |
|||
;; |
|||
'lo_stop') # Stop the loopback interface: |
|||
lo_down |
|||
;; |
|||
*_stop) # Example: "eth0_stop" will stop the specified interface 'eth0' |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_down $INTERFACE |
|||
;; |
|||
*_restart) # Example: "wlan0_restart" will take 'wlan0' down and up again |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_down $INTERFACE |
|||
sleep 1 |
|||
if_up $INTERFACE |
|||
gateway_up |
|||
;; |
|||
'up') # "up" does the same thing as "start" |
|||
start |
|||
;; |
|||
'down') # "down" does the same thing as "stop" |
|||
stop |
|||
;; |
|||
'lo_up') # Start the loopback interface: |
|||
lo_up |
|||
;; |
|||
*_up) # "*_up" does the same thing as "*_start" |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_up $INTERFACE |
|||
gateway_up |
|||
;; |
|||
'lo_down') # Stop the loopback interface: |
|||
lo_down |
|||
;; |
|||
*_down) # "*_down" does the same thing as "*_stop" |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_down $INTERFACE |
|||
;; |
|||
*) # The default is to bring up all configured interfaces: |
|||
start |
|||
esac |
|||
|
|||
# End of /etc/rc.d/rc.inet1 |
@ -0,0 +1,320 @@ |
|||
#! /bin/sh |
|||
# /etc/rc.d/rc.inet1 |
|||
# This script is used to bring up the various network interfaces. |
|||
# |
|||
# @(#)/etc/rc.d/rc.inet1 10.2 Sun Jul 24 12:45:56 PDT 2005 (pjv) |
|||
|
|||
############################ |
|||
# READ NETWORK CONFIG FILE # |
|||
############################ |
|||
|
|||
# Get the configuration information from /etc/rc.d/rc.inet1.conf: |
|||
. /etc/rc.d/rc.inet1.conf |
|||
|
|||
########### |
|||
# LOGGING # |
|||
########### |
|||
|
|||
# If possible, log events in /var/log/messages: |
|||
if [ -f /var/run/syslogd.pid -a -x /usr/bin/logger ]; then |
|||
LOGGER=/usr/bin/logger |
|||
else # output to stdout/stderr: |
|||
LOGGER=/bin/cat |
|||
fi |
|||
|
|||
############################ |
|||
# DETERMINE INTERFACE LIST # |
|||
############################ |
|||
|
|||
# Compose a list of interfaces from /etc/rc.d/rc.inet1.conf (with a maximum |
|||
# of 6 interfaces, but you can easily enlarge the interface limit |
|||
# - send me a picture of such a box :-). |
|||
# If a value for IFNAME[n] is not set, we assume it is an eth'n' interface. |
|||
# This way, the new script is compatible with older rc.inet1.conf files. |
|||
# The IFNAME array will be used to determine which interfaces to bring up/down. |
|||
MAXNICS=${MAXNICS:-6} |
|||
i=0 |
|||
while [ $i -lt $MAXNICS ]; |
|||
do |
|||
IFNAME[$i]=${IFNAME[$i]:=eth${i}} |
|||
i=$(($i+1)) |
|||
done |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: List of interfaces: '${IFNAME[@]}'" | $LOGGER |
|||
fi |
|||
|
|||
###################### |
|||
# LOOPBACK FUNCTIONS # |
|||
###################### |
|||
|
|||
# Function to bring up the loopback interface. If loopback is |
|||
# already up, do nothing. |
|||
lo_up() { |
|||
if grep lo: /proc/net/dev 1> /dev/null ; then |
|||
if ! /sbin/ifconfig | grep "^lo" 1> /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig lo 127.0.0.1" | $LOGGER |
|||
/sbin/ifconfig lo 127.0.0.1 |
|||
echo "/etc/rc.d/rc.inet1: /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo" | $LOGGER |
|||
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
# Function to take down the loopback interface: |
|||
lo_down() { |
|||
if grep lo: /proc/net/dev 1> /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig lo down" | $LOGGER |
|||
/sbin/ifconfig lo down |
|||
fi |
|||
} |
|||
|
|||
####################### |
|||
# INTERFACE FUNCTIONS # |
|||
####################### |
|||
|
|||
# Function to assemble a bridge interface. |
|||
br_open() { |
|||
# argument is 'i' - the position of this interface in the IFNAME array. |
|||
/sbin/brctl addbr ${IFNAME[$1]} |
|||
for BRIF in $(echo ${BRNICS[$1]}); do |
|||
/sbin/ifconfig $BRIF down |
|||
/sbin/ifconfig $BRIF 0.0.0.0 promisc up |
|||
/sbin/brctl addif ${IFNAME[$1]} $BRIF |
|||
done |
|||
} |
|||
|
|||
# Function to disassemble a bridge interface. |
|||
br_close() { |
|||
# argument is 'i' - the position of this interface in the IFNAME array. |
|||
#for BRIF in $(echo ${BRNICS[$1]}); do |
|||
for BRIF in $(ls --indicator-style=none /sys/class/net/${IFNAME[$1]}/brif/) |
|||
do |
|||
/sbin/brctl delif ${IFNAME[$1]} $BRIF |
|||
done |
|||
/sbin/ifconfig ${IFNAME[$1]} down |
|||
/sbin/brctl delbr ${IFNAME[$1]} |
|||
} |
|||
|
|||
# Function to bring up a network interface. If the interface is |
|||
# already up or does not yet exist (perhaps because the kernel driver |
|||
# is not loaded yet), do nothing. |
|||
if_up() { |
|||
# Determine position 'i' of this interface in the IFNAME array: |
|||
i=0 |
|||
while [ $i -lt $MAXNICS ]; do |
|||
[ "${IFNAME[$i]}" = "${1}" ] && break |
|||
i=$(($i+1)) |
|||
done |
|||
# If the interface is a bridge, then create it first: |
|||
[ -n "${BRNICS[$i]}" ] && br_open $i |
|||
# If the interface isn't in the kernel yet (but there's an alias for it in |
|||
# modules.conf), then it should be loaded first: |
|||
if ! grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then # no interface yet |
|||
if /sbin/modprobe -c | grep -v "^#" | grep -w "alias ${1}" | grep -vw "alias ${1} off" > /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/modprobe ${1}" | $LOGGER |
|||
/sbin/modprobe ${1} |
|||
fi |
|||
fi |
|||
if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then # interface exists |
|||
if ! /sbin/ifconfig | grep -w "${1}" 1>/dev/null || \ |
|||
! /sbin/ifconfig ${1} | grep -w inet 1> /dev/null ; then # interface not up or not configured |
|||
if [ ! "${HWADDR[$i]}" = "" ]; then # Set hardware address _before_ the interface goes up: |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} hw ether ${HWADDR[$i]}" | $LOGGER |
|||
/sbin/ifconfig ${1} hw ether ${HWADDR[$i]} |
|||
fi |
|||
if [ ! "${MTU[$i]}" = "" ]; then # Set MTU to something else than 1500 |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} mtu ${MTU[$i]}" | $LOGGER |
|||
/sbin/ifconfig ${1} mtu ${MTU[$i]} |
|||
fi |
|||
if [ -x /etc/rc.d/rc.wireless ]; then |
|||
. /etc/rc.d/rc.wireless ${1} start # Initialize any wireless parameters |
|||
fi |
|||
if [ "${USE_DHCP[$i]}" = "yes" ]; then # use DHCP to bring interface up |
|||
# Clear DHCP_OPTIONS before adding new options to it: |
|||
unset DHCP_OPTIONS |
|||
# Set DHCP_OPTIONS for this interface: |
|||
[ ${DHCP_HOSTNAME[$i]} ] && DHCP_OPTIONS="-h ${DHCP_HOSTNAME[$i]}" |
|||
[ "${DHCP_KEEPRESOLV[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C resolv.conf" |
|||
[ "${DHCP_KEEPNTP[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -C ntp.conf" |
|||
[ "${DHCP_KEEPGW[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -G" |
|||
[ "${DHCP_DEBUG[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -d" |
|||
[ "${DHCP_NOIPV4LL[$i]}" = "yes" ] && DHCP_OPTIONS="$DHCP_OPTIONS -L" |
|||
[ ${DHCP_IPADDR[$i]} ] && DHCP_OPTIONS="$DHCP_OPTIONS -r ${DHCP_IPADDR[$i]}" |
|||
echo "Polling for DHCP server on interface ${1}:" |
|||
# If you set a timeout, you get one, even if the kernel doesn't think that |
|||
# your device is connected, in case /sys isn't right (which it usually isn't |
|||
# except right after the device is loaded, when it usually is): |
|||
#### (start commented out) |
|||
# This is deactivated for now since the kernel has been returning incorrect |
|||
# results concerning whether the interface carrier is detected. |
|||
#if [ "${DHCP_TIMEOUT[$i]}" = "" ]; then |
|||
# ifconfig ${1} up && sleep 1 |
|||
# CONNSTATUS="$(cat /sys/class/net/${1}/carrier 2> /dev/null)" |
|||
# ifconfig ${1} down |
|||
# if [ "$CONNSTATUS" = "0" ]; then |
|||
# # The kernel has just told us the cable isn't even plugged in, but we will |
|||
# # give any DHCP server a short chance to reply anyway: |
|||
# echo "No carrier detected on ${1}. Reducing DHCP timeout to 10 seconds." |
|||
# DHCP_TIMEOUT[$i]=10 |
|||
# fi |
|||
#fi |
|||
#### (end commented out) |
|||
# 10 seconds should be a reasonable default DHCP timeout. 30 was too much. |
|||
echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-10} ${DHCP_OPTIONS} ${1}" | $LOGGER |
|||
/sbin/dhcpcd -t ${DHCP_TIMEOUT[$i]:-10} ${DHCP_OPTIONS} ${1} |
|||
else # bring up interface using a static IP address |
|||
if [ ! "${IPADDR[$i]}" = "" ]; then # skip unconfigured interfaces |
|||
# Determine broadcast address from the IP address and netmask: |
|||
BROADCAST[$i]=`/bin/ipmask ${NETMASK[$i]} ${IPADDR[$i]}|cut -f1 -d' '` |
|||
# Set up the network card: |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]}" | $LOGGER |
|||
/sbin/ifconfig ${1} ${IPADDR[$i]} broadcast ${BROADCAST[$i]} netmask ${NETMASK[$i]} |
|||
else |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: ${1} interface is not configured in /etc/rc.d/rc.inet1.conf" | $LOGGER |
|||
fi |
|||
fi |
|||
fi |
|||
else |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: ${1} is already up, skipping" | $LOGGER |
|||
fi |
|||
fi |
|||
else |
|||
if [ "$DEBUG_ETH_UP" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: ${1} interface does not exist (yet)" | $LOGGER |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
# Function to take down a network interface: |
|||
if_down() { |
|||
# Determine position 'i' of this interface in the IFNAME array: |
|||
i=0 |
|||
while [ $i -lt $MAXNICS ]; do |
|||
[ "${IFNAME[$i]}" = "${1}" ] && break |
|||
i=$(($i+1)) |
|||
done |
|||
if grep `echo ${1}: | cut -f 1 -d :`: /proc/net/dev 1> /dev/null ; then |
|||
if [ "${USE_DHCP[$i]}" = "yes" ]; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/dhcpcd -k -d ${1}" | $LOGGER |
|||
/sbin/dhcpcd -k -d ${1} 2> /dev/null || /sbin/ifconfig ${1} down |
|||
sleep 1 |
|||
else |
|||
echo "/etc/rc.d/rc.inet1: /sbin/ifconfig ${1} down" | $LOGGER |
|||
/sbin/ifconfig ${1} down |
|||
fi |
|||
if [ -x /etc/rc.d/rc.wireless ]; then |
|||
. /etc/rc.d/rc.wireless ${1} stop # Kill wireless daemons if any. |
|||
fi |
|||
# If the interface is a bridge, then destroy it now: |
|||
if [ -n "${BRNICS[$i]}" ]; then |
|||
br_close $i |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
##################### |
|||
# GATEWAY FUNCTIONS # |
|||
##################### |
|||
|
|||
# Function to bring up the gateway if there is not yet a default route: |
|||
gateway_up() { |
|||
if ! /sbin/route -n | grep "^0.0.0.0" 1> /dev/null ; then |
|||
if [ ! "$GATEWAY" = "" ]; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/route add default gw ${GATEWAY} metric 1" | $LOGGER |
|||
/sbin/route add default gw ${GATEWAY} metric 1 2>&1 | $LOGGER |
|||
fi |
|||
fi |
|||
} |
|||
|
|||
# Function to take down an existing default gateway: |
|||
gateway_down() { |
|||
if /sbin/route -n | grep "^0.0.0.0" 1> /dev/null ; then |
|||
echo "/etc/rc.d/rc.inet1: /sbin/route del default" | $LOGGER |
|||
/sbin/route del default |
|||
fi |
|||
} |
|||
|
|||
# Function to start the network: |
|||
start() { |
|||
lo_up |
|||
for i in ${IFNAME[@]} ; do |
|||
if_up $i |
|||
done |
|||
gateway_up |
|||
} |
|||
|
|||
# Function to stop the network: |
|||
stop() { |
|||
gateway_down |
|||
for i in ${IFNAME[@]} ; do |
|||
if_down $i |
|||
done |
|||
lo_down |
|||
} |
|||
|
|||
|
|||
############ |
|||
### MAIN ### |
|||
############ |
|||
|
|||
case "$1" in |
|||
'start') # "start" brings up all configured interfaces: |
|||
start |
|||
;; |
|||
'stop') # "stop" takes down all configured interfaces: |
|||
stop |
|||
;; |
|||
'restart') # "restart" restarts the network: |
|||
stop |
|||
start |
|||
;; |
|||
'lo_start') # Start the loopback interface: |
|||
lo_up |
|||
;; |
|||
*_start) # Example: "eth1_start" will start the specified interface 'eth1' |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_up $INTERFACE |
|||
gateway_up |
|||
;; |
|||
'lo_stop') # Stop the loopback interface: |
|||
lo_down |
|||
;; |
|||
*_stop) # Example: "eth0_stop" will stop the specified interface 'eth0' |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_down $INTERFACE |
|||
;; |
|||
*_restart) # Example: "wlan0_restart" will take 'wlan0' down and up again |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_down $INTERFACE |
|||
sleep 1 |
|||
if_up $INTERFACE |
|||
gateway_up |
|||
;; |
|||
'up') # "up" does the same thing as "start" |
|||
start |
|||
;; |
|||
'down') # "down" does the same thing as "stop" |
|||
stop |
|||
;; |
|||
'lo_up') # Start the loopback interface: |
|||
lo_up |
|||
;; |
|||
*_up) # "*_up" does the same thing as "*_start" |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_up $INTERFACE |
|||
gateway_up |
|||
;; |
|||
'lo_down') # Stop the loopback interface: |
|||
lo_down |
|||
;; |
|||
*_down) # "*_down" does the same thing as "*_stop" |
|||
INTERFACE=`echo $1 | /bin/cut -d '_' -f 1` |
|||
if_down $INTERFACE |
|||
;; |
|||
*) # The default is to bring up all configured interfaces: |
|||
start |
|||
esac |
|||
|
|||
# End of /etc/rc.d/rc.inet1 |
@ -0,0 +1,19 @@ |
|||
# HOW TO EDIT THIS FILE: |
|||
# The "handy ruler" below makes it easier to edit a package description. Line |
|||
# up the first '|' above the ':' following the base package name, and the '|' |
|||
# on the right side marks the last column you can put a character in. You must |
|||
# make exactly 11 lines for the formatting to be correct. It's also |
|||
# customary to leave one space after the ':'. |
|||
|
|||
|-----handy-ruler------------------------------------------------------| |
|||
lxc: lxc (Linux Containers) |
|||
lxc: |
|||
lxc: Linux Containers (LXC) are an operating system-level virtualization |
|||
lxc: method for running multiple isolated server installs (containers) on |
|||
lxc: a single control host. LXC does not provide a virtual machine, but |
|||
lxc: rather provides a virtual environment that has its own process and |
|||
lxc: network space. It is similar to a chroot, but offers more isolation. |
|||
lxc: |
|||
lxc: Daniel Lezcano is the primary developer of lxc. |
|||
lxc: Homepage: https://linuxcontainers.org |
|||
lxc: |
Loading…
Reference in new issue