Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Альтернативная энергия

Беспроводные выключатели nooLite

Книги по Linux (с отзывами читателей)

Библиотека сайта или "Мой Linux Documentation Project"

Исследуем процесс загрузки Linux

(C) В.А.Костромин, 2007
(версия файла от 16.09.2007 г.)


Вернуться к разделу 6 Оглавление

Приложение 1. Пример скрипта rc.sysinit

В листинге 11 приведено содержимое файла rc.sysinit с моего компьютера, на котором установлен дистрибутив Mandriva Free 2007 Spring. Поскольку файл этот достаточно большой, листинг разбит на отдельные фрагменты, каждый из которых будет разбираться и комментироваться по отдельности.

Листинг 11-1. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 1.

#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

# Set the path
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export PATH

HOSTNAME=`/bin/hostname`
HOSTTYPE=`uname -m`
unamer=`uname -r`
eval version=`echo $unamer | awk -F '.' '{ print "(" $1 " " $2 ")" }'`

set -m
В первых строках содержится обычный для bash-скриптов заголовок "#!/bin/bash", небольшой комментарий и устанавливаются значения нескольких переменных.

Листинг 11-2. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 2.

if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi

# Read in config data.
if [ -f /etc/sysconfig/usb ]; then
    . /etc/sysconfig/usb
fi

if [ -f /etc/sysconfig/system ]; then
    . /etc/sysconfig/system
fi

. /etc/init.d/functions

if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi
Квадратные скобки в языке скриптов эквивалентны оператору test, который проверяет условие и возвращает значение "истина" или "ложь". В первом условном операторе if проверяется, что файл /etc/sysconfig/network существует и является обычным файлом. Если это действительно так, то этот файл выполняется (точка является синонимом команды source, которая читает и выполняет команды из указанного файла (в данном случае это /etc/sysconfig/network) и возвращает статус, определяемый последней командой из этого файла. В моем случае в файле /etc/sysconfig/network содержится всего одна строка "NETWORKIG=yes".

Следующие два условных оператора выполняют аналогичные действия с файлами /etc/sysconfig/usb и /etc/sysconfig/system. Заглянув в эти файлы я увидел, что там просто задаются значения нескольких переменных (видимо, они будут использованы где-то в дальнейшем).

Затем, уже безусловно, исполняется файл /etc/init.d/functions. Этот файл содержит определения функций, которые будут использоваться большинством скриптов из каталога /etc/init.

Последний условный оператор в этом фрагменте проверяет, что переменная HOSTNAME задана и имеет ненулевую длину. Если это именно так (то есть HOSTNAME не задана), то этой переменой присваивается значение "localhost".

Листинг 11-3. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 3.

# Mount /proc and /sys (done here so volume labels can work with fsck)
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
В этом фрагменте монтируются файловые системы /proc и /sys.

Листинг 11-4. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 4.

# This must be done before anything else because now most messages
# are translated so we need correct system font very early
# This must be done before Aurora is started too, since screenchars
# --tty=foo is broken :(
# Note that if setting of system font fails here boot messages
# may be unreadable so we may need to reset LANGUAGE to C in this case
# Load system font
#
# the font and other needed files should be available under
# /etc/sysconfig/console, in case they aren't we define DELAYED_FONT=yes
# to load the font later, when the /usr partition is mounted

if [ -x /sbin/setsysfont ]; then
    [ -x /bin/consolechars -o -x /usr/bin/consolechars  ] || DELAYED_FONT=yes
    if [ -n "$SYSFONT" ]; then
	   [ -f /etc/sysconfig/console/consolefonts/$SYSFONT.psf.gz -o \
	     -f /etc/sysconfig/console/consolefonts/$SYSFONT.psf ] || \
			DELAYED_FONT=yes
    fi 
    if [ -n "$SYSFONTACM" ]; then
	   [ -f /etc/sysconfig/console/consoletrans/$SYSFONTACM \
		-o -f /etc/sysconfig/console/consoletrans/$SYSFONTACM.acm.gz \
		-o -f /etc/sysconfig/console/consoletrans/$SYSFONTACM.acm ] || \
			DELAYED_FONT=yes
    fi
    if [ -n "$UNIMAP" ]; then
	   [ -f /etc/sysconfig/console/consoletrans/$UNIMAP \
		-o -f /etc/sysconfig/console/consoletrans/$UNIMAP.sfm.gz \
		-o -f /etc/sysconfig/console/consoletrans/$UNIMAP.sfm ] || \
			DELAYED_FONT=yes
    fi
    [ -r /usr/lib/kbd/consolefonts ] || DELAYED_FONT=yes
    [ -x /usr/bin/locale ] || DELAYED_FONT=yes
    # We have to set font before printing message, so we cannot
    # use ``action message command'' directly because it prints
    # message before executing command
    if [ "$DELAYED_FONT" != "yes" ]; then
	OUR_CHARSET=${CHARSET=`get_locale_encoding`}
	case "$OUR_CHARSET" in 
	    UTF-8)
		action "Setting default font ($SYSFONT): " /bin/unicode_start $SYSFONT
		# this is done by unicode_start, but apparently
		# "action" filters the output, so it has to be redone
		echo -n -e '\033%G'
		;;
	    *)
		action "Setting default font ($SYSFONT): " /sbin/setsysfont
		;;
	esac
    else
        reset_i18_settings
    fi
fi
В этом, довольно большом фрагменте задается системный шрифт. Как сообщается в строках комментария, это необходимо сделать именно сейчас, на начальном этапе конфигурирования системы, поскольку многие сообщения переведены на язык пользователя (про аврору не понял). Файл шрифта и другие необходимые файлы должны находиться в каталоге /etc/sysconfig/console, если они там не обнаружены, переменной DELAYED_FONT будет присвоено значение "yes", благодаря чему фонт будет загружаться позже, после того, как будет смонтирован раздел /usr.

Листинг 11-5. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 5.

# Only read this once.
cmdline=$(cat /proc/cmdline)
Содержимое командной строки загрузки ядра записывается в переменную cmdline. Эта переменная затем будет использоваться для того, чтобы посмотреть какое значение задано для того или иного параметра.

Листинг 11-6. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 6.

# Unmount the initrd, if necessary
# (pixel) do not unmount if /initrd/loopfs is mounted (happens for root loopback)
# (bluca) handle udev /dev tmpfs here since kernel will happily umount /dev after initrd end
# (blino) do it before the udev service is started so that it uses the /dev tmpfs from initrd
if LC_ALL=C grep -q /initrd /proc/mounts && ! LC_ALL=C grep -q /initrd/loopfs /proc/mounts ; then
   if LC_ALL=C grep -q /initrd/dev /proc/mounts; then
         mount --move /initrd/dev /dev
         # Initialize /dev contents from /lib/udev/devices
         if [ -d /lib/udev/devices ]; then 
            cp -a /lib/udev/devices/* /dev 
         fi
   fi
   action "Unmounting initrd: " umount -l /initrd
   /sbin/blockdev --flushbufs /dev/ram0 >/dev/null 2>&1
fi
Размонтируется виртуальный диск, проверив предварительно некоторые условия. Вся ветка каталога /initrd/dev перемещается в /dev.

Листинг 11-7. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 7.

# we better have udev create all block device nodes before going
# any further (not limited to /sys/block/sd*, since scsi_hostadapter
# might contain non-scsi drivers)
# it also loads usb now to be able to use an usb keyboard to answer questions 
# it will also copy then initrd's /dev if present (lvm, dmraid)
/etc/init.d/udev start
Утилита udev вызывается для создания nodes блоковых устройств. Это необходимо сделать уже сейчас, чтобы обеспечить возможность работать с клавиатурой для получения ответов пользователя на различные запросы.

Листинг 11-8. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 8.

# Check SELinux status
selinuxfs="$(fstab_decode_str `LC_ALL=C awk '/ selinuxfs / { print $2 }' /proc/mounts`)"
SELINUX_STATE=
if [ -n "$selinuxfs" ] && [ "`cat /proc/self/attr/current`" != "kernel" ]; then
	if [ -r "$selinuxfs/enforce" ] ; then
		SELINUX_STATE=`cat "$selinuxfs/enforce"`
	else
		# assume enforcing if you can't read it
		SELINUX_STATE=1
	fi
fi

if [ -n "$SELINUX_STATE" -a -x /sbin/restorecon ] && LC_ALL=C fgrep -q " /dev " /proc/mounts ; then
	/sbin/restorecon  -R /dev 2>/dev/null
fi

disable_selinux() {
	gprintf "*** Warning -- SELinux is active\n"
	gprintf "*** Disabling security enforcement for system recovery.\n"
	gprintf "*** Run 'setenforce 1' to reenable.\n"
	echo "0" > "$selinuxfs/enforce"
}

relabel_selinux() {
    if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
	chvt 1
    fi
    # if /sbin/init is not labeled correctly this process is running in the 
    # wrong context, so a reboot will be required after relabel
    REBOOTFLAG=`restorecon -v /sbin/init`
    AUTORELABEL=
    . /etc/selinux/config
    if [ "$AUTORELABEL" = "0" ]; then
 	rm -f  /.autorelabel 

 	echo
	gprintf "*** Warning -- SELinux %s policy relabel is required. \n" ${SELINUXTYPE}
 	gprintf "*** /etc/selinux/config indicates you want to manually fix labeling\n"
 	gprintf "*** problems. Dropping you to a shell; the system will reboot\n"
 	gprintf "*** when you leave the shell.\n"
 	echo "0" > $selinuxfs/enforce
 	sulogin
 
 	gprintf "Unmounting file systems\n"
 	umount -a
 	mount -n -o remount,ro /
 	gprintf "Automatic reboot in progress.\n"
 	reboot -f
    else
 	echo
 	gprintf "*** Warning -- SELinux %s policy relabel is required.\n" ${SELINUXTYPE}
 	gprintf "*** Relabeling could take a very long time, depending on file\n"
 	gprintf "*** system size and speed of hard drives.\n"
 
 	echo "0" > $selinuxfs/enforce
 	/sbin/fixfiles restore > /dev/null 2>&1 
 	rm -f  /.autorelabel 
 	if [ ! -z "$REBOOTFLAG" ]; then 
 	    gprintf "Automatic reboot in progress.\n"
 	    reboot -f
 	fi
 	echo $SELINUX_STATE > $selinuxfs/enforce
 	if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
 	    chvt 8
 	fi
    fi
}

key_is_random() {
    [ "$1" = "/dev/urandom" -o "$1" = "/dev/hw_random" \
	-o "$1" = "/dev/random" ]
}
Тут что-то делается с SELinux. Не разбирался, скорее всего запускается, но, возможно, выполняются только какие-то подготовительные операции.

Листинг 11-9. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 9.

# Because of a chicken/egg problem, init_crypto must be run twice.  /var may be
# encrypted but /var/lib/random-seed is needed to initialize swap.
init_crypto() {
    local have_random dst src key opt mode owner params makeswap skip arg opt
    local param value rc ret mke2fs mdir

    ret=0
    have_random=$1
    while read dst src key opt; do
	[ -z "$dst" -o "${dst#\#}" != "$dst" ] && continue
        [ -b "/dev/mapper/$dst" ] && continue;
	if [ "$have_random" = 0 ] && key_is_random "$key"; then
	    continue
	fi
	if [ -n "$key" -a "x$key" != "xnone" ]; then
	    if test -e "$key" ; then
		mode=$(ls -l "$key" | cut -c 5-10)
		owner=$(ls -l $key | awk '{ print $3 }')
		if [ "$mode" != "------" ] && ! key_is_random "$key"; then
		    gprintf "INSECURE MODE FOR %s\n" $key
		fi
		if [ "$owner" != root ]; then
		    gprintf "INSECURE OWNER FOR %s\n" $key
		fi
	    else
		gprintf "Key file for %s not found, skipping\n" $dst
		ret=1
		continue
	    fi
	else
	    key=""
	fi
	params=""
	makeswap=""
	mke2fs=""
	skip=""
	# Parse the options field, convert to cryptsetup parameters
	# and contruct the command line
	while [ -n "$opt" ]; do
	    arg=${opt%%,*}
	    opt=${opt##$arg}
	    opt=${opt##,}
	    param=${arg%%=*}
	    value=${arg##$param=}

	    case "$param" in
	    cipher)
		params="$params -c $value"
		if [ -z "$value" ]; then
		    gprintf "%s: no value for cipher option, skipping\n" $dst
		    skip="yes"
		fi
	    ;;
	    size)
		params="$params -s $value"
		if [ -z "$value" ]; then
		    gprintf "%s: no value for size option, skipping\n" $dst
		    skip="yes"
		fi
	    ;;
	    hash)
		params="$params -h $value"
		if [ -z "$value" ]; then
		    gprintf "%s: no value for hash option, skipping\n" $dst
		    skip="yes"
		fi
	    ;;
	    verify)
	        params="$params -y"
	    ;;
	    swap)
		makeswap=yes
		;;
	    tmp)
		mke2fs=yes
	    esac
	done
	if [ "$skip" = "yes" ]; then
	    ret=1
	    continue
	fi
	if [ -z "$key" -a -x /usr/bin/rhgb-client ] \
	    && /usr/bin/rhgb-client --ping ; then
	    chvt 1
	fi
	if cryptsetup isLuks "$src" 2>/dev/null; then
	    if key_is_random "$key"; then
		gprintf "%s: LUKS requires non-random key, skipping\n" $dst
		ret=1
		continue
	    fi
	    if [ -n "$params" ]; then
		echo "$dst: options are invalid for LUKS partitions," \
		    "ignoring them"
	    fi
	    /sbin/cryptsetup ${key:+-d $key} luksOpen "$src" "$dst" <&1
	else
	    /sbin/cryptsetup $params ${key:+-d $key} create "$dst" "$src" <&1
	fi
	rc=$?
	if [ -z "$key" -a -x /usr/bin/rhgb-client ] \
	    && /usr/bin/rhgb-client --ping ; then
	    chvt 8
	fi
	if [ $rc -ne 0 ]; then
	    ret=1
	    continue
	fi
	if [ -b "/dev/mapper/$dst" ]; then
	    if [ "$makeswap" = "yes" ]; then
		mkswap "/dev/mapper/$dst" 2>/dev/null >/dev/null
	    fi
	    if [ "$mke2fs" = "yes" ]; then
		if mke2fs "/dev/mapper/$dst" 2>/dev/null >/dev/null \
		    && mdir=$(mktemp -d /tmp/mountXXXXXX); then
		    mount "/dev/mapper/$dst" "$mdir" && chmod 1777 "$mdir"
		    umount "$mdir"
		    rmdir "$mdir"
		fi
	    fi
	fi
    done < /etc/crypttab
    return $ret
}
Пока без комментариев.

Листинг 11-10. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 10.

# Do the following while waiting for an 'I' from the user...
{
# Print a banner. ;)
# C-like escape sequences don't work as 2nd and up parameters of gprintf,
# so real escap chars were written
PRODUCT=`sed "s/.*release \([0-9.]*\).*/\1/g" /etc/mandriva-release 2> /dev/null`
SYSTEM=${SYSTEM="Mandriva Linux"}

if [ -r /etc/sysconfig/oem ]; then
    . /etc/sysconfig/oem
fi

if [ "$BOOTUP" != "serial" ]; then
 gprintf "\t\t\tWelcome to %s" "`echo -en '\\033[1;36m'`$SYSTEM`echo -en '\\033[0;39m'` $PRODUCT"
else
 gprintf "\t\t\tWelcome to %s" "$SYSTEM $PRODUCT"
fi
echo -en "\r"
echo

if [ "$PROMPT" != "no" ]; then
 gprintf "\t\tPress 'I' to enter interactive startup."
 echo -en "\r"
 echo
fi
Выводятся приветствия системы и предложение перейти в интерактивный режим работы (для чего надо нажать клавишу <I>).

Листинг 11-11. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 11.

if ! grep -q /dev/pts /proc/mounts; then
    mount -n -t devpts -o mode=620 none /dev/pts
fi
if ! grep -q /dev/shm /proc/mounts; then
    mount -n -t tmpfs  none /dev/shm
fi

# If brltty exist start it
[ -x /bin/brltty ] && action "Starting braille terminal" /bin/brltty
Монтируются псевдо-файловые системы /dev/pts и /dev/shm, и подключается терминал Брайля (если существует файл /bin/brltty).

Листинг 11-12. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 12.


# If user was not fast enough he gets another chance
# before exiting rc.sysinit
kill -TERM `/sbin/pidof getkey` >/dev/null 2>&1
} &
if [ "$PROMPT" != "no" ]; then
   /sbin/getkey i && export CONFIRM=yes
fi
wait
Пара к закрывающей фигурной скобке стояла во фрагменте 10.

Команда wait приводит к тому, что система ждет, пока не закончатся все активные процессы.

Листинг 11-13. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 13.

# Fix console loglevel
if [ -n "$LOGLEVEL" ]; then
	/bin/dmesg -n $LOGLEVEL
fi

initsplash 5
rc_splash start 1
Если переменная LOGLEVEL имеет ненулевую длину, то задается уровень выдачи сообщений на консоль (смотри man dmesg). Команды initsplash и rc_splash непонятны, файлов с такими именами я в системе не нашел, так что остается только гадать, основываясь на названиях - вероятно, это вывод графической заставки.

Листинг 11-14. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 14.

# Configure kernel parameters
action "Configuring kernel parameters: " sysctl -e -p /etc/sysctl.conf

rc_splash kernel
#
ARCH=$(/bin/uname -m)
Команда sysctl используется для изменения параметров ядра в ходе работы. Опция -e означает, что неправильно заданные ключи будут игнорироваться без выдачи сообщений об ошибке, а опция -p служит для указания файла, из которого нужно взять значения параметров (в данном случае - файл /etc/sysctl.conf).

Листинг 11-15. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 15.

# Set the system clock.
ARC=0
SRM=0
UTC=0

if [ -f /etc/sysconfig/clock ]; then
   . /etc/sysconfig/clock

   # convert old style clock config to new values
   if [ "${CLOCKMODE}" = "GMT" ]; then
      UTC=true
   elif [ "${CLOCKMODE}" = "ARC" ]; then
      ARC=true
   fi
fi

CLOCKDEF=""
if [ "$ARCH" = "ppc" ];then
CLOCKFLAGS="$CLOCKFLAGS -s"
else
CLOCKFLAGS="$CLOCKFLAGS --hctosys"
fi

case "$UTC" in
    yes|true)	CLOCKFLAGS="$CLOCKFLAGS --utc"
		CLOCKDEF="$CLOCKDEF (utc)" ;;
    no|false)	CLOCKFLAGS="$CLOCKFLAGS --localtime"
		CLOCKDEF="$CLOCKDEF (localtime)" ;;
esac
case "$ARC" in
    yes|true)	CLOCKFLAGS="$CLOCKFLAGS --arc"
		CLOCKDEF="$CLOCKDEF (arc)" ;;
esac
case "$SRM" in
    yes|true)	CLOCKFLAGS="$CLOCKFLAGS --srm"
		CLOCKDEF="$CLOCKDEF (srm)" ;;
esac

if [ "$ARCH" = "alpha" -a -f /lib/modules/$(uname -r)/modules.dep ];then
[ -x /sbin/hwclock ] && /sbin/hwclock $CLOCKFLAGS
elif [ "$ARCH" != "alpha" ];then
/sbin/hwclock $CLOCKFLAGS
fi

action "Setting clock %s: %s" "$CLOCKDEF" "`date`" /bin/true
Задание временных установок.

Листинг 11-16. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 16.

# Initialize hardware
if [ -f /proc/sys/kernel/modprobe ]; then
   if ! strstr "$cmdline" nomodules && [ -f /proc/modules ] ; then
       sysctl -w kernel.modprobe="/sbin/modprobe" >/dev/null 2>&1
   else
       # We used to set this to NULL, but that causes 'failed to exec' messages"
       sysctl -w kernel.modprobe="/bin/true" >/dev/null 2>&1
   fi
fi
В комментарии утверждается, что начинается инициализация аппаратной части. Но пока что только задается значение переменной kernel.modprobe.

Листинг 11-17. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 17.

touch /dev/.in_sysinit >/dev/null 2>&1

# Set default affinity
if [ -x /bin/taskset ]; then
   if strstr "$cmdline" default_affinity= ; then
     for arg in $cmdline ; do
         if [ "${arg##default_affinity=}" != "${arg}" ]; then
             /bin/taskset -p ${arg##default_affinity=} 1
         fi
     done
   fi
fi

nashpid=$(pidof nash 2>/dev/null)
[ -n "$nashpid" ] && kill $nashpid >/dev/null 2>&1
unset nashpid

Листинг 11-18. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 18.

# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
  [ -x $file ] && $file
done

# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
	/etc/rc.modules
fi
Загрузка модулей, заданных пользователем в /etc/sysconfig/modules/*.modules.

Листинг 11-19. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 19.

# Configure kernel parameters
sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
Повторно переконфигурируем ядро "на ходу" (видимо, потому, что изменили значения параметров и задали подключение каких-то модулей).

Листинг 11-20. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 20.

if [ -x /bin/loadkeys ]; then
 KEYTABLE=
 KEYMAP=
 if [ -f /etc/sysconfig/console/default.kmap ]; then
  KEYMAP=/etc/sysconfig/console/default.kmap
 else
  if [ -f /etc/sysconfig/keyboard ]; then
    . /etc/sysconfig/keyboard
  fi
  if [ -n "$KEYTABLE" -a -d /usr/lib/kbd/keymaps -o -d /lib/kbd/keymaps ]; then
     KEYMAP="$KEYTABLE"
  fi
 fi
 if [ -n "$KEYMAP" ]; then 
  if [ -n "$KEYTABLE" ]; then
    gprintf "Loading default keymap (%s): " $KEYTABLE
  else
    gprintf "Loading default keymap: "
  fi
  LOADKEYS=loadkeys
  if [ "${LANG}" != "${LANG%%.UTF-8}" -o "${LANG}" != "${LANG%%.utf8}" ]; then
  	LOADKEYS="loadkeys -u"
  fi
  $LOADKEYS $KEYMAP < /dev/tty0 > /dev/tty0 2>/dev/null && \
     success "Loading default keymap" || failure "Loading default keymap"
  echo
 fi
fi   
Загружаем раскладку клавиатуры.

Листинг 11-21. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 21.

# Set the hostname.
action "Setting hostname %s: " ${HOSTNAME} hostname ${HOSTNAME}

# Set the NIS domain name
if [ -n "$NISDOMAIN" ]; then
    action "Setting NIS domain name %s: " $NISDOMAIN nisdomainname $NISDOMAIN
fi
Задаем имя компьютера (хоста) и доменное имя.

Листинг 11-22. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 22.

# Initialize ACPI bits
if [ -d /proc/acpi ]; then
    for module in /lib/modules/$unamer/kernel/drivers/acpi/* ; do
        module=${module##*/}
        module=${module%.ko}
        modprobe $module >/dev/null 2>&1
    done
fi

if [ -r /etc/sysconfig/init ]; then
    . /etc/sysconfig/init
fi

needusbstorage=
needfirewirestorage=
if ! strstr "$cmdline" nomodules ; then
    # If you are running 2.6, and you built your own modular mouse/keyboard/disk drivers
    # get them via hotplug. (and if it's your boot keyboard, build them in! :)
    # FIXME: drop 2.4 support
    need24loading=
    [ "${version[0]}" -lt "3" -a "${version[1]}" -lt "6" ] && need24loading=1
    if ! strstr "$cmdline" nousb; then
        if [ -n "$need24loading" ]; then 
        # only needed for 2.4, it's handled by udevstart on 2.6 kernels
            /etc/init.d/usb start
            LC_ALL=C fgrep 'hid' /proc/bus/usb/drivers || action "Initializing USB HID interface: " modprobe hid 2> /dev/null
            action "Initializing USB keyboard: " modprobe keybdev 2> /dev/null
            action "Initializing USB mouse: " modprobe mousedev 2> /dev/null 
        fi
        needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
        [ -n "$needusbstorage" -a -n "$need24loading" ] && modprobe usb-storage >/dev/null 2>&1
    fi
    if ! strstr "$cmdline" nofirewire; then
        if [ -n "$need24loading" ]; then 
            aliases=`/sbin/modprobe -c | awk '/^alias[[:space:]]+ieee1394-controller/ { print $3 }'`
            if [ -n "$aliases" -a "$aliases" != "off" ]; then
                for alias in $aliases ; do 
                    [ "$alias" = "off" ] && continue
                    action "Initializing firewire controller (%s): " $alias modprobe $alias
                done
            fi
        fi
        needfirewirestorage=`LC_ALL=C fgrep -q "SBP2" /proc/bus/ieee1394/devices 2>/dev/null`
        [ -n "$needfirewirestorage" -a -n "$need24loading" ] && modprobe sbp2 >/dev/null 2>&1
    fi
fi

[ -d /proc/bus/usb ] && ! grep -q /proc/bus/usb /proc/mounts && mount -t usbfs -o devmode=0664,devgid=43 none /proc/bus/usb

if [ -f /etc/crypttab ]; then
    s=`gprintf "Starting disk encryption:"`
    echo "$s"
    init_crypto 0 && success "$s" || failure "$s"
    echo
fi
Инициализируется бит ACPI.
Если существует файл /etc/sysconfig/init и для него установлено право на чтение, то выполняются записанные в нем команды. А этот файл содержит команды, определяющие некоторые параметры загрузки.
Затем выполняются какие-то действия по подключению Firewire, USB и шифрование диска. Например, проверяется существует ли /proc/bus/usb и является ли он каталогом. Если этот каталог существует, но не указан в файле /proc/mounts, то монтируется файловая система типа usbfs.

Листинг 11-23. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 23.

# Now that we load only one scsi_hostadapter in the initrd, we
# need to load the others here
modprobe scsi_hostadapter >/dev/null 2>&1

# Device mapper & related initialization
if ! LC_ALL=C fgrep -q "device-mapper" /proc/devices 2>/dev/null ; then
	modprobe dm-mod >/dev/null 2>&1
fi
mkdir -p /dev/mapper >/dev/null 2>&1
mknod /dev/mapper/control c \
	$(awk '/ misc$/ { print $1 }' /proc/devices) \
	$(awk '/ device-mapper$/ { print $1 }' /proc/misc) >/dev/null 2>&1
[ -n "$SELINUX_STATE" ] && restorecon /dev/mapper /dev/mapper/control >/dev/null 2>&1

if [ -c /dev/mapper/control ]; then
        if ! strstr "$cmdline" nompath && [ -f /etc/multipath.conf -a \
			-x /sbin/multipath.static ]; then
		modprobe dm-multipath > /dev/null 2>&1
		/sbin/multipath.static -v 0
		if [ -x /sbin/kpartx ]; then
			/sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -p p"
		fi
	fi
	
	if ! strstr "$cmdline" nodmraid && [ -x /sbin/dmraid ]; then
		modprobe dm-mirror >/dev/null 2>&1
		for x in $(/sbin/dmraid -ay -i -t 2>/dev/null | \
				egrep -iv "^no " | \
				awk -F ':' '{ print $1 }') ; do
			dmname=$(resolve_dm_name $x)
			#[ -z "$dmname" ] && continue
			/sbin/dmraid -ay -i "$x" >/dev/null 2>&1
			if [ -x /sbin/kpartx ]; then
			    /sbin/kpartx -a -p p "/dev/mapper/$dmname"
			fi
		done
	fi
	
	if [ -x /sbin/lvm.static ]; then
		action "Setting up Logical Volume Management:" /sbin/lvm.static vgchange -a y --ignorelockingfailure
	fi
fi
Подключается несколько модулей (scsi_hostadapter, dm-mod и др.), а затем подключаются RAID-массивы и менеджер логических томов.

Листинг 11-24. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 24.

if [ -f /fastboot ] || strstr "$cmdline" fastboot ; then
	fastboot=yes
fi

if [ -f /fsckoptions ]; then
	fsckoptions=`cat /fsckoptions`
fi

Листинг 11-25. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 25.

# (blino) always source autofsck settings, for AUTOFSCK_CRYPTO_TIMEOUT (#16029)
[ -f /etc/sysconfig/autofsck ] && . /etc/sysconfig/autofsck

if [ -f /forcefsck ] || strstr "$cmdline" forcefsck ; then
	fsckoptions="-f $fsckoptions"
elif [ -f /.autofsck ]; then
	if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then
		AUTOFSCK_OPT="$AUTOFSCK_OPT -f"
	fi
	if [ -n "$AUTOFSCK_SINGLEUSER" ]; then
		echo
		gprintf "*** Warning -- the system did not shut down cleanly. \n"
		gprintf "*** Dropping you to a shell; the system will continue\n"
		gprintf "*** when you leave the shell.\n"
		[ -n "$SELINUX_STATE" ] && echo "0" > $selinuxfs/enforce
		sulogin
		[ -n "$SELINUX_STATE" ] && echo "1" > $selinuxfs/enforce
	fi
	fsckoptions="$AUTOFSCK_OPT $fsckoptions"
fi

if [ "$BOOTUP" = "color" ]; then
	fsckoptions="-C $fsckoptions"
else
	fsckoptions="-V $fsckoptions"
fi

READONLY=
if [ -f /etc/sysconfig/readonly-root ]; then
	. /etc/sysconfig/readonly-root
fi
if strstr "$cmdline" readonlyroot ; then
	READONLY=yes
	[ -z "$RW_MOUNT" ] && RW_MOUNT=/var/lib/stateless/writable
	[ -z "$STATE_MOUNT" ] && STATE_MOUNT=/var/lib/stateless/state
fi
if strstr "$cmdline" noreadonlyroot ; then
	READONLY=no
fi

if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

	mount_empty() {
		if [ -e "$1" ]; then
			echo "$1" | cpio -p -vd "$RW_MOUNT" &>/dev/null
			mount -n --bind "$RW_MOUNT$1" "$1"
		fi
	}

	mount_dirs() {
		if [ -e "$1" ]; then
			mkdir -p "$RW_MOUNT$1"
			# fixme: find is bad
			find "$1" -type d -print0 | cpio -p -0vd "$RW_MOUNT" &>/dev/null
			mount -n --bind "$RW_MOUNT$1" "$1"
		fi
	}

	mount_files() {
		if [ -e "$1" ]; then
			cp -a --parents "$1" "$RW_MOUNT"
			mount -n --bind "$RW_MOUNT$1" "$1"
		fi
	}

	# Common mount options for scratch space regardless of 
	# type of backing store
	mountopts=

	# Scan partitions for local scratch storage
	rw_mount_dev=$(blkid -t LABEL="$RW_LABEL" -o device | awk '{ print ; exit }')

	# First try to mount scratch storage from /etc/fstab, then any
	# partition with the proper label.  If either succeeds, be sure
	# to wipe the scratch storage clean.  If both fail, then mount
	# scratch storage via tmpfs.
	if mount $mountopts "$RW_MOUNT" > /dev/null 2>&1 ; then
		rm -rf "$RW_MOUNT" > /dev/null 2>&1
	elif [ x$rw_mount_dev != x ] && mount $rw_mount_dev $mountopts "$RW_MOUNT" > /dev/null 2>&1; then
		rm -rf "$RW_MOUNT"  > /dev/null 2>&1
	else
		mount -n -t tmpfs $mountopts none "$RW_MOUNT"
	fi

	for file in /etc/rwtab /etc/rwtab.d/* ; do
		is_ignored_file "$file" && continue
        	[ -f $file ] && cat $file | while read type path ; do
			case "$type" in
				empty)
					mount_empty $path
					;;
				files)
					mount_files $path
					;;
				dirs)
					mount_dirs $path
					;;
				*)
					;;
			esac
			[ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
		done
	done

	# In theory there should be no more than one network interface active
	# this early in the boot process -- the one we're booting from.
	# Use the network address to set the hostname of the client.  This
	# must be done even if we have local storage.
	ipaddr=
	if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
		ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
		if [ -n "$ipaddr" ]; then
			eval $(ipcalc -h $ipaddr 2>/dev/null)
			hostname ${HOSTNAME}
		fi
	fi
	
	# Clients with read-only root filesystems may be provided with a
	# place where they can place minimal amounts of persistent
	# state.  SSH keys or puppet certificates for example.
	#
	# Ideally we'll use puppet to manage the state directory and to
	# create the bind mounts.  However, until that's all ready this
	# is sufficient to build a working system.

	# First try to mount persistent data from /etc/fstab, then any
	# partition with the proper label, then fallback to NFS
	state_mount_dev=$(blkid -t LABEL="$STATE_LABEL" -o device | awk '{ print ; exit }')
	if mount $mountopts "$STATE_MOUNT" > /dev/null 2>&1 ; then
		/bin/true
	elif [ x$state_mount_dev != x ] && mount $state_mount_dev $mountopts "$STATE_MOUNT" > /dev/null 2>&1;  then
		/bin/true
	elif [ -n "$CLIENTSTATE" ]; then
		# No local storage was found.  Make a final attempt to find 
		# state on an NFS server.

		mount -t nfs $CLIENTSTATE/$HOSTNAME $STATE_MOUNT -o rw,nolock
	fi

	if [ -w "$STATE_MOUNT" ]; then

		mount_state() {
			if [ -e "$1" ]; then
				[ ! -e "$STATE_MOUNT$1" ] && cp -a --parents "$1" "$STATE_MOUNT"
				mount -n --bind "$STATE_MOUNT$1" "$1"
			fi
		}

		for file in /etc/statetab /etc/statetab.d/* ; do
			is_ignored_file "$file" && continue
			[ ! -f "$file" ] && continue

			if [ -f "$STATE_MOUNT/$file" ] ; then
				mount -n --bind "$STATE_MOUNT/$file" "$file"
			fi

			for path in $(grep -v "^#" "$file" 2>/dev/null); do
				mount_state "$path"
				[ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
			done
		done

		if [ -f "$STATE_MOUNT/files" ] ; then
			for path in $(grep -v "^#" "$STATE_MOUNT/files" 2>/dev/null); do
				mount_state "$path"
				[ -n "$SELINUX_STATE" -a -e "$path" ] && restorecon -R "$path"
			done
		fi
	fi
fi
 
if ! [[ " $fsckoptions" =~ " -y" ]]; then
    	fsckoptions="-a $fsckoptions"
fi

Fsck()
{
	fsck $*
	rc=$?
	
	if [ "$rc" -eq "0" ]; then
		echo_success
		echo
	elif [ "$rc" -eq "1" ]; then
	        echo_passed
		echo
	elif [ "$rc" -eq "2" -o "$rc" -eq "3" ]; then 
		gprintf "Unmounting file systems\n"
		umount -a
		mount -n -o remount,ro /
		gprintf "Automatic reboot in progress.\n"
		reboot -f
        fi
	
        # A return of 4 or higher means there were serious problems.
	if [ $rc -gt 1 ]; then
	        if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
		    chvt 1
		fi
		rc_splash verbose
		echo_failure
		echo
		echo
		gprintf "*** An error occurred during the file system check.\n"
		gprintf "*** Dropping you to a shell; the system will reboot\n"
		gprintf "*** when you leave the shell.\n"

                str=`gprintf "(Repair filesystem)"`
		PS1="$str \# # "; export PS1
		[ "$SELINUX_STATE" = "1" ] && disable_selinux
		sulogin

		gprintf "Unmounting file systems\n"
		umount -a
		mount -n -o remount,ro /
		gprintf "Automatic reboot in progress.\n"
		reboot -f
	elif [ "$rc" -eq "1" ]; then
		_RUN_QUOTACHECK=1
	fi
}

_RUN_QUOTACHECK=0
if [ -f /forcequotacheck ] || strstr "$cmdline" forcequotacheck ; then
	_RUN_QUOTACHECK=1
fi
if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then 
	gprintf "Checking root filesystem\n"
	Fsck -T -a $fsckoptions /
fi

rc_splash fsck

# Update quotas if necessary
if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then
	if [ -x /sbin/convertquota ]; then
	    # try to convert old quotas
	    for mountpt in `LC_ALL=C awk '$4 ~ /quota/{print $2}' /etc/mtab` ; do
	        mountpt="$(fstab_decode_str "$mountpt")"
		if [ -f "$mountpt/quota.user" ]; then
		    action "Converting old user quota files: " \
		    /sbin/convertquota -u "$mountpt" && \
			rm -f "$mountpt/quota.user"
		fi
		if [ -f "$mountpt/quota.group" ]; then
		    action "Converting old group quota files: " \
		    /sbin/convertquota -g "$mountpt" && \
			rm -f "$mountpt/quota.group"
		fi
	    done
	fi
	action "Checking local filesystem quotas: " /sbin/quotacheck -aRnug
fi
В этом большом фрагменте производится проверка файловых систем и задание квот.

Листинг 11-26. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 26.

if [ -x /sbin/isapnp -a -f /etc/isapnp.conf -a ! -f /proc/isapnp ]; then
    # check for arguments passed from kernel
    if ! strstr "$cmdline" nopnp ; then
	PNP=yes
    fi
    if [ -n "$PNP" ]; then
	action "Setting up ISA PNP devices: " /sbin/isapnp /etc/isapnp.conf
    else
	action "Skipping ISA PNP configuration at users request: " /bin/true
    fi
fi

Листинг 11-28. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 28.

# Remount the root filesystem read-write.
state=`LC_ALL=C awk '/ \/ / && ($3 !~ /rootfs/) { print $4 }' /proc/mounts`
[ "$state" != "rw" -a "$READONLY" != "yes" ] && \
  action "Remounting root filesystem in read-write mode: " mount -n -o remount,rw /
Корневая файловая система перемонтируется в режиме "чтение-запись".

Листинг 11-29. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 29.

# wait for usb and firewire storage scanning processes to finish
[ -n "$needusbstorage" ] && while ps -eocomm | grep -q usb-stor-scan; do sleep 1; done
[ -n "$needfirewirestorage" ] && while ps -eocomm | grep -q kfwrescan; do sleep 1; done
Если было задано подключение usb- и firewire-устройств, ожидается, пока завершаться процессы сканирования таких устройств.

Листинг 11-30. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 30.

# MiB: Device-Mapper initialization
if [ -f /etc/evms.conf -a -x /sbin/evms_activate ] || [ -f /etc/lvm/lvm.conf -a -x /sbin/lvm2 ]; then
    dm_minor=`awk '$2 == "device-mapper" {print $1}' /proc/misc 2>/dev/null`
    [ -n "$dm_minor" ] || modprobe dm-mod >/dev/null 2>&1
    dm_minor=`awk '$2 == "device-mapper" {print $1}' /proc/misc 2>/dev/null`

    if [ -f /etc/lvm/lvm.conf -a -x /sbin/lvm2 ] && [ -n "$dm_minor" ]; then
	mkdir -p /dev/mapper 2>/dev/null
	mknod /dev/mapper/control c 10 $dm_minor 2>/dev/null
	_vgcmd_2="/sbin/lvm2 vgmknodes"
	_vgcmd_1="/sbin/lvm2 vgchange -a y"
    fi
fi

# MiB: EVMS Startup
if ! strstr "$cmdline" noevms && [ "$NOEVMS" != "yes" -a -f /etc/evms.conf -a -x /sbin/evms_activate ]; then
    [ -f /proc/mdstat ] || modprobe md >/dev/null 2>&1
    action "Starting %s: " EVMS /sbin/evms_activate
fi
# /MiB

Листинг 11-31. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 31.

if [ -n "${_vgcmd_1}" ]; then
    action "Setting up Logical Volume Management:" ${_vgcmd_1} && ${_vgcmd_2}
fi
Установка управления логическими томами.

Листинг 11-32. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 32.

# Clean up SELinux labels
if [ -n "$SELINUX_STATE" ]; then
   restorecon /etc/mtab /etc/ld.so.cache /etc/blkid/blkid.tab /etc/resolv.conf >/dev/null 2>&1
fi

Листинг 11-33. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 33.

[ -x /sbin/hibernate-cleanup.sh ] && /sbin/hibernate-cleanup.sh start

Листинг 11-34. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 34.

# Start up swapping. #we don't do encryted swap now since
# (pixel) it was done between setting keytable and setting hostname
#         but it can't be done before "vgchange -a y", 
#         which can't be done before "vgscan" (which writes to /etc/lvmtab)
#         which can't be done before re-mounting rw /
# Changed by Michel Bouissou on 2004/12/22:
# MiB: As the current version of swapon will take care by itself of
#      encrypted swap partitions specified in fstab with the following
#      syntax: "/dev/hda4 swap swap loop=/dev/loop0,encryption=AES128"
#      we need to check if there are some right now and insert the
#      proper crypto modules if needed.
if egrep -q "[[:space:]]swap[[:space:]].*encryption=" /etc/fstab; then
    modprobe loop 2> /dev/null
    modprobe aes 2> /dev/null
    modprobe cryptoloop 2> /dev/null
fi
# /MiB

# Start up swapping.
if [ "$AUTOSWAP" = "yes" ]; then
	curswap=$(awk '/^\/dev/ { print $1 }' /proc/swaps | while read x; do get_numeric_dev dec $x ; echo -n " "; done)
	swappartitions=`blkid -t TYPE=swap -o device`
	if [ x"$swappartitions" != x ]; then
		for partition in $swappartitions ; do
			[ ! -e $partition ] && continue
			majmin=$(get_numeric_dev dec $partition)
			gprintf "Enabling local swap partitions: \n" swapon $partition
		done
	fi
fi
action "Enabling /etc/fstab swaps: " swapon -a -e

rc_splash swap
Подключение swap.

Листинг 11-35. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 35.

# Clear mtab
(> /etc/mtab) &> /dev/null

# Remove stale backups
rm -f /etc/mtab~ /etc/mtab~~
Очистка файла /etc/mtab.

Листинг 11-36. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 36.

# Enter mounted filesystems into /etc/mtab
mount -f /
mount -f /proc >/dev/null 2>&1
mount -f /sys >/dev/null 2>&1
mount -f /dev/pts >/dev/null 2>&1
mount -f /proc/bus/usb >/dev/null 2>&1
# (pixel) also added /initrd/loopfs for loopback root
mount -f /initrd/loopfs 2>/dev/null

Листинг 11-37. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 37.

# tweak isapnp settings if needed.
if [ -n "$PNP" -a  -f /proc/isapnp -a -x /sbin/sndconfig ]; then
    /sbin/sndconfig --mungepnp >/dev/null 2>&1
fi

Листинг 11-38. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 38.

# Load sound modules if and only if they need persistent DMA buffers
if LC_ALL=C /sbin/modprobe -c | grep -q "^[^#]*options[[:space:]]\+sound[[:space:]].*dmabuf=1" 2>/dev/null ; then
  RETURN=0
  alias=`/sbin/modprobe -c | awk '/^alias sound / { print $3 }'`
  if [ -n "$alias" -a "$alias" != "off" ]; then
      action "Loading sound module (%s): " $alias modprobe sound
  fi
  alias=`/sbin/modprobe -c | awk '/^alias[[:space:]]+sound-slot-0[[:space:]]/ { print $3 }'`
  if [ -n "$alias" -a "$alias" != "off" ]; then
      action "Loading sound module (%s): " $alias modprobe sound-slot-0
  fi
fi

Листинг 11-39. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 39.

# Add raid devices
if grep -q -s '^[[:space:]]*ARRAY[[:space:]]' /etc/mdadm.conf && [ -x /sbin/mdadm ]; then
   [ ! -f /proc/mdstat ] && modprobe md >/dev/null 2>&1
   if [ -f /proc/mdstat ]; then
	gprintf "Starting up RAID devices: "
	/sbin/mdadm -A -s --auto=yes
	if [ $? -gt 0 ]; then
		echo
		gprintf "*** An error occurred during the RAID startup\n"
		gprintf "*** If it is critical the boot process will stop\n"
		gprintf "*** when trying to mount filesystems. Else check\n"
		gprintf "*** /etc/mdadm.conf for obsolete ARRAY entries\n"
	else
		echo OK
	fi
   fi
   # LVM initialization, take 2 (it could be on top of RAID)
   if [ -n "${_vgcmd_1}" ]; then
    action "Setting up Logical Volume Management:" ${_vgcmd_1} && ${_vgcmd_2}
   fi
fi

Листинг 11-40. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 40.

if [ -x /sbin/devlabel ]; then
	/sbin/devlabel restart
fi

_RUN_QUOTACHECK=0
# Check filesystems
# (pixel) do not check loopback files, will be done later (aren't available yet)
if [ -z "$fastboot" ]; then
        gprintf "Checking filesystems\n"
	Fsck -T -R -A -a -t noopts=loop $fsckoptions
fi

Листинг 11-41. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 41.

# Mount all other filesystems (except for network based fileystems)
# Contrary to standard usage, filesystems are NOT unmounted in single
# user mode.
# (pixel) also do not mount loopback and encrypted filesystems
# will be done later
action "Mounting local filesystems: " mount -a -t nodevpts,nonfs,nfs4,smbfs,ncpfs,cifs,gfs,shfs -O no_netdev,noloop,noencrypted

rc_splash mount

[[ -z $AUTOFSCK_CRYPTO_TIMEOUT ]] && AUTOFSCK_CRYPTO_TIMEOUT=15

#Mounting Encrypted filesystem
encrypted_swap=
if [[ ! -f /fastboot ]];then
    encrypted=
    while read -a entry;do
	device=${entry[0]}
	mountpoint=${entry[1]}
	options=${entry[3]}
	type=${entry[2]}
	if [[ $options == *encryption=* || $options == *encrypted* ]];then
	    [[ $options == *noauto* ]] && continue
	    if [[ $type == *swap* ]];then
		encrypted_swap="$encrypted_swap $device"
		continue
	    fi
	    encrypted="$encrypted $mountpoint"
	fi
    done < /etc/fstab
    if [[ -n $encrypted ]];then
	modprobe aes
	modprobe cryptoloop
	rc_splash verbose
	echo "We have discovered Encrypted filesystems, do you want to mount them now ?"
	MSG=`gprintf "Press Y within %%d seconds to mount your encrypted filesystems..."`
	KEYS=`gprintf "yY"`
	if /sbin/getkey -c $AUTOFSCK_CRYPTO_TIMEOUT -m "$MSG" "$KEYS"; then
	    echo -e '\n'
	    for i in ${encrypted};do
		echo -n "${i} "; mount ${i}
	    done
	else
	    echo -e '\n'
	fi
    fi
fi

# (pixel) Check loopback filesystems
if [ ! -f /fastboot ]; then
        modprobe loop
        gprintf "Checking loopback filesystems"
	Fsck -T -R -A -a -t opts=loop $fsckoptions
fi

# Mount loopback
action "Mounting loopback filesystems: " mount -a -O loop

rc_splash i18n

Листинг 11-42. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 42.

# Reset pam_console permissions
rm -rf /var/run/console.lock /var/run/console/*

Листинг 11-43. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 43.

# Copy udev rules created while root was read-only
for __subsys in net block; do
    case $__subsys in
	block )
	    /bin/flock /sys/block /sbin/udev_copy_temp_rules block
	;;
	* )
	    /bin/flock /sys/class/$__subsys /sbin/udev_copy_temp_rules $__subsys
	;;
    esac
done
unset __subsys

Листинг 11-44. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 44.

# at this point everything should be mounted; if the loading
# of the system font failed, try again
if [ "$DELAYED_FONT" = "yes" ]; then
   if [ -x /sbin/setsysfont ]; then
	load_i18_settings
	OUR_CHARSET=${CHARSET=`get_locale_encoding`}
	case "$OUR_CHARSET" in 
	    UTF-8)
		action "Setting default font ($SYSFONT): " /bin/unicode_start $SYSFONT
		# this is done by unicode_start, but apparently
		# "action" filters the output, so it has to be redone
		echo -n -e '\033%G'
		;;
	    *)
		action "Setting default font ($SYSFONT): " /sbin/setsysfont
		;;
	esac
   fi
fi

Листинг 11-45. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 45.

if [ -x /etc/init.d/keytable -a -d /usr/lib/kbd/keymaps ]; then
    /etc/init.d/keytable start
fi

Листинг 11-46. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 46.

# Check to see if a full relabel is needed
if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then 
    if [ -f /.autorelabel ] || strstr "$cmdline" autorelabel ; then
	relabel_selinux
    fi
else
    if [ -d /etc/selinux -a "$READONLY" != "yes" ]; then
        [ -f /.autorelabel ] || touch /.autorelabel
    fi
fi

Листинг 11-47. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 47.

# check remaining quotas other than root
if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then
	if [ -x /sbin/convertquota ]; then
	    # try to convert old quotas
	    for mountpt in `awk '$4 ~ /quota/{print $2}' /etc/mtab` ; do
		if [ -f "$mountpt/quota.user" ]; then
		    action "Converting old user quota files: " \
		    /sbin/convertquota -u $mountpt && \
			rm -f $mountpt/quota.user
		fi
		if [ -f "$mountpt/quota.group" ]; then
		    action "Converting old group quota files: " \
		    /sbin/convertquota -g $mountpt && \
			rm -f $mountpt/quota.group
		fi
	    done
	fi
	action "Checking local filesystem quotas: " /sbin/quotacheck -aRnug
fi

if [ -x /sbin/quotaon ]; then
    action "Turning on user and group quotas for local filesystems: " /sbin/quotaon -aug
fi

Листинг 11-48. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 48.

# Initialize pseudo-random number generator
if [ -f "/var/lib/random-seed" ]; then
	cat /var/lib/random-seed > /dev/urandom
else
	[ "$READONLY" != "yes" ] && touch /var/lib/random-seed
fi
if [ "$READONLY" != "yes" ]; then
	chmod 600 /var/lib/random-seed
	dd if=/dev/urandom of=/var/lib/random-seed count=1 bs=512 2>/dev/null
fi

Листинг 11-49. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 49.

# Use the hardware RNG to seed the entropy pool, if available
#[ -x /sbin/rngd -a -c /dev/hw_random ] && rngd

if [ -f /etc/crypttab ]; then
    s=`gprintf "Starting disk encryption using the RNG:"`
    echo "$s"
    init_crypto 1 && success "$s" || failure "$s"
    echo
fi

Листинг 11-50. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 50.


Листинг 11-51. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 51.

# Configure machine if necessary.
if [ -f /.unconfigured ]; then
    if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
	chvt 1
    fi

    if [ -x /usr/sbin/kbdconfig ]; then
	/usr/sbin/kbdconfig
    fi
    if [ -x /usr/bin/passwd ]; then 
        /usr/bin/passwd root
    fi
    if [ -x /usr/sbin/netconfig ]; then
	/usr/sbin/netconfig
    fi
    if [ -x /usr/sbin/timeconfig ]; then
	/usr/sbin/timeconfig
    fi
    if [ -x /usr/sbin/authconfig ]; then
	/usr/sbin/authconfig --nostart
    fi
    if [ -x /usr/sbin/ntsysv ]; then
	/usr/sbin/ntsysv --level 35
    fi

    # Reread in network configuration data.
    if [ -f /etc/sysconfig/network ]; then
	. /etc/sysconfig/network

	# Reset the hostname.
	action "Resetting hostname %s: " ${HOSTNAME} hostname ${HOSTNAME}

	# Reset the NIS domain name.
	if [ -n "$NISDOMAIN" ]; then
	    action "Resetting NIS domain name %s: " $NISDOMAIN nisdomainname $NISDOMAIN
	fi
    fi

    rm -f /.unconfigured

    if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client --ping ; then
	chvt 8
    fi
fi

Листинг 11-52. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 52.

# Clean out /.
rm -f /fastboot /fsckoptions /forcefsck /.autofsck /forcequotacheck /halt \
	/poweroff /etc/killpower &> /dev/null

# Do we need (w|u)tmpx files? We don't set them up, but the sysadmin might...
_NEED_XFILES=
[ -f /var/run/utmpx -o -f /var/log/wtmpx ] && _NEED_XFILES=1

# Clean up /var.  I'd use find, but /usr may not be mounted.
for afile in /var/lock/* /var/run/* ; do
	if [ -d "$afile" ]; then
	    case "$afile" in
		*/news|*/mon)	;;
		*/sudo)		rm -f $afile/*/* ;;
		*/xdmctl)	rm -rf $afile/*/* ;;
		*/vmware)	rm -rf $afile/*/* ;;
		*/samba)	rm -rf $afile/*/* ;;
		*/screen)	rm -rf $afile/* ;;
		*/cvs)		rm -rf $afile/* ;;
		*/dovecot)	rm -f $afile/*/* ;;
		*/cups)		rm -f $afile/*/* ;;
		*/resolvconf)   find $afile -type f -exec rm {} \; ;;
		*)		rm -f $afile/* ;;
	    esac
	else
      [ "$afile" = "/var/lock/TMP_1ST" ] && continue
	   rm -f $afile
	fi
done
rm -f /var/lib/rpm/__db* &> /dev/null
rm -f /var/gdm/.gdmfifo &> /dev/null

# Reset pam_console permissions
[ -x /sbin/pam_console_apply ] && /sbin/pam_console_apply -r

{
# Clean up utmp/wtmp
> /var/run/utmp
touch /var/log/wtmp
chgrp utmp /var/run/utmp /var/log/wtmp
chmod 0664 /var/run/utmp /var/log/wtmp
if [ -n "$_NEED_XFILES" ]; then
  > /var/run/utmpx
  touch /var/log/wtmpx
  chgrp utmp /var/run/utmpx /var/log/wtmpx
  chmod 0664 /var/run/utmpx /var/log/wtmpx
fi

# Clean up various /tmp bits
[ -n "$SELINUX_STATE" ] && restorecon /tmp
rm -f /tmp/.X*-lock /tmp/.lock.* /tmp/.gdm_socket /tmp/.s.PGSQL.*
rm -rf /tmp/.X*-unix /tmp/.ICE-unix /tmp/.font-unix /tmp/hsperfdata_* \
       /tmp/kde-* /tmp/ksocket-* /tmp/mc-* /tmp/mcop-* /tmp/orbit-*  \
       /tmp/scrollkeeper-*  /tmp/ssh-* \
       /dev/.in_sysinit
# Make ICE directory
mkdir -m 1777 -p /tmp/.ICE-unix >/dev/null 2>&1
chown root:root /tmp/.ICE-unix
[ -n "$SELINUX_STATE" ] && restorecon /tmp/.ICE-unix >/dev/null 2>&1

#if [ -x /etc/init.d/diskdump ]; then
#	/etc/init.d/diskdump swapsavecore
#fi

# Set up binfmt_misc
/bin/mount -t binfmt_misc none /proc/sys/fs/binfmt_misc > /dev/null 2>&1

# Clean ICE locks
mkdir -p /tmp/.ICE-unix
chown root:root /tmp/.ICE-unix
rm -rf /tmp/.ICE-unix/*
chmod a+rwx,+t /tmp/.ICE-unix

# Delete Postgres sockets
rm -f /tmp/.s.PGSQL.*

# GNOME and KDE related cleanup
rm -rf /tmp/.fam_socket /tmp/.esd /tmp/.sawfish-* /tmp/esrv* /tmp/kio*

# clean dynamic stuff
for f in /var/lib/gnome/desktop/dynamic_*.desktop /usr/share/apps/kdesktop/Desktop/dynamic_*.desktop; do
    if [ -r $f ]; then
	device=`sed -n 's/# dynamic_device=//p' $f`
	if [ -n "$device" -a ! -e "$device" ]; then
	    rm -f $f
	fi
    fi
done

# openssh related cleanup
rm -rf /tmp/ssh-*

Листинг 11-53. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 53.

#Detect and create/activate encrypted swap
#Changed by Michel Bouissou on 2004/12/22
if [[ -n $encrypted_swap ]];then
    loop=NONE
    modprobe loop 2> /dev/null
    modprobe aes 2> /dev/null
    modprobe cryptoloop 2> /dev/null
    # MiB: Wait for a loop device to become available in case devfsd needs
    #      to create it
    for (( s = 1; s <= 10; s++ )); do
        [ -b /dev/loop0 ] && { loop=OK; break; }
        sleep 1
    done
    if [ $loop == OK ]; then
        for swdev in ${encrypted_swap}; do
            # MiB: as the current version of swapon takes care by itself of encrypted
            #      partitions specified in fstab with "loop=/dev/loop0,encryption=AES128"
            #      we *MUST* leave these alone as they have probably been activated earlier,
            #      otherwise we would result in having them mounted on 2 different loop
            #      devices with different encryption keys, and we would activate both,
            #      resulting in serious swap corruption.
            egrep -q "^${swdev}[[:space:]]+(swap|none)[[:space:]]+swap[[:space:]]+.*encryption=" /etc/fstab && continue

            loop=NONE
            for l in `echo /dev/loop[0-7]`; do
                if [ $loop == NONE ] && ! grep -q $l /proc/mounts && ! { losetup $l &> /dev/null; }; then
                    loop=$l
                fi
            done
            if [ $loop != NONE ]; then
                action "Found available loop device %s." $loop /bin/true
                swapoff $swdev > /dev/null 2>&1
                # MiB: losetup the swap device with an offset of 4096 to preserve
                #      existing (unencrypted) swap space signature
                dd if=$swdev bs=1024 skip=8 count=40 2>/dev/null |\
                mcookie -f /dev/stdin | losetup -o 4096 -p 0 -e AES128 $loop $swdev > /dev/null 2>&1
                if [ $? == 0 ]; then
                    action "Mounting %s on encrypted %s with random key" $swdev $loop /bin/true
                    dd if=/dev/zero of=$loop bs=1024 count=40 > /dev/null 2>&1
                    action "Creating encrypted swap on %s using %s:" $swdev $loop mkswap $loop
                    if [ $? == 0 ]; then
                       action "Activating encrypted swap on %s using %s:" $swdev $loop swapon -p 0 $loop
                    fi
                else
                    action "Mounting %s on encrypted %s with random key" $swdev $loop /bin/false
                fi
            else
                action "Could not find any available loop device!" /bin/false
            fi
        done
    fi
fi

Листинг 11-54. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 54.

# Now turn on swap in case we swap to files.
action "Enabling swap space: " swapon -a -e

Листинг 11-55. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 55.

# Initialize the serial ports.
if [ -f /etc/rc.serial ]; then
	. /etc/rc.serial
fi

Листинг 11-56. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 56.

# If they asked for ide-scsi, load it
# This must come before hdparm call because if hdd=ide-scsi
# /dev/hdd is inaccessible until ide-scsi is loaded
if ! strstr "$cmdline" no-ide-cd; then
    modprobe ide-cd >/dev/null 2>&1
fi
if strstr "$cmdline" ide-scsi; then
	modprobe ide-scsi >/dev/null 2>&1
fi

# If a SCSI tape has been detected, load the st module unconditionally
# since many SCSI tapes don't deal well with st being loaded and unloaded
if [ -n "$USEMODULES" -a -f /proc/scsi/scsi ] && LC_ALL=C grep -q 'Type:   Sequential-Access' /proc/scsi/scsi 2>/dev/null ; then
    LC_ALL=C fgrep -q ' 9 st' /proc/devices || modprobe st >/dev/null 2>&1
fi

Листинг 11-57. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 57.

# Turn on harddisk optimization
# There is only one file /etc/sysconfig/harddisks for all disks
# after installing the hdparm-RPM. If you need different hdparm parameters
# for each of your disks, copy /etc/sysconfig/harddisks to
# /etc/sysconfig/harddiskhda (hdb, hdc...) and modify it.
# Each disk which has no special parameters will use the defaults.
# Each non-disk which has no special parameters will be ignored.
# 
 
disk[0]=s;
disk[1]=hda;  disk[2]=hdb;  disk[3]=hdc;  disk[4]=hdd;
disk[5]=hde;  disk[6]=hdf;  disk[7]=hdg;  disk[8]=hdh;
disk[9]=hdi;  disk[10]=hdj; disk[11]=hdk; disk[12]=hdl;
disk[13]=hdm; disk[14]=hdn; disk[15]=hdo; disk[16]=hdp;
disk[17]=hdq; disk[18]=hdr; disk[19]=hds; disk[20]=hdt;
 
 
# Skip hard disks optimization if software RAID arrays are currently
# resyncing and disks heavily active, because hdparm might hang and
# lock system startup in such situation

if [ ! -f /proc/mdstat ] || ! /bin/egrep -qi "re(cover|sync)|syncing" /proc/mdstat; then
   if [ -x /sbin/hdparm ]; then
      for device in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
	   unset MULTIPLE_IO USE_DMA EIDE_32BIT LOOKAHEAD EXTRA_PARAMS
           if [ -f /etc/sysconfig/harddisk${disk[$device]} ]; then
                   . /etc/sysconfig/harddisk${disk[$device]}
                   HDFLAGS[$device]=
                   if [ -n "$MULTIPLE_IO" ]; then
                       HDFLAGS[$device]="-q -m$MULTIPLE_IO"
                   fi
                   if [ -n "$USE_DMA" ]; then
                       HDFLAGS[$device]="${HDFLAGS[$device]} -q -d$USE_DMA"
                   fi
                   if [ -n "$EIDE_32BIT" ]; then
                       HDFLAGS[$device]="${HDFLAGS[$device]} -q -c$EIDE_32BIT"
                   fi
                   if [ -n "$LOOKAHEAD" ]; then
                       HDFLAGS[$device]="${HDFLAGS[$device]} -q -A$LOOKAHEAD"
                   fi
                   if [ -n "$EXTRA_PARAMS" ]; then
                       HDFLAGS[$device]="${HDFLAGS[$device]} $EXTRA_PARAMS"
                   fi
           else
                   HDFLAGS[$device]="${HDFLAGS[0]}"
           fi
           if [ -e "/proc/ide/${disk[$device]}/media" ]; then
                hdmedia=`cat /proc/ide/${disk[$device]}/media`
                if [ "$hdmedia" = "disk" -o -f "/etc/sysconfig/harddisk${disk[$device]}" ]; then
                     if [ -n "${HDFLAGS[$device]}" ]; then
                         sleep 2
                         action "Setting hard drive parameters for %s: " ${disk[$device]}  /sbin/hdparm ${HDFLAGS[$device]} /dev/${disk[$device]}
                     fi
                fi
           fi
      done
   fi
else
    action "RAID Arrays are resyncing. Skipping hard drive parameters section." /bin/true
fi

Листинг 11-58. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 58.

# Adjust symlinks as necessary in /boot to keep system services from
# spewing messages about mismatched System maps and so on.
if [ -L /boot/System.map -a -r /boot/System.map-`uname -r` -a \
	! /boot/System.map -ef /boot/System.map-`uname -r` ] ; then
	ln -s -f System.map-`uname -r` /boot/System.map 2>/dev/null
fi
if [ ! -e /boot/System.map -a -r /boot/System.map-`uname -r` ] ; then
	ln -s -f System.map-`uname -r` /boot/System.map 2>/dev/null
fi

# Adjust symlinks as necessary in /boot to have the default config
if [ -L /boot/config -a -r /boot/config-`uname -r` ] ; then
	ln -sf config-`uname -r` /boot/config 2>/dev/null
fi
if [ ! -e /boot/config -a -r /boot/config-`uname -r` ] ; then
	ln -sf config-`uname -r` /boot/config 2>/dev/null
fi

Листинг 11-59. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 59.

# Now that we have all of our basic modules loaded and the kernel going,
# let's dump the syslog ring somewhere so we can find it later
dmesg -s 131072 > /var/log/dmesg
Содержимое кольцевого буфера ядра выгружается в файл /var/log/dmesg.

Листинг 11-60. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 60.

# create the crash indicator flag to warn on crashes, offer fsck with timeout
touch /.autofsck &> /dev/null

Листинг 11-61. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 61.

if [ "$PROMPT" != no ]; then
    while :; do
	pid=$(/sbin/pidof getkey)
	[ -n "$pid" -o -e /var/run/getkey_done ] && break
	usleep 100000
    done
    [ -n "$pid" ] && kill -TERM "$pid" >/dev/null 2>&1
fi
} &
if strstr "$cmdline" confirm ; then
	touch /var/run/confirm
fi
if [ "$PROMPT" != "no" ]; then
	/sbin/getkey i && touch /var/run/confirm
	touch /var/run/getkey_done
fi
wait
[ "$PROMPT" != no ] && rm -f /var/run/getkey_done

if strstr "$cmdline" failsafe; then
    touch /var/run/failsafe
fi

if [ -f /var/lock/TMP_1ST ];then
 if [ -f /etc/init.d/mandrake_firstime ];then
	/bin/sh /etc/init.d/mandrake_firstime
 fi
fi

if [ -f /etc/init.d/mandrake_everytime ]; then 
	/bin/sh /etc/init.d/mandrake_everytime
fi

Листинг 11-62. Файл /etc/rc.d/rc.sysinit системы Mandriva Free 2007 Spring. Часть 62.

# (pixel) a kind of profile for XF86Config
# if no XFree=XXX given on kernel command-line, restore XF86Config.standard
for i in XF86Config XF86Config-4; do 
    if [ -L "/etc/X11/$i" ]; then
        XFree=`sed -n 's/.*XFree=\(\w*\).*/\1/p' /proc/cmdline`
        [ -n "$XFree" ] || XFree=standard
        [ -r "/etc/X11/$i.$XFree" ] && ln -sf "$i.$XFree" "/etc/X11/$i"
    fi
done
Вернуться к разделу 6 Оглавление


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют