Linux系统启动流程、内核及模块管理、linux启动故障排除和自制linux

Linux体系启动流程、内核及模块管理

Linux体系的组成部份组成:内核+根文件体系(kernel+rootfs)
内核(kernel): 过程管理(创立、调度、烧毁等)、内存管理、网络管理(网络协定栈)、驱动程序、文件体系、安全功效
IPC:Inter Process Communication机制
本地过程间通讯机制:消息队列、semerphor、shm(共享内存)
跨主机过程间通讯机制:socket等
运行中的体系环境可分为两层:内核空间、用户空间
内核空间(模式):内核代码(特权级操作–>体系调用)
用户空间(模式):应用程序(过程或线程)

rootfs:程序和glibc
库:函数聚集, function, 调用接口(头文件负责描写)
过程调用: procedure,无返回值
函数调用: function
程序:二进制履行文件

内核设计流派:
单内核(monolithic kernel):把所有功效集成于同一个程序
例如:Linux
微内核(micro kernel):每种功效应用一个单独子体系实现
例如:Windows, Solaris

Linux内核特色:
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,仅是启动OS
Linux:功效丰硕,供给菜单,许可用户选择要启动体系或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把体系掌握权移交给内核
LILO: LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: GRUB Legacy
GRUB 1.X:GRUB2

功效:供给一个菜单,许可用户选择要启动的体系或不同的内核版本;把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把体系掌握权移交给内核;

MBR:Master Boot Record (512bytes)
446bytes: bootloader(引诱加载程序)
64bytes:fat 分区表(文件体系分配表)
2bytes: 55AA(魔数)非55AA为无效
GRUB:
primary boot loader : 1st stage, 1.5 stage
secondary boot loader : 2nd stage,分区文件

kernel:本身初始化
1、探测可辨认到的所有硬件装备
2、加载硬件驱动程序(可能借助于ramdisk加载驱动)
3、以只读方法挂载根文件体系
4、运行用户空间的第一个应用程序:/sbin/init

init程序的类型:
CentOS 5之前:SysV init,
配置文件: /etc/inittab
CentOS 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, 工具程序: mkinitrd
CentOS 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 -r



runlevel
第一位:前一个级别
第二位:后一个级别

init初始化

init读取其初始化文件/etc/inittab决议init程序体系初始化过程当中做甚么?
初始运行级别(RUN LEVEL)
体系初始化脚本
对应运行级别的脚本目录
捕获某个症结字次序
定义UPS电源终端/恢复脚本
在虚拟掌握台生成getty
在运行级别5初始化X

CentOS 5的inittab文件
配置文件: /etc/inittab
每行定义一种action和与之对应的process

格局:
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.sysinit

l0wait:/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 stop
done
for srv in /etc/rc.d/rcN.d/S
; do
$srv start
done

示例:手动编写服务脚本框架

其中
#chkconfig: 2345 50 60
存在此行chkconfig命令才能管理此服务脚本,并且第一组数字:2345为对应运行级别下运行此脚本服务;第二组数字50为开启运行服务脚本的优先级;第三组数字60为关闭停止服务脚本的优先级;
#description:testing service
注释解释必需存在

注意:以上两行必需存在;

chkconfig命令

chkconfig命令管控/etc/init.d/每一个服务脚本在各个级别下的启动或关闭状态
查看服务在所有级别的启动或关闭设定情形:
chkconfig [–list] [name]
示例:

添加:
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

注意:正常级别下,最后启动的一个服务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 on

1respawn:/sbin/mingetty tty1

6respawn:/sbin/mingetty tty6
这里是定义了6个虚拟终端

  1. mingetty会调用login程序;
  2. 打开虚拟终真个程序除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 legacy
grub 2.x: grub2

stage1: 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=0
initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核供给额外文件的ramdisk
注意:initrd的版本号必需和内核完全匹配
boot:引诱启动选定的内核

手动在grub命令行接口启动体系:
c: 命令模式,交互式接口
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot

例如: max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核供给额外文件的ramdisk
boot: 引诱启动选定的内核
cat /proc/cmdline 内核参数
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

grub legacy配置文件
配置文件: /boot/grub/grub.conf
default=#: 设定默许启动的菜单项;落单项(title)编号从0开端
timeout=#:指定菜单项期待选项选择的时长
splashimage=(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的情形下安装grub
grub-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
挂载boot
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot
安装grub
grub-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.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/sysroot

创立一级目录
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir –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/sysimage/*
/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/sysimage
sh-3.1# 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
退出chroot模式:
# exit
挂载寄存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目录下相
应地位便可

内核编译

单内核体系设计、但充足鉴戒了微内核设计体系的长处,为内核引入模块化机制。
内核组成部份:
1)、kernel: 内核核心,通常是bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
2)、kernel object: 内核对象,即内核模块,一般放置于/lib/modules/VERSION-RELEASE/
注意:内核模块与内核核心版本必定要严厉匹配;
编译内核模块时按一下方法定义

注意:有些功效要不编译进内核,要不不编译
3)、帮助性文件,并不是必需,这取决于内核是不是能直接驱动roofs所在的装备;
ramdisk:是一个简装版的根文件体系体系;
initrd
initramfs
目标装备驱动,例如SCSI装备的驱动;
逻辑装备驱动,例如LVM装备的驱动;
文件体系,例如xfs文件体系

内核版本
运行中的内核:
uname命令:
uname – print system information
uname [OPTION]…
-n: 显示主机名称;
-r: 显示VERSION-RELEASE;
-a: 显示所有信息
-v:显示编译版本

内核模块命令
lsmod命令:
显示由核心已装载的内核模块
显示的内容来自于: /proc/modules文件
modinfo命令:
显示模块的详细描写信息
modinfo [ -k kernel ] [ modulename|filename… ]
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author
-d: description
-l: license
-k: 显示指定的内核版本模块
-F: 只显示指定字段(filename、depengds)的信息

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

ramdisk管理
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
示例:

(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:当前生效的主机名
示例:

注意:sysctl命令处置的是/proc/sys目录下配置文件值,因此/proc/sys目录下的 net/ipv4/ip_forward相当于net.ipv4.ip_forward

/sys目录
sysfs:为用户应用的伪文件体系,输出内核辨认出的各硬件装备的相干属性信息,也有内核对硬件特征的设定信息;有些参数是可以修改的,用于调剂硬件工作特征。
udev通过读取/sys此路径下的硬件装备信息(输出的信息动态)为各硬件装备创立文件
udev是运行在用户空间的程序
专用工具: udevadmin, hotplug
udev为装备创立装备文件时,会读取其事前定义好的规矩文件,一般在/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 Development
yum groupinstall Development Tools
yum -y install ncurses…
目标主机硬件装备相干信息
CPU:
#cat /proc/cpuinfo
#lscpu
重要查看信息为vendor_id、model name
#x86info -a
PCI装备:
lspci
-v
-vv
lsusb
-v
-vv
lsblk 块装备
懂得全部硬件装备信息
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/src
cd /usr/src(跳转到/usr/src目录下)
2、生成linux-4.4.21的符号连接linux
ln -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内部):~]#exit

4、配置编译内核自定义的选项
方法一:
make menuconfig(打开文本菜点界面须要ncurses包和ncurses-devel包支撑,同时显示空间有必定要求注意最大化显示框体就好


注意:*号代表编译进内核;M代表编纂成模块;[]代表不编译
也能够应用
方法二:(图象化界面须要体系安装图形界面并且安装桌面平台开发包租Desktop Platform Development)
GONE桌面配合GKT开发环境应用make gconfig
KDE桌面配合QT开发环境应用make xconfig

5、编译(-j #表现启动多个线程编译)默许一个
make -j 2
6、安装内核模块
make modules_install
7、安装内核核心(自动生成grub选项)
make install
8、重启选择新内核
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
该命令会告知你当前应用的内核版本,在登录时候,不能卸载当前的内核,以免造成没法启动的悲剧~~
接下来,如果你是自己动手编译的内核的话,请删除以下文件和文件夹
一、卸载自己编译的内核:

  1. 删除掉/lib/modules/目录下过时的内核库文件
  2. 删除掉/usr/src/kernels/目录下过时的内核源代码
  3. 删除掉/boot目录下启动的核心档案和内核映像
  4. 更改/boot/grub/menu.lst,删除掉不用的启动列表
    KERNEL-VERSION代表你想卸载的内核的版本号

    二、卸载发行版自带的内核。

1、查找内核文件 :dpkg –get-selections|grep linux 。带有image的就是内核文件。
如:linux-image-3.16-amd64 install
2、卸载:sudo apt-get remove linux-image-(接内核版本)

最后必需更新grub :update-grub

练习:
1、破解root口令,并为grub设置保护功效


生成加密密码

注意:此命令可以自定义“盐”
重启后



注意:启动对应内核密码可以选择c(grub命令行模式)

绕开菜单内核启动项,而自己设定一个启动
但是设置内核参数的密码绕不开,只能用救济模式删掉上面加密行才可

2、编写centos5,6的服务脚本
#!/bin/bash
#chkconfig:35 88 22
#description:test service
chkconfig –add testsrv
chkconfig –list testsrv
chkconfig –del testsrv

删除服务


[[email protected] 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.conf

5、破环本机initrm文件,而后在救济模式下修复之

  • 救济模式
  • chroot /mnt/sysimage
  • mkinitrd /boot/initramfs-uname -r.img uname -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/cdrom
mount /dev/cdrom /mnt/cdrom
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –root=/mnt/sysimage –replacepkgs|force
chroot /mnt/sysimage
grub-install /dev/sda
vim /boot/grub/grub.conf

8、分区情形下,删除/boot 和/etc/fstab,恢复之

rm -rf /boot /etc/fstab
光盘启动,进入rescue模式

检讨/
blkid;fdisk -l
mkdir /mnt/sda2
mount /dev/sda2 /mnt/sda2

vi /mnt/sda2/etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
reboot
光盘启动,进入rescue模式,挂载/mnt/sysimage
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
chroot /mnt/sysimage
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –replacepkgs|force
grub-install /dev/sda

vim /boot/grub/grub.conf
default=0
timeout=3
title wanglinux
root (hd0,0)
kernel /vmlinuz…. root=/dev/sda2
initrd /initramfs

重启体系期待修复,进入体系后重新编纂fstab

9、逻辑卷情形下,删除/boot 和/etc/fstab,恢复之

rm -rf /boot /etc/fstab
光盘启动,进入rescue模式
检讨
lvscan
vgchange -ay
mount /dev/vg0/root /mnt/sysimage

vi /mnt/sysimage/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 0

reboot
光盘启动,进入rescue模式,挂载/mnt/sysimage
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
chroot /mnt/sysimage
rpm -ivh /mnt/cdrom/Packages/kernel-2*.rpm –replacepkgs|force
grub-install /dev/sda

vim /boot/grub/grub.conf
default=0
timeout=3
title CentOS6
root (hd0,0)
kernel /vmlinuz…. root=/dev/vg0/root
initrd /initramfs

10、自制Linux体系:
添加硬盘(虚拟机须要扫描)
echo ‘- – -‘ > /sys/class/scsi_host/host2/scan

1)、分区并创立文件体系
fdisk/dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根/
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
2)、挂载boot
mkdir/mnt/boot
mount /dev/sdb1 /mnt/boot

3)、安装grub
grub-install –root-directory=/mnt/ dev/sdb

4)、树立grub.conf:
vim /mnt/boot/grub/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

5)、恢复内核和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

6)、创立一级目录
mkdir/mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
mkdir–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 2

8)、复制bash和相干库文件
9)、复制相干命令及相干库文件
如:ls,cat,vim,reboot,hostname等


关机,新建一个虚拟机并把刚才的新添加的磁盘文件拷到其目录下指定为自:我又失误了,内核参数不对,须要手动去掉/mnt/boot/;同时添加fstab当中的一个default少些一个字母,修改后便可进入体系,但是此体系只是一个流程如果须要正常应用须要应用手工编译安装须要的软件

11、在U盘上定制linux,使其可启动体系和swap分区
与10相似,只是一般须要FAT32格局U盘然后
新建虚拟机辨认u盘直接重启便可

12、编译安装kernel,启用支撑ntfs文件体系功效
[[email protected] ~]# tar -xf linux-4.4.21.tar.xz -C /usr/src/
[[email protected] ~]# cd /usr/src/
[[email protected] src]# ls
debug kernels linux-4.4.21
[[email protected] src]# ln -sv linux-4.4.21 linux
linux" ->linux-4.4.21′
[[email protected] src]# ls
debug kernels linux linux-4.4.21
[[email protected] src]# cd /usr/src/linux
[[email protected] linux]# cp /boot/config-2.6.32-642.el6.x86_64 ./.config
cp: overwrite `./.config’? Y
[[email protected] linux]# make menuconfig
选择ntfs功效
[[email protected] linux]# make

[[email protected] linux]# make modules_install

[[email protected] linux]# make install

[[email protected] linux]# reboot

若/sbin/init损坏则修复方法
临时应急启动
进入启动菜单,a编纂内核参数kernel par后添加init=/sbin/bash以bash过程暂时取代init过程作为第一个启动的过程(可以进行操作,否者操作不了)
注意:以上操作是会触及一些服务的selinux的变更所以须要
如:

有光盘,则可以进入救济模式
分离安装对应版本的init程序包
CentOS5:SysVinit-2.86-15.el5
CentOS6:upstart-0.6.5-16.el6.x86_64
CentOS7:systemd-219-19.el7.x86_64