D.1. /etc/rc.d/init.d/rc
ໄດ້ rc script ແມ່ນ script ທໍາອິດທີ່ເອີ້ນໂດຍ init ແລະເລີ່ມຕົ້ນຂະບວນການ boot.
#! / bin / bash
################################################ ######################
# ເລີ່ມຕົ້ນ rc
#
# ລາຍລະອຽດ : Main Run Level Control Script
#
# ຜູ້ຂຽນ : Gerard Beekmans - [email protected]
#: DJ Lucas - [email protected]
# ອັບເດດ: Bruce Dubbs - [email protected]
#
# ລຸ້ນ : LFS 7.0
#
################################################ ######################
. /lib/lsb/init-functions print_error_msg()
{
log_failure_msg
# $i ຖືກຕັ້ງເມື່ອໂທຫາ
MSG="FAILURE:\n\nທ່ານບໍ່ຄວນອ່ານຂໍ້ຄວາມສະແດງຂໍ້ຜິດພາດນີ້.\n\n" MSG="${MSG}ມັນໝາຍຄວາມວ່າມີຄວາມຜິດພາດທີ່ຄາດບໍ່ເຖິງໄດ້ເກີດຂຶ້ນໃນ\n" MSG="${MSG}${ i},\n"
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
}
check_script_status()
{
# $i ຖືກຕັ້ງເມື່ອເອີ້ນຖ້າ [ ! -f ${i} ]; ແລ້ວ
log_warning_msg "${i} ບໍ່ແມ່ນ symlink ທີ່ຖືກຕ້ອງ." SCRIPT_STAT="1"
fi
ຖ້າ [ ! -x ${i} ]; ແລ້ວ
log_warning_msg "${i} ບໍ່ສາມາດປະຕິບັດໄດ້, ຂ້າມໄປ." SCRIPT_STAT="1"
fi
}
ແລ່ນ ()
{
ຖ້າ [ -z $interactive ]; ແລ້ວ
${1} ${2}
ກັບຄືນ $?
fi
ໃນຂະນະທີ່ຄວາມຈິງ; ເຮັດ
ອ່ານ -p "ແລ່ນ ${1} ${2} (ແມ່ນ/ບໍ່/ສືບຕໍ່)?" -n 1 runit echo
case ${runit} ໃນ c | ຄ)
ໂຕ້ຕອບ = ""
${i} ${2}
ret=${?} break;
;;
n | N)
ກັບຄືນ 0
;;
y | ຍ)
${i} ${2}
ret=${?} ຢຸດ
;;
esac ເຮັດແລ້ວ
ກັບຄືນ $ret
}
# ອ່ານການຕັ້ງຄ່າ / ການຍົກເລີກໃດໆໃນທ້ອງຖິ່ນ
[ -r /etc/sysconfig/rc.site ] && source /etc/sysconfig/rc.site
DISTRO=${DISTRO:-"Linux ຈາກ Scratch"}
DISTRO_CONTACT=${DISTRO_CONTACT:-"[email protected] (ຕ້ອງລົງທະບຽນ)"} DISTRO_MINI=${DISTRO_MINI:-"LFS"}
IPROMPT=${IPROMPT:-"ບໍ່"}
# 3 ສັນຍານນີ້ຈະບໍ່ເຮັດໃຫ້ script ຂອງພວກເຮົາອອກຈາກດັກ " "INT QUIT TSTP
[ "${1}" != "" ] && runlevel=${1}
ຖ້າ [ "${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" ທາງອອກ 1
fi
ຖ້າ [ "$runlevel" == "6" -o "$runlevel" == "0" ]; ຈາກນັ້ນ IPROMPT="ບໍ່"; ຟີ
# ໝາຍເຫດ: ໃນ ${LOGLEVEL:-7} ແມ່ນ ':' 'dash' '7', ບໍ່ແມ່ນລົບ 7 ຖ້າ [ "$runlevel" == "S" ]; ແລ້ວ
[ -r /etc/sysconfig/console ] && source /etc/sysconfig/console dmesg -n "${LOGLEVEL:-7}"
fi
ຖ້າ [ "${IPROMPT}" == "ແມ່ນ" -a "${runlevel}" == "S" ]; ແລ້ວ
# ຄວາມຍາວທັງໝົດຂອງສະຕຣິງຕ້ອນຮັບ distro, ໂດຍບໍ່ມີລະຫັດ escape wlen=${wlen:-$(echo "Welcome to ${DISTRO}" | wc -c )} welcome_message=${welcome_message:-"ຍິນດີຕ້ອນຮັບສູ່ ${INFO }${DISTRO}${normAL}"}
# ຄວາມຍາວທັງໝົດຂອງສະຕຣິງແບບໂຕ້ຕອບ, ໂດຍບໍ່ມີລະຫັດ escape ilen=${ilen:-$(echo "ກົດ 'I' ເພື່ອເຂົ້າສູ່ການເລີ່ມຕົ້ນແບບໂຕ້ຕອບ" | wc -c )}
i_message=${i_message:-"ກົດ '${FAILURE}I${NORMAL}' ເພື່ອເຂົ້າສູ່ການເລີ່ມຕົ້ນແບບໂຕ້ຕອບ"}
# dcol ແລະ icon ແມ່ນຍະຫວ່າງກ່ອນຂໍ້ຄວາມເພື່ອວາງຂໍ້ຄວາມຢູ່ກາງ
# ໃນຫນ້າຈໍ. 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 ""
ອ່ານ -t "${itime}" -n 1 ໂຕ້ຕອບ 2>&1 > /dev/null
fi
# ສ້າງຕົວພິມນ້ອຍ
[ "${interactive}" == "ຂ້ອຍ" ] && interactive="i" [ "${interactive}" != "i" ] && interactive=""
# ອ່ານໄຟລ໌ຂອງລັດຖ້າມັນມີຢູ່ຈາກ runlevel S
[ -r /var/run/interactive ] && source /var/run/interactive
# ຄວາມພະຍາຍາມທີ່ຈະຢຸດການບໍລິການທັງຫມົດທີ່ເລີ່ມຕົ້ນໂດຍລະດັບແລ່ນທີ່ຜ່ານມາ,
# ແລະຖືກຂ້າຕາຍໃນລະດັບແລ່ນນີ້
ຖ້າ [ "${previous}" != "N" ]; ແລ້ວ
ສໍາລັບ i ໃນ $(ls -v /etc/rc.d/rc${runlevel}.d/K* 2> /dev/null) ເຮັດ
check_script_status
ຖ້າ [ "${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
ຖ້າ [ "${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=${?}
ຖ້າ [ "${error_value}" != "0" ]; ຈາກນັ້ນ print_error_msg; ສຳເລັດແລ້ວ
fi
ຖ້າ [ "${previous}" == "N" ]; ຈາກນັ້ນສົ່ງອອກ IN_BOOT=1; ຟີ
ຖ້າ [ "$runlevel" == "6" -a -n "${FASTBOOT}" ]; ຈາກນັ້ນແຕະ /fastboot
fi
# ເລີ່ມຟັງຊັນທັງໝົດໃນລະດັບແລ່ນນີ້
ສໍາລັບ i ໃນ $( ls -v /etc/rc.d/rc${runlevel}.d/S* 2> /dev/null) ເຮັດ
ຖ້າ [ "${previous}" != "N" ]; ຈາກນັ້ນ suffix=${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
check_script_status
ຖ້າ [ "${SCRIPT_STAT}" =="1" ]; ຈາກນັ້ນ SCRIPT_STAT="0"
ດໍາເນີນການຕໍ່
fi
ກໍລະນີ ${runlevel} ໃນ 0|6)
ແລ່ນ ${i} ຢຸດ
;;
*)
ວ່າ C
ແລ່ນ ${i} ເລີ່ມ
;;
error_value=${?}
ຖ້າ [ "${error_value}" != "0" ]; ຈາກນັ້ນ print_error_msg; ສຳເລັດແລ້ວ
# ເກັບຮັກສາຕົວແປແບບໂຕ້ຕອບໃນສະວິດຈາກລະດັບແລ່ນ S ແລະເອົາອອກຖ້າບໍ່ແມ່ນຖ້າ [ "${runlevel}" == "S" -a "${interactive}" =="i" ]; ແລ້ວ
echo "ໂຕ້ຕອບ = \"i\" > /var/run/interactive
ອື່ນ
rm -f /var/run/interactive 2> /dev/null
fi
# ສຳເນົາບັນທຶກການບູດໃສ່ການບູດເບື້ອງຕົ້ນເທົ່ານັ້ນ
ຖ້າ [ "${previous}" == "N" -a "${runlevel}" != "S" ]; ຫຼັງຈາກນັ້ນ cat $BOOTLOG >> /var/log/boot.log
# ໝາຍຈຸດສິ້ນສຸດຂອງເກີບ
echo "--------" >> /var/log/boot.log
# ເອົາໄຟລ໌ຊົ່ວຄາວ rm -f $BOOTLOG 2> /dev/null
fi
# ຈົບ rc
ຖ້າ [ "${error_value}" != "0" ]; ຈາກນັ້ນ print_error_msg; ສຳເລັດແລ້ວ
# ເກັບຮັກສາຕົວແປແບບໂຕ້ຕອບໃນສະວິດຈາກລະດັບແລ່ນ S ແລະເອົາອອກຖ້າບໍ່ແມ່ນຖ້າ [ "${runlevel}" == "S" -a "${interactive}" =="i" ]; ແລ້ວ
echo "ໂຕ້ຕອບ = \"i\" > /var/run/interactive
ອື່ນ
rm -f /var/run/interactive 2> /dev/null
fi
# ສຳເນົາບັນທຶກການບູດໃສ່ການບູດເບື້ອງຕົ້ນເທົ່ານັ້ນ
ຖ້າ [ "${previous}" == "N" -a "${runlevel}" != "S" ]; ຫຼັງຈາກນັ້ນ cat $BOOTLOG >> /var/log/boot.log
# ໝາຍຈຸດສິ້ນສຸດຂອງເກີບ
echo "--------" >> /var/log/boot.log
# ເອົາໄຟລ໌ຊົ່ວຄາວ rm -f $BOOTLOG 2> /dev/null
fi
# ຈົບ rc
: Gerard Beekmans - [email protected]
: DJ Lucas - [email protected]
: Bruce Dubbs - [email protected]
: Gerard Beekmans - [email protected]
: DJ Lucas - [email protected]
: Bruce Dubbs - [email protected]
: LFS 7.0
: ດ້ວຍລະຫັດໂດຍອີງໃສ່ simpleinit-msb ຂອງ Matthias Benkmann http://winterdrache.de/linux/newboot/index.html
ໄຟລ໌ຄວນຈະຢູ່ໃນ /lib/lsb
: LFS 7.0
: ດ້ວຍລະຫັດໂດຍອີງໃສ່ simpleinit-msb ຂອງ Matthias Benkmann http://winterdrache.de/linux/newboot/index.html
ໄຟລ໌ຄວນຈະຢູ່ໃນ /lib/lsb