[关闭]
@llplmlyd 2019-09-30T08:31:34.000000Z 字数 18137 阅读 1962

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:

超级块,管理元数据区域内其他的区域的

  1. ln [-s -v]:语法: ln [ -s -v ] src_file des_file
  2. -s:创建软链接
  3. -v:显示详细过程

硬链接:只能对文件进行硬链接,并且在同一个文件系统,指向一个inode节点 ,文件内容与inode有关 多个文件名对应到同一个inode号码 关联记录,硬链接的修改会影响实际文件内容 但其删除并不影响inode和数据块,硬链接的增加也不会增加inode数目

软链接:使用绝对路径,指向一个路径,文件大小是字符串的个数,跨文件系统建立,可以为文件或目录建立
文件让数据指向其链接的文件名。若源文件删除,链接也无法打开。它是建立独立的文件 会占用inode与区块
- 符号链接

  1. [root@localhost ~]# ll /etc/ -i
  2. ...
  3. 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级

查看系统磁盘分区情况

  1. [root@localhost ~]# cat /proc/partitions
  2. [root@localhost ~]# ls /dev/sda*

du:data usage

显示特定目录下的使用情况

  1. du -h 查看特定目录的空间使用情况

df:disk free

df命令用于显示磁盘分区上的可使用的磁盘空间

  1. df -h

lsblk 列出分区状态

blkid

磁盘分区 gdisk fdisk parted

fdisk:针对MBR分区类型的工具
gdisk:针对GPT分区类型的工具

fdisk:交互式工具

  1. fdisk:交互式工具
  2. d:删除一个分区
  3. l:显示linux支持的分区类型
  4. m:显示帮助信息
  5. n:创建一个新分区
  6. p:创建主分区
  7. e:创建扩展分区
  8. p:显示当前分区列表
  9. q:不保存退出
  10. w:保存更改并退出
  11. t:更改分区的系统ID

gdisk

该命令要是在GPT分区下使用的,需要在安装centOS的时候强制进行GPT分区,并安装gdisk 命令,其选项用法与fdisk基本相同

parted

使用 parted 命令可以查看系统采用什么类型的分区表 gpt/mbr/msdos/ext/ext/ext2/ext3/ext4

  1. parted -l

磁盘格式化 mkfs: Make File System

创建/格式化文件系统,借助中间层vfs,虚拟文件系统
-t:指定文件系统
mkfs -t ext3 dev_name

  1. mkfs -t xfs /dev/sdb1
  2. mkfs.xfs /dev/sdb1

磁盘ID

5:扩展分区
82:交换分区
83:linux系统分区
8e:LVM(逻辑卷管理)

多磁盘应用 Mount 挂载

mount src(挂载源) des(要挂载点)
如挂载sdb1

  1. /sdb1 mount /dev/sdb1 /sdb1
  2. mkfs /sdb1 #先在根下创建该sdb1,再进行挂载
  3. blkid #查看设备的id号
  4. /etc/fstab #在该文件内添加以下内容: /实现开机自动挂载:
  5. UUID=8567c02b-fac2-46d3-984e-b9fd8c9a2072 /sdb1 xfs defaults 0 0 #UUID=id号 挂载点 文件系统 默认选项 是否开机检查 是否备份
  6. mkswap #创建交换分区

umount 卸载磁盘
df -h 可以查看是否挂载/卸载
fstab :filesystem table

  1. /etc/fstab 写入错误 只读状态 系统无法自动挂载正常启动 可使用mount的手动重新挂载根目录
  2. mount -n -o remount, rw /

实际文件系统的挂载是记录到 /etc/mtab 和/pro/mounts

镜像设备的挂载 loop挂载

4 Linux安装磁盘必须安装的两个分区

/ 根分区

根分区下还有一个/boot 引导分区 :用于存放引导文件和Linux内核
大小应 <100M
/ 根分区 :文件系统的根目录 硬盘无论有多少个分区 所有文件都会在根目录下

swap交换分区

作为虚拟内存使用 swap分区=物理内存的1.5-2倍

5 Linux文件系统

  1. ls -l /lib/modules/$(uname -r)/kernel/fs
  2. 查看系统可以支持的系统格式
  3. cat /proc/filesystems
  4. 查看系统正在使用的文件系统格式

ext2 索引式文件系统 与之相对的无索引的 FAT

文件系统将文件权限、属性与文件内容分开存储

超级区块

记录整个文件系统的整体信息:inode与数据区块的总量 使用量 剩余量等
文件系统挂载时间 最近一次写入数据的时间、最近一次磁盘检验的时间
有效位数值(0/1):磁盘是否挂载

inode

记录文件属性 、权限;一个文件 仅有一个inode
atime、mtime SetUID、pointer

数据区块

实际数据存储于此,但文件太大的时候回占用多个区块

ext2文件系统的限制

inode的特点

dumpe2fs

  1. dumpe2fs 查询ext系列超级区块信息的命令

blkid: 查看各个磁盘的uuid、label name、文件系统格式

日志式文件系统

防止元数据的内容与实际生产数据不一致的问题,快速修复文件系统

6 Linux关机的正确方式

shutdown -h 时间(默认单位为min)

  1. shutdown -h now
  2. shutdown -h +10
  3. shutdown -h 7:30
  4. 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任务计划的文件,按照文件名的排序顺序执行
应用示例:

  1. [root@localhost ~]# at 11:15
  2. at> ls
  3. at> <EOT> # ctrl+d 退出结束
  4. job 5 at Sun Aug 12 11:15:00 2018
  5. [root@localhost ~]# cd /var/spool/at/
  6. [root@localhost at]# ls
  7. a00005018620a3 spool
  8. [root@localhost at]# cat a00005018620a3
  1. [root@localhost at]# mail
  2. Heirloom Mail version 12.5 7/5/10. Type ? for help.
  3. "/var/spool/mail/root": 2 messages 2 new
  4. >N 1 llp002@localhost.loc Wed Mar 7 14:40 16/700 "*** SECURITY information for"
  5. N 2 root Sun Aug 12 11:15 23/601 "Output from your job "
  6. & 2
  7. Message 2:
  8. From root@localhost.localdomain Sun Aug 12 11:15:02 2018
  9. Return-Path: <root@localhost.localdomain>
  10. X-Original-To: root
  11. Delivered-To: root@localhost.localdomain
  12. Subject: Output from your job 5
  13. To: root@localhost.localdomain
  14. Date: Sun, 12 Aug 2018 11:15:02 +0800 (CST)
  15. From: root@localhost.localdomain (root)
  16. Status: R
  17. anaconda-ks.cfg
  18. Desktop
  19. Documents
  20. Downloads
  21. initial-setup-ks.cfg
  22. Music
  23. Pictures
  24. Public
  25. Templates
  26. 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的平均负载

周期性任务计划

=======

  1. 周期性任务计划:
  2. 系统周期性任务:
  3. 日志轮换:logrotate
  4. 登录文件分析:logwatch任务
  5. 创建locate数据库:updatedb
  6. 创建man帮助信息数据库:CentOS6:makewathis CentOS7:mandb
  7. RPM软件登录文件的创建
  8. 与网络相关的分析行为:
  9. 用户周期性任务:
  10. cron:设置周期任务计划
  11. 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系统启动详解

简介

  1. 进程管理:kernel+process
  2. CPU分环:ring0:内核空间 ring1-2:库文件等 ring3:用户空间
  3. CPU读取的数据都来自内存
  4. 内存:内核空间和用户空间,RAM:易失性存储器
  5. ROM:只读存储器,存储硬件信息等
  6. 系统启动流程:CentOS6CentOS7
  7. PC:Linux
  8. 启动过程:
  9. POST(加电自检:PowerOnSelfTest)--BIOS(基本输入输出系统:Basic Input Output System:硬件信息;Boot sequence:启动顺序)--MBR(主引导记录;446字节bootloader)--启动菜单(Linux启动菜单:GRUB)--kernel--initramfs(虚拟根文件系统)--/sbin/init
  10. kernel作用:驱动和测检系统外围硬件或程序
  11. 文件系统
  12. 安全管理
  13. 网络管理
  14. 进程管理
  15. 驱动程序
  16. 内核设计:
  17. 单内核:把所有的功能都集成到内核中去
  18. Linux使用单内核,模块化设计 /lib /lib64
  19. /lib/modules/'内核版本号为名称的目录'/kernel
  20. arch:平台架构相关
  21. crypto:安全加密
  22. drivers:驱动程序
  23. fs:文件系统
  24. kernel:内核
  25. lib:内核库 .ko(kernel object)
  26. mm:memory mangement内存管理
  27. net:系统中的TCP/IP协议栈
  28. sound:声卡
  29. modules.dep:解决系统中依赖关系
  30. 微内核:把每个功能都做成小模块 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的文件内容解析

  1. default=0 //默认引导系统
  2. timeout=5 //GRUB引导系统超时时间
  3. splashimage=(hd0,0)/grub/splash.xpm.gz //引导系统时图片
  4. hiddenmenu //隐藏菜单
  5. title CentOS 6 (2.6.32-642.el6.x86_64) //系统title及在GRUB中显示的名称
  6. root (hd0,0) //根所在的位置
  7. 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
  8. 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 与操作环境做个结合!你可以使用底下的方式来查询两者间的对应关系

  1. # ll -d /usr/lib/systemd/system/runlevel*.target
  2. # yum -y install bash-completion //补齐参数或选项
  3. # systemctl list-dependencies graphical.target //查看启动依赖关系
  4. # 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 下的服务:

  1. 启动服务设定的脚本目录:
  2. /usr/lib/systemd/system (系统预设的服务启动脚本设定)
  3. /etc/systemd/system (管理员自己开发与设定的脚本设定)
  4. 而使用者针对主机的本机服务与服务器网络服务的各项 unit 若要 enable 的话,就是将它放到 /etc/systemd/system/multi-user.target.wants/ 这个目录底下做个链接,这样就可以在开机的时候去启动他。

与sys V兼容的rc.local操作:

  1. chmod +x /etc/rc.d/rc.local
  2. systemctl start rc-local
  3. systemctl enable rc-local
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注