Linux系统启动流程、内核及模块管理
Linux系统的组成部分组成:内核+根文件系统(kernel+rootfs)
内核(kernel): 进程管理(创建、调度、销毁等)、内存管理、网络管理(网络协议栈)、驱动程序、文件系统、安全功能IPC:Inter Process Communication机制本地进程间通信机制:消息队列、semerphor、shm(共享内存)跨主机进程间通信机制:socket等运行中的系统环境可分为两层:内核空间、用户空间内核空间(模式):内核代码(特权级操作-->系统调用)用户空间(模式):应用程序(进程或线程)rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)过程调用: procedure,无返回值函数调用: function程序:二进制执行文件内核设计流派:
单内核(monolithic kernel):把所有功能集成于同一个程序例如:Linux微内核(micro kernel):每种功能使用一个单独子系统实现例如:Windows, SolarisLinux内核特点:
1、支持模块化: .ko(kernel object 内核对象)如:文件系统,硬件驱动,网络协议等2、支持内核模块的动态装载和卸载内核组成部分:
核心文件: /boot/vmlinuz-VERSION-release(本地版本号)ramdisk(基于内存的磁盘设备(将内存当磁盘用)):辅助的伪根系统CentOS 5: /boot/initrd-VERSION-release.img基于ramdisk磁盘CentOS6,7: /boot/initramfs-VERSION-release.img基于ramddisk文件系统img:磁盘镜像文件模块文件:/lib/modules/VERSION-release例如:/lib/modules/3.10.0-327.el7.x86_64/centos6启动流程
1.加载BIOS的硬件信息,获取第一个启动设备。2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备。4.核型执行init程序并获取运行信息。5.Init执行/etc/rc.d/rc.sysinit文件。6.启动核心的外挂模块(/etc/modprobe.conf)。7.Init执行运行的各个批处理文件(scripts).8.Init执行/etc/rc.d/rc.local.9.执行/bin/login程序,等待用户登录。10.登录之后开始以Shell控制主机。CentOS系统启动流程:
POST: Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、 串并行接口、键盘、 CD-ROM光驱等硬件情况的检测。ROM: BIOS, Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、 开机加电自检程序和系统启动自举程序等。RAM: CMOS互补金属氧化物半导体,保存各项参数的设定Boot Sequence:按次序查找引导设备,第一个有引导程序的设备为本次启动设备bootloader: 引导加载器,引导程序windows: ntloader,仅是启动OSLinux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核LILO: LInux LOaderGRUB: GRand Unified BootloaderGRUB 0.X: GRUB LegacyGRUB 1.X:GRUB2功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;
MBR:Master Boot Record (512bytes)
446bytes: bootloader(引导加载程序)64bytes:fat 分区表(文件系统分配表)2bytes: 55AA(魔数)非55AA为无效GRUB:primary boot loader : 1st stage, 1.5 stagesecondary boot loader : 2nd stage,分区文件kernel:自身初始化
1、探测可识别到的所有硬件设备2、加载硬件驱动程序(可能借助于ramdisk加载驱动)3、以只读方式挂载根文件系统4、运行用户空间的第一个应用程序:/sbin/initinit程序的类型:
CentOS 5之前:SysV init,配置文件: /etc/inittabCentOS 6:Upstart init配置文件: /etc/inittab(基本没用了),/etc/init/*.conf-->决定系统运行级别CentOS 7:Systemd systemd配置文件: /usr/lib/systemd/system//etc/systemd/system/ramdisk:
linux内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问ramdisk --> ramfs 提高速度CentOS 5: initrd, 工具程序: mkinitrdCentOS 6: initramfs, 工具程序: mkinitrd, dracut系统初始化流程(内核级别):POST --> BootSequence (BIOS) -->Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)/sbin/init CentOS6之前
运行级别:为系统运行或维护等目的而设定; 0-6: 7个级别0:关机(shutdown)1:单用户模式(无须认证,root自动登录),(single user), 维护模式2: 多用户模式(multi user),启动网络功能,但不会启动NFS(网络文件系统);维护模式3:多用户模式(multi user),正常完全功能模式;文本界面4:预留级别;目前无特别使用目的,但可同3级别5:多用户模式(multi user),正常完全功能模式;图形界面6:重启默认级别: 3, 5切换级别: init #查看级别: runlevel ; who -rrunlevel第一位:前一个级别第二位:后一个级别init初始化
init读取其初始化文件/etc/inittab决定init程序系统初始化过程中做什么?
初始运行级别(RUN LEVEL)系统初始化脚本对应运行级别的脚本目录捕获某个关键字顺序定义UPS电源终端/恢复脚本在虚拟控制台生成getty在运行级别5初始化XCentOS 5的inittab文件
配置文件: /etc/inittab每一行定义一种action以及与之对应的process[root@station1 ~]# vim /etc/inittab ## inittab This file describes how the INIT process should set up# the system in a certain run-level.## Author: Miquel van Smoorenburg,# Modified for RHS Linux by Marc Ewing and Donnie Barnes## Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)# id:5:initdefault:# System initialization.si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now# When our UPS tells us power has failed, assume we have a few minutes# of power left. Schedule a shutdown for 2 minutes from now.# This does, of course, assume you have powerd installed and your# UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"# If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm -nodaemon
格式:
id:runlevel :action :process字段含义:id:一个任务的标识符runlevel:在那些级别启动此任务;#,###,也可以为空,表示所有级别;action:在什么条件下启动此任务;process:任务;action类型:wait: 等待切换至此任务所在的级别时运行一次respawn:此process终止时,就自动重新启动之initdefault:设定默认运行级别;此时process省略(0,6不可以)sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;例如:
设置系统默认运行级别id:3 : initdefault:设置系统初始化si:: sysinit:/etc/rc.d/rc.sysinitl0wait:/etc/rc.d/rc 0
...l6wait:/etc/rc.d/rc 6/etc/rc.d/rc脚本:接受一个运行级别数字为参数说明: rc N --> 意味着读取/etc/rc.d/rcN.d/K:要停止的服务;K##:##运行次序优先级;数字越小,越先关闭对应服务,关闭服务通常为依赖到别的服务的服务先关闭,后关闭被依赖的服务S:要启动的服务;S##: ##运行次优先级序;数字越小,越先运行对应服务,运行服务通常为被依赖到的服务先运行,依赖到别的服务的服务后运行脚本框架:for srv in /etc/rc.d/rcN.d/K; do$srv stopdonefor srv in /etc/rc.d/rcN.d/S; do$srv startdone示例:手动编写服务脚本框架
[root@CentOS6 ~]# vim /etc/init.d/testsrv#/bin/bash#testsrv service testing script##chkconfig: 2345 50 60#description:testing service#prog=$(basename $0)if [ $# -lt 1 ];thenecho "Usage:$prog {start|stop|status|restart}"exit 1fiif [ "$1" == "start" ];then echo "start $prog finished."elif [ "$1" == "stop" ];then echo "Stop $prog finished."elif [ "$1" == "restart" ];then echo "Restart $prog finished."elif [ "$1" == "status" ];then if pidof $prog &> /dev/null;then echo "$prog is running." else echo "$prog is stopped." fielse echo "Usage:$prog {start|stop|status|restart}" exit 2fi
其中
#chkconfig: 2345 50 60存在此行chkconfig命令才能管理此服务脚本,并且第一组数字:2345为对应运行级别下运行此脚本服务;第二组数字50为开启运行服务脚本的优先级;第三组数字60为关闭停止服务脚本的优先级;#description:testing service注释解释必须存在注意:以上两行必须存在;
chkconfig命令
chkconfig命令管控/etc/init.d/每个服务脚本在各个级别下的启动或关闭状态
查看服务在所有级别的启动或关闭设定情形:chkconfig [--list] [name]示例:[root@CentOS6 ~]# chkconfig --list httpdhttpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)chkconfig --add name能被添加的服务的脚本定义格式之一#!/bin/bash# chkconfig: LLLL NN NN注意:LLLL 表示初始在哪个级别下启动, -表示都不启动 前NN表示启动优先级;后NN表示关闭优先级#description:删除:
chkconfig --del name修改指定的链接类型
chkconfig [--level LEVELS] name --level LEVELS: 指定要设置的级别;省略时表示2345|off|reset>注意:正常级别下,最后启动的一个服务s99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
xinetd管理的服务
service 命令:手动管理服务service 服务 start|stop|restart|status显示所服务的状态
service --status-all瞬态( Transient)服务被xinetd进程所管理进入的请求首先被xinetd代理配置文件: /etc/xinetd.conf、 /etc/xinetd.d/控制/etc/init.d目录下的脚本文件与libwrap.so文件链接用chkconfig控制的服务:例如:chkconfig tftp on1respawn:/sbin/mingetty tty1
...6respawn:/sbin/mingetty tty6这里是定义了6个虚拟终端mingetty会调用login程序;
打开虚拟终端的程序除了mingetty之外,还有诸如getty等;
ntsysv命令
ntsysv命令提供了一个基于文本界面的菜单操作方式,集中管理系统不同的运行等级下的系统服务启动状态。在RedHat各个发行版,CentOS各个版本,都自带这个工具。它具有互动式操作界面,您可以轻易地利用方向键和空格键等,开启,关闭操作系统在每个执行等级中,所要执行的系统服务
语法:ntsysv [--back][--level <等级代号>]参数:--back 在互动式界面里,显示Back钮,而非Cancel钮。--level <等级代号> 在指定的执行等级中,决定要开启或关闭哪些系统服务。实例
输入ntsysv命令后,出现一个交互式的管理菜单,如下:使用空格键选择或者取消选项!系统初始化脚本:/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) 清理操作总结(用户空间的启动流程):/sbin/init(/etc/inittab)
设置默认运行级别-->运行系统初始化脚本,完成系统初始化-->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务-->设置登陆终端[-->启动图形终端]CentOS 6 /etc/inittab和相关文件
init程序为upstart风格,但依然为/sbin/init其配置文件:/etc/init/.conf,/etc/inittab(仅用于定义默认运行级别)注意:.conf为upstart风格的配置文件;其中/etc/inittab仅包含一下内容设置系统默认的运行级别idinitdefault:之后执行以下配置文件
/etc/init/rcS.conf/etc/init/control-alt-delete.conf/etc/init/tty.conf/etc/init/start-ttys.conf/etc/init/rc.conf/etc/init/prefdm.conf总结:
CentOS6启动流程POST-->Boot Sequence(BIOS)-->Boot Loader(MBR)-->Kernel(ramdisk)-->rootfs-->switchroot-->/sbin/init-->(/etc/inittab,/etc/init/*.conf)-->设置默认运行级别-->运行系统初始化脚本,完成系统初始化-->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务-->设置登陆终端[-->启动图形终端]CentOS7
init程序:systemd,配置文件:/usr/lib/systemd/system/,/etc/systemd/system/注意:systemd没有级别概念完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;#systemctl {start|stop|restart|status} name[.service]grub legacy
grub: GRand Unified Bootloader
grub 0.97: grub legacygrub 2.x: grub2stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统stage2:磁盘分区(/boot/grub/)配置文件: /boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区功用:(1) 提供启动菜单、并提供交互式接口a:内核参数e: 编辑模式,用于编辑菜单c: 命令模式,交互式接口(2)加载用户选择的内核或操作系统允许传递参数给内核可隐藏启动菜单(3)为菜单提供了保护机制为编辑启动菜单进行认证为启用内核或操作系统进行认证识别硬盘设备:
(hd#,#)hd#: 磁盘编号,用数字表示;从0开始编号#: 分区编号,用数字表示; 从0开始编号(hd0,0) 第一块硬盘,第一个分区grub的命令行接口
help: 获取帮助列表help KEYWORD: 详细帮助信息find (hd#,#)/PATH/TO/SOMEFILE:root (hd#,#)kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数例如:init=/PATH/TO/init,selinux=0initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk注意:initrd的版本号必须和内核完全匹配boot:引导启动选定的内核手动在grub命令行接口启动系统:
c: 命令模式,交互式接口grub> root (hd#,#)grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICEgrub> initrd /initramfs-VERSION-RELEASE.imggrub> boot例如: max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdiskboot: 引导启动选定的内核cat /proc/cmdline 内核参数内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txtgrub legacy配置文件
配置文件: /boot/grub/grub.confdefault=#: 设定默认启动的菜单项;落单项(title)编号从0开始timeout=#:指定菜单项等待选项选择的时长splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:菜单背景图片文件路径hiddenmenu:隐藏菜单password [--md5] STRING: 启动菜单编辑认证title TITLE:定义菜单项“标题” , 可出现多次root (hd#,#): grub查找stage2及kernel文件所在设备分区;为grub“根”kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件password [--md5] STRING: 启动选定的内核或操作系统时进行认证grub加密
grub-md5-crypt命令破解root口令:启动系统时,设置其运行级别1进入单用户模式:(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);(2) 在选定的kernel后附加1, s, S或single都可以;(3) 在kernel所在行,键入“ b”命令grub安装
安装grub:(1) grub-install安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 ROOT/boot目录下grub-install --root-directory=ROOT /dev/DISK例如:当/dev/sdb1挂载到/mnt/boot的情况下安装grubgrub-install --root-directory=/mnt /dev/sdb(2) grub(注意:hd#,#必须存在grub目录及其文件)
grub > root (hd#,#)grub > setup (hd#)自制linux系统
分区并创建文件系统fdisk /dev/sdb分两个必要的分区/dev/sdb1对应/boot /dev/sdb2对应根 /mkfs.ext4 /dev/sdb1挂载bootmkdir /mnt/bootmount /dev/sdb1 /mnt/boot安装grubgrub-install --root-directory=/mnt /dev/sdb恢复内核和initramfs文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/cp /boot/initramfs-2.6.32-642.el6.x86_64.img/mnt/boot建立grub.conf:vim /mnt/boot/grub.conftitle wanglinuxroot (hd0,0)kernel /vmlinuz-2.6.32-642.el6.x86_64root=/dev/sda2 selinux=0 init=/bin/bashinitrd /initramfs-2.6.32-642.el6.x86_64.imgchroot /mnt/sysroot创建一级目录
mkdir /mnt/sysrootmount /dev/sdb2 /mnt/sysrootmkdir –pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}复制bash和相关库文件复制相关命令及相关库文件如: ls,cat, vim,reboot,hostname等救援环境
在根文件系统无法使用时需要,如/bin/mount删除对系统没有特殊要求从光盘引导( boot.iso或者安装光盘#1)从USB盘(由boot.iso制作)引导文件系统重组Anaconda将会询问是否应该挂载文件系统/mnt/sysp_w_picpath/*/mnt/stage2$PATH包括硬盘的目录文件系统节点提供系统特定的设备文件mknod了解major/minor #’s系统配置文件丢失修复
系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误, Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。有备份文件的回复方法没有备份文件的恢复办法有备份文件的恢复办法:
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、 /boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:sh-3.1# chroot /mnt/sysp_w_picpathsh-3.1# cp /etc/inittab.bak /etc/inittab没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包# chroot /mnt/sysp_w_picpath# rpm -qf /etc/inittabinitscripts-9.03.49-1.el6.centos.x86_64退出chroot模式:# exit挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下):# mount /dev/sr0 /mnt/sourceCentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysp_w_picpath下,需要使用--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/sysp_w_picpath/etc注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysp_w_picpath目录下相应位置即可内核编译
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
内核组成部分:1)、kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;2)、kernel object: 内核对象,即内核模块,一般放置于/lib/modules/VERSION-RELEASE/注意:内核模块与内核核心版本一定要严格匹配;编译内核模块时按一下方式定义注意:有些功能要不编译进内核,要不不编译
3)、辅助性文件,并非必须,这取决于内核是否能直接驱动roofs所在的设备;ramdisk:是一个简装版的根文件系统系统;initrdinitramfs目标设备驱动,例如SCSI设备的驱动;逻辑设备驱动,例如LVM设备的驱动;文件系统,例如xfs文件系统内核版本
运行中的内核:uname命令:uname - print system informationuname [OPTION]...-n: 显示主机名称;-r: 显示VERSION-RELEASE;-a: 显示所有信息-v:显示编译版本[root@station1 ~]# uname -nstation1.example.com[root@station1 ~]# hostnamestation1.example.com[root@station1 ~]# uname -r2.6.18-164.el5[root@station1 ~]# uname -v#1 SMP Tue Aug 18 15:51:54 EDT 2009[root@station1 ~]# uname -aLinux station1.example.com 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux
内核模块命令
lsmod命令:显示由核心已经装载的内核模块显示的内容来自于: /proc/modules文件modinfo命令:显示模块的详细描述信息modinfo [ -k kernel ] [ modulename|filename... ]-n: 只显示模块文件路径-p: 显示模块参数-a: author-d: description-l: license-k: 显示指定的内核版本模块-F: 只显示指定字段(filename、depengds)的信息[root@station1 ~]# modinfo ext4filename: /lib/modules/2.6.18-164.el5/kernel/fs/ext4/ext4.kolicense:GPLdescription:Fourth Extended Filesystemauthor: Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and othersalias: ext4devsrcversion: 5F3DBC78955B31FC1E07EB1depends:jbd2,crc16vermagic: 2.6.18-164.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1module_sig: 883f3504a8b7a0d18758d6145e112de9009c98197d6c75e9511e0f4cdd64f9c1cefe6d41e6209f5e596869bc565ba9a6edbb27a294e906936c4a[root@station1 ~]# modinfo -F alias ext4ext4dev[root@station1 ~]# modinfo -n ext4/lib/modules/2.6.18-164.el5/kernel/fs/ext4/ext4.ko
lsmod |grep xfs ; modinfo xfs
内核模块管理
modprobe命令:语法:modprobe [ -C config-file ] [ modulename ] [ moduleparame-ters... ]配置文件: /etc/modprobe.conf,/etc/modprobe.d/*.conf内核模块动态装载或卸载modprobe [ -r ] modulename...注意:对正在使用的模块不要轻易卸载此命令自动解决依赖关系depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具装载或卸载内核模块:insmod命令
指定模块文件(绝对路径),不自动解决依赖模块insmod [ filename ] [ module options... ]insmodmodinfo –n exportfs
lnsmod modinfo –n xfs
rmmod命令
rmmod [ modulename ]rmmod xfsrmmod exportfsramdisk管理
ramdisk文件的制作:(1) mkinitrd命令为当前正在使用的内核重新制作ramdisk文件mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)--with=:除了默认的模块之外需啊哟装载至initramfs--preload=:initramfs所提供的模块需要预先装载的模块;(2) dracut命令为当前正在使用的内核重新制作ramdisk文件dracut /boot/initramfs-$(uname -r).img $(uname -r)内核信息输出的伪文件系统:/proc、/sys
/proc目录内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出;同时,还提供一个配置接口,proc/sys;参数:只读:输出信息;例如/proc/#/可写:可接受用户指定“新值”来实现对内核某功能或特性的配置:/proc/sys/(仅管理员有写权限)查看:cat /proc/sys/PATH/TO/SOME_KERNEL_FLIE修改设定/proc/sys目录下的(1) sysctl命令用于查看或设定此目录中诸多参数*sysctl -w PATH.TO.SOME_KERNEL_FLIE=VALUE例如:sysctl -w kernel.hostname=mail.magedu.com示例:[root@localhost ~]# sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 0[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1net.ipv4.ip_forward = 1[root@localhost ~]# sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1
(2) echo命令通过重定向方式也可以修改大多数参数的值
echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FLIE例如:echo “websrv” > /proc/sys/kernel/hostname注意:上述两种方式的设定仅当前运行内核有效;
配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf并使用sysctl -p [/path/to/conf_file]重新加载内核参数设置即可永久有效sysctl命令
sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用sysctl可以读取设置超过五百个系统变量。语法sysctl [options] [variable[=value]] [...]sysctl -p [file or regexp] [...]选项-n:打印值时不打印关键字;-e:忽略未知关键字错误;-N:仅打印名称;-w:当改变sysctl设置时使用此项;-p:从配置文件“/etc/sysctl.conf”加载内核参数设置;-a:打印当前所有可用的内核参数变量和值;-A:以表格方式打印当前所有可用的内核参数变量和值。参数变量=值:设置内核参数对应的变量值注意:可以使用sysctl修改系统变量,也可以通过编辑sysctl.conf文件来修改系统变量。sysctl.conf看起来很像rc.conf。它用variable=value的形式来设定值。指定的值在系统进入多用户模式之后被设定。并不是所有的变量都可以在这个模式下设定。 sysctl变量的设置通常是字符串、数字或者布尔型。(布尔型用 1 来表示'yes',用 0 来表示'no')。默认配置文件: /etc/sysctl.conf(1) 设置某参数sysctl -w parameter=VALUE(2) 通过读取配置文件设置参数sysctl -p [/path/to/conf_file]内核中的路由转发:/proc/sys/net/ipv4/ip_forward常用的几个参数:net.ipv4.ip_forward:核心转发功能net.ipv4.icmp_echo_ignore_all:忽略所有ping本机操作vm.drop_caches:手动回收内存功能(值为:0、1、2)kernel.hostname:当前生效的主机名示例:[root@localhost ~]# sysctl -aabi.vsyscall32 = 1crypto.fips_enabled = 0debug.exception-trace = 1debug.kprobes-optimization = 1dev.cdrom.autoclose = 1dev.cdrom.autoeject = 0dev.cdrom.check_media = 0dev.cdrom.debug = 0...[root@localhost ~]# sysctl net.ipv4.ip_forwardnet.ipv4.ip_forward = 1[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward1
注意:sysctl命令处理的是/proc/sys目录下配置文件值,因此/proc/sys目录下的 net/ipv4/ip_forward相当于net.ipv4.ip_forward
/sys目录
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。udev通过读取/sys此路径下的硬件设备信息(输出的信息动态)为各硬件设备创建文件udev是运行在用户空间的程序专用工具: udevadmin, hotplugudev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/及/usr/lib/udev/rules.d/目录下编译内核
程序包的编译安装:
./configure:检查编译环境的依赖关系,并设定编译参数make:执行编译过程(调用工具不是编译工具)make install:安装编译内核前提:
(1) 准备好开发环境(开发工具编译器、开发编译库)头文件:/usr/include(2) 获取目标主机上硬件设备的相关信息(3) 获取目标主机系统功能的相关信息,例如要启用的文件系统例如:需要启用相应的文件系统(4) 获取内核源代码包:www.kernel.org开发环境准备
包组(CentOS 6):Server Platform Development(服务器平台开发)Development Tools(开发工具)注意:还要有ncurses.x86_64包yum groupinstall Server Platform Developmentyum groupinstall Development Toolsyum -y install ncurses...目标主机硬件设备相关信息CPU:#cat /proc/cpuinfo#lscpu主要查看信息为vendor_id、model name#x86info -aPCI设备:lspci-v-vvlsusb-v-vvlsblk 块设备了解全部硬件设备信息hal-device内核编译安装系统
安装开发包组下载源码文件.config:准备文本配置文件make menuconfig:配置内核选项make [-j #]make modules_install:安装模块make install :安装内核相关文件安装bzImage为/boot/vmlinuz-VERSION-RELEASE生成initramfs文件编辑grub的配置文件编译安装内核实例
1、解压缩内核源码包到/usr/src目录tar xf linux-4.4.21.tar.xz -C /usr/srccd /usr/src(跳转到/usr/src目录下)2、生成linux-4.4.21的符号链接linuxln -sv linux-linux-4.4.21 linux(注意:编译内核时和涉及到驱动问题,而驱动查找文件时默认查找/usr/src/linux,所有做链接处理,即标准化又可以支持回滚)cd /usr/src/linux(运行make命令需要此目录为当前目录)3、复制当前内核配置模板文件cp /boot/config-$(uname -r) ./.config注意:在红帽发行版中存在/boot/config-uanme -r
文件,而有些发行版存在/proc/config.gz文件,这些文件为当前使用内核配置文件的模板文件make help(查看make帮助文档主要是挑选相应的命令工具) 为了保证编译安装过程中(比如远程连接中断而导致编译安装失败)稳定,可以使用screen命令开启屏幕会话的方式运行一下命令
screen命令
打开screen:~]#screen拆除screen:Ctrl+a,d列出screen:~]#screen -ls连接至screen:~]#screen -r SCREEN_ID关闭screen(在screen内部):~]#exit4、配置编译内核自定义的选项
方法一:make menuconfig(打开文本菜点界面需要ncurses包以及ncurses-devel包支持,同时显示空间有一定要求注意最大化显示框体就好注意:*号代表编译进内核;M代表编辑成模块;[]代表不编译也可以使用方法二:(图像化界面需要系统安装图形界面并且安装桌面平台开发包租Desktop Platform Development)GONE桌面配合GKT开发环境使用make gconfigKDE桌面配合QT开发环境使用make xconfig5、编译(-j #表示启动多个线程编译)默认一个
make -j 26、安装内核模块make modules_install7、安装内核核心(自动生成grub选项)make install8、重启选择新内核reboot示例:
[root@CentOS6 ~]# tar -xf linux-4.4.21.tar.xz -C /usr/src/[root@CentOS6 ~]# cd /usr/src/[root@CentOS6 src]# lsdebug kernels linux-4.4.21[root@CentOS6 src]# ln -sv linux-4.4.21 linux`linux' -> `linux-4.4.21'[root@CentOS6 src]# lsdebug kernels linux linux-4.4.21[root@CentOS6 src]# cd /usr/src/linux[root@CentOS6 linux]# cp /boot/config-2.6.32-642.el6.x86_64 ./.config cp: overwrite `./.config'? Y[root@CentOS6 linux]# make menuconfig [root@CentOS6 linux]# make...(等吧!)[root@CentOS6 linux]# make modules_install...(继续等吧!)[root@CentOS6 linux]# make install...[root@CentOS6 linux]# reboot以上操作请注意工作目录详细说明编译内核(1) 配置内核选项支持“更新”模式进行配置: make help(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项(b) make menuconfig:基于curses的文本窗口界面(c) make gconfig:基于GTK (GNOME)环境窗口界面(d) make xconfig:基于QT(KDE)环境的窗口界面支持“全新配置”模式进行配置(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置(b) make allyesconfig: 所有选项均回答为“yes“(c) make allnoconfig: 所有选项均回答为"no“(2) 编译全编译:make [-j #]多少线程进行编译编译内核的一部分功能:(a) 只编译某子目录中的相关代码:# cd /usr/src/linux# make dir/(b) 只编译一个特定的模块:# cd /usr/src/linux# make dir/file.ko例如:只为e1000编译驱动:#make drivers/net/ethernet/intel/e1000/e1000.ko(c)如何交叉编译内核:编译的目标平台与当前平台不相同;# make ARCH=arch_name要获取特定目标平台的使用帮助# make ARCH=arch_name help# make ARCH=arm help
(3)在已经执行过编译操作的内核源码树做重新编译:
需要事先清理操作:# make clean:清理大多数编译生成的文件,但会保留config文件等# make mrproper: 清理所有编译生成的文件、config及某些备份文件;# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;卸载内核
首先我们需要查看一下当前使用的是哪个内核:
uname -r该命令会告诉你当前使用的内核版本,在登录时候,不能卸载当前的内核,以免造成无法启动的悲剧~~接下来,如果你是自己动手编译的内核的话,请删除以下文件和文件夹一、卸载自己编译的内核:删除掉/lib/modules/目录下过时的内核库文件
删除掉/usr/src/kernels/目录下过时的内核源代码
删除掉/boot目录下启动的核心档案以及内核映像
更改/boot/grub/menu.lst,删除掉不用的启动列表
KERNEL-VERSION代表你想卸载的内核的版本号二、卸载发行版自带的内核。
1、查找内核文件 :dpkg --get-selections|grep linux 。带有p_w_picpath的就是内核文件。
如:linux-p_w_picpath-3.16-amd64 install2、卸载:sudo apt-get remove linux-p_w_picpath-(接内核版本)最后必须更新grub :update-grub
练习:
1、破解root口令,并为grub设置保护功能生成加密密码
[root@CentOS6 ~]# grub-md5-cryptPassword: Retype password: $1$YS0sz$S214NTNpQKGanvodNDegK/
或者
[root@CentOS6 ~]# openssl passwd -1 -salt "YS0sz"Password: $1$YS0sz$S214NTNpQKGanvodNDegK/
注意:此命令可以自定义“盐”
重启后注意:启动对应内核密码可以选择c(grub命令行模式)绕开菜单内核启动项,而自己设定一个启动但是设置内核参数的密码绕不开,只能用救援模式删掉上面加密行才可2、编写centos5,6的服务脚本
#!/bin/bash#chkconfig:35 88 22#description:test servicechkconfig --add testsrvchkconfig --list testsrvchkconfig --del testsrv[root@CentOS6 rc.d]# vim /etc/rc.d/init.d/testsrv#!/bin/bash#chkconfig:35 80 20#description:test servicecase $1 instart) echo testsrv starting;;stop) echo testsrv stop;;status) echo testsrv status;;*) echo "testsrv start|stop|status";;esac[root@CentOS6 rc.d]# cd ./init.d[root@CentOS6 init.d]# chkconfig --add testsrv[root@CentOS6 init.d]# chkconfig --list testsrvtestsrv 0:off 1:off 2:off 3:on 4:off 5:on 6:off[root@CentOS6 init.d]# ll /etc/rc.d/rc*.d/*testsrv*lrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc0.d/K20testsrv -> ../init.d/testsrvlrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc1.d/K20testsrv -> ../init.d/testsrvlrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc2.d/K20testsrv -> ../init.d/testsrvlrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc3.d/S80testsrv -> ../init.d/testsrvlrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc4.d/K20testsrv -> ../init.d/testsrvlrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc5.d/S80testsrv -> ../init.d/testsrvlrwxrwxrwx. 1 root root 17 Sep 25 15:16 /etc/rc.d/rc6.d/K20testsrv -> ../init.d/testsrv
删除服务
[root@CentOS6 init.d]# chkconfig --del testsrv [root@CentOS6 init.d]# ll /etc/rc.d/rc*.d/*testsrv*ls: cannot access /etc/rc.d/rc*.d/*testsrv*: No such file or directory
或者
[root@CentOS6 init.d]# ntsysv --level=3 #去掉testsrv前的*号3、破坏本机grub stage1,而后在救援模式下修复之
模拟损坏:dd if=/dev/zero of=/dev/sda bs=1 count=446重启自动修复方法二:4、破坏本机grub stage1_5,而后在救援模式下修复之模拟损坏:dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1方法二:注意:方法二修复需要依赖/boot/grub目录下的stage相关文件,如果这些文件有问题则修复无效,所以建议用grub-install修复,若损坏后没重启机器可以直接运行相关命令修复,而不用救援模式如果grub目录不存在的情况下,grub-install修复,但是需要手动编辑grub.conf(修复之后再输入一次),完全重启重新编辑grub.conf5、破环本机initrm文件,而后在救援模式下修复之
救援模式
chroot /mnt/sysp_w_picpath
mkinitrd /boot/initramfs-
uname -r
.imguname -r
exit;exit;reboot
6、修复内核启动参数
然后按b启动7、grub.conf文件丢失损坏
启动后在直接进入grub命令行模式(grub stage1 stage1_5完好的情况下)b键启动等待修复并自动重启再输入一遍上图操作,进入系统后重新建立如下grub.conf文件5、删除vmlinuz和initramfs文件后无法启动,两种方法恢复之
方法一(有光盘进救援模式):注意:新生成的vmlinuz、initramfs的文件名称要与grub.conf中的文件名一直!!!本人在生成initramfs文件时少一个“-”即:initramfs-uanme -r
而失误打成initramfsuanme -r
与grub文件中原initramfs行名称不符重启等待修复完成方法二(无光盘,利用网络模式或者其它介质如U盘的进入救援模式也可):网络中要做好有网络引导启动的服务,ftp服务或http服务等(在之后的课程我们可以学到)此次为用光盘救援模式模拟在本次试验中我的环境有dhcp服务所以无需手动配置ip,而没有则需要我们收到配置完成后依然进入一路默认ok,进shell 6、增加新硬盘,在其上制作能单独运行kernel和bash的系统
7、(1)实验:删除/boot,恢复
rm -rf /boot光盘启动,进入rescue模式mkdir /mnt/cdrommount /dev/cdrom /mnt/cdromrpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm --root=/mnt/sysp_w_picpath --replacepkgs|forcechroot /mnt/sysp_w_picpathgrub-install /dev/sdavim /boot/grub/grub.conf8、分区情况下,删除/boot 和/etc/fstab,恢复之
rm -rf /boot /etc/fstab光盘启动,进入rescue模式检查/blkid;fdisk -lmkdir /mnt/sda2mount /dev/sda2 /mnt/sda2vi /mnt/sda2/etc/fstab/dev/sda1 /boot ext4 defaults 1 1/dev/sda2 / ext4 defaults 1 2reboot光盘启动,进入rescue模式,挂载/mnt/sysp_w_picpathmkdir /mnt/cdrommount /dev/cdrom /mnt/cdromchroot /mnt/sysp_w_picpathrpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm --replacepkgs|forcegrub-install /dev/sdavim /boot/grub/grub.confdefault=0timeout=3title wanglinuxroot (hd0,0)kernel /vmlinuz.... root=/dev/sda2initrd /initramfs重启系统等待修复,进入系统后重新编辑fstab9、逻辑卷情况下,删除/boot 和/etc/fstab,恢复之
rm -rf /boot /etc/fstab光盘启动,进入rescue模式检查lvscanvgchange -aymount /dev/vg0/root /mnt/sysp_w_picpathvi /mnt/sysp_w_picpath/etc/fstab/dev/sda1 /boot ext4 defaults 1 1/dev/vg0/root / ext4 defaults 1 2/dev/vg0/usr /usr ext4 defaults 0 0/dev/vg0/var /var ext4 defaults 0 0reboot光盘启动,进入rescue模式,挂载/mnt/sysp_w_picpathmkdir /mnt/cdrommount /dev/cdrom /mnt/cdromchroot /mnt/sysp_w_picpathrpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm --replacepkgs|forcegrub-install /dev/sdavim /boot/grub/grub.confdefault=0timeout=3title CentOS6root (hd0,0)kernel /vmlinuz.... root=/dev/vg0/rootinitrd /initramfs10、自制Linux系统:
添加硬盘(虚拟机需要扫描)echo '- - -' > /sys/class/scsi_host/host2/scan1)、分区并创建文件系统fdisk/dev/sdb分两个必要的分区/dev/sdb1对应/boot /dev/sdb2对应根/mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdb22)、挂载bootmkdir/mnt/bootmount /dev/sdb1 /mnt/boot3)、安装grubgrub-install --root-directory=/mnt/ dev/sdb4)、建立grub.conf:
vim /mnt/boot/grub/grub.conftitle wanglinuxroot (hd0,0)kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bashinitrd /initramfs-2.6.32-642.el6.x86_64.img5)、恢复内核和initramfs文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot6)、创建一级目录
mkdir/mnt/sysrootmount /dev/sdb2 /mnt/sysrootmkdir–pv/mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}7)、vim /mnt/sysroot/etc/fstab/dev/sda1 /boot ext4 defaults 1 1/dev/sda2 / ext4 defaults 1 28)、复制bash和相关库文件9)、复制相关命令及相关库文件如:ls,cat,vim,reboot,hostname等[root@CentOS6 sysroot]# vim /root/bin/copycmd.sh#!/bin/bashch_root="/mnt/sysroot"[ ! -d $ch_root ] && mkdir $ch_rootbincopy() {if which $1 &>/dev/null; thenlocal cmd_path=`which --skip-alias $1`local bin_dir=`dirname $cmd_path`[ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}[ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}return 0elseecho "Command not found."return 1fi}libcopy() {local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')for loop in $lib_list;dolocal lib_dir=`dirname $loop`[ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir}[ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}done}read -p "Please input a command: " commandwhile [ "$command" != "quit" ];doif bincopy $command ;thenlibcopy $commandfiread -p "Please input a command or quit: " commanddone关机,新建一个虚拟机并把刚才的新添加的磁盘文件拷到其目录下指定为自:我又失误了,内核参数不对,需要手动去掉/mnt/boot/;同时添加fstab当中的一个default少些一个字母,修改后即可进入系统,但是此系统只是一个流程如果需要正常使用需要使用手工编译安装需要的软件
11、在U盘上定制linux,使其可启动系统和swap分区
与10类似,只是一般需要FAT32格式U盘然后新建虚拟机识别u盘直接重启即可12、编译安装kernel,启用支持ntfs文件系统功能
[root@CentOS6 ~]# tar -xf linux-4.4.21.tar.xz -C /usr/src/[root@CentOS6 ~]# cd /usr/src/[root@CentOS6 src]# lsdebug kernels linux-4.4.21[root@CentOS6 src]# ln -sv linux-4.4.21 linuxlinux' ->
linux-4.4.21'[root@CentOS6 src]# lsdebug kernels linux linux-4.4.21[root@CentOS6 src]# cd /usr/src/linux[root@CentOS6 linux]# cp /boot/config-2.6.32-642.el6.x86_64 ./.configcp: overwrite `./.config'? Y[root@CentOS6 linux]# make menuconfig选择ntfs功能[root@CentOS6 linux]# make...[root@CentOS6 linux]# make modules_install...[root@CentOS6 linux]# make install...[root@CentOS6 linux]# reboot 若/sbin/init损坏则修复方法
临时应急启动进入启动菜单,a编辑内核参数kernel par后添加init=/sbin/bash以bash进程暂时代替init进程作为第一个启动的进程(可以进行操作,否者操作不了)注意:以上操作是会涉及一些服务的selinux的变更所以需要如:[root@CentOS6 ~]# ll -Z /sbin/init-rwxr-xr-x. root root system_u:object_r:admin_home_t:s0 /sbin/init[root@CentOS6 ~]# chcon -t init_exec_t /sbin/init[root@CentOS6 ~]# ll -Z /sbin/init-rwxr-xr-x. root root system_u:object_r:init_exec_t:s0 /sbin/init
有光盘,则可以进入救援模式
分别安装对应版本的init程序包CentOS5:SysVinit-2.86-15.el5CentOS6:upstart-0.6.5-16.el6.x86_64CentOS7:systemd-219-19.el7.x86_64