玩命加载中 . . .

Linux


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 行号栏位占用的字符数
moreless :查看文件 (一页一页查看)(常在管道中使用)
命令 按键
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是否有效)
  • 主分区(最多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开始

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:删除一个分区
  • 1:显示linux支持的分区类型(磁盘ID)

    • 5:扩展分区

    • 82:交换分区

      • 83: linux系统分区
    • 8e: LVM 逻辑卷管理

      • m:显示帮助信息
  • n:创建一个新分区

    • p:创建主分区
  • e:创建扩展分区

    • p:显示当前分区列表
  • 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的说明文件
  • 查看应用程序是否支持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)
      • 静态链接过程:把库文件集成到应用程序中
      • 动态链接过程:库文件与应用程序分开,做链接,运行时调用

程序 = 数据 + 指令 应用程序运行时,申请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的命令:

  1. 安装rpm -ivh name.rpm
  • -i :安装
  • -h :打印50个#号显示进度条
  • -v :显示更详细的信息
  • –nodeps:忽略依赖关系,可能导致软件包安装不完整
  • –replacepkgs :重新安装,替换原有安装;
  • –force:强行安装,可以实现重装或降级;
  1. 查询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)执行的脚本
  1. 未安装前查询

如果某rpm包尚未安装,我们需查询其说明信息、安装以后会生成的文件:

  • rpm -qpi /path/to/package_name 查看未安装软件包信息

  • rpm -qpl /path/to/package_name 查看未安装软件包 安装的列表

  1. 升级
  • -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,则安装;
  • -Fvh / PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级;否则,退出;
  • -Uvh – oldpackage PACKAGE_NAME:降级
  1. 卸载
  • rpm -e PACKAGE_NAME [– nodeps:忽略依赖关系]
  1. 校验:验证软件包列表或配置文件的完整性
  • rpm -V PACKAGE_NAME

    应用程序配置文件完整性破坏后的代码

     5      MD5校验和
     S      文件大小
     L      符号连接
     T      修改时间
     D      设备
     U      用户
     G      组
     M      模式(包括许可和文件类型)
  1. 重建数据库
  • rpm – rebuilddb :重建数据库,一定会重新建立
  • rpm – initdb :初始化数据库,没有才建立,有就不用建立
  1. 检查来源合法性,及软件包完整性
  • 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 编译链接工具
  1. automake —-> makefile.in(半成品) –(通过configure)–> makefile

  2. autoconf :生成脚本文件:configure,参照makefile.in 生成makefile

  3. make:不是编译工具,而是项目管理工具,按照makefile文件中的定义,去定义软件中功能向后顺序

  4. 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 :进程切换,上下文切换

![](F:\Individual File\于召勇\typora note\Linux及编程\image-linux\进程.png)

进程内存结构: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_name

  • pidof :查看某个进程的PID 号 pidof process_name

  • kill :杀死某个进程(向进程传递某个信号)

    • 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特性

  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不可自订参数;

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完成的功能:

  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. 启动动态装置管理员:就是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
  1. 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

###测试

文章作者: kylin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kylin !
评论
  目录