系统的加载过程
POST-->BIOS(BOOT sequence) --> MBR(bootloader,446)-->kernel(将kernel加载到内存并解压,利用虚根系统加载硬盘驱动(当伪文件系统退出时,需将/dev,/sys,/proc目录搬运至新根))-->initrd(RHLE5)/initramfs(RHEL6)-->init进程(用户空间的主导程序)
POST-->BIOS(boot squence)-->MBR(bootloader)-->kernl-->initrd--(rootfs)/sbin/init
虚根系统:
一般是将内存的一段空间做为磁盘使用(RHLE5叫ramdisk-->名称叫initrd,RHLE6叫rmfs
-->名称叫initramfs)
bootloader加载内核的同时,也加载initrd
kernel功能:
文件管理
进程管理
内存管理
网络管理
安全功能
驱动程序
内核设计风格:
单内核:所有功能都做进内核,即单内核。linux使用的内核方式。linux上线程叫LWP.(轻量进 程)
模块化的设计:
核心:KO(kernel object),readhat suse可以实现动态加载模块功能 内核命名:vmlinuz-2.6.32-->/boot/vmlinuz-*(单内核)
/lib/modules/2.6.32* (包含了外围模块等内容)
外围模块:内核路径:/lib/modules/”内核版本号命名的目录“下
微内核:只是核心,外围功能都做成子系统,需要用的时候,由内核高度使用,windows,solaris
微内核真正支持多线程的
/lib/modules/2.6.32-279.e16.X86_64/kernel目录模块:
arch:平台
crypto:加密
drivers:驱动
fs:文件系统
kernel:内核自身的额外功能
lib:库
mm:内存管理
net:网络
sound:声卡
chroot命令:将root切换至一个指定的目录
chroot /path/to/temprootdir [command...] 默认是运行bash
1、创建指定目录
2、复制bash到指定目录下的/bin目录下
3、使用ldd命令,查看bash的依赖库,并复制到/lib目录下
4、chroot /path/to/tmeprootdir
ldd命令
ldd /path/to/binary_file:显示二进制文件所依赖的共享库
[root@localhost kernel]# ldd /bin/bash linux-vdso.so.1 => (0x00007fff3a1fe000)(虚的,不需要复制) libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f15df7df000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f15df5db000) libc.so.6 => /lib64/libc.so.6 (0x00007f15df219000) /lib64/ld-linux-x86-64.so.2 (0x00007f15dfa1d000)
运行级别:0-6
0:halt
1:single user mode(单用户模式,直接登陆管理员,不需要密码)s,S,single
2:multi user mode(多用户模式,不启动nfs功能)
3:multi user mode (多用户模式,文本格式,text mode)
4:reseved(保留级别)
5: multi user mode ,graphic mode(多用户模式,图形界面)
6:reboot
/etc/inittab:定义了系统启动的默认级别
详解启动过程
一、grub引导程序设备及修复和加载过程
bootloader(MBR)
常见的bootloader程序(linux):
LILO:linux loader(8G以上不支持)
grub:grand unified bootloader
stage1:MBR.位于/boot/grub/stage1
stage1.5:用于识别常见不同的文件系统
stage2:/boot/grub/stage2
grub配置文件:/boot/grub/grub.conf ,grub一切操作都是需要找到boot目录,在boot目录中加载
# 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/sda2 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 #设定默认启动的title的编号,从0开始编号 timeout=5 #等待用户选择的超时时长,单位是秒 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #指定grub背景图片 hiddenmenu #隐藏菜单 password PASSWD # 给grub设定密码 password --md5 $1$/xVOE$JGcDpajNc05m1KIDcCKgI. title CentOS 6 (2.6.32-504.el6.x86_64) #引导的内核或操作系统标题,纯字符串,可修改 root (hd0,0) #内核文件所在的设备,所有类型硬盘一律为HD,(hd#,#) #表示第几个硬盘和分区 kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=8e3b9a7c-8d09-4fed-8cec-6811d0286063 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=128M LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #内核文件路径,及传递给内核的参数 initrd /initramfs-2.6.32-504.el6.x86_64.img #ramdisk文件(虚根路径) password --md5 $1$/xVOE$JGcDpajNc05m1KIDcCKgI. #把密码放到title里面,表示在启动内核时需输入密码。
给grub加密:
方法一:
password readhat #设定密码为readhat
方法二:
1、使用grub-md5-crypt
Password: Retype password: $1$/xVOE$JGcDpajNc05m1KIDcCKgI.
2、将生成的加密密码串复制到 password后面
grub修复
一、安装stage1,运行grub命令:
[root@Centos6 ~]# fdisk -l #首先查看有几块硬盘 Disk /dev/sda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0002c3d3 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 1332 10485760 83 Linux /dev/sda3 1332 1854 4194304 82 Linux swap / Solaris [root@Centos6 ~]# grub #运行grub命令 Probing devices to guess BIOS drives. This may take a long time. GNU GRUB version 0.97 (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.] grub> root (hd0,0) #查看grub所在硬盘和分区,需注意grub的硬盘识别编号与fdisk编号可能不一致 root (hd0,0) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) #安装grub,并指定grub所在硬盘 setup (hd0) Checking if "/boot/grub/stage1" exists... no Checking if "/grub/stage1" exists... yes Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded. succeeded Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded Done. grub> quit [root@Centos6 ~]#sync #将操作同步到硬盘
安装grub(对硬盘的操作)
使用 grub-install --root-directory=DIR
安装grub程序到主分区硬盘
1、将要安装grub的硬盘分区挂载到目录(必须要求硬盘中有包含分区,即有分区表的存在)
mount /path/to/dev1 /path/mount/dirctory
2、使用grub--install命令安装grub程序
grub-install --root-directory=/mnt/boot /dev/sdb # /mnt目录下必须包含boot目录,默认是将所有的文件安装到/boot目录下
3、配置/boot目录下的grub.conf文件
[root@Centos6 ~]# cat /mnt/boot/grub/grub.conf default=0 timeout=10 title Test linux 6.6 root (hd0,0) kernel /a initrd /a
启动时到grub配置界面(grub配置文件丢失等原因造成无法加载内核及initrd文件)
grub> find (hd#,N)/ 使用TAB键补全,即可显示所在分区的内核文件及initrd文件
grub> root (hd0,0)
grub> kernel /PATH/TO/kernel_file
grub> initrd /path/to/initrd_file
grub> boot
再到系统创建grub.conf配置文件,已完成修复
二、kernel的加载及配置
kernel初始化的过程
1、设备探测
2、驱动初始化(可能会从initrd(initramfs)中装载驱动模块)
3、以只读方式挂载根文件系统
4、装载第一个进程init(PID:1)
三、 init的初始化
1、/sbin/init:(/etc/inittab) RHEL6的名称叫upstart(ubuntu开发的)RHEL7上叫systemd
init只能同时启动一个进程,upstart或systemd可以并行启动多人进程
upsatrt:使用d-bus机制完成进程单的通信,在/etc/init/目录下有其配置文件, 将/etc/inittab中的配置切成片,放置到此目录,以.conf结尾
initab格式
id:runlevels:action:process action(动作)
id:标识符
runlevels:在哪个级别运行些行
action:在什么情况下执行此行
process:要运行的程序
si::sysinit:/etc/rc.d/rc.sysinit,si不指定ID,sysinit指在系统启动的时候,运行进程
action:
initdefault:设定默认运行级别
sysinit:系统初始化
wait:等待级别切换至此级别完成时此行
respawn:一旦程序终止,会再次重新启动
/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文件
启动过程:
id:3:initdefault:-->si::sysinit:/etc/rc.d/rc.sysinit-->l3:3:wait:/etc/rc.d/rc 3-->/etc/rc.d/rc3.d/1、K* 执行stop 2、S* 执行 start(所有文件都是连接到/etc/rc.d/init.d下的文件)-->/etc/rc.d/rc.local
/etc/rc.d/init.d下的服务脚本支持的参数:
{start|stop|restart|status|reload|configtest}
在/etc/rc.d/init.d目录下的所有服务类脚本,都包含如下两行:
# chkconfig: 345 95 5 345定义runlevels运行级别,也可以使用“-”,表示没有级别为S*开头的连接 95 即SS定义启动优先次序 5 即KK定义了关闭的优先次序
当chkconfig命令来为此脚本在rc#.d目录下创建连接时,runlevels表示默认创建为S*开头的连接,除此之外的级别默认创建为K*开头的连接,S后面的启动优先级为SS的数字,K后面关闭优先次序为KK所表示的数字
# description: Runs commands scheduled by the "at" command at the time \
用于说明此脚本的简单功能,如果超出一行,使用\续行
chkconfig命令(查看所有独立守护服务的启动设定,即独立守护进程)
--list:查看所有独立守护服务的启动设定
chkconfig --add SERVICE_NAME 将存入至/etc/rc.d/init.d/SERVICE_NAME的文件创建连接到 SERVICE_NAME指定的运行级别中。并且生成以K或S开头的文件
chkconfig --del SERVICE_NAME 删除独立守护进程,即删除相应启动项的连接
chkconfig [--level 24] SERVICE NAME {on|OFF}:设定服务的启动级别,level可以省略,默认是2345级
在/etc/rc.d/init.d中创建服务脚本及生成到相应的rc#.d中示例
#!/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
[root@Centos6 tmp]# mv myservice /etc/rc.d/init.d/ #移动服务脚本到/etc/rc.d/init.d目录 [root@Centos6 init.d]# find . -name "myservice" ./myservice [root@Centos6 rc.d]# chkconfig --add myservice #添加服务脚本 [root@Centos6 rc.d]# find . -name "*myservice" ./rc4.d/S77myservice ./init.d/myservice ./rc1.d/K22myservice ./rc3.d/S77myservice ./rc6.d/K22myservice ./rc0.d/K22myservice ./rc2.d/S77myservice ./rc5.d/S77myservice [root@Centos6 rc.d]# /etc/rc.d/init.d/myservice status #查看服务运行状态 Stopped. [root@Centos6 rc.d]# /etc/rc.d/init.d/myservice stop Stopping... [root@Centos6 rc.d]# /etc/rc.d/init.d/myservice start Starting... [root@Centos6 init]# chkconfig --list myservice myservice 0:off 1:off 2:on 3:on 4:on 5:on 6:off
/etc/rc.d/rc.local:系统最后启动的一个服务,准确说,应该执行的一个脚本,可以将系统启动时要执行的命令写入此脚本中,可以完成开机启动
inittab总结:
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
运行级别的原理:
1。在目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service)
2。在/etc/rc.d下有7个名为rcN.d的目录,对应系统的7个运行级别
3。rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
4。系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
对于以K开头的文件,系统将终止对应的服务
对于以S开头的文件,系统将启动对应的服务
5、/etc/rc.d/rc.local 是最后执行的脚本,可以将命令添加至里面,达到系统启动就运行的效果
6。查看运行级别用:runlevel
7。进入其它运行级别用:init N
8。另外init0为关机,init 6为重启系统
RHEL5 /etc/inittab的任务:
1、定义默认运行级别;
2、运行系统初始化脚本/etc/rc.d/rc.sysinit
3、运行指定运行级别对应的目录下的脚本,K为杀死,S为开始
4、设定ctrl+alt+del组合键的操作
5、定义UPS电源故障/恢复时执行的操作
6、启动虚拟终端 (2345级别)
7、启动图形化终端(5级别)
守护进程的类型:
独立守护进程
xinetd:超级守护进程,所有守护进程都由他管理,需关联运行级别
瞬时守护进程:不需要关联至运行级别
查看运行级别:
runlevel
[root@Centos6 ~]# runlevel N 3
who -r
[root@Centos6 ~]# who -r run-level 3 May 8 11:18
查看内核release号
uname -r
[root@Centos6 ~]# uname -r 2.6.32-504.el6.x86_64
uname -a
[root@Centos6 ~]# uname -a Linux Centos6.6A 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux