Linux系统启动流程和内核优化(一)

# **CentOS 6** **的启动管理** ~~~sh bootload 是分散在磁盘的很多位置的一个软件 grub存在正在两个位置:mbr的前446字节存放grub的第一部分,且是二进制。 其他的部分放在/boot/grub 里面 ~~~ # ext4 文件系统的驱动 ![](D:\云计算\21.系统启动流程和内核管理\06.jpg) **Linux** **组成** ~~~sh kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能 rootfs 包括程序和 glibc 库 程序:二进制执行文件 库:函数集合, function, 调用接口(头文件负责描述) ~~~ **内核设计流派** ~~~sh 宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux 把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂, Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点 微内核(micro kernel):Windows,Solaris,HarmonyOS 简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每 种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差 ~~~ **CentOS 6** **启动流程** ![](D:\云计算\21.系统启动流程和内核管理\1.jpg) ~~~sh \1. 加载BIOS的硬件信息,获取第一个启动设备 \2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息 \3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备 \4. 核心执行init程序,并获取默认的运行信息 \5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统 \6. 启动核心的外挂模块 \7. init执行运行的各个批处理文件(scripts) \8. init执行/etc/rc.d/rc.local \9. 执行/bin/login程序,等待用户登录 \10. 登录之后开始以Shell控制主机 ~~~ **硬件启动****POST** ~~~sh POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内 存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测 主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出 程序,系统信息设置、开机加电自检程序和系统启动自举程序等 主板的RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引 导程序的设备为本次启动设备 ~~~ **启动加载器** **bootloader** ~~~sh CPU未开启虚拟化,要在bios里面设置 #内核的功能:进程管理 文件系统管理 驱动程序 网咯管理 安全功能 内存管理 #bootloade 是硬件和操作系统之间的桥梁 ~~~ **grub** **功能和组成** ~~~sh bootloader: 引导加载器,引导程序。( Linux内核和硬件之间的桥梁 ) windows: ntloader,仅是启动OS Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装 载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核 Linux的bootloader LILO:LInux LOader,早期的bootloader,功能单一 GRUB: GRand Unifified Bootloader, CentOS 6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用 GRUB 2.02 GRUB 启动阶段 primary boot loader : 1st stage:MBR的前446个字节 1.5 stage: mbr 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统 secondary boot loader :2nd stage,分区文件/boot/grub/ ~~~ ~~~sh 前446字节是grub 中间64是分区 后2位校验 ~~~ **CentOS 6 grub** **安装** 安装grub: (1) grub-install 安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot 目录下 ~~~sh grub-install --root-directory=DIR /dev/DISK ~~~ ~~~sh (2) grub grub> root (hd#,#) grub> setup (hd#) ~~~ # 修复grub的第1阶段故障 ~~~sh [root@centos6 grub]#hexdump -C -n 512 /dev/sda 00000000 eb 48 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.H..............| 00000010 fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00 |...|.........!..| 00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75 |....8.u........u| 00000030 f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 03 02 |.........|...t..| 00000040  80 00 00 80 b0 0c 05 00  00 08 fa 90 90 f6 c2 80 |................| 00000050  75 02 b2 80 ea 59 7c 00  00 31 c0 8e d8 8e d0 bc |u....Y|..1......| 00000060  00 20 fb a0 40 7c 3c ff  74 02 88 c2 52 f6 c2 80 |. ..@|<.t...R...| 00000070  74 54 b4 41 bb aa 55 cd  13 5a 52 72 49 81 fb 55 |tT.A..U..ZRrI..U| 00000080 aa 75 43 a0 41 7c 84 c0  75 05 83 e1 01 74 37 66 |.uC.A|..u....t7f| 00000090 8b 4c 10 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 |.L...|.D..f..D|.| 000000a0  04 10 00 c7 44 02 01 00  66 89 5c 08 c7 44 06 00 |....D...f.\..D..| 000000b0  70 66 31 c0 89 44 04 66  89 44 0c b4 42 cd 13 72 |pf1..D.f.D..B..r| 000000c0  05 bb 00 70 eb 7d b4 08  cd 13 73 0a f6 c2 80 0f |...p.}....s.....| 000000d0  84 f0 00 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 |........|.D..f1.| 000000e0  88 f0 40 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 |..@f.D.1........| 000000f0  88 f4 40 89 44 08 31 c0  88 d0 c0 e8 02 66 89 04 |..@.D.1......f..| 00000100  66 a1 44 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 |f.D|f1.f.4.T.f1.| 00000110  66 f7 74 04 88 54 0b 89  44 0c 3b 44 08 7d 3c 8a |f.t..T..D.;D.}<.| 00000120  54 0d c0 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a |T.....L......l.Z| 00000130 8a 74 0b bb 00 70 8e c3  31 db b8 01 02 cd 13 72 |.t...p..1......r| 00000140 2a 8c c3 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 |*....H|`......1.| 00000150  31 ff fc f3 a5 1f 61 ff  26 42 7c be 7f 7d e8 40 |1.....a.&B|..}.@| 00000160  00 eb 0e be 84 7d e8 38  00 eb 06 be 8e 7d e8 30 |.....}.8.....}.0| 00000170  00 be 93 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 |...}.*...GRUB .G| 00000180  65 6f 6d 00 48 61 72 64  20 44 69 73 6b 00 52 65 |eom.Hard Disk.Re| 00000190  61 64 00 20 45 72 72 6f  72 00 bb 01 00 b4 0e cd |ad. Error.......| 000001a0  10 ac 3c 00 75 f4 c3 00  00 00 00 00 00 00 00 00 |..<.u...........| 000001b0  00 00 00 00 00 00 00 00 e0 96 01 00 00 00 80 20 |............... | 000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa |!...(....... ...| 000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 1a 06 00 fe |)....... .......| 000001e0 ff ff 83 fe ff ff 00 88 3a 06 00 00 71 02 00 fe |........:...q...| 000001f0 ff ff 05 fe ff ff 00 88  ab 08 00 78 54 10 55 aa |...........xT.U.| 00000200 #破坏grub第1阶段 [root@centos6 grub]#dd if=/dev/zero of=/dev/sda bs=1 count=446 446+0 records in 446+0 records out 446 bytes (446 B) copied, 0.000871905 s, 512 kB/s [root@centos6 grub]#hexdump -C -n 512 /dev/sda 00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| * 000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20 |............... | 000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa |!...(....... ...| 000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 1a 06 00 fe |)....... .......| 000001e0 ff ff 83 fe ff ff 00 88 3a 06 00 00 71 02 00 fe |........:...q...| 000001f0 ff ff 05 fe ff ff 00 88  ab 08 00 78 54 10 55 aa |...........xT.U.| 00000200 [root@centos6 grub]#hexdump -C -n 512 /dev/sda -v 00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000090  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000000b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000000c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000000d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000000f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000100  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000110  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000120  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000130  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000160  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000170  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000001a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................| 000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 80 20 |............... | 000001c0  21 00 83 aa 28 82 00 08  00 00 00 00 20 00 00 aa |!...(....... ...| 000001d0  29 82 83 fe ff ff 00 08  20 00 00 80 1a 06 00 fe |)....... .......| 000001e0 ff ff 83 fe ff ff 00 88 3a 06 00 00 71 02 00 fe |........:...q...| 000001f0 ff ff 05 fe ff ff 00 88  ab 08 00 78 54 10 55 aa |...........xT.U.| 00000200 # 446字节被破坏,无法引导 ,无法进入硬盘,要修复 ~~~ ![](D:\Time\linux文档\assets\系统启动流程\1.jpg) ![](D:\云计算\21.系统启动流程和内核管理\02.jpg) ![](D:\云计算\21.系统启动流程和内核管理\03.jpg) 此时的根被挂载到了/mnt/sysimage 下了 修复办法: 方法一 ~~~sh 插上光盘 切换根 chroot /mnt/sysimage centos6 安装 grub-install /dev/sda centos7 安装 grub2-install /dev/sda sync 同步到磁盘 ctrl alt delete 三建按重启 ~~~ # 修复grub的第1.5 阶段故障 ![](D:\云计算\21.系统启动流程和内核管理\04.jpg) ~~~sh [root09:07 PMcentos7 ~]#dd if=/dev/zero of=/dev/sda bs=512 count=25 seek=1 跳过目标的512字节,这里是以512为单位,破坏后续的二十五个扇区 1阶段完好,1.5阶段被破坏 修复方法一样 或者下面的方法grub交互式修改: #第二种修复的方法: [root@centos6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446 grub> root (hd0,0) root (hd0,0) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) 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. #1.5阶段的27个扇区 succeeded Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded Done. ~~~ ![](D:\云计算\21.系统启动流程和内核管理\05.jpg) * 分区表是数据,无法修复 ,数据和程序是不一样的,大不了重装,数据是无法的 * 第二阶段才识别/boot文件系统,文件系统是属于内核的管理的范畴了。第一阶段MBR的446字节不是文件,是grub的一部分 * 第一阶段和第1.5阶段报错的情况不一样同上的万能修复修复方法:第1阶段和第1.5阶段的修复方法一样,就是报错菜单不一样,因为第一阶段是还没有进入系统,第1.5阶段是进入了系统,认为上了贼船,进入硬盘了却无法后面的操作。 * 第1.5阶段就是为了加载第二阶段文件所在的分区的文件系统,因为只有内核才能识别文件系统,让他能识别二阶段的文件系统 ### 系统各个阶段的错误信息: 第1阶段:DHCP 第1.5阶段: — 不停的闪烁 第2阶段:出现菜单无法加载内核 ![](D:\云计算\21.系统启动流程和内核管理\07.jpg) ![](D:\云计算\21.系统启动流程和内核管理\08.jpg) ![](D:\云计算\21.系统启动流程和内核管理\09.jpg) ### grub legacy 管理 ~~~sh 配置文件:/boot/grub/grub.conf <-- /etc/grub.conf stage2及内核等通常放置于一个基本磁盘分区 grub legacy 功用: (1) 提供启动菜单、并提供交互式接口 a:内核参数 e:编辑模式,用于编辑菜单 c:命令模式,交互式接口 (2) 加载用户选择的内核或操作系统 允许传递参数给内核 可隐藏启动菜单 (3) 为菜单提供了保护机制 为编辑启动菜单进行认证 为启用内核或操作系统进行认证 ~~~ ### grub.conf 文件 ~~~sh [root@localhost grub]# cat /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/mapper/VolGroup-lv_root # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 #默认是菜单里面的第一条 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz #背景图片 hiddenmenu title CentOS 6 (2.6.32-754.el6.x86_64) root (hd0,0) #0分区0扇区 kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.el6.x86_64.img #此文件很重要,因为grub菜单的作用要找到内核,让内核加载根,挂载根要识别文件系统的。此文件就是初始化虚拟文件系统 title CentOS 6 (2.6.32-754.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-754.el6.x86_64.img #grub菜单菜单认为/boot是根,因为内核还没有加载 [root@centos6 ~]# rpm -qf /boot/grub/ grub-0.97-99.el6.x86_64 [root@centos6 ~]# rpm -qf /boot/grub/grub.conf #该文件不属于任何包 (hd#,#) hd#: 磁盘编号,用数字表示;从0开始编号 #: 分区编号,用数字表示; 从0开始编号 示例: (hd0,0) 第一块硬盘,第一个分区 root=/dev/mapper/VolGroup-lv_root grub程序认为 /dev/mapper/VolGroup-lv_root他才是根,grub的启动优先于内核,grub加载内核 help: 获取帮助列表 help KEYWORD: 详细帮助信息 find (hd#,#)/PATH/TO/SOMEFILE: root (hd#,#) kernel /PATH/TO/KERNEL_FILE: 设定本次启动的内核文件;额外还可添加许多内核支持使用的 cmdline参数 例如:max_loop=100 selinux=0 init=/path/to/init initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk boot: 引导启动选定的内核 ~~~ ### initramfs-2.6.32-754.el6.x86_64.img 文件 ~~~sh [root@centos6 boot]# file initramfs-2.6.32-754.el6.x86_64.img initramfs-2.6.32-754.el6.x86_64.img: gzip compressed data, from Unix, last modified: Sat May 8 22:31:42 2021, max compression #改名 [root@centos6 data]# mv initramfs-2.6.32-754.el6.x86_64.img initramfs-2.6.32-754.el6.x86_64.img.gz #解压 [root@centos6 data]# gunzip initramfs-2.6.32-754.el6.x86_64.img.gz #预览 [root@centos6 data]# cpio -tv BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd) init程序的类型: SysV: init, CentOS 5之前 配置文件:/etc/inittab Upstart: init,CentOS 6 配置文件:/etc/inittab, /etc/init/*.conf Systemd:systemd, CentOS 7 配置文件:/usr/lib/systemd/system /etc/systemd/system ~~~ ### centos6 运行级别 ~~~sh [root03:42 PMcentos6 ~]#cat /etc/inittab |tail -1 id:3:initdefault: #如果设置0就不开机 设置6就不断重启 [root03:36 PMcentos6 ~]#rpm -qf /sbin/init upstart-0.6.5-17.el6.x86_64 0:关机 1:单用户模式(root自动登录), single, 维护模式 2:多用户模式,启动网络功能,但不会启动NFS;维护模式 3:多用户模式,正常模式;文本界面 4:预留级别;可同3级别 5:多用户模式,正常模式;图形界面 6:重启 id:runlevel:action:process id:是惟一标识该项的字符序列 runlevels: 定义了操作所使用的运行级别 action: 指定了要执行的特定操作     wait: 切换至此级别运行一次 respawn:此process终止,就重新启动之 initdefault:设定默认运行级别;process省略 sysinit:设定系统初始化方式 process:定义了要执行的进程 ~~~ **遇到运行模式6,不断重启的事情就像修改单用户模式破密码那样,改为3** ![](D:\云计算\21.系统启动流程和内核管理\22.jpg) ### ![](D:\云计算\21.系统启动流程和内核管理\23.jpg) ![](D:\云计算\21.系统启动流程和内核管理\24.jpg) ![](D:\云计算\21.系统启动流程和内核管理\25.jpg) ![](D:\云计算\21.系统启动流程和内核管理\25.jpg) 说明:rc N --> 意味着读取/etc/rc.d/rcN.d/ K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务 S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务 ![](D:\云计算\21.系统启动流程和内核管理\26.jpg) ![](D:\云计算\21.系统启动流程和内核管理\31.png) * 都是互为软连接和硬链接 ![](D:\云计算\21.系统启动流程和内核管理\27.jpg) ### 切换级别: ~~~sh init # ~~~ ### 查看级别: ~~~sh runlevel who -r ~~~ ### 定义运行级别 ~~~sh /etc/inittab ~~~ ### **初始化脚本** **sysinit** ~~~sh /etc/rc.d/rc.sysinit 系统初始化脚本功能: (1) 设置主机名 (2) 设置欢迎信息 (3) 激活udev和selinux (4) 挂载/etc/fstab文件中定义的文件系统 (5) 检测根文件系统,并以读写方式重新挂载根文件系统 (6) 设置系统时钟 (7) 激活swap设备 (8) 根据/etc/sysctl.conf文件设置内核参数 (9) 激活lvm及software raid设备 (10)加载额外设备的驱动程序 (11)清理操作 ~~~ ### /etc/rc.d/rc3.d/ ~~~sh K 关闭 S 启动 说明:rc N --> 意味着读取/etc/rc.d/rcN.d/ K: K##:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务 S: S##:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务 [root@localhost init]# ll /etc/rc3.d/ 总用量 0 lrwxrwxrwx. 1 root root 19 5月 19 05:35 K10saslauthd -> ../init.d/saslauthd lrwxrwxrwx. 1 root root 18 5月 19 05:36 K61nfs-rdma -> ../init.d/nfs-rdma lrwxrwxrwx. 1 root root 21 5月 19 05:35 K87restorecond -> ../init.d/restorecond lrwxrwxrwx. 1 root root 20 5月 19 05:35 K89netconsole -> ../init.d/netconsole lrwxrwxrwx. 1 root root 15 5月 19 05:35 K89rdisc -> ../init.d/rdisc lrwxrwxrwx. 1 root root 22 5月 19 05:36 S02lvm2-monitor -> ../init.d/lvm2-monitor lrwxrwxrwx. 1 root root 14 5月 19 05:36 S05rdma -> ../init.d/rdma lrwxrwxrwx. 1 root root 19 5月 19 05:36 S08ip6tables -> ../init.d/ip6tables lrwxrwxrwx. 1 root root 18 5月 19 05:35 S08iptables -> ../init.d/iptables lrwxrwxrwx. 1 root root 17 5月 19 05:35 S10network -> ../init.d/network lrwxrwxrwx. 1 root root 16 5月 19 05:36 S11auditd -> ../init.d/auditd lrwxrwxrwx. 1 root root 17 5月 19 05:35 S12rsyslog -> ../init.d/rsyslog lrwxrwxrwx. 1 root root 19 5月 19 05:35 S15mdmonitor -> ../init.d/mdmonitor lrwxrwxrwx. 1 root root 20 5月 19 05:35 S22messagebus -> ../init.d/messagebus lrwxrwxrwx. 1 root root 26 5月 19 05:35 S25blk-availability -> ../init.d/blk-availability lrwxrwxrwx. 1 root root 15 5月 19 05:35 S25netfs -> ../init.d/netfs lrwxrwxrwx. 1 root root 19 5月 19 05:35 S26udev-post -> ../init.d/udev-post lrwxrwxrwx. 1 root root 15 5月 19 05:36 S50kdump -> ../init.d/kdump lrwxrwxrwx. 1 root root 14 5月 19 05:36 S55sshd -> ../init.d/sshd lrwxrwxrwx. 1 root root 17 5月 19 05:35 S80postfix -> ../init.d/postfix lrwxrwxrwx. 1 root root 15 5月 19 05:35 S90crond -> ../init.d/crond lrwxrwxrwx. 1 root root 11 5月 19 05:35 S99local -> ../rc.local ~~~ ~~~sh /etc/init.d/ /etc/init/ ========================================================================= /etc/rc.d/rc 控制服务脚本的开机自动运行 for srv in /etc/rc.d/rcN.d/K*; do $srv stop done for srv in /etc/rc.d/rcN.d/S*; do $srv start done ========================================================================== /etc/init/rc.conf [root@centos6 ~]#cat /etc/init/rc.conf # rc - System V runlevel compatibility # # This task runs the old sysv-rc runlevel scripts. It # is usually started by the telinit compatibility wrapper. # # Do not edit this file directly. If you want to change the behaviour, # please create a file rc.override and put your changes there. start on runlevel [0123456] stop on runlevel [!$RUNLEVEL] task export RUNLEVEL console output exec /etc/rc.d/rc $RUNLEVEL /etc/rc.d/rcN.d/ ========================================================================= ls /etc/rc0.d 全部是关机模式 [root@localhost init]# ls /etc/rc0.d K10saslauthd K50kdump K75blk-availability K85mdmonitor K88auditd K89rdisc K92iptables S00killall K25sshd K60crond K75netfs K85messagebus K88rsyslog K90network K95rdma S01halt K30postfix K61nfs-rdma K75udev-post K87restorecond K89netconsole K92ip6tables K99lvm2-monitor ~~~ ntsysv命令 chkconfifig 命令管理服务 ~~~sh #查看服务在所有级别的启动或关闭设定情形: chkconfig [--list] [name] #添加服务 SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d) #!/bin/bash chkconfig: LLLL nn nn  #LLLL 表示初始在哪个级别下启动,-表示都不启动 description : 描述信息 chkconfig --add name #删除服务 chkconfig --del name #修改指定的运行级别 chkconfig [--level levels] name <on|off|reset> 说明:--level LLLL: 指定要设置的级别;省略时表示2345 ~~~ # centos6 设置开机启动与否 ![](D:\云计算\21.系统启动流程和内核管理\28.jpg) ![](D:\云计算\21.系统启动流程和内核管理\29.jpg) ### 写一个开机启动的脚本 ~~~sh [root@localhost init]# cat /etc/init.d/testsrv #!/bin/bash #chkconfig: - 96 3 #description: test serivce script . /etc/init.d/functions start(){ touch /var/lock/subsys/testsrv action "Starting testsrv" sleep 3 } stop() { rm -f /var/lock/subsys/testsrv action "Shutting down testsrv" } restart(){ stop start } status(){ if [ -e /var/lock/subsys/testsrv ] ;then echo  "testsrv is running..." else echo "testsrv is stopped" fi } case $1 in start) start ;; stop) stop ;; restart) restart ;; status) status ;; *) echo "Usage: /etc/init.d/testsrv {start|stop|restart|status}" ;; esac [root@centos6 ~]#chmod +x /etc/init.d/testsrv [root@centos6 ~]#chkconfig --add testsrv [root@centos6 ~]#chkconfig --list testsrv testsrv       0:off 1:off 2:off 3:off 4:off 5:off 6:off chkconfig testsrv on [root@centos6 ~]#chkconfig --del testsrv ~~~ **这步骤以后就自动开启软链接** chkconfig --add testsrv ![](D:\云计算\21.系统启动流程和内核管理\35.jpg) # 故障:一个服务起不来 ![](D:\云计算\21.系统启动流程和内核管理\33.jpg) ![](D:\云计算\21.系统启动流程和内核管理\34.jpg) 模拟服务起不来的情况: 这一个服务起不来导致后面的也起不来了 ![](D:\云计算\21.系统启动流程和内核管理\36.jpg) ![](D:\云计算\21.系统启动流程和内核管理\37.jpg) # 开机就自动启动服务 的2种方法 ### chkconfig testsrv on 开机就启动 ### /etc/rc.d/rc.local 开机启动 * 缺点:无法用service 控制 * ***service 命令控制的是 /etc/init.d/目录里面的脚本*** ~~~sh 文件写好了直接放里面就好,开机自动运行 [root@localhost init.d]# ll /etc/rc.d/rc.local #该文件在centos7上默认无执行权限 -rwxr-xr-x. 1 root root 220 6月 20 2018 /etc/rc.d/rc.local [root@localhost ~]# cat /etc/rc.d/rc.local touch /var/lock/subsys/local /etc/init.d/testsrv start ~~~ ![](D:\云计算\21.系统启动流程和内核管理\38.jpg) ### 独立服务和非独立服务 **[root@init.d]#yum install telnet-server -y** 服务分为独立服务和非独立服务 瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,也称为非独立服务 进入的请求首先被xinetd代理 配置文件: ~~~sh /etc/xinetd.conf /etc/xinetd.d/ ~~~ 用chkconfifig控制非独立服务开机启动 示例:chkconfifig tftp on 注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向 了/etc/rc.d/rc.local脚本 不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置 于/etc/rc.d/rc.local文件中 /etc/rc.d/rc.local在指定运行级别脚本后运行 **CentOS** **启动过程总结** /sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本/etc/rc.d/rc.sysinit、完成系统 初始化 --> (关闭对应下需要关闭的服务)启动需要启动服务/etc/rc#.d/Sxxxx,/etc/rc.d/rc.local--> 设置登 录终端 参看:http://www.icode9.com/i/li/?n=4&i=wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg ![](D:\云计算\21.系统启动流程和内核管理\39.jpg) ![](D:\云计算\21.系统启动流程和内核管理\40.jpg) ![](D:\云计算\21.系统启动流程和内核管理\41.jpg) ### 自制linux依赖于现有的LINUX **分区并创建文件系统** ~~~sh #分两个必要的分区,/dev/sdb1对应/boot   /dev/sdb2对应根 / [root@centos6 ~]#echo -e 'n\np\n1\n\n+1G\nw\n' | fdisk /dev/sdb [root@centos6 ~]#echo -e 'n\np\n2\n\n\n\nw\n' | fdisk /dev/sdb [root@centos6 ~]#mkfs.ext4 /dev/sdb1 [root@centos6 ~]#mkfs.ext4 /dev/sdb2 ~~~ **挂载****boot** ~~~sh #子目录必须为boot [root@centos6 ~]#mkdir /mnt/boot [root@centos6 ~]#mount /dev/sdb1 /mnt/boot ~~~ **安装****grub** ~~~sh [root@centos6 ~]#grub-install --root-directory=/mnt/ /dev/sdb ~~~ **准备内核和****initramfs****文件** ~~~sh [root@centos6 ~]#cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz [root@centos6 ~]#cp /boot/initramfs-2.6.32-754.el6.x86_64.img /mnt/boot/initramfs.img ~~~ **建立****grub.conf** ~~~sh [root@centos6 ~]#cat /mnt/boot/grub/grub.conf default=0 timeout=6 title wang linux root (hd0,0) kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash 【bash作为第一个进程】 initrd /initramfs.img [root@centos6 ~]#tree /mnt/boot /mnt/boot ├── grub │   ├── device.map │   ├── e2fs_stage1_5 │   ├── fat_stage1_5 │   ├── ffs_stage1_5 │   ├── grub.conf │   ├── iso9660_stage1_5 │   ├── jfs_stage1_5 │   ├── minix_stage1_5 │   ├── reiserfs_stage1_5 │   ├── stage1 │   ├── stage2 │   ├── ufs2_stage1_5 │   ├── vstafs_stage1_5 │   └── xfs_stage1_5 ├── initramfs.img ├── lost+found └── vmlinuz 2 directories, 16 files [root@centos6 ~]# ~~~ **准备根下面相关程序和库** ~~~sh [root@centos6 ~]#mkdir /mnt/sysroot [root@centos6 ~]#mount /dev/sdb2   /mnt/sysroot [root@centos6 ~]#mkdir –pv /mnt/sysroot/{boot,dev,sys,proc,etc,lib,lib64,bin,sbin,tmp,var,usr,opt,home,root ,mnt,media} #复制bash等命令和相关库文件,如: bash,ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,tree,fdisk [root@centos6 ~]#mkdir /mnt/sysroot/{dev,proc,etc,sys,lib,home,root} #准备网卡驱动 [root@centos6 ~]#ethtool -i eth0 driver: e1000 version: 7.3.21-k8-NAPI firmware-version: bus-info: 0000:02:01.0 supports-statistics: yes supports-test: yes supports-eeprom-access: yes supports-register-dump: yes supports-priv-flags: no [root@centos6 ~]#modinfo -n e1000 /lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko [root@centos6 ~]#cp /lib/modules/2.6.32- 754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/ [root@centos6 ~]#chroot /mnt/sysroot ~~~
上一篇:第二章启动引导器GRUB2


下一篇:Java寒假学习Day10:Eclipse中的快捷键