1. Linux简单学习
1.1 Linux安装与VMware使用
1.1.1 Linux的不同界面
- Ctrl+alt+F1~F6:切换不同的界面
- 进入图形界面:startx(有时不加x)
- 使用exit 注销账户,然后切换其他用户
1.2 Linux的命令规范
- command [-option] parameter1 parameter2 …
- 命令 选项 参数1 参数2
- 一个“-”使用简写;两个“–”使用全名
- 命令、选项、参数之间用空格分开(不管有多少空格都视为一个空格)
- 命令太长时可以用转义字符 \t、\b等来转义回车键
- 回车键代表命令执行
- 命令的大小写不同,不是同一个命令
1.2.1 Linux基础命令操作
- ls :显示列表
- date :显示时间日期
- cal :显示日历
- bc :计算器(+加、-减、* 乘、/除、^指数、%取余)
- which:查看命令所在路径
1.2.2 几种经常使用的快捷键
Ctrl+C:终止(中断当前程序)
Ctrl+D:键盘输入结束、exit退出
Tab(一次不行按两次):命令补全,文件补齐,参数补齐
Ctrl+u:光标处删除到首
Ctrl+k:光标处删除到尾
Ctrl+a:光标移动到首
1.3 系统帮助命令
1.3.1 --help
:可用于查看命令
- Usage:执行命令的语法
- 后面是具体参数的介绍
1.3.2 man
:可用于查看命令和文件格式
1).man命令中第一行DATE(1~9)的含义
代码 | 代表内容 |
---|---|
1 | 用户在shell环境中可以操作的命令 |
2 | 系统内核可调用的函数与工具 |
3 | 一些常用的函数(function)与函数库(library),大部分为C的函数库 |
4 | 设备文件的说明,通常在/dev下的文件 |
5 | 配置文件或是某些文件的格式 |
6 | 游戏 |
7 | 惯例与协议 |
8 | 系统管理员可用的管理命令 |
9 | 跟内核有关的文件 |
2).命令的介绍(每个区域的意思)
代号 | 内容说明 |
---|---|
NAME | 简短的命令,数据名称的说明 |
SYNOPSIS | 简短的命令语法(syntax)简介 |
DESCRIPTION | 较为完整的说明 |
OPTIONS | 针对SYNOPSIS部分中,有列举的所有选项的说明 |
COMMANDS | 当这个程序在执行时,可以在此程序中执行的命令 |
FILES | 这个程序或数据所使用或参考或链接到的某些文件 |
SEE ALSO | 可以参考跟这个数据或命令有关的其他说明 |
EXAMPLES | 一些可以参考的范例 |
- CONFIGURATION:配置
- ENVIRONMENT:与命令相关的环境参数说明
- AUTHOR:作者
- COPYRIGHT:版权
3). man命令常用的快捷键
按键 | 进行工作 |
---|---|
空格键 | 向下翻一页 |
[page down] | 向下翻一页 |
[page up] | 向上翻一页 |
[home] | 去到第一页 |
[end] | 去到最后一页 |
/string | 向下查找string这个字符串 |
?string | 向上查找string这个字符串 |
n,N | 利用/或?来查找字符串时,可以用n来继续下一个查找,利用N来进行反向查找 |
q | 结束这次man page查找 |
上下左右 | 一行一行翻页 |
4).附man命令的使用选项:
man -f (命令) :等同于whatis,查找与命令相关的文件
man -k (关键词) :等同于apropos,搜索存在关键词的手册概述并显示所有匹配结果
whatis:查看命令帮助信息所在的路径
5).<>:必选项
5).一些符号的使用说明:
- <>:必选项
- [] :可选项
- … :可以使用多个参数
- | :多选一
- () :分组(没有实际意义)
1.3.3 info
将文件数据拆分成一个一个的段落,每个段落用自己的页面编写,并且在各个界面中还有类似网页的超链接来调到各不同的界面中,每个独立的界面也被成为一个节点(前提:该文件必须用info的格式写)
info命令常用的快捷键
按键 | 进行工作 |
---|---|
空格键 | 向下翻一页 |
[page down] | 向下翻一页 |
[page up] | 向上翻一页 |
[Tab] | 在节点之间移动(有节点的地方,通常以*显示) |
[Enter] | 当光标在节点上面时,按下enter可进入该节点 |
b | 移动光标到该info界面当中的第一处 |
e | 移动光标到该info界面的最后一个节点处 |
n | 前往下一个节点处 |
p | 前往上一个节点处 |
u | 向上移动一层 |
s(/) | 在info page中进行查找 |
h,? | 显示帮助选项 |
q | 退出info |
注:其他有用的说明文件放在/usr/share/doc/目录下。
1.3.4 type :查看命令是内部命令还是外部命令
1.3.5 help:用来查看内部命令的帮助信息
2. Linux的基础学习
2.1 文件权限与目录配置
2.1.1 文件属性、文件权限
使用 ls -al
列出文件及其属性
- 属性(依次序):【权限】【链接】【拥有者】【用户组】【文件容量】【修改日期】【文件名】
- 权限一共有10位(共4组)
- 使用file 命令来查看这个文件的类型
权限位 | 代表的含义 |
---|---|
第1位(d、-、l、b、c、s、p) | d:目录;-:普通文件;l:链接文件;b:可存储设备;c:键盘鼠标;s:套接字文件;p:命名管道(使用file 命令来查看这个文件的类型) |
第2,3,4位 | 文件拥有者的权限 |
第5,6,7位 | 文件拥有者所在用户组的权限 |
第8,9,10位 | 非文件拥有者所在用户组的人的权限(陌生人的权限) |
2.1.2 文件权限rwx的代表数字
文件权限 | 代表数字 |
---|---|
r | 4 |
w | 2 |
x | 1 |
2.1.3 文件权限的修改命令 chown、chgrp、chmod
- chgrp [-R] :修改用户所属用户组
- chgrp 用户组 文件/目录 : 修改用户组
- chown [-R] :修改文件拥有者
- chown –regerence=a.txt b.txt 复制a的权限到b上
- chown [-R] 账号名称:用户组名称 文件或目录
- chown [-R] 用户名 文件/目录 :修改属主【递归修改】
- chown [-R] .用户组 :修改用户组
- chown [-R] :用户组 :修改用户组
- chown [-R] 用户名:用户组 :修改用户名和用户组
- chmod [-R] :修改文件的权限(SUID、SGID、SBIT等)
chmod [augo] [+-=] [rwx] filename
- 数字类型修改权限:chmod [-R] xyz 文件或目录 (xyz就是rwx属性数字的相加,例如 r+w=6 )
- 符号类型修改权限:chmod [-R] a=rwx,u=rwx,g=rwx,o=rwx 文件名或目录
命令 | 身份 | 修改方式 | 权限 | 文件名 |
---|---|---|---|---|
chmod |
a(所有人),u(用户拥有者),g(文件组),o(其他人) | +,-,= | r,w,x | filename |
2.1.4 目录与文件的权限不同
- Linux下一个文件到底能不能执行,跟后面的扩展名没有关系,而是具不具备x权限
组件 | 内容 | r | w | x |
---|---|---|---|---|
文件 | 详细数据 | 读到文件内容 | 修改文件内容 | 执行文件内容 |
目录 | 文件名 | 读到文件名 | 修改文件名 | 进入该目录的权限 |
2.2 Linux目录介绍
2.2.1 简单区别
可分享 | 不可分享 | |
---|---|---|
不变(static) | /usr(软件存放处) | /etc(配置文件) |
/opt(第三方辅助软件) | /boot(启动与内核文件) | |
可变动(variable) | /var/mail(用户邮箱) | /var/run(程序相关) |
/var/spool/news(新闻组) | /var/lock(程序相关) |
2.2.2 具体目录
2.3 目录概念及相关讲解
2.3.1 目录与路径
- 相对路径:相对于当前目录写起
- 绝对路径:从根目录写起
2.3.2 目录的相关操作
目录 | 代表 |
---|---|
. | 当前目录 |
.. | 上一层目录 |
- | 前一个工作目录 |
~ | 目前使用者所在的家目录 |
~account | 代表account这个使用者的家目录 |
2.3.3 执行文件路径的变量:$PATH
path 变量由一堆目录组成,每个目录用“:”隔开
- 将一个目录加入系统环境变量:
PARH = " ${PATH}:/目录名(绝对路径)"
` - 不建议将本目录“.”加入路径(很危险)
2.3.4 处理目录的命令
cd
:切换目录 (配合上面的目录代表符号)pwd [-p]
:显示当前目录(-p显示真正的目录而不是链接)mkdir [-m -p]
:建立一个新目录(-m设置权限,-p进行递归创建)rmdir [-p]
:删除一个空目录(-p递归删除)basename
:获取文件名dirname
:获取目录
2.4 常用命令及介绍
ls、cp、rm、mv
ls -aAdfFhilnrRSt
文件名或目录cp -adfilprsu
源文件 目标文件rm -fir
文件或目录mv -fiu source1 source2 source3 ... directory
file
:显示文件类型(d - c s p l b )
命令 | 介绍 | 可带参数 |
---|---|---|
ls | 查看 | -a:显示所有文件;-d:仅列出目录本身;-l:详细信息显示(可以使用alias转换别名) |
cp | 复制 | -a:文件的权限信息都复制;-i:覆盖前进行询问;-p:连同属性(权限、用户、时间)一起复制(不使用默认的);-r:递归复制;-l:硬链接;-s:软连接;-b:新复制的文件名后加~ |
rm | 删除 | -f:强力删除文件;-I:删除前询问;-r:递归删除(很危险) |
mv | 移动(重命名) | -f:强制移动;-i:询问是否覆盖;-u:更新文件;-b :先对原文件备份~;-t:将多个文件移动到一个目录(mv -t 目录 文件1 文件2) |
file | 查看类型 | -b:显示结果时,不显示文件名;-c:显示file是如何判断文件类型的;-i:输出mime类型的字符串;-z:显示压缩文件的内容;-L:查看软连接对应的文件类型;-f:查看文件中文件名的类型 |
cat
:查看文件内容 tac:逆向查看文件(从最后开始)
命令 | 可用参数 | 使用说明 |
---|---|---|
cat | -A = -vET | 其他命令的集合 |
-b;-n | 列出行号(仅列出有字的);列出行号(包含空白行) | |
-E;-v;-T | 显示换行符$;显示特殊字符;用^I显示[tab] | |
cat > 文件名 <<EOF | 输出重定向 | 将键盘输入的内容添加的文件中,以输入EOF为结束 |
cat >> 文件名 <<EOF | 追加重定向 | 向文件中追加数据,以输入EOF为结束 |
cat 文件1 文件2 > 文件3 | 合并重定向 | 将文件1 文件2 的内容合并到文件3中 |
nl
:添加行号打印
命令 | 可用参数 | 使用说明 |
---|---|---|
nl | -b a; -b t | 全部列出行号;空行不列出行号 |
-n ln;-n rn;-n rz | 行号在最左方显示;行号在最右方显示且不加0;行号在最右方显示且加0 | |
-w | 行号栏位占用的字符数 |
more
与less
:查看文件 (一页一页查看)(常在管道中使用)
命令 | 按键 |
---|---|
more | 空格键:向下翻页(屏);Ctrl+ f:向下翻一页(屏);enter:向下翻一行;/字符串:查找字符串;:f :显示文件名以及目前的行数;b:往回翻页;q:立即离开 |
v:调用vi编辑器;!command:调用shell命令(与在命令行一样) | |
+ number :从第几行显示文件 | |
less | 空格键:向下翻页;[page down ]:向下翻页;[page up]:向上翻页;/字符串:向下查找;?字符串:向上查找;n:重复前一个查找;N:反向重复前一个查找;g:前进到这个数据的第一行;G:前进到这个数据的最后一行;q:离开 |
head /tail
:查看n行
命令 | 参数 | 说明 |
---|---|---|
head(从前开始) | -数字 number 文件名 | 显示(数字)行(默认是10行) |
tail (反向) | -数字 number 文件名 | 显示(数字)行 |
-f number | 持续刷新文件的内容 |
od
:查看非文本文件的的内容
- -t a:默认字符;
- -t c:ascii码; C(放在type中间进行数制的对比)
- -t d[size]:利用十进制输出,每个整数用size bytes 例:od -t oCc 文件名
- -t f[size]:浮点数制
- -t o[size]:八进制
- -t x[size]:、八进制、十六进制
mkdir
:创建目录
- -m:设置权限 //不设置这个参数时,默认权限是 755
- -p :递归创建
- -v :显示
- mkdir -p a/{b,c,d} :递归创建a目录,在a目录下创建b,c,d同级目录(使用花括号的作用)
- mkdir -p {a,b}-{c,d} :会创建a-c,b-c,a-d,b-d等4个目录
touch
:创建新文件或修改文件时间:
- -a : 修改访问时间
- -c :不会创建文件,仅修改文件的时间
- -d :用指定的日期创建/修改新文件的日期,不使用系统时间
- -t :用指定格式的时间戳创建新文件,不使用系统时间
- -m :修改mtime
*注意:mkdir和touch创建的目录或文件的权限受到 umask的影响,详细信息查看 2.5.1 *
tree
:(= ls -R)查看目录树
which
:查找命令所在路径
- [-a]:找出所有的而不仅仅是第一个
whereis
:查找命令所在路径、源代码文件、帮助信息文件所在的目录
-b :查找命令所在路径
-s :源代码文件
-m :只显示帮助信息所在的位置
locate/locatedb
:建立数据库,方便快速查找
- updatedb
- locate [文件或命令]
find
:查找文件
- find [path] [option] [option]
- -exec … ;
2.5 文件的隐藏属性
2.5.1 默认属性查看:umask
- 里面的数字代表需要减掉的权限(默认是022)
- umask 022 :代表只拿掉其他人的w权限
2.5.2 隐藏属性的查看及修改 chattr
chattr
配置文件的默认属性chattr [+-=] [ASacdistu] 文件或目录
第二参数介绍:
- A:不修改atime
- a:文件只能增加数据,不能删除数据【root】
- i :不能增加、删除、改名、设置链接、写入【root】
- s:删除时会彻底删除,不能恢复
- u:与s相反
lsattr
显示文件隐藏属性lsattr -[adR]
文件或目录- -a:将隐藏文件的隐藏属性也显示
- -d:如果后面接目录,仅将目录的属性显示,不显示里面的文件的
- -R:与-d相反,递归显示子目录的数据属性
/、 /dev/ 、 /tmp/ 、 /var/ 、 /etc/ 不受chattr保护
2.5.3 文件的特殊权限:SUID、SGID、SBIT
3. 磁盘与文件系统
3.1 磁盘
3.1.1 磁盘组成结构:
- 盘片:存储时每个盘片平均存储(如有100k数据存储在4盘片的磁盘上,则每个盘片存储25k)
- 磁头、轴、马达
3.1.2 磁盘逻辑结构
- 磁道:盘片以轴为中心组成的同心圆
- 扇区:磁道被分为多个扇区
- 柱面:不同盘片上相同编号的磁道组成柱面
3.1.3 磁盘延时
- 因磁头不能立刻到达目的位置,移动时会有延迟
- 磁头悬浮在盘片上
3.1.4 磁盘分区格式化
常见文件系统:FAT32 NTFS EXT2 EXT3 EXT4 XFS等(内核的功能)
- 低级格式化:
- 高级格式化:分区装入文件系统
- MBR:主引导记录,位于0磁道0柱面1扇区,512字节,分为3部分
- 446字节的
boot loader
(启动加载器,存放引导代码) - 64字节磁盘分区表
- 2字节
majic number
(检查MBR是否有效)
- 446字节的
- 主分区(最多4个):主分区+扩展分区 <= 4
- 扩展分区:16字节,只能有一个,扩展分区是一个指针,指向磁盘另外的位置,不能直接存储数据
- 逻辑分区:多的只能是逻辑分区
- 注意:扩展分区是容器,包含着所有的逻辑分区,存在包含关系
3.2 文件系统
文件系统:一套软件(XFS、NTFS、FAT、EXT3、EXT4等),存储数据或文件的一种格式,文件系统不存在于分区上,位于磁盘的某一个位置;文件系统把分区分割成两部分,一部分存放元数据,另一部分存放真正的数据
3.2.1特性:
matedata :元数据(与数据本身并没有关系,包括的是数据属性,比如数据归属,数据权限,数据的时间戳)
iNode:(index node)记录文件的属性,一个文件占用一个iNode,同时记录此文件的数据所在的区块号码
超级区块(super block):记录此文件系统的整体信息,包括iNode与数据区块的总量、使用量、剩余量,以及文件系统的格式与相关信息。
数据区块(block):实际记录文件的内容,若文件过大时,会占用多个区块。
block bitmap:在元数据区域,标记数据块是否被使用
读取规则:用户读取文件时,先找到文件的iNode,然后分析iNode所记录的权限与用户是否符合,若符合才能够读取文件内容
3.2.2 文件操作
- 删除文件:把数据对应的inode和block的值变为0,实际数据并没有删除
- 新建文件:
- 复制文件:重新建立新文件(新建inode等)
- 移动文件:改变inode和block的值,对数据没有操作(在同一个文件系统中是这样,若为不同文件系统,则会创建新文件然后删除旧文件)
- 链接文件:
- 创建语法:
ln [-s -v] src_file dst_file
不加任何参数就是创建硬链接- -s :创建软连接
- -v :显示详细过程
- 硬链接: inode相同,指向的是同一个数据文件(同一个inode可以指向多个文件)源文件被删除时,不会影响到新文件(只能在文件系统中进行硬链接,只能对文件进行硬链接)
- 软连接:
ln -s
:注意必须使用绝对路径,指向的是一个路径,文件大小是字符串(路径)的个数,源文件被删除时,会影响新文件,因为新文件指向的是一个路径,路径中的那个文件没有了自然会受到影响。(方便跨文件系统,可对目录操作)- 注意:删除软连接目录时,不要在最后加
/
- 注意:删除软连接目录时,不要在最后加
- 创建语法:
3.3 设备文件 /dev/
mknod [option] NAME TYPE [MAJOR MINOR]
:创建设备
- -m 设置权限
3.3.1 块设备:b

- 左边那列 (MAJOR)8 代表主设备号
- 右边那列(MINOR) 1,2 ,3 代表次设备号,次设备号分别代表分区
接口标识:IDE ATA : hd 、 SATA : sd 、SCSI : sd 、USB : sd
Linux以字母标识磁盘的个数:a:第一块、b:第二块 ……
Linux用数字标识分区:1-4 标识主分区,逻辑分区从5开始
/dev/sda2
表示STAT或SCSI类型的 第一块盘 的 第 2 个分区/dev/hdb5
表示IDE ATA 类型的磁盘 第二块这种盘 上面的第5个分区(第一个逻辑分区)
3.3.2 字符设备:c
3.4 格式化
- 低级格式化:划分磁道
- 高级格式化:为分区装载文件系统
- 文件系统:内核功能。常见:FAT32 NTFS EXT2 EXT3 EXT4 XFS等
- mkfs :(make file system) 创建文件系统(格式化)
- -t:指定文件系统
mkfs -t ext3 dev_name
VFS :虚拟文件系统。Linux内核的内容,类似于一个库,在这一层上兼容 其他的文件系统
3.4.1 命令
fdisk:针对MBR分区类型的工具
fdisk -l 查看磁盘列表、
cat /proc/partitons
也可以查看设备及分区fdisk /dev/sda :会进入fdisk的交互模式
- d:删除一个分区
进入fdisk交互模式后:
m:显示 fdisk 下的 子命令(选项)
l:显示linux支持的分区类型(磁盘ID)
5:扩展分区
82:交换分区
- 83: linux系统分区
8e: LVM 逻辑卷管理
- m:显示帮助信息
p:显示一些分区信息
n:创建一个新分区
- p:创建主分区(1-4)(具体分区请动手实践)
- e:创建扩展分区(5 - - )
- l:创建扩展分区后才可以创建逻辑分区
d:删除一个分区
q:不保存退出
- w:保存更改并退出
t:更改分区的系统ID
Centos6:按照柱面分区
Centos7:按照扇区分区
- gdisk:针对GPT分区类型的工具
- 强制使用gpt安装:在点击install centos linux 7之前,按 tab键,然后在下面输入 inst.gpt,然后回车,即可强制使用gpt格式安装。
3.5 挂载
3.5.1 命令
mount
:显示系统中挂载的所有设备mount dev_name /path
:path必须是空文件夹blkid
:查看设备的UUID 号mkswap :创建swap交换分区
- swapon dev_name:开启某个分区
- swapoff dev_name:关闭某个分区
3.5.2 开机自动挂载
/etc/fstab文件:修改这个文件即可实现开机挂载
UUID 挂载点 type(文件系统) default 0(是否检查) 0(是否备份)
3.5.3 卸载
umonut dev_name
4.shell
- shell启动后—>>进程:使用PID号进行区分,(在系统中,一个进程只认为自己存在)
- 父shell与子shell相互独立(父子shell之间环境相互独立)
cat /etc/shells/
:查看当前系统所支持的shell程序
4.1bash特性:
4.1.1命令历史:.bash_history
- history:
- -d:删除历史命令(history -d 第几行(开始) [连续几行]
- -c:清空当前内存的命令历史
- -w:将命令历史保存到某个文件中
- 使用技巧:
- !n:执行命令历史中的第n行命令
- !-n:执行命令历史中的倒数第n行命令
- !word:执行命令历史中最近一次的Word命令
- !!:执行上一条命令
- !$:引用运行的这个命令的之前所用过的最后一个参数
ESC键(按完松开). 键(按完松开)
4.1.2 管道,IO重定向:|
- 计算机体系结构:
- 控制器:CPU
- 运算器:CPU
- 存储器:RAM:内存
- 输入设备:(input):键盘、鼠标
- 输出设备:(output):屏幕、打印机
- 计算机总线:
- 地址总线:负责内存寻址
- 数据总线:负责传输数据
- 控制总线:负责控制指令
- 寄存器:CPU中内部临时存储空间
- I/O设备:负责计算机内部存储设备和外部存储设备(硬盘、光盘)
- 程序:指令+数据
- 指令:有程序提供,负责加工数据
- 数据:系统中数据可以有多个数据来源,比如来自变量、文件、输入设备
- 标准输入输出设备:
- 标准输入设备:键盘(stdin),文件描述符:0
- 标准输出设备:显示器(stdout),文件描述符:1
- 标准错误输出设备:显示器(stderr),文件描述符:2
- 三种数据流:
- 标准输入数据流 / 标准输出数据流 / 标准错误输出流
- 当在Linux中打开一个文件时,内核会反复调用,对于文件标识就很重要,用文件描述符来标识文件,文件加载完用数字标识 :fd(file descriptor)
IO重定向:把默认输入输出来源,重新定向到其他的文件或设备:
- 输出重定向:
- >:覆盖输出重定向
- >>:追加输出重定向
- 2>:错误覆盖输出重定向
- 2>>:错误追加输出重定向
- &>:混合覆盖输出重定向
- &>>:混合追加输出重定向
- 输入重定向:
- <:输入重定向
|
(管道):连接多条命令,把前一条命令的输出结果作为后一条命令的输入条件- 格式:command1 | command2 | command3 | …..
- 思路:北京 、河北保定、河北大学、 找 2018级 计算机系 3班 张三 (组合小程序,完成实现大功能)
- tr命令:实现字符转换:tr ’a-z‘ ’A-Z‘
- tee命令:把数据重定向到给定文件和屏幕上
- 管道使用例子:cat /etc/passwd | tr ‘a-z’ ‘A-Z’
4.1.2扩展—— 重定向的具体讲解
1.文件描述符
linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。
三个默认的文件描述符
- 标准输入:standard input 0 (默认设备键盘)
- 标准输出:standard output 1(默认设备显示器)
- 错误输出:error output 2 (默认设备显示器)
注意:
(1)以后再打开文件,描述符可以依次增加
(2)一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符。(3) 文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
(4) 一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。
(5)下面的学习注意理解重定向的含义。将标准的重定向到自定义的。
2.重定向
输入重定向 :
<
、<<
输出重定向 :
>
、>>
注意:此处涉及到shell的解析原理,仅做简单介绍
- bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向(之前说过了,输入输出操作都是依赖文件描述符实现的,重定向输入输出本质上就是重定向文件描述符),然后再把重定向去掉,执行指令
- 如果指令中存在多个重定向,那么不要随便改变顺序,因为重定向是从左向右解析的,改变顺序可能会带来完全不同的结果
<
是对标准输入 0 重定向 ,>
是对标准输出 1 重定向- 再强调一下, 重定向就是针对文件描述符的操作
3.输入重定向
格式:
[n]< file
:n是文件描述符。[]与<之间没有空格说明:将文件描述符 n 重定向到 word 指代的文件(以只读方式打开),如果n省略就是0(标准输入、键盘)


- 解释:解析器解析到 “<” 以后会先处理重定向,将标准输入重定向到file,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了file ,于是cat就从file中读取指令了。第二张图片,先定义了重定向,然后读cat文件

4.输出重定向
- 格式:
[n]> file
- 说明: 将文件描述符 n 重定向到word 指代的文件(以写的方式打开),如果n 省略则默认就是 1(标准输出)


- 第二张图同样是 先进行重定向,然后使用echo命令

5.标准输出与标准错误输出重定向
- 格式:
&> word
、>& word
- 说明:将标准输出与标准错误输出都定向到word代表的文件(以写的方式打开),两种格式意义完全相同,这种格式完全等价于
> word 2>&1
(2>&1 是将标准错误输出复制到标准输出,&是为了区分文件1和文件描述符1的)

- 解释:我们首先执行了一个错误的命令,可以看到错误提示被写入文件(正常情况下是会直接输出的),我们又执行了一条正确的指令,发现结果也输入到了文件,说明正确错误消息都能输出到文件。(
&>
是混合错误输出重定向)

6.文件描述符的复制
格式:
[n]<&[m]
、[n]>&[m]
(这里的所有字符之间不能有空格)说明:
- 这里两个都是将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
- 这里的& 目的是为了区分数字名字的文件和文件描述符,如果没有& 系统会认为是将文件描述符重定向到了一个数字作为文件名的文件,而不是一个文件描述符
一定要注意:重定向符号不能随意换位置
- cmd > file 2>&1
- cmd 2>&1 >file
- 第二句的意思是,先将标准错误输出重定向到1(显示器),然后将标准输出重定向到file,与第一句不同
7. exec 绑定重定向
格式:
exec [n]< file/[n]
、exec > file/[n]
注意:
- 格式:
exec [n]<>file
- 说明:以读写方式打开file指代的文件,并将n重定向到该文件。如果n不指定的话,默认为标准输入。
- exec仅仅对随后的一条重定向指令有效,第二条向后就失效了
- 格式:


8.HERE文件
格式:
<<[-]EOF
,说明:指定shell从当前输入源中读入行直至遇到仅包含EOF的一行(EOF后面也不能有空白符),然后所有读入的内容(不包括最后一行)作为标准输入传递给指令。‘-‘的作用是将每一行前面的tab去除后再读入。需要注意的是这个EOF不会进行任何扩展,但是如果EOF中没有字符没引号扩起来,那么here-document中的内容可以进行参数扩展、指令替换以及算术扩展(parameterexpansion, command substitution, and arithmeticexpansion);只要有任一字符被引号扩起来,delimiter仍是将去除引号的EOF,但是输入行不会进行任何扩展。
示例:
$ cat <
$(pwd) # 指令替换 > `pwd` # 指令替换的第2种形式 > $HOME # 参数扩展 > $((4+5)) # 算数扩展 > EOF /home/leo //此处开始扩展 /home/leo /home/leo 9 $ cat <<"EOF" > $(ls) > `pwd` > $HOME > $((4+5)) > EOF $(ls) //因为EOF有双引号,所以不会被扩展 `pwd` $HOME $((4+5))
9.HERE字符串
格式:
<<<word
说明:将扩展后的word作为标准输入传递给指令。
举例:使用这个功能可以将指令
echo ‘something’ |command
通过下面这种方式来实现
command <<<’something’
4.1.3 命令别名:(使用alias定义的别名只在当前shell中生效)
alias
: alias ll=‘ls -l’(等号后不能有空格,等号后用英文单引号、双引号引起来)unalias
:unalias 命令别名
4.1.4 命令行编辑
Ctrl+a
:光标快速跳转到命令行行首Ctrl+e
:光标快速跳转到命令行行尾Ctrl+u
:快速删除光标位置到命令行行首的字符Ctrl+k
:快速删除光标位置到命令行行尾的字符Ctrl+l
:清屏(clear)
4.1.5 命令行展开
命令补齐:在path变量中搜索命令并补齐(不能补齐选项)
路径和文件补齐:在系统路径中查找
命令替换:(常用在编程中)
将命令中的子命令替换成子命令执行结果的过程:$(command)、`commamd `(两边是反撇号)
" "
(双引号):弱引用(可是实现变量的替换,把变量名替换为变量值)``(反撇号):命令引用
‘’
(单引号) :强引用,不会替换
##### 4.1.6 命令行通配
- * :匹配任意长度的任意字符
- ?:匹配任意单个字符
- []:匹配指定范围内的任意字符:[ab][a-z][A-Z][0-9][a-zA-Z][a-zA-Z0-9 ]
[^]:匹配指定范围外的任意字符
- [:space:]:代表空格
- [:punct:]:表示所有标点字符
- [:lower:]:表示所有小写字母
- [:upper:]:表示所有大写字母
- [:alpha:]:表示所有字母(包括大小写)
- [:digit:]:表示所有数字
- [:alnum:]:表示所有数字和大小写字母
4.1.7 变量
4.1.8 编程
5. Linux账号与用户组
5.1 用户管理重要文件的解释
5.1.1 用户标识符
用户:UID
组:GID(逻辑容器:包含用户,实现集中授权)
用户分类
- 管理员用户:root UID:0
- 普通用户: 1000-65535
- 程序(系统)用户:1-999
组分类
1.第一种分类方式(按照用户分类):
管理员组:root
基本组:Linux创建新用户时,如果没有指定隶属的组,则系统为用户建立一个同名的用户组
附加组:一个用户可以有多个附加组(有效组)
2.第二种分类:
- 管理员组:root
- 普通用户组:
- 系统用户组:
5.1.2 UID/GID解析
识别思路:字符–>解析–>UID/GID
/etc/passwd
:存储用户基本信息/etc/shadow
:存储用户的影子口令/etc/group
:存储组的用户信息
5.1.3 /etc/passwd 解释
- 第一列:用户名(name)
- 第二列:加密密码(x表示密码占位符,密码保存在/etc/shadow中)
- 第三列:UID
- 第四列:GID
- 第五列:描述信息
- 第六列:用户的宿主目录
- 第七列:用户默认使用的shell(/etc/shell)
5.1.4 /etc/shadow 解释
- 第一列:用户的登录名
- 第二列:用户加密后的密码
- 第三列:最后一次更改密码的时间(时间戳)
- 第四列:密码不可以修改的天数
- 第五列:密码需要重新修改的天数
- 第六列:密码需要修改前的警告天数
- 第七列:密码过期后账号宽限时间
- 第八列:账号失效日期
- 第九列:保留 (暂时没用)
5.1.5 /etc/shadow 密码区域解释
三部分组成:用$隔开(格式:$id$salt$encrypted)
- 第一部分:加密算法
- 1:md5加密
- 5:SHA-256加密
- 6:SHA–512加密
- 第二部分:随机序列号(salt)
- 第三部分:随机序列号和设置密码共同加密后的字符串
5.1.6 /etc/group 解释
- 第一列:组名字
- 第二列:组的密码区域
- 第三列:组的id号(GID)
- 第四列:组的成员(不显示初始化成员)
5.1.7 /etc/gshadow 解释
- 第一列:组的名字
- 第二列:组的密码
- 第三列:组的管理员
- 第四列:组的成员列表
5.2 重要的文件
5.2.1 /etc/useradd目录(只对新用户有效):
# useradd defaults file //注释行
GROUP=100 //可以创建普通组
HOME=/home //普通用户宿主目录(在home下生成和用户同名的目录)
INACTIVE=-1 //是否启用用户过期停止使用权(若为数字,则代表过期宽限时间,-1代表不启用)
EXPIRE= //设定过期时间
SHELL=/bin/bash //设定用户默认使用的shell
SKEL=/etc/skel //新用户宿主目录模板目录
CREATE_MAIL_SPOOL=yes //是否为用户启用邮件通知
5.1.2 /etc/skel 目录(用户宿主目录模板目录,只对新建用户生效):
新用户的目录下必须有这三个文件
.bash_logout
:用户注销时执行的命令.bash_profile
:用户登录系统时执行的命令(用户变量).bashrc
:用户登录一个新shell时执行的命令
5.1.3 /etc/login.defs 文件解释:(只对新建用户生效)
- MAIL_DIR /var/spool/mail
- PASS_MAX_DAYS 99999 //密码最长使用时间
- PASS_MIN_DAYS 0 //密码最短使用时间,0代表不受限制
- PASS_MIN_LEN 5 //密码最小长度
- PASS_WARN_AGE 7 //密码过期警告时间
- UID_MIN 1000 //普通用户最小UID号
- UID_MAX 60000 //普通用户最大UID号
- SYS_UID_MIN 201 //系统用户最小的UID
- SYS_UID_MAX 999 //系统用户最大的UID
- GID_MIN 1000 //普通组最小GID
- GID_MAX 60000 //普通组最大UID号
- SYS_GID_MIN 201 //系统组最小的UID
- SYS_GID_MAX 999 //系统组最大的UID
- CREATE_HOME YES //是否创建宿主目录
- UMASK 077 //关于权限的反掩码
- USERGROUPS_ENAB YES //删除用户时是否删除组
- ENCRYPY_METHOD SHA512 //用户密码的加密方式
5.3 用户管理命令
5.3.1 useradd
:添加新用户(更改/etc/passwd、/etc/group、/etc/shadow)
- 语法:
useradd [options] user_name
- -c:新建用户时,为用户添加描述信息
- -d:指定用户的宿主目录
- -D:查看和修改默认配置(修改/etc/default/useradd文件中的默认值)
- -g:修改默认的组
- -b:修改默认宿主目录
- -f:修改过期是否停用
- -e:修改过期时间
- -s:修改默认shell
- -e:新建用户时,设置过期时间(格式:YYYY-MM-DD)
- -g:指定用户的基本组(没有该选项时,Linux会建立一个同名组作为用户的基本组)
- -G:新建用户时,指定用户的附加组,附加组可以有多个
- -m:创建宿主目录(必须与 -k 一起使用)
- -M:创建用户时,不为用户创建宿主目录
- -p:创建用户时,为用户设置加密的密码(不推荐使用)
- -r:创建系统用户
- -s:指定默认的shell(系统支持的shell)
- -u:指定用户的UID
- 手动添加用户需要
- 1.将数据写入/etc/passwd、/etc/shadow、/etc/group
- 2.在/home/下建立相应文件夹
- 3.将/etc/skel/下的文件复制到/home/用户 / 文件夹下
5.3.2 passwd
:为用户设置密码、锁定解锁用户、查看用户状态
语法:
passwd [options] user_name
passwd user_name :直接设置密码
-l:锁定用户(暂时无法登陆)
-u:解锁用户
-S:查看用户状态,显示/etc/shadow文件中各个字段的内容
–stdin:标准输入,经常在shell脚本编程中为用户自动设置密码
-d:删除用户密码,允许普通用户以空密码登陆,仅root用户可以使用
-e:快速设置密码过期(用户再次登录时需要修改密码)
-n:设置密码最小使用期限
-x:设置密码最大使用期限
-w:设置密码过期前的警告时间
-i:修改密码过期后的宽限时间
普通用户设置密码时,先验证当前密码,并且要求符合密码规范
root用户设置密码时,不需要验证密码,并且可以不符合密码规范
5.3.3 userdel
:删除用户(passwd、shadow、group都修改删除)
语法:
userdel [options] user_name
-r :删除用户时,连同用户的宿主目录一块删除(如果不加,则不删除)
5.3.4 usermod
:修改用户属性(root可以通过vim进行修改)
- 语法:
usermod [options] user_name
- -c:更改用户的描述信息
- -d:更改用户的宿主目录
- -e:更改用户的过期时间
- -f:修改/etc/shadow中第七列的内容
- -g:修改用户的基本组
- -G:修改用户的附加组
- -l: 更改用户的登录名(重命名、不修改宿主目录)
- -s:修改用户的shell
- -L:锁定用户
- -U:解锁用户
5.3.5 chsh
:修改用户的shell
- 语法:
chsh [options] user_name
- -s:后面跟shell,更改用户的shell
- -l:显示系统当前支持的shell
- 在/etc/目录下添加 nologin.txt 文件,则可以进行提示
5.3.6 finger
:显示用户的基本信息(需要安装)
- 语法:
finger [options] user_name
- -s、-l、
5.3.7 chfn
:修改用户的基本信息
- 语法:
chfn [options] user_name
- -o:修改办公室
- -p:修改办公室电话
- -h:修改家庭电话
5.3.8 id
:显示用户和组的ID号
- 语法:
id [options] user_name
- -a:忽略其他版本的区别
- -Z:显示安全上下文的内容(内核)
- -g: 显示有效组号
- -G:显示所有组号(基本组、附加组)
- -n:显示名字(与ugG连用)
- -u :显示id
5.3.9 chage
:修改用户密码的时间信息
- 语法:
chage [options] user_name
- -l :列出用户的详细的密码参数
- -d:修改/etc/shadow第三列的内容(后面日期格式:YYYY-MM-DD)
- -E:修改/etc/shadow中第八列的信息,后面跟日期
- -I:修改/etc/shadow中第七列的内容,后面跟天数
- -m:修改/etc/shadow中第四列的内容,后面跟天数
- -M:修改/etc/shadow中第五列的内容,后面跟天数
- -w:修改/etc/shadow中第六列的内容,后面跟天数
5.4 组管理命令
5.4.1 groupadd
:创建组
- -g:指定组的id
- -r:创建系统组
5.4.2 groupdel
:删除组
- 默认情况下不能删除用户的基本组,可以通过修改用户的基本组后删除组,可以删除用户的同时系统删除基本组(该组是一个用户的基本组)
5.4.3 groupmod
:修改组的属性
- -g:修改组的id号
- -n:重命名
5.4.4 gpasswd
:为组设置密码、管理员、添加成员
- -A:设置组管理员
- -M:批量添加成员
- -r:移除组的密码
- -R:让组的密码失效
- -a:为组添加成员(组管理员的命令)
- -d:删除组成员(组管理员的命令)
5.4.5 newgrp
:为用户修改有效组(只在当前shell生效)
- exit:退出newgroup
5.4.5 groupmems
:为组添加成员,显示组成员列表
6. 认证
6.1 nsswitch
:名称解析
认证的中间桥梁,通过libnss库
位置:/etc/nsswitch.conf
查看so文件的命令:readelf 命令
getent hosts www.baidu.com
:查找百度的解析地址getent 文件 内容
6.2 PAM 验证
6.2.1 相关文件
- 嵌入式认证模块,PAM 本身不会执行验证,必须执行策略和模块进行验证
ldd
命令 :查看与服务相关的模块ldd service_path
- /etc/pam.d/service_name (系统中支持pam认证的服务名称)
- /etc/pam.d/other (当系统中支持pam认证的服务没有匹配到任何条目时,匹配other中的配置)
6.2.2 /etc/pam.d/service_name格式
格式:type control modules [modules_args]
type :
- auth(authentication):身份验证,匹配用户名密码
- account :检查用户名和密码的有效性!有效性
- password :检查修改密码时,密码是否符合标准
- session :检查用户会话相关属性
control:
- required:一票否决权,继续匹配下面的条目,最后不匹配(保护系统安全性)
- requisite:一票否决权,不继续匹配下面的条目,直接给用户返回结果
- sufficient:一票同意权,不匹配下面的条目,直接给用户返回结果(慎用)
- optional:不影响最终的结果
- include:引用其他的配置文件,把匹配权交给其他配置文件,(如果其他匹配跳出,则整个匹配结束)
- substack:引用其他配置,把匹配权交给其他配置文件(如果其他配置跳出,则仅仅跳出子匹配)
modules:匹配认证模块 (value = action)
- value:
- success、open_err、symbol_err、service_err、 system_err、buf_err、perm_denied、auth_err、cred_insufficient、authinfo_unavail、user_unknown、maxtries、new_authtok_reqd、acct_expired、 session_err、cred_unavail、cred_expired、cred_err、no_module_data、conv_err、 authtok_err、authtok_recover_err、authtok_lock_busy、authtok_disable_aging、 try_again、ignore、abort、authtok_expired、module_unknown、bad_item和default.最后一个(default)能够用来设置上面的返回值无法表达的行为.
- action值:
- ignore:忽略执行结果
- bad:如果失败,结果被用于整个执行栈,后续栈继续执行
- die:和bad相似,但是失败直接返回结果,后续栈不执行
- ok:如果PAM_SUCCESS覆盖之前值
- done:和ok 相似,但是栈直接返回结果
- reset:重置栈当前状态
- 部分语法:
- required [success=ok new_authtok_reqd=ok ignore=ignore default=bad]
- requisite [success=ok new_authtok_reqd=ok ignore=ignore default=die]
- sufficient [success=done new_authtok_reqd=done default=ignore]
- optional [success=ok new_authtok_reqd=ok default=ignore]
- modules:PAM认证模块相关文件:
- /etc/pam.d/*:每一个应用程序PAM配置文件
- /usr/lib64/security/*:PAM认证模块文件的实际存放位置
- /etc/security/*:其他PAM环境的配置文件,比如 access.conf
- /usr/share/doc/pam-x:存放详细的PAM的说明文件
- value:
查看应用程序是否支持PAM认证:
- ldd app_path
- 如: ldd /usr/sbin/vsftpd | grep libpam
- 如:ldd `which httpd` | grep libpam
linux-pam 官方文档下载地址: http://www.linux-pam.org/
部分pam-*.so文件解释:
- pam_env.so:设置环境变量的模块,如果需要额外的环境变量,可以使用
- pam_env.so进行设置,配置文件/etc/security/pam_env.conf
- pam_unix.so:提供验证阶段的验证功能,也可以提供授权管理
- pam_secruetty.so:限制系统管理员只能够从安全的终端登录,安全终端:/etc/securetty
- pam_nologin.so:限制普通使用者能否登录主机进行使用,当/etc/nologin文件存在时,所有的普通用户都无法登录
- pam_cracklib.so:可是限制恶意攻击,检查密码强度
- pam_pwquality.so:完全兼容pam_cracklib.so,检查密码强度,包括设置的密码是否在字典
- pam_limits.so:限制使用者打开文件数量,单个文件大小
- pam_rootok.so:如果UID为0,直接通过,如root用户su到普通用户使用此模
- pam_listfile.so:验证使用其他的文件
- pam_access.so:控制访问的模块,默认配置/etc/security/access.conf: ALL EXCEPT gooann:ALL
7. 软件包管理:RPM(Redhat Package Manager)
7.1 应用程序
源代码 —— 编译 —— 链接 —— 运行
应用程序:具有执行权限的就是。与CPU架构密不可分
编译:生成二进制文件(可执行文件),匹配底层架构
链接:
- 库:静态库和动态库 .so (shared object)
- 静态链接过程:把库文件集成到应用程序中
- 动态链接过程:库文件与应用程序分开,做链接,运行时调用
- 库:静态库和动态库 .so (shared object)
程序 = 数据 + 指令 应用程序运行时,申请CPU和内存资源
应用程序中包含的内容:
- 二进制文件(可执行程序)(/bin、/ sbin、/usr/bin、/usr/ sbin)
- 库(/usr/lib)
- 配置文件(/etc)
- 帮助文件(/usr/share/)
7.2 内存地址空间
- text:存放指令
- data+bss:data存放数据,bss: block system of symbol 存放初始化为0的变量
- 堆:heap存放运行中临时文件
- 栈:存放应用程序的变量和函数等
7.3 软件安装——RPM
Redhat ,SUSE:RPM
Debian ,Ubuntu:dpt
前端工具:yum apt-get (自行解决依赖关系)
后端工具:RPM dpt (不能自行解决依赖关系)
7.3.1 RPM的优点
- RPM软件包中包含了编译过的程序与配置文件,用户不需要重新编译
- RPM在安装之前,首先会检查硬盘容量,操作系统版本等,避免被错误安装
- RPM使用RPM数据库管理(/var/lib/rpm),数据中记录应用程序的参数,便于升级,卸载,查询等
- RPM本身会提供应用程序版本信息,相关属性,软件名称,用途等。便于用户了解软件
7.3.2 RPM包的组成
RPM命名:
包:组成部分
- 主包:yum-3.4.3-150.e17.centos.noarch.rpm
- 子包:yum-langpacks-0.4.2-7.e17.noarch.rpm
包名格式:
- name-version-release.arch.rpm (noarch代表任何架构都可以使用)
其中的version:
- 主版本号:功能重大改进则改进主版本号
- 次版本号:某个子功能发生重大变化
- 发行号:修正了部分bug,调整了一点功能
RPM的功能:安装、查询、卸载、升级、校验、数据库重建、验证数据包
两种类型的包:
RPM包:经过源代码编译后的软件包
.tar.gz:源码包,没有经过编译
RPM的命令:
- 安装:
rpm -ivh name.rpm
- -i :安装
- -h :打印50个#号显示进度条
- -v :显示更详细的信息
- –nodeps:忽略依赖关系,可能导致软件包安装不完整
- –replacepkgs :重新安装,替换原有安装;
- –force:强行安装,可以实现重装或降级;
- 查询:
RPM -q PACKAGE_NAME
: 查询指定的包是否已经安装
- -qa :查询已经安装的所有包
- -qi PACKAGE_NAME:查询指定包的说明信息;
- -ql PACKAGE_NAME:询指定包安装后生成的文件列表;
- -qc PACEAGE_NEME:查询指定包安装的配置文件;
- -qd PACKAGE_NAME:查询指定包安装的帮助文件;
- -qf /path/to/somefile:查询指定的文件是由哪个rpm包安装生成的;
- -q –scripts PACKAGE_NAME:查询指定包中包含的脚本
- 脚本:包含软件包安装前(preinstall),安装后(postinstall),卸载前(preuninstall),卸载后(postuninstall)执行的脚本
- 未安装前查询
如果某rpm包尚未安装,我们需查询其说明信息、安装以后会生成的文件:
rpm -qpi /path/to/package_name 查看未安装软件包信息
rpm -qpl /path/to/package_name 查看未安装软件包 安装的列表
- 升级
- -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,则安装;
- -Fvh / PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,退出;
- -Uvh – oldpackage PACKAGE_NAME:降级
- 卸载
- rpm -e PACKAGE_NAME [– nodeps:忽略依赖关系]
- 校验:验证软件包列表或配置文件的完整性
rpm -V PACKAGE_NAME
应用程序配置文件完整性破坏后的代码
5 MD5校验和 S 文件大小 L 符号连接 T 修改时间 D 设备 U 用户 G 组 M 模式(包括许可和文件类型)
- 重建数据库
- rpm – rebuilddb :重建数据库,一定会重新建立
- rpm – initdb :初始化数据库,没有才建立,有就不用建立
- 检查来源合法性,及软件包完整性
- ls /etc/pki/rpm-gpg/
- RPM-GPG-KEY-redhat-release
- rpm -K /path/to/package_file
- dsa ,gpg:验证来源合法性,也即验证签名;可以使用 – nosignature,忽略此项
- sha1,md5:验证软件包完整性;可以使用 –nodigest ,忽略此项
- rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7
7.4 软件安装——YUM
YUM 解决依赖关系,RPM进行安装卸载
yum采用C/S架构,依靠yum 仓库(web,ftp,file)
- yum配置文件:/etc/yum.conf
- yum仓库:/etc/yum.repos.d/
7.4.1 yum功能:
install:安装软件包
update:升级软件包
check-update:检查软件包的升级信息
upgrade:更新软件包
remove :卸载软件包
list:显示所有已经安装和未安装的软件包
info:查看软件包信息
clean:清除软件包一些信息和网络源缓存
search:查看指定软件包相关的软件包
deplist:查询软件包依赖关系列表
repolist:查看可用的yum源
repoinfo:查看可用yum源的信息
7.4.2 yum源( /etc/yum.repos.d/
):
//每个仓库分别是一个文件,文件名以.repo结尾
[name] //id
name = //引用变量
baseurl = //yum仓库
enabled = //是否启用该yum仓库
gpgcheck = //是否进行完整性和校验和检测
gpgkey = //完整性和校验和检测文件
yum仓库:
- $releasever:发行版本
- $basearch:CPU架构集
- $arch:CPU架构
yum元数据目录:repodata
- primary.xml.gz :所有RPM列表;依赖关系;软件包安装列表
- filelist.xml.gz :包含所有RPM 包的所有列表
- other.xml.gz :包含软件包其他信息,比如更改记录
- repomd.xml:包含primary/filelist/other时间戳和校验和
- comp.xml:包含软件包组的列表
创建元数据目录
- 先使用网络源安装createrepo
- yum -y install createrepo
- 在本地源(包含所有安装包的路径)下,创建元数据目录
- createrepo /opt/repo # 这个目录下提前放置了需要放到源中的安装包
- 直接通过修改repo源,使用本地源即可
7.4.3 创建自己的yum源
两台机器
yum源:192.168.10.10
ftp方式:
- # mount /dev/cdrom /media
- # yum -y install vsftpd
- # systemctl start vsftpd
- # systemctl enable vsftpd
- # cp -rf /media/ /var/ftp #(这个目录是Linux默认共享的ftp目录)
httpd方式:
- # mount /dev/ cdrom/media
- # yum -y install httpd
- # systemctl start httpd
- # systemctl enable httpd
- # cp -rf /media/ /var/www/html #(这个目录是Linux下默认共享的http目录)
yum客户端(个人电脑):192.168.10.20
ftp: vim ftp.repo
[ftp]
name=file_repo
baseurl=ftp://192.168.10.10/media
enable=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7
- httpd: vim httpd.repo
[httpd]
name=httpd_repo
baseurl=http://192.168.10.10/media
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
- 本地源: vim file.repo
[httpd]
name=httpd_repo
baseurl=file:///media #光盘挂载的目录
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
注意:在创建本地源时,可能会因为没有元数据目录(repodata)而导致失败,所以要创建元数据目,创建方法看上面 7.2 yum源 –> 创建元数据目录
7.4.4 使用epel源
https://mirrors.tuna.tsinghua.edu.cn/help/epel/
7.5软件安装——编译安装
7.5.1 安装开发工具组
包括gcc、g++等
- yum -y groupinstall “Development Tools”
7.5.2 编译链接工具
automake —-> makefile.in(半成品) –(通过configure)–> makefile
autoconf :生成脚本文件:configure,参照makefile.in 生成makefile
make:不是编译工具,而是项目管理工具,按照makefile文件中的定义,去定义软件中功能向后顺序
makeinstall:安装
#执行编译安装步骤
1. 获取源代码并解压
# tar xf xxx.tar.gz
# tar xf xxx.tar.bz2
2. 执行configure脚本 (在源码目录中运行) ./configure --...
功能:1.检查应用程序所需要的编译环境 2.生成Makefile 3.定制功能
选项:--help:进行查看脚本帮助信息
--prefix=path:定义应用程序安装路径
--sbin-path=PATH :定义应用程序的二进制程序
--conf-path=PATH :定义应用程序配置文件路径
--enable--xxx:开启某项功能(如应用程序支持该功能,但默认不安装)
--with--xxx:开启某项功能(如应用程序支持该功能,但默认不安装)
--without--xxx:关闭某项功能(如应用程序支持该功能,默认安装,但是我不需要)
--user=USER:指定应用程序执行的用户
--group=GROUP:执行应用程序执行的组
解决configure错误信息
1. 用without关闭这项功能(不建议使用)
2. 安装所需的环境,安装所需环境的开发包
3. 执行make :定义Makefile按照哪种顺序去编译源程序
-j N:多线程编译(速度快)
4. make install :安装应用程序
//编译安装完成后工作:
1:添加应用程序的二进制程序到系统路径:系统查找$PATH
1.1:为二进制程序做链接文件
# 1n -s /usr/ local/tengine/sbin/* /usr/sbin
# ln -s /usr/local/tengine/sbin /usr/sbin/tengine
1.2:修改/etc/profile文件
1.3:在/etc/profile.d/目录中建立name.sh的文件
2:添加应用程序的库文件到系统库文件路径:库文件:/usr/lib /usr/1ib64
2.1:为库文件做链接文件
# ln -s /usr/local/APP_NAME/lib/* /use/lib
# ln -s /usr/local/APP_NAME/lib /usr/lib/APP_NAME
2.2:在 /etc/ld.so.conf.d/ 目录下建立APP_NAME.conf,把应用程序的库文件位置添加进去
# ldconfig
-v :显示加载库文件的过程
3:添加应用程序的头文件到系统头文件路径:系统头文件: /usr/include
3.1:为头文件做链接文件
# ln -s /usr/local/APP_NAME/include/* /usr/include
# ln -s /usr/local/APP_NAME/include /usr/include/APP_NAME
4:添加应用程序的帮助信息
4.1: man -M PATH bin_name :-M 指定帮助信息的位置
4.2: man配置文件:系统默认帮助:/usr/share/man/
centos6:: /etc/man.config 添加:MANPATH [HELP_PATH]
centos7:: /etc/man_db.conf 添加:MANPATH_MAP [HELP_PATH]
8. 进程管理
8.1 进程的概念
进程:应用程序或者数据在系统中按照顺序执行的活动过程,是操作系统架构基础;
本小节内容请学习操作系统原理,如已学习,可跳过不看
OS = kernel + process:进程只能运行在CPU和内存中
进程特性 :动态性 并发性等
CPU分环运行:
- 0环:特权环,运行内核 (内核空间)
- 1-2 环:库文件
- 3环 :进程环(用户空间)
CPU一个时间点只能运行一个程序,按照时间片
例:mkdir: mkdir /data :system call :系统 I/O
task struck:进程的数据结构(存放在内核中)
task struce结构:状态 进程信息和内核栈 运行列表(指令等) MM(内存管理单元)
PID :进程ID号 群组信息 用户信息 文件系统 文件描述符等
MMU:memory mangement unit :内存管理单元
context switch :进程切换,上下文切换
进程内存结构:forbidden:内核空间
program text:指令
data+bss:全局变量
heap:堆空间
shared library :共享库
stack:栈空间,进程运行时调用的数据
thread:线程,轻量级进程
运行进程的模式:多进程模式(每一个请求生成一个进程:进程切换)
单进程多线程:每个线程去响应
lock:死锁,自旋锁等
kernel :内存管理 网络管理 安全管理 驱动管理 进程管理等
进程:父子关系 进程状态 优先级
进程优先级:0-139 数字,共140个优先级
0-99 :系统优先级(用户不可控优先级)
100-139:nice值(用户可控优先级);-20 到19;
root用户可以调整nice值;普通用户只能调0-19
高优先级进程:获取更多的CPU运行时长,更优先的让CPU执行
大O标准:O(1) O(n) O(logn) O(2^n) O(n^2)
8.2 进程管理命令
进程分类:
和终端相关的进程:用户进程
和终端无关的进程:内核进程
8.2.1 ps
process status :进程状态查看,运行ps那个时刻系统进程状态;
BSD风格(不使用连字符),sys V风格使用连字符),GNU长选项(使用两个连字符)
- a:显示和终端有关的进程
- u:显示进程用户的信息
- x:显示和终端无关的进程
- -e:显示所有进程信息
- -l:显示进程长格式
- -F:显示进程的完整信息
// 命令:ps au //数据格式解析
USER:该进程是有哪个用户发起的
PPID:父进程号
PID:进程号/proc目录存放着进程相关的信息。
在CentoS7中PID为1的进程是systemd
在CentOS6中PID为1的进程是init进程
%CPU:该进程占用的CPU百分比
%MEM:该进程占用内存的百分比
VSZ:虚拟内存集(计算进程所占物理内存时,物理内存包括共享库的空间)
RSS:常驻内存集(进程中不能被交换出去的)
TTY:运行在哪个终端
STAT:进程状态
D:不可中断睡眠状态
S:可中断睡眠状态
R:运行状态
T:停止状态
z:僵尸状态
s:session leader (会话的领导者)
<:优先级较高的进程(用户不可控)
N:优先级较低的进程(用户可控进程)
1:多线程进程
L:在内存中锁定分页
+:前台进程组中的进程
START:进程启动时间
TIME:该进程在CPU中实际运行的时长
COMMAND:该进程命令名称
//ps -elF :结果解析
//部分解析在上面已经介绍,不再重复,仅介绍几个常用的。
PRI :系统分配的优先级(用户不可更改)
NI:nice值
//调整进程的nice值的命令:
调整正在运行进程nice,(调整nice值就是为了影响系统优先级)
renice [nice number] PID
指定进程运行的nice值(让某个'命令'以指定nice运行)
nice -n [nice_number] COMMAND
8.2.2 top
//top结果解析
第一行:当前系统时间 系统运行时长 登录系统的用户个数 过去1分钟,5分钟,15分钟平均负载
第二行:进程总数 正在运行的进程数 睡眠的进程数 停止状态进程数 僵尸状态进程数
第三行:CPU相关信息(按1键可查看每个CPU的信息):us:用户进程所占CPU百分比 sy:系统进程所占CPU百分比 ni:nice所占CPU百分比 id:空闲进程所占CPU百分比 hi:硬件中断所占CPU百分比 si:软件中断所占CPU百分比 st:被hypervisor偷走的CPU的百分比
第四行:物理内存相关信息
第五行:交换分区相关信息
top交互式命令:
M:按所占内存百分比进行排序
P:按所占CPU百分比进行排序
T:按进程运行时长进行排序
c:是否显示command这一列的完整路径
l:是否显示top第一行
t:是否显示top第二行和第三行
m:是否显示内存的相关信息
k:杀死某个进程
q:退出top进程
8.2.3 其他相关命令
pstree
:查看进程树pgrep
:查看某个进程的PID 号 pgrep process_namepidof
:查看某个进程的PID 号 pidof process_namekill
:杀死某个进程(向进程传递某个信号)- kill -l :查看信号列表
- 信号列表( 信号:进程间的通信 IPC )
- 1:SIGHUP :不停止服务的情况下,重新读取配置文件,并且应用配置文件中的设置
- 2:SIGINT:(Ctrl+C):中断某个进程
- 9:SIGKILL:强制杀死某个进程
- 15:SIGTERM:终止某个进程(默认信号)
- kill 语法:
- kill - sig_number PID
- kill - sig_name PID
- kill %number :杀死后台某个作业,%不能省略
killall
:杀死整个进程树,用法同kill
前台进程:利用终端执行的进程
后台进程:运行执行时不利用终端进行执行的进程
前台 ——> 后台:(前台调入后台)
- Ctrl+z:把正在运行的进程调入后台,并停止运行
&
:启动时直接调入后台运行
jobs
:查看后台运行的作业+
:下一次将要运行-
:下一次将要运行的第二个后台作业kill %1
:杀死后台运行号为1的进程(注意加%)
bg
:把进程调入后台继续运行fg
:把后台进程调入前台继续运行 ‘fg num’
9. 任务计划
9.1 一次性任务计划:
9.1.1 at
at
:设置系统在某一个时间点执行的任务,执行结果以邮件的方式发送给任务发起者- 语法:
# at data_time
at>at_command1
at>at_command2
at>ctrl+d //保存退出
//注意:at任务计划需要atd服务的支持,atd服务开启方法
# systemctl start atd
# systemctl enable atd
# systemctl status atd
//Linux中设置at任务后,会在/var/spool/at/目录生成at任务计划的文件,按照文件名的排序顺序执行
- data_time时间日期写法:
绝对时间:
HH:MM:具体时间
DD.MM.YY:天.月.日
YY-MM-DD:年-月-日
MM/DD/YY:月/日/年
HH:MM YY-MM-DD
相对时间:
at now+3minutes:从任务计划创建时间开始的3分钟后执行
- 相关文件:
- /etc/at.allow :at任务计划的白名单,仅允许此文件中的用户执行at
- /etc/at.deny :at任务计划的黑名单,仅拒绝次文件中的用户执行at
- 系统先查找/etc/at.allow,再去查找/etc/at.deny,如果两个文件都没有,只有root用户能执行
at
命令的相关参数:- -l:查看系统中at任务列表,相当于atq
- -r:删除系统中的at列表,相当于atrm
- -d:删除系统中的at列表,相当于atrm
- -c:列出后续at任务的具体指令内容
9.1.2 batch
用法与at相同,不过batch任务计划是在CPU空闲时执行,但CPU的负载小于0.8时执行batch设定的任务
- 语法:与at基本一致,请查看at的语法和时间格式
- uptime:查看CPU平均负载
9.2 周期性任务计划
9.2.1 系统周期性任务
- 日志轮换:logrotate
- 登录文件分析:logwatch
- 创建located数据库:
- 创建man帮助信息数据库:centos6:makewathis,centos7:mandb
- RPM软件登录文件的创建
- 与网络相关的分析行为
9.2.2 用户周期性任务
- cron:设置周期性任务计划
- anacron:当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务
1.cron:设置周期性任务计划
crond服务开启:
# systemctl start crond
# systemctl enable crond
# systemctl status crond
相关文件:
- /etc/cron.allow :cron任务计划的白名单
- /etc/cron.deny :cron任务计划的黑名单,系统默认情况下保留黑名单
- /etc/crontab:cron配置文件解析:
SHELL=/bin/bash //各任务计划执行使用的shell程序
PATH=/sbin:/bin:/usr/sbin:/usr/bin //PATH路径
MAILTO=root //
- /etc/cron.d:cron辅助配置文件目录(里面放的是脚本)
- cron.hourly:由cron工具去执行
- cron.daily cron.weekly cron.monthly 是由anacron工具去执行
- /var/spool/cron:用户cron任务计划的配置文件,Linux用户设置完cron任务后,会在/var/spool/cron目录下生成以用户名名称的cron文件
crontab
命令:设置/查看/删除cron任务计划,执行结果用邮件发送
- -e:编辑cron任务内容
- -u:为指定用户设置cron任务计划(只有root用户能使用)
- -l:查看cron任务列表 (/etc/crontab)
- -r:删除所有的cron列表
设置cron任务时间语法:
- 系统设置:
- 分 时 日 月 周 用户 命令
- 用户设置:
- 分 时 日 月 周 命令
- 时间取值范围:
- 分钟:0-59
- 小时:0-23
- 日期:1-31
- 月:1-12 (英文缩写也可以)
- 周:0-7(0和7都代表周日)(英文缩写也可以)
*
代表任意- 离散时间段:
,(逗号)
- 5,15,30,45,56 17 * * * cat /etc/fstab
- 17点当中的 5分,15分,30分,45分,56分执行这个命令
- 连续时间段:
-
(中横线)- 00 23 * * 1-5 cat /etc/fstab
- 周一到周五,每天23点00执行这个命令
- 间隔时间段:
*/n
- */5 * * * * cat /etc/fstab
- 每隔5分钟执行一次
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任务时,使用命令的绝对路径
2.anacron:当cron周期性任务由于某种原因没有执行,anacron重新执行cron任务
- 语法:
anacron [options] [job]
-s : 依据时间记录文件去判断是否执行
-f : 强制执行
-n : 立刻执行为运行的任务,不需要延时
- 相关文件:
- /etc/anacrontab //该文件具体内容在Linux中查看
- /var/spool/anacron
- 执行流程:
- 1.由/etc/anacrontab 分析到 cron.daily 天数为1天
- 2.由/var/spool/anacron/cron.daily 取出最近一次执行anacron时间戳
- 3.由2步骤分析出的时间戳和任务进行比较,查看哪些cron任务超过1天没有执行
- 4.准备执行指令,根据/etc/crontab的设置,将延时执行
- 5.延时时间过后,执行指令
10. 文件查找专题
10.1 常用查找
which
:查找命令字所在位置
located
:模糊匹配(只要包含关键字的文件都查找出来),不是实时的,基于数据库的查找,updatadb升级locate升级数据库
10.2 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 [+ | - ] :
- -size 5k :精确匹配5k大小的文件
+ 5k
:匹配大于5k的文件- 5k
:匹配小于5k的文件
-mtime:时间单位为天,modify时间(后面跟 + - 号表示 大于小于)
-atime:时间单位为天,access时间
-ctime:时间单位为天,change时间
-mmin:时间单位为分钟,modify时间
-amin:时间单位为分钟,access时间
-cmin:时间单位为分钟,change时间
-perm MODE:(MODE是权限),精确匹配文件文件权限为MODE的文件
-perm /MODE:(MODE是权限),任意一位匹配
-perm -MODE:(MODE是权限),文件权限能够完全包含此MODE时才能匹配
条件组合:
- -a:and 同时满足多个条件,find /tmp/ -user tom -a -perm 644 -ls
- -o:or 满足一个条件即可,find /tmp/ -user tom -o -perm 644 -ls
- -not :不满足条件的被查找出来
处理动作:[action]
-print:默认动作,默认查找结果打印到屏幕
-ls:默认以 ls -l 的形式显示结果信息
-ok COMMAND {} \;
:执行动作时提示用户是否执行(必须以\;
结尾,{}
代表文件占位符)-exec COMMAND {} \;
:执行动作时不提示用户,直接执行(要求同上)注意:使用通配时用引号括起来
11. Linux 启动
11.1 启动过程
进程管理:kernel+process
CPU:ring0:内核空间 ring1-2:库文件等 ring3:用户空间
CPU读取的数据都来自内存
内存:内核空间和用户空间,RAM:易失性存储器
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)
- mm:memory mangement 内存管理
- net:系统中TCP/IP协议栈
- sound:声卡
- modules.dep:解决系统依赖关系
- 微内核:把每一个功能都做成小模块 (Windows 、Solaris)
/boot/initramfs:centos 6,虚拟根文件系统,把 /sys /dev /proc目录复制到根文件系统
/boot/initrd:centos 5
Linux运行级别:0-6
- 0:halt关机
- 1:单用户模式(root,无须登录),single,维护模式;
- 2:多用户模式,会启动网络功能,但不会启动NFS;维护模式;
- 3: 多用户模式,正常模式;文本界面;
- 4:预留级别;
- 5:多用户模式,正常模式;图形界面:GUI
- 6:重启
chroot:改变根文件系统目录
ldd:查看二进制文件所依赖的库文件
11.2 GRUB
BootLoader:MBR(位于磁盘中0磁道0柱面,512字节),后安装系统的BootLoader会覆盖前一系统的BootLoader,安装双系统时,先安装Linux,再安装Windows
Windows:不允许其他系统引导,也不引导其他系统
Linux:GRUB:默认的BootLoader
GRUB配置文件 :/boot/grub/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 EYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img
//解释:
//kernel /vmlinuz-2.6.32-220.el6.x86_64 :制定内核文件的位置
//ro: 刚开始以只读方式挂载根文件系统
//root=UUID=ef361140-6306-423c-90f0-63a93c664f96 : root根 分区设备位置
//rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD: 为了加速引导启动进程,可以指定磁盘是否加密、语言环境、不启用LVM、RAID、键盘等等,节省dracut查找的时间
//SYSFONT=latarcyrheb-sun16 KEYTABLE=us: 对于有加密磁盘的系统启动,可以指定键盘规格和字体显示等
//quiet:启动过程中只有重要信息显示,类似硬件自检的消息不回显示
//rhgb: RedHat graphics boot,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到
GRUB分阶段启动:
stage1:第一阶段,位于BootLoader,为了引导第二阶段
stage1_5:识别文件系统
stage2:加载启动设置等等,读取配置文件/boot/grub/grub.conf
GRUB修复:(使用光盘启动(BIOS调启动顺序),选择救援模式)
# chroot /mnt/sysimage
# grub-install --root-directory=/ /dev/sda
//注意:此处写/,是因为boot是一个独立的分区,如果没有独立,就应该写绝对路径,例如 /boot/,/dev/sda是指定第一块磁盘
# grub
grub> root (hd0,0) //磁盘0扇区,0柱面
grub> setup (hd0)
grub> quit
# vi /boot/grub/grub.conf //准备(自己写)这个文件,内容及格式与上面的一样
# reboot //前面的做完了就重启,注意在BIOS中调一下启动顺序
为GRUB启动菜单添加密码:
# grub-crypto --sha-512 //生成加密密码
# vim /boot/grub/grub.conf //在这个文件中hidden menu那一行下添加一行:
password --encryped 密文 //因为是sha加密,所以使用--encryped,如果是md5加密,应该使用 --md5 密文
为系统添加启动密码:
# grub-md5-crypto //生成加密密码
# vim /boot/grub/grub.conf //在这个文件中title那一行下添加一行:
password --md5 密文 //因为是md5加密,所以使用--md5
11.3 kernel、centos6—upstart init
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:此模块是否被其他模块使用(依赖关系)
- depmod :更新模块的依赖关系并创建依赖关系文件
- /lib/modules/kernel_version/modules.dep:解决依赖关系的文件
- -A :查找比/lib/modules/kernel_version/modules.dep新的模块,如果有,才会更新,并写入该文件
- -n:不写入依赖关系,直接输出到屏幕上
- -e:显示当前系统中已经加载的但不可执行的模块名称
- modinfo:查看模块的信息
- modinfo modules_name
- insmod:加载模块
- insmod modules_name_full_path
- rmmod:删除模块
- rmmod 模块名称
- modprobe:加载删除模块
- -c:列出目前系统中所有的模块
- -l:列出/1ib/modules/2.6.32-642.e16. x86_64/kernel当中所有模块的完整文件名
- -f:强制加载
- -r:删除某个模块,类似于rmmod
Linux内核模块额外的参数设置目录: /etc/modprobe .d/
Linux启动时所用的重要的目录:/etc/sysconfig
init:
upstart:CentOS 6:采用时间驱动(event driven),把功能并行执行
CentOS6上面Upstart大致的一个启动过程:
1.内核启动init,读取配置文件,在CentOS 6中只定义了运行级别
2.系统初始化:( /etc/init/rcS.conf exec /etc/rc.d/rc.sysinit )
3. init找到/etc/inittab文件,确定默认的运行级别(X) ( /etc/init/rcS.conf exec telinit$runlevel)
4.触发相应的runleve1事件(/etc/init/rc.conf exec /etc/rc.d/rc $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/init目录:定义了系统初始化的配置文件
/proc/cmdline : 系统内核设置的参数
/etc/rc.d/rc.sysinit : 系统初始化主要配置文件
/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:系统启动加载的最后一个脚本(用户的脚本)
sys v init chkconfig : 定义系统服务在每个级别的运行状态
–list:查看系统中所有服务的状态
chkconfig –level 2345 httpd on
chkconfig –level 2345 httpd off
upstart : initctl
服务分类:
独立服务:应用程序自己控制
超级服务:依赖于xineted进程来管理
控制服务:service service_name start | stop | restart | reload | status
11.4 CentOS系统详解—systemd
systemd特性:
平行处理所有服务,加速开机流程:旧的init启动脚本是一项一项任务依序启动的模式,因此不相依的服务也是得要一个一个的等待。systemd可以让所有的服务同时启动,因此系统启动的速度变快了
一经要求就回应的on-demand启动方式:
systemd全部就是仅有一只systemd服务搭配systemctl指令来处理,无须其他额外的指令来支援。不像systemV还要init, chkconfig, service…等等指令.此外,systemd由于常驻存储器,因此任何要求(on-demand)都可以立即处理后续的daemon启动的任务服务相依性的自我检查:
由于systemd可以自订服务相依性的检查,因此如果B服务是架构在A服务上面启动的,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务!按照daemon功能分类:
systemd管理的服务非常多,首先systemd先定义所有的服务为一个服务单位(unit),并将该unit归类到不同的服务类型(type)去。systemd将服务单位(unit)区分为service, socket , target , path, snapshot, timer等多种不同的类型(type),方便管理员的分类与记忆
将多个daemons集合成为一个群组:
如同systemV的init里头有个runlevel的特色,systemd亦将许多的功能集合成为一个所谓的target项目,这个项目主要在设计操作环境的建置,所以是集合了许多的daemons,也就是执行某个target就是执行好多个daemon的意思!
向下兼容旧有的init服务脚本:基本上,systemd是可以兼容于init的启动脚本的,因此,旧的init启动脚本也能够透过systemd来管理,只是更进阶的systemd功能就没有办法支援就是了
systemd有些地方无法完全取代init!包括:在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;
全部的systemd都用systemctl这个管理程序管理,而systemctl支援的语法有限制,不像/etc/init.d/ daemon就是纯脚本可以自订参数,systemctl不可自订参数;
Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。Systemd是一个系统管理守护进程、工具和库的集合,用于取代SystemV初始进程。
Systemd的功能是用于集中管理和配置类UNIX系统.
在L inux生态系统中,Systemd被部署到了大多数的标准Linux发行版中,只有为数不多的几个
发行版尚未部署.Systemd通常是所有其它守护进程的父进程,但并非总是如此.
11.4.1 CentOS 7 启动流程
# lsinitrd /boot/initramfs-3.10.0-1101.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与操作环境做个结合!你可以使用底下的方式来查询两者间的对应关系
# 11 -d /usr/lib/systemd/system/runlevel*.target
# yum -y install bash-completion //可以补齐参数或选项
# systemctl list-dependencies graphical.target //查看启动依赖关系
# systemctl list-dependencies multi-user.target //查看字符界面依赖关系
sysinit. target完成的功能:
- 特殊文件系统装置的挂载:包括dev- hugepages . mount dev -mqueue . mount等挂载服务,主要在挂载跟巨量存储器分页使用与讯息队列的功能。挂载成功后,会在 /dev底下建立/dev/hugepages/ ,/dev/mqueue/ 等目录;
- 特殊档案系统的启用:包括磁碟阵列、网络磁碟(iscsi)、 LVM档案系统、档案系统对照服务(multipath) 等等,也会在这里被侦测与使用到!
- 开机过程的讯息传递与动画执行:使用plymouthd 服务搭配plymouth指令来传递动画与讯息
- 日志式登录档的使用:就是systemd- journald这个服务的启用啊!
- 载入额外的核心模块:透过/etc/modules -load . d/*.conf档案的设定,让核心额外载入管理员所需要的核心模块!
- 载入额外的核心参数设定:包括/etc/sysctl.conf以及/etc/sysctl.d/*.conf内部设定!
- 启动系统的随机数产生器:随机数产生器可以帮助系统进行一些密码加密演算的功能
- 设定终端机(console) 字形
- 启动动态装置管理员:就是udevd
与sys V兼容的rc.local操作:
# chmod +X /etc/rc.d/rc.local
# systemctl start rc-local
# systemctl enable rc-local
unit分类:
.service:一般服务类型(serviceunit):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务
.socket:套接字(socketunit):主要是IPC (Inter-processcommunication)的传输讯息(socketfile)功能.这种类型的服务通常在监控讯息传递的套接字,当有透过此套接字传递讯息来说要连结服务时,就依据当时的状态将该用户的要求传送到对应的daemon,若daemon尚未启动,则启动该daemon后再传送用户的要求.
.target :执行环境类型(targetunit)
.mount :文件系统挂载相关的服务( automountunit/mountunit):例如来自网络的自动挂载、NFS档案系统挂载等与档案系统相关性较高的程序管理.
.path:侦测特定档案或目录类型(pathunit):某些服务需要侦测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过侦测打印队列目录来启动打印功能!
.timer:循环执行的服务(timerunit) :这个东西有点类似anacrontab !不过是由systemd主动提供的,比anacrontab更加有弹性!
与systemd的daemon运作过程相关的目录简介:
1./usr/lib/systemd/system/:使用CentoS官方提供的软件安装后,预设的启动脚本设定档都放在这里
2./run/systemd/system/ :系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/ systemd/system/高!
3./etc/systemd/ system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx之类的功能!执行优先序又比/run/systemd/system/高!
4./etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb所要更新的manpage索引中,需要加入的参数就写入到此目录下的man-db当中!而网络的设定则写在/etc/sysconfig/network -scripts/这个目录内
5./var/lib/ :一些会产生资料的服务都会将他的资料写入到/var/lib/目录中.举例来说,数据库管理系统Mariadb的数据库预设就是写入/var/lib/mysql/这个目录下!
6./run/:放置了好多daemon的暂存档,包括lockfile以及PIDfile等等.
systemctl项目简介:
#cat /usr/lib/systemd/system/sshd.service
.service大概能够将整个设定分为三个部份,就是:
[Unit]:unit本身的说明,以及与其他相依赖daemon的设定,包括在什么服务之后才启动此unit之类的设定值;
[Service], [Socket], [Timer], [Mount], [Path]..:不同的unit type就得要使用相对应的设定项目.我们拿的是sshd . service来当模板,,所以这边就使用Service来设定.这个项目内主要在规范服务启动的脚本、环境设定档档名、重新启动的方式等等,
[Install]:这个项目就是将此unit安装到哪个target里面去的意思!
至于设定档内有些设定规则还是得要说明一下:
设定项目通常是可以重复的,例如我可以重复设定两个After在设定档中,不过,后面的设定会取代前面的!因此,如果你想要将设定值归零,可以使用类似[After=」的设定,亦即该项目的等号后面什么都没有,,就将该设定归零了(reset).
如果设定参数需要有「是/否」 的项目(布尔值,boolean),你可以使用1,yes,true,on代表启动,用0,no,false,off代表关闭!
空白行、开头为#或;的那一行,都代表注解!
Unit部分说明:
Description :服务的描述信息
Documentation :提供给管理员的一些帮助文档!提供的文件可以是如下的格式:Documentation=http://www.. .. Documentat ion=man : sshd(8 )Documentation=file:/etc/ssh/sshd_ config
After :说明此unit是在哪个daemon启动之后才启动的意思!基本上仅是说明服务启动的顺序而已,并没有强制要求里头的服务一定要启动后此unit才能启动。以sshd.service的内容为例,该服务提到After后面有network.target以及sshd-keygen.service,但是若这两个unit没有启动而强制启动sshd.service的话,那么sshd.service应该还是能够启动的!这与Requires的设定是有差异的!
Before :与After的意义相反,是在什么服务启动前最好启动这个服务的意思,不过这仅是规范服务启动的顺序,并非强制要求的意思
Requires :明确的定义此unit需要在哪个daemon启动后才能够启动!就是设定依赖服务啦!如果在此项设定的前导服务没有启动,那么此unit就不会被启动!
Wants :与Requires刚好相反,规定的是这个unit之后最好还要启动什么服务比较好的意思!不过,并没有明确的规定就是了!主要的目的是希望建立让使用者比较好操作的环境。因此,这个Wants后面接的服务如果没有启动,其实不会影响到这个unit本身!
Conflicts :代表冲突的服务!也就是这个项目后面接的服务如果有启动,那么我们这个unit本身就不能启动!
我们unit有启动,则此项目后的服务就不能启动!
[Service]部分说明:
Type:说明这个daemon启动的方式,会影响到ExecStart!一般来说,有底下几种类型:
simple:预设值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于存储器中.
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务.原生的父程序在启动结束后就会终止运作.传统的unit服务大多属于这种项目,例如httpd这个Www服务,当httpd的程序因为运作过久因此即将终结了,则systemd会再重新生出另一个子程序持续运作后,再将父程序删除.
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在存储器中,
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作!因此设定这个项目时,通常也要设定BusName=才行!
idle:与simple类似,意思是,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行.这 类的daemon通常是开机到最后才执行即可的服务!比较重要的项目大概是simple, forking 与oneshot 了!毕竟很多服务需要子程序(forking),而有更多的动作只需要在开机的时候执行次(oneshot) ,例如文件系统的检查与挂载啊等等的。
EnvironmentFile:可以指定启动脚本的shell环境!例如sshd.service 的设定档写入到/etc/sysconfig/sshd 当中!你也可以使用Environment= 后面接多个不同的Shell变量来给予设定!
ExecStart:就是实际执行此daemon的指令或脚本程序。你也可以使用ExecStartPre (之前)以及ExecStartPost (之后)两个设定项目来在实际启动服务前,进行额外的指令行为。但需要特别注意的是,指令串仅接受「指令参数参数…」的格式,不能接受<,>,>>,|,&等特殊字符,很多的bash 语法也不支援喔! 所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不是完全不能用,亦即,若要支援比较完整的bash 语法,那你得要使用Type=oneshot 才行喔!其他的 Type不支持这些字符
ExecStop:与systemctl stop 的执行有关,关闭此服务时所进行的指令。
Restart:当设定Restart=1 时,则当此daemon服务终止后,会再次的启动此服务。举例来说,如果你在tty2使用文字界面登入,操作完毕后登出,基本上,这个时候tty2 就已经结束服务了。但是你会看到荧幕又立刻产生一个新的tty2 的登入画面等待你的登入!那就是Restart的功能!除非使用systemctl强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!
RemainAfterExit:当设定为RemainAfterExit=1 时,则当这个daemon所属的所有程序都终止之后,此服务会再尝试启动。这对于Type=oneshot 的服务很有帮助!
TimeoutSec:若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利「正常启动或正常结束」的情况下,则我们要等多久才进入「强制结束」的状态!
KillMode:可以是process, control-group ,none的其中一种,如果是process 则daemon终止时,只会终止主要的程序(ExecStart 接的后面那串指令),如果是control -group时,则由此daemon 所产生的其他control-group的程序也都会被关闭,如果是none的话,则没有程序被关闭
RestartSec:与Restart有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要sleep 多少时间再重新启动的意思。预设是100ms(亳秒)。
Install部分说明:
WantedBy:这个设定后面接的大部分是*.target unit !意思是,这个unit本身是附挂在哪一个target unit 底下的!一般来说,大多的服务性质的unit都是附挂在multi-user.target 底下!
Also:当目前这个unit 本身被enable 时,Also 后面接的unit也请enable的意思!也就是具有相依性的服务可以写在这里呢!
Alias:进行一个连结的别名的意思!当systemctl enable相关的服务时,则此服务会进行连结档的建立!以multi -user. target为例,这个家伙是用来作为预设操作环境default.target的规划,因此当你设定用成default.target时,这个/etc/systemd/system/default.target就会链接到/usr/lib/systemd/system/multi-user.target !
11.4.2 systemctl命令详细使用说明:
1.首先检查你的系统中是否安装有systemd并确定当前安装的版本
# systemd --version
2.检查systemd和systemctl的二进制文件和库文件的安装位置,
# whereis systemd
# whereis systemctl
3.检查systemd是否运行
#ps - eaf | grepsys temd
注意:systemd是作为父进程(PID=1) 运行的。在上面带(-e)参数的ps命令输出中,选择所有进程,(-a)选择除会话前导外的所有进程,并使用(-f)参数输出完整格式列表(即-eaf)
4.分析systemd启动进程
# systemd-analyze
5.分析启动时各个进程花费的时间
# systemd-analyzeblame
6.分析启动时的关键链
# systemd-analyzecritical-chain
7.列出所有可用单元
# systemctl list-unit-files
8.列出所有运行中单元
# systemctl list-units
9.列出所有失败单元
# systemctl --failed
10.检查某个单元(如cron. service)是否开机自启
# systemctl is-enabled crond.service
11.检查某个单元或服务是否运行
# systemctl status firewalld.service
使用Systemct1控制并管理服务
12.列出所有服务(包括启用的和禁用的)
# systemctl list-unit-files --type=service
- Linux中如何启动、重启、停止、重载服务以及检查服务(如httpd.service)状态
# systemctl start httpd.service
# systemctl restart httpd.service
# systemctl stop httpd.service
# systemctl reload httpd.service
# systemctl status httpd.service
注意:当我们使用systemctl的start,restart, stop和reload命令时,我们不会从终端获取到任何输出内容,只有status命令可以打印输出。
14.如何激活服务并在启动时启用或禁用服务(即系统启动时自动启动服务)
# systemctl is-active httpd.service
# systemctl enable httpd.service
# systemctl disable httpd.service
15.如何屏蔽(让它不能启动)或显示服务( 如httpd. service)
# systemctl mask httpd.service
# systemctl unmask httpd.service
16.使用systemctl命令杀死服务
# systemctl kill httpd
# systemctl status httpd
使用systemctl 控制并管理挂载点
17.列出所有系统挂载点
# systemctl list-unit-files --type=mount
18.挂载、卸载、重新挂载、重载系统挂截点并检查系统中挂载点状态
# systemctl start tmp.mount
# systemctl stop tmp.mount
# systemctl restart tmp.mount
# systemctl re load tmp.mount
# systemctl status tmp.mount
19.在启动时激活、启用或禁用挂载点(系统启动时自动挂载)
#systemctl is-active tmp.mount
#systemctl enable tmp.mount
#systemctl disable tmp.mount
20.在L inux中屏蔽(让它不能启用)或可见挂载点
# systemctl mask tmp.mount
# systemctl unmask tmp.mount
使用 systemctl 控制并管理套接口
21.列出所有可用系统套接口
# systemctl list-unit-files --type=socket
22.在Linux中启动、重启、停止、重载套接口并检查其状态
# systemctl start cups.socket
# systemctl restart cups.socket
# systemctl stop cups.socket
# systemctl reload cups.socket
# systemctl status cups.socket
23.在启动时激活套接口,并启用或禁用它( 系统启动时自启动)
#systemctl is-active cups.socket
#systemctl enable cups.socket
#systemctl disable cups.socket
24.屏蔽( 使它不能启动)或显示套接口
# systemctl mask cups.socket
# systemctl unmask cups.socket
25.获取当前某个服务的CPU分配额(如httpd)
# systemctl show -p CPUShares httpd.service
注意:各个服务的默认CPU分配份额=1024,你可以增加/减少某个进程的CPU分配份额.
26.将某个服务( httpd . service)的CPU分配份额限制为2000CPUShares/
# systemctl set-property httpd.service CPUShares=2000
# systemctl show -p CPUShares httpd.service
注意:当你为某个服务设置CPUShares,会自动创建一个以服务名命名的目录(如httpd,service),里面包含了一个名为90-CPUShares.conf的文件,该文件含有CPUShare限制信息,你可以通过以下方式查看该文件:
# vim /etc/systemd/system/httpd.service.d/50-CPUShares.conf
[Service]
CPUShares=2000
27.检查某个服务的所有配置细节
# systemctl show httpd
28.分析某个服务(httpd) 的关键链
# systemd-analyze critical-chainhttpd.service
29.获取某个服务(httpd) 的依赖性列表
#systemctl list-dependencies httpd.service
30.按等级列出控制组
# systemd-cgls
31.按CPU、内存、输入和输出列出控制组
# systemd-cgtop
控制系统运行等级
32.启动系统救援模式
# systemctl rescue
33.进入紧急模式
# systemct lemergency
34.列出当前使用的运行等级
# systemctl get-default
35.启动运行等级5,即图形模式
# systemctl isolate runlevel5.target
或
# systemctl isolate graphical.target
36.启动运行等级3,即多用户模式(命令行)
# systemctl set-default runlevel3.target
# systemctl set-default runlevel5.target
37.重启、停止、挂起、休眠系统或使系统进入混合睡眠
# systemctl reboot
# systemctl halt
# systemctl suspend
# systemctl hibernate
# systemctl hybrid-sleep
###测试