CentOS 5和6的启动流程:
Linux:kernel+rootfs
kernel:进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能
rootfs:
glibc
库:函数集合,function,调用接口
过程调用:procedure
函数调用:function
程序
内核设计流派:
单内核设计:Linux
把所有功能集成于同一个程序
微内核设计:Windows,Solaris
每种功能使用一个单独子系统实现
Linux内核特点:
支持模块化:.ko
支持模块的动态装载和卸载:
组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:
CentOS 5 :/boot/initrd-VERSION-release.img
CentOS 6 :/boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
CentOS 系统启动流程:
POST:加电自检
ROM:CMOS
BIOS:Basic Input and Output System
ROM+RAM
BOOT Sequence:
按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备
BootLoader:引导加载器,程序
Windows:ntloader
Linux:
LILO:LInux LOader
GRUB:GRand Uniform Bootloader
GRUB 0.x:GRUB Legacy
GRUB 1.x:GRUB2
功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本;把用户选定的内核装载到内存的特定空间中,解压展开,并把系统控制权移交给内核
MBR:
446:bootloader
64:fat
2:55AA
GRUB:
bootloader:1st stage
disk:2nd stage
kernel:
自身初始化
探测可识别到的所有硬件设备
加载硬件驱动程序(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序/sbin/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
ramdisk:
内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk --> ramfs
CentOS 5:initrd,工具程序:mkinitrd
CentOS 6:initramfs,工具程序:mkinitrd,dracut
系统初始化:
POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) -->rootfs(只读) --> init
/sbin/init
CentOS 5:
运行级别:为了系统的运行或维护等应用目的而设定
0-6:7个级别
0:关机
1.单用户模式(root,无需登录),single,维护模式
2.多用户模式,会启动网络功能,但不会启动NFS:维护模式
3.多用户模式,正常模式:文本界面
4.预留级别:可同3级别
5.多用户模式,正常模式:图形界面
6.重启系统
默认级别:
3,5
切换级别:
init #
查看级别:
runlevel
who -r
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process
action:
wait:切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别:process省略
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
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
说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/
K*:K##*:##运行次序,数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*:S##*:##运行次序,数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
for srv in /etc/rc.d/rc0.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc0.d/S*;do
$srv start
done
chkconfig命令:
查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
chkconfig --add name
#!/bin/bash
#
#chkconfig: LLLL nn nn
删除:
chkconfig --del name
修改其指定的链接类型:
chkconfig [--level levels] [--type type] name <on|off|reset>
--level LLLL:指定要设置的级别;省略时表示2345
注意:正常级别下,最后启动一个服务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.sysinit:系统初始化脚本
1.设置主机名
2.设置欢迎信息
3.激活udev和selinux
4.挂在/etc/fstab文件中定义的文件系统
5.检测根文件系统,并以读写方式重新挂载根文件系统
6.设置系统时钟
7.激活swap设备
8.根据/etc/stsctl.conf文件设置内核参数
9.激活lvm及software raid设备
10.加载额外设备的驱动程序
11.清理操作
总结:/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本,完成系统初始化 --> 关闭对应需要关闭的服务,启动需要启动服务 --> 设置登录终端
CentOS 6:
init程序为:upstart,其配置文件
/etc/inittab,/etc/init/*.conf
注意:/etc/init/*.conf文件语法,遵循upstart配置文件语法格式
博客作业:系统启动流程
启动系统时,设置其运行级别为1
GRUB(Boot Loader):
grub:GRand Unified Bootloader
grub 0.x:grub legacy
grub 1.x:grub 2
grub legacy:
stage1:mbr
stage1_5:mbr之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统
stage2:磁盘分区(/boot/grub)
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区:
功用:
1.提供菜单,并提供交互式接口
e:编辑模式,用于编辑菜单
c:命令模式,交互式接口
2.加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
3.为菜单提供保护机制
为编辑菜单进程认证
为启用内核或操作系统进行认证
如何识别设备:
(hd#,#)
hd#:磁盘编号,用数字表示,从0开始编号
#:分区编号,用数字表示,从0开始编号
(hd0,0)
grub的命令行接口:
help:获取帮助列表
help KEYWORD:详细帮助信息
find (hd#,#)/PATH/TO/SOMEWHERE
root (hd#,#):设置根分区
kernel /PATH/TO/KERNEL_FILE:设定本次启动时用到的内核文件,额外还可以添加许多内核支持使用的cmdline参数
例如:init=/path/to/init,selinux=0
initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核
手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
配置文件:/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-md5-crypt:生成加密的密码
进入单用户模式:
1.编辑grub菜单(选定要编辑的title,而后使用e命令)
2.在选定的kernel后附加
1,s,S或single都可以
3.在kernel所在行,键入b命令
安装grub:
1.grub-install
grub-install --root-directory=ROOT /dev/DISK
2.grub
grub> root(hd#,#)
grub> setup(hd#)
练习:
1.新加硬盘,提供直接单独运行bash系统
2.破坏本机grub stage1,而后在救援模式下修复
3.为grub设置保护功能
Linux kernel:
单内核体系设计,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
内核组成部分:
kernel:内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE
kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/
[ ]:N
[M]:M
[*]:Y
辅助文件:ramdisk
initrd
initramfs
运行中的内核:
uname命令:
uname - print system information
uname [OPTION]...
-n:显示节点名称
-r:显示VERSION-RELEASE
模块:
lsmod命令:
显示由核心已经装载的内核模块
显示的内容来自:/proc/modules
modinfo命令:
显示模块的详细描述信息
modinfo [ -k kernel ] [ modulename|filename... ]
-n:只显示模块文件路径
-p:显示模块参数
-a:author
-d:description
-l:license
modprobe命令:
装载或卸载内核模块
modprobe [ -C config-file ] [ modulename ] [ module parameters... ]
配置文件:/etc/modprobe.conf ,/etc/modprobe/*.conf
modprobe [ -r ] modulename...
depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具
装载或卸载内核模块:
insmod
insmod [ filename ] [ module options... ]
rmmod
rmmod [ modulename ]
/proc目录:
内核把内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
参数:
只读:输出信息
可写:可接受用户指定"新值"来实现对内核某功能或特性的配置
/proc/sys
1.sysctl命令用于查看或设定此目录中诸多参数
sysctl -w path.to.parameter=VALUE
2.echo命令通过重定向的方式也可以修改大多数参数的值
echo "VALUE" > /path/to/parameter
sysctl命令:
配置文件:/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
vm.drop_caches
kernel.hostname
/sys目录:
sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以调优的,用于调整硬件工作特性
udev通过此路径下输出的信息动态为各设备创建所需要设备文件;udev是运行用户空间程序;专用工具:udevadmin,hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
ramdisk文件的制作:
1.mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
mkinitrd initramfs-$(uname -r).img $(uname -r)
2.dracut命令
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
编译内核:
前提:
1.准备好开发环境
2.获取目标主机上硬件设备的相关信息
3.获取到目标主机系统功能的相关信息,例如要启动的文件系统
4.获取内核源代码包
www.kernel.org
准备开发环境:
包组:
Server Platform Development
Development tools
目标主机硬件设备相关信息:
CPU:
cat /proc/cpuinfo
x86info -a
lscpu
PCI设备:
lspci
-v
-vv
lsusb
-v
-vv
lsblk
了解全部硬件设备信息
hal-device
简单依据模板文件的制作过程:
tar xf linux-3.10.105.tar.xz -C /usr/src
cd /usr/src
ln -sv linux-3.10.105 linux
cd linux
cp /boot/config-$(uname -r) ./.config
make menuconfig
screen
make -j #
make modules_install
make install
init 6
练习:编译好并启用
回顾:内核组成部分,内核编译
内核组成部分:
核心,模块
核心:/boot/vmlinuz-VERSION-RELEASE
模块:/lib/modules/VERSION-RELEASE
模块管理的相关命令:
lsmod,modinfo,modprobe [-r],insmod,rmmod,depmod
内核编译:
[ ]
[*]
[M]
Linux内核编译(2):
编译内核的步骤:
1.配置内核选项
1.make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
2.make menuconfig:基于curses的文本窗口界面
3.make gconfig:基于GTK开发环境的窗口界面
4.make xconfig:基于Qt开发环境的窗口界面
支持全新配置模式进行配置:
1.make defconfig:基于内核为目标平台提供的默认配置进行配置
2.make allnoconfig:所有选项均回答为no
2.编译
make [-j #]
如何只编译内核中的一部分功能:
1.只编译某子目录中的相关代码
cd /usr/src/linux
make dir/
2.只编译一个特定的模块:
cd /usr/src/linux
make dir/file.ko
例如:只为e1000编译驱动
make drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉编译内核:
编译的目标平台与当前平台不相同:
make ARCH=arch_name
要获取特定目标平台的使用帮助:
make ARCH=arch_name help
如何在已经执行过编译操作的内核源码树做重新编译:
事先清理操作:
make clean:清理大多数编译生成的文件,但会保留config文件等
make mrproper:清理所有编译生成的文件,config及某些备份文件
make distclean:mrproper,patches以及编辑器备份文件
screen命令:
打开新的screen
screen
退出并关闭screen:
exit
剥离当前screen:
ctrl+a,d
显示所有已经打开的screen:
screen -ls
恢复某screen
screen -r [SESSION]
CentOS系统安装:
BootLoader --> kernel(initramfs) --> rootfs --> /sbin/init
anaconda安装程序:
tui:基于curses的文本窗口
gui:图形窗口
CentOS的安装程序启动过程:
MBR:boot.cat
stage2:isolinux/isolinux.bin
配置文件:isolinux/isolinux.cfg
每个对应的菜单选项:
加载内核:isolinux/vmlinuz
向内核传递参数:append initrd=initrd.img ...
装载根文件系统,并启动anaconda
默认启动GUI接口
若是显式指定使用TUI接口:
向内核传递"text"参数即可
boot:linux text
注意:上述内容一般应位于引导设备,而后续的anaconda及其安装用到的程序包等有几种方式可用:
本地光盘
本地硬盘
ftp server:yum repository
http server:yum repository
nfs server
如果想手动指定安装源:
boot: linux method
anaconda应用的工作过程:
安装前配置阶段:
安装过程使用的语言
键盘类型
安装目标存储设备:
basic storage
特种设备:iSCSI
设定主机名
配置网络接口
设定分区方式及MBR的安装位置
语言
时区
管理员密码
创建普通用户
选定要安装的程序包
安装阶段:
在目标磁盘创建分区,执行格式化操作等
将选定的程序包安装至目标位置
安装BootLoader
首次启动:
iptables
selinux
core dump
anaconda的配置方式:
1.交互式配置方式
2.通过读取事先给定的配置文件自动完成配置
按特定语法给出的配置选项:
kickstart文件:
安装引导选项:
boot:
text:文本安装方式
method:手动指定使用的安装方法
与网络相关的引导选项:
ip=IPADDR
netmask=MASK
gateway=GW
dns=DNS_SERVER_IP
ifname=NAME:MAC_ADDR
与远程访问功能相关的引导选项:
vnc
vncpassword='PASSWORD'
指明kickstart文件的位置:
ks=
DVD drive: ks=cdrom:/PATH/TP/KICKSTART_FILE
Hard dirve: ks=hd:/device/drectory/KICKSTART_FILE
HTTP server: ks=http://host:port/path/to/KICKSTART_FILE
FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE
HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
启动紧急救援模式:
rescue
官方文档: Installation Guide
kickstart文件的格式:
命令段:指明各种安装前配置,如键盘类型等
程序包段:指明要安装的程序包组或程序包,不安装的程序包等
%packages
@grou_name
package
-package
%end
脚本段:
%pre:安装前脚本
运行环境:运行于安装介质上的微型Linux环境
%post:安装后脚本
运行环境:安装完成的系统
命令段中的命令:
必给命令:
auth:认证方式
BootLoader:BootLoader的安装位置及相关配置
keyboard:设定键盘类型
lang:语言类型
part:创建分区
rootpw:指明管理员的密码
timezone:时区
可选命令:
install OR upgrade
text:文本安装界面
network
firewall
selinux
halt
poweroff
reboot
repo
user:安装完成后为系统创建新用户
url:指明安装源
创建kickstart文件的方式:
1.直接手动编辑
依据模板修改
2.可使用创建工具:system-config-kickstart (CentOS 6)
检查ks文件的语法错误:ksvalidator
ksvalidator /PATH/TO/KICKSTART_FILE
创建引导光盘:
mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.5 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/
回顾:CentOS系统安装
kickstart文件:
命令段
必备:authconfig,bootloader...
可选:firewall,selinux...
程序包段
%packages
@group_name
package
-package
%end
脚本段
%pre
...
%end
%post
...
%end
创建工具:system-config-kickstart
语法检查:ksvalidator
安装过程如何获取kickstart文件:
DVD:cdrom:/PATH/TO/KS_FILE
HTTP:http://
SELinux:
SELinux:secure enhanced linux,工作于Linux内核中
DAC:自主访问控制
MAC:强制访问控制
SELinux有两种工作级别:
strict:每个进程都受到selinux的控制
targeted:仅有限个进程受到selinux控制
只监控容易被入侵的进程
sandbox:
subject operation object
subject:进程
object:进程,文件
文件:open,read,write,close,chown,chmod
subject:domain
object:type
SELinux为每个文件提供了安全标签,也为进程提供了安全标签
user:role:type
user:SELinux的user
role:角色
type:类型
SELinux规则库:
规则:哪种域能访问哪种或者哪些种类型内文件
配置SELinux:
SELinux是否启用:
给文件重新打标:
设定某些布尔特性:
SELinux的状态:
enforcing:强制,每个受限的进程都必然受限
permissive:启用,每个受限的进程违规操作不会被禁止,但会被记录于审计日志
disabled:关闭
相关命令:
getenforce:获取selinux当前状态
setenforce 0|1
0:设置为permissive
1:设置为enforcing
此设定:重启系统后无效
配置文件:/etc/sysconfig/selinux,/etc/selinux/config
SELinux={disable|enforcing|permissive}
给文件重新打标:
chcon
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
-R:递归打标
还原文件的默认标签:
restorecon [-R] /path/to/somewhere
布尔型规则:
getsebool
setsebool
getsebool命令:
getsebool [-a] [boolean]
setsebool命令:
setsebool [-P] boolean value | bool1=val1 bool2=val2 ...
bash脚本编程:
编程语言:
数据结构
顺序执行
选择执行
条件测试
运行命令或[[ EXPRESSION ]]
执行状态返回值
if
case
循环执行
将某代码段重复运行多次
重复运行多少次?
循环次数事先已知
循环次数事先未知
必须有进入条件和退出条件
for,while,until
函数:结构化编程及代码重用
function
for循环语法:
for NAME in LIST;do
循环体
done
列表生成方式:
1.整数列表
{start..end}
$(seq start [[step]end])
2.glob
/etc/rc.d/rc3.d/K*
3.命令
通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态
#!/bin/bash
net='192.168.1'
uphosts=0
downhosts=0
for i in {1..200};do
ping -c 1 -w 1 ${net}.${i} &> /dev/null
if [ $? -eq 0 ];then
echo "${net}.${i} is up."
let uphosts++
else
echo "${net}.${i} is down."
let downhosts++
fi
done
echo "up hosts:$uphosts"
echo "down hosts:$downhosts"
while循环:
while CONDITION;do
循环体
done
CONDITION:循环控制条件,进入循环之前,先做一次判断,每一次循环之后会再次做判断
条件为true,则执行一次循环;直到条件测试状态为false终止循环
因此:CONDITION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
示例:求100以内正整数之和
#!/bin/bash
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
let sum+=$i
let i++
done
echo $sum