首页 > 代码库 > 11、系统初始化流程、拯救模式 学习笔记
11、系统初始化流程、拯救模式 学习笔记
POST --> BIOS (Boot Sequence) --> MBR(bootloader) --> Kernel (CentOS5: initrd, CentOS6: initramfs) --> /sbin/init (CentOS5:/etc/inittab, CentOS6: /etc/inittab, /etc/init/*.conf)
/etc/inittab:
CentOS5: 每一行定义一个操作
CentOS6: upstart 脚本
运行级别:
0-6: 7个级别
0:关机
1: 单用户模式, 直接以root用户登录
2:多用户模式,不支持NFS文件系统
3:完全多用户模式,文本模式
4:预留级别
5:完全多用户模式,图形模式
6:重启
/sbin/init的配置文件:
每行定义一种操作
id:runlevels:action:process
id 操作的ID
runlevels 在哪些级别下执行此操作
action 动作
initdefault 设置默认运行级别,无需定义操作 id:3:initdefault:
sysinit 指定系统初始化脚本 si::sysinit:/etc/rc.d/rc.sysinit
wait 等待系统切换至此级别时运行一次
ctrlaltdel 定义组合键被按下时要运行的命令
respawn 当指定操作进程被关闭时立即再启动一次 tty1:2345:respawn:/sbin/mingetty tty1
process 操作
/sbin/init要完成的任务:
设定默认运行级别
指定系统运行的初始化脚本
启动指定级别下要启动的服务,并关闭需要停止的服务
/etc/init.d/ 系统服务脚本所在目录
/etc/rc.d/rcN.d (0-6) 根据系统服务脚本中的chkconfig配置,启动或关闭不同运行级别下需的服务
S## 指定运行级别下需要启动的服务
K## 指定运行级别下需要停止的服务
定义CtrlAltDel组合键的动作
初始化字符终端:
终端:对应的是设备
/dev/tty#, /dev/ttyS#, /dev/console, /dev/pts/#
调用:login-->/etc/issue
启动图形终端:
X-Window, 桌面管理器
系统初始化脚本/etc/rc.d/rc.sysinit
设置主机名
打印文本欢迎信息
激活SELinux和udev
激活swap
挂载/etc/fstab定义的本地文件系统
检测根文件系统并对其以读写方式重新挂载
设置系统时钟
装载键盘映射
根据/etc/sysctl.conf设置内核参数
激活RAID和LVM设备
清理操作
MBR:
bootloader: 程序
LILO:LInux LOader
不能引导位于1024 Cylinder以后的分区中的OS;
GRUB: GRand Unified Bootloader
1st stage: 位于MBR中,为了引导2nd stage
1.5 stage: 位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展
2nd stage: 位于boot基本磁盘分区中,GRUB的引导程序
boot分区大小:
CentOS5: 100M
CentOS6: 200M
/boot/grub/
tage2: 配置文件
grub.conf
Grub的功能:
1、选择要启动的内核或系统;
能隐藏选择界面
2、交互式接口
e: 编辑模式
3、基于密码保护
启用内核映像;
定义在相应的title下
传递参数(进入编辑模式)
定义在全局段中
[root@PXE init.d]# grub-md5-crypt
Password:
Retype password:
$1$fkAZP/$KZzg7EFMwUAlTbkamvmEz1
[root@PXE init.d]#
[root@PXE init.d]# vim /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
password --md5 $1$fkAZP/$KZzg7EFMwUAlTbkamvmEz1
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
password --md5 $1$fkAZP/$KZzg7EFMwUAlTbkamvmEz1
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=723934e6-0338-466e-a6d1-5f5db96b3728 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM
rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
grub接口:
title: 操作系统或内核的标题
root: 设定内核文件所在的分区为grub的根
kernel: 定义要使用的内核文件,后面可附加传递给内核的启动参数
initrd: 指定为内核提供额外驱动等功能的ram disk或ram fs文件
init的级别1的表示方式:
1, s, single, S
单用户模式几乎不会启动任何服务,且不需要用户登录;但是会执行/etc/rc.d/rc.sysinit脚本;
如是连/etc/rc.d/rc.sysinit文件也不加载,则传递 emergency
运行级别的切换:
# init [0-6]
查看运行级别:
# runlevel
# who -r
grub.conf配置文件语法:
default=#: 指定默认启动的内核或OS;
timeout=#: 等待用户选择要启动的内核或OS的时长,单位为秒;
splashimage=/path/to/splashimage_file: 指定使用的背景图片
hiddenmenu: 隐藏菜单
title
root (hd0,0)
(Device, Part)
Device表示方式: 在grub中,统统以hd开头,并紧跟一个数字做各磁盘设备的标记,从0开始编号
Part表示方式:代表分区,从0开始编号
kernel
指定内核文件及传递给内核的参数
参数:ro root=/path/to/DEVICE quiet
initrd
文件:通常为cpio归档,并使用gzip压缩;通常以.img作为文件名后缀;
grub配置文件丢失:
mv /boot/grub/grub.conf /boot/grub/grub.conf.back
grub> root(hd0,0)
grub> kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/sda3
grub> initrd /initramfs-2.6.32-431.el6.x86_64.img
grub> boot
bootloader损坏:
dd if=/dev/zero of=/dev/sda bs=100 count=1
sync
此时需要挂载光盘进入紧急救援模式修复
Rescue installed system
Choose a Language OK
Keyboard Type OK
Setup Networking No
Rescue Continue
Rescue OK
Rescue OK
shell Start shell OK
第一种方式:
# grub
grub> root (hd#,#)
grub> setup (hd#)
grub> quit
第二种方式:
# chroot /mnt/sysimage
# grub-install --root-directory=/ /dev/sda
# exit
# reboot
启动流程:POST --> BIOS(boot sequence) --> GRUB(bootloader (stage1: mbr; stage2: grub目录中)) --> kernel (initrd) --> SHELL
HOST:宿主机,
Target: 目标机
基于HOST制作一个简单的可启动的Linux:
1、给目标磁盘分区、格式化(100M、1G )
两个:
宿主机上:/dev/sdb1, /dev/sdb2
/dev/sdb1 挂载至 /mnt/boot
/dev/sdb2 挂载至 /mnt/sysroot
2、安装grub至目标磁盘
# grub-install --root-directory=/mnt /dev/sdb
3、复制内核和initrd文件
# cp /boot/vmlinuz-VERSION /mnt/boot/vmlinuz
# cp /boot/initramfs-VERSION.img /mnt/boot/initramfs.img
4、创建目标主机的根文件系统
# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
5、移植bash等命令至目标主机的根文件系统,命令移植完需要sync同步
6、为grub提供配置文件
# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title MageEdu Little Linux
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 quiet selinux=0 init=/bin/bash
initrd /initramfs.img
7、新建机器挂载硬盘测试
Linux的内核:单内核,支持动态装载和卸载
模块:/lib/modules/KERNEL_VERSION/
查看PCI设备的命令:
# lspci
查看当前内核装载的模块:
# lsmod
查看某模块的详细信息:
# modinfo MOD_NAME
动态卸载某模块:
# modprobe -r MOD_NAME
# rmmod MOD_NAME
动态装载某模块:
# modprobe MOD_NAME
# insmod /path/to/module_file
/sbin/init
/etc/inittab,
/etc/rc.d/rc.sysinit
设定默认运行级别
指定系统运行的初始化脚本
启动指定级别下要启动的服务,并关闭需要停止的服务
/etc/init.d/ 系统服务脚本所在目录
/etc/rc.d/rcN.d (0-6) 根据系统服务脚本中的chkconfig配置,启动或关闭不同运行级别下需的服务
S## 指定运行级别下需要启动的服务
K## 指定运行级别下需要停止的服务
# chkconfig --add SERVICE_NAME 添加服务到chkconfig
# chkconfig --del SERVICE_NAME 将服务移除chkconfig
# chkconfig SERVICE_NAME {on|off} # chkconfig --level LEVEL SERVICE_NAME {on|off}
服务脚本示例:
#!/bin/bash
#
# description: Test Service Script
# chkconfig: 2345 88 77
#
. /etc/init.d/functions
lockFile=/var/lock/subsys/tservice
start() {
if [ -e $lockFile ]; then
echo -ne "tservice is already started."
failure
echo
return 5
else
echo -ne "Start tservice finished..."
touch $lockFile
[ $? -eq 0 ] && success
echo
return 0
fi
}
stop() {
if [ -e $lockFile ]; then
rm -f $lockFile
echo -ne "Stop tservice finished..."
success
echo
return 0
else
echo -ne "tservice is not running..."
failure
echo
return 6
fi
}
restart() {
stop
start
}
status() {
if [ -e $lockFile ]; then
echo "tservice is running..."
else
echo "tservice is stopped..."
fi
}
usage() {
echo "Usage: tservice {start|stop|restart|status}"
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
usage
exit 7
;;
esac
本文出自 “开源殿堂” 博客,请务必保留此出处http://kaiyuandiantang.blog.51cto.com/10699754/1948933
11、系统初始化流程、拯救模式 学习笔记