Linux启动流程与内核管理

· Linux组成

· Linux: kernel+rootfs

· kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

· rootfs:程序和glibc

· 库:函数集合, function, 调用接口(头文件负责描述)

· 过程调用:procedure,无返回值

· 函数调用:function

· 程序:二进制执行文件

· 内核设计流派

· 单内核(monolithic kernel):Linux

· 把所有功能集成于同一个程序

· 微内核(micro kernel):Windows, Solaris

· 每种功能使用一个单独子系统实现

· 内核

· Linux内核特点

· 支持模块化:.ko(内核对象)

· 如:文件系统,硬件驱动,网络协议等

· 支持内核模块的动态装载和卸载

· 组成部分

· 核心文件:

· /boot/vmlinuz-VERSION-release

· ramdisk:辅助的伪根系统

· CentOS 5: /boot/initrd-VERSION-release.img

· CentOS 6,7: /boot/initramfs-VERSION-release.img

· 模块文件:

· /lib/modules/VERSION-release

· CentOS6启动流程

· 1、加载BIOS硬件信息,获取第一个启动设备

· POST:Power-On-Self-Test

· 加电自检,是BIOS功能的一个主要部分

· 负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测

· ROM:BIOS,Basic Input and Output System

· 保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等

· RAM:CMOS互补金属氧化物半导体,保存各项参数的设定

· 按次序查找引导设备,第一个有引导程序的设备为本次启动设备

· 2、读取第一个启动设备MBR的引导加载程序(grub)的启动信息

· bootloader: 引导加载器,引导程序

· windows: ntloader

· Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核

· LILO:LInux LOader

· GRUB: GRand Unified Bootloader

· GRUB 0.X: GRUB Legacy, GRUB2

· MBR:

· 446: bootloader, 64: 分区表, 2: 55AA

· GRUB:

· primary boot loader : 1st stage,1.5 stage

· secondary boot loader :2nd stage,分区文件

· 3、加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备

· kernel

· 自身初始化

· 探测可识别到的所有硬件设备

· 加载硬件驱动程序(借助于ramdisk加载驱动)

· ramdisk

· 内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动

· ramdisk --> ramfs 提高速度

· CentOS 5: initrd

· 工具程序:mkinitrd

· CentOS 6,7: initramfs

· 工具程序:mkinitrd, dracut

· ramdisk文件的制作

· (1) mkinitrd命令

· 为当前正在使用的内核重新制作ramdisk文件

mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

· (2) dracut命令

· 为当前正在使用的内核重新制作ramdisk文件

dracut /boot/initramfs-$(uname -r).img $(uname -r)

· 以只读方式挂载根文件系统

· 运行用户空间的第一个应用程序:/sbin/init

· POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)

· 4、核心执行init程序,并获取默认的运行信息

· 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

· 5、init程序执行/etc/rc.d/rc.sysinit文件

· CentOS 5的inittab文件

· 配置文件:/etc/inittab

· 每一行定义一种action以及与之对应的process

· id:runlevel:action:process

· action

· wait: 切换至此级别运行一次

· respawn:此process终止,就重新启动之

· initdefault:设定默认运行级别;process省略

· sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit

· ca::ctrlaltdel:/sbin/shutdown -t3 -r now

· id:3:initdefault:

· si::sysinit:/etc/rc.d/rc.sysinit

· l0:0:wait:/etc/rc.d/rc 0

· l1:1:wait:/etc/rc.d/rc 1...

· l6:6:wait:/etc/rc.d/rc 6

· CentOS 6 /etc/inittab和相关文件

· /etc/inittab

· 设置系统默认的运行级别

· id:3:initdefault

· 示例

· 破解CentOS5和6的root口令

· 启动系统时,设置其运行级别1,进入单用户模式

· (1) 编辑grub菜单(选定要编辑的title,而后使用e命令)

· (2) 在选定的kernel后附加1, s, S或single都可以

· (3) 在kernel所在行,键入“b”命令

· init读取其初始化文件:/etc/inittab

· 初始运行级别(RUN LEVEL)

· 系统初始化脚本

· 对应运行级别的脚本目录

· 捕获某个关键字顺序

· 定义UPS电源终端/恢复脚本

· 在虚拟控制台生成getty

· 在运行级别5初始化X

· /sbin/init CentOS6之前

· 运行级别:为系统运行或维护等目的而设定;0-6:7个级别

· 0:关机

· 1:单用户模式(root自动登录), single, 维护模式

· 2: 多用户模式,启动网络功能,但不会启动NFS;维护模式

· 3:多用户模式,正常模式;文本界面

· 4:预留级别;可同3级别

· 5:多用户模式,正常模式;图形界面

· 6:重启

· 默认级别: 3, 5

· 切换级别:init #

· 查看级别:runlevel ; who -r

· /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)清理操作

· 6、启动核心的外挂模块

· rc N --> 意味着读取/etc/rc.d/rcN.d/

· K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务

· S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

· 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

· chkconfig命令

· 查看服务在所有级别的启动或关闭设定情形:

· chkconfig [--list] [name]

· 添加

· SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)

· chkconfig --add name

· #!/bin/bash

· #LLLL 表示初始在哪个级别下启动,-表示都不启动

· # chkconfig: LLLL nn nn

· 修改指定的链接类型

· chkconfig [--level levels] name <on|off|reset>

· --level LLLL: 指定要设置的级别;省略时表示2345

· 删除

· chkconfig --del name

· ntsysv

· service 命令

· service 服务 start|stop|restart

· service --status-all

· xinetd管理的服务

· 瞬态(Transient)服务被xinetd进程所管理

· 进入的请求首先被xinetd代理

· 配置文件:

· /etc/xinetd.conf

· /etc/xinetd.d/<service>

· 7、init执行运行各个批处理文件(scripts)

· 注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本

· 8、init执行/etc/rc.d/rc.local

· /etc/rc.d/rc.local在指定运行级别脚本后运行

· 不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中

· 9、执行/bin/login程序,等待用户登录

· 1:2345:respawn:/usr/sbin/mingetty tty1

· 2:2345:respawn:/usr/sbin/mingetty tty2

· ...

· 6:2345:respawn:/usr/sbin/mingetty tty6

· mingetty会自动调用login程序

· x:5:respawn:/etc/X11/prefdm-nodaemon

· 10、登录之后开始以Shell控制主机

· 自制Linux系统

· 分区并创建文件系统

· fdisk /dev/sdb

· 两个必要的分区

· /dev/sdb1对应/boot

· /dev/sdb2对应根/

· 挂载boot

· mkdir /mnt/sysimage/boot 子目录必须为boot

· mount /dev/sdb1 /mnt/sysimage/boot

· 安装grub

· grub-install --root=/mnt/sysimage /dev/sdb

· 恢复内核和initramfs文件

· cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/sysimage/boot/

· cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/sysimage/boot

· 建立grub.conf

· vim /mnt/boot/grub.conf

· title wanglinux

· root (hd0,0)

· kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash

· initrd /initramfs-2.6.32-642.el6.x86_64.img

· chroot /mnt/sysimage

· 建立根目录

· mkdir /mnt/sysimage

· mount /dev/sdb2 /mnt/sysimage

· mkdir –pv /mnt/sysimage/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}

· 复制bash和相关库文件

· 复制相关命令及相关库文件

· 如:ls,cat,vim,reboot,hostname等

· Rescue mode

· 在根(边界)文件系统无法使用时需要,如/bin/mount删除

· 对系统没有特殊要求

· 从光盘引导(boot.iso或者安装光盘#1)

· 从USB盘(由boot.iso制作)引导

· 文件系统重组

· Anaconda将会询问是否应该挂载文件系统

· /mnt/sysimage/*

· /mnt/stage2

· $PATH包括硬盘的目录

· mknod了解major/minor

· 系统配置文件丢失修复

· 系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题

· 有备份文件的恢复方法

· 进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行

· chroot /mnt/sysimage

· cp /etc/inittab.bak /etc/inittab

· 没有备份文件的恢复办法

· 如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包

· chroot /mnt/sysimage

· rpm -qf /etc/inittab

· initscripts-9.03.49-1.el6.centos.x86_64

· exit 退出chroot模式

· 挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)

· mount /dev/sr0 /mnt/source

· CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包

· rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm

· 其中的rpm命令选项“--replacepkgs”表示覆盖安装,执行完成后,即已经恢复了此文件

· 如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv./etc/inittab

· cp etc/inittab /mnt/sysimage/etc

· 注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可

· /proc目录

· /proc目录

· 内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出

· 参数

· 只读:输出信息

· 可写:可接受用户指定“新值”来实现对内核某功能或特性的配置

· /proc/sys

· (1) sysctl命令用于查看或设定此目录中诸多参数

· sysctl -w path.to.parameter=VALUE

· sysctl -w kernel.hostname=mail.magedu.com

· (2) echo命令通过重定向方式也可以修改大多数参数的值

· echo "VALUE" > /proc/sys/path/to/parameter

· echo “websrv” > /proc/sys/kernel/hostname

· sysctl命令

· 默认配置文件:/etc/sysctl.conf

· (1) 设置某参数

· sysctl -w parameter=VALUE

· (2) 通过读取配置文件设置参数

· sysctl-p [/path/to/conf_file]

· (3) 查看所有生效参数

· sysctl-a

· 常用的几个参数

· net.ipv4.ip_forward

· net.ipv4.icmp_echo_ignore_all

· vm.drop_caches

· /sys目录

· sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;

· 有些参数是可以修改的,用于调整硬件工作特性

· udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序

· udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下

· 内核编译

· 单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制

· 内核组成部分:

· kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSIONRELEASE

· kernel object: 内核对象,一般放置于/lib/modules/VERSION-RELEASE/

· [ ]: N

· [M]: M

· [*]: Y

· 辅助文件

· initrd

· initramfs

· 内核版本

· 运行中的内核

· uname命令

· uname - print system information

· uname [OPTION]...

· -n: 显示节点名称;

· -r: 显示VERSION-RELEASE;

· -a:显示所有信息

· 内核模块命令

· lsmod命令

· 显示由核心已经装载的内核模块

· 显示的内容来自于: /proc/modules文件

· modinfo命令

· 显示模块的详细描述信息

· modinfo [ -k kernel ] [ modulename|filename... ]

· -n: 只显示模块文件路径

· -p: 显示模块参数

· -a: author

· -d: description

· -l: license

· lsmod |grep xfs;modinfo xfs

· modprobe命令

· 装载或卸载内核模块

· modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]

· 配置文件:

· /etc/modprobe.conf,

· /etc/modprobe.d/*.conf

· modprobe [ -r ] modulename...

· depmod命令

· 内核模块依赖关系文件及系统信息映射文件的生成工具

· insmod命令:指定模块文件,不自动解决依赖模块

· insmod [ filename ] [ module options... ]

· insmod `modinfo –n exportfs`

· lnsmod `modinfo –n xfs`

· rmmod命令:卸载模块

· rmmod [ modulename ]

· rmmod xfs

· rmmod exportfs

· 编译内核

· 准备

· (1) 准备好开发环境

· 包组(CentOS 6):

· Server Platform Development

· Development Tools

· openssl-devel

· (2) 获取目标主机上硬件设备的相关信息

· CPU:

· #cat /proc/cpuinfo

· #x86info -a

· #lscpu

· PCI设备

· lspci

· -v

· -vv

· lsusb

· -v

· -vv

· lsblk 块设备

· 了解全部硬件设备信息

· hal -device (centos 6)

· (3) 获取目标主机系统功能的相关信息

· 例如:需要启用相应的文件系统

· (4) 获取内核源代码包

· www.kernel.org

· .config:准备文本配置文件

· make menuconfig:配置内核选项

· make [-j #]

· make modules_install:安装模块

· make install :安装内核相关文件

· 安装bzImage为/boot/vmlinuz-VERSION-RELEASE

· 生成initramfs文件

· 编辑grub的配置文件

· 如何交叉编译内核

· 编译的目标平台与当前平台不相同

· make ARCH=arch_name

· 要获取特定目标平台的使用帮助

· make ARCH=arch_name help

· make ARCH=arm help

· 在已经执行过编译操作的内核源码树做重新编译

· 需要事先清理操作:

· make clean:清理大多数编译生成的文件,但会保留config文件等

· make mrproper: 清理所有编译生成的文件、config及某些备份文件

· make distclean:mrproper、patches以及编辑器备份文件

· 卸载内核

· 删除/lib/modules/目录下不需要的内核库文件

· 删除/usr/src/linux/目录下不需要的内核源码

· 删除/boot目录下启动的内核和内核映像文件

· 更改grub的配置文件,删除不需要的内核启动列表

 


猜你喜欢

转载自blog.51cto.com/10198350/2134533
今日推荐