D.1。 /etc/rc.d/init.d/rc
这款 rc script 是 init 调用的第一个脚本,用于启动引导过程。
#!/斌/庆典
############################################### ######################
# 开始 rc
#
# 描述:主运行级别控制脚本
#
# 作者:杰拉德·比克曼斯 - [电子邮件保护]
# : DJ 卢卡斯 - [电子邮件保护]
# 更新:布鲁斯·杜布斯 - [电子邮件保护]
#
# 版本:LFS 7.0
#
############################################### ######################
. /lib/lsb/init-functions print_error_msg() 函数
{
日志失败消息
# $i 在调用时设置
MSG="FAILURE:\n\n您不应该阅读此错误消息。\n\n" MSG="${MSG}这意味着发生了不可预见的错误\n" MSG="${MSG}${在”
MSG="${MSG} 退出时返回值为 ${error_value}。\n"
MSG="${MSG}如果您能够将此错误追溯到\n" MSG="${MSG}${DISTRO_MINI} 一书提供的文件中的一个错误,\n" MSG=" ${MSG}请在 ${DISTRO_CONTACT} 通知我们。\n" log_failure_msg "${MSG}"
log_info_msg "按 Enter 继续..." wait_for_user
}
检查脚本状态()
{
# $i 在调用时被设置 if [ ! -f ${i} ]; 然后
log_warning_msg "${i} 不是有效的符号链接。" SCRIPT_STAT="1"
fi
如果 [ ! -x ${i} ]; 然后
log_warning_msg "${i} 不可执行,跳过。" SCRIPT_STAT="1"
fi
}
跑步()
{
如果 [ -z $interactive ]; 然后
${1} ${2}
返回$?
fi
虽然是真的; 做
read -p "Run ${1} ${2} (Yes/no/continue)?" -n 1 runit echo
案例 ${runit} in c | C)
互动=“”
${i} ${2}
ret=${?} 休息;
;;
| | 否)
返回0
;;
是 | 是)
${i} ${2}
ret=${?} 休息
;;
esac 完成
返回 $ret
}
# 读取任何本地设置/覆盖
[ -r /etc/sysconfig/rc.site ] && 源 /etc/sysconfig/rc.site
发行版=${发行版:-“Linux 从头开始”}
DISTRO_CONTACT=${DISTRO_CONTACT:-"[电子邮件保护] (需要注册)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"}
IPROMPT=${IPROMPT:-"no"}
# 这 3 个信号不会导致我们的脚本退出陷阱 "" INT QUIT TSTP
[ "${1}" != "" ] && 运行级别=${1}
if [ "${runlevel}" == "" ]; 然后回显“用法:${0} " >&2 退出 1
fi
上一个=${PREVLEVEL}
[ "${previous}" == "" ] && previous=N
如果 [ ! -d /etc/rc.d/rc${runlevel}.d ]; 然后
log_info_msg "/etc/rc.d/rc${runlevel}.d 不存在。\n" exit 1
fi
if [ "$runlevel" == "6" -o "$runlevel" == "0" ]; 然后 IPROMPT="no"; 菲
# 注意:在 ${LOGLEVEL:-7} 中,是 ':' 'dash' '7',不是减 7 if [ "$runlevel" == "S" ]; 然后
[ -r /etc/sysconfig/console ] && source /etc/sysconfig/console dmesg -n "${LOGLEVEL:-7}"
fi
if [ "${IPROMPT}" == "yes" -a "${runlevel}" == "S" ]; 然后
# 发行版欢迎字符串的总长度,不含转义码 wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )}welcome_message=${welcome_message:-"Welcome to ${INFO }${发行版}${正常}"}
# 交互式字符串的总长度,不含转义码 ilen=${ilen:-$(echo "Press 'I' to enter interactive startup" | wc -c )}
i_message=${i_message:-"按'${FAILURE}I${NORMAL}'进入交互式启动"}
# dcol 和 icol 是消息前的空格以将消息居中
# 在屏幕上。 itime 是用户按下一个键的等待时间 wcol=$(( ( ${COLUMNS} - ${wlen} ) / 2 ))
icol=$(( ( ${COLUMNS} - ${ilen} ) / 2 )) itime=${itime:-"3"}
echo -e "\n\n"
echo -e "\\033[${wcol}G${welcome_message}" echo -e "\\033[${icol}G${i_message}${NORMAL}" echo ""
read -t "${itime}" -n 1 交互式 2>&1 > /dev/null
fi
# 小写
[ "${interactive}" == "I" ] && interactive="i" [ "${interactive}" != "i" ] && interactive=""
# 从运行级别 S 读取状态文件(如果它存在)
[ -r /var/run/interactive ] && 源 /var/run/interactive
# 尝试停止由前一个运行级别启动的所有服务,
# 并在此运行级别中被杀死
if [ "${previous}" != "N" ]; 然后
for i in $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) 做
检查脚本状态
如果 [ "${SCRIPT_STAT}" == "1" ]; 然后 SCRIPT_STAT="0"
继续
fi
suffix=${i#/etc/rc.d/rc$runlevel.d/K[0-9][0-9]} prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix sysinit_start=/etc/rc.d/rcS.d/S[0-9][0-9]$suffix
if [ "${runlevel}" != "0" -a "${runlevel}" != "6" ]; 然后
如果 [ ! -f ${prev_start} -a ! -f ${sysinit_start} ]; 然后 MSG="警告:\n\n${i} 不能是"
MSG="${MSG} 执行,因为它不是" MSG="${MSG} 未在前一个 " MSG="${MSG} 运行级别 (${previous}) 中启动。 log_warning_msg "$MSG"
继续
fi
fi
运行 ${i} 停止 error_value=${?}
if [ "${error_value}" != "0" ]; 然后print_error_msg; 完成
fi
if [ "${previous}" == "N" ]; 然后导出 IN_BOOT=1; 菲
if [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; 然后触摸 /fastboot
fi
# 启动此运行级别的所有函数
for i in $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) 做
if [ "${previous}" != "N" ]; 然后后缀=${i#/etc/rc.d/rc$runlevel.d/S[0-9][0-9]} stop=/etc/rc.d/rc$runlevel.d/K[0 -9][0-9]$suffix prev_start=/etc/rc.d/rc$previous.d/S[0-9][0-9]$suffix
[ -f ${prev_start} -a ! -f ${stop} ] && 继续
fi
检查脚本状态
如果 [ "${SCRIPT_STAT}" == "1" ]; 然后 SCRIPT_STAT="0"
继续
fi
案例 ${runlevel} 在 0|6)
运行 ${i} 停止
;;
*)
ESAC
运行 ${i} 开始
;;
错误值=${?}
if [ "${error_value}" != "0" ]; 然后print_error_msg; 完成
# 在从运行级别 S 切换时存储交互变量,如果不是则删除 if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; 然后
echo "interactive=\"i\"" > /var/run/interactive
其他
rm -f /var/run/interactive 2> /dev/null
fi
# 仅在初始启动时复制启动日志
if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; 然后 cat $BOOTLOG >> /var/log/boot.log
# 标记启动结束
echo "--------" >> /var/log/boot.log
# 删除临时文件 rm -f $BOOTLOG 2> /dev/null
fi
# 结束 rc
if [ "${error_value}" != "0" ]; 然后print_error_msg; 完成
# 在从运行级别 S 切换时存储交互变量,如果不是则删除 if [ "${runlevel}" == "S" -a "${interactive}" == "i" ]; 然后
echo "interactive=\"i\"" > /var/run/interactive
其他
rm -f /var/run/interactive 2> /dev/null
fi
# 仅在初始启动时复制启动日志
if [ "${previous}" == "N" -a "${runlevel}" != "S" ]; 然后 cat $BOOTLOG >> /var/log/boot.log
# 标记启动结束
echo "--------" >> /var/log/boot.log
# 删除临时文件 rm -f $BOOTLOG 2> /dev/null
fi
# 结束 rc
:杰拉德·比克曼斯 - [电子邮件保护]
: DJ 卢卡斯 - [电子邮件保护]
:布鲁斯·杜布斯 - [电子邮件保护]
:杰拉德·比克曼斯 - [电子邮件保护]
: DJ 卢卡斯 - [电子邮件保护]
:布鲁斯·杜布斯 - [电子邮件保护]
:LFS 7.0
:使用基于 Matthias Benkmann 的 simpleinit-msb 的代码 http://winterdrache.de/linux/newboot/index.html
该文件应位于 /lib/lsb
:LFS 7.0
:使用基于 Matthias Benkmann 的 simpleinit-msb 的代码 http://winterdrache.de/linux/newboot/index.html
该文件应位于 /lib/lsb