系统启动和内核管理
Linux组成
Linux:kerne+rootfs(应用程序)
kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
roots:程序和glibc
函数:相当于命令的集合
库:函数集合,function,调用接口(头文件负责描述)
过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件
内核设计:
单内核(monolithic kernel):Linux
把所有功能集成于一个同一个程序
微内核(micro kernel):Windows,Solaris
每种功能使用一个单独子系统实现
内核
Linux内核特点:
支持模块化:.ko(内核对象)
如:文件系统,硬件驱动,网络协议等
支持内核模块的自动化的装载和卸载
组成部分:
核心文件:/boot/vmlinuz-VERSION-release(存放着最重要的一些文件)
ramdisk:辅助的伪文件系统
Centos5;/boot/initrd-VERSION-release.img
Centos6,7:/boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release(大部分功能模块)
/lib/modules(存放着大部分的驱动)
Centos6启动过程
POST加电启动检查→MBR引导→GRUB→加载内核
启动流程:
POST:Power-On-Self-Test
ROM(只读):BIOS,保存着有关计算机系统重要的基本输入输出程序,加电就会运行这些程序,系统信息设置,开机加电自检程序等
RAM(此处不代表内存):断电也不会丢失RAM中的数据,因为主板有电池,在BIOS中调整的顺序会保存在此处
按次序查找引导设备,第一个有引导程序的设备为本次启动设备(可在BIOS中调整)
bootloader:引导加载器(用来启动计算机的一段儿程序),引导程序
windows:ntloader,仅仅是启动OS,只可以启动Windows
Linux:早期用LILO(LInux LOader只能用来引导Linux)来引导Linux,grub引导Linux也可以引导Windows
GRUB:GRand Unified Bootloader
GRUB 0.X:老版本
MBR:
446:bootloader(grub的第一阶段),64:分区表,2:55AA
GRUB:
primary boot loader:1st stage(grub的第一阶段)
1.5 stage(用来读取boot分区的文件系统驱动)两者都是以二进制方式存储
读取文件系统驱动,用initramfs-VERSION-release中的文件来读取文件系统驱动;
Centos5 ramdisk:模拟了一块儿磁盘,还需将模拟的磁盘转换为文件系统再转换为磁盘
Centos6 ramfs:直接给了一个文件系统,通过文件系统访问磁盘
系统初始化
POST-->BootSequence(BIOS)-->Bootloader(MBR)-->kernel(ramdisk)-->rootfs(只读)-->init(systemd)
ramdisk文件制作:
mkinitrd "文件名(最好是原名)`uname -r`.img" `uname -r`(为当前正在使用的内核重新制作ramdisk文件)
init程序的类型
SysV:init,Centos 5之前
配置文件/etc/inittab
Upstart:init,Centos6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
开机启动流程:
post
mbr boot loader grub
/boot/vmlinxz
/boot/initramfs.
/sbin/init
/etc/inittab
/etc/rcN.d/ --> /etc/init.d/xxx
/etc/rc.d/rc.local
login
模式(在/etc/inittab中调整开机模式):
0:关机
1:单用户模式
2:多用户模式,不具有NFS功能
3:多用户模式(跟2几乎相同,并且是字符界面)
4:未使用,暂时没用上
5:图形界面
6:重启
默认级别:3,5
切换级别:init #
查看级别:runlevel
Centos 5的配置文件:/etc/inittab
ntsysv查看开机启动的程序
chkconfig --list "程序名称"
--add 添加到开机启动的服务
"程序名称" on 开机启动
--del "程序名称" 删除服务开机启动
(1)默认模式定义
(2)系统初始化脚本
(3)运行模式对应的脚本
/etc/rc#.d/下存放了S开头的一系列启动文件,数值越小,启动优先级最高;
同时存放了K开头的一系列停止文件,数值越小,关闭优先级越高
/etc/rc#.d/S99local作用是写开机要做的事情
/etc/rc.d/rc.local中放的内容是随着服务器开机启动而启动
xinetd管理的服务
瞬态:服务被xinetd进程所管理
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/
当/boot目录下的vmlinux文件丢失的时候,可以使用光盘救援模式将光盘中isolinux下的vmlinux改名并复制到/boot目录下即可
cp /mnt/cdrom/isolinux/vmlinux /mnt/sysimage/vmlinux-`uname -r`即可
当/boot目录丢失的时候进入救援模式执行
rpm -ivh /mnt/cdrom/Package/kernel-xxxxxx --force --root=/mnt/sysimage/
grub legacy
grub
stage1:mbr
stage1_5(1.5阶段):mbr之后的扇区
grub.conf(grub的配置文件)
/etc/grub.conf中指明了根分区的位置,找到了根文件之后就可以找到/下面的一系列进程,然后进行启动
安装grub
(1)grub-install
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下
grub-install [--root-directory=DIR](指定grub安装的位置的父目录) /dev/DISK 440个字节的修复方法 grub-install /dev/sda
(2)grub(交互式命令,hd写的是boot挂载点的第几块硬盘,hd0,0就是第一块硬盘的第一个分区)
root(hd#,#)
setup(hd#)
破解root口令(必须要在服务器面前)
(1)启动过程中出现选择菜单后输入"a"在后方输入1进入单用户模式
(2)进入后passwd root设置新密码
(3)在/etc/grub.conf文件中追加"password fang"则是将进入单用户模式加为明文密码
grub-md5-crypt可生成随机md5密码,将生成的随机密码复制到/etc/grub.conf中password后面则是将进入单用户模式加密
grub-crypt生成随机密码,将生成的随机密码复制到/etc/grub.conf中的password -encrypted 后方
启动口令:/etc/grub.conf启动的菜单下面添加password -encrypted "生成的随机密码"可将启动也添加上密码
配置文件:/boot/grub/grub.conf
default=#:设定默认启动的菜单项;
timeout=#:指定菜单项等待选项选择的时长
splashimage(hd#,#)/PATH/XPM_FILE:菜单背景图片
password:启动菜单编辑设定密码
hiddenmenu:隐藏菜单
title:定义菜单项标题
root(hd#,#):查找stage2及kernel文件所在设备分区;
kernel:为grub的根kernel "内核包位置"
initrd "内核匹配的ramfs文件"
/proc目录:
存放一系列进程文件
参数:只读:输出信息
/proc/sys
sysctl -a:所有正在生效的设置
sysctl -w:修改指定的某一行数据,修改后的数据会存放在内存中,重启后会还原
sysctl -p:读取/etc/sysctl.conf文件,是修改生效,当文件中不存在某行的时候,就会与内村中定义的同步
常用参数:
net.ipv4.forward:管理路由功能是否开启0为开启,1为关闭
net.ipv4.icmp_echo_ignore_all:不允许别的主机ping自身
vm.drop_caches:将此值改为1则是释放缓存内存
/sys目录:
存放一系列与硬件相关的主要内容
编译安装内核
内核组成部分:
kernel,内核核心,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE
kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE
[ ]:Not set(没有启用)
[M]:m(以模块方式存在的,并为独立文件)
[*]:y(存放到vmlinuz中了,不为独立文件了)
内核版本
运行中的内核:
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 查看xfs模块是否运行,并且查看详细信息
modprobe命令(自动解决依赖关系):
装载或卸载内核模块
modprobe
-r:卸载模块,并且模块之间是存在依赖性的,驱动消失后,硬件也就消失了
配置文件:/etc/modprobe.conf或者是/etc/modprobe.d/*.conf
depmod命令:
设置模块之间的依赖关系
装载或卸载内核模块:
insmod命令:指定模块文件,不会自动解决依赖模块
insmod [ filename ] [ module options ]
insmod `modinfo -n exportfs`(将反撇号中的执行结果用insomod加载)
rmmod命令:卸载模块
rmmod [ modulename ]
编译内核
1 从www.kernel.org下载要编译的内核文件
2 安装Development Tools组
3 .config:准备文本配置文件,可以将系统上已有的config-3.10.0-693.el7.x86_64文件修改为.config文件编辑
4 make menuconfig:配置内核选项,此命令是一个菜单,菜单中"--->"说明后方还有子菜单
[ ]:Not set(没有启用)
[M]:m(以模块方式存在的,并为独立文件)
[*]:y(存放到vmlinuz中了,不为独立文件了)
5 make [ -j #]( -j 指定CPU核数)会在/lib下生成一个编译的版本的目录
6 make modules_install:安装模块,相当于安装了lib/modules目录
7 make install:安装内核相关文件