/etc/rc.d/rc.sysinit
脚本来源:Fedora 11
HOSTNAME=`/bin/hostname` //使用命令获取主机名
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi //若存在该脚本且为规则文件则运行之
if [ -z “$HOSTNAME” -o “$HOSTNAME” = “(none)” ]; then
HOSTNAME=localhost
fi
#若HOSTNAME变量字符长度0或为(none)则设定为localhost
if [ ! -e /proc/mounts ]; then
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
#若/proc/mounts 存在,则挂载proc目录 与sysfs目录(不写入/etc/mtab)
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
#若/proc/bus/usb目录存在,加载usbcore模块,并且以usbfs挂载/proc/bus/usb
#否在直接挂载以上目录
. /etc/init.d/functions //执行函数库脚本
PLYMOUTH=
[ -x /usr/bin/plymouth ] && PLYMOUTH=yes
#如果plymouth存在且有执行权限,设定PLYMOUTH变量
接下来是检查和修改Selinux状态,www.britepic.org以及设定selinux的几个函数
##由于鸡与蛋的问题,该函数需要执行两次
init_crypto()函数:
#接下来是按照系统的版本打印一个启动的欢迎信息:
# Print a text banner.
echo -en $””t”tWelcome to “
…………
…………
# Fix console loglevel
if [ -n “$LOGLEVEL” ]; then
/bin/dmesg -n $LOGLEVEL
fi
#打印相应日志级别的启动信息
cmdline=$(cat /proc/cmdline) #获取一行信息(来自GRUB文件menu.lst)
# 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
touch /dev/.in_sysinit >/dev/null 2>&1
#若cmdline变量里面没有包含”nomodules”字符串,则设置内核参数指定modporbe的位置,否则设置为true程序。
# Set default affinity
if [ -x /bin/taskset ]; then
…………
…………
#设置默认亲缘关系? 返回一个数值告知使用了哪个CPU?
# 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
mount -n /dev/pts >/dev/null 2>&1
[ -n “$SELINUX_STATE” ] && restorecon /dev/pts >/dev/null 2>&1
#加载模块?
# Configure kernel parameters
update_boot_stage Rckernelparam //通知图形启动现在的启动状态
sysctl -e -p /etc/sysctl.conf >/dev/null 2>&1
#设定内核参数
# Set the hostname.
update_boot_stage RChostname
action $”Setting hostname ${HOSTNAME}: ” hostname ${HOSTNAME}
#设定内核参数
{ rmmod scsi_wait_scan ; modprobe scsi_wait_scan ; rmmod scsi_wait_scan ; } >/dev/null 2>&1 //设定等待存储设备
# Start any MD RAID arrays that haven’t been started yet
[ -f /etc/mdadm.conf -a -x /sbin/mdadm ] && /sbin/mdadm -As –auto=yes –run
#启动尚未启动的RAID设备
# Device mapper & related initialization
if ! __fgrep “device-mapper” /proc/devices >/dev/null 2>&1 ; then
…………
…………
#设备映射以及相关设置
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 $ipaddr 2>/dev/null)
[ -n “$HOSTNAME” ] && { hostname ${HOSTNAME} ; break; }
done
fi
从设置好的IP地址获取主机名,从DHCP服务器获取。
接下来的一大段代码用来以只读方式挂载根目录,以及SELinux需要的一些操作:relable等,挂载本地文件系统,更新quota,初始化伪随机数生成器。
# Configure machine if necessary.
if [ -f /.unconfigured ]; then
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client –ping ; then
………………
………………
………………
#如果根目录下存在那个文件的话,把一些系统设置全部重设(管理员密码,网络设定,键盘布局等……)
# Configure machine if necessary.
if [ -f /.unconfigured ]; then
#读取系统设定重新设定主机名。
# Reread in network configuration data.
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
…………
#清理根目录下的一些文件,清理/var目录
# Clean up /var.
rm -rf /var/lock/cvs/* /var/run/screen/*
#清理/tmp目录,把一些锁文件和其它的一些临时文件删除。
[ -n “$SELINUX_STATE” ] && restorecon /tmp
…………
#创建ICE目录。
# Make ICE directory
mkdir -m 1777 -p /tmp/.ICE-unix >/dev/null 2>&1
#启动交换分区,从fstab读取
# Start up swapping.
update_boot_stage Rcswap
#创建系统崩溃标记,创建文件使下次启动自动检查文件系统。
# create the crash indicator flag to warn on crashes, offer fsck with timeout
touch /.autofsck &> /dev/null
#让rhgb知道脚本已经执行完成,根已经读写挂载。
# Let rhgb know that we’re leaving rc.sysinit
if [ -x /usr/bin/rhgb-client ] && /usr/bin/rhgb-client –ping ; then
/usr/bin/rhgb-client –sysinit
fi
写好了一会了,一直没时间深入查看,有很多地方还是理解的不是很透彻。望批评指正!