Fedora 下的/etc/rc.d/rc.sysinit 启动脚本注释

/etc/rc.d/rc.sysinit

脚本来源:Fedora11

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状态,以及设定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



写好了一会了,一直没时间深入查看,有很多地方还是理解的不是很透彻。望批评指正!

posted @ 2009-08-17 19:47  Hello! Linux 博客  Views(1224)  Comments(0Edit  收藏  举报