Linux硬件与服务
Linux
1 Linux磁盘管理与磁盘结构
运算器 存储器(内部存储器 RAM 易失性存储器) I/O输入输出
外部存储器:U盘 光盘 软盘 硬盘 磁带等
I/O 磁盘:机械式硬盘
接口:IDE SATA iSCSI接口
磁盘的组成结构
盘片 Platers(存储数据的设备),轴 Spindle,利用轴组成同心圆;马达(数据记录时候提供高速旋转的动力),磁头(读写头,伸缩臂)
盘片的逻辑结构
默认硬盘有四个盘片,最靠近中心的为0盘片,一个盘片有两面,双读取,上为0,下为1,依次排布,一般一个磁盘有四个盘片;多盘片并行存取存储到不同盘片的相同编号的磁道上引用
磁道:盘片以轴为中心组成的同心圆;
扇区:磁道被分为多个扇区;
柱面:不同盘片上相同编号的磁道组成一个柱面
磁盘延时(寻址时间):磁头从一个位置到一个位置需要时间;盘片高速旋转定位也需要时间;硬盘以转速速度越快,寻址时间越短,运行速度越快;磁头是悬浮在盘片之上,距离只有几微米。笔记本5400转/min,台式机7200/min
分区格式化
MBR:主引导记录,位于0磁道0柱面1扇区,512字节,三部分组成,分别是 446字节的boot loader(启动加载器,存放引导代码),64字节磁盘分区表,2字节magic number(检查MBR是否有效)
ROM:开机自检,自检ROM中的BIOS;检查硬盘,将boot loader 复制加载到内存中,同时把磁盘分区表,读取分区表和分区上的操作系统。
磁盘分区表指向不同的地方,称为扩展分区,只能由一个;原来的四个分区叫主分区;
主分区+扩展分区 <= 4
扩展分区extended:只能有一个,16字节,扩展分区是一个指针,指向磁盘另外的位置,不能直接存储数据
逻辑分区logical :逻辑分区组成extended
实例说明:
默认使用 MBR 分区方式的情况下,在第二颗 SATA 磁盘中,分区“六个有用”的分区 (具有 filesystem 的) ,此外,已知有两个 primary 的分区类型!请问六个分区的文件名?/dev/sdb1(primary) /dev/sdb2(primary) /dev/sdb3(extended) /dev/sdb5(logical 下面皆为 logical) /dev/sdb6 /dev/sdb7 /dev/sdb8 请注意,5-8 这四个 logical 容量相加的总和为 /dev/sdb3!
-- P(primary)+E(extended)最多叧能有四个
-- E 最多叧能有一个
-- 1~4 号是保留给主要/延伸分割槽的, 所有在上面的实例当中 没有sdb4
2 磁盘管理之Block、iNode、 super、super block
block
磁盘上存放的数据块
block bitmap
段落引用
在元数据区域,标记数据块是否被使用
文件系统:软件(XFS NTFS FAT EXT3
EXT4等),存储数据或文件的一种格式,文件系统不存在分区上,位于磁盘的某一个位置;文件系统把分区分割为两部分,一部分存放元数据(metadata),另一部分存放数据
metadata:
元数据(和数据本身内容没有关系,包括的是数据属性,比如数据归属,数据权限,数据的时间戳)
inode:index node(索引节点)
存放数据的属性,不包括文件名,数据对应的数据块(block),同一个inode可以指向多个文件
super block:
超级块,管理元数据区域内其他的区域的
ln(link):
ln [-s -v]:语法: ln [ -s -v ] src_file des_file
-s:创建软链接
-v:显示详细过程
硬链接:只能对文件进行硬链接,并且在同一个文件系统,指向一个inode节点 ,文件内容与inode有关 多个文件名对应到同一个inode号码 关联记录,硬链接的修改会影响实际文件内容 但其删除并不影响inode和数据块,硬链接的增加也不会增加inode数目
- 不能跨文件系统
- 不能链接目录
https://segmentfault.com/a/1190000015885157
软链接:使用绝对路径,指向一个路径,文件大小是字符串的个数,跨文件系统建立,可以为文件或目录建立
文件让数据指向其链接的文件名。若源文件删除,链接也无法打开。它是建立独立的文件 会占用inode与区块
- 符号链接
[root@localhost ~]# ll /etc/ -i
...
8388720 lrwxrwxrwx. 1 root root 14 Jul 28 08:36 system-release -> centos-release
3 磁盘管理之fdisk,gdisk分区
设备文件: /dev/
b:块设备
c:字符设备
主设备号(MAJOR):标识某一类设备
次设备号(MINOR):标识一类设备下不同设备
mknod:创建设备:mknod [OPTION]... NAME TYPE [MAJOR MINOR]
-m:设置权限
磁盘类型按接口划分:如
IDE ATA:hd 主板:2种 IDE接口
SATA:sd ;SCSI:sd ;USB:sd
Linux磁盘表示方式
Linux以字母标识磁盘的个数 a:第一块 b:第二块
Linux用数字标识分区:1-4标识主分区或扩展分区 逻辑分区从5开始
例如:sda、sda1、sda2
低级格式化:划分磁道
高级格式化:为分区装载文件系统
文件系统:内核功能(FAT32 NTFS EXT2 EXT3 EXT4 XFS等)
EXT2 EXT3 EXT4:低容量
XFS:高容量 TB级
查看系统磁盘分区情况
[root@localhost ~]# cat /proc/partitions
[root@localhost ~]# ls /dev/sda*
du:data usage
显示特定目录下的使用情况
du -h 查看特定目录的空间使用情况
df:disk free
df命令用于显示磁盘分区上的可使用的磁盘空间
df -h
lsblk 列出分区状态
blkid
磁盘分区 gdisk fdisk parted
fdisk:针对MBR分区类型的工具
gdisk:针对GPT分区类型的工具
fdisk:交互式工具
fdisk:交互式工具
d:删除一个分区
l:显示linux支持的分区类型
m:显示帮助信息
n:创建一个新分区
p:创建主分区
e:创建扩展分区
p:显示当前分区列表
q:不保存退出
w:保存更改并退出
t:更改分区的系统ID
gdisk
该命令要是在GPT分区下使用的,需要在安装centOS的时候强制进行GPT分区,并安装gdisk 命令,其选项用法与fdisk基本相同
parted
使用 parted 命令可以查看系统采用什么类型的分区表 gpt/mbr/msdos/ext/ext/ext2/ext3/ext4
parted -l
磁盘格式化 mkfs: Make File System
创建/格式化文件系统,借助中间层vfs,虚拟文件系统
-t:指定文件系统
mkfs -t ext3 dev_name
mkfs -t xfs /dev/sdb1
mkfs.xfs /dev/sdb1
磁盘ID
5:扩展分区
82:交换分区
83:linux系统分区
8e:LVM(逻辑卷管理)
多磁盘应用 Mount 挂载
mount src(挂载源) des(要挂载点)
如挂载sdb1
/sdb1 mount /dev/sdb1 /sdb1
mkfs /sdb1 #先在根下创建该sdb1,再进行挂载
blkid #查看设备的id号
/etc/fstab #在该文件内添加以下内容: /实现开机自动挂载:
UUID=8567c02b-fac2-46d3-984e-b9fd8c9a2072 /sdb1 xfs defaults 0 0 #UUID=id号 挂载点 文件系统 默认选项 是否开机检查 是否备份
mkswap #创建交换分区
umount 卸载磁盘
df -h 可以查看是否挂载/卸载
fstab :filesystem table
/etc/fstab 写入错误 只读状态 系统无法自动挂载正常启动 可使用mount的手动重新挂载根目录
mount -n -o remount, rw /
实际文件系统的挂载是记录到 /etc/mtab 和/pro/mounts
镜像设备的挂载 loop挂载
4 Linux安装磁盘必须安装的两个分区
/ 根分区
根分区下还有一个/boot 引导分区 :用于存放引导文件和Linux内核
大小应 <100M
/ 根分区 :文件系统的根目录 硬盘无论有多少个分区 所有文件都会在根目录下
swap交换分区
作为虚拟内存使用 swap分区=物理内存的1.5-2倍
5 Linux文件系统
ls -l /lib/modules/$(uname -r)/kernel/fs
查看系统可以支持的系统格式
cat /proc/filesystems
查看系统正在使用的文件系统格式
ext2 索引式文件系统 与之相对的无索引的 FAT
文件系统将文件权限、属性与文件内容分开存储
超级区块
记录整个文件系统的整体信息:inode与数据区块的总量 使用量 剩余量等
文件系统挂载时间 最近一次写入数据的时间、最近一次磁盘检验的时间
有效位数值(0/1):磁盘是否挂载
inode
记录文件属性 、权限;一个文件 仅有一个inode
atime、mtime SetUID、pointer
数据区块
实际数据存储于此,但文件太大的时候回占用多个区块
ext2文件系统的限制
- 原则上 区块大小与数量在格式化之后不能够再修改
- 每一个区块最多只能放置一个文件的数据 如果文件太大 则占多个区块
- 如果文件小于区块则该区块其余空间不能够再使用(浪费磁盘空间)
inode的特点
- inode固定大小 128B,新的ext4/xfs可设置成256B
- 每个文件仅使用一个inode
- 文件系统能建立的文件数量与inode的数量有关
dumpe2fs
dumpe2fs 查询ext系列超级区块信息的命令
blkid: 查看各个磁盘的uuid、label name、文件系统格式
日志式文件系统
防止元数据的内容与实际生产数据不一致的问题,快速修复文件系统
6 Linux关机的正确方式
shutdown -h 时间(默认单位为min)
shutdown -h now
shutdown -h +10
shutdown -h 7:30
shutdown -c (强制取消关机命令)
常用
poweroff 关闭系统同时关闭电源
halt 关闭系统 不关电源
reboot
软件包
任务计划
一次性周期任务
=======
at
at:设置系统在某一个时间点执行的任务,执行结果以邮件的方式发送给任务发起者
# systemctl start atd 启用at任务计划服务
# systemctl enable atd 设置at服务开机自启动
# systemctl status atd 查看at服务状态
Linux中设置at任务后,会在/var/spool/at/目录生成at任务计划的文件,按照文件名的排序顺序执行
应用示例:
[root@localhost ~]# at 11:15
at> ls
at> <EOT> # ctrl+d 退出结束
job 5 at Sun Aug 12 11:15:00 2018
[root@localhost ~]# cd /var/spool/at/
[root@localhost at]# ls
a00005018620a3 spool
[root@localhost at]# cat a00005018620a3
[root@localhost at]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 2 messages 2 new
>N 1 llp002@localhost.loc Wed Mar 7 14:40 16/700 "*** SECURITY information for"
N 2 root Sun Aug 12 11:15 23/601 "Output from your job "
& 2
Message 2:
From root@localhost.localdomain Sun Aug 12 11:15:02 2018
Return-Path: <root@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Subject: Output from your job 5
To: root@localhost.localdomain
Date: Sun, 12 Aug 2018 11:15:02 +0800 (CST)
From: root@localhost.localdomain (root)
Status: R
anaconda-ks.cfg
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
Pictures
Public
Templates
Videos
/etc/at.allow和/etc/at.deny:
/etc/at.allow:at任务计划的白名单-用户名,仅允许此文件中的用户执行at
/etc/at.deny:at任务计划的黑名单-用户名,仅拒绝次文件中的用户执行at
设置完成后,重启at 服务 systemctl restart at
语法:
# at data_time
at>at_command1
at>at_command2
at>ctrl+d 保存退出
data_time:时间日期写法
绝对时间:
HH:MM:具体时间点
DD.MM.YY:天.月.年
YY-MM-DD:年-月-日
MM/DD/YY:月/日/年
HH:MM YY-MM-DD:
相对时间:at now+3minutes:从任务计划创建开始计时,3分钟以后执行
at命令:设置at任务计划
-l:查看系统中at任务列表,相当于atq
-r:删除系统中的at任务列表,相当于atrm
-d:删除系统中的at任务列表,相当于atrm
-c:列出后续at任务的具体指令内容
batch
用法和at相同,不过batch任务计划是在CPU空闲时执行,当CPU的平均负载小于0.8时执行batch设定任务
uptime:查看CPU的平均负载
周期性任务计划
=======
周期性任务计划:
系统周期性任务:
日志轮换:logrotate
登录文件分析:logwatch任务
创建locate数据库:updatedb
创建man帮助信息数据库:CentOS6:makewathis CentOS7:mandb
RPM软件登录文件的创建
与网络相关的分析行为:
用户周期性任务:
cron:设置周期任务计划
anacron:当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务
cron
控制crond服务:
# systemctl start crond
# systemctl enable crond
# systemctl status crond
/etc/cron.allow和/etc/cron.deny
/etc/cron.allow:白名单
/etc/cron.deny:黑名单,默认情况下系统只保留/etc/cron.deny
cron相关的配置文件:
/etc/crontab:cron配置文件
/etc/cron.d/:cron辅助配置文件
/var/spool/cron:用户cron任务计划的配置文件,Linux用户设置完cron任务后,会在/var/spool/cron目录下生成以用户名名称的cron文件
crontab:设置/查看/删除等cron任务计划,执行结果以邮件方式发送给任务发起者
-e:编辑cron任务内容
-u:为指定用户设置cron任务计划(只有root用户能够使用)
-l:查看cron任务列表
-r:删除所有的cron列表
设置cron任务语法:
系统设置:
分 时 日 月 周 用户 命令
用户设置:
分 时 日 月 周 命令
时间取值范围:
分钟:0-59
小时:0-23
日期:1-31
月份:1-12或jan,feb,mar,apr ...
周:0-7或sun,mon,tue,wed,thu,fri,sat,其中0和7都代表周日
时间的特殊写法:
通配:*代表任意时间 10 17 * * * cat /etc/fstab
离散时间段:,(逗号) 5,15,30,45,56 17 * * * cat /etc/fstab
连续时间段:-(中横线) 00 23 * * 1-5 cat /etc/fstab
间隔时间段:*/n */5 * * * * cat /etc/fstab 00 10 */5 * * cat /etc/fstab
/etc/crontab文件解析:
SHELL=/bin/bash:cron任务计划执行使用的shell程序
PATH=/sbin:/bin:/usr/sbin:/usr/bin:cron任务计划命令搜索地址
MAILTO=root:cron任务计划执行结果发送给哪个用户
/etc/cron.d:辅助配置文件目录
cron.hourly:cron工具去执行
cron.daily,cron.weekly cron.monthly是有anacron工具去执行
cron设置任务计划时注意事项:
CPU和内存资源集中使用时的问题:
# vim /etc/crontab
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root COMMAND1
取消一些不必要的输出:设置命令时可以重定向输出
时间的检验:设置时间时,周与日月不可并存
安全的检验:借有/var/log/cron的内容查看cron任务计划中是否有非法任务
环境变量:系统命令查找和cron任务命令位置由$PATH变量决定,设置cron任务时,使用命令的绝对路径
anacron
当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务
anacron语法:
anacron [options] [job]
-s:依据时间记录文件去判断是否执行
-f:强制执行
-n:立刻运行未执行的任务,不需要延时
anacron执行流程:
1:由/etc/anacrontab分析到cron.daily天数为1天
2:由/var/spool/anacron/cron.daily取出最近一次执行anacron时间戳
3:由2步骤分析出的时间戳和cron任务进行比较,查看哪些cron任务超过1天时间没有执行
4:准备执行指令,根据/etc/anacrontab的设置,将延时执行
5:延时时间过后,执行指令
文件查找命令find
which:查找命令字所在的位置
locate:模糊匹配(只要包含关键字的文件都查找出来)
不是实时的,基于数据库查找, updatedb升级locate数据库
查找速度特别快
find:查看文件或目录的工具
实时查找
精确查找
遍历整个指定目录中的文件,速度很慢
支持多种查找条件(属主,属组,权限,文件名等)
语法: find [find_path] [条件] [处理动作]
find_path:如果不写,默认在当前工作目录查找
条件:如果不写,会查找出该路径下所有的文件
处理动作:默认打印到屏幕上 print
条件:(匹配标准)
-name file_name:根据文件名进行查找,区分大小写
-iname file_name:根据文件名进行查找,不区分大小写
-regex PATTERN:根据正则表达式的模式进行查找
-user:通过属主进行查找
-group:通过属组进程查找
-uid UID:通过UID号进行查找
-gid GID:通过GID号进行查找
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
-type:根据文件类型进行查找
-b:块设备
-c:字符设备
-d:目录
-f:文件
-p:命名管道
-s:套接字文件
-l:链接文件
-size [+ | -] k m g
-size 5k:精确匹配
+:大于
-:小于
根据时间戳进行查找: # stat file_name //查看文件的时间戳
-atime:时间单位为天,access时间
-mtime:时间单位为天,modify时间
-ctime:时间单位为天,change时间
-mmin:时间单位为分钟,modify时间
-amin:时间单位为分钟,access时间
-cmin:时间单位为分钟,change时间
根据权限查找:
-perm MODE:
MODE:644,精确匹配
/MODE:任意一位匹配
-MODE:文件权限能够完全包含此MODE时才能匹配
条件组合:
-a:同时满足多个条件,比如查找属主是tom并且权限为644的文件
-o:满足一个条件即可,比如查找属主是tom或者权限为包含644的文件
-not:不满足条件的被查找出来
出来动作:
-print:默认动作,默认查找结果打印到屏幕
-ls:默认以类似于ls -l的形式显示结果的信息
-ok COMMAND {} \;执行动作时提示用户是否执行,必须以\;结尾,{}代表文件名占位符
-exec COMMAND {} \;执行动作时不提示用户直接执行,必须以\;结尾,{}代表文件名占位符
查找条件通配符:
*:通配任意个数的任意字符 # find /etc/ -name "pass*" # find /etc/ -name "*pass"
?:通配单个的任意字符 # find /etc/ -name "passw*"
CentOS6系统启动详解
简介
进程管理:kernel+process
CPU分环:ring0:内核空间 ring1-2:库文件等 ring3:用户空间
CPU读取的数据都来自内存
内存:内核空间和用户空间,RAM:易失性存储器
ROM:只读存储器,存储硬件信息等
系统启动流程:CentOS6和CentOS7
PC:Linux
启动过程:
POST(加电自检:PowerOnSelfTest)--BIOS(基本输入输出系统:Basic Input Output System:硬件信息;Boot sequence:启动顺序)--MBR(主引导记录;446字节bootloader)--启动菜单(Linux启动菜单:GRUB)--kernel--initramfs(虚拟根文件系统)--/sbin/init
kernel作用:驱动和测检系统外围硬件或程序
文件系统
安全管理
网络管理
进程管理
驱动程序
内核设计:
单内核:把所有的功能都集成到内核中去
Linux使用单内核,模块化设计 /lib /lib64
/lib/modules/'内核版本号为名称的目录'/kernel
arch:平台架构相关
crypto:安全加密
drivers:驱动程序
fs:文件系统
kernel:内核
lib:内核库 .ko(kernel object)
mm:memory mangement内存管理
net:系统中的TCP/IP协议栈
sound:声卡
modules.dep:解决系统中依赖关系
微内核:把每个功能都做成小模块 Windows solaris
Linux运行级别:0-6
0:halt关机
1:单用户模式(root, 无须登录), single, 维护模式;
2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式,正常模式;文本界面; CLI:command line interface
4:预留级别;
5:多用户模式,正常模式;图形界面; GUI:graphical user interface
6:重启
initramfs:CentOS6,虚拟根文件系统,把/proc /sys /dev目录复制到根文件系统
initrd:CentOS5
虚拟根系统,可以切换根目录只要有bin/bash 和对应的lib模块 和所应用的相关模块则可相互切换
chroot 文件地址:改变根目录
ldd:查看二进制文件所依赖的库文件,查看所需要的lib模块
GRUB
启动流程详解:
BootLoader:MBR(位于磁盘中0磁道0柱面1扇区,512字节),后安装的系统的BootLoader覆盖先安装的BootLoader,安装双系统时,先安装Linux,在安装Windows
windows:不允许其他系统引导,也不引导其他系统
linux:
LILO:有众多的限制
GRUB:默认的BootLoader
GRUB引导系统时几个阶段:(配置文件/boot/grub/grub.conf)
grub.conf的文件内容解析
default=0 //默认引导系统
timeout=5 //GRUB引导系统超时时间
splashimage=(hd0,0)/grub/splash.xpm.gz //引导系统时图片
hiddenmenu //隐藏菜单
title CentOS 6 (2.6.32-642.el6.x86_64) //系统title及在GRUB中显示的名称
root (hd0,0) //根所在的位置
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=ef361140-6306-423c-90f0-63a93c664f96 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img
grub配置文件/boot/grub/grub/conf详细解释:
GRUB要求设备名被括在一个括号中。fd表示软盘,hd 表示硬盘(不区分IDE还是SCSI)。其次设备是从0开始编号。分区也是如此,分区和设备之间用一个逗号分开。
default 启动系统时在人为不干预的情况下,默认读取哪一个title,如果安装了多个不同版本内核或者安装了不用的操作系统,会产生多个title,0表示第一个,1第二个,以此类推。
timeout 开机等待用户的超时时间,单位为秒。在超时时间结束时,如果用户没有人为选择,则以default指定的title读取。
hiddenmenu:用于启动时隐藏菜单,除非在timeout之前按下任意键才能看到菜单。
title:定义引导项名称。
root:指定boot分区所在磁盘及分区,如:root (hd0,6)。
kernel:指定kernel文件所在绝对目录地址,如:kernel /vmlinuz-2.6.32-220.el6.x86_64 ,这里的/表示root(hd0,0)分区
initrd:指定ramdisk盘所在绝对目录地址,如:initrd /initramfs-2.6.32-220.el6.x86_64.img
GRUB分阶段启动:
stage1:第一个阶段,位于BootLoader,为了引导第二阶段
stage1_5:识别文件系统
stage2:加载启动设置等等,读取配置文件/boot/grub/grub.conf
GRUB修复:光盘启动,进入救援模式:
# chroot /mnt/sysimage
# grub-install --root-directory=/ /dev/sda
# grub
grub> root (hd0,0)
grub> setup (hd0)
grub> quit
# 准备GRUB配置文件
# exit
# reboot
为GRUB启动菜单添加密码:
# grub-crypt --sha-512 //生成加密密码
# vim /boot/grub/grub.conf,在hiddenmenu添加一行
password --encryped 生成的密文
为系统添加启动密码:
# grub-crypt --sha-512 //生成加密密码
# vim /boot/grub/grub.conf,在title中添加一行
password --encryped 生成的密文
Kernel、upstart init
Kernel
Linux内核与内核模块:
内核:/boot/vmlinuz-version
initramfs:/boot/initramfs-kernel_version
内核模块:/lib/modules/kernel_version/kernel
内核源码:/usr/src/kernels/kernel_version
内核版本:/proc/version
系统内核功能:/proc/sys/kernel
Linux关于内核的命令:
# lsmod:查看系统中加载的内核模块
结果解释:
module:模块的名称
size:模块的大小
userd by:此模块是否被其他模式使用(依赖关系)
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
systemV中的 init、upstart init,二者差异不大,centOS中的init称为systemd
init upstart 系统中的第一个进程
系统中第一个进程,PID是1,配置文件/etc/inittab
Sys V:init CentOS5:把所有的功能都集成到一个文件中/etc/inittab,启动速度非常慢
Upstart:CentOS6:采用事件驱动(event driven),把功能并行执行
Upstart 概念和术语
Upstart 的基本概念和设计清晰明确。UpStart 主要的概念是 job 和 event。Job 就是一个工作单元,用来完成一件工作,比如启动一个后台服务,或者运行一个配置命令。每个 Job 都等待一个或多个事件,一旦事件发生,upstart 就触发该 job 完成相应的工作。
Job:
Job 就是一个工作的单元,一个任务或者一个服务。可以理解为 sysvinit 中的一个服务脚本。有三种类型的工作:
task job:代表在一定时间内会执行完毕的任务,比如删除一个文件
service job:代表后台服务进程,比如 apache httpd。这里进程一般不会退出,一旦开始运行就成为一个后台精灵进程,由 init 进程管理,如果这类进程退出,由 init 进程重新启动,它们只能由 init 进程发送信号停止。它们的停止一般也是由于所依赖的停止事件而触发的,不过 upstart 也提供命令行工具,让管理人员手动停止某个服务;
Abstract job:仅由 upstart 内部使用,仅对理解 upstart 内部机理有所帮助。我们不用关心它。
除了以上的分类之外,还有另一种工作(Job)分类方法。Upstart 不仅可以用来为整个系统的初始化服务,也可以为每个用户会话(session)的初始化服务。系统的初始化任务就叫做 system job,比如挂载文件系统的任务就是一个 system job;用户会话的初始化服务就叫做 session job。
Job 生命周期:Upstart 为每个工作都维护一个生命周期。一般来说,工作有开始,运行和结束这几种状态。为了更精细地描述工作的变化,Upstart 还引入了一些其它的状态。比如开始就有开始之前(pre-start),即将开始(starting)和已经开始了(started)种不同的状态,这样可以更加精确地描述工作的当前状态。
工作从某种初始状态开始,逐渐变化,或许要经历其它几种不同的状态,最终进入另外一种状态,形成一个状态机。在这个过程中,当工作的状态即将发生变化的时候,init 进程会发出相应的事件(event)。
Upstart 中 Job 的可能状态
Waiting:初始状态
Starting:Job 即将开始
pre-start:执行 pre-start 段,即任务开始前应该完成的工作
Spawned:准备执行 script 或者 exec 段
post-start:执行 post-start 动作
Running:interim state set after post-start section processed denoting job is running (But it may have no associated PID!)
pre-stop:执行 pre-stop 段
Stopping:interim state set after pre-stop section processed
Killed:任务即将被停止
post-stop:执行 post-stop 段
事件 Event
顾名思义,Event 就是一个事件。事件在 upstart 中以通知消息的形式具体存在。一旦某个事件发生了,Upstart 就向整个系统发送一个消息。没有任何手段阻止事件消息被 upstart 的其它部分知晓,也就是说,事件一旦发生,整个 upstart 系统中所有工作和其它的事件都会得到通知。
Event 可以分为三类: signal,methods 或者 hooks。
Signal 事件是非阻塞的,异步的。发送一个信号之后控制权立即返回。
Methods 事件是阻塞的,同步的。
Hooks 事件是阻塞的,同步的。它介于 Signals 和 Methods 之间,调用发出 Hooks 事件的进程必须等待事件完成才可以得到控制权,但不检查事件是否成功。
事件是个非常抽象的概念,下面我罗列出一些常见的事件,希望可以帮助您进一步了解事件的含义:
系统上电启动,init 进程会发送"start"事件
根文件系统可写时,相应 job 会发送文件系统就绪的事件
一个块设备被发现并初始化完成,发送相应的事件
某个文件系统被挂载,发送相应的事件
类似 atd 和 cron,可以在某个时间点,或者周期的时间点发送事件
另外一个 job 开始或结束时,发送相应的事件
一个磁盘文件被修改时,可以发出相应的事件
一个网络设备被发现时,可以发出相应的事件
缺省路由被添加或删除时,可以发出相应的事件
CentOS6上面Upstart大致的一个启动过程:
1.内核启动init,读取配置文件/etc/inittab,在CentOS6只定义了运行级别
2.系统初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit)
3.init找到/etc/inittab文件,确定默认的运行级别(X) (/etc/init/rcS.conf exec telinit )触发相应的事件RUNLEVEL)
5.开始运行/etc/rc.d/rc,传入参数X
6./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
7./etc/rcX.d/中的脚本按事先设定的优先级依次启动
8.最后执行/etc/rc.d/rc.local
9.加载终端或X-Window接口
/etc/rc.d/rc.sysinit 这个文件做了哪些工作:
1、获得网络环境
2、挂载设备
3、开机启动画面Plymouth(取替了过往的 RHGB)
4、判断是否启用SELinux
5、显示于开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步存储器
11、设备映射器及相关的初始化
12、初始化软件磁盘阵列(RAID)
13、初始化 LVM 的文件系统功能
14、检验磁盘文件系统(fsck)
15、磁盘配额(quota)
16、重新以可读写模式挂载系统磁盘
17、更新quota(非必要)
18、启动系统虚拟随机数生成器
19、配置机器(非必要)
20、清除开机过程当中的临时文件
21、创建ICE目录
22、启动交换分区(swap)
23、将开机信息写入/var/log/dmesg文件中
/etc/init/rc.conf:sysv运行级别
/etc/rc.d/存放每个运行级别所需要的服务,比如/etc/rc.d/rc3.d/目录定义的运行级别3所需要的服务
命名: K+数字+服务名
S+数字+服务器
K:kill结束服务
S:start开启服务
数字:代表启动结束的优先级,数字越小优先级越高
/etc/rc.d/rc.local:系统启动加载的最后一个脚本(用户的脚本)
sysv init:chkconfig:定义系统服务在每个级别的运行状态
chkconfig --list:查看系统中所有服务的状态
chkconfig --level 2345 httpd on
chkconfig --level 2345 httpd off
服务分类:
独立服务:应用程序自己控制
超级服务:依赖于xinetd进程来管理
控制服务: service service_name start|stop|restart|reload|status
常见命令解释:
start:启动服务
stop:停止服务
restart:重新启动
reload:重新加载服务
status:查看服务状态
upstart 常见命令 initctl start|stop|restart|reload|status service_name
systemd
systemd特性
1.平行处理所有服务,加速开机流程:旧的init启动脚本是一项一项任务依序启动的模式,因此不相依的服务也是得要一个一个的等待.systemd可以让所有的服务同时启动,因此系统启动的速度变快了
2.一经要求就回应的on-demand启动方式:systemd全部就是仅有一只systemd服务搭配systemctl指令来处理,无须其他额外的指令来支援.不像systemV还要init,chkconfig,service...等等指令.此外,systemd由于常驻存储器,因此任何要求(on-demand)都可以立即处理后续的daemon启动的任务.
3.服务依赖性的自我检查:由于systemd可以自订服务相依性的检查,因此如果B服务是架构在A服务上面启动的,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务!
4.按照daemon功能分类:systemd管理的服务非常多,首先systemd先定义所有的服务为一个服务单位(unit),并将该unit归类到不同的服务类型(type)去.systemd将服务单位(unit)区分为service,socket,target,path,snapshot,timer等多种不同的类型(type),方便管理员的分类与记忆.
5.将多个daemons集合成为一个群组:如同systemV的init里头有个runlevel的特色,systemd亦将许多的功能集合成为一个所谓的target项目,这个项目主要在设计操作环境的建置,所以是集合了许多的daemons,也就是执行某个target就是执行好多个daemon的意思!
6.向下兼容旧有的init服务脚本:基本上,systemd是可以兼容于init的启动脚本的,因此,旧的init启动脚本也能够通过systemd来管理,只是更进阶的systemd功能就没有办法支援就是了.
7.systemd有些地方无法完全取代init!包括:在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;
8.全部的systemd都用systemctl这个管理程序管理,而systemctl支援的语法有限制,不像/etc/init.d/daemon就是纯脚本可以自订参数,systemctl不可自订参数.;
CentOS7启动流程: lsinitrd /boot/initramfs-3.10.0-514.el7.x86_64.img //查看虚根文件系统
在内核载入完毕、进行完硬件侦测与驱动程序载入后,内核会启动第一个进程systemd, systemd 最主要的功能就是准备软件执行的环境,包括系统的主机名称、网络设定、语言设置、文件系统及其他服务的启动。 而所有的动作都会通过 systemd 的预设启动服务集合/etc/systemd/system/default.target设定。 另外, systemd 已经舍弃沿用多年的 system V 的 runlevel!
常见的操作环境 target 与兼容于 runlevel 的等级可以作为预设的操作环境 (default.target) 的主要项目有: multi-user.target 以及 graphical.target 这两个。当然还有rescue.target, emergency.target, shutdown.target 等等,以及 initrd.target!但是过去的 systemV 使用的是一个称为 runlevel (执行等级) 的概念来启动系统的,systemd 为了兼容于旧式的 systemV 操作行为, 所以也将 runlevel 与操作环境做个结合!你可以使用底下的方式来查询两者间的对应关系
# ll -d /usr/lib/systemd/system/runlevel*.target
# yum -y install bash-completion //补齐参数或选项
# systemctl list-dependencies graphical.target //查看启动依赖关系
# systemctl list-dependencies mutli-user.target //查看字符界面启动依赖关系
sysinit.target完成的功能:
1.特殊文件系统装置的挂载:包括 dev-hugepages.mount dev-mqueue.mount 等挂载服务,主要在挂载跟巨量存储器分页使用与讯息队列的功能。 挂载成功后,会在 /dev 底下建立 /dev/hugepages/, /dev/mqueue/ 等目录;
2.特殊文件系统的启用:包括磁碟阵列、网络磁碟 (iscsi)、LVM 档案系统、档案系统对照服务 (multipath) 等等,也会在这里被侦测与使用到!
3.开机过程的讯息传递与动画执行:使用 plymouthd 服务搭配 plymouth 指令来传递动画与讯息
4.日志式登录档的使用:就是 systemd-journald 这个服务的启用啊!
5.载入额外的核心模块:透过 /etc/modules-load.d/.conf 档案的设定,让核心额外载入管理员所需要的核心模块!
6.载入额外的核心参数设定:包括 /etc/sysctl.conf 以及 /etc/sysctl.d/.conf 内部设定!
7.启动系统的随机数产生器:随机数产生器可以帮助系统进行一些密码加密演算的功能
8.设定终端机 (console) 字形
9.启动动态装置管理员:就是udev
basic.target完整的功能:
1.载入 alsa 音效驱动程序;
2.载入 firewalld 防火墙:CentOS 7.x 以后使用 firewalld 取代 iptables 的防火墙设定,虽然最终都是使用 iptables 的架构, 不过在设定上面差很多。
3.载入 CPU 的微指令功能;
4.启动与设定 SELinux 的安全上下文
5.将目前的开机过程所产生的开机信息写入到 /var/log/dmesg 当中
6.由 /etc/sysconfig/modules/*.modules 及 /etc/rc.modules 载入管理员指定的模块!
7.载入 systemd 的 timer 功能;
systemd 启动 multi-user.target 下的服务:
启动服务设定的脚本目录:
/usr/lib/systemd/system (系统预设的服务启动脚本设定)
/etc/systemd/system (管理员自己开发与设定的脚本设定)
而使用者针对主机的本机服务与服务器网络服务的各项 unit 若要 enable 的话,就是将它放到 /etc/systemd/system/multi-user.target.wants/ 这个目录底下做个链接,这样就可以在开机的时候去启动他。
与sys V兼容的rc.local操作:
chmod +x /etc/rc.d/rc.local
systemctl start rc-local
systemctl enable rc-local