CentOS6のrc.sysinitスクリプトの処理内容の概要

CentOS6のrc.sysinitスクリプト(/etc/rc.d/rc.sysinit)はOS起動時に実行され、以下のような処理を行います。
・環境パスの設定
・スワッピングの開始
・ファイルシステムのチェック
・システムの初期化に必要とされるすべてのステップを実行。
 
CentOS6の起動処理を把握するため、rc.sysinitスクリプトの中身を見て具体的などのような処理を行っているのか確認し、メモ書きしています。

※目次をクリックすると目次の下部にコンテンツが表示されます。

ホスト名設定、ネットワーク設定・functions読み込み、proc・sysなどのマウント、plymauthの設定
●ホストネームの設定
 

HOSTNAME=$(/bin/hostname)
・・・
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
  HOSTNAME=localhost
fi
:
:
# Set the hostname.
update_boot_stage RChostname
action $"Setting hostname ${HOSTNAME}: " hostname ${HOSTNAME}
[ -n "${NISDOMAIN}" ] && domainname ${NISDOMAIN}

 
〇update_boot_stage
・/etc/rc.d/init.d/functionsに定義されている。

# Inform the graphical boot of our current state
update_boot_stage() {
  if [ -x /bin/plymouth ]; then
      /bin/plymouth --update="$1"
  fi
  return 0
}

 
〇action
・/etc/rc.d/init.d/functionsに定義されている。

# Run some action. Log its output.
action() {
  local STRING rc

  STRING=$1
  echo -n "$STRING "
  shift
  "$@" && success $"$STRING" || failure $"$STRING"
  rc=$?
  echo
  return $rc
}

 
●ネットワーク設定・functions読み込み
 

if [ -f /etc/sysconfig/network ]; then
  . /etc/sysconfig/network
fi
・・・
. /etc/init.d/functions

 
〇/etc/init.d/functions
・シェルスクリプト用の共通関数を定義している。
 
●/procと/sysのマウント
 

if [ ! -e /proc/mounts ]; then
  mount -n -t proc /proc /proc
  mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi

 
〇mountコマンド
mount -t type device dir
 
●usbのマウント
 

if [ ! -d /proc/bus/usb ]; then
  modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
  mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi

 
〇modprobe usbcore
・usbcoreというモジュールをカーネルに組み込む
 
●plymauthの設定
 

PLYMOUTH=[ -x /bin/plymouth ] && PLYMOUTH=yes

 
〇plymouth
・グラフィカルなブート・ロガーシステム。
・plymouthという名前のRPMパッケージとして導入されている。
・詳細はmanやREADEME(/usr/share/doc/plymouth-0.8.3/README)参照。

SELINUXの状態チェック
# Check SELinux status
SELINUX_STATE=
if [ -e "/selinux/enforce" ] && [ "$(cat /proc/self/attr/current)" != "kernel" ]; then
  if [ -r "/selinux/enforce" ] ; then
    SELINUX_STATE=$(cat "/selinux/enforce")
  else
    # assume enforcing if you can't read it
    SELINUX_STATE=1
  fi
fi

if [ -n "$SELINUX_STATE" -a -x /sbin/restorecon ] && __fgrep " /dev " /proc/mounts >/dev/null 2>&1 ; then
  /sbin/restorecon -R -F /dev 2>/dev/null
fi

テキストバナー(OS情報)の表示、cmdline変数の設定
●テキストバナー(OS情報)の表示
 

read -r system_release < /etc/system-release
if [[ "$system_release" == *"Red Hat"* ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m"
 echo -en "Red Hat"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/Red Hat \(.*\) release.*/\1/" /etc/system-release)
 echo " $PRODUCT"
elif [[ "$system_release" == *Fedora* ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;34m"
 echo -en "Fedora"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/Fedora \(.*\) \?release.*/\1/" /etc/system-release)
 echo " $PRODUCT"
elif [[ "$system_release" =~ "CentOS" ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;36m"
 echo -en "CentOS"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/CentOS \(.*\) \?release.*/\1/" /etc/system-release)
 echo " $PRODUCT"
else
 PRODUCT=$(sed "s/ release.*//g" /etc/system-release)
 echo "$PRODUCT"
fi

 
※/etc/system-releaseの設定例
CentOS release 6.2 (Final)
 
●cmdline変数の設定
 

cmdline=$(cat /proc/cmdline)

 
〇/proc/cmdline
・ブート時(起動時)に Linuxカーネルに渡された引き数(システムのブートパラメータ)のようです。

ハードウェアの初期化
# 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

 
※/proc/sys/kernel/modprobeの設定例
/sbin/modprobe
 
〇strstr
・/etc/rc.d/init.d/functionsに定義されている。

# returns OK if $1 contains $2
strstr() {
  [ "${1#*$2*}" = "$1" ] && return 1
  return 0
}

※$[変数#パターン]
・パターン照合演算子
・変数の最初の部分とパターンを比較し、一致した最小部分を削除し残りを返す。
 
〇sysctl -w kernel.modprobe="/sbin/modprobe"
・カーネルパラメータのセッティング

デフォルトのアフィニティの設定、nashの処理
●デフォルトのアフィニティの設定
 

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

 
〇tasksetコマンド
・CPUアフィニティを設定
 
●nashの処理
 

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

udevによる/devの初期化
/sbin/start_udev

 
〇udev
・udevというRPMパッケージで提供。
・udev(userspace device management)とは、カーネルがパソコンへの接続を検出したデバイスに対して、動的に「デバイス・ファイル」を作成して割り当てるための仕組み。
※参考サイト
http://itpro.nikkeibp.co.jp/article/Keyword/20090703/333190/
・詳細はmanやREADME(/usr/share/doc/udev-147/README)を参照。

モジュールのロード
●他のユーザ定義のモジュールロード
 

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

 
●モジュールのロード
 

# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
  /etc/rc.modules
fi

 
●scsi_wait_scan
 

# Sync waiting for storage.
{ rmmod scsi_wait_scan ; modprobe scsi_wait_scan ; rmmod scsi_wait_scan ; } >/dev/null 2>&1

擬似端末のマウント
mount -n /dev/pts >/dev/null 2>&1
[ -n "$SELINUX_STATE" ] && restorecon -F /dev/pts >/dev/null 2>&1

 
〇pts
pts - スペシャルファイル (デバイス)の説明 - Linux コマンド集 一覧表

カーネルパラメータの設定
# Configure kernel parameters
update_boot_stage RCkernelparam
apply_sysctl

 
〇update_boot_stage
・/etc/rc.d/init.d/functionsに定義されている。

# Inform the graphical boot of our current state
update_boot_stage() {
  if [ -x /bin/plymouth ]; then
      /bin/plymouth --update="$1"
  fi
  return 0
}

 
〇apply_sysctl
・/etc/rc.d/init.d/functionsに定義されている。

# Apply sysctl settings, including files in /etc/sysctl.d
apply_sysctl() {
  sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
  for file in /etc/sysctl.d/* ; do
    is_ignored_file "$file" && continue
    test -f "$file" && sysctl -e -p "$file" >/dev/null 2>&1
  done
}

※sysctl -e -p /etc/sysctl.conf
・/etc/sysctl.confを基にカーネルパラメータを設定
・sysctlコマンドの詳細については以下の記事参照。
sysctlコマンドでカーネルパラメータの参照、変更

Device mapperの初期化
# Device mapper & related initialization
if ! __fgrep "device-mapper" /proc/devices >/dev/null 2>&1 ; then
  modprobe dm-mod >/dev/null 2>&1
fi

 
〇__fgrep
・/etc/rc.d/init.d/functionsに定義されている。

__fgrep() {
  s=$1
  f=$2
  while read line; do
    if strstr "$line" "$s"; then
      echo $line
      return 0
    fi
  done < $f
  return 1
}

・/proc/devicesのファイルを一行ずつ読み込み、"device-mapper"の文字列が含まれていなければ"modprobe dm-mod"を実行。
 
〇strstr
・/etc/rc.d/init.d/functionsに定義されている。

# returns OK if $1 contains $2
strstr() {
  [ "${1#*$2*}" = "$1" ] && return 1
  return 0
}

暗号化ブロックデバイス
if [ -f /etc/crypttab ]; then
  init_crypto 0
fi

 
〇init_crypto
・/etc/rc.d/init.d/functionsに定義されている。

# 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() {
    :
  while read dst src key opt; do
      :
  done < /etc/crypttab
  return $ret
}

・かなり長いので処理で、/etc/crypttabを一行ずつ読み込んで処理している。
・詳細は未確認。

multipath、dmraid
●マルチパスの設定
 

if ! strstr "$cmdline" nompath && [ -f /etc/multipath.conf -a \
                -x /sbin/multipath ]; then
  modprobe dm-multipath > /dev/null 2>&1
  /sbin/multipath -v 0
  if [ -x /sbin/kpartx ]; then
    /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -p p" >/dev/null
  fi
fi

 
●dmraidの設定
 

if ! strstr "$cmdline" nodmraid && [ -x /sbin/dmraid ]; then
  modprobe dm-mirror >/dev/null 2>&1
  dmraidsets=$(LC_ALL=C /sbin/dmraid -s -c -i)
  if [ "$?" = "0" ]; then
    for dmname in $dmraidsets; do
      if [[ "$dmname" == isw_* ]] && \
         ! strstr "$cmdline" noiswmd; then
        continue
      fi
      /sbin/dmraid -ay -i --rm_partitions -p "$dmname" >/dev/null 2>&1
      /sbin/kpartx -a -p p "/dev/mapper/$dmname"
    done
  fi
fi

ソフトウェアRAIDの設定
# Start any MD RAID arrays that haven't been started yet
[ -r /proc/mdstat -a -r /dev/md/md-device-map ] && /sbin/mdadm -IRs

〇/proc/mdstatの例

Personalities :
unused devices: 

 
〇MD RAIDについて
・LinuxのソフトウェアRAIDは、MD(Multiple Devices)デバイスドライバとして実装されている。
 
〇/sbin/mdadm
・mdadmという名前のRPMパッケージで提供されている。
・mdadmは、Linuxのmdデバイス(ソフトウェアRAID)を管理するプログラム。
・詳細はmanを参照。

LVM(logical volume manager)の設定
if [ -x /sbin/lvm ]; then
  action $"Setting up Logical Volume Management:" /sbin/lvm vgchange -a y --sysinit
fi

〇lvmの構文
lvm [コマンド|ファイル]
・LVM2用のコマンドラインツール
 
〇vgchangeの構文
vgchange オプション VolumeGroupName
・ボリュームグループの特性を変更する。
・-a y(--available y)オプション
ボリュームグループの論理ボリュームの可用性を制御するかどうか。yなので制御する。
・--sysinitオプション
起動時は、書込みファイルシステムが利用可能になっていない事があるのでこのオプションが使われるようです。
・ここでは、コマンドの引数にVolumeGroupNameが指定されていないのですべてのボリュームグループが対象となる。

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

 
●_RUN_QUOTACHECK
 

_RUN_QUOTACHECK=0
if [ -f /forcequotacheck ] || strstr "$cmdline" forcequotacheck ; then
  _RUN_QUOTACHECK=1
fi

マウント、readonly
●readonlyroot

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

 
〇/etc/sysconfig/readonly-rootの例

# Set to 'yes' to mount the system filesystems read-only.
READONLY=no

# Set to 'yes' to mount various temporary state as either tmpfs
# or on the block device labelled RW_LABEL. Implied by READONLY
TEMPORARY_STATE=no

# Place to put a tmpfs for temporary scratch writable space
RW_MOUNT=/var/lib/stateless/writable

# Label on local filesystem which can be used for temporary scratch space
RW_LABEL=stateless-rw

# Options to use for temporary mount
RW_OPTIONS=

# Label for partition with persistent data
STATE_LABEL=stateless-state

# Where to mount to the persistent data
STATE_MOUNT=/var/lib/stateless/state

# Options to use for peristent mount
STATE_OPTIONS=

 
●blkid
 
下記条件分岐で真の場合についての設定。
if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

# 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" -l -o device)

 
〇blkid
ブロックデバイスの属性を見つけて表示する。
・-t LABEL="$RW_LABEL"
 LABELが"$RW_LABEL"という名前のトークンを持つブロックデバイスを検索し、見つかったすべてのデバイスを表示する。
・-l
 -t オプションを使って指定された検索パラメータにマッチするデバイスをルックアップする。
・-o device
 デバイス名のみ表示する。
 
●RW_MOUNT
 

# 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 $RW_OPTIONS $mountopts none "$RW_MOUNT"
fi

 
●/etc/rwtabの設定内容に従ってマウント
 
下記条件分岐で真の場合についての設定。
if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then
・/etc/rwtabのファイルを読み込み、dirs,empty,filesのタイプに応じてマウント。

for file in /etc/rwtab /etc/rwtab.d/* /dev/.initramfs/rwtab ; 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

 
〇/etc/rwtabの例

$ more /etc/rwtab
dirs    /var/cache/man
dirs    /var/gdm
dirs    /var/lib/xkb
dirs    /var/lock
dirs    /var/log
dirs    /var/run
dirs    /var/puppet
dirs    /var/lib/dbus
dirs    /var/lib/nfs

empty   /tmp
empty   /var/cache/foomatic
empty   /var/cache/hald
empty   /var/cache/logwatch
empty   /var/cache/mod_ssl
empty   /var/cache/mod_proxy
empty   /var/cache/php-pear
empty   /var/cache/systemtap
empty   /var/db/nscd
empty   /var/lib/dav
empty   /var/lib/dhcp
empty   /var/lib/dhclient
empty   /var/lib/php
empty   /var/lib/pulse
empty   /var/lib/ups
empty   /var/tmp
empty   /var/tux
empty   /media

files   /etc/adjtime
files   /etc/ntp.conf
files   /etc/resolv.conf
files   /etc/lvm/.cache
files   /etc/lvm/archive
files   /etc/lvm/backup
files   /var/account
files   /var/arpwatch
files   /var/cache/alchemist
files   /var/lib/gdm
files   /var/lib/iscsi
files   /var/lib/logrotate.status
files   /var/lib/ntp
files   /var/lib/xen
files   /var/lib/xend
files   /var/empty/sshd/etc/localtime
files   /var/lib/random-seed
files   /var/spool

 
〇is_ignored_file()
・/etc/rc.d/init.d/functionsに定義。

# Check whether file $1 is a backup or rpm-generated file and should be ignored
is_ignored_file() {
  case "$1" in
    *~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave)
      return 0
      ;;
  esac
  return 1
}

 
〇mount_empty()、mount_dirs()、mount_files()

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"
    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
}

 
●initramfs
 
下記条件分岐で真の場合についての設定。
if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

# Use any state passed by initramfs
[ -d /dev/.initramfs/state ] && cp -a /dev/.initramfs/state/* $RW_MOUNT

 
●ホスト名に対応するIPアドレスを設定
 
下記条件分岐で真の場合についての設定。
if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

# 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.0.0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
  for ip in $ipaddr ; do
    HOSTNAME=
    eval $(ipcalc -h $ip 2>/dev/null)
    [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
  done
fi

 
〇ip addr show to 0.0.0.0/0 scope global
・ルーティングやデバイスなどのネットワーク情報を表示
 
〇ipcalc -h IPアドレス
・与えられたIPアドレスからホスト名を表示する。
 
●STATE_MOUNT(1)
 
下記条件分岐で真の場合についての設定。
if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

# 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" -l -o device)

if mount $mountopts $STATE_OPTIONS "$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 [ ! -z "$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

 
〇blkid -t LABEL="$STATE_LABEL" -l -o device
-t LABEL="$STATE_LABEL"で指定したブロックデバイスのデバイス名(-oで出力するフォーマットを指定)を表示する。
 
〇mount $mountopts $STATE_OPTIONS "$STATE_MOUNT"
構文
mount オプション デバイス ディレクトリ
 
〇$STATE_MOUNT
STATE_MOUNT=/var/lib/stateless/state
 
●STATE_MOUNT(2)
 
下記条件分岐で真の場合についての設定。
if [ "$READONLY" = "yes" -o "$TEMPORARY_STATE" = "yes" ]; then

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

 
〇is_ignored_file()
・/etc/rc.d/init.d/functionsに定義。

is_ignored_file() {
  case "$1" in
    *~ | *.bak | *.orig | *.rpmnew | *.rpmorig | *.rpmsave)
      return 0
      ;;
  esac
  return 1
}

 
〇mount --bind olddir newdir
・リマウントする。
 
〇restorecon -R
・デフォルトのSELinuxセキュリティコンテキストをリストアする。
・ファイルとディレクトリのファイルラベルを再帰的に変更する。

ファイルシステムチェック、fastboot
if [ -f /fastboot ] || strstr "$cmdline" fastboot ; then
  fastboot=yes
fi

if [ -f /fsckoptions ]; then
  fsckoptions=$(cat /fsckoptions)
fi

if [ "$BOOTUP" = "color" ]; then
  fsckoptions="-C $fsckoptions"
else
  fsckoptions="-V $fsckoptions"
fi
 :
 :
if [[ " $fsckoptions" != *" -y"* ]]; then
  fsckoptions="-a $fsckoptions"
fi

 

if [ -z "$fastboot" -a "$READONLY" != "yes" ]; then
  STRING=$"Checking filesystems"
  echo $STRING
  fsck -T -t noopts=_netdev -A $fsckoptions
  rc=$?
  
  if [ "$rc" -eq "0" ]; then
    success "$STRING"
    echo
  elif [ "$rc" -eq "1" ]; then
    passed "$STRING"
    echo
  elif [ "$rc" -eq "2" -o "$rc" -eq "3" ]; then
    echo $"Unmounting file systems"
    umount -a
    mount -n -o remount,ro /
    echo $"Automatic reboot in progress."
    reboot -f
  fi

# A return of 4 or higher means there were serious problems.

  if [ $rc -gt 1 ]; then
    [ -n "$PLYMOUTH" ] && plymouth --hide-splash

    failure "$STRING"
    echo
    echo
    echo $"*** An error occurred during the file system check."
    echo $"*** Dropping you to a shell; the system will reboot"
    echo $"*** when you leave the shell."

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

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

 
●fsck
fsck オプション -t ファイルシステムタイプ ファイルシステム
・ファイルシステムをチェック、リペアする。
・オプション
-T
 起動時にタイトルを表示しない。
-A
 /etc/fstab内のファイルシステムをすべてチェック
-t
 チェックするファイルシステムのタイプを指定。
・リターン値
 0 - No errors
 1 - File system errors corrected
 2 - System should be rebooted
 4 - File system errors left uncorrected
 8 - Operational error
 16 - Usage or syntax error
 32 - Fsck canceled by user request
 128 - Shared library error

リマウント
# Remount the root filesystem read-write.
update_boot_stage RCmountfs
if remount_needed ; then
  action $"Remounting root filesystem in read-write mode: " mount -n -o remount,rw /
fi

remount_needed() {
  local state oldifs
  [ "$READONLY" = "yes" ] && return 1
  state=$(LC_ALL=C awk '/ \/ / && ($3 !~ /rootfs/) { print $4 }' /proc/mounts)
  oldifs=$IFS
  IFS=","
  for opt in $state ; do
    if [ "$opt" = "rw" ]; then
      IFS=$oldifs
      return 1
    fi
  done
  IFS=$oldifs
  return 0
}

〇update_boot_stage
・/etc/rc.d/init.d/functionsに定義。

update_boot_stage() {
  if [ -x /bin/plymouth ]; then
    /bin/plymouth --update="$1"
  fi
  return 0
}

SELinuxの設定をリストア
●SELinuxの設定をリストア
 

# 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

# If relabeling, relabel mount points.
if [ -n "$SELINUX_STATE" -a "$READONLY" != "yes" ]; then
  if [ -f /.autorelabel ] || strstr "$cmdline" autorelabel ; then
    restorecon $(awk '!/^#/ && $4 !~ /noauto/ && $2 ~ /^\// { print $2 }' /etc/fstab) >/dev/null 2>&1
  fi
fi

〇restorecon
・構文
restorecon ファイルのパス
・SELinuxの設定をデフォルト設定にする。
・エラーを修正したり、新しいポリシーを追加したりする場合に使用する。
 
〇$SELINUX_STATE
SELINUXの状態チェック参照。
 
●リラベル
 

# 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

/etc/mtabの設定
if [ "$READONLY" != "yes" ] ; then
  # Clear mtab
  (> /etc/mtab) &> /dev/null

  # Remove stale backups
  rm -f /etc/mtab~ /etc/mtab~~

  # 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 /dev/shm >/dev/null 2>&1
  mount -f /proc/bus/usb >/dev/null 2>&1
fi

〇(> /etc/mtab)
・/etc/mtabにブランクを上書きしクリア。
 
〇mount -f
・以前に -n オプションを用いてマウントされたデバイスのエントリーを /etc/mtab に書き込む
 
※mount -n
・マウントの際に /etc/mtab に書き込みを行わない。

マウント、クウォータの更新
●マウント
 

# Mount all other filesystems (except for NFS and /proc, which is already
# mounted). Contrary to standard usage,
# filesystems are NOT unmounted in single user mode.
# The 'no' applies to all listed filesystem types. See mount(8).
if [ "$READONLY" != "yes" ] ; then
  action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev
else
  action $"Mounting local filesystems: " mount -a -n -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev
fi

 
〇mount
・-a
すべてのファイルシステムをマウント
・-n
/etc/mtabに書き込まずにマウント。(/etcがread-onlyファイルシステムの場合)
・-O no_netdev
/etc/fstabで_net-devオプションが指定されているものは除く。
 
●クウォータを更新
 

_RUN_QUOTACHECK=0
if [ -f /forcequotacheck ] || strstr "$cmdline" forcequotacheck ; then
  _RUN_QUOTACHECK=1
fi
 :
 :
# Update quotas if necessary
if [ X"$_RUN_QUOTACHECK" = X1 -a -x /sbin/quotacheck ]; then
  action $"Checking local filesystem quotas: " /sbin/quotacheck -anug
fi

if [ -x /sbin/quotaon ]; then
  action $"Enabling local filesystem quotas: " /sbin/quotaon -aug
fi

擬似乱数ジェネレータの初期化
# 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

if [ -f /etc/crypttab ]; then
  init_crypto 1
fi

 
〇dd if=/dev/urandom of=/var/lib/random-seed count=1 bs=512
・if
ファイルから読み取り。
・of
ファイルへ書き込み
・count
コピーするブロック数を指定
・bs
入出力時に一度にやり取りするバイト数を指定。
 
〇init_crypto()
・/etc/rc.d/init.d/functions内に定義。

# 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.
 :
 :

マシンの設定
# Configure machine if necessary.
if [ -f /.unconfigured ]; then

  if [ -x /bin/plymouth ]; then
    /bin/plymouth quit
  fi

  if [ -x /usr/bin/system-config-keyboard ]; then
    /usr/bin/system-config-keyboard
  fi
  if [ -x /usr/bin/passwd ]; then
    /usr/bin/passwd root
  fi
  if [ -x /usr/sbin/system-config-network-tui ]; then
    /usr/sbin/system-config-network-tui
  fi
  if [ -x /usr/sbin/timeconfig ]; then
    /usr/sbin/timeconfig
  fi
  if [ -x /usr/sbin/authconfig-tui ]; then
    /usr/sbin/authconfig-tui --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 ${HOSTNAME}: " hostname ${HOSTNAME}
  fi

  rm -f /.unconfigured
fi

不要ファイルの削除
●/配下の不要ファイル削除
 

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

 
●utmpx、wtmpxの設定
 

# 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

 
●/var配下の不要ファイル削除
 

# Clean up /var.
rm -rf /var/lock/cvs/* /var/run/screen/*
find /var/lock /var/run ! -type d -exec rm -f {} \;
rm -f /var/lib/rpm/__db* &> /dev/null
rm -f /var/gdm/.gdmfifo &> /dev/null

[ "$PROMPT" != no ] && plymouth watch-keystroke --command "touch /var/run/confirm" --keys=Ii &

 
〇find /var/lock /var/run ! -type d -exec rm -f {} \;
・! -type dがついているので、/var/lock /var/runディレクトリ内のディレクトリ以外のファイルを削除
 
●utmp/wtmpをクリーンアップ
 

# 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
[ -n "$SELINUX_STATE" ] && restorecon /var/run/utmp* /var/log/wtmp* >/dev/null 2>&1

 
〇restorecon
・SELinuxのセキュリティ設定をリセットするコマンド。
 
●/tmp配下の不要ファイルを削除
 

# 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

ICEディレクトリの作成
# 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

 
〇ICE-unix
・X-windowsのセッション情報を保存するのに使用されるディレクトリ。

スワッピングの開始
# Start up swapping.
update_boot_stage RCswap
action $"Enabling /etc/fstab swaps: " swapon -a -e
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)
      echo $curswap | grep -qw "$majmin" || action $"Enabling local swap partitions: " swapon $partition
    done
  fi
fi

 
〇update_boot_stage
・/etc/rc.d/init.d/functionsに定義。

# Inform the graphical boot of our current state
update_boot_stage() {
  if [ -x /bin/plymouth ]; then
    /bin/plymouth --update="$1"
  fi
return 0

 
〇swapon -a -e
・-a
/etc/fstabで'swap'とマークされているデバイスすべて。
・-e
存在しないデバイスは警告・エラー出力せずにスキップ。
 
〇blkid -t TYPE=swap -o device
・swapタイプのブロックデバイスの特性をdeviceフォーマットで出力する。

binfmt_miscの設定
●binfmt_miscの設定
 

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

 
●時間プロファイルを起動
 

# Boot time profiles. Yes, this should be somewhere else.
if [ -x /usr/sbin/system-config-network-cmd ]; then
  if strstr "$cmdline" netprofile= ; then
    for arg in $cmdline ; do
      if [ "${arg##netprofile=}" != "${arg}" ]; then
        /usr/sbin/system-config-network-cmd --profile ${arg##netprofile=}
      fi
    done
  fi
fi

dmesgの退避、rc.sysinitの終了
●dmesgログの退避
 

# 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
[ -f /var/log/dmesg ] && mv -f /var/log/dmesg /var/log/dmesg.old
dmesg -s 131072 > /var/log/dmesg

 
〇dmesgコマンド
・カーネルリングバッファーの管理、出力を行う。
・ブートアップメッセージをプリントアウト。
・-sオプション
バッファーサイズを指定。
 
●クラッシュインジケータフラグ/.autofsckを作成
 

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

 
●キーストロークの設定
 

[ "$PROMPT" != no ] && plymouth --ignore-keystroke=Ii
if strstr "$cmdline" confirm ; then
  touch /var/run/confirm
fi

 
〇plymouth --ignore-keystroke
Remove sensitivity to a keystroke
 
●rhgb(Red Hat Graphical Boot)にrc.sysinitが終了する事を知らせる
 

# Let rhgb know that we're leaving rc.sysinit
if [ -x /bin/plymouth ]; then
  /bin/plymouth --sysinit
fi

 
〇plymouth --sysinit
・ブートデーモンにrootファイルシステムがread-writeでマウントされた事を伝える。

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です