日志系统
Linux系统启动流程
PC: OS(Linux)
POST-->BIOS(BootSequence)-->MBR(bootloader,446)-->Kernel-->initrd-->(ROOTFS)/sbin/init(/etc/inittab)
Init管理(/etc/inittab)
启动的服务不同:
运行级别:0-6
0:halt
1:single user mode, 直接以管理员身份切入, s,S,single
2:multi usermode, no NFS
3:multi user mode, text mode 文本模式
4:reserved
5:multi user mode, graphic mode 图像界面
6:reboot
详解启动过程
bootloader(MBR)
LILO:LInux LOader
GRUB:GRand Unified Bootloader
Stage1:MBR
Stage1_5:/boot/grub/
Stage2:/boot/grub/
grub.conf
default=0 # 设定默认启动的title的编号,从0开始
timeout=5 # 等待用户选择的超时时长,单位是秒
splashimage=(hd0,0)/grub/splash.xpm.gz # grub的背景图片
hiddenmenu # 隐藏菜单
password redhat
password --md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.
title Red Hat Enterprise Linux Server(2.6.18-308.el5) # 内核标题,或操作系统名称,字符串,可自由修改
root(hd0,0) # 内核文件所在的设备;对grub而言,所有类型硬盘一律hd,格式为(hd#,N);hd#, #表示第几个磁盘;最后的N表示对应磁盘的分区;
kernel/vmlinuz-2.6.18-308.el5 ro root=/dev/vol0/root rhgb quiet # 内核文件路径,及传递给内核的参数/proc/cmdline
initrd/initrd-2.6.18-308.el5.img # ramdisk文件路径
password--md5 $1$HKXJ51$B9Z8A.X//XA.AtzU1.KuG.
title Install Red Hat Enterprise Linux 5
root(hd0,0)
kernel/vmlinuz-5 ks=http://172.16.0.1/workstation.cfg ksdevice=eth0 noipv6
initrd/initrd-5
password--md5 $1$FSUEU/$uhUUc8USBK5QAXc.BfW4m.
grub-md5-crypt
查看运行级别:
runlevel: n 3 代表从n切换到3
who -r
查看内核release号:
uname-r
安装grub stage1:
# grub
grub> root (hd0,0) boot所在的分区在0
grub> set (hd0)指定安装在哪块硬盘
安装grub第二种方式:
# grub-install--root-directory=/path/to/boot's_parent_dir /PATH/TO/DEVICE
grub-install --root-directory(grub放在什么分区上的跟)=/(boot的父目录)
配置文件坏了
grub> find
grub> root (hd#,N)
grub> kernel /PATH/TO/KERNEL_FILE
grub> initrd /PATH/TO/INITRD_FILE
grub> boot
Kernel初始化的过程:
1、设备探测
2、驱动初始化(可能会从initrd(initramfs)文件中装载驱动模块)
3、以只读挂载根文件系统;
4、装载第一个进程init(PID:1)
Init的过程
/sbin/init:(/etc/inittab)
upstart:ubuntu, d-bus, 事件驱动event-driven (ipc机制)把inittab切割成多个/etc/init/
systemd:并行
id:runlevels:action:process
id: 标识符
runlevels: 在哪个级别运行此行;
action: 在什么情况下执行此行;
process: 要运行程序;
id:3:initdefault:设定默认级别
si::sysinit:/etc/rc.d/rc.sysinit
ACTION:
initdefault: 设定默认运行级别
sysinit: 系统初始化
wait: 等待级别切换至此级别时执行
respawn: 一旦程序终止,会重新启动
init执行的脚本
/etc/rc.d/rc.sysinit完成的任务:
1、激活udev和selinux;
2、根据/etc/sysctl.conf文件,来设定内核参数;
3、设定时钟时钟;
4、装载键盘映射;
5、启用交换分区;
6、设置主机名;
7、根文件系统检测,并以读写方式重新挂载;
8、激活RAID和LVM设备;
9、启用磁盘配额;
10、根据/etc/fstab,检查并挂载其它文件系统;
11、清理过期的锁和PID文件;
/etc/rc.d/rc 关闭k开头,开始s开头的,根据优先级次序指向/etc/rc0.d
/etc/rc0.d指向/etc/rc.d/rc.0.d,继续链接到/etc/rc.d/init.d/下的脚本
for I in /etc/rc3.d/K*; do
$Istop
done
for I in /etc/rc3.d/S*; do
$Istart
done
##: 关闭或启动的优先次序,数据越小越优先被选定
先关闭以K开头的服务,后启动以S开头的服务;
内核设计风格:
RedHat, SUSE
核心:动态加载内核模块
内核:/lib/modules/“内核版本号命令的目录”/
vmlinuz-2.6.32
/lib/modules/2.6.32/
RedHat5: ramdisk-->initrd
RedHat6: ramfs-->initramfs
单内核:Linux(LWP)
核心:ko(kernelobject)
so()
微内核:Windows,Solaris (线程)
chroot: chroot /PATH/TO/TEMPROOT[COMMAND...]
chroot/test/virrrot /bin/bash
ldd /PATH/TO/BINARY_FILE:显示二进制文件所依赖的共享库
MBR(bootloader)-->Kernel --> initrd(initramfs) --> (ROOTFS) --> /sbin/init(/etc/inittab)
/etc/inittab,/etc/init/*.conf
upstart
init /etc/inittab
id:runlevels:action:process
id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
OS初始化
l0:0:wait:/etc/rc.d/rc 0
rc0.d/
K*
stop
S*
start
/etc/rc.d/init.d, /etc/init.d
服务类脚本:
start
SysV:/etc/rc.d/init.d
start|stop|restart|status
(1号信号)reload|configtest
chkconfig 命令可以自动创建链接
# chkconfig: runlevels SS KK 当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels表示默认创建为S*开头的链接,-表示没有级别默认为S*开头的链接;除此之外的级别默认创建为K*开头的链接;
S后面的启动优先级为SS所表示的数字;K后面关闭优先次序为KK所表示的数字;
# description: 用于说明此脚本的简单功能;\, 续行符
把写好的命令复制到 /etc/rc.d/init.d/目录下,chkconfig --add SERVICE_NAME
创建服务链接
chkconfig --list: 查看所有独立守护服务的启动设定;独立守护进程!
chkconfig--list SERVICE_NAME
chkconfig --add SERVICE_NAME
chkconfig --del SERVICE_NAME
chkconfig [--level RUNLEVELS] SERVICE_NAME{on|off}
如果省略级别指定,默认为2345级别;
Chkconfig –level myservice off;
样例脚本:
#!/bin/bash
#
# chkconfig: 2345 77 22
# description: Test Service
#
LOCKFILE=/var/lock/subsys/myservice
status() {
if[ -e $LOCKFILE ]; then
echo "Running..."
else
echo "Stopped."
fi
}
usage() {
echo "`basename $0` {start|stop|restart|status}"
}
case $1 in
start)
echo "Starting..."
touch $LOCKFILE ;;
stop)
echo "Stopping..."
rm-f $LOCKFILE &> /dev/null
;;
restart)
echo "Restarting..." ;;
status)
status ;;
*)
usage ;;
esac
/etc/rc.d/rc.local:系统最后启动的一个服务,准确说,应该执行的一个脚本;
/etc/inittab的任务:
1、设定默认运行级别;
2、运行系统初始化脚本;
3、运行指定运行级别对应的目录下的脚本;
4、设定Ctrl+Alt+Del组合键的操作;
5、定义UPS电源在电源故障/恢复时执行的操作;
6、启动虚拟终端(2345级别);
7、启动图形终端(5级别);
yum install xinetd -y
chkconfig --list xinetd
service xinetd start
chkconfig --list
chkconfig rsync on
chkconfig --list
守护进程的类型:
独立守护进程
xinetd:超级守护进程,代理人
瞬时守护进程:不需要关联至运行级别
核心:/boot/vmlinuz-version
内核模块(ko): /lib/modules/version/
内核设计:
单内核
模块化设计
微内核
装载模块:
insmod
modprobe
www.kernel.org:
用户空间访问、监控内核的方式:
/proc, /sys
伪文件系统
/proc/sys: 此目录中的文件很多是可读写的
/sys/: 某些文件可写
设定内核参数值的方法: free-m
echo VALUE > /proc/sys/TO/SOMEFILE echo 1 > /proc/sys/vm/drop_caches
sysctl -w kernel.hostname= free–m
echo “peng” > /proc/sys/kernel/hostname
能立即生效,但无法永久有效;
永久有效:/etc/sysctl.conf
修改文件完成之后,执行如下命令可立即生效:
sysctl -p 重读配置文件
sysctl -a: 显示所有内核参数及其值
内核模块管理:
lsmod: 查看模块
modprobe MOD_NAME:装载某模块
lsmod | grep floppy
modprobe -r floppy
lsmod | grep floppy
modprobe floppy
modprobe -r MOD_NAME: 卸载某模块
modinfo MOD_NAME: 查看模块的具体信息
insmod /PATH/TO/MODULE_FILE: 装载模块
rmmod MOD_NAME
depmod /PATH/TO/MODILES_DIR 生成模块依赖表,保持在这个目录
内核中的功能除了核心功能之外,在编译时,大多功能都有三种选择:
1、不使用此功能;
2、编译成内核模块;
3、编译进内核;
yum grouplist查看组装好没有,会影响后面的编译(DevelopmentTools Development Libraries)
yum groupinstall "DevelopmentLibraries"装组
如何手动编译内核:
make gconfig: Gnome桌面环境使用,需要安装图形开发库组:GNOME Software Development
make kconfig: KDE桌面环境使用,需要安装图形开发库 KDE Software Development
make menuconfig: 打开图形窗口
make
make modules_install
make install
yum install screen
screen命令:
screen -ls: 显示已经建立的屏幕
screen: 直接打开一个新的屏幕
Ctrl+a,d: 拆除屏幕
screen -r ID: 还原回某屏幕
exit: 退出
二次编译时清理,清理前,如果有需要,请备份配置文件.config:
make clean
make mrproper
grub-->kernel-->initrd-->ROOTFS(/sbin/init,/bin/bash)
mkinitrd initrd文件路径 内核版本号
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
FILE=/usr/local/src 从左往右找到第一个/去掉之前的内容
${FILE#*/}: usr/local/src从左往右找到第一个/去掉之前的内容
${FILE##*/}: src从左往右找到最后一个/去掉之前的内容
${FILE%/*}: /usr/local从右往左找到第一个/去掉之后的内容
${FILE%%/*}:从右往左找到最后/去掉之后的内容
${parameter%word*}
${parameter%%word*}
The word is expanded to produce apattern just as in pathname expansion. If the pattern matches a trailing portion of the
expanded value of parameter, then the result ofthe expansion is the expanded value of parameter with the shortest matching
pattern (the ?.€.?.€.case) or the longestmatching pattern (the ?.€.%?.€.case) deleted. Ifparameter is @ or *, the pattern
removal operation is applied to each positional parameter in turn, and the expansion isthe resultant list. If parameter is
an array variable subscriptedwith @ or *, the pattern removal operation is applied to each member of thearray in turn, and
the expansion is the resultantlist.
复制二进制程序及其依赖的库文件的脚本:
#!/bin/bash
#
DEST=/mnt/sysroot
libcp() {
LIBPATH=${1%/*}
[ !-d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
[ !-e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1finished."
}
bincp() {
CMDPATH=${1%/*}
[ !-d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH
[ !-e $DEST${1} ] && cp $1 $DEST$CMDPATH
forLIB in `ldd $1 | grep -o"/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $LIB
done
}
read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
! which $CMD &> /dev/null &&echo "Wrong command" && read -p "Input again:" CMD&& continue
COMMAND=` which $CMD | grep -v "^alias" | grep -o"[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue: " CMD
done
/etc/rc.d/rc.sysdone脚本,可用于实现为微型的Linux系统关机
#!/bin/bash
#
sync
sleep 2
sync
mount | awk '{print $3}' | grep -v -E"\/(dev|proc|sys)?$" | sort -r | while read LINE; do
umount -n -f $LINE
[$? -eq 0 ] && echo "Unmount $LINE finished." || echo"Can not unmount $LINE."
done
mount | awk '{print $3}' | while read LINE;do
mount -n -o remount,ro $LINE
[$? -eq 0 ] && echo "Remount $LINE finished." || echo"Can not remount $LINE."
done
exec /sbin/halt -p
T_RED="\\033[1;31m" # bold+red
T_GREEN="\\033[1;32m" # bold+green
T_YELLOW="\\033[1;33m" #bold+yellow
T_BLUE="\\033[1;34m" # bold+blue
T_CYAN="\\033[1;36m" # cyan
T_BOLD="\\033[1;37m" # bold+white
T_NORM="\\033[0;39m" # normal