从零基础入门Linux系统

从零基础入门Linux系统

目录
第一章:Linux简介 1
一、Linux是什么 1
二、Unix和Linux的发展史 1
三、开源软件介绍 4
四、Linux的应用场景 5
第二章:Linux安装和部署 8
一、 虚拟机的安装和使用 8
二、Linux的分区相关原理 16
三、CentOS 6.8的安装流程 20
四、CentOS 7.5 的安装流程 35
五、远程管理Linux操作系统 43
第三章:给初学者的Linux服务器管理建议 44
一、学习Linux的注意事项 44
二、服务器管理建议 46
第四章:Linux常用命令 52
一、文件和命令使用规范 52
二、文件管理命令 52
三、权限管理命令 58
四、查询相关命令 61
五、压缩相关命令 64
六、帮助相关命令 65
七、关机与重启命令 68
八、常见网络命令 69
九、系统资源查看命令 75
十、挂载命令 77
第五章:vi & vim 编辑器 80
第六章:软件安装 84
一、软件安装包介绍 84
二、二进制安装包-rpm管理命令 86
三、二进制安装包-yum管理命令 88
四、二进制安装包-软件校验&软件修复 91
五、源码软件包安装相关操作 94
六、附带安装程序的软件包安装-webmin 96
七、扩展 99
第七章:用户管理 100
一、用户和组的类型 100
二、用户和组相关文件 100
三、用户和组相关命令 102
四、其他相关命令 105
第八章:权限管理 106
第九章:磁盘管理-硬件篇 114
第九章:磁盘管理-磁盘管理基础 119
第九章:磁盘管理-磁盘管理高级 130
第十章:Shell编程-基础篇 144
第十一章:Shell编程-高级篇 166
一、正则表达式 166
二、字符截取和替换命令 167
三、条件判断 176
四、流程控制 179
第十二章:备份管理 185
一、哪些数据需要进行备份 185
二、常见备份策略 185
三、备份模式 186
四:备份案例 188
五、定时计划任务 188
第十三章:系统启动管理 191
一、CentOS 6启动流程 191
二、CentOS 7启动流程 193
三、CentOS 6 和 CentOS 7 启动流程对比 195
第十四章:服务启动管理 197
一、服务、系统状态的查看 197
二、服务的管理 198
三、Target 和 Runlevel 的关系 199
四、日志管理 200

第一章:Linux简介
宏福学校 Linux运维+云计算课程
版本:V 1.0
一、Linux是什么
Linux是一套免费使用和自由传播的类Unix操作系统,是一个支持多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux操作系统诞生于1991年10月5日(第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核开发的各种发行版,比如:Red Hat、CentOS、Ubuntu、deepin等。
二、Unix和Linux的发展史
3.1 Unix发展历程
需求:1965麻省理工(MIT)决定开发大型的分时计算机系统,命名为: MULTICS。一个计算机史上最为庞大的分时计算机系统,企图连接 1000 部终端机,支持 300 位使用者同时上线的分时计算机系统。她面临的是,操作系统的分时观念还在各学术与研究机构的探索中,计算机硬件也面临重新设计的双重挑战。

项目合作:麻省理工(MIT)、通用公司(GE)、AT&T(贝尔实验室)
需求:麻省理工
硬件:通用公司
软件:贝尔实验室

结果:1969 年,MULTICS 计划在历经四年的奋战后,仍旧未达到原先规划设计的理想状态,贝尔实验室决定退出计划。功能未达原始设计理想的 MULTICS 还是安装在通用公司的 GE 645 大型计算机上供麻省理工使用。草草收场~

创世纪:1969 年贝尔实验室的成员退出 MULTICS 计划的同时,贝尔实验室本身其实也没有一套完善便利的交互式计算机服务环境。其中不少工程师们也正为了改善程序设计环境努力着, Ken Thompson、Dennis Ritchie 和其同事们在当时草拟了一个新的档案系统架构,这个档案系统也就是早期的 UNIX 操作系统的前身。

一个游戏的开始:时间1969年,当时的 Ken Thompson 忙着使用 Fortran 语言将原本在 Multics 系统中开发的叫 "Space Travel"的 game 转移到 GECOS System 上开发测试。当时 GECOS System 大型计算机的 CPU Time 相当昂贵(一秒要 75 块美金),于是 Ken Thompson 不得不寻找替代的开发环境。 Ken Thompson 便与 Dennis Ritchie 连手将程序设计转移到 PDP-7 型计算机上。当时这套系统仅能支持 2 个使用者使用。当时这套新的操作系统被命名为UNICS,之后大家取谐音便叫她为 “UNIX”。

C语言的诞生:由于之前的操作系统是使用B语言进行的程序编写,在运行效率上有很大影响,并且不便于移至。所以,当时的Dennis Ritchie又重新构造了一种新的编程语言:C语言,之后两个人用C对Unix进行了重新编写,直到更新到V5发布为正式版本,并最终确定名称为Unix,时间1973年。

死亡伏笔:由于当时AT&T是美国的通信霸主,受限于当时法律的约束(反托拉斯法),贝尔实验室不能从事计算机系统的销售,也就意外着贝尔实验室所开发的Unix无法进行销售,只能自己用或者免费开源给别人用,但是对于当时的贝尔实验室也不差这点钱~

分崩离析的霸主:之前说到关于反托拉斯法,10年后的1984年根据反垄断法强制将1495亿美元的巨头AT&T公司拆分为7家独立地域性网络公司,结束了长期以来有线电话行业的垄断业务,同时之前的行业限制也不存在了,可以从事有线电话以外的业务了;AT&T发现之前那点不在意的钱已经发展成了很庞大的业务,于是决定重新将Unix商业化,从而增加公司的收入,但事与愿违~

BSD的诞生:十年足够发生很多事情了,由于当时Unix的开放源代码方式,让很多的组织机构接触到了Unix,其中收益最大的就是伯克利大学,使用并根据自己的需求修改增加了大量的新内容到Uinx中,以至于形成了自己的独立版本:BSD,并且中间发生了很多的事情,有几项很牛逼的发明就在过程中出现:tar、vi编辑器等。

失败的"胜诉":AT&T于伯克利之间最终还是迎来了一场旷世大战(版权问题),AT&T最终胜诉了,但是输给了时间,因为官司时间太久,被Windows抢占了大部分市场份额。

结局:Unix被AT&T以8000万美金卖掉,并且后续几经易手,最终形成了永久授权方式,从此衍生了大量的Unix发行版
2. Unix主要发行版本

  1. Linux发展历程
    Linux 是一套版权彻彻底底与 AT&T 无关的 UNIX-like OS。原始核心程序的创作者是芬兰籍的 Linus Benedict Torvalds(现今他仍旧是核心程序的维护者)。操作系统里大部分的系统工具,来自于 RMS 行之多年的 GNU 计划成果,以及其它的自由软件写作计划产生的软件,如 X Windows、KDE、 Gnome 等窗口接口。由于构成操作系统的主要部分均奉行 GPL 版权,所以市面上有相当多样的发行版本,目前较广为人知的有 RedHat、Debian 等等。也因此,这套操作系统,可说是包含了无数自由软件作者的共同心血。如此的一套操作系统其实也就是 RMS 多年来想要达成的宿愿 – “Free UNIX”。所以,RMS 本人总认为该将名称改做 “GNU/Linux”。因此,也有人用 GNU/Linux 来称呼这个操作系统。

RMS(理查德·斯托曼)
GUN计划的创始人『如果我喜欢一个程序的话,那我就应该分享给其它喜欢这个程序的人』

作者:林纳斯·本纳第克特·托瓦兹

  1. Linux主流发行版本

  2. RedHat系列版本介绍
    服务器版:
    RedHat 6.x 内核:2.6.x
    RedHat 7.x 内核:3.10.x
    社区版:
    CentOS 6.x 内核:2.6.x
    CentOS 7.x 内核:3.10.x
    个人版:
    Fedora 内核:最新版
    内核版本官方网站:https://www.kernel.org/
    三、开源软件介绍
    什么是开源软件:
    使用自有:可以根据软件作者的意志自行选择是否收费
    研究自有:源代码开放,可自有阅读
    改良散布自有:可对源代码进行修改,自有传播,或者改良后售卖(卖增加的功能)

生产环境最多最大的应用集合:
LAMP=Linux+Apache+MySQL+PHP
LNMP=Linux+Nginx+MySQL+PHP
LNAMP=Linux+Apache+Nginx+MySQL+PHP
LNTMJ=Linux+Nginx+Tomcat+MySQL+Java
四、Linux的应用场景

  1. 基于Linux的服务器有哪些?
    网站:https://www.netcraft.com/

  2. 基于Linux兴起的云计算技术

  3. Linux在电影娱乐行业

  4. Linux的其他应用

第二章:Linux安装和部署
宏福学校 Linux运维+云计算课程
版本:V 1.0
一、虚拟机的安装和使用
VMware Workstation是一款功能强大的桌面虚拟计算机软件,可以提供给用户在单一的桌面上同时运行多个相同或者不同的操作系统,方便专业人员进行开发、部署、测试等工作;简单来说就是通过VMware 创建出虚拟的硬件设备,然后再使用虚拟的硬件设备进行操作系统的安装和运行,从而满足同时运行多个操作系统的需求。

1.1 VMware Workstation的安装
1.1.1 注意事项:
虚拟机软件更新很快,所以使用哪个版本的都可能有,目前来说VMware 10版本之后的都可以满足我们的需求,越高的版本支持的虚拟机配置越高、功能越多,根据自身需求进行选择。
1.1.2 软件来源和版本:
官网:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html
类型:分为Windows版和Linux版本(当然也有MAC OS X版本:VMware Fusion版)

1.1.3 安装流程:

类型选择:典型是较为简洁的硬件选择模式,可以快速的创建一个虚拟硬件环境
自定义则是一个专业的硬件配置选择模式,可以认为选择更多的设备参数和类型。

注意:安装路径尽量选择非系统盘下的目录,而且尽量不要使用中文名字的目录。

至此我们的虚拟机软件就安装完成了,后续根据自己的需求进行虚拟机的安装和使用即可
1.1.4 网络设置:

VMware Workstation 中所安装的虚拟机与外部进行网络连接的方式有三种:桥接模式、仅主机模式(自定义)、NAT模式;三种模式的工作原理各不相同,配置方式也不一样。

连接方式对比:
连接方式 宿主网卡 能否连接宿主 能否连接宿主局域网 能否连接互联网
桥接模式 有线&无线网卡 能 能 能
仅主机模式 VMnet 1 能 不能 不能
NAT模式 VMnet 8 能 不能 能

1.2 VMware Workstation的使用
快照功能:可以将虚拟机的某一时刻永久保存下来,当以后有需要时,可以快速的恢复到快照当时的状态,适合反复使用的实验环境。

挂起功能:虚拟机开启后,如果遇到紧急事件需要暂时停止虚拟机运行,而且保留当前虚拟机的运行状态,等有时间时再接着运行的话,可以使用挂起功能,将虚拟机暂停。

硬件调整功能:由于虚拟机所使用的硬件设备都是虚拟设备,所有虚拟机的硬件参数都是可以调整的,但是需要注意,必须在虚拟机停止工作的状态下才能调整,暂停状态下也是无法调整的。

文件共享功能:提供了将宿主机指定文件夹映射到虚拟机内的功能,使虚拟机内外可以更为方便的进行文件传输。

VMware Tools:是一个功能十分强大的虚拟机辅助工具,我们常用到的功能就是,在安装了此工具后,可以自由的在宿主机和虚拟机之间进行文件传输,而且不用借助文件共享功能;桌面模式下还能自由切换键鼠;并且桌面模式下能后自由调整虚拟机的分辨率。
二、Linux的分区相关原理
2.1 为什么要进行磁盘分区
现在的磁盘设备存储空间都非常大,为了方便管理我们将磁盘划分为一个一个小的空间来使用,这样既便于管理,又有利于数据的安全,还能节省数据查询时间。
易于管理和使用
当磁盘不划分分区时,往往所有东西都是放在一起的,就像一个没有做任何隔断的大房间,空间虽大,但是不利于管理和合理使用,所以合理划分分区是我们使用磁盘的第一个重要步骤。
有利于数据安全
当磁盘没有划分分区时,所有数据存放在同一个空间中,当有一个文件遭受病毒入侵时,其他文件也是无法避免的,但划分过分区后,可以减少这种情况的发生,让数据更加安全。
节省文件查找时间
当所有数据保存在一个没有划分分区的空间中时,由于内容较多,查询起来非常缓慢,每次都需要从头到尾查看一遍,非常浪费时间,划分分区可以将不同分类的数据保存在不同的分区,加快数据查询的效率
2.2 如何进行磁盘分区
2.2.1 常见的两种分区规范
MBR分区表:1983年出现的分区规范,识别最大磁盘空间到2TB,大于2TB无法管理。

GPT分区表:又称GUID分区表,新一代分区管理规范,识别最大磁盘空间到18EB,以目前的磁盘生产水平远远超出需求。

当我们所需要管理的磁盘不大于2TB时,可以选择使用MBR分区表进行分区划分,但是当大于2TB时,必须选择GPT分区表进行管理,否则无法识别到所有的磁盘空间。

2.2.2 MBR分区表分区规范
分区类型:
主分区、扩展分区、逻辑分区
分区数量限制:
主分区:小于等于4个,分区编号1-4
扩展分区:可以没有,最多1个,分区编号1-4
逻辑分区:扩展分区下的分区结构,默认不限个数,分区编号5-∞
注意事项:
主分区+扩展分区最多4个
扩展分区无法直接保存数据,其主要作用是创建逻辑分区

2.2.3 GPT分区表分区规范
分区类型:所有分区都一样,没有类型区分
分区数量:理论没有数量限制,但windows操作系统最大支持128个分区,so…

2.3 磁盘设备和分区命名规范
2.3.1 磁盘命名:
sd:对SATA、SCSI、SAS等接口类型的磁盘命名前缀,后续用a-z表示第几块磁盘
hd:对IDE接口类型的磁盘命名前缀,后续用a-z表示第几块
例如:
sda:表示STAT等接口的第一块磁盘
hdc:表示IDE接口的第三块磁盘
2.3.2 分区命令规范:
在指定磁盘后使用序号命令分区顺序:1-n
MBR:
主分区:sda1 - sda4
扩展分区:sda1 - sda4
逻辑分区:sda5 - sdan
GPT:
sda1 - sdan
2.4 什么是格式化
将磁盘划分成分区之后我们还需要对分区空间进行进一步规划才能正常使用,我们需要为每一个分区安装一套数据管理软件,用来管理需要存储的数据,安装这套管理软件的过程叫做安装文件系统,又称之为高级格式化,顺带着有清除所有数据的功能,so…以后不要再说格式化是为了删除所有数据。

文件系统类型分类:
windows:FAT16、FAT32、exFAT、NTFS
Linux:EXT3、EXT4、XFS

2.5 分区挂载
就像windows中一样,所有磁盘都需要指定一个盘符才能正常使用,盘符相当于是分区的入口,windows中用a-z字母作为盘符。而在Linux中我们使用目录作为分区的入口,将分区和盘符关联起来的方式称之为叫挂载。

首先我们来了解下Linux中的目录结构:

三、CentOS 6.8的安装流程
3.1 安装流程

自定义模式下硬件参数设置简单,适合绝大多数虚拟机,自定义模式下可以设置更多的硬件参数信息,适合相对专业的虚拟机硬件设置。

切记,此处一定要选择稍后安装,若选择了第二项则会导致操作系统自行安装,无法人为选择系统安装流程

根据需要选择对应操作系统和发行版本,已经对应发行版的具体平台

虚拟机的存放位置尽量不要在系统盘目录下,否则会导致操作系统因为空间不足导致无法运行

注意:此处设置的磁盘大小为虚拟机使用磁盘大小的上限,并非是直接将物理存储空间分配给虚拟机,类似的内存、硬盘、CPU等都是给虚拟机设置一个上限。

虚拟硬件设备设置完成后再选择对应要安装的操作系统的镜像位置,并将虚拟光驱的启动连接勾选上

  1. “Install or upgrade an existing system”: 安装或升级现有系统
  2. “Install system with basic video driver”: 安装系统并安装基本的显卡驱动
  3. “Rescue installed system”: 进入系统修复模式
  4. “Boot from local drive”: 从本地磁盘启动(不安装)
  5. “Memory test”: 存储介质检测

跳过安装介质检测过程,无需对安装介质(光盘)进行检查

注意:此处选择的语言类型为安装流程中所使用语言,并非是安装后操作系统运行所使用的语言

键盘类型:固定美式英语键盘(其他国家笔记本除外)

选择基础存储设备,即使用本地存储设备,指定的存储设备一般指网络上的专业存储设备

千万注意数据安全,虚拟机上没问题,但是真实设备一定要记得确认数据是否保存。

主机名尽量保持默认状态,否则后续有些实验会受到影响;主机名修改没有明确的严格规定,根据实际需求进行设置即可,例如:bj01-web03

时区选择亚洲上海,将本页面中使用UTC时间的复选框取消掉,否则时间会出现时区误差;UTC:世界协调时间,中国上海所在时区为UTC+8

密码三原则:复杂性、时效性、易记性
复杂性:要求密码拥有足够多的字符类型,字母大小写、数字、符号等 + 密码长度
时效性:要求密码周期性进行更新,保证密码的安全性
易记性:其实,复杂的密码不易记,易记的密码不复杂~

在保证数据安全的前提下,选择对应的模式进行分区格式化

由于前期没有学习磁盘管理,暂时选用标准分区即可

boot分区并不是必须单独划分的分区,单独划分的主要目的是为了保证分区损坏时不会导致操作系统和引导文件同时损坏丢失;boot分区存放的是操作系统启动引导文件,CentOS 6.x 建议划分200M即可,CentOS 7.x 建议划分500M

swap分区即交换分区,其主要作用是在操作系统真实内存(物理内存)不足时,将物理内存中一部分数据暂存到swap分区中,保证物理内存始终都有可用空间的的一种机制;swap分区:该分区没有挂载点,无法认为进行数据存取,并且swap分区必须创建。

有且仅能有一个根分区,根分区大小根据实际情况而定,自定义或者使用剩余所有空间;至于除了以上三个分区以外的其他分区,可以根据实际业务需求进行自定义,建议将不同的应用产生的数据保存在独立的分区中,降低数据同时损坏的几率。

此处是修改系统引导记录的保存位置的,虚拟机中无需修改,但是在实际的生产环境中安装操作系统后需要手动指定下引导记录保存位置,防止将引导记录写入到移动设备。

软件安装选择Basic Server模式即可,安装常用软件和服务

3.2 网卡配置和防护关闭
网卡:需要人为手动配置IP地址等网络资源
防护:关闭以下两个服务
防火墙:保护Linux不受来自于外部的非法网络请求(对外保护)
SELinux:保证Linux内部的操作更加严谨,限制用户的操作行为
注意:关闭防护的原因是为了有一个更方便的环境进行实验,对于初学者,防护会影响实验的部署

利用红帽发行版中自带的工具setup进行IP地址设置(安装时若选择的minimal则没有此命令)

防护关闭命令:
防火墙:
chkconfig iptables off #设置开机不自启
service iptables stop #停止正在运行的服务
iptables -F #清空当前的防火墙列表
SELinux:
sed -i ‘7s/enforcing/disabled/’ /etc/selinux/config #永久关闭SELinux
setenforce 0 #临时关闭SELinux
四、CentOS 7.5 的安装流程
4.1 安装流程

CentOS 7中默认启用了xfs文件系统类型(6也支持,但是默认没有启用)

4.2 网卡配置和防护关闭
网卡:借助CentOS 7自带的nmtui工具进行IP资源设置

防护:
防火墙:
systemctl disable firewalld
systemctl stop firewalld
SELinux:
sed -i ‘7s/enforcing/disabled/’ /etc/selinux/config #永久关闭SELinux
setenforce 0 #临时关闭SELinux
五、远程管理Linux操作系统
通常生产环境中我们的服务器都放在机房里,但是机房的环境并不适合进行办公,所有我们基本都是在机房外部进行远程管理和操作服务器的,对用用来远程连接的工具也就少不了了。
例如;Xshell、putty、SecureCRT等都是不错的选择。

注意事项:在学习过程中对于远程工具的选择可以按照个人喜好即可,但是对于公司来说我们需要保证其安全性,所以在选择远程连接工具是要严格把控,其次,远程连接工具一定要及时更新,否则出现重大漏洞会造成巨大损失,并且作为维护人员有不可推卸的责任。

第三章:给初学者的Linux服务器管理建议
Linux运维+云计算&大数据运维
版本:V1.0
一、学习Linux的注意事项

  1. Linux严格区分大小写
    Linux是严格区分大小写的,这一点和Windows不一样,所以操作时要注意区分大小写的不同, 包括文件名和目录名、命令、命令选项、配置文件设置选项等。
  2. Linux 一切皆文件
    Linux中所有内容都是以文件的形式保存和管理的,硬件设备也是文件,这和Windows完全不同, Windows是通过设备管理器来管理硬件的。Linux的设备文件保存在/dev/目录中,硬盘文件是 /dev/sd[a-p]» 光盘文件是/dev/hdc 等。
  3. Linux不靠扩展名区分文件类型
    Windows是依赖扩展名区分文件类型的,比如,".txt”是文本文件、".exe”是执行文件、“.ini” 是配置文件、“.mp4”是小电影等。但Linux不是靠扩展名区分文件类型的,而是靠权限位标识来确 定文件类型的,而且文件类型的种类也不像Windows下那么多,常见的文件类型只有普通文件、目录、 链接文件、块设备文件、字符设备文件等几种。Linux的可执行文件不过就是普通文件被赋予了可执 行权限而已。
    但Linux中的一些特殊文件还是要求写“扩展名”的,但是大家小心,并不是Linux -定要靠扩展名来 识别文件类型,写这些扩展名是为了帮助管理员来区分不同的文件类型。这样的文件扩展名主要有以 下几种。
    •压缩包:Linux下常见的压缩文件名有务、.bz2、・zip、.tar.gz、.tar.bz2、.tgz等。为什么压 缩包一定要写扩展名呢?其实很好理解,如果不写清楚扩展名,那么管理员不容易判断压缩包的 格式,虽然有命令可以帮助判断,但是直观一点更加方便。另外,就算没写扩展名,在Linux中 一样可以解压缩,不影响使用。
    •二进制软件包:CentOS中所使用的二进制安装包是RPM包,所有的RPM包都用“.rpm〃扩展名结尾,目的同样是让管理员一目了然。
    •程序文件:Shell脚本一般用“.sh〃扩展名结尾,其他还有用“.c〃扩展名结尾的C语言文件等。
    •网页文件:网页文件一般使用“.html〃".php〃等结尾,不过这是网页服务器的要求,而不是Linux 的要求。
  4. Linux中所有的存储设备都必须在挂载之后才能使用
    Linux中所有的存储设备都有自己的设备文件名,这些设备文件必须在挂载之后才能使用,包括 硬盘、U盘和光盘。挂载其实就是给这些存储设备分配盘符,只不过Windows中的盘符用英文字母表 示,而Linux中的盘符则是一个已经建立的空目录。我们把这些空目录叫作挂载点(可以理解为Windows 的盘符),把设备文件(如/dev/sdb)和挂载点(已经建立的空目录)连接的过程叫做挂载
  5. Windows下的程序不能直接在Linux中使用
    Linux和Windows是不同的操作系统,可以安装和使用的软件也是不同的,所以能够在Windows 中安装的软件是不能在Linux中安装的。有好处吗?当然有,那就是能够感染Windows的病毒和木马 都对Linux无效。有坏处吗?也有,那就是所有的软件要想在Linux中安装,必须单独开发针对Linux 的版本,或者依赖模拟器软件运行。
    很多软件也会同时推出针对Windows和Linux的版本,如大家熟悉的即时通信软件QQ。
    二、服务器管理建议
    1.了解Linux目录结构
    目录名 目录的作用
    /bin/ 存放系统命令的目录,普通用户和超级用户都可以执行。是/usr/bin/目录的软链接
    /sbin/ 存放系统命令的目录,只有超级用户才可以执行。是/usr/sbin/目录的软链接
    /usr/bin/ 存放系统命令的目录,普通用户和超级用户都可以执行
    /usr/sbin/ 存放系统命令的目录,只有超级用户才可以执行
    /boot/ 系统启动目录,保存与系统启动相关的文件,如内核文件和启动引导程序(grub)文件等
    /dev/ 设备文件保存位置
    /etc/ 配置文件保存位置。系统内所有釆用默认安装方式(rpm安装)的服务配置文件全部保存在此目录中,如用户信息、服务的启动脚本、常用服务的配置文件等
    /home/ 普通用户的家目录。在创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的家目录,所有普通用户的宿主目录是在/home/下建立一个和用户名相同的目录。如用户userl的家目录就是/home/userl/
    /lib/ 系统调用的函数库保存位置。是/usr/lib/的软链接
    /Iib64/ 64位函数库保存位置。是/usr/lib64/的软链接
    /media/ 挂载目录。系统建议是用来挂载媒体设备的,如软盘和光盘
    /mnt/ 挂载目录。早期Linux中只有这一个挂载目录,并没有细分。现在系统建议这个目录用来挂载额外的设备,如U盘、移动硬盘和其他操作系统的分区
    /opt/ 第三方安装的软件保存位置。这个目录是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录中。不过笔者还是习惯把软件放到 /usr/local/目录中,也就是说,/usr/local/目录也可以用来安装软件
    /proc/ 虚拟文件系统。该目录中的数据并不保存在硬盘上,而是保存到内存中。主要保存系统的内核、进程、外部设备状态和网络状态等。如/proc/cpuinfo是保存 CPU信息的,/proc/devices是保存设备驱动的列表的,/proc/filesystems是保存文件系统列表的,/proc/net是保存网络协议信息的……
    /sys/ 存与内核相关的信息
    /root/ root的宿主目录。普通用户宿主目录在/home/下,root宿主目录直接在下
    /run/ 系统运行时产生的数据,如ssid, pid等相关数据。/var/run/是此目录的软链接
    /srv/ 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据
    /tmp/ 临时目录。系统存放临时文件的目录,在该目录下,所有用户都可以访问和写
    入。我们建议此目录中不能保存重要数据,最好每次开机都把该目录清空
    /usr/ 系统软件资源目录。注意usr不是user的缩写,而是UUNIX Software Resourcev
    的缩写,所以不是存放用户数据的目录,而是存放系统软件资源的目录。系统中安装的软件大多数保存在这里
    /usr/lib/ 应用程序调用的函数库保存位置
    /usr/local/ 手工安装的软件保存位置。我们一般建议源码包软件安装在这个位置,例如安 装源码包的Apache,安装目录一般就是/usr/local/apache,目录。
    /usr/share/ 应用程序的资源文件保存位置,如帮助文档、说明文档和字体目录
    /usr/src/ 源码包保存位置。我们手工下载的源码包和内核源码包都可以保存到这里。不过笔者更习惯把手工下载的源码包保存到/usr/local/src/目录中,把内核源码保存至 lj/usr/src/kernels/ 目录中
    /usr/src/kernels/ 内核源码保存位置。最小化安装没有安装内核源码包,这个目录是空的。
    /var/ 动态数据保存位置。主要保存缓存、日志以及软件运行所产生的文件
    /var/www/html/ RPM包安装的Apache的网页主目录
    /var/lib/ 程序运行中需要调用或改变的数据保存位置。如MySQL的数据库保存在
    /var/lib/mysql/ 目录中
    /var/log/ 系统日志保存位置
    /var/run/ 一些服务和程序运行后,它们的PID (进程ID)保存位置。是/run/目录的软链接
    /var/spool/ 放置队列数据的目录。就是排队等待其他程序使用的数据,比如邮件队列和打印队列
    /var/spool/mail/ 新收到的邮件队列保存位置。系统新收到的邮件会保存在此目录中
    /var/spool/cron/ 系统的定时任务队列保存位置。系统的计划任务会保存在这里

2.远程服务器关机及重启时的注意事项
为什么远程服务器不能关机呢?很简单,远程服务器没有放置在本地,关机后,谁可以帮你按开机电源键启动服务器?虽然计算机技术日新月异,但是像插入电源和开机这样的工作还是需要手工进行的。如果服务器在远程,一旦关机,就只能求助托管机房的管理人员帮你开机了。
远程服务器重启时需要注意两点。
2.1远程服务器在重启前,要中止正在执行的服务
计算机的硬盘最怕在高速存储时断电或重启,非常容易造成硬盘损坏。所以,在重启前先中止你的服务,甚至可以考虑暂时断开对外提供服务的网络。可能你会觉得服务器有这么娇贵吗?我的笔记本电脑经常强行关机,也没有发现硬盘损坏啊?这是因为你的个人计算机没有很多人访问,强制断电时硬盘并没有进行数据交换。小心驶得万年船!
2.2重启命令的选用
Linux可以识别的重启命令有很多条,但是建议大家使用"shutdown -r now"命令重启。这条命令在重启时会正常保存和中止服务器中正在运行的程序,是安全重启命令。而且最好在重启前执行几次“sync”命令,这条命令是数据同步命令,可以让暂时保存在内存中的数据同步到硬盘上。
3.不要在服务器访问高峰运行高负载命令
这一点大家很好理解,在服务器访问高峰,如果使用一些对服务器压力较大的命令,则有可能会 造成服务器响应缓慢甚至死机。
哪些命令是高负载命令呢?其实,如果大家使用过Windows操作系统,则也会留意到一些操作会 给计算机带来较大的运算压力,道理都是一样的,如复制大量的数据、压缩或者解压缩大文件、大范 围的硬盘搜索等。
什么时间算作访问高峰期呢?我们一般认为17:00—24:00算作访问高峰期。当然,每台服务器具 体提供的服务不同,访问高峰期有时也会有所出入。比如,服务器主要是供美国人民访问的,那就要考虑时差的问题;或者服务器提供的服务很特殊,访问高峰期可能也不同。
一般我们建议在凌晨4:00-5:00执行这些命令。那是不是说我们需要在凌晨上班?当然不是,这谁受得了啊?我们可以使用系统的计划任务,让操作自动在指定的时间段执行。
4.远程配置防火墙时不要把自己踢出服务器
简单来讲,防火墙就是根据数据包自身的参数来判断是否允许数据包通过的网络设备。我们的服务器要想在公网中安全地使用,就需要使用防火墙过滤有害的数据包。但是在配置防火墙时,如果管理员对防火墙不是很熟悉,则有可能把自己的正常访问数据包和有害数据包全部过滤掉,导致自己也无法正常登录服务器,如防火墙关闭了远程连接的SSH服务的端口。
防火墙配置完全是靠手工命令完成的,配置规则和配置命令相对也比较复杂,万一设置的时候心不在焉,悲剧就发生了。
如何避免这种尴尬的情况发生呢?最好的方法当然是在服务器本地配置防火墙,这样就算不小心 把自己的远程登录给过滤了,还可以通过本机登录来进行恢复。如果服务器已经在远程登录了,要配置防火墙,那么最好在本地测试完善后再进行上传,这样会把发生故障的概率降到最低。虽然在本地测试好了,但是传到远程服务器上时仍有可能发生问题。于是超哥想到一个笨办法:如果需要远程配置防火墙,那么先写一个系统定时任务,让它每5分钟清空一下防火墙规则,就算写错了也还有反悔 的机会,等测试没有问题了再删除这个系统定时任务
5.指定合理的密码规范并定期更新
前面我们介绍了设置密码需要遵守复杂性、易记忆性和时效性的三原则,这里就不再重复解释了。
6.合理分配权限
服务器管理有一个最简单的原则:给予用户最小的权限。
7.定期备份重要数据和日志
备份的基本原则:不要把鸡蛋放在同一个篮子里
第四章:Linux常用命令
宏福学校 Linux运维+云计算课程
版本:V 1.0
一、文件和命令使用规范

  1. Linux 文件的命名规则
    1.Linux中一切皆文件
    2.除了 / 之外,所有的字符都合法,但有些字符最好不用,如空格和字符 @ # $ & ( ) - 等
    3.避免使用 . 作为文件名的第一个字符(Linux中以.开头的文件都是隐藏文件)
    4.大小写敏感,严格区分大小写(包括文件命名、命令、命令选项、用户名等)
  2. Linux 命令格式
    格式 :命令 -选项 参数(操作对象)
    例 :ls -la /etc
    1.当有多个选项时,可以写在一起(特殊情况除下有先后顺序)
    2.两个特殊的目录 . 和 … ,分别代表当前目录和当前目录的父目录
    3.部分命令不遵循此格式
  3. Linux 命令提示符
    [root@localhost /]#
    [当前登录用户@当前主机名 当前所在目录的最后一个目录]# # 带表用户身份(root)
    二、文件管理命令
  4. ls 命令
    英文原意:list directory contents
    功能描述:用来显示指定目录内的文件列表,可通过选项控制显示内容的详细程度和颜色高亮等
    所在路径:/bin/ls
    命令格式:ls [OPTION]… [FILE]…
    常用选项:
    o-a:显示指定目录内的所有内容(包含隐藏文件和特殊目录)
    o-l:显示每一个文件的详细信息(权限、所有者、所属组、修改时间等),可缩写为ll
    o-h:显示文件大小时,使用最合适的单位显示(例:4万万 ==> 4亿),常以-lh形式出现
    o-d:用来显示目录本身信息,而不显示目录内的文件列表,常以-ld形式出现
    o-i:显示文件索引节点号(inode),每个文件都拥有一个独一无二的索引节点号

索引节点号(inode号):
每一个文件除了文件内的数据外,还有文件本身的一些数据需要保存,比如:文件的创建者、创建时间、文件大小等,此类信息我们统称为“元数据”,操作系统为每一个文件都单独创建了一块区域用来存储文件的元数据,并且在同一个分区内为每一个文件分配了一个独一无二的ID号码(即inode号)
[root@localhost ~]# ls -l
总用量 44
-rw-------. 1 root root 1245 1月 1 2020 anaconda-ks.cfg
-rw-r–r--. 1 root root 28250 1月 1 2020 install.log
-rw-r–r--. 1 root root 7572 1月 1 2020 install.log.syslog

第一列:类型和文件权限(下面章节详细讲)
第二列:引用计数,文本类文件的数值代表该文件有n-1个硬链接;目录文件的数值代表该目录下有多少个子目录数量
第三列:文件所有者(属主),文件属于哪个用户所有,默认情况谁创建的文件就属于谁
第四列:文件所属组(属组),一般情况下,该组是文件创建者所在的组
第五列:文件大小,默认以字节为单位显示,可使用-h选项显示为最合适单位
第六列:文件最后一次修改时间(内容修改时间)
第七列:文件名
结尾的.:这个点代表被SELinux所标记的文件,一般是在SELinux开启时所创建的文件
2. cd 命令
英文原意:Change the shell working directory
功能描述:切换到指定的目录下
所在路径:属于shell内置命令,没有路径
命令格式:cd DIRECTORY…

特殊目录 作用
切换到当前所在用户的家目录下
  • 切换到刚才所在目录
    . 当前目录
    … 切换到上一级目录(父目录)
  1. pwd 命令
    英文原意:print name of current/working directory
    功能描述:显示当前所在路径
    所在路径:/bin/pwd
    [root@localhost network-scripts]# pwd
    /etc/sysconfig/network-scripts
  2. mkdir 命令
    英文原意:make directories
    功能描述:创建目录
    所在路径:/bin/mkdir
    命令格式:mkdir [OPTION]… DIRECTORY…
    常用选项:
    o-p:递归创建多级目录
    [root@localhost ~]# mkdir /data/text/
    mkdir: 无法创建目录"/data/text/": 没有那个文件或目录
    [root@localhost ~]#
    [root@localhost ~]# mkdir -p /data/text/
  3. rm 命令
    英文原意:remove files or directories
    功能描述:删除指定文件或者目录
    所在路径:/bin/rm
    命令格式:rm [OPTION]… FILE…
    常用选项:
    o-i:删除已有文件或目录之前先询问用户
    o-f:不询问,强制删除
    o-r:递归处理,将指定目录下的所有文件与子目录一并处理
    近义词命令:rmdir 删除指定的空目录
  4. touch 命令
    英文原意:change file timestamps
    功能描述:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件
    所在路径:/bin/touch
    命令格式:touch [OPTION]… FILE…
    常用选项:相关选项都是对文件时间进行修改的,此处不做讲解
  5. stat 命令
    英文原意:display file or file system status
    功能描述:用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细
    所在路径:/usr/bin/stat
    命令格式:stat [OPTION]… FILE…
    常用选项:
    o-f:不再显示指定文件的详细信息,而是显示该文件所在文件系统的信息(文件系统类型、Block数量、Inode数量等)
    [root@localhost ~]# ls -l
    总用量 44
    -rw-------. 1 root root 1245 1月 1 2020 anaconda-ks.cfg
    -rw-r–r--. 1 root root 28250 1月 1 2020 install.log
    -rw-r–r--. 1 root root 7572 1月 1 2020 install.log.syslog

[root@localhost ~]# stat install.log
File: “install.log”
Size: 28250 Blocks: 64 IO Block: 4096 普通文件
Device: 803h/2051d Inode: 262148 Links: 1
Access: (0644/-rw-r–r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-01-01 22:52:00.643999989 +0800 #访问时间
Modify: 2020-01-01 23:00:00.507999787 +0800 #内容修改时间
Change: 2020-01-01 23:00:34.067999794 +0800 #属性修改时间(权限和归属)

[root@localhost ~]# stat -f install.log
File: “install.log”
ID: d2925608e3c65ff3 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 4573121 Free: 4038984 Available: 3805013
Inodes: Total: 1171456 Free: 1103020
注意:Free和Available都是可用的意思,但是有所区别,Free当中有一部分需要充当缓存空间,虽然现在不用但是已经被预定出去了,所以对于程序来说Available才是真正可用的数量。
8. cat 命令
英文原意:concatenate files and print on the standard output
功能描述:连接文件并打印到标准输出设备上,cat经常用来显示文件的内容(内容大于1页的仅显示最后一页:自动滚屏)
所在路径:/bin/cat
命令格式:cat [OPTION]… [FILE]…
常用选项:
o-n:为每一行内容进行编号(从1开始)
o-b:类似于-n,会主动忽略掉空白行(显示但不为其编号)
9. more 命令
英文原意:file perusal filter for crt viewing
功能描述:一个文本过滤器,以全屏分页的方式显示文本内容,可以使用内置按键控制显示内容
所在路径:/bin/more
命令格式:more [FILE]…
o空格space:向下翻页
o回车enter:向下翻行
ob:向上翻页
oq:退出文本
10. less 命令
英文原意:opposite of more
功能描述:作用与more相似,都是用来浏览文本内容的
所在路径:/usr/bin/less
命令格式:less [OPTION]… [FILE]…
常用选项:
o-N:显示文本内容并显示行号
命令对比:more和less很相似,都是用来进行分屏/分页显示文本内容的,但是less要比more多一些交互按钮,以下是less模式下的一些交互按钮功能
交互按钮 功能
PageUp(PaUp) & b 向上翻页
PageDown(PaDn) & 空格 向下翻页
Enter 向下换行(每次只新增一行显示)
/关键词 用于在less模式中进行关键词查询,并高亮显示关键词 使用n和N快速向下向上定位到每一个关键词
q 退出less模式
11. head 命令
英文原意:output the first part of files
功能描述:显示指定文件的开头内容(默认显示前10行)
所在路径:/usr/bin/head
命令格式:head [OPTION]… [FILE]…
常用选项:
o-n:显示指定文件的前n行(n换成数字)
12. tail 命令
英文原意:output the last part of files
功能描述:显示指定文件的结尾内容(默认显示后10行)
所在路径:/usr/bin/tail
命令格式:tail [OPTION]… [FILE]…
常用选项:
o-n:显示指定文件的后n行
o-f:显示文件最后10行,并且对文件处于监听状态,实时更新和通知文件尾部的变化(tailf = tail -f)
13. cp 命令
英文原意:copy files and directories
功能描述:将一个或多个源文件复制到指定位置,默认情况下保留源文件名称,也可以改名
所在路径:/bin/cp
命令格式:cp [OPTION]… SOURCE DEST
常用选项:
o-d:当复制符号链接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录
o-p:复制文件时,保留源文件的属性
o-r:递归处理,复制时将指定目录下的所有文件和子目录,子文件全部复制到指定位置
o-a:相当于-dpr的集合,拥有三个选项的所有功能
14. mv 命令
英文原意:move (rename) files
功能描述:将指定文件移动(剪切)到指定目标位置,默认情况下保留源文件名称,也可以改名
所在路径:/bin/mv
命令格式:mv [OPTION]… SOURCE DEST
常用选项:
o-b:在进行文件移动时,若目标位置有同名文件存在,则将同名文件备份(备份文件名结尾有~标识)
可以直接使用y回答,提示虽然是覆盖,但会自动创建备份文件

拓展:rm、cp、mv命令的相同选项
-i:该选项的作用是在对文件操作时是否询问用户
-f:该选项的作用是在对文件操作时直接跳过询问用户的步骤
15. ln 命令
英文原意:make links between files
功能描述:为指定文件创建软链接(符号链接)或者硬链接
所在路径:/bin/ln
命令格式:ln [OPTION]… SOURCE DEST
常用选项:
o-s:为指定的源文件创建一个符号链接文件(软链接),不加“-s”则创建硬链接
注意:创建链接时,要使用绝对路径
[root@localhost ~]# ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 /root/

符号链接和硬链接区别:
​ 符号链接(软链接)特征:
源文件和软链接各自拥有不同的Inode号和Block块数
两个文件不管修改哪一个均可同步
删除源文件,软链接失效;删除软链接,源文件无影响
软链接文件大小不受源文件变化而影响,仅仅记录源文件的位置信息(Inode)
软链接文件权限为:rwxrwxrwx,但最终生效的权限以源文件为准
软链接既可以链接文件,也可以链接目录,并且可以跨分区创建
硬链接特征:
源文件和硬链接文件拥有相同的Inode号和Block块数(实际为同一个文件)
两个文件不管修改哪一个均可同步
无论删除哪一个,都互不影响
不能对目录创建硬链接,并且不能跨分区创建
三、权限管理命令

  1. 权限的意义
    通过ls -l命令我们可以看到文件的详细信息,其中第一列是关于文件类型和权限的表示位,我们来详细分析下
    -rw-r–r--. 1 root root 28250 1月 1 2020 install.log
    首先-rw-r–r--这个结构可以细分为四部分:文件类型、文件所有者权限、文件所属组权限、文件其他人权限

文件类型:
“-”:普通文件,普通文件类型下的子类型仍然有很多,比如压缩文件,文本文件,脚本文件等等,可以使用file命令查看
“d”:目录文件,Linux中一切接文件~
“l”:软链接文件,此处代表该文件为软链接,软链接是独立文件有自己的文件类型
“b”:块设备文件,存储类设备在Linux中的保存后的文件类型
“c”:字符设备文件,一般指用来进行数据传输的设备,输入输出设备等
“s”:套接字文件,一般用来实现两个进程之间通信的文件
“p”:管道文件,一般用来处理多个进程对同一个文件存取先后顺序问题
注意:设备类文件的详细信息中,文件大小位置显示的不是大小,而是主从设备号,主设备号代表着设备类型,从设备号代表着该类型设备的第几个。

拓展:查看文件具体详细类型的命令
命令:file
[root@localhost test]# ls -l
总用量 36
-rw-r–r-- 1 root root 28250 3月 14 14:41 install.log
-rw-r–r-- 1 root root 7544 3月 14 14:41 ins.tar.gz
[root@localhost test]#
[root@localhost test]# file install.log
install.log: UTF-8 Unicode text
[root@localhost test]#
[root@localhost test]# file ins.tar.gz
ins.tar.gz: gzip compressed data, from Unix, last modified: Thu Mar 14 14:40:53 2020

权限类型:
文本类文件:
or:内容查看权限
ow:内容编写权限
ox:执行权限
目录类文件:
or:文件:查看目录下文件列表权限
ow:文件:目录内文件创建删除权限
ox:文件:进入目录权限
注意:若指定位置有字母代表拥有该权限,若没有权限则使用 - 代替 例如:rw-r–r-- {表示所有者有读写权限,所属组和其他人有读权限}
用数字表示权限位:
or:4
ow:2
ox:1
例如:rw-r–r-- 的权限用数字表示就是 644{分别是所有者、所属组、其他人的权限}

拓展:用户添加&密码设置
用户添加:useradd
密码设置:passwd
2. 权限修改命令:chmod
英文原意:change file mode bits
功能描述:修改文件指定位置的rwx权限
所在路径:/bin/chmod
命令格式:chmod [OPTION]… MODE[,MODE]… FILE…
常用选项:
ochmod [augo] [±=] [rwx] file
ochmod 644 file
o-R:将设置的权限递归到该目录下的子文件上(一般针对目录使用)
实验测试:
o使用root用户创建一个目录(权限:755),并在目录下创建一个新文件(权限:644修改为777),尝试使用普通用户身份对文件进行删除
o再次使用root用户身份创建一个目录(权限:755修改为777),并在该目录下创建一个新文件(权限644),尝试使用普通用户对文件进行删除
o总结:对文件的删除权限并不在文件上,而在该文件所属目录(即:对目录有w权限,就可以删除目录内的文件)
3. 归属修改命令:chown
英文原意:change file owner and group
功能描述:修改文件的所有者或所属组
所在路径:/bin/chown
命令格式:chown [OPTION]… [OWNER]:[GROUP] FILE…
常用选项:
ochown user:group file
ochown user.group file
o-R:将设置的递归到该目录下的子文件上(一般针对目录使用)
4. 属组修改命令:chgrp
英文原意:change group ownership
功能描述:仅修改文件所属组
所在路径:/bin/chgrp
命令格式:chgrp [OPTION]… GROUP FILE…
常用选项:
ochgrp group file
o-R:将设置的递归到该目录下的子文件上(一般针对目录使用)
5. 掩码值修改命令:umask
英文原意:Display or set file mode mask
功能描述:查看或设置文件的权限掩码值
所在路径:shell内置命令
常用选项:
oumask:以八进制的数值显示文件的权限掩码值
oumask 002:按照给定的八进制数值覆盖掉原有的掩码值
文件默认权限的计算方式(对位相减)
o目录类文件:777-掩码=默认权限
o文件类文件:666-掩码=默认权限
总结:Linux是一个权限管理十分严格的操作系统,默认情况下是不给文本类文件分配 x 执行权限的
四、查询相关命令

  1. which
    英文原意:shows the full path of (shell) commands.
    功能描述:显示命令的绝对路径
    所在路径:/usr/bin/which
    命令格式:which [commands]
  2. whereis
    英文原意:locate the binary, source, and manual page files for a command
    功能描述:定位指定命令的二进制文件程序、源码文件和帮助手册页面等资源的位置
    所在路径:/usr/bin/whereis
    命令格式:whereis [-bms] filename
    常用选项:
    o-b:定位指定命令的绝对路径
    o-m:定位指定命令的帮助手册路径(即man帮助手册文档位置)
    o-s:定位指定命令的源码文件路径
  3. locate
    英文原意:find files by name
    功能描述:通过文件名进行文件位置查询 {locate命令进行文件查询并不是使用遍历的方式进行查找,而是事先创建好一个数据库,将所有文件的名称和对应路径保存在了其中,当查询文件时,只需要对数据库查询即可,速度上来说非常迅速}
    所在路径:/usr/bin/locate
    命令格式:locate 关键词
    常用选项:
    o-i:忽略查询对象的大小写
    数据库文件:/var/lib/mlocate/mlocate.db
    数据库更新:updatedb (database) #建议每次查询前先更新下数据库
    更新规则文件:/etc/updatedb.conf #配置文件中记录一些忽略不更新的文件类型和目录
  4. find
    英文原意:search for files in a directory hierarchy
    功能描述:在目录树种进行文件查询
    所在路径:/bin/find
    命令格式:find PATH [OPTION]
    根据名称查询:find /etc/ -name “.txt”
    o-name 模式下默认精确查询,可以使用通配符进行模糊查询:
    ? [];使用通配符查询时,查询对象必须用单双引号
    根据大小查询:find /etc/ -size 10K
    o-size 模式下默认使用精确大小查询,可以使用- +进行范围查询 { 常见单位:c:字节;w:子(2字节);b:块(512字节);k,M,G }
    根据归属查询:find /etc/ -user zhangsan
    o-user|-group模式下,可以查询属于某用户或某组的文件
    o-nouser|-nogroup 模式可以查询出没有所有者或所属组的文件(异常文件)
    根据权限查询:find /etc/ -perm 777
    o-perm 模式可以查询出指定权限的文件,一般用来查询权限过大的普通文件
    根据类型查询:find /etc/ -type f
    o-type模式下可以查询出指定类型的文件 [ f:普通文件;d:目录文件;l:链接文件等 ]
    根据inode查询:find /etc/ -inum 262149
    o-inum 模式可以查询出所有inode相同的文件(查询硬链接文件)
    根据时间查询:
    o访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
    o修改时间(-mtime/天,-mmin/分钟):文件最后一次内容修改时间。
    o变化时间(-ctime/天,-cmin/分钟):文件数据元(权限等)的最后一次修改时间。

-5:五天内或五分钟内访问过的文件
5:恰好在第五天或第五分钟访问过的文件
+5:五天前或五分钟前被访问过的文件
多条件同时查询:find /etc/ -name -a -type f
o-a:and的意思,将两个或两个以上的查询条件结合在一起进行文件查询(必须同时符合所有条件)
o-o:or的意思,多个条件结合后,其中一条条件符合就算符合查询要求
查询结果批处理:将 find 查询到的结果交给指定命令继续操作,以下两个连接符都能实现
o-exec|-ok:格式固定,稍复杂 executable
find /etc -name “.txt" -exec rm {} ;
{} :存储了find查询的结果集
;:固定格式,;作为结束符号
o|xargs:格式较简单,但不支持带空格的文件
find /etc/ -name "
.txt” |xargs rm
5. grep
英文原意:global search regular expression(RE) and print out the line
功能描述:在指定文件内根据一定条件查询符合条件的字符串
所在路径:/bin/grep
命令格式:grep [OPTION] FILE
常用选项:
o-i:在查询时忽略查询对象的大小写 ignore case
o-n:查询时,显示符合条件对象的所在行号 line-number
o-v:查询时,将条件反转,反向查询 invert-match
o–color=auto:将符合条件的对象高亮显示
6. “|” 和 “|xargs” 的作用
管道符:|
作用:将前一个命令的结果,作为后一个命令的输入(可以理解为把查询结果保存成了一个文本)
举例:find /var/log/ -name “.log" | grep --color=auto da
xargs命令:|xargs
作用:将前一个命令的结果,作为后一个命令的参数(所有符合条件的文件逐个传递给后面的命令)
举例:find /var/log/ -name "
.log” |xargs grep --color=auto da
7. find、locate、grep的对比
find 和 locate 都是用来在系统内查询文件位置的命令
find 是通过对所有目录进行遍历的方式进行查找的,结果精准,但消耗大量系统资源和时间
locate 是通过实现创建数据库保存文件位置,再查询数据库的一种快速索引方式,节省资源速度快,但是精准度稍差
grep 是用来在指定文件内查询符合条件的关键词的命令,操作对象是指定某文件
find 默认情况下是精确匹配,可以使用通配符进行模糊匹配
grep 默认情况下是包含匹配,要想精确匹配需要使用正则表达式(后面来讲)
8. 通配符的意义
通配符 作用
? 匹配一个任意字符

  • 匹配0个或任意多个任意字符
    [ ] 匹配括号内的任意一个字符,[aoe]
    [-] 匹配括号内字符串范围内的任意一个字符,[a-z] [0-9]
    [^] 逻辑非,即取反,表示匹配除了括号内的任意一个字符
    五、压缩相关命令
    压缩文件是操作系统中常见的文件格式,对文件进行压缩的主要目的是为了方便对文件进行统一管理,节省空间,方便传输携带等,其主要原理是对文件的二进制代码进行压缩,例如000000,可简写为60,意为6个0
    Linux中常见的压缩格式有以下几种:.zip .gz .bz2 .tar .tar.gz .tar.bz2 等
  1. zip
    解压缩:unzip filename.zip
    压缩:zip 压缩后名称 源文件
    o-r:压缩目录(递归处理目录下的子文件)
  2. gz
    解压缩:gunzip filename.gz 或者 gzip -d filename.gz
    压缩:gzip filename
  3. bz2
    解压缩:bunzip2 filename.bz2 或 bzip2 -d filename.bz2
    压缩:bzip2 -z filename
  4. tar
    解包:tar -xvf filename.tar
    打包:tar -cvf 打包后文件 源文件
  5. tar.gz
    解压缩:tar -xvf file.tar.gz
    压缩:tar -zcvf 压缩后文件 源文件
  6. tar.bz2
    解压缩:tar -xvf file.tar.bz2
    压缩:tar -jcvf 压缩后文件 源文件
  7. 其他
    除了上述格式外,还有一些不是特别常见,偶尔也会碰到的格式,我们只讲一下这些格式的解压缩方式
    “.tar.xz” 和 “.tgz”压缩包的解压方式:tar -xvf filename
    六、帮助相关命令
  8. man
    英文原意:format and display the on-line manual pages
    功能描述:通过帮助手册显示命令的使用方式
    命令格式:man command
    常用选项:
    o-f:显示该命令有哪几个级别的帮助(有些可以显示对应配置文件的帮助)
    多种帮助级别的含义:
    帮助等级 含义
    1 查看命令的帮助信息(多数位普通用户能执行的命令)
    2 查看可以被内核调用的函数的帮助信息
    3 查看C语言相关函数的帮助信息
    4 查看设备和特殊文件的帮助信息(主要存在于/dev/目录下)
    5 配置文件的帮助信息
    6 游戏的帮助信息(主要存在于个人版Linux)
    7 查看其他杂项的帮助信息
    8 查看超级管理员能执行的命令的帮助
    9 内核信息的帮助文档
    交互模式下的快捷键:
    快捷键 功能
    上箭头 查看上一行
    下箭头 查看下一行
    PgUp 向上翻页
    PgDn 向下翻页
    g 回到首页
    G 翻到尾页
    q 退出交互模式
    / 在交互模式下根据指定关键词进行搜索
    n 查询完成后,可以使用n快速定位到下一个符合条件的关键词
  9. help
    英文原意:help
    功能描述:显示Linux内置命令相关帮助信息
    命令格式:help command
    常用选项:
    o-m:模拟man的格式显示帮助信息(鸡肋~)

拓展:–help选项
格式:ls --help
Linux中绝大多数的命令都可以是用–help作为选项显示帮助信息,只是显示的内容没有man和info全面而已。
3. info
英文原意:read info documents
功能描述:查看指定命令的帮助信息等
命令格式:info command
常用选项:常用快捷键如下
快捷键 功能
上箭头 查看上一行
下箭头 查看下一行
PgUp 向上翻页
PgDn 向下翻页
Tab 快速切换到下一个以开头的节点
回车 进入到当前以
开头的节点内,查看详细信息
u 退出节点,回到帮助首页
n 当处于某一节点内时,可以直接切换到下一个节点
p 当处于某一节点内时,可以直接切换到上一个节点
? 查看info所提供的的交互命令的帮助信息
q 退出info模式

注意:info是Linux系统中最高级的帮助信息,对于初学者不是很友好,不要求前期掌握。
七、关机与重启命令
1.sync
英文原意:flush file system buffers
功能描述:强制将缓冲区中的数据写入磁盘中
命令格式:sync
常用选项:无
Linux操作系统为了提高数据的处理速度会将数据放入到磁盘的缓冲区中(buffer),但是如果数据在缓冲区中时发生突然断电重启之类的操作数据可能就会丢失,为了预防这类事件发生,我们可以在将数据“写入”磁盘后,执行一次sync将数据强制写入到真正的磁盘中。当然,如果没有人为干预,操作系统也会自行执行sync只是时间和周期上不确定也不及时。

2.shutdown
英文原意:shutdown – Halt,poweroff or reboot the machine
功能描述:用来关机或者重启的命令
命令格式:shutdown [选项] 参数
常用选项:
o-h:halt,发送关机信号,后面指定倒计时时长(now,1200)
o-r:reboot,发送重启信号,后面指定倒计时时长(now,1200)

拓展:halt和poweroff
两个命令和shutdown -h 作用一致,都是用来关机的
3.reboot
英文原意:reboot
功能描述:重启当前操作系统
命令格式:reboot
常用选项:无
4.init
英文原意:systemd, init - systemd system and service manager
功能描述:临时修改操作系统的运行级别,可用来关机或重启
命令格式:init N
常用选项:
oinit 0 : 关机
oinit 6 :重启
八、常见网络命令

  1. 红帽系列网络管理命令
    CentOS 6.x
    命令:setup

    CentOS 7.x
    命令:nmtui

  2. 命令:ifconfig
    功能1:查看网卡的相关信息,最小化没有此命令,需要安装net-tools软件
    ens33: flags=4163 mtu 1500
    inet 192.168.88.120 netmask 255.255.255.0 broadcast 192.168.88.255
    inet6 fe80::7599:771:ff61:82a2 prefixlen 64 scopeid 0x20
    ether 00:0c:29:87:24:7b txqueuelen 1000 (Ethernet)
    RX packets 14479 bytes 9077172 (8.6 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 14611 bytes 24963809 (23.8 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 68 bytes 5916 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5916 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
功能2:临时修改网卡的网络参数
[root@localhost ~]# ifconfig ens33 192.168.88.121/24

[root@localhost ~]# ifconfig ens33 192.168.88.121 netmask 255.255.255.0
#仅当前临时生效,重启网卡或者服务即恢复原来配置文件中的内容

  1. 命令:ip
    功能1:查看ip等网络资源信息
    [root@localhost ~]# ip address show
    1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:87:24:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.120/24 brd 192.168.88.255 scope global noprefixroute ens33
    valid_lft forever preferred_lft forever
    inet6 fe80::7599:771:ff61:82a2/64 scope link noprefixroute
    valid_lft forever preferred_lft forever
    功能2:临时配置ip等网络参数
    [root@localhost ~]# ip address add 192.168.88.121/24 dev ens33
    [root@localhost ~]# ip a
    1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:87:24:7b brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.120/24 brd 192.168.88.255 scope global noprefixroute ens33
    valid_lft forever preferred_lft forever
    inet 192.168.88.121/24 scope global secondary ens33
    valid_lft forever preferred_lft forever
    inet6 fe80::7599:771:ff61:82a2/64 scope link noprefixroute
    valid_lft forever preferred_lft forever
    #add 换成 del 可以删除新增的ip信息
    功能3:查看当前生效的网关信息
    [root@localhost ~]# ip route show
    default via 192.168.88.2 dev ens33 proto static metric 100
    192.168.88.0/24 dev ens33 proto kernel scope link src 192.168.88.120 metric 100

  2. 命令:ifup & ifdown
    功能:单独针对某一网卡的启动关闭命令
    [root@localhost ~]# ifdown ens33
    #关闭指定网卡
    [root@localhost ~]# ifup ens33
    #启动指定网卡

  3. 命令:ping
    功能:通过ICMP协议探测网络中的主机是否能正常通信
    选项:
    -c :用于指定ping的次数
    -s :指定探测时使用的数据包大小(最大65507)
    [root@localhost ~]# ping -c 4 192.168.88.1
    PING 192.168.88.1 (192.168.88.1) 56(84) bytes of data.
    64 bytes from 192.168.88.1: icmp_seq=1 ttl=128 time=0.158 ms
    64 bytes from 192.168.88.1: icmp_seq=2 ttl=128 time=0.197 ms
    64 bytes from 192.168.88.1: icmp_seq=3 ttl=128 time=0.187 ms
    64 bytes from 192.168.88.1: icmp_seq=4 ttl=128 time=0.163 ms

— 192.168.88.1 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
#发出的包数、返回的包数、丢包率、往返消耗时间
rtt min/avg/max/mdev = 0.158/0.176/0.197/0.018 ms
#最小、平均、最大、硬件消耗时间

  1. 命令:netstat
    功能:查看网络连接状态的命令,可以查看本机开启的端口(TCP/UDP),最小化是没有安装的。
    选项:
    -a:列出所有网络状态
    -n:以数字方式显示IP和端口信息
    -t:显示TCP协议对应信息
    -u:显示UDP协议对应信息
    -p:显示进程的进程号和进程名
    -l:显示监听状态的连接
    组合1:-antp
    [root@localhost ~]# netstat -antp
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6670/sshd
    tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6822/master
    tcp 0 0 192.168.88.120:22 192.168.88.1:52506 ESTABLISHED 6980/sshd: root@pts
    tcp6 0 0 :::111 :: LISTEN 1/systemd
    tcp6 0 0 :::22 :: LISTEN 6670/sshd
    tcp6 0 0 ::1:25 :: LISTEN 6822/master
    组合2:-tlunp
    [root@localhost ~]# netstat -tlunp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6670/sshd
    tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6822/master
    tcp6 0 0 :::111 :: LISTEN 1/systemd
    tcp6 0 0 :::22 :: LISTEN 6670/sshd
    tcp6 0 0 ::1:25 :: LISTEN 6822/master
    udp 0 0 0.0.0.0:1002 0.0.0.0:* 6365/rpcbind
    udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
    udp 0 0 127.0.0.1:323 0.0.0.0:* 6364/chronyd
    udp6 0 0 :::1002 :: 6365/rpcbind
    udp6 0 0 :::111 :: 1/systemd
    udp6 0 0 ::1:323 :: 6364/chronyd

  2. 命令:ss
    功能:类似于netstat命令
    [root@localhost ~]# ss -atu
    Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
    udp UNCONN 0 0 :1002 :
    udp UNCONN 0 0 :sunrpc :
    udp UNCONN 0 0 127.0.0.1:323 :
    udp UNCONN 0 0 :::1002 :::

    udp UNCONN 0 0 :::sunrpc :::

    udp UNCONN 0 0 ::1:323 ::
    tcp LISTEN 0 128 :sunrpc :
    tcp LISTEN 0 128 :ssh :
    tcp LISTEN 0 100 127.0.0.1:smtp :
    tcp ESTAB 0 52 192.168.88.120:ssh 192.168.88.1:52506
    tcp LISTEN 0 128 :::sunrpc :::

    tcp LISTEN 0 128 :::ssh :::

    tcp LISTEN 0 100 ::1:smtp ::

  3. 命令:write
    功能:向指定的在线用户发送信息
    [root@localhost ~]# write root pts/1
    hello

  4. 命令:wall
    功能:向所有在线用户发送信息
    [root@localhost ~]# wall
    hello
    ctrl + d #使用组合键才能发送信息

  5. 命令:mail
    功能:给指定用户发送邮件信息,以及接收邮件信息
    [root@localhost ~]# mail zhangsan
    hello
    ctrl + d 发送邮件

查收邮件:
[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
“/var/spool/mail/root”: 1 message 1 new

N 1 root Tue May 26 02:59 18/617 “test”
& 1
Message 1:
From [email protected] Tue May 26 02:59:20 2020
Return-Path: [email protected]
X-Original-To: root
Delivered-To: [email protected]
Date: Tue, 26 May 2020 02:59:20 +0800
To: [email protected]
Subject: test
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected] (root)
Status: R

hello , i am root.

&

九、系统资源查看命令

  1. 命令:w
    功能:查询当前登录服务器的用户
    [root@localhost ~]# w
    19:12:16 up 10:54, 1 user, load average: 0.00, 0.01, 0.05
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    root pts/0 192.168.88.1 16:22 8.00s 0.14s 0.00s w
    第一行:当前时间 持续运行时间,登录用户数量,1分钟,5分钟,15分钟 前的平均负载
    第二行:用户名 TTY:登录终端 FROM:来源IP 登录时间
    IDLE:用户闲置时间
    JCPU:所有进程占用cpu时间
    PCPU:当前进程占用cpu时间
    WHAT:用户正在进行的操作

  2. 命令:who
    功能:查询登录用户
    命令所在路径:/usr/bin/who
    执行权限:所有用户
    [root@localhost ~]# who
    root pts/0 2020-05-25 16:22 (192.168.88.1)

  3. 命令:last
    功能:列出所有登录过系统的相关信息
    命令所在路径:/usr/bin/last
    执行权限:所有用户
    [root@localhost ~]# last
    root pts/2 192.168.88.1 Tue May 26 02:52 - 03:00 (00:07)
    root pts/1 192.168.88.1 Tue May 26 02:50 - 02:51 (00:00)
    root pts/0 192.168.88.1 Mon May 25 16:22 still logged in
    root pts/0 192.168.88.1 Mon May 25 16:18 - 16:18 (00:00)
    reboot system boot 3.10.0-957.el7.x Mon May 25 16:17 - 03:13 (10:56)
    root pts/0 192.168.88.1 Mon May 25 16:10 - down (00:00)
    reboot system boot 3.10.0-957.el7.x Mon May 25 16:10 - 16:11 (00:01)
    root pts/0 192.168.88.1 Mon May 25 16:05 - down (00:04)
    root tty1 Mon May 25 15:57 - 16:10 (00:12)
    reboot system boot 3.10.0-957.el7.x Thu May 21 09:07 - 16:10 (4+07:03)

wtmp begins Thu May 21 09:07:10 2020
4. 命令:lastlog
功能:显示所有账户最后一次的登录时间
命令所在路径:/usr/bin/lastlog
执行权限:所有用户
[root@localhost ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/2 192.168.88.1 二 5月 24 00:52:18 +0800 2020
bin 从未登录过
daemon 从未登录过
adm 从未登录过
lp 从未登录过
5. 命令:lastb
功能:查看登录错误的信息(登录失败信息)
[root@localhost ~]# lastb
root ssh:notty 192.168.88.1 Tue May 24 03:15 - 03:15 (00:00)
root ssh:notty 192.168.88.1 Tue May 24 03:15 - 03:15 (00:00)
root ssh:notty 192.168.88.1 Tue May 24 03:15 - 03:15 (00:00)
root ssh:notty 192.168.88.1 Tue May 24 03:15 - 03:15 (00:00)
root ssh:notty 192.168.88.1 Tue May 24 03:15 - 03:15 (00:00)
root ssh:notty 192.168.88.1 Tue May 24 03:15 - 03:15 (00:00)

btmp begins Tue May 24 03:15:10 2020

十、挂载命令
linux所有存储设备都必须挂载使用,包括硬盘、光盘、U盘等
命令名称:mount
命令所在路径:/bin/mount

  1. mount
    功能:查询系统中已经挂载的设备
    常见的存储设备:
    /dev/sda1 第一个scsi硬盘的第一分区
    /dev/cdrom 光盘
    /dev/sr0 光盘

常用挂载点:
/mnt
/media
/cdrom

挂载格式:
mount [-t 文件系统类型] [-o 特殊选项] 设备文件名 挂载点

选项:
-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660 等文件系统。
-o 特殊选项:可以指定挂载的额外选项,比如读写权限、同步异步等,如果不指定则默认值生效。

例:
mount 查看挂载信息
/dev/sda1 on /boot type ext4 (rw)
我们查看到/boot分区已经被挂载,而且采用的defaults选项,那么我们重新挂载分区,并采用noexec 权限禁止执行文件执行,看看会出现什么情况(注意不要用/分区做试验,不然系统命令也不能执行了)
[root@lchuan ~]mount -o remount,noexec /boot
[root@lchuan ~]cd /boot
[root@lchuan ~]vim hello.sh
#!/bin/bash
echo “hello world!”
[root@lchuan ~]chmod 755 hello.sh
[root@lchuan ~]./hello.sh
[root@lchuan ~]-bash: ./hello.sh: 权限不够
[root@lchuan ~]mount -o remount,exec /boot
#完事记得修改回来,不然会影响系统正常启动

  1. 挂载硬盘分区、移动硬盘
    [root@lchuan ~]mkdir /disk1
    #创建挂载点
    [root@lchuan ~]mount /dev/sdb1 /mnt/disk1
    #挂载硬盘分区或者移动硬盘

  2. 挂载光盘
    [root@lchuan ~]mount -t iso9660 /dev/sr0 /mnt
    #/mnt必须是已存在的目录

  3. 挂载U盘
    [root@lchuan ~]fdisk -l
    #查看当前系统下的存储设备,确认U盘的设备名称

[root@lchuan ~]mount -t vfat /dev/sdb1 /mnt/usb
#fat32格式的U盘挂载方式

-t vfat fat32
-t fat fat16
注:Linux默认情况不识别NTFS格式。

  1. 卸载
    umount 设备名称或者是挂载点
    #所有的挂载的设备卸载方式都一样

  2. 拓展:挂载NTFS分区设备
    重新编译内核(略)
    加载NTFS模块(略)
    使用第三方插件加载NTFS格式
    1.下载NTFS-3g插件
    2.安装插件
    3.挂载NTFS格式设备
    [root@lchuan ~]mount -t ntfs-3g 设备名 挂载点

第五章:vi & vim 编辑器
Linux运维+云计算
版本:V1.0

一、编辑器简介
vi & vim 是一个字符终端下的全屏纯文本编辑器,vim是vi的升级版,为此我们以后就用vim就可以了。
1.1 工作模式

命令模式:使用一些指令性命令对文件内容进行操作,多是一些快速处理文本的方法
输入模式:文件内容的编辑模式,常用来编写和修改文件
末行模式:特殊模式
1.2 进入输入模式的方法
a 在光标所在字符后插入
A 在光标所在行尾插入
i 在光标所在字符前插入
I 在光标所在行行首插入
o 在光标下插入新行
O 在光标上插入新行

二、命令模式下操作
2.1 光标移动
1)光标上下左右移动
上、下、左、右光标键
h、j、k、l按键功能同上
2)光标移动到文件头和文件尾
gg 移动光标到文件头
G 光标移动到文件尾
3)光标移动到行首和行尾
^ 光标移动到行首
$ 光标移动到行尾
2.2 删除、复制和剪切等操作
1)删除一个字符
x 删除光标当前所在字符
nx 从当前光标处删除指定n个字符;例如:10x
2)删除行,并将内容保存到缓冲区
dd 删除光标所在行
ndd 删除从当前光标处的连续n行;例如:5dd
dG 从光标处删除到文件尾
3)复制指定内容到缓冲区中
yy 复制光标所在行内容
nyy 从当前行连续复制多行内容
4)将保存在缓存中的内容粘贴到指定位置
p 将缓存中的内容粘贴到当前所在行的下边
P(大) 将缓存中的内容粘贴到当前所在行的上边
5)替换指定字符串
r 替换光标所在字符
R 从光标所在处开始连续替换,直至按ESC结束
6)撤销
u 撤销内容编辑的操作,可连续操作
crtl+r 反撤销,可连续使用,直至撤销到最后一次操作状态
7)查询操作
/ 从光标所在处向下查询
? 从光标所在处向上查询
n 定位下一个查到的关键词
N 定位上一个查到的关键词
三、末行模式相关操作
末行模式是一种特殊模式,能实现很多种行为
1) 移动到指定行
:n 移动光标到指定行
2)删除指定范围内的行
:n,md 删除从第n行到第m行的内容
3)显示和取消显示行号
:set nu 显示行号
:set nonu 取消显示行号
4)取消因之前查询的颜色高亮
:noh 取消因查询造成的颜色高亮
5)替换指定字符串
:ns /old/new/ 将指定第n行的第一个old替换为new
:ns /old/new/g 将指定第n行的所有old替换为new

案例:
:1,10s /^/#/		将文件的第1-10行开头添加#注释
:%s /^#//			取消全文的注释信息
:1,10s /^/\/\//		将文件的第1-10行开头添加//注释

6)导入其他文件
:r 文件路径 将其他文件的内容导入到当前文件的光标所在处
7)在文本中执行命令
:!命令 在文件中执行命令,查看命令结果
:r !命令 在文件中执行命令,但不显示结果,而是将结果插入到光标所在处
8)定义快捷键
:ab 简 繁 定义一个简单的字符串,代表后续的繁杂字符串,用来快速输出字符串
:map 快捷键 功能 定义快捷键,快速执行某项操作

案例:
:ab mymail [email protected]
	当输入mymail时,自动替换成完成的邮箱地址
:map ^P I#
	^p:是使用ctrl+v+p按出来的
	当使用ctrl+p时,给当前行添加#注释
:map ^B	^x
	^b::是使用ctrl+v+b按出来的
	当使用ctrl+b时,删除行首的第一个字符{会忽略掉空格}
  1. 保存&保存退出
    :w 将修改保存到文档中{仅仅是保存相当ctrl+s,但不退出文本}
    :wq 将修改保存到文档,并退出当前文档,结束编辑
    :wq! 强制将修改保存,并退出当前文档
    10)退出&不保存退出
    :q 退出当前文档,结束编辑,但仅限于没有对内容做过修改的文档
    :q! 强制退出文档,结束编辑,但不保存修改过的内容,适合修改过内容的文档
    四、同时打开多个文件
    vim命令可以同时打开两个文件,并操作
    -o :按照上下分屏打开两个文件
    -O :按照左右分屏的方式打开两个文件
    ctrl+w
    用上下、左右进行文件切换。
    五、别名
    命令:alias
    功能:列出生效了的别名
    [root@localhost ~]# alias
    alias cp=‘cp -i’
    alias egrep=‘egrep --color=auto’
    alias fgrep=‘fgrep --color=auto’
    alias grep=‘grep --color=auto’
    alias l.=‘ls -d .* --color=auto’
    alias ll=‘ls -l --color=auto’
    alias ls=‘ls --color=auto’
    alias mv=‘mv -i’
    alias rm=‘rm -i’

自定义别名:
格式:alias 别名=‘实际命令’
例如:alias vi=‘vim’ #照顾那些习惯用vi的同志们~
取消设置:unalias 别名 #临时取消该别名的功能了

别名永久生效:
单个用户:~/.bashrc
所有用户:/etc/bashrc

刷新配置文件:
source ~/.bashrc

第六章:软件安装
Linux运维+云计算
版本:V1.0
一、软件安装包介绍
1.1 软件包分类
源码软件包
二进制软件包
附带安装程序的软件包
绿色免安装版(不是很常见~)

1.2 源码软件包
源码软件包,一般指通过源码编写好的软件打包压缩好的压缩包,这类软件包需要使用专门的工具进行编译安装才能正常使用,可以通过下面的案例来理解。

1.2.1 这里我们使用C语言来编写一个简单的程序,然后来完成编译安装。
[root@localhost ~]# vim /test/hello.c
#include
int main(void){
printf(“Hello World!\n”);
}
1.2.2 安装编译所需的工具软件gcc
1)挂载光盘到操作系统中
[root@localhost ~]# mount /dev/sr0 /media

2)手动编写配置文件
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost ~]# rm -rf *
[root@localhost ~]# vim centos7.repo
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

3)安装编译工具gcc {前提:能连接互联网}
[root@localhost ~]# yum -y install gcc

1.2.3 将C语言编写的程序编译生成二进制文件
[root@localhost ~]# cd /test/
[root@localhost ~]# gcc hello.c

1.2.4 执行产生的二进制文件,测试效果
[root@localhost test]# ls
a.out hello.c
[root@localhost test]# ./a.out
Hello World!

1.3 二进制软件包
通过对源码软件包的了解大家都知道源码软件安装相对复杂,并不是所有人都会使用这种方式进行软件安装的,为了让刚入门Linux或者只需要会简单操作Linux的人员方便软件安装,软件厂商们对软件安装进行了方法统一,在厂商的系统里直接编译好软件,然后将编译好的软件打包发布给用户,用户可以直接安装使用,省去了编译过程。
但是Linux发行版本众多,不同的发行版本使用的打包机制不一样,但总体分为两大派系。 Debian的”.deb”,和 Red Hat的”.rpm”,当然也有一些例外,比如Gentoo等。本章节重点来讲解Red Hat系列的二进制软件包管理,Debian系列的作为扩展内容来讲解。

1.4 附带安装程序的软件包
有些软件包厂商为了照顾软件安装人员,给自己的软件编写了安装脚本,管理人员只需要执行脚本,并按照脚本的提示即可完成安装,非常方便快捷。但是这类软件较少,主要原因是,软件需要适配不同的Linux发行版本以及各种Linux内核版本,编写安装程序较为繁琐,所以此类软件相对较少。这种安装方式最终还是使用的源码或者二进制的方式安装的。

1.5 源码软件包和二进制软件包特征
1.5.1 源码软件包
优点:
开源软件,如果有足够的能力,可以修改源代码;
可以自由选择所需的功能;
软件是编译安装,所以更加适合自己的系统,更加稳定、效率更高;
卸载方便;

缺点:
安装过程步骤较多,尤其安装较大的软件集合时(如LAMP搭建),容易出现拼写错误;
编译过程时间较长,安装比二进制安装时间长;
因为是编译安装,安装过程中一旦报错新手很难解决;

1.5.2 二进制软件包
优点:
包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载;
安装速度比源码包安装快的多;

缺点:
经过编译,不再可以看到源代码;
功能选择不如源码包灵活;
依赖性;
二、二进制安装包-rpm管理命令
RPM命名“RedHat Package Manager”,简称则为RPM。这个机制最早由Red Hat这家公司开发出来,后来很多Linux的发行版都采用了这种软件包管理机制,能够快速实现对软件包的安装、卸载、升级、查询等操作。本小节来讲解如何用rpm命令来管理rpm软件包。
2.1 rpm软件包的命名规范
Linux软件包的命名也有一定的规律,一般用短杠{-}作为间隔,每段都有自己的含义。
格式:软件名-主版本-修订次数-适用系统-硬件平台.后缀
tree-1.6.0-10.el7.x86_64.rpm
软件名:tree
主版本:1.6.0
修订次数:10
适用系统:适用于哪些发行版本el6、el7分别代表redhat6、redhat7
硬件平台:适合哪些CPU平台i386 i686 x86 x86_64 amd64 noarch不区分平台
后缀名称:.rpm

注意:
包全名:安装之前一般用包全名操作管理{tree-1.6.0-10.el7.x86_64.rpm}
包 名:安装后的一般使用包名操作管理{tree}
2.2 rpm软件包的依赖关系

软件包的依赖对象有两种,第一种是明确告诉你依赖哪一个软件,第二种只会告诉要依赖的文件名叫什么(函数文件),第一种好解决,第二种则需要查询这个文件属于哪个软件。将对应的软件安装上才能解决。

查询指定文件属于哪个软件包:http://www.rpmfind.net/
2.3 软件的默认安装路径
软件安装相关目录 目录内保存内容
/etc/ 配置文件保存位置
/usr/bin/ 软件命令保存位置
/usr/lib/ 函数文件保存位置
/usr/share/doc/ 使用手册保存位置
/usr/share/man/ 帮助文档保存位置
2.4 rpm软件包的相关管理命令
2.4.1 安装命令
格式:rpm -ivh 软件包全名
-i 安装一个新的rpm软件包
-v 显示安装过程中的详细信息
-h 以“#”号显示安装的进度

–test #测试安装,不真正安装,检测软件依赖关系
–force #强制安装某个已安装了的软件

2.4.2 卸载命令
格式:rpm -e 软件名
-e 卸载软件(注意卸载顺序)

2.4.3 升级命令
格式:rpm -Uvh 软件包全名
-U 升级安装,若没安装,则直接安装,若安装有旧版本,则升级安装
-F 升级安装,若没安装,则不安装,必须有旧版本,才进行升级安装
–nodeps 升级安装时不检测依赖关系

2.4.4 查询已安装的软件信息
格式:rpm -q[子选项] 软件名
-q 软件名 #查看指定软件是否安装
-qa #查看系统中所有已安装的软件
-qi 软件名 #查看指定软件的详细信息
-ql 软件名 #查看指定软件安装的目录和文件列表
-qR 软件名 #查看指定软件的依赖关系

2.4.5 查询未安装的软件包信息
格式:rpm -qp[子选项] 软件包全名
-qpi 包全名 #查看指定未安装软件的详细信息
-qpl 包全名 #查看指定未安装软件的默认安装位置(预览)
-qpR 包全名 #查看指定未安装软件的依赖关系

2.4.6 查询文件或者目录属于哪个软件包
格式:rpm -qf 文件或者目录
三、二进制安装包-yum管理命令
大家发现在使用rpm命令安装软件时无法自动解决依赖关系,并且每次安装都需要找到软件包的确切路径才能安装,非常非常的费劲,因此我们有了一种新的软件包管理工具:yum命令,主要来解决依赖关系和软件位置查询问题。
工作原理:通过提前配置好配置文件,告诉yum命令软件包存放的位置,然后yum在安装软件时自行分析软件之间的依赖关系,并完成自动安装,从而解放了管理者。
3.1 yum(源)仓库的分类
3.1.1 光盘yum源
将光驱或者镜像文件作为软件安装的仓库,通过配置文件获取软件仓库的位置,完成软件安装。
3.1.2 局域网yum源
在机房内,有时候为了方便我们可以配置一台机器为yum源服务器,其它服务器只需要通过配置文件连接这台服务器就能得到相应的软件包,不需要每一台都单独挂载光盘设备或光盘文件。此处我们暂时只讲原理,实验后续扩展中再讲。

3.1.3 互联网yum源
此类yum源是互联网上已经配置好了的yum仓库,我们只需要修改服务器的配置文件能连接到互联网yum源即可。
常用互联网yum源:
网易:http://mirrors.163.com/
阿里:https://developer.aliyun.com/mirror/
3.2 本地光盘yum仓库的搭建
1)将光盘挂载到指定的目录下
使用光驱设备时,将光驱挂载到目录
[root@localhost ~]# mount -t iso9660 /dev/sr0 /media
使用iso镜像文件,将文件挂载到目录
[root@localhost ~]# mount -o loop -t iso9660 /iso/centos7.iso /media
2)修改本地yum源配置文件
[root@localhost ~]# cd /etc/yum.repos.d
[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
#此文件为网络yum源配置文件,优先级比本地yum配置文件高,所以需要改名或删掉
[root@localhost yum.repos.d]# vim CentOS-Media.repo
修改前:
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

修改后:
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media #此处填写光盘的挂载目录
gpgcheck=0 #关闭安装时的软件校验功能(可不修改)
enabled=1 #启动本地yum源开关
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
3)测试yum是否可用
[root@localhost ~]# yum clean all #清空原有的yum缓存数据
已加载插件:fastestmirror, langpacks
正在清理软件源: c7-media
[root@localhost ~]# yum makecache #根据新的配置文件建立新的缓存数据
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
c7-media | 3.6 kB 00:00:00
(1/4): c7-media/group_gz | 166 kB 00:00:00
(2/4): c7-media/primary_db | 6.0 MB 00:00:00
(3/4): c7-media/filelists_db | 7.1 MB 00:00:00
(4/4): c7-media/other_db | 2.6 MB 00:00:00
元数据缓存已建立

3.3 互联网yum源配置
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# rm -rf *
[root@localhost yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@localhost yum.repos.d]# ls
CentOS7-Base-163.repo

3.4 rpm包管理命令之yum命令
3.4.1 yum安装
yum install [软件名]
yum groupinstall [软件组名]
3.4.2 yum卸载
yum remove [软件名]
yum groupremove [软件组名]
3.4.3 yum升级
yum update [软件名]
yum groupupdate [软件组名]
yum upgrade #更新所有需要更新的软件
yum update #更新所有需要更新的软件&及内核更新版本(非主版本)
3.4.4 yum软件包查询
yum list #查询所有已安装和可安装的软件包
yum list 软件名 #查询指定软件是否已安装
yum info 软件名 #查询指定软件包的信息
yum grouplist 软件组名 #查询所有已安装和可安装的软件组
yum groupinfo 软件组名 #列出软件组中包含的软件
例:“yum groupinfo Web Server”
yum search <关键词> #查询中所有和关键词相关的包
3.4.5 yum其他命令
yum clean all #清除下载的临时软件包和缓存
yum makecache #建立软件包缓存,提高查询速度
3.4.6 yum安装软件组实验字符变桌面
通过yum为纯字符系统安装图形化桌面
yum -y groupinstall “X Window System”
yum -y groupinstall “GNOME Desktop”
yum -y groupinstall “Graphical Administration Tools”
startx #启动图形界面
ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
#永久修改系统启动级别为桌面模式,-f强制执行
四、二进制安装包-软件校验&软件修复
4.1 二进制软件包的校验
在进行二进制软件包安装时,为了保证所安装的软件是来自官方服务器,所以会有一个校验步骤,校验所安装的软件是否出自官方。而安装完成之后也会一种校验机制,校验软件是否做过修改和配置。
4.1.1 软件安装前的校验(数字证书校验)
光盘镜像文件在发布的时候就已经集成了数字证书了(公钥),每当我们安装软件时,都会将软件当中的证书(私钥)取出来和公钥做校验,只要校验能通过则代表软件没有问题。
1)安装数字证书

  1. 挂载光盘
    [root@localhost ~]# mount /dev/sr0 /media/
    mount: /dev/sr0 写保护,将以只读方式挂载
    [root@localhost ~]# cd /media/
    [root@localhost media]# ls
    CentOS_BuildTag EULA images LiveOS repodata RPM-GPG-KEY-CentOS-Testing-7
    EFI GPL isolinux Packages RPM-GPG-KEY-CentOS-7 TRANS.TBL
  2. 安装证书
    [root@localhost media]# rpm --import RPM-GPG-KEY-CentOS-7
    [root@localhost media]# rpm -qa | grep gpg-pubkey
    gpg-pubkey-f4a80eb5-53a7ff4b

2)开启数字证书校验-yum
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim CentOS-Media.repo
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

4.1.2 软件安装后的校验
利用rpm命令对某些软件进行校验,校验结果可以反映该软件哪些内容在安装后被修改。
命令:rpm -V 软件名
[root@localhost ~]# rpm -q httpd
httpd-2.4.6-88.el7.centos.x86_64
[root@localhost ~]# rpm -V httpd
#若安装后无任何修改,则此处什么都不显示

显示结果分析:
[root@localhost ~]# rpm -V httpd
S.5…T. c /etc/httpd/conf/httpd.conf
1)打印到屏幕上的信息共分为3部分
第一部分为验证结果;第二部分为文件类型;第三部分为文件位置。
2)验证结果具体的信息
s 文件大小是否改变
M 权限是否被改变
5 文件的MD5校验和是否改变(即文件内容)
D 主从设备号是否改变(/dev/)
L 文件路径是否改变
U 文件的属主是否改变
G 文件的属组是否改变
T 文件的修改时间是否改变
3)文件类型具体分类
c 配置文件
d 普通文件
g “ghost”文件,很少见,该文件不应在RPM包中
l 授权文件
r 描述文件

4.2 二进制软件包安装后的修复
Linux运行中会造成某些文件修改后无法复原或丢失,若想要找回最初始的文件就需要对软件进行修复,在软件修复前我们先来了解下软件包的内部构造。
4.2.1 二进制软件包的结构
将某个rpm软件包提取到windows环境下,使用解压缩工具查看软件包的内部构造。然后对比安装在Linux中的文件,观察有什么规律。
cpio命令主要是用来建立或者还原备份的工具,cpio命令可以复制文件到压缩包,或者从压缩包中导出文件。
1)cpio的备份模式{压缩}
格式:cpio -ovcB > [文件|设备]
-o:进入copy-out模式(压缩)
-v:显示过程
-c:使用portable format存储方式
-B:设定输入输出块为512bytes
2)cpio的还原模式{解压缩}
格式:cpio -idvcu < [cpio文件]
-i:进入copy-in模式(解压)
-d:恢复到指定位置(视压缩方式恢复)
-v:显示过程
-c:使用portable format存储方式
-u:替换所有文件,无提示
案例1:利用绝对路径备份&恢复
cpio备份:
find /etc | cpio -ocvB > /root/etc.cpio
#利用find 找出/etc 然后备份到/root下
cpio还原:
cpio -idvcu < /root/etc.cpio
注:由于备份时备份的路径使用的是绝对路径,所有恢复时会按照绝对路径恢复回去,所以不会在/root下生成文件。

案例2:利用相对路径备份&恢复
cpio备份:
cd /etc #切换到/etc下
find ./ | cpio -ocvB > /root/etc.cpio
#以相对路径方式进行备份
cpio恢复:
cd /root #切换到/root
mkdir test #创建恢复目录
cd test #进入恢复目录
cpio -idvcu < /root/etc.cpio
#恢复以相对路径备份的etc.cpio文件,内容会被恢复到/root/test/目录下。

4.2.2 提取软件包文件修复
rpm2cpio 命令可以提取指定RPM软件包中的文件,实现文件恢复。
格式:rpm2cpio 包全名 | cpio -idv ./命令绝对路径

这条命令最好在/目录下执行,因为恢复出来的文件是绝对路径,在/目录下可以直接回到命令默认所在目录下

案例:假设不小心把系统下的/bin/ls 命令删除了,使用时报错了,需要恢复。
恢复步骤:
先确定ls 命令属于哪一个软件包
先模拟出ls命令被删除的样子
提取RPM包中的ls命令,并恢复到指定的目录下
4.2.3 强制覆盖安装修复
rpm -ivh --force 软件包全名
–force:该选项可以强制重新安装某软件,将丢失的文件恢复回来
五、源码软件包安装相关操作
5.1 准备工作
5.1.1 软件环境
1)检查yum仓库是否可以正常使用
2)检查gcc、gcc-c++、make等命令是否安装,没有则使用yum安装
3)额外的软件包:expat-devel
5.1.2 软件包下载
软件一般都要找对应的官网下载,切记不能随意找小网站下载,切记。
5.2 源码软件安装流程

案例:源码httpd安装过程
1)下载较新的稳定版
[root@localhost ~]# wget https://mirrors.bfsu.edu.cn/apache//httpd/httpd-2.4.43.tar.gz

2)安装前的检查和记录
[root@localhost ~]# tar -xf httpd-2.4.43.tar.gz
[root@localhost ~]# cd httpd-2.4.43/
[root@localhost httpd-2.4.43]# ./configure --prefix=/usr/local/apache2
#此处安装会报错,因为所安装httpd版本较高,所依赖的软件的版本也比较高,下面有解决方案
记录软件即将安装的位置
检查编译所需编译器是否安装(gcc gcc-c++ make cmake)
检查软件的依赖关系
声明开启该软件的哪些功能(–enable-*** 、–with-**)
最终将上述信息汇总生成Makefile文件
报错1:
checking for APR… no
configure: error: APR not found. Please read the documentation
报错2:
checking for APR-util… no
configure: error: APR-util not found. Please read the documentation.
解决方案:
[root@localhost ~]# yum -y install expat-devel
[root@localhost ~]# wget https://mirror.bit.edu.cn/apache//apr/apr-1.7.0.tar.gz
[root@localhost ~]# wget https://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
[root@localhost ~]# tar -xf apr-1.7.0.tar.gz
[root@localhost ~]# tar -xf apr-util-1.6.1.tar.gz
[root@localhost ~]# cp -a apr-1.7.0 httpd-2.4.43/srclib/apr
[root@localhost ~]# cp -a apr-util-1.6.1 httpd-2.4.43/srclib/apr-util

报错3:
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
解决方案:
[root@localhost httpd-2.4.43]# yum -y install pcre-devel

3)编译产生二进制文件
[root@localhost httpd-2.4.43]# make
将源码文件编译转化为二进制文件,必须使用专门的编译器
#此步骤较为消耗时间 make -j 线程数量

4)安装二进制文件
[root@localhost httpd-2.4.43]# make install
将编译转化的二进制文件复制粘贴到指定目录下,权限和归属的修改。

5)判断上一条命令是否执行成功
[root@localhost httpd-2.4.43]# echo $?
0 : 成功
非0 : 失败

6)源码软件包的删除
直接删除安装时{–prefix }指定的目录即可完全删除。

5.3 httpd源码安装与二进制安装的管理区别
注意:此处的实验涉及到httpd软件的启动,由于我们两种方式都进行了安装,但占用的端口都是80端口,所以两个不同的安装方式不能同时启动,否则会有冲突。
5.3.1 源码安装
源码安装属于自定义类型软件,无法使用系统的统一管理工具
[root@localhost ~]# /usr/local/apache2/bin/apachectl start
[root@localhost ~]# /usr/local/apache2/bin/apachectl stop
[root@localhost ~]# /usr/local/apache2/bin/apachectl restart

5.3.2 二进制安装
rpm这类二进制安装方式,属于统一的软件管理机制,可以使用系统统一管理工具
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl stop httpd
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2020-06-09 01:18:19 CST; 17s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 65401 (httpd)
Status: “Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec”
CGroup: /system.slice/httpd.service
├─65401 /usr/sbin/httpd -DFOREGROUND
├─65402 /usr/sbin/httpd -DFOREGROUND
├─65403 /usr/sbin/httpd -DFOREGROUND
├─65404 /usr/sbin/httpd -DFOREGROUND
├─65405 /usr/sbin/httpd -DFOREGROUND
└─65406 /usr/sbin/httpd -DFOREGROUND
六、附带安装程序的软件包安装-webmin
6.1 软件介绍
Webmin 可以让管理员通过浏览器安全的连接到服务器上进行远程管理,并且连接过程使用的是https加密连接传输,由于是浏览器web界面管理所以对管理员非常友好。
官方地址:http://www.webmin.com/
6.2 软件安装
1)软件下载
[root@localhost ~]# wget https://jaist.dl.sourceforge.net/project/webadmin/webmin/1.941/webmin-1.941.tar.gz

2)执行脚本安装
[root@localhost ~]# tar -xf webmin-1.941.tar.gz
[root@localhost ~]# cd webmin-1.941/
[root@localhost webmin-1.941]# ./setup.sh


  •        Welcome to the Webmin setup script, version 1.941        *
    

Webmin is a web-based interface that allows Unix-like operating
systems and common Unix services to be easily administered.

Installing Webmin in /root/webmin-1.941 …


Webmin uses separate directories for configuration files and log files.
Unless you want to run multiple versions of Webmin at the same time
you can just accept the defaults.

Config file directory [/etc/webmin]:
Log file directory [/var/webmin]:


Webmin is written entirely in Perl. Please enter the full path to the
Perl 5 interpreter on your system.

Full path to perl (default /usr/bin/perl):

Testing Perl …
Perl seems to be installed ok


Operating system name: CentOS Linux
Operating system version: 7.6.1810


Webmin uses its own password protected web server to provide access
to the administration programs. The setup script needs to know :

  • What port to run the web server on. There must not be another
    web server already using this port.
  • The login name required to access the web server.
  • The password required to access the web server.
  • If the webserver should use SSL (if your system supports it).
  • Whether to start webmin at boot time.

Web server port (default 10000):
Login name (default admin):
Login password:
Password again:
The Perl SSLeay library is not installed. SSL not available.
Webmin does not support being started at boot time on your system.


Creating web server config files…
…done

Creating access control file…
…done

Inserting path to perl into scripts…
…done

Creating start and stop scripts…
…done

Copying config files…
…done

Creating uninstall script /etc/webmin/uninstall.sh …
…done

Changing ownership and permissions …
…done

Running postinstall scripts …
…done

Enabling background status collection …
…done

Attempting to start Webmin mini web server…
Starting Webmin server in /root/webmin-1.941
…done


Webmin has been installed and started successfully. Use your web
browser to go to

http://localhost.localdomain:10000/

and login with the name and password you entered previously.
3)测试访问

七、扩展
7.1 光盘设备开机自动挂载
/etc/fstab配置文件中记录的是操作系统开机后需要挂载的设备,我们将光盘的挂载写入此配置文件即可
[root@localhost ~]# vim /etc/fstab
UUID=4384c4ac-f899-4047-a6cc-a21f4515323e / xfs defaults 0 0
UUID=43eb4233-4b3a-4293-9cac-c0afbc624792 /boot xfs defaults 0 0
UUID=4f38b070-e94b-4aa1-affd-9a9b8fda13e7 swap swap defaults 0 0
/dev/sr0 /media iso9660 defaults 0 0
第七章:用户管理
Linux运维+云计算
版本:V1.0

Linux是基于用户身份对系统的资源进行管理的操作系统

一、用户和组的类型

用户帐号:UID(User Identity,用户标识号)
超级用户 UID:0 UID:0
系统用户 UID:1-499 UID:1-999
普通用户 UID:500-65535 UID:1000-65535
组帐号:GID(Group Identify,组标识号)
初始组(私有组)
附加组(公共组)
二、用户和组相关文件
2.1 用户信息文件 /etc/passwd
第一列:用户名
第二列:密码占位符
第三列:用户ID (UID)
0 :超级用户的UID,只要UID是0就是超级用户。
1-999:系统用户的范围,此范围的用户不能用于登录系统,只能用于软件服务运行使用,其中1-99是系统保留的账户,系统自动创建。100-999是预留给用户创建系统用户的。
1000-65535: 通用户UID。建立的普通用户UID从1000开始,最大到65535。这些用户足够使用了,但是如果不够也不用害怕,2.6.x内核以后的Linux系统用户UID已经可以支持232这么多了。
第四列:组ID(GID)
添加用户时,如果不指定用户的初始组,则会自动创建和用户名相同的组。
第五列:用户描述信息
第六列:用户家目录
超级管理员root的家目录/root/;普通用户的家目录 /home/***
第七列:登录shell类型
/bin/bash 能登录系统;/sbin/nologin 不能登录系统

2.2 用户密码文件 /etc/shadow
第一列:用户名
第二列:加密密码,我们也可以在密码前的加入“!!”或“”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。
注意:所有系统用户的密码都是“!!”或“
”,代表没有密码是不能登录的。当然我新创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录。
第三列:密码最近更改时间( 1970年1月1日作为标准时间-unix元年)
时间戳转日期:
date -d “1970-01-01 19527 days”
日期转时间戳:
echo ( ( (( (((date --date=”2020/01/01” +%s )/86400+1))
第四列:密码最短有效期(几天内不能修改密码)
第五例:密码最长有效期
第六列:密码到期前的警告天数
第七列:密码过期后的宽限天数
第八列:密码失效时间,这里同样要写时间戳
第九列:保留

2.3 组信息文件 /etc/group
第一列: 组名
第二列: 组密码占位符
第三列: 组ID号 (GID)
第四列: 组内成员列表

2.4 组密码文件 /etc/gshadow

第一列:用户组
第二列:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码
第三列:用户组管理者,这个字段也可为空,如果有多个用户组管理者,用,分割
第四列:组成员,如果有多个成员,用,号分割

2.5 用户家目录
超级管理员: /root/
普通用户: /home/***

2.6 用户邮箱目录 /var/spool/mail/
例:zhangsan的邮件所在位置:/var/spool/mail/zhangsan

2.7 用户模板目录 /etc/skel/
每次创建新的用户都会将模板目录下的内容复制一份到新用户的家目录中

三、用户和组相关命令
3.1 添加用户
useradd [选项] 用户名
选项:
-u UID #用指定UID创建用户
-g 组名 #指定初始组,尽量不要手动指定
-d 目录 #手动指定家目录,目录不需要事先创建(指定缺省值/home)
-s shell类型 #指定用户是否能登录系统
-r #创建系统用户,一般和-s 结合使用
useradd 创建用户时会参考两个配置文件,分别是/etc/default/useradd和/etc/login.defs

3.1.1 /etc/default/useradd
GROUP=100
#新创建用户时默认初始组的GID号(公有组机制)
#现在使用的是私有组机制(根据创建用户名称创建组)
HOME=/home
#新创建用户的家目录的默认位置
INACTIVE=-1
#密码过期后宽限天数(过期停权),用天数表示:0 代表密码到期立刻失效;正数代表密码到期后的宽限天数;-1 表示密码永不失效。
EXPIRE=
#密码失效时间,此处写时间戳,到达时间戳时间后立刻失效,不填写表示用户密码永不过期。
SHELL=/bin/bash
#此选项是创建用户时默认的shell类型,/bin/bash 表示可以登录系统SKEL=/etc/skel
#此选项是创建用户时使用的模板目录,/etc/skel中的文件在用户创建时都会被复制到用户家目录下。
CREATE_MAIL_SPOOL=yes
#此选项是是否给新用户创建邮件缓冲(即新邮箱)

3.1.2 /etc/login.defs
MAIL_DIR /var/spool/mail
#指定新用户的默认邮箱位置。比如xdl用户的邮箱目录位置:/var/spool/mail/root
PASS_MAX_DAYS 99999
#这行指定的是密码的有效期,也就是/etc/shadow文件的第五字段。代表多少天之后必须修改密码,默认值是99999
PASS_MIN_DAYS 0
#这行指定的是两次密码的修改间隔时间,也就是/etc/shadow文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是0
PASS_MIN_LEN 5
#这行代表密码的最小长度,默认不小于5位。但是我们现在用户登录时验证已经被PAM模块取代,所以这个选项并不生效
PASS_WARN_AGE 7
#这行代表密码修改到期前的警告天数,也就是/etc/shadow文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是7天
UID_MIN 1000
#创建普通用户的时候默认的起始UID号
UID_MAX 60000
#创建普通用户,不用 -u 指定时,默认最大的UID号。
注:假如有一个用户创建时通过 –u 指定了 UID 为 1050,那么下一次不指定-u 时,则起始UID 变成从1051开始,1000-1049之间的那些会跳过不使用。
GID_MIN 1000
#创建组的时候默认的起始GID号
GID_MAX 60000
#创建组的时候默认的最大的GID号
CREATE_HOME yes
#创建用户时是否创建用户家目录 默认 yes 创建
UMASK 077
#这行指定的是建立的用户家目录的默认权限,因为umask值是077,所以新建的用户家目录的权限是700
USERGROUPS_ENAB yes
#这行指定的是使用命令userdel删除用户时,是否删除用户的初始组,默认是删除ENCRYPT_METHOD SHA512
#这行指定Linux用户的密码使用SHA512散列模式加密,这是新的密码加密模式,原先的Linux只能用DES或MD5方式加密

3.2 设置和修改密码
passwd 用户名
第一次对用户使用时是为此用户创建密码,第二次使用时是修改密码。

root身份执行passwd
1、可以给任何用户设置或修改密码
2、在进行密码修改时不需要提供原始密码
普通用户执行passwd
1、默认只能给自己修改密码(命令后不需写任何字符串)
2、给自己修改密码时需要提供用户的当前密码
3、需要遵循密码各项原则(长度、复杂)

非交互式密码设置:
echo “123123” | passwd --stdin user1

passwd [选项] 用户名
-l 用户名 #锁定用户的密码,使之无法登录到系统
-u 用户名 #解锁用户密码
-S(大) 用户名 #查看用户帐号的状态(是否被锁定)

3.3 用户信息修改(必须是已存在的用户)
usermod [选项] 用户名
-u UID #修改用户的指定UID
-g 组名 #修改用户的指定初始组(尽量不修改)
-d 目录 #结合 -m 选项直接对源家目录进行改名实现修改家目录
usermod -m -d /home/u4 user4 (用户user4的原家目录是/home/user4)
-s shell类型 #修改用户的登录shell类型

-L(大) 用户名 #锁定用户的密码
-U(大) 用户名 #解锁用户密码
-l 新用户名 旧用户名 #修改用户名

3.4 删除用户
userdel [选项] 用户名
-r 删除用户时,连带家目录一起删除

3.5 添加和删除组
添加:groupadd 组名
删除:groupdel 组名 注意:被删除的组尽量是空组

3.6 向组内添加成员
格式:gpasswd [选项] 用户名 组名
-a 向指定组内添加一个成员
-d 把指定用户从组内删除
-M 定义组内成员列表,用户之间用,分隔 (覆盖式)

四、其他相关命令
4.1 id 用户名
#显示用户的UID、初始组、附加组列表
4.2 su 用户名
#切换用户身份
su - 用户名
#连带环境变量一起切换
4.3 newgrp 组名
#修改用户的有效组,切换到普通用户之后,执行命令
有效组定义:用户创建文件或目录时使用哪个组作为文件的所属组,就是有效组。

注:捋清楚下面的概念
初始组、附加组:是用户和组之间的关系
有效组:用户和文件之间的关系

第八章:权限管理
Linux运维+云计算
版本:V1.0

一、权限知识回顾
1.1 基础权限
r:允许查看文件内容;允许显示目录内的文件列表
w:允许修改文件内容;允许对目录内的文件进行添加、删除、移动
x:允许文件文件执行;允许目录的切换
1.2 文件归属
所有者(属主):拥有该文件的用户
所属组(属组):拥有该文件的组
1.3 文件权限修改
chmod [u g o a] [+ - =] [r w x] 文件
chmod 777 文件
chmod -R 777 目录
1.4 文件归属修改
chown zhangsan 文件
chown :zhangsan 文件
chown zhangsan:zhangsan 文件
chown -R [属主:属组] 目录

传统权限中通过对(所有者、所属组、其他人)三个角色进行(r、w、x)权限的分配实现了最基础的Linux权限管理,但这并不能满足我们的一些特殊的权限需求。
二、ACL权限
2.1 特殊的权限需求

被访问资源:/project
用户、组及所需权限:
所有者: root rwx
所属组: tgroup成员 rwx
其他人: other —
特殊其他人: st r-x
2.2 ACL权限的定义
ACL(Access Control Lists)访问控制列表,能够为单一的用户或者组设置对文件或者目录的独立rwx权限,对于有些特殊需求非常有帮助。

2.3 开启ACL权限
由于ACL 是传统的类Unix操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行。目前绝大部分的文件系统都支持 ACL 的功能,如 EXT3、EXT4、XFS 等。

检查指定分区是否支持ACL权限功能,这个在CentOS 6.x 和 CentOS 7.x中是不一样的。
CentOS 7.x
格式:dmesg | grep ACL
[root@localhost~]# dmesg | grep ACL
[ 1.836718] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 4.891664] SGI XFS with ACLs, security attributes, no debug enabled
CentOS 6.x
格式:dumpe2fs -h 分区名 | grep acl
[root@localhost~]#dumpe2fs -h /dev/sda3 | grep acl
Default mount options: user_xattr acl

拓展{只针对CentOS 6}:
假若ACL权限没有开启,需要手动开启ACL权限,则可以这样操作
[root@localhost~]#mount -o remount,acl / #重新挂载/分区,并加入ACL权限

命令执行后只是临时有ACL权限,重启后则失效。要让ACL权限永久生效必须修改/etc/fstab文件。
[root@localhost~]#vim /etc/fstab
UUID=bf2645fb-55aa-491a-8fde-32a20c9c153e / xfs defaults,acl 0 0
注意:上述手动开启ACL的操作可以在CentOS 6.x中使用,但是不能在CentOS 7.x中使用,否则会造成 根文件系统挂载属性的异常现象。
2.4 ACL权限的使用
2.4.1 ACL权限管理命令
1) 查看ACL权限
getfacl 文件或目录
2) 设置ACL权限
setfacl [选项] 文件或目录
选项:
-m :为指定用户、组添加ACL权限
-x :删除指定用户、组的ACL权限
-b :清空指定文件上的所有ACL权限
-R :对目录设置ACL权限时,一并将ACL权限递归到所有已存在的子文件上
-d :对目录设置默认ACL权限,该权限不对目录生效,仅对在目录下新建的子文件生效
-k :清除指定目录的默认ACL权限

注意:在具有默认ACL权限的目录下创建新目录时,新目录不仅继承ACL权限,还会继承默认权限

2.4.2 为用户添加ACL权限
setfacl -m u:u1:rwx a.txt
#添加u1用户对a.txt文件的rwx权限
2.4.3 删除指定用户的ACL权限
setfacl -x u:u1 a.txt
#删除u1用户在a.txt文件上的ACL权限
2.4.4 清空指定文件上的所有ACL权限
setfacl -b a.txt
#清空在a.txt文件上的所有ACL权限
2.4.5 对目录设置ACL权限时,一并将ACL权限递归到所有已存在的子文件上
setfacl -R -m u:u2:rwx aa
#添加u1用户对aa目录以及目录内子选项的rwx权限
注意:-R 选项的位置要么写在 -m 前面,要么写在文件名前,否则会出现错误
2.4.6 对目录设置默认ACL权限,该权限不对目录生效,仅对在目录下新建的子文件生效
setfacl -m d:u:u3:rwx aa
setfacl -d -m u:u3:rwx aa 注:两条取其一(作用相同)
#添加u3用户,允许u3用户对aa目录下所有新建子文件具有rwx权限
注意:前五个例子使用的u均可换成g,然后实现特殊组对文件的ACL权限

2.4.7 设置最大有效权限mask
setfacl -m m:rx cc
#为cc目录添加默认最大权限为rx,其他ACL权限不得超出此权限
注意:ACL的默认mask值按照最大的ALC权限进行设置,一般情况下我们不会修改该值

三、sudo授权管理

在Linux的管理过程中,不是每一个系统管理员都被允许使用root来管理服务器的。但是总有些普通用户身份的管理员在管理过程中需要执行一些root才有权限的命令,那我们可以使用授权的方式解决。

3.1 sudo是什么
sudo是Linux中用来进行命令授权的管理工具,可以通过授权的方式让某些普通用户执行只有管理员才能执行的命令,比如关机、重启等等,这样可以减少root身份的持有者,减少root的登录次数,以此来保证服务器的安全性。
3.2 sudo工作流程
超级管理员:
通过visudo命令或者vim /etc/sudoers 来对某用户授权
普通用户:
当普通用户执行root授权的命令时,系统查询/etc/sudoers文件中是否有root对用户的授权
当查询普通用户已拥有授权后,需要输入普通用户的密码来确认用户身份
若密码输入成功后,则可以借用root身份来执行已经授权的命令,命令执行完成后,授权结束
3.3 sudo相关命令和配置文件
命令:visudo #打开/etc/sudoers配置文件
/etc/sudoers文件内有固定语法结构,尽量使用visudo命令打开配置文件,结束保存时会有语法检查
[root@lchuan test]# visudo

Allow root to run any commands anywhere

root ALL=(ALL) ALL
每一个元素的含义:
root :被授权用户,或是组,组要在前面加%表示
ALL :来源主机地址,此处涉及到其他服务,暂不做讲解
ALL :被授予身份,默认是任意用户,ALL > root
ALL :被授予命令,多条命令用,隔开(必须写命令绝对路径)

User Aliases

User_Alias ADMINS = jsmith, mikem

Command Aliases

Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables

元素含义:
User_Alias:被授权用户集合别名,类似于用户组
Cmnd_Alias:被授予命令集合别名,省去多个用户授予同样的命令时重复填写
格式:ADMINS ALL=(root) NETWORKING #前提是两个别名已经声明,并生效
3.4 sudo相关示例
3.4.1 给laow用户赋予root的所有命令权限
laow ALL=(root) ALL
3.4.2 授权zhangsan用户可以重启服务器
zhangsan ALL=(root) /sbin/shutdown -r now
3.4.3 授权www用户可以管理web服务器
NO.1:可以使用Apache管理脚本
www ALL=(root) /etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest
# reload 重新加载配置文件使之生效;configtest 检查配置文件是否有语法错误。
NO.2:可以修改Apache的配置文件
www 192.168.110.39=(root) /bin/vi /etc/httpd/conf/httpd.conf
#sudo不仅仅能授权超级管理员的命令,还能授权普通命令以及详细选项和参数。
NO.3:可以更新网页文件
#可以通过给/var/www/html目录设置ACL权限,让www用户对/var/www/html有w权限即可。
3.4.4 授权pdd用户可添加普通用户并能修改密码
pdd ALL=/usr/sbin/useradd,/usr/bin/passwd
#让pdd用户可以添加普通用户
pdd ALL=(root) !/usr/bin/passwd root,!/usr/bin/passwd “”,!/usr/bin/passwd --stdin root
#让pdd用户可以给新添加用户修改密码,不允许修改root用户的密码

注意:sudo授权尽量遵循具体授权原则,普通用户需要什么权限就授予什么权限,要具体到命令,选项,参数等等,否则会出现权限溢出的问题,从而导致服务器安全性降低。
3.5 su与sudo对比
su的优缺点:
优点:平时使用普通用户管理操作系统,降低误操作几率,需要时su切换到root。
缺点:su用户身份的切换,普通管理员要使用root的权限必须知道root的密码,这样会造成很多普通用户需要知道root的密码,导致系统的安全性降低。
sudo的优缺点:
优点:sudo可以为普通用户赋予一定权限,使普通用户能使用一些root才能执行的命令和操作,来完成正常的服务器管理工作。这种按需分配权限的方式可以让我们工作在一个相对安全的环境下,并且普通用户不需要知道root的密码。
缺点:需要提前做好用户管理规划,权限规划等等

四:文件特殊权限

4.1 SetUID权限
当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时将以文件所有者的身份执行
特点:
只有可以执行的二进制程序才能设定SUID权限
命令执行者要对该程序拥有x(执行)权限
命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
示例:
[root@localhost ~]# ll /etc/passwd
-rw-r–r--. 1 root root 1099 11月 19 17:38 /etc/passwd
[root@localhost ~]#
[root@localhost ~]# ll /etc/shadow
----------. 1 root root 703 11月 19 17:38 /etc/shadow
[root@localhost ~]#
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
#普通用户使用/usr/bin/passwd的那一瞬间临时调用了root的身份,进行对/etc/passwd和/etc/shadow进行了修改,当信息修改完成后,立即释放root身份变回了自己普通用户的身份。

注:如果取消了/usr/bin/passwd的SetUID权限,则普通用户无法修改密码
危险的SetUID
/usr/bin/vim 假如给这个命令设置SetUID权限后会怎样?
[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]#
[root@localhost ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 2294208 10月 31 2018 /usr/bin/vim

4.2 SetGID权限(文件和目录)
1) 针对文件的作用:
只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 832486 11月 19 12:38 /var/lib/mlocate/mlocate.db
[root@localhost ~]#
[root@localhost ~]# ll /usr/bin/locate
-rwx–s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate

当普通用户lamp执行locate命令时,会发生如下事情:
/usr/bin/locate是可执行二进制程序,可以赋予SGID
执行用户lamp对/usr/bin/locate命令拥有执行权限
执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
命令结束,lamp用户的组身份返回为lamp组

2) 针对目录的作用:
普通用户必须对此目录拥有r和x权限,才能进入此目录
普通用户在此目录中的有效组会变成此目录的属组
普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
实验:
[root@localhost ~]# mkdir /abc
[root@localhost ~]# chmod g+s /abc
[root@localhost ~]# chmod 777 /abc
[root@localhost ~]# ll -d /abc
drwxrwsrwx 2 root root 6 4月 13 01:46 /abc
#创建测试目录/abc,并设置SGID权限,并允许普通用户在目录内创建文件
[root@localhost ~]# useradd laow
[root@localhost ~]# su - laow
[laow@localhost ~]$ touch /abc/a.txt
[laow@localhost ~]$ ll /abc
总用量 0
-rw-rw-r-- 1 laow root 0 4月 13 01:49 a.txt
#创建普通用户,并且切换到普通用户身份,然后在/abc目录下创建一个文件,观察文件的归属~!
4.3 Sticky BIT 权限
Sticky BIT粘着位,也简称为SBIT。SBIT目前仅针对目录有效,它的作用如下:
粘着位目前只对目录有效
普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
4.4 SetUID、SetGID、SBIT 权限的命令使用方法
[root@localhost ~]# chmod 4644 a.txt #SUID
[root@localhost ~]# chmod 2755 /abc #SGID
[root@localhost ~]# chmod 1755 /def #SBIT

五、文件系统属性
chattr 是专门用来修改文件系统属性的命令,并且只有root才能使用,该权限的优先级高于普通rwx及扩展ACL权限等权限。

5.1 命令功能介绍
格式:chattr [±] [选项] 文件或目录
选项:
i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,不允许建立和删除文件
a:如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立新文件,但是不允许删除和修改文件名
e:Linux中绝大多数的文件都默认拥有e属性。表示该文件是使用ext文件系统进行存储的,而且不能使用“chattr -e”命令取消e属性

查看文件系统属性
格式:lsattr 选项 文件名
选项:
-a 显示所有文件和目录(显示隐藏文件)
-d 若目标是目录,仅列出目录本身属性

5.2 实验1:
针对文件:
[root@localhost test]# touch a.txt
[root@localhost test]# chattr +i a.txt
[root@localhost test]# rm -rf a.txt
rm: 无法删除"a.txt": 不允许的操作
#当文件添加i属性后,即便是root也无法删除文件
[root@localhost test]# echo “123456” >> a.txt
-bash: a.txt: 权限不够
#文件内容也不能修改
针对目录:
[root@localhost ~]# mkdir /csss
[root@localhost ~]# touch /csss/1.txt
[root@localhost ~]#
[root@localhost ~]# chattr +i /csss/
[root@localhost ~]# touch /csss/2.txt
touch: 无法创建"/csss/2.txt": 权限不够
#当目录添加i属性后,不允许在目录里面创建文件
[root@localhost ~]# echo “abcdef” >> /csss/1.txt
[root@localhost ~]# cat /csss/1.txt
abcdef
#但是目录里面的内容可以修改

5.3 实验2:
[root@localhost ~]# mkdir /cxxx
[root@localhost ~]# chattr +a /cxxx
[root@localhost ~]# cp anaconda-ks.cfg /cxxx/
[root@localhost ~]# rm -rf /cxxx/anaconda-ks.cfg
rm: 无法删除"/cxxx/anaconda-ks.cfg": 不允许的操作
#当目录添加a属性后,只能向目录内添加文件,但不能删除

第九章:磁盘管理-硬件篇
Linux运维+云计算
版本:V1.0

冯诺依曼体系中计算机的五大组成部分分别是什么?

一、常见存储类型
1.1 外观区别
本地设备:软盘、光盘、机械硬盘、U盘、闪存卡、固态硬盘等
网络设备:NAS、SAN等
1.2 硬盘接口类型
IDE、SAS、SCSI、SATA、PCI-E、mSATA、m.2等
1.3 磁盘构造类型
机械硬盘(HDD)、固态硬盘(SSD)、混合硬盘(HHD)等
1.4 磁盘尺寸类型
3.5英寸(台式、服务器)、2.5英寸(服务器、笔记本)
1.3/1.0/0.85英寸(迷你硬盘)等
1.5 磁盘制造厂商
IBM、希捷、西部数据、日立、东芝、三星、因特尔、闪迪等
二、磁盘相关参数
2.1 容量大小
GB、TB、PB、EB、ZB、YB、BB、NB、DB …
2.2 传输速率(接口)
SATA3:500+MB/s
SCSI:320+MB/s
SAS:500+MB/s
PCI-E:1200+MB/s
mSATA:500+MB/s
m.2:700+MB/s
2.3 磁盘缓存
读缓存:提高数据读取速度
写缓存:提高数据写入速度
2.4 机械-磁盘转速
台式机:7200rpm
笔记本:5400rpm
服务器:7200rpm、10000rpm、15000rpm or more
2.5 固态-颗粒类型
SLC:品质高、质量好、速度最快、造价昂贵、一般非民用
MLC:品质好、质量仅此SLC、速度快、造价适中、旗舰固态常用
TLC:质量和品质稍差、速度略慢、造价低、入门级固态常用
QLC:量产较难,但容量超大,是未来固态的趋势,暂时非民用
三、磁盘内部构造
3.1 机械磁盘
3.1.1 物理构造

物理构造:磁盘、机械臂、磁头
3.1.2 逻辑构造

结构名称:磁道、扇区、柱面
寻道时间:磁头移动到指定存储数据的磁道所需的时间
扇区大小:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位,扇区的固定大小为512字节(byte)。

3.2 固态硬盘
3.2.1 物理构造

中控芯片、闪存颗粒、接口
3.2.2 逻辑构造

特点:读写快,噪音低、温度低、防震、轻薄、
有写入次数限制、容量较小、价格高

四、主引导记录

主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导代码,占用了磁盘的第一个扇区,结构为:

主引导程序(boot loader)占用了446byte
分区表(Partition table)占用了64byte
有效标志符(magic number)占用了2byte(55AAH代表有效)

主引导扇区的读取流程:
BIOS 加电自检 ( Power On Self Test – POST )。BIOS执行内存地址的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件(包括内存)进行检查。
读取主引导记录(MBR)。当BIOS检查到硬件正常并与 CMOS 中的设置相符后,按照 CMOS 中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存。
检查MBR的结束标志位是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示“NO ROM BASIC”然后待机。
当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到内存中,然后继续执行。
根据MBR中的引导代码启动引导程序。

五、文件系统结构
super block:超级块,记录每个块组的block的大小、数量;块位图(已使用和未使用的inode和block的数量);文件系统挂载时间,最后修改时间,最近检查时间。

data block:数据块,保存真实数据的位置,block的大小和数量在格式化成文件系统时已经固定,除非重新格式化,否则不能修改。单个文件占用小于一个block的大小时,单独占用一个block,剩余空间不会被利用。

inode:别名i节点;记录inode号、权限、属主属组、时间戳、大小、占了哪几个block
inode显示的数据又叫文件的元数据

拓展:
操作系统能够识别磁盘大小,以及所创建的分区大小不仅取决于所使用的分区表类型,还取决于所使用的文件系统类型,所以要多方面考虑;其次,现在很多的参数都是理论值,具体生产环境中能够使用的大小还要看具体情况。

一、分区表类型
MBR分区表:

MBR的起始扇区和结束扇区只能用4个字节表示00 00 00 00-FF FF FF FF,支持的最多的扇区数量是232个,那么所支持的最大磁盘大小为:232 x 512 ≈ 2TB

突破MBR 2TB限制方案:
修改磁盘的扇区大小,由原来的512byte修改为4KB,那么理论上就可以突破到2TB x 8 = 16TB了。

GPT分区表:

GPT的起始扇区和结束扇区能够使用8个字节表示00 00 00 00 00 00 00 00– FF FF FF FF FF FF FF FF,支持的最多的扇区数量是264个,那么GPT所支持的最大磁盘大小为:264 x 512 ≈ 9.44ZB ≈ 8ZiB

为什么会有18EB大小之说:
在windows当中,分区的数量是有约束的,最多允许创建128个分区,导致实际能够使用的磁盘大小无法达到9.44ZB,最大只能识别到18EB而已,并且这种情况也出现在了Linux中,有实验验证在Linux中创建大于128的分区号时会出现异常,所以我们默认为GPT支持的最大大小为18EB。
二、文件系统类型
文件系统类型 最大分区大小 最大文件大小
Ext2和Ext3 16TB 2TB
Ext4 1EB 16TB
XFS 16EB 8EB
NTFS 2TB 2TB

第九章:磁盘管理-磁盘管理基础
Linux运维+云计算
版本:V1.0
一、磁盘管理命令
1.1 df
格式:df [选项]
-a 显示所有文件系统(包含特殊的proc)
-h 常见单位显示大小
-T 显示挂载的文件系统类型
1.2 du
格式: du [选项] 目录
-a 显示每个子文件的磁盘占用量。默认只统计子目录的磁盘占用量
-h 常见单位显示大小
-s 统计总占用和,不再列出子文件的占用量
1.3 fsck
格式: fsck -y 分区名
#fsck 属于自动修复出现问题的文件系统(仅限centos 6.x)
1.4 dumpe2fs
格式: dumpe2fs -h 分区名
显示重点:
卷标、挂载点、UUID、挂载参数、文件系统状态
inode总量/空闲、block总量/空闲、单block 的大小等。
#此命令适用于ext4文件系统类型,不支持xfs
1.5 stat
格式: stat 文件名
#显示文件的详细信息

文件名、文件大小、占用block数量、单block的大小、所在设备编号、inode号、硬链接数、权限、属主、属组、访问时间、数据修改时间、状态修改时间。

1.6 file命令
格式: file 文件名
#判断文件更详细的类型
1.7 type
格式: type 命令名称
#判断命令是外部命令还是shell内置命令
1.8 xfs_info
xfs_info 分区名称
#显示xfs文件系统相关分区的详细信息(专属centos 7.x)
[root@localhost ~]# xfs_info /dev/sdd1
meta-data=/dev/sdd1 isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

1.9 xfs_repair
xfs_repair 选项 分区名称 #分区必须处于卸载状态
-d:专门针对/分区的修复,但必须在单用户模式修复
#检测并修复xfs文件(专属centos 7.x)
[root@localhost ~]# xfs_repair /dev/sdd1
Phase 1 - find and verify superblock…
Phase 2 - using internal log
- zero log…
- scan filesystem freespace and inode maps…
- found root inode chunk
Phase 3 - for each AG…
- scan and clear agi unlinked lists…
- process known inodes and perform inode discovery…
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes…
Phase 4 - check for duplicate blocks…
- setting up duplicate extent list…
- check for inodes claiming duplicate blocks…
- agno = 0
- agno = 1
- agno = 2
- agno = 3
Phase 5 - rebuild AG headers and trees…
- reset superblock…
Phase 6 - check inode connectivity…
- resetting contents of realtime bitmap and summary inodes
- traversing filesystem …
- traversal finished …
- moving disconnected inodes to lost+found …
Phase 7 - verify and correct link counts…
done
1.10 查看磁盘、分区等信息
mount、blkid、lsblk
二、分区命令之-fdisk & mkfs
2.1 XFS文件系统类型
xfs文件系统是一种高性能的日志文件系统,工作原理和ext4基本一致;相较而言,xfs的格式化速度较为快速,非常适合目前磁盘空间很大的情况。
xfs文件系统的三部分:
数据区(Data section):类似于ext4文件系统的块组

文件系统活动登录区(Log section):记录文件变化,最终将变化同步到数据块
实时运行区(Realtime section):默认64k(4k-1G),作用类似于缓存,数据先保存在此处,对应文件的块和inode分配完成后将数据移到指定位置
2.2 fdisk
fdisk -l #查看系统所有硬盘及分区
fdisk 磁盘名称(/dev/sda) #创建或修改磁盘的分区结构
参数:
p:打印分区表
n:新建一个新分区
d:删除一个分区
m:输出菜单
q:退出不保存
w:把分区写进分区表,保存并退出
创建分区
[root@localhost ~]#fdisk /dev/sdb
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
注:若报错Device or resource busy. The kernel still uses the old table.The new table will be used at the next reboot。可以执行partprobe解决或者重启。
查看分区
命令(输入 m 获取帮助):p

磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xa0975b9e

设备 Boot Start End Blocks Id System
/dev/sdc1 2048 20973567 10485760 83 Linux
创建逻辑分区
[root@localhost ~]# fdisk /dev/sdc

命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): e
分区号 (2-4,默认 2):2
起始 扇区 (20973568-41943039,默认为 20973568):
将使用默认值 20973568
Last 扇区, +扇区 or +size{K,M,G} (20973568-41943039,默认为 41943039):+5G
分区 2 已设置为 Extended 类型,大小设为 5 GiB

命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 1 extended, 2 free)
l logical (numbered from 5)
Select (default p): l
添加逻辑分区 5
起始 扇区 (20975616-31459327,默认为 20975616):
将使用默认值 20975616
Last 扇区, +扇区 or +size{K,M,G} (20975616-31459327,默认为 31459327):
将使用默认值 31459327
分区 5 已设置为 Linux 类型,大小设为 5 GiB
2.3 partprobe
格式:partprobe 磁盘名 #将磁盘的最新分区状况发送给内核
警告提示:若提示Device or resource busy. The kernel still uses the old table.The new table will be used at the next reboot。也可不必重启,从而解决设备占用的问题。
命令不存在时请安装:parted--.rpm

2.4 mkfs
格式:mkfs 选项 分区名称
-t 文件系统 #指定文件系统类型ext3、ext4、xfs等
#若不指定-t,默认是ext3
#mkfs命令非常简单易用,不过不能调整分区的默认参数(比如块大小是4096)
[root@localhost ~]# mkfs -t xfs /dev/sdc1
meta-data=/dev/sdc1 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
2.5 mke2fs
格式:mke2fs 选项 分区名称
-t 文件系统:指定格式化成哪种文件系统类型ext3、ext4、#暂不支持xfs
-b 字节:指定格式化时,每个block 的大小
-i 字节:指定多少字节分配一个inode号
#使用-i 指定分区的inode数量时,必须同时指定block的大小
mke2fs -t ext4 -b4096 -i4096 /dev/sdb1
2.6 mkfs.xfs
[root@localhost ~]# mkfs.xfs /dev/sdc5
meta-data=/dev/sdc5 isize=512 agcount=4, agsize=327616 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1310464, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
2)建立挂载点
mkdir –p /disk/movie
3)挂载
mount /dev/sdb1 /disk/movie
4)查看
mount #查看已挂载的所有设备
df -h #查看分区占用百分比
5)自动挂载–/etc/fstab
设备文件名(UUID)
挂载点
文件系统类型
挂载特殊选项
是否备份: 0 不备份 1 每天备份 #备份
是否检查磁盘状态: 0 不检查 1 启动时检查 2 启动后检查
6)UUID
硬盘的唯一标识符,设备名称可能会重复,但是UUID不会重复。
查看UUID的方式:
dumpe2fs -h 分区名称
ls -l /dev/disk/by-uuid/

2.7 修复启动错误-/etc/fstab
假如,/etc/fstab启动文件有错误,例如磁盘的UUID写错了,那么启动就会出错

根据提示输入所需的root密码,可以见到熟悉的命令提示符,那么修改下/etc/fstab
but,当你修改完之后,发现保存不了,文件系统read-only?
解决方案:
对/目录进行重新挂载,并且执行挂载属性rw
mount	-o	remount,rw	/
然后再去修改则可以保存成功。

三、分区表之-GPT(GUID)

Linux中常见的分区表类型有两种: MBR 、GPT(GUID)
两种分区表的区别:
MBR:磁盘最大识别到2TB;最多四个主分区,或三主一扩展
GPT:可支持2TB以上的磁盘;分区数无限制、windows最大支持128分区,最大识别9.44ZB磁盘

早期的磁盘寻址方式为CHS,即磁头/柱面/扇区式寻址(从n柱面的1扇区开始数+++)

现在则使用LBA(逻辑区块地址)进行寻址,MBR、GPT均使用此种结构进行编址、寻址
LBA从LBA0开始一直往后计算,接下来的GPT分区表我们就用LBA表示

3.1 GPT分区表
GPT(GUID Partition Table)其含义为“全局唯一标识磁盘分区表”,主要用来代替MBR分区表,突破存储限制产生。

GPT分区表的构成:
LBA 0 :GPT分区的最开头(第一个扇区),考虑兼容性问题,开头仍然存放MBR分区表,只是里面存放有0xEE标识,以此声明该磁盘使用的是GPT分区表。
LBA 1 :存储了硬盘的总存储空间,以及GPT分区表的信息,定义最多能创建128个分区(windows),每个分信息占用的空间是128字节;128个分区中有一个是用来存储备份分区表的,所以可以手动指定的分区数为127个分区。
LBA 2-33:每个分区信息存放的位置,上边说了每个分信息占用的空间是128字节。2-33正好是32个扇区。32*512=16384,每个分区信息占用了128字节,16384/128=128个分区。
LBA 34:后面是第一个分区的开始

3.2 分区命令-parted
3.2.1 parted 磁盘名称
交互指令
cp 将文件系统复制到另一个分区
help 打印通用求助信息
mklabel 创建新的磁盘标签 (分区表)
mkfs 创建文件系统
mkpart 创建一个分区
mkpartfs 创建一个带有文件系统的分区
move 移动分区
name 将分区命名为“xx”
print 打印分区表,或者分区
quit 退出程序
resize 改变分区中文件系统的大小
rm 删除分区
select 选择要编辑的设备
set 改变分区的标志
3.2.3 修改分区表为GPT
[root@localhost ~]# parted /dev/sdd
GNU Parted 3.1
使用 /dev/sdd
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) mklabel gpt
(parted)
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
3.2.4 创建新分区
(parted) mkpart
分区名称? []? disk1
文件系统类型? [ext2]?
起始点? 1MB
结束点? 5GB
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 1049kB 5000MB 4999MB disk1
#分区时注意,默认的文件系统类型是ext2,默认就可以,完事出来自己mkfs再重新格式化。还有就是大家会发现我们的Type字段没有了,原来在MBR中时,Type是用来标示分区类型的(主分区、扩展分区、逻辑分区),但是现在我们是GPT分区表,所有不再有那些分区类型的概念。

3.2.5 分区格式化
parted 分区工具自带的的确有格式化命令,但只能格式化成ext2
so,格式化只能请mkfs命令帮助了(系统中的mkfs,非parted中的交互命令)
3.2.6 调整分区大小
resize
由于不支持ext4,xfs,所以没啥用~
3.2.7 删除指定分区
(parted) rm
分区编号? 1
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
注意:parted 中所做的操作,全都是立即生效,不需要w保存

3.3 分区命令-gdisk
gdisk命令和fdisk命令很相似,主要针对GPT分区表的分区工具
交互命令列表
b 将GPT数据备份到一个文件
c 更改分区名称
d 删除一个分区
i 显示分区详细信息
l 列出已知分区类型。此处8200是Linux swap,8300是Linux filesystem(对应fdisk的82和83)。还有一个8e00是Linux LVM
n 增加一个新的分区
o 创建一个新的空白的GPT分区表
p 显示当前磁盘的分区表
q 退出gdisk程序,不保存任何修改
r 恢复和转换选项(仅限专家)
s 排序分区
t 改变分区的类型
v 验证磁盘分区表
w 将分区表写入分区表并退出(保存并退出)
x 额外功能(仅限专家)
? 显示帮助信息
3.3.1 创建新分区
1)先添加一块新的磁盘2
2)利用parted命令修改磁盘分区表类型为gpt
3)创建新的分区
[root@localhost ~]# gdisk /dev/sdd

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-41943006, default = 2048) or {±}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {±}size{KMGTP}: +5G
Current type is ‘Linux filesystem’
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to ‘Linux filesystem’

Command (? for help): p
Disk /dev/sdd: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): DD30935A-022C-4E4F-9354-EEB21B76B69B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 31457213 sectors (15.0 GiB)

Number Start (sector) End (sector) Size Code Name
1 2048 10487807 5.0 GiB 8300 Linux filesystem

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdd.
The operation has completed successfully.
注意:分区完成后执行partprobe,将分区信息更新到内核中~
3.3.2 格式化分区,挂载
[root@localhost ~]# mkfs.xfs /dev/sdd1
meta-data=/dev/sdd1 isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mkdir /disk/sdd1 -p
[root@localhost ~]#
[root@localhost ~]# mount /dev/sdd1 /disk/sdd1/
3.3.4 实现开机后自动挂载
省略…
3.4 gdisk创建swap分区
3.4.1 创建swap分区
1)查出swap类型的分区编号
[root@localhost ~]# gdisk /dev/sdd

Found valid GPT with protective MBR; using GPT.

Command (? for help): l
0700 Microsoft basic data 0c01 Microsoft reserved 2700 Windows RE
3000 ONIE boot 3001 ONIE config 4100 PowerPC PReP boot
4200 Windows LDM data 4201 Windows LDM metadata 7501 IBM GPFS
7f00 ChromeOS kernel 7f01 ChromeOS root 7f02 ChromeOS reserved
8200 Linux swap 8300 Linux filesystem 8301 Linux reserved
省略好多…
2)创建swap分区
[root@localhost ~]# gdisk /dev/sdd
GPT fdisk (gdisk) version 0.8.10

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (34-41943006, default = 10487808) or {±}size{KMGTP}:
Last sector (10487808-41943006, default = 41943006) or {±}size{KMGTP}: +5G
Current type is ‘Linux filesystem’
Hex code or GUID (L to show codes, Enter = 8300): 8200
Changed type of partition to ‘Linux swap’

Command (? for help): p
Disk /dev/sdd: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): DD30935A-022C-4E4F-9354-EEB21B76B69B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 20971453 sectors (10.0 GiB)

Number Start (sector) End (sector) Size Code Name
1 2048 10487807 5.0 GiB 8300 Linux filesystem
2 10487808 20973567 5.0 GiB 8200 Linux swap

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdd.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
#记得partprobe
3.4.2 格式化swap
[root@localhost ~]# partprobe /dev/sdd
[root@localhost ~]#
[root@localhost ~]# mkswap /dev/sdd2
正在设置交换空间版本 1,大小 = 5242876 KiB
无标签,UUID=41745d4a-ac53-4054-be0c-0b3f32601068
3.4.3 查看当前swap分区的使用情况!
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 126M 3.2G 11M 343M 3.3G
Swap: 2.0G 0B 2.0G
3.4.4 启用swap分区
命令:swapon 分区名称
[root@localhost ~]# swapon /dev/sdd2
[root@localhost ~]#
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 130M 3.2G 11M 343M 3.3G
Swap: 7.0G 0B 7.0G
3.4.5 设置自动挂载
添加到/etc/fstab,让swap分区自动挂载
UUID=41745d4a-ac53-4054-be0c-0b3f32601068 swap swap defaults 0 0

第九章:磁盘管理-磁盘管理高级
Linux运维+云计算
版本:V1.0

一、磁盘配额

由于Linux是一个多用户管理的操作系统,而Linux默认情况下并不限制每个用户使用磁盘空间的大小,假如某个用户疏忽或者恶意占满磁盘空间,将导致系统磁盘无法写入甚至崩溃;为了保证系统磁盘的有足够的剩余空间,我们需要对用户和组进行磁盘空间使用限制。

1.1 磁盘配额限制类型:
1. 限制用户和组对磁盘空间的使用量(data block)
2. 限制用户和组在磁盘内创建文件的个数(inode)

1.2 磁盘配额限制级别:
1.软限制:低级限制,此限制可以突破,突破时会被警告
2.硬限制:绝对限制,此限制不会被突破,达到指定限制后无法使用更多空间
3.宽限天数:允许用户在每个文件系统指定的宽限期内超过他们的软限制。一旦宽限期过期,软限制将作为硬限制强制执行。
注:磁盘配额是针对分区进行设置的,无法实现“某用户在系统中共计只能使用50MB磁盘空间”只能设置某用户在/home分区能使用30M这样的限制。切记:磁盘配额是针对分区的!

1.3 磁盘配额开启条件
内核是否支持磁盘配额?
#grep “CONFIG_QUOTA” /boot/config-3.10.0-957.el7.x86_64

磁盘配额相关命令是否安装?
#rpm  -q  quota

1.4 磁盘配额实验规划

准备空间足够大小的分区,要远大于实验的需求空间
添加磁盘、修改分区表类型、分区、格式化、挂载
创建实验用户和组
用户:laow、laos、laom、
组:old
磁盘配额规划
old: 硬:500M 软:450M 文件数不限制
laow: 硬:50M 软:40M 硬:10个 软:8个
laos: 硬:250M 软:200M 文件数不限制
laom: 硬:250M 软:200M 文件数不限制

1.5 磁盘配额实验流程
1.5.1 查看系统是否支持磁盘配额
#grep “CONFIG_QUOTA” /boot/config-3.10.0-957.el7.x86_64

1.5.2 查看分区的挂载属性是否满足(是否开启了磁盘配额功能)
mount | grep “分区(挂载点)”
查看结果中是否包含usrquota、grpquota两个挂载属性?
如果没有两个挂载属性,则需要重新挂载并添加两个属性,并写入自动挂载
mount -o remount,usrquota,grpquota 分区名(挂载点)
[root@localhost ~]# gdisk /dev/sdb
[root@localhost ~]# mkfs.xfs /dev/sdb1
[root@localhost ~]# mkdir /movie
[root@localhost ~]#
[root@localhost ~]# echo “/dev/sdb1 /movie xfs defaults,usrquota,grpquota 0 0” >> /etc/fstab
[root@localhost ~]# mount -a
[root@localhost ~]#
[root@localhost ~]# mount | grep movie
/dev/sdb1 on /movie type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)

1.5.3 创建用户、用户组
注意:分区大小要远大于实验要求大小,避免影响实验结果
用户:laow、laos、laom
组:old
注意1:创建用户时,所有人都指定old为初始组
注意2:SELinux 必须关闭才能进行下面的实验!
[root@localhost ~]# groupadd old
[root@localhost ~]# useradd -g old laow
[root@localhost ~]# useradd -g old laos
[root@localhost ~]# useradd -g old laom
[root@localhost movie]# echo “123123” | passwd --stdin laow
更改用户 laow 的密码 。
passwd:所有的身份验证令牌已经成功更新。

1.5.4 生成保存用户和组信息的配置文件(此步骤仅限CentOS 6使用,7无需操作)
命令:quotacheck 选项
-a 扫描/etc/mtab文件中所有启用磁盘配额功能的分区。如果加入此参数,命令后面就不需要加入分区名了
-u 建立用户配额的配置文件,即生成aquota.user
-g 建立组配额的配置文件,即aquota.group
-v 显示扫描过程
-c 清除原有的配置文件,重新建立新的配置文件
[root@localhost ~]# quotacheck -avug
注:若报错没有权限生成文件,则需要关闭SELinux

1.5.5设置用户或组的限制标准,编辑配置文件(注意6和7的区别)
CentOS 6:
setquota -u 用户名 软(容) 硬(容) 软(数) 硬(数) 分区名
注意:此种操作自动将对应设置写入了配置文件,属于永久生效。
CentOS 7:
xfs_quota -x -c 'limit bsoft=40m bhard=50m isoft=8 ihard=10 laow ’ /movie
-x:专家模式
-c:用来指定后续规则作为quota命令的参数(若不指定默认以交互式进行)
limit:设置限制的命令
容量:bsoft(软) bhard(硬)
文件数:isoft(软) ihard(硬)
[root@localhost ~]# xfs_quota -x -c ‘limit bsoft=40m bhard=50m isoft=8 ihard=10 laow’ /movie
[root@localhost ~]# xfs_quota -x -c ‘report’ /movie
User quota on /movie (/dev/sdb1)
Blocks
User ID Used Soft Hard Warn/Grace


root 0 0 0 00 [--------]
laow 0 40960 51200 00 [--------]

Group quota on /movie (/dev/sdb1)
Blocks
Group ID Used Soft Hard Warn/Grace


root 0 0 0 00 [--------]
名词解释:Warn:警告天数 Grace:宽限天数

编辑配置文件修改限制(6和7通用)
命令:edquota 选项 用户或组
-u:修改用户的限额配置
-g:修改组的限额配置
[root@localhost ~]# edquota -u laow
Disk quotas for user laow (uid 1000):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 0 40960 51200 0 8 10

1.5.6 启动和关闭磁盘配额{CentOS-7可以不执行启动,默认启动}
启动:quotaon 选项 分区名称
-u 启动用户的磁盘配额
-g 启动组的磁盘配额
-v 显示启动过程信息
[root@localhost ~]# quotaon -ugv /dev/sdb1
quotaon: Enforcing group quota already on /dev/sdb1
quotaon: Enforcing user quota already on /dev/sdb1
关闭:quotaoff 选项 分区名称
-u 关闭用户的磁盘配额
-g 关闭组的磁盘配额
-v 显示启动过程信息
[root@localhost ~]# quotaoff -ugv /dev/sdb1
Disabling group quota enforcement on /dev/sdb1
/dev/sdb1: group quotas turned off
Disabling user quota enforcement on /dev/sdb1
/dev/sdb1: user quotas turned off

1.5.7 查看磁盘配额的信息
查询用户或组的配额:quota 选项 用户或组名
-u 用户名
-g 组名
-v 显示详细信息
-s 以常见单位显示大小
[root@localhost ~]# quota -uvs laow
Disk quotas for user laow (uid 1000):
Filesystem space quota limit grace files quota limit grace
/dev/sdb1 0K 40960K 51200K 0 8 10
常见组合:-uvs -gvs

查询指定分区的磁盘配额:repquota 选项 分区名
-u 查询用户配额
-g 查询组配额
-v 显示详情
-s 以常见单位显示
[root@localhost ~]# repquota -uvs /dev/sdb1
*** Report for user quotas on device /dev/sdb1
Block grace time: 7days; Inode grace time: 7days
Space limits File limits
User used soft hard grace used soft hard grace

root – 0K 0K 0K 3 0 0
laow – 0K 40960K 51200K 0 8 10

*** Status for user quotas on device /dev/sdb1
Accounting: ON; Enforcement: ON
Inode: #67 (2 blocks, 2 extents)
组合方式:-uvs -gvs -ugvs

1.5.8 验证磁盘配额是否生效
切换普通用户,进行文件创建,测试是否被限制
测试工具:
dd 生成指定大小的文件(dd命令详解见附件)
dd if=/dev/zero of=/分区名/testfile bs=1M count=60
注意:用户的测试需要切换到指定用户身份,而组磁盘配额的验证需要?
1.6 扩展:dd命令
用于通过指定大小的块进行数据拷贝和类型转换的命令
格式:dd if=数据来源 of=数据目标 bs=块大小 count=块数量
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs=bytes:同时设置读入/输出的块大小为bytes个字节(可自定义单位)。
count=blocks:拷贝块的数量,块大小等于bs指定的大小。
案例:
1.将本地的/dev/sdb整盘备份到/dev/sde
dd if=/dev/sdb of=/dev/sde

2.将/dev/sdb全盘数据备份到指定路径的image文件中(附恢复)
dd if=/dev/sdb of=/root/image
dd if=/root/image of=/dev/sdb

3.备份/dev/sdb全盘数据,并利用gzip工具进行压缩,保存到指定路径(附恢复)
dd if=/dev/sdb | gzip > /root/image.gz
gzip -dc /root/image.gz | dd of=/dev/sdb

4.备份与恢复MBR
a.备份磁盘开始的512个字节大小的MBR信息到指定文件:
dd if=/dev/sda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
b.恢复:
dd if=/root/image of=/dev/sdb
将备份的MBR信息写到磁盘开始部分

5.拷贝光盘内容到指定文件夹,并保存为cd.iso文件(生成镜像文件)
dd if=/dev/cdrom(sr0) of=/root/cd.iso

6.增加swap分区文件大小
第一步:创建一个大小为256M的文件
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件
mkswap /swapfile
第三步:启用这个swap文件
swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件
/swapfile swap swap default 0 0

7.销毁磁盘数据
dd if=/dev/urandom of=/dev/sdb
注意:利用随机的数据填充硬盘,在某些必要的情况下可以用来销毁数据。

8.测试硬盘的读写速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/root/1Gb.file of=/dev/null bs=64k
通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
/dev/zero:是一个特殊设备(伪设备),你可你用它来初始化文件。该设备无穷尽地提供0,可以用于向设备或文件写入字符串0。
/dev/null:也是一个特殊设备(伪设备),称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会被装满!

9.确定硬盘的最佳块大小:
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。

二、LVM逻辑卷管理
LVM(Logical Volume Manager)逻辑卷管理,它是Linux环境下对磁盘和分区进行管理的一种机制。
普通的磁盘分区管理方式在分区划分好之后一般无法改变其大小(有风险),当一个分区存放不下文件时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。
简单来说LVM就是将物理磁盘融合成一个或几个大的虚拟磁盘存储池,按照我们的需求去存储池划分空间来使用,由于是虚拟的存储池,所以划分空间时可以自由的调整大小,如下图:

2.1 LVM的组成部分

物理卷(PV,Physical Volume):由磁盘或分区转化而成
卷组(VG,Volume Group):将多个物理卷组合在一起组成了卷组,组成同一个卷组的可以是同一个硬盘的不同分区,也可以是不同硬盘上的不同分区,也可以是整块磁盘,我们通常把卷组理解为一块硬盘。
逻辑卷(LV,Logical Volume):把卷组理解为硬盘的话,那么我们的逻辑卷则是硬盘上的分区,逻辑卷可以进行格式化,存储数据。
物理扩展(PE,Physical Extend):PE卷组的最小存储单元,PE所在的位置是VG卷组,即硬盘上,那么我们可以把PE理解为硬盘上的扇区,默认是4MB,可自由配置。

2.2 创建LVM
1)将磁盘分区,或整块磁盘不分区(不做任何操作)
2)将磁盘上的分区或整块盘建立成物理卷(PV)
3)将新增的物理卷组合成卷组(VG),并且可以通过添加或者删除一块物理卷,来实现卷组大小的调整。
4)最后将卷组划分成逻辑卷(LV),逻辑卷也是可以随意调整大小的,逻辑卷相当于真正的分区,那么要使用必须进行格式化和挂载。

2.2.1 物理卷管理
1)使用gdisk 来进行分区,分区的系统ID需要改为8e00
[root@localhost ~]# gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {±}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {±}size{KMGTP}: +10G
Current type is ‘Linux filesystem’
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to ‘Linux LVM’
Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

2)创建物理卷—pvcreate
分区:
[root@localhost ~]# pvcreate /dev/sdb1 #将分区转化为物理卷(pvscan)
Physical volume “/dev/sdb1” successfully created.
[root@localhost ~]#
[root@localhost ~]# pvs #查看所有物理卷列表
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 — 10.00g 10.00g
整块磁盘:
[root@localhost ~]# pvcreate /dev/sdc #可批量转化,空格分开即可
Physical volume “/dev/sdc” successfully created.
[root@localhost ~]#
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 — 10.00g 10.00g
/dev/sdc lvm2 — 20.00g 20.00g

3)查看物理卷—pvscan & pvdisplay
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 — 10.00g 10.00g
/dev/sdc lvm2 — 20.00g 20.00g
[root@localhost ~]# pvdisplay #查看每一个物理卷的详细信息
— Physical volume —
PV Name /dev/sdb1
VG Name vg1
PV Size 10.00 GiB / not usable 2.00 MiB
Allocatable yes
PE Size 2.00 MiB
Total PE 5119
Free PE 5119
Allocated PE 0
PV UUID OKvZNO-ISzs-ZasL-2g6l-TG3T-nTHc-8r61qa

— Physical volume —
PV Name /dev/sdc
VG Name vg1
PV Size 20.00 GiB / not usable 2.00 MiB
Allocatable yes
PE Size 2.00 MiB
Total PE 10239
Free PE 10239
Allocated PE 0
PV UUID cTrTzc-170v-vsSa-Sgsi-xmiS-yGp1-Ed1yZl

4)删除物理卷—pvremove
[root@localhost ~]# pvcreate /dev/sde
Physical volume “/dev/sde” successfully created.
[root@localhost ~]#
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 a-- <10.00g <10.00g
/dev/sdc lvm2 a-- <20.00g <20.00g
/dev/sde lvm2 — 20.00g 20.00g
[root@localhost ~]#
[root@localhost ~]# pvremove /dev/sde
Labels on physical volume “/dev/sde” successfully wiped.
[root@localhost ~]#
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 a-- <10.00g <10.00g
/dev/sdc lvm2 a-- <20.00g <20.00g

2.2.2 卷组管理
1)创建卷组—vgcreate
格式:vgcreate 选项 卷组名 物理卷(写多个时用空格分开)
-s 大小:指定VG的PE大小
创建卷组:
[root@localhost ~]# vgcreate -s 2M vg1 /dev/sdb1 /dev/sdc #-s 指定vg的PE大小
Volume group “vg1” successfully created
[root@localhost ~]#
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz–n- <19.00g 0
vg1 2 0 0 wz–n- <30.00g <30.00g

2)查看卷组—vgscan & vgdisplay
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz–n- <19.00g 0
vg1 2 0 0 wz–n- <30.00g <30.00g
[root@localhost ~]#
[root@localhost ~]# vgdisplay
— Volume group —
VG Name vg1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size <30.00 GiB
PE Size 2.00 MiB
Total PE 15358
Alloc PE / Size 0 / 0
Free PE / Size 15358 / <30.00 GiB
VG UUID T7ujM1-1knt-TflA-fYbP-dHwB-Vc7q-9QkQRl

3)减小卷组容量–vgreduce
格式:vgreduce 卷组名 物理卷名
[root@localhost ~]# vgreduce vg1 /dev/sdc #从指定卷组中删除指定物理卷
Removed “/dev/sdc” from volume group “vg1”
[root@localhost ~]#
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz–n- <19.00g 0
vg1 1 0 0 wz–n- <10.00g <10.00g

拓展:vgreduce -a 卷组 #删除指定卷组内所有空的物理卷

4)增加卷组容量–vgextend
格式:vgrextend 卷组名 物理卷名
[root@localhost ~]# vgextend vg1 /dev/sdc #向指定卷组内添加指定物理卷
Volume group “vg1” successfully extended
[root@localhost ~]#
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz–n- <19.00g 0
vg1 2 0 0 wz–n- <30.00g <30.00g

5)删除卷组—vgremove(若已存数据则谨慎操作)
[root@localhost ~]# vgremove vg1
Volume group “vg1” successfully removed
[root@localhost ~]#
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz–n- <19.00g 0
[root@localhost ~]#
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 — 10.00g 10.00g
/dev/sdc lvm2 — 20.00g 20.00g

2.2.3 逻辑卷管理
1)创建逻辑卷–lvcreate
格式:lvcreate 选项 -n 逻辑卷名 卷组名
-L 容量:指定创建的逻辑卷大小,单位:MB,GB,TB等
-l(小) PE个数:按照PE个数来指定逻辑卷大小
-n 逻辑卷名:指定逻辑卷的名字
[root@localhost ~]# vgcreate -s 2M vg1 /dev/sdb1 /dev/sdc
Volume group “vg1” successfully created
[root@localhost ~]#
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz–n- <19.00g 0
vg1 2 0 0 wz–n- <30.00g <30.00g
[root@localhost ~]#
[root@localhost ~]# lvcreate -L 15G -n lv1 vg1
Logical volume “lv1” created.
[root@localhost ~]#
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
lv1 vg1 -wi-a----- 15.00g
注:因为逻辑卷相当于是分区,所以需要进行格式化和挂载才能使用,并设置自启动

2)查看逻辑卷—lvscan & lvdisplay
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
lv1 vg1 -wi-a----- 15.00g
[root@localhost ~]#
[root@localhost ~]# lvdisplay
— Logical volume —
LV Path /dev/vg1/lv1
LV Name lv1
VG Name vg1
LV UUID ghqdWg-0mCg-7Tei-T6Xk-XzfD-LTHo-2dG48z
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2020-04-22 23:41:14 +0800
LV Status available

open 0

LV Size 15.00 GiB
Current LE 7680
Segments 1
Allocation inherit
Read ahead sectors auto

  • currently set to 8192
    Block device 253:2
    [root@localhost ~]# mkfs.xfs /dev/vg1/lv1
    meta-data=/dev/vg1/lv1 isize=512 agcount=4, agsize=983040 blks
    = sectsz=512 attr=2, projid32bit=1
    = crc=1 finobt=0, sparse=0
    data = bsize=4096 blocks=3932160, imaxpct=25
    = sunit=0 swidth=0 blks
    naming =version 2 bsize=4096 ascii-ci=0 ftype=1
    log =internal log bsize=4096 blocks=2560, version=2
    = sectsz=512 sunit=0 blks, lazy-count=1
    realtime =none extsz=4096 blocks=0, rtextents=0
    [root@localhost ~]#
    [root@localhost ~]# mkdir /movie
    [root@localhost ~]#
    [root@localhost ~]# mount /dev/vg1/lv1 /movie/
    [root@localhost ~]#
    [root@localhost ~]# df -h | grep movie
    /dev/mapper/vg1-lv1 15G 33M 15G 1% /movie

3)增加逻辑卷容量–lvextend
lvextend -L +10G /dev/vg1/lv1 #先增加lv的大小
C7版:xfs_growfs /dev/vg1/lv1 #再修改文件系统的大小
C6版:resize2fs -f /dev/vg1/lv1 #再修改文件系统的大小
[root@localhost ~]# lvextend -L +10G /dev/vg1/lv1
Size of logical volume vg1/lv1 changed from 15.00 GiB (7680 extents) to 25.00 GiB (12800 extents).
Logical volume vg1/lv1 successfully resized.
[root@localhost ~]# mount /dev/vg1/lv1 /movie/
[root@localhost ~]#
[root@localhost ~]# df -h | grep movie
/dev/mapper/vg1-lv1 15G 33M 15G 1% /movie
[root@localhost ~]#
[root@localhost ~]# xfs_growfs /dev/vg1/lv1 #更新xfs文件系统实际大小
meta-data=/dev/mapper/vg1-lv1 isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=3932160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 3932160 to 6553600
[root@localhost ~]#
[root@localhost ~]# df -h | grep movie
/dev/mapper/vg1-lv1 25G 33M 25G 1% /movie

4)减小逻辑卷容量—lvreduce
注意:xfs文件系统默认只支持扩容,不支持缩小,so,无法真正做到无损…
[root@localhost ~]# df -h | grep movie
/dev/mapper/vg1-lv1 25G 33M 25G 1% /movie
[root@localhost ~]#
[root@localhost ~]# 先对数据进行备份,然后将分区卸载
[root@localhost ~]#
[root@localhost ~]# umount /dev/vg1/lv1
[root@localhost ~]#
[root@localhost ~]# lvreduce -L 15G /dev/vg1/lv1 #将指定分区减小到指定大小
WARNING: Reducing active logical volume to 15.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg1/lv1? [y/n]: y
Size of logical volume vg1/lv1 changed from 25.00 GiB (12800 extents) to 15.00 GiB (7680 extents).
Logical volume vg1/lv1 successfully resized.
[root@localhost ~]#
[root@localhost ~]# mkfs.xfs -f /dev/vg1/lv1
meta-data=/dev/vg1/lv1 isize=512 agcount=4, agsize=983040 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=3932160, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@localhost ~]# mount /dev/vg1/lv1 /movie/
[root@localhost ~]#
[root@localhost ~]# df -h | grep movie
/dev/mapper/vg1-lv1 15G 33M 15G 1% /movie
[root@localhost ~]# 再将数据恢复到分区中

拓展:C6中的操作 - {先卸载}
e2fsck -f /dev/vg1/lv1 #检查文件系统
resize2fs /dev/vg1/lv1 newsize #减少后文件系统大小
lvreduce -L newsize /dev/vg1/lv1 #减少后lv大小
2.3 减小/home空间大小,扩容/分区大小
根据上面所学内容得出结论,我们无法真正做到无损进行xfs文件系统的缩小。
但是,xfs提供数据备份和数据恢复功能,我们可以借助这种机制来实现上述需求。
模拟情况出现:在安装操作系统是预留root、home、data等分区的磁盘空间
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 45G 5G 90% /
/dev/mapper/centos-home 100G 25G 75G 25% /home

2.3.1 利用xfsdump工具的备份功能将数据备份
[root@localhost ~]# yum -y install xfsdump
[root@localhost /]# xfsdump -f /data/home.xfsdump /home
注意:此处需要交互写入两个标签名称,统一用home即可
xfsdump: stream 0 /data/home.xfsdump OK (success)
xfsdump: Dump Status: SUCCESS
注意:此处在操作目录时,目录的结尾一定不能带/,切记~
2.3.2 减小/dev/mapper/centos-home的大小到50G,并恢复数据
[root@localhost /]# yum -y install psmisc #安装fuser命令
[root@localhost /]# fuser -km /home
#使用该命令停止/home对应文件系统的所有进程,然后才能卸载关联
[root@localhost /]# umount /home
[root@localhost /]# lvreduce -L 50G /dev/mapper/centos-home
Do you really want to reduce home? [y/n]: y

[root@localhost /]# mkfs.xfs -f /dev/mapper/centos-home
[root@localhost /]# mount /dev/mapper/centos-home /home
[root@localhost /]# df -h | grep home
/dev/mapper/centos-home 50G 25G 25G 50% /home
[root@localhost /]# xfsrestore -f /data/home.xfsdump /home

2.3.3 将/dev/mapper/centos-home省出来的空间扩容到/dev/mapper/centos-root分区上
[root@localhost /]# lvextend -l +100%FREE /dev/mapper/centos-root
[root@localhost /]# xfs_growfs /dev/mapper/centos-root
[root@localhost /]# df -h | grep root
/dev/mapper/centos-root 100G 45G 55G 45% /

三、RAID磁盘阵列

由独立磁盘构成的具有冗余、校验、加速效果的磁盘组合结构称为磁盘阵列

1.通过把多个磁盘组织在一起作为一个虚拟磁盘提供磁盘跨越功能
2.通过把数据分成多个数据块并行【写入/读取】多个磁盘以提高访问磁盘的速度
3.通过镜像或校验操作提供容错能力

RAID磁盘阵列主要为了保证硬件损坏的情况下业务不会终止,但无法防止误操作

磁盘阵列分类:一是外接式磁盘阵列柜、二是内接式磁盘阵列卡,三是利用软件来仿真

3.1 RAID磁盘阵列简介
3.1.1 RAID 0:没有奇偶校验的条带卷
RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求

3.1.2 RAID 1:独立磁盘冗余阵列(镜像卷)
RAID 1通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。

3.1.3 RAID 10:镜象阵列条带卷
Raid 10是一个Raid 1与Raid0的组合体,它是利用奇偶校验实现条带集镜像,所以它继承了Raid0的快速和Raid1的安全。

3.1.4 RAID5:分布式奇偶校验的独立磁盘结构
RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。 RAID 5可以理解为是RAID 0和RAID 1的折中方案。

3.1.5 各RAID阵列相关参数对比

3.2 RAID 5 阵列搭建流程
3.2.1 准备物理磁盘
3.2.2 创建raid5阵列
mdadm -Cv 阵列名称(md*) -l5 -n3 磁盘 -x1 磁盘
-C:create
-v:显示详细信息
mdadm -Cv /dev/md0 -l5 -n3 /dev/sdb1 /dev/sdb2 /dev/sdb3 -x1 /dev/sdb5
记得要格式化并挂载才能使用,还有自动挂载
3.2.3 查看raid5阵列信息
mdadm –D 设备名
3.2.4 生成raid5阵列配置文件

3.2.5 模拟raid5阵列磁盘损坏
mdadm /dev/md0 –f /dev/sdb3
#标记阵列中某磁盘损坏,并查看磁盘状态
3.2.6 移除故障磁盘,添加新磁盘
mdadm /dev/md0 --remove /dev/sdb3
#移除故障磁盘
mdadm /dev/md0 --add /dev/sdb6
#添加新的磁盘,恢复正常热备
第十章:Shell编程-基础篇
Linux运维+云计算
版本:V1.0
一、Shell 简介
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shel编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支、控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

二、Shell 的分类
Linux中shell有多种类型,其中最常用的几种是Bourne shell系列和C shell系列
Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。
Linux操作系统默认的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

Shell类型 易学性 可移至性 编辑性 快捷性
Bourne shell(sh) 容易 好 较差 较差
Bourne Again shell(bash) 难 较好 好 好
C shell(csh) 较难 差 较好 较好
TC shell(tcsh) 难 差 好 好

查询Linux中支持的shell类型:
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

三、Shell脚本的执行方式
3.1 echo 命令
echo [选项] [输出内容]
-e 支持反斜线控制的字符转换
-n 取消输出后行尾的换行符号
3.1.1 -e选项 支持的特殊符号列表

常用重点:使用 \t 制表符 和 \n 换行,实现特殊格式

案例1:按照八进制和十六进制的ASCII编码输出,并结合\t和\n的功能
[root@localhost ~]# echo -e “\0141\t\0142\t\0143\n\0144\t\0145\t\0146”
a b c
d e f
[root@localhost ~]#
[root@localhost ~]# echo -e “\x61\t\x62\t\x63\n\x64\t\x65\t\x66”
a b c
d e f

3.1.2 echo 显示颜色
格式:“\e[m”代表颜色输入开始;“\e[m” 代表颜色输入结束!

文字颜色:
30=黑色,31=红色,32=绿色,33=黄色,34=蓝色,35=紫色,36=天蓝,37=白色,39=结束
底纹颜色:
40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=紫色,46=天蓝,47=白色,49=结束
特殊的显示:
\e[0m 关闭所有属性
\e[1m 设置高亮度
\e[4m 下划线
\e[5m 闪烁
\e[7m 反显
\e[8m 消隐
注意:多个条件之间用分号(;)分割开,同时生效。
3.1.3 创建一个合格的shell脚本
创建shell脚本文件,一般以.sh作为脚本后缀,也可不写。
[root@localhost ~]# vim hello.sh
#!/bin/bash
#This is my first piece of code
#Author(Email):[email protected]

echo “We will print hello world of 7 colors.”
echo -e “\e[30;1mhello world\e[0m”
echo -e “\e[31;1mhello world\e[0m”
echo -e “\e[32;1mhello world\e[0m”
echo -e “\e[33;1mhello world\e[0m”
echo -e “\e[34;1mhello world\e[0m”
echo -e “\e[35;1mhello world\e[0m”
echo -e “\e[36;1mhello world\e[0m”

3.1.4 执行shell脚本
shell 脚本作为一种脚本程序文件,该如何运行?
方法一:添加x 执行权限(相对或绝对路径执行)
[root@localhost ~]# chmod +x hello.sh
[root@localhost ~]# ./hello.sh
We will print hello world of 7 colors.
hello world
hello world
hello world
hello world
hello world
hello world
hello world
方法二:用bash命令,调用脚本文件
[root@localhost ~]# bash hello.sh
We will print hello world of 7 colors.
hello world
hello world
hello world
hello world
hello world
hello world
hello world

四、Bash 的基本功能

4.1 历史命令
4.1.1 历史命令的查看
命令:history [选项]
-c 清空历史命令
-w 把缓存中的历史命令保存到历史命令配置文件

4.1.2 历史命令的调用
调用之前使用过的历史命令有以下几种办法:
使用上、下光标键调用
使用“!n”,重复执行第n条历史命令
使用“!!”,重复执行上一条命令
使用“!字符”,重复执行最近一条以此字符开头的命令
4.2 命令与文件名的补全
使用tab按钮,提供了如命令补齐、路径补齐等功能
注意:补齐功能有时候会将目录结尾处自动补上/符号,导致系统识别出现问题,从而报错。
4.3 命令别名
命令:alias 别名=’原命令 [选项]’
4.3.1 查看现有生效了的别名组合
[root@localhost ~]# alias
alias cp=‘cp -i’
alias egrep=‘egrep --color=auto’
alias fgrep=‘fgrep --color=auto’
alias grep=‘grep --color=auto’
alias l.=‘ls -d .* --color=auto’
alias ll=‘ls -l --color=auto’
alias ls=‘ls --color=auto’
alias mv=‘mv -i’
alias rm=‘rm -i’
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde’
4.3.2 别名相关配置文件(永久保存别名)
单个用户生效:~/.bashrc
所有用户生效:/etc/bashrc
注:别名命令的优先级更高,如:执行ls,优先执行的ls的别名
source 配置文件

. 配置文件
#刷新配置文件内容,使新设置的选项生效

4.3.3 不同类型的命令执行的顺序:
NO.1 用绝对路径或相对的方式执行命令
NO.2 别名命令
NO.3 bash 内置命令
NO.4 根据环境变量定义的目录查询找到的命令

4.4 Bash 常用快捷键

4.5 输入输出重定向

4.5.1 bash的标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准正确输出
显示器 /dev/stderr 2 标准错误输出

4.5.2 bash的输出重定向

4.5.3 输入重定向(cpio/wc/…)
命令:wc [选项] [文件名]
-c 统计字数(字符)
-w 统计单词数(字符串)
-l 统计行数
[root@localhost ~]# wc anaconda-ks.cfg
54 153 1601 anaconda-ks.cfg
[root@localhost ~]#
[root@localhost ~]# wc -c anaconda-ks.cfg
1601 anaconda-ks.cfg
[root@localhost ~]#
[root@localhost ~]# wc -w anaconda-ks.cfg
153 anaconda-ks.cfg
[root@localhost ~]#
[root@localhost ~]# wc -l anaconda-ks.cfg
54 anaconda-ks.cfg

4.6 多命令顺序执行

[root@localhost ~]# cd /data && tail -2 /root/anaconda-ks.cfg
-bash: cd: /data: 没有那个文件或目录
[root@localhost ~]#
[root@localhost ~]# cd /data || tail -2 /root/anaconda-ks.cfg
-bash: cd: /data: 没有那个文件或目录
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
4.7 grep 命令
命令:grep [选项] “关键词” 文件名 #行提取命令
-A 数字:列出符合条件的行,并将连续列出后续n行
-B 数字:列出符合条件的行,并将连续列出前面n行
-c :统计包含字符串的行一共几行!
-i :忽略大小写
-n :输出行号
-v :反向查找(取反)
–color=auto:搜索出的关键词高亮显示(默认别名)
[root@localhost ~]# grep “/bin/bash” /etc/passwd
root❌0:0:root:/root:/bin/bash
[root@localhost ~]#
[root@localhost ~]# grep -A 2 “/bin/bash” /etc/passwd
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
[root@localhost ~]#
[root@localhost ~]# grep -c “/bin/bash” /etc/passwd
1
[root@localhost ~]#
[root@localhost ~]# grep -n “/bin/bash” /etc/passwd
1:root❌0:0:root:/root:/bin/bash

find 和 grep 的区别
find 是在系统中查找符合条件的文件名,默认是完全匹配,如果需要模糊查找使用通配符。 grep 是在文件中查找符合条件的字符串,是包含匹配,如果需要精确查询,需要使用正则表达式,此处正则暂不介绍,高级篇中讲解。
#grep查询关键词时,只要包含关键词的行都被显示
通配符功能介绍

案例展示:
[root@localhost test]# touch abc abcd 0123 0abc
[root@localhost test]# ls *
0123 0abc abc abcd
[root@localhost test]#
[root@localhost test]# ls ?abc
0abc
[root@localhost test]#
[root@localhost test]# ls abc
0abc abc
[root@localhost test]#
[root@localhost test]# ls [0-9]

0123 0abc
[root@localhost test]#
[root@localhost test]# ls [^0-9]*
abc abcd

4.8 管道符
格式:命令1 | 命令2
#将命令1的标准输出作为命令2的标准输入
[root@localhost ~]# ls -l /etc | more
#/etc 目录下内容较多,长格式显示后一页显示不全,用more分页显示下
格式:命令 |xargs 命令2
#将命令1的标准输出当做命令2的执行参数(执行对象),默认逐个处理
[root@localhost ~]# find /etc -name *.txt | cat
/etc/pki/nssdb/pkcs11.txt
[root@localhost ~]# find /etc -name *.txt | xargs cat
library=libnsssysinit.so
name=NSS Internal PKCS #11 Module
parameters=configdir=‘sql:/etc/pki/nssdb’ certPrefix=’’ keyPrefix=’’ secmod=‘secmod.db’ flags= updatedir=’’ updateCertPrefix=’’ updateKeyPrefix=’’ updateid=’’ updateTokenDescription=’’
NSS=Flags=internal,moduleDBOnly,critical trustOrder=75 cipherOrder=100 slotParams=(1={slotFlags=[RSA,DSA,DH,RC2,RC4,DES,RANDOM,SHA1,MD5,MD2,SSL,TLS,AES,Camellia,SEED,SHA256,SHA512] askpw=any timeout=30})

五、Bash 中其他特殊符号

5.1 单引号&双引号
[root@localhost ~]# name=shanchuan #给变量name赋值,值为:shanchuan
[root@localhost ~]#
[root@localhost ~]# echo $name #echo KaTeX parse error: Expected 'EOF', got '#' at position 47: …ot@localhost ~]#̲ [root@localho…name’
KaTeX parse error: Expected 'EOF', got '#' at position 24: …ot@localhost ~]#̲ [root@localho…name"
shanchuan

#单引号当中的符号没有特殊含义,双引号里绝大多数符号也没有特殊含义,但是 $ 和 和 \ 是例外! [root@localhost ~]# echodate2020年 04月 18日 星期一 03:54:42 CST [root@localhost ~]# [root@localhost ~]# echo 'date' date [root@localhost ~]# [root@localhost ~]# echo "date" date [root@localhost ~]# [root@localhost ~]# echo 'date'date[root@localhost ~]# [root@localhost ~]# echo "date`"
2020年 04月 18日 星期一 03:55:40 CST

5.2 反引号 & $()
[root@localhost ~]# echo date
2020年 04月 18日 星期一 03:54:42 CST
[root@localhost ~]# echo $(date)
2020年 04月 18日 星期一 03:58:15 CST

5.3 小括号、大括号
shell解析器是可以手动开启的,每执行一次bash命令就会开启一个新的shell解析器 ,相应的就会有父shell 和 子shell。
执行bash命令前:

执行bash命令后:

注:最明显的感觉就是当你新开启一个shell后,你刚才执行的历史命令调用不出来。

OK , 可以讲大括号{ } 和 小括号( ) 了
两者区别:
()执行一串命令时,需要重新开一个子shell进行执行
{}执行一串命令时,是在当前shell执行
()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
()最后一个命令可以不用分号结尾
{}最后一个命令要用分号结尾
{}的第一个命令和左括号之间必须要有一个空格
()里的各命令不必和括号有空格
实例验证:
() 中执行命令时,新开启shell 进行
[root@localhost ~]# name=shanchuan
[root@localhost ~]# (name=laowang;echo $name)
laowang
[root@localhost ~]#
[root@localhost ~]# echo $name
shanchuan

{ } 执行命令时,就在本shell中进行
[root@localhost ~]# name=shanchuan
[root@localhost ~]#
[root@localhost ~]# { name=laowang;echo $name;}
laowang
[root@localhost ~]#
[root@localhost ~]# echo $name
laowang

五、Bash的变量和运算符

变量是计算机语言中能储存计算结果或表示值抽象概念,变量可以通过变量名访问,在指令式语言中,变量即可变化的量。

5.1 定义变量的规范
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格。如果变量名是“2name”则是错误的。
[root@localhost ~]# 2bname=shanchuan
-bash: 2bname=shanchuan: command not found

在Bash中,变量的默认类型都是字符串型,若要进行数值运算,必须修改变量类型为数值型。
[root@localhost ~]# x=666
[root@localhost ~]# y=888
[root@localhost ~]# s= x + x+ x+y
[root@localhost ~]# echo $s
666+888

在进行变量赋值时,等号左右两侧不能有空格。
[root@localhost ~]# name=shanchuan
[root@localhost ~]# name= shanchuan
-bash: shanchuan: command not found
[root@localhost ~]# name =shanchuan
-bash: name: command not found

变量的值如果有空格,需要使用单引号或双引号包括。如:test=“hello world”。其中双引号内的符号“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。
[root@localhost ~]# name=shan chuan
-bash: chuan: command not found
[root@localhost ~]# name=“shan chuan”
[root@localhost ~]# echo $name
shan chuan

双引号“ ”内的 $ \ `` 都仍然具有特殊含:
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 35: …ot@localhost ~]#̲ echo "name"
shan chuan
[root@localhost ~]#
[root@localhost ~]# echo $name
$name
[root@localhost ~]# time=date
[root@localhost ~]# echo $time
2020年 04月 18日 星期二 00:10:51 CST

注意:单引号中任何字符都是普通字符,不具备任何特殊含义

变量叠加
如果需要增加变量的值,那么可以进行变量值的叠加。
格式:变量名= “ 变 量 名 新 增 值 " 或 变 量 名 = " 变量名 新增值" 或 变量名= " "="{变量名} 新增值”
注意:因为是在原变量值的基础增加内容,多数会用到空格,那么必须用双引号才可以
[root@localhost ~]# name=shan
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 29: …ot@localhost ~]#̲ name="name chuan"
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 35: …ot@localhost ~]#̲ name="{name} chuan"
[root@localhost ~]# echo $name
shan chuan chuan

如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
[root@localhost ~]# time=date
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 55: …ot@localhost ~]#̲ [root@localho…(pwd)
[root@localhost ~]# echo $dir
/root

5.2 变量的分类
自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。
环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

5.2.1 用户自定义变量
注意:切记变量的命名规范!(空格、名称、引号等)
1) 变量调用
echo $变量名
2) 变量查看
set [选项] #开启针对变量的某些特定功能
-u :调用没有声明的变量时会报错
[root@localhost ~]# echo $abc

[root@localhost ~]#
[root@localhost ~]# set -u
[root@localhost ~]#
[root@localhost ~]# echo $abc
-bash: abc: unbound variable

-x :命令执行前,会先把命令输出一次
[root@localhost ~]# set -x
[root@localhost ~]# ls

  • ls --color=auto
    anaconda-ks.cfg
    [root@localhost ~]# set +x
  • set +x
    [root@localhost ~]# ls
    anaconda-ks.cfg

3) 变量删除
unset 变量名
5.1.2 环境变量
首先声明:我们很少自行定义环境变量,一般都是对系统设置好的进行修改
1) 环境变量设置
export AGE=18
#export 声明的是环境变量
2) 环境变量查询和删除
env命令和set命令的区别:set命令查看所有变量,env命令只能查看环境变量。
[root@localhost ~]# export HF=hongfu
[root@localhost ~]# BD=2001
[root@localhost ~]#
[root@localhost ~]# set | grep HF
HF=hongfu
[root@localhost ~]# set | grep BD
BD=2001
[root@localhost ~]# env | grep HF
HF=hongfu
[root@localhost ~]# env | grep BD

3) 系统默认的环境变量(PATH、PS1、LANG)
PATH变量:系统命令存放路径
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

说明:PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个命令时,命令没有设置别名,并且也没有写命令的相对或绝对路径时,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。

让脚本像执行命令一样简单
方法一:可以考虑把自己写的脚本放入PATH对应的目录内
or
方法二:修改PATH变量的值,将我们存放脚本的目录叠加到PATH变量中
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 84: …ot@localhost ~]#̲ PATH="PATH:/sh"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/sh

注意:以上操作仅仅临时生效,重启后则失效,要实现永久生效需要写入配置文件才行
单用户生效:~/.bash_profile
所有用户生效:/etc/profile

刷新配置文件:source 配置文件

PS1变量:命令提示符设置
PS1是用来定义命令行的提示符的,可以按照我们自己的需求来定义提示符。
可用选项:
\d:显示日期,格式为“星期月日”
\H:显示完整的主机名。如默认主机名“localhost.localdomain”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
@:显示12小时制时间,格式为“HH:MM am/pm”
\u:显示当前用户名
\v:显示Bash的版本信息
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
#:执行的第几个命令
$:提示符。如果是root提示符为“#”,如果是普通用户提示符为“$”
PS1的默认格式:
[root@localhost ~]# echo $PS1
[\u@\h \W]$

定义PS1变量值时需要注意单引号,否则不生效
[root@localhost ~]# PS1=’[\u@\h \w]$’
[root@localhost ~]# cd /etc/sysconfig/
[root@localhost /etc/sysconfig]#
[root@localhost /etc/sysconfig]# cd
[root@localhost ~]#
[root@localhost ~]# PS1=’[\e[31;1m\u\e[0m@\h \w]$’
[root@localhost ~]#

LANG变量:系统语系变量
LANG定义的是Linux 的语言环境变量:
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# localectl status
System Locale: LANG=zh_CN.UTF-8
VC Keymap: cn
X11 Layout: cn
Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_CN.UTF-8”。
Linux中到底支持多少语系呢?我们可以使用以下命令查询:
[root@localhost ~]# localectl list-locales | tail -5
zh_TW.euctw
zh_TW.utf8
zu_ZA
zu_ZA.iso88591
zu_ZA.utf8
[root@localhost ~]# localectl list-locales | wc -l
787
永久修改操作系统语言环境:
[root@localhost ~]# cat /etc/locale.conf
LANG=“zh_CN.UTF-8”
[root@localhost ~]# localectl set-locale LANG=en_US.utf8 #该命令直接修改配置文件

注意:LANG变量的值会随着登录终端是否支持中文而改变。

$N 位置参数变量:通过位置进行变量赋值和取值

[root@localhost sh]# cat a.sh
#!/bin/bash

echo $0
echo $1
echo $3
echo $4
[root@localhost sh]#
[root@localhost sh]# chmod +x a.sh
[root@localhost sh]#
[root@localhost sh]# ./a.sh xshell 5 free for home
./a.sh
xshell
free
for

脚本1:
#!/bin/bash
#Describe:This is a simple calculator.

echo -e “\e[31;1m*********************************\e[0m”
echo -e “\e[34;1mProject: calculator\e[0m”
echo -e “\e[34;1mFormat: ./sum.sh num1 sign num2\e[0m”
echo -e “\e[34;1m*********Sign: + - * / \e[0m"
echo -e "\e[31;1m
***********************\e[0m”

echo $1$2 3 = 3= 3=(($1$2$3))
#等号前边的$1$2$3用来描述计算公式,等号后的$1$2 3 用 来 完 成 实 际 计 算 : 3用来完成实际计算: 3((计算公式))用来数值计算

脚本2:
#!/bin/bash

echo “Number of values:$#”
#统计一共有多少个字符串(值的个数)。

n=1
for i in “KaTeX parse error: Expected 'EOF', got '#' at position 4: @" #̲此处在通过*或者$@向脚本内传递值的时候,必须使用”"才有效果~!
do
echo “Value of position n : n: n:i”
#按照对应位置将对应值打印出来。
let n=n+1
#用来定位第n个位置,实现自动累加。
done

$*显示所有参数(作为整体接收并传递到脚本内)
$@显示所有参数(分开接收,依次传递到脚本内)
$#显示参数个数

预定义变量

$?:命令执行成功:返回值为0;命令执行失败:返回值为非0
[root@localhost sh]# ls
all.sh a.sh sum.sh
[root@localhost sh]# echo $?
0
[root@localhost sh]#
[root@localhost sh]# lls
-bash: lls: 未找到命令
[root@localhost sh]# echo $?
127
[root@localhost sh]#
[root@localhost sh]# grep “xxxx” /etc/passwd
[root@localhost sh]# echo $?
1
KaTeX parse error: Expected 'EOF', got '#' at position 48: …t@localhost sh]#̲ echo
19033
[root@localhost sh]# ps aux | grep 19033 | grep -v grep
root 19033 0.0 0.0 116096 2948 pts/1 Ss 02:33 0:00 -bash

$!:最后一个放入后台执行的命令的进程
[root@localhost sh]# dd if=/dev/zero of=/dev/null &
[1] 19126
[root@localhost sh]#
[root@localhost sh]# echo $!
19126
[root@localhost sh]#
[root@localhost sh]# ps aux | grep 19126 | grep -v grep
root 19126 100 0.0 107996 620 pts/1 R 02:57 0:53 dd if=/dev/zero of=/dev/null
&:将该符号前的命令放入后台执行,一般针对那些可持续执行的命令,瞬间执行的没必要

read 接收键盘输入,完成交互式操作
read [选项] [变量名]
-p “提示信息”:在read等待时输入的信息
-t 秒数 :read等待的秒数
-n 字符数:read最多能接收的字符数(达标即执行)
-s :隐藏输入信息
#!/bin/bash

read -p “Please enter your name:” name

echo -n “Please enter your age(10 seconds):”
read -t 10 age
echo

echo -n “Please enter your gender(m/w):”
read -n 1 gender
echo

echo -n “Please enter your phone number:”
read -s pn
echo

echo -n “Please enter your home address:”
read addr

echo -e “\e[33;1m******KaTeX parse error: Undefined control sequence: \e at position 34: …rmation *******\̲e̲[0m" echo "Name…name”
echo “Age: a g e " e c h o " G e n d e r : age" echo "Gender: age"echo"Gender:gender”
echo “Phone Number: p n " e c h o " H o m e A d d r e s : pn" echo "Home Addres: pn"echo"HomeAddres:addr”
注意:因为某些特殊选项会出现不自动换行的bug,请使用echo 来设置换行。

read变量名定义:
变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY
如果只提供了一个变量名,则整个输入全部赋予该变量
如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值
#!/bin/bash

echo “Please enter your Name, Age, Gender, Phone Number, Home Address”
read name age gender ph addr

echo -e “Name:KaTeX parse error: Undefined control sequence: \nAge at position 5: name\̲n̲A̲g̲e̲:age\nGender:KaTeX parse error: Undefined control sequence: \nPhone at position 7: gender\̲n̲P̲h̲o̲n̲e̲ ̲Number:ph\nHome Adderss:$addr”

Shell 的运算符
数值运算的方法:使用declare声明变量类型
命令:declare [+/-] [选项] 变量
- : 给变量设定类型
+ : 取消变量的类型

	-a	: 将变量声明成数组型
	-i	: 将变量声明成整数型
	-r	: 将变量声明成只读(变量值不能修改,也不能删除,更不能取消只读选项)
	-x	: 将变量声明成环境变量
	-p	: 显示指定变量的类型及内容

数组型
数组,计算机中可以理解是多个相同类型的元素组成的集合,用于解决复杂的数据统计和计算,我们在shell中虽然不会涉及到太多的复杂的计算,但是掌握数组有利于我们编写脚本。
数组的名字即变量的名字,我们在变量名后面加上下标编号来区分变量中的每一个值,因此数组变量又称下标变量。
[root@localhost ~]# teacher[0]=cang
[root@localhost ~]# teacher[1]=bo
[root@localhost ~]# teacher[2]=long
[root@localhost ~]# teacher[3]=shen
[root@localhost ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 32: …ot@localhost ~]#̲ echo "{teacher[@]}"
cang bo long shen
[root@localhost ~]# echo “${teacher[2]}”
long

注:数组的下标从0开始,调用数组的元素时要使用${数组[下标]}的格式
我们刚才貌似没有使用declare 声明变量类型为数组
当我们使用“变量名[下标]=值” 这样的格式定义变量时,自动识别成数组

整数型
之前我们曾经写过让两个数字相加的操作,但是貌似结果变成了字符叠加,我们现在将变量声明成整数型再来试试
[root@localhost sh]# declare -i a=100
[root@localhost sh]# declare -i b=200
[root@localhost sh]# declare -i s= a + a+ a+b
[root@localhost sh]# echo $s
300

shell中如果想进行数值运算,其实我们有更好的办法,请仔细听讲后边的内容。

环境变量
我们可以用declare 将变量声明成环境变量,和export是同样的效果。
declare -x 变量名=值,声明后使用env查看一下。
[root@localhost sh]# declare -x XBZ=“shan chuan”
[root@localhost sh]# env | grep XBZ
XBZ=shan chuan

只读变量
只要对变量设置了只读属性,这个变量只能进行调用,不能进行修改和删除,甚至不能进行取消只读选项。
[root@localhost sh]# declare -r test=100w
[root@localhost sh]#
[root@localhost sh]# echo $test
100w
[root@localhost sh]# test=200w
-bash: test: 只读变量
[root@localhost sh]# unset test
-bash: unset: test: 无法反设定: 只读 variable
[root@localhost sh]#
[root@localhost sh]# declare +r test
-bash: declare: test: 只读变量

其实不用担心,退出终端,即可消失,因为这样设置的变量都是临时的

查询变量
变量属性查询可以使用-p,会列出变量设置时使用的参数
[root@localhost sh]# declare -p test
declare -r test=“100w”
[root@localhost sh]#
[root@localhost sh]# declare -p XBZ
declare -x XBZ=“shan chuan”
[root@localhost sh]#
[root@localhost sh]# declare -p s
declare -i s=“300”

使用expr 或 let 进行数值运算
这两个是直接声明运算过程是数值运算,而不是通过声明变量的类型,所以相对简单,但是要注意格式:
[root@localhost sh]# x=1000
[root@localhost sh]# y=2000
[root@localhost sh]# expr $x + $y
3000

expr 使用时需要注意的是,在运算符两边要有空格,否则不会正常运算。

let 则相对简单易用,原理相同,格式略微变化:
[root@localhost sh]# x=1000
[root@localhost sh]# y=2000
[root@localhost sh]# let s= x + x+ x+y
[root@localhost sh]# echo $s
3000

let 还能进行自增增减,或者指定增加量或减少量。
自增&自减
[root@localhost sh]# n=1
[root@localhost sh]# let n++
[root@localhost sh]# echo $n
2
[root@localhost sh]# let n++
[root@localhost sh]# echo $n
3
[root@localhost sh]# let n–
[root@localhost sh]# echo $n
2
[root@localhost sh]# let n–
[root@localhost sh]# echo $n
1

指定增减量
[root@localhost sh]# n=1
[root@localhost sh]# let n+=5
[root@localhost sh]# echo $n
6
[root@localhost sh]# let n+=5
[root@localhost sh]# echo $n
11
[root@localhost sh]# let n-=3
[root@localhost sh]# echo $n
8
[root@localhost sh]# let n-=3
[root@localhost sh]# echo $n
5
不管是expr 还是 let 都能实现数值运算,看个人使用习惯。

使用“ ( ( 运 算 式 ) ) ” 或 “ ((运算式))”或“ (())[运算式]”格式进行运算
同样两种格式都能实现数值运算,格式与expr和let不同
[root@localhost sh]# xx=100
[root@localhost sh]# yy=200
[root@localhost sh]#
[root@localhost sh]# echo ( ( (( ((xx+$yy))
300
[root@localhost sh]# echo [ [ [xx+$yy]
300

以上三种数值运算方式选择哪一种都可以,在脚本中常见的是KaTeX parse error: Expected 'EOF', got '#' at position 149: …ot@localhost ~]#̲ aa=(((11+22)*33/44))
[root@localhost ~]# echo $aa
24
[root@localhost ~]#
表格中的优先级是乘除优先于加减,但是由于加减被()调用,所以括号内的优先级高于乘除。

取余运算
[root@localhost ~]# echo $((14%3))
2
[root@localhost ~]# echo $((-14%-3))
-2
[root@localhost ~]# echo $((-14%3))
-2
[root@localhost ~]# echo $((14%-3))
2

扩展知识点:
其他语言中除了取余运算之外,还有一种类似于取余的运算,叫做取模运算。看区别:
1.求整数商: c = a/b
2.计算模或者余数: r = a-c*b
注意:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。但是当符号不一致的时候,结果不一样。具体来说,求模运算结果的符号和b一致,求余运算结果的符号和a一致。

逻辑与(一般单独使用)
[root@localhost ~]# echo $((0&&0))
0
[root@localhost ~]# echo $((0&&1))
0
[root@localhost ~]# echo $((1&&0))
0
[root@localhost ~]# echo $((1&&1))
1

七、环境变量的配置
7.1 source命令
刷新修改过的配置文件使其生效
[root@localhost ~]# source /etc/profile
[root@localhost ~]#
[root@localhost ~]# . /etc/bashrc
[root@localhost ~]#
环境变量配置文件,登录系统时生效的环境变量配置文件
/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc

7.2 文件的调用顺序是:

7.2.1先调用/etc/profile文件在这个环境变量配置文件中会定义这些默认环境变量
USER变量:根据登录的用户,给这个变量赋值(就是让USER变量的值保存当前用户名)。
LOGNAME变量:根据USER变量的值,给这个变量赋值。
MAIL变量:根据登录的用户,定义用户的邮箱为/var/spool/mail/用户名。
PATH变量:根据登录用户的身份,决定PATH变量是否包含专属目录(/root/sh)。
HOSTNAME变量:更改主机名,给这个变量赋值。
HISTSIZE变量:定义历史命令的保存条数。

7.2.2 ~/.bash_profile文件就没有那么复杂了,这个文件主要实现了两个功能
调用了~/.bashrc文件。
在PATH变量后面加入了“:$HOME/bin”这个目录。那也就是说,如果我们在自己的家目录中建立bin目录,然后把自己的脚本放入“~/bin”目录,就可以直接执行脚本,而不用通过目录执行了。

7.2.3 在~/.bashrc文件中主要实现了
定义默认别名,所以我们把自己定义的别名也放入了这个文件。
调用/etc/bashrc

7.2.4 在/etc/bashrc文件中主要定义了这些内容
PS1变量:也就是用户的提示符,如果我们想要永久修改提示符,就要在这个文件中修改
umask:定义umask默认权限。这个文件中定义的umask是针对“没有登录过程(也就是不需要输入用户名和密码时,比如从一个终端切换到另一个终端,或进入子Shell)”时生效的。如果是“有用户登录过程”,则是/etc/profile文件中的umask生效。
PATH变量:会给PATH变量追加值,当然也是在“没有登录过程”时才生效。
调用/etc/profile.d/*.sh文件

7.3 注销专用环境变量配置文件
在用户退出登录时,只会调用一个环境变量配置文件,就是~/.bash_logout。这个文件默认没有写入任何内容,可是如果我们希望再退出登录时执行一些操作,比如清除历史命令,备份某些数据,就可以把命令写入这个文件。

7.4 shell登录信息
7.4.1 /etc/issue
我们在登录tty1-tty6这六个本地终端时,会有几行的提示信息。这些提示信息是保存在哪里的?可以修改吗?当然可以修改,这些提示信息是保存在/etc/issue文件中,我们查看下这个文件:
[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m

[root@localhost ~]#
查询组合作用可用man agetty
\d :显示当前系统日期
\s :显示操作系统名称
\l :显示登录的终端号
\m :显示硬件体系结构
\n :显示主机名
\o :显示域名
\r :显示内核版本
\t :显示当前系统时间
\u :显示当前登录用户的序列号

7.4.2 /etc/motd
/etc/motd文件中是显示欢迎信息的,这个文件是在用户输入用户名和密码,正确登录之后显示欢迎信息。在/etc/motd文件中的欢迎信息,不论是本地登录,还是远程登录都可以显示。我们一般在这个文件里写一写登录警告信息,告诉用户登录后需要注意哪些事情。

7.5 bash的快捷键(了解即可)
查看所有已存在的快捷键
[root@localhost ~]# stty -a
speed 38400 baud; rows 24; columns 133; line = 0;
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
[root@localhost ~]#

修改快捷键
stty 关键词 快捷键
[root@localhost ~]# stty intr ^p
[root@localhost ~]# ^P
[root@localhost ~]# stty -a
speed 38400 baud; rows 24; columns 133; line = 0;
intr = ^P; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; swtch = ; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
注意:尽量不要对快捷键做出修改,毕竟服务器不是一个人在维护,你的习惯不是别人的习惯

第十一章:Shell编程-高级篇
Linux运维+云计算
版本:V1.0
一、正则表达式
1.1 概述
在上一章说过通配符的功能,用来在Linux中用来查询指定名称的文件名,帮助我们实现模糊查询;而我们今天要讲的正则表达式,则是对字符串和文件内容进行匹配,例如grep命令可以使用正则表达式进行精确查询(grep默认是模糊查询,查询符合条件的行)。
1.2 基础正则表达式

1.3 grep结合正则实现精确匹配
1.3.1 元字符匹配:
. 匹配换行符以外的任意一个字符
正则表达式“.”只能匹配一个字符,但可以是任意字符

[ ] 匹配中括号中任意一个字符,注意只能匹配一个字符
比如[ao]要不匹配一个a字符,要不匹配一个o字符
[0-9] [a-z] [A-Z] [a-Z] 类似这样的都可以,指定匹配的范围
[^0-9]匹配除了数字以外的任意一个字符

1.3.2 次数匹配(字符数量)

  • 前一个字符匹配任意多次
    如果正则表达式写成“aa*” 代表匹配至少包含有一个a的行

? 匹配前一个字符出现0次或者1次

{n} 表示前面的字符恰好出现n次
{n,} 表示其前面的字符出现不小于n次
{n,m} 匹配其前面的字符出现不小于n次,最多出现m次

1.3.3 位置匹配
^ 匹配行首,$ 匹配行尾
#用“^$”匹配空白行
#[a-Z]是什么意思?
1.3.4整体匹配
(字符串) 将括号内的内容当做一个整体
(dog)* 用来匹配出现任意次数的dog字符串
(dog)? 用来匹配dog字符串出现一次或者不出现

1.4 扩展正则表达式
前面的正则表达式我们都可以直接和grep命令结合使用,还有一个扩展表达式,在使用是必须使用grep -E或者egrep命令才能生效。

1.5 正则表达式练习
匹配手机号
匹配ip
匹配邮箱

二、字符截取和替换命令
2.1 cut 列提取命令
2.1.1 格式:cut [选项] 文件名
-f 列号:提取第几列,默认识别制表符分割出来的列
-d 分隔符:按照指定的分割符进行分割,然后结合-f提取指定列
-c 字符范围:不依赖分割符来分割,而是通过字符范围进行提取
n-m表示从第n提取到第m个字符
n-表示从第n个字符开始提取到结尾
-m表示从第一个字符提取到第m个
2.1.2 cut 案例演示
准备工作:手动创建文本,添加内容,列之间用制表符分割(tab)
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63
#不要直接在此处复制,此处为了对齐用了不止一个分隔符,不能直接用于实验。

-f 过滤指定列的内容(多列用逗号分割)
[root@localhost ~]# cut -f 2,3 cut.txt
NAME LINUX
xcang 95
xbo 83
xlong 74

注意:-f选项仅识别用制表符分割的列,空格等分割出来的列不被识别,切记~!
-d 手动指定分隔符,然后过滤指定列,结合-f
[root@localhost ~]# cut -d “:” -f 1,7 /etc/passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin

#通过指定分割符的方式来确定如何进行分割,我们把/etc/passwd按照:分割,截取第一个和第七个字段,就能统计哪些用户能登录系统,哪些不能登录了。
-c 可以按照字符数量进行截取,按照对应格式可以取到对应位置的字符
格式:【n-m】【n-】【-m】
[root@localhost ~]# head -5 anaconda-ks.cfg
#version=DEVEL

System authorization information

auth --enableshadow --passalgo=sha512

Use CDROM installation media

cdrom
[root@localhost ~]# head -5 anaconda-ks.cfg | cut -c 1-5
#vers

Sys

auth

Use

cdrom

练习题:尝试使用cut将磁盘的使用百分比截取出来

2.2 awk命令
awk是一种编程语言,用于在linux/unix中对文本和数据进行处理,awk既可以实现对文件的行提取,也可以实现对文件的列提取,是一个很全面的工具,此处我们只讲在Linux中如何利用awk进行字符串过滤,不讲过多关于awk编程的内容。
2.2.1 awk 的格式和组成结构
格式:awk ‘条件1{动作1}’ 文件名
条件的作用:通过指定条件过滤出符合条件的行
动作的作用:通过动作将符合条件的行打印出来,不过在打印时我们可以选择打印该行中的哪些列
条件:通过关系表达式进行判断,过滤出符合条件的行
变量>10 :判断变量的值是否大于10;可使用>、<、>=、<=等
变量变量 :判断两个变量的值是否相等;可使用、!=等
变量~/字符串/ :判断变量中是否包含指定字符串,~// !~//
动作:将符合条件的内容进行格式化后输出到命令行
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63
[root@localhost ~]# cut -f 2,3 cut.txt
NAME LINUX
xcang 95
xbo 83
xlong 74
[root@localhost ~]# awk ‘{printf $2"\t"$3"\n"}’ cut.txt
NAME LINUX
xcang 95
xbo 83
xlong 74
#不指定任何条件,直接执行动作,并选择输出哪些列

2.2.2 拓展:动作{printf}
printf是标准的格式化输出,取消所有默认格式,然后手动指定输出内容的类型和输出时的格式
printf输出格式:
printf ‘类型/格式’字符串
可以使用cat、head、tail等命令将文本内的字符串取出,然后交由printf处理
输出类型:
%s:将内容按照字符串类型输出
%i:将内容按照整数类型输出
%f:将内容按照浮点数类型输出(%.2f:代表输出小数点数值时保留两位小数点)
输出格式:
\t:字符之间用制表符分割,即tab键
\n:字符之间用换行符分割,即enter键
案例演示:
使用printf输出下我们的表格文件
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63

[root@localhost ~]# printf ‘%s’ cat cut.txt
IDNAMELINUXMYSQLDOCKER0xcang9559781xbo8375932xlong749663[root@localhost ~]#

在使用printf输出时,如果仅指定输出类型,而不指定输出格式,则会把所有要输出内容连在一起输出,变为一整行。而printf提供了可自定义的灵活的输出格式,若要将内容按照原格式输出,我们需要自己为printf写格式。
[root@localhost ~]# printf ‘%s\t%s\t%s\t%s\t%s\n’ cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63

假若我们在输出时,想让第1列使用整数类型输出,3,4,5列使用浮点类型输出如何操作?
[root@localhost ~]# printf ‘%i\t%s\t%.2f\t%.2f\t%.2f\n’ cat cut.txt
-bash: printf: ID: invalid number
-bash: printf: LINUX: invalid number
-bash: printf: MYSQL: invalid number
-bash: printf: DOCKER: invalid number
0 NAME 0.00 0.00 0.00
0 xcang 95.00 59.00 78.00
1 xbo 83.00 75.00 93.00
2 xlong 74.00 96.00 63.00
[root@localhost ~]# printf ‘%i\t%s\t%.2f\t%.2f\t%.2f\n’ cat cut.txt|grep -v ID
0 xcang 95.00 59.00 78.00
1 xbo 83.00 75.00 93.00
2 xlong 74.00 96.00 63.00

2.2.3 awk的条件
awk预定义条件(保留字)
这两个条件为系统预设好的特殊条件,必须用大写,切记~!
BEGIN:在awk未读取数据前声明的动作,该条件后的动作仅在程序开始时执行一次,不会重复执行
[root@localhost ~]# awk ‘BEGIN{printf “MYSQL成绩单:\n”}{printf $2"\t"$4"\n"}’ cut.txt
MYSQL成绩单:
NAME MYSQL
xcang 59
xbo 75
xlong 96

[root@localhost ~]# awk ‘BEGIN{FS=":"}{printf $1"\t"$7"\n"}’ /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
END:类似于BEGIN,在awk处理完所有数据后声明的条件,在该条件后的程序仅在程序结束前执行一次
[root@localhost ~]# awk ‘{printf $2"\t"$5"\n"}END{printf “以上显示的是所有人的DOCKER成绩\n”}’ cut.txt
NAME DOCKER
xcang 78
xbo 93
xlong 63
以上显示的是所有人的DOCKER成绩
awk关系运算条件

、<、>=、<=、==、!=
用来判断左右两侧的关系,一般左侧为变量,右侧为参考值。
例1:列出Linux成绩大于等于80分的成绩单
[root@localhost ~]# awk ‘BEGIN{printf “列出Linux成绩大于等于80分的成绩单:\n”} $3>=80{printf $2"\t"$3"\n"}’ cut.txt
列出Linux成绩大于80分的成绩单:
NAME LINUX
xcang 95
xbo 83

例2:列出学号为2号的各科成绩单
[root@localhost ~]# awk ‘$1==2{printf $0"\n"}’ cut.txt
2 xlong 74 96 63
awk包含匹配条件
、!//、!//
用来进行匹配包含关系的,判断左侧变量中是否包含右侧的字符串,当右侧字符串中包含一些特殊符号时,需要使用//然后在里面使用\转义符将符号转义为普通字符。
[root@localhost ~]# cat cuta.txt
ID NAME LINUX MYSQL DOCKER MAIL
0 xcang 95 59 78 [email protected]
1 xbo 83 75 93 [email protected]
2 xlong 74 96 63 [email protected]

[root@localhost ~]# awk ‘$6~/x/{printf $0"\n"}’ cuta.txt
0 xcang 95 59 78 [email protected]

[root@localhost ~]# awk ‘/x/{printf $0"\n"}’ cuta.txt
0 xcang 95 59 78 [email protected]
1 xbo 83 75 93 [email protected]
2 xlong 74 96 63 [email protected]

[root@localhost ~]# awk ‘KaTeX parse error: Can't use function '\.' in math mode at position 4: 0~/\̲.̲com/{printf $0"\n"}’ cuta.txt
0 xcang 95 59 78 [email protected]
2 xlong 74 96 63 [email protected]

[root@localhost ~]# df -h | awk ‘/(sd|sr)[a-z]?[0-9]/{printf $1"\t"$5"\n"}’
/dev/sr0 100%
/dev/sda1 15%

总结:awk的工作原理
先查看是否有BEGIN条件,有则先执行BEGIN后面定义动作
如果没有BEGIN条件,则先读入第一行,把第一行的数据使用分隔符分隔好之后依次依次赋值给变量$0 $1 $2 $3 …等变量,$0 代表整行数据,$1 则为第一个字段,依次类推(有点类似于位置参数变量)。
第一行将所有内容赋值完成后,进行条件判断,按照符合条件的动作执行
处理完第一行之后,将第二行赋值,重复第一行的所有步骤即可,依次直到处理完整个文本

2.2.4 awk内置变量
awk内置变量 作用
$0 代表awk读入当前行的整行数据
$n 代表awk读入当前行的第n列数据
NR 代表当前awk正在处理的行的行号
NF 代表当前awk读取数据总字段数(总列数)
FS 用来声明awk的分隔符,如BEGIN {FS=“:”}

[root@localhost ~]# awk ‘NR>1{printf $0"\n"}’ cuta.txt
0 xcang 95 59 78 [email protected]
1 xbo 83 75 93 [email protected]
2 xlong 74 96 63 [email protected]

[root@localhost ~]# awk ‘END{printf “文件的总列数为:“NF”\n”}’ cuta.txt
文件的总列数为:6
#统计指定文件的最后一行的列数

[root@localhost network-scripts]# echo $PWD|awk -F / ‘{printf $NF"\n"}’
network-scripts
#打印以/为分割符号内容的最后一列

2.2.5 awk的数值运算
awk中默认支持数值运算,并且整数、浮点数运算都支持
[root@localhost ~]# awk ‘NR>1{printf $2"的平均分是\t"($3+$4+$5)/3"\n"}’ cuta.txt
xcang的平均分是 77.3333
xbo的平均分是 83.6667
xlong的平均分是 77.6667
[root@localhost ~]# printf ‘%s\t%.2f\n’ awk 'NR>1{printf $2"的平均分是\t"($3+$4+$5)/3"\n"}' cuta.txt
xcang的平均分是 77.33
xbo的平均分是 83.67
xlong的平均分是 77.67
[root@localhost ~]# c=$(awk ‘BEGIN{print 7.01*5-4.01 }’)
[root@localhost ~]# echo $c
31.04

注意事项:在awk编程中,因为命令语句非常长,输入格式时需要注意以下内容
多个【条件{动作}】可以用空格分割
在一个动作中,如果需要执行多个命令,需要用“;”分割
在awk中,变量的赋值与调用都不需要使用“$”符
判断两个值是否相同,使用“==”,以便和变量赋值进行区分

2.3 sed命令
sed的主要功能是实现数据选取、替换、删除、新增等操作的命令,我们一般来使用sed命令实现非交互式文件内容修改,即不进入文本内对文件内容修改。
2.3.1 选项:
-n:将经过sed命令处理过的数据输出到命令行(不加-n则输出全文+指定行)
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
2.3.2 动作:
p:打印,输出指定的行,例如:2p,就是输出第二行
a:追加,在当前行后追加一行或多行。追加多行时,除最后一行外,行尾要使用\强制换行符。
i:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,行尾要使用\强制换行符。
c:整行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,行尾要使用\强制换行符。
d:删除,删除指定的行,删除多行时可使用:2,5d的格式。
s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”( 和vim中的替换格式类似)

注意:sed所有的修改默认都不会直接修改文件的内容,而是在内存中进行处理然后打印到屏幕上,使用 -i 选项才会保存到文本中。

2.3.3 数据操作实例
显示某行的信息:sed ‘2p’文件
[root@localhost ~]# sed ‘2p’ cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63
[root@localhost ~]#
[root@localhost ~]# sed -n ‘2p’ cut.txt
0 xcang 95 59 78

删除数据:sed ‘2,4d’文件
[root@localhost ~]# sed ‘2,3d’ cut.txt
ID NAME LINUX MYSQL DOCKER
2 xlong 74 96 63
[root@localhost ~]# cat cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63

用sed 删除掉的文件内容并没有真的修改文件

追加、插入数据:sed ‘2[a|i]’ 文件名
[root@localhost ~]# sed ‘2a hello’ cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
hello
1 xbo 83 75 93
2 xlong 74 96 63
[root@localhost ~]# sed ‘2i hello’ cut.txt
ID NAME LINUX MYSQL DOCKER
hello
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63

a 在指定行后面追加,i 在指定行前面插入
[root@localhost ~]# sed '2i hello\

world’ cut.txt
ID NAME LINUX MYSQL DOCKER
hello
world
0 xcang 95 59 78
1 xbo 83 75 93
2 xlong 74 96 63

假如要追加多行,则需要用 \ 作为一行的结束,最后一行不需要。

整行替换数据:sed ‘2c No such person’
[root@localhost ~]# sed ‘2c No such person’ cut.txt
ID NAME LINUX MYSQL DOCKER
No such person
1 xbo 83 75 93
2 xlong 74 96 63

字符串替换:sed ‘ns/old/new/g’ 文件名
[root@localhost ~]# sed ‘4s/xlong/zeze/’ cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
2 zeze 74 96 63

将指定内容替换成空
[root@localhost ~]# sed ‘4s/[0-9]//g’ cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
1 xbo 83 75 93
xlong
sed 要进行多行操作时,用;或回车分隔。
[root@localhost ~]# sed ‘3s/^/#/;4s/[0-9]//g’ cut.txt
ID NAME LINUX MYSQL DOCKER
0 xcang 95 59 78
#1 xbo 83 75 93
xlong

上面我们做了很多操作,但是所有的操作都没有保存到源文件中,假如确定要修改此文档,请在sed 后面跟上-i 选项,但请一定要小心,(最好是先不带i 预先设置看下结果,然后再加上i选项)

2.4 sort 字符排序命令
2.4.1 sort 选项 文件名
-f 忽略大小写
-n 以数值型进行排序,默认使用字符串类型排序
-r 反向排序
-u 删除重复行(类似于下面的uniq)
-t 指定分隔符,默认分割符是制表符
-k n:指定使用第几列的内容进行排序,一般和-t结合使用
注意:sort 命令默认使用每行开头第一个字符进行排序
2.4.2 案例展示
[root@localhost ~]# sort pass.txt
Adm❌3:4:adm:/var/adm:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
root❌0:0:root:/root:/bin/bash
[root@localhost ~]#
[root@localhost ~]# sort -f pass.txt #忽略大小写
daemon❌2:2:daemon:/sbin:/sbin/nologin
Adm❌3:4:adm:/var/adm:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
root❌0:0:root:/root:/bin/bash
[root@localhost ~]#
[root@localhost ~]# sort -bf pass.txt #忽略大小写和行前空白
Adm❌3:4:adm:/var/adm:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
root❌0:0:root:/root:/bin/bash
[root@localhost ~]#
[root@localhost ~]# sort -t: -k 3 -n pass.txt #冒号分隔符,第三列,从小到大
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
Adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]#
[root@localhost ~]# sort -t: -k 3 -rn pass.txt #以数值方式反向排序,从大到小
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
Adm❌3:4:adm:/var/adm:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
bin❌1:1:bin:/bin:/sbin/nologin
root❌0:0:root:/root:/bin/bash

2.5 uniq取消重复行
uniq用来取消重复行,与sort -u 功能是类似的
格式:uniq 选项 文件名
-i 忽略大小写
-c 在关键词旁显示该关键词出现的次数(一般针对行)
需要注意的是,当重复行不连续时,uniq是不生效的,需要先排序,再执行
[root@localhost ~]# cat xxoo.txt
Linux 30
unix 20
windows 50
windows 50
Linux 30
windows 50
[root@localhost ~]# uniq xxoo.txt
Linux 30
unix 20
windows 50
Linux 30
windows 50
[root@localhost ~]# sort xxoo.txt | uniq
Linux 30
unix 20
windows 50
[root@localhost ~]# sort xxoo.txt | uniq -c
2 Linux 30
1 unix 20
3 windows 50
[root@localhost ~]# sort xxoo.txt | uniq -c | sort -rn
3 windows 50
2 Linux 30
1 unix 20

三、条件判断
3.1 按照文件类型进行判断

使用 [ ] 括号来进行判断,利用 $? 来检测判断结果
[root@localhost ~]# [ -e /tmp ] && echo yes || echo no
yes
[root@localhost ~]# [ -e /tmpe ] && echo yes || echo no
no

#注意 [ ] 中内容和括号之间有空格,我们结合之前所学的 && 和 || 实现
3.2 按照文件权限进行判断
测试:
[root@localhost ~]# ll xo.txt
-rw-r–r-- 1 root root 59 5月 11 14:46 xo.txt
[root@localhost ~]#
[root@localhost ~]# [ -r xo.txt ] && echo yes || echo no
yes
[root@localhost ~]#
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
[root@localhost ~]#
[root@localhost ~]# [ -u /usr/bin/passwd ] && echo yes || echo no
yes

3.3 两个文件之间进行比较

判断下我们的硬链接
[root@localhost ~]# ln xo.txt /tmp/
[root@localhost ~]#
[root@localhost ~]# [ /root/xo.txt -ef /tmp/xo.txt ] && echo yes || echo no
yes

3.4 两个整数之间进行比较
测试
[root@localhost ~]# [ 11 -ge 22 ] && echo yes || echo no
no
[root@localhost ~]#
[root@localhost ~]# [ 22 -ge 11 ] && echo yes || echo no
yes

3.5 字符串的判断
测试
[root@localhost ~]# name=shanchuan
[root@localhost ~]# age=""
[root@localhost ~]# unset sex
[root@localhost ~]#
[root@localhost ~]# [ -z “KaTeX parse error: Expected 'EOF', got '&' at position 9: name" ] &̲& echo yes || e…age” ] && echo yes || echo no
yes
[root@localhost ~]#
[root@localhost ~]# [ -z “$sex” ] && echo yes || echo no
yes

#字符为空和没有赋值都为空
[root@localhost ~]# a=123
[root@localhost ~]# b=456
[root@localhost ~]#
[root@localhost ~]# [ “ a " = = " a" == " a"=="b” ] && echo yes || echo no
no

3.6 多重条件判断
测试:逻辑与
[root@localhost ~]# a=100
[root@localhost ~]# [ -n “ a " − a " a" -a " a"a"a” -gt 150 ] && echo yes || echo no
no
[root@localhost ~]#
[root@localhost ~]# a=200
[root@localhost ~]# [ -n “ a " − a " a" -a " a"a"a” -gt 150 ] && echo yes || echo no
yes

逻辑非
[root@localhost ~]# a=100
[root@localhost ~]# [ -n “KaTeX parse error: Expected 'EOF', got '&' at position 6: a" ] &̲& echo yes || e…a” ] && echo yes || echo no
no

-n 变量不为空,则为真,加入!后,判断取反,所以变量为空才是真
注意:! 和 判断条件之间有个空格~~~

四、流程控制
4.1 if条件判断
4.1.1 单分支if条件语句

单分支条件语句比较简单,只需要一个判断条件,符合则执行,不符合则直接退出。
格式:
if [ 条件判断式 ];then
程序
fi
注意事项:
if 语句使用fi结尾,和一般语言使用大括号结尾不一样
[ 条件判断式 ] 就是使用test 命令进行判断,所以中括号和条件判断式之间必须有空格
then 后面跟符合条件后执行的程序,可以放在 [ ] 之后,加;隔开。也可以使用换行写入(用换行就不必写;了)
格式二:
if [ 条件判断式 ]
then
程序
fi
统计根分区使用率?
#!/bin/bash

rootused=KaTeX parse error: Undefined control sequence: \/ at position 16: (df -h | awk '/\̲/̲/{printf $5"\n"}’|cut -d% -f1)
if [ r o o t u s e d − g t 55 ] t h e n e c h o − e " r o o t u s e d − g t 55 rootused -gt 55 ] then echo -e "rootused -gt 55%;used: rootusedgt55]thenechoe"rootusedgt55rootused%"
fi

4.1.2 双分支if条件语句

格式:
if [条件判断式]
then
条件成立,执行的程序
else
条件不成立,执行的程序
fi

4.1.3 多分支if分支语句

格式:
if [条件判断式1]
then
条件判断式1成立,执行程序1
elif [条件判断式2]
then
条件判断式2成立,执行程序2
更多………
else
都不成立,则执行此程序
fi

练习:判断文件是什么类型的文件的脚本!

4.2 case分支语句
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case语句语法如下:
case $变量名 in
值1)
变量的值等于值1,则执行程序1
;;
值2)
变量的值等于2,则执行程序2
;;
省略多个分支…………
*)
变量的值都不匹配上面的值,则执行此程序
;;
esac

注意事项:
case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果值符合,则执行对应的程序,如果值不符,则依次比较下一个值。如果所有的值都不符合,则执行“)”(“”代表所有其他值)中的程序。
case 语句以case开头,以esac结尾(切记……)
每一个分支需要用;; 结束,注意是everyone!!!

练习:写一个源码apache的启动管理脚本

4.3 for循环
for循环是固定循环,循环次数是有限的次数,也叫计数循环。

语法一:
for 变量 in 值1 值2 值3 ……
do
程序
done

注:这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,依次类推。

练习:计算1+2+3+…+10的结果?

语法二:
for ((初始值;循环控制条件;变量变化))
do
程序
done

注:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;
循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;
变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。

练习:计算1+2+3+…+100的值?

4.4 while循环
只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

语法:
while [ 条件判断式 ]
do
程序
done
练习:还是1+2+3+…+100=?

4.5 until循环
until循环和while循环相反,只要条件判断式不成立,则一直循环,什么时候成立,什么时候结束循环

语法:
until [ 条件判断式 ]
do
程序
done

4.6 函数 function
语法:
function 函数名 () {
程序
}
练习:将1+2+3+…+n写成函数!

4.7 特殊流程控制语句
4.7.1 exit
系统中的exit是退出当前登录,但是在shell中则只是退出脚本,回到Linux命令行。
exit [ 值 ]
exit 退出时如果定义好了返回值,那么我们可以通过“$?”来查看

4.7.2 break
当程序执行到break 语句时,会结束当前的循环程序,执行循环程序后面的程序。

当break处在多层循环中时,可以通过break n的方式选择跳出的层数。

4.7.3 continue
continue则仅是结束当前循环程序中的本次循环(单次循环),然后继续进行下次循环。

同样,continue可以使用continue n的方式选择在多层循环中退出的层数,n的大小影响continue的退出层数。

第十二章:备份管理
Linux运维+云计算
版本:V1.0
数据备份是一个技术含量很低的操作,但是这个操作确是保证服务器数据完整性的重要步骤。事实证明,各大互联网公司出现数据丢失时,无一不是备份出现问题导致的。
一、哪些数据需要进行备份
1.1 Linux系统自带配置文件
/etc/目录下的众多常用配置文件,尤其是修改过后的配置文件
root及普通用户家目录下的相关配置文件(注意隐藏文件)
1.2 用户管理脚本及用户上传文件
各类管理服务器的脚本工具
用户家目录或者自定义目录下用户上传的重要文件
1.3 各类服务的运行日志文件
系统自带日志:/var/log/*
第三方软件日志: 比如/usr/local/apache2/logs/*
1.4 web服务器的网页及静态资源文件
Apache、Nginx、Tomcat等常见web服务器所分享的网页及静态资源文件
1.5 数据库内保存的数据
MySQL、Mariadb、Oracle等数据库保存的数据文件

二、常见备份策略
2.1 备份工具
命令:diff(patch)、cpio、cp、tar、zip、rsync、scp、dump、xfs_dump、mysqldump
工具:一般都是第三方开源软件,自行研究
参考因素:效率、安全性、稳定性
2.2 备份级别
同端备份:一般数据不是特别重要时,可以选择在同一操作系统内不同分区或磁盘上备份
多端备份:在同一地理区域内,实现多设备或多机备份,防止单个设备出现灾难性故障,方便快速恢复
异地备份:又称异地容灾备份,适合数据比较重要的情况,防止某一地理区域内出现灾难性故障
云端多重备份:多数据中心云端备份,异地容灾备份的升级版,但如果不是私有云,安全性需要考量

设备备份:磁轨备份,直接将整个磁盘设备复制,出错几率为0,恢复非常快。
2.3 备份时机
热备份:数据不断变化时备份,备份快,将所有数据变化的操作记录下来,或将新增内容备份下来
缺点:备份过程不能出错,否则恢复很难;需要时刻关注,一旦出现问题就是大量数据丢失
冷备份:数据停止变化时备份,俗称离线备份,安全度高,备份数据易恢复,速度较快
缺点:冷备份时需要停止数据变化;数据量较大时,备份到其他设备可能需要消耗较长时间
选择夜间或者凌晨备份,在服务器压力负载最低的时候进行备份,减少对服务器正常运行的影响
2.4 备份后的操作
检查备份策略是否正常执行
不定时测试备份的文件是否可以用于恢复

三、备份模式
此部分涉及到如何备份数据,因为进行数据备份时肯定需要消耗系统的资源,选择合适的模式可以降低对服务器运行的影响。
3.1 完整备份
这个最好理解,将所有要备份的内容完全备份一遍,若在两个时间点执行完整备份,即便数据没有任何变更,数据也照样会完整备份一遍,不会检查上次备份。

3.2 增量备份
先进行一次完整备份,然后周期性的备份新增的内容,这样每次仅备份新增内容,大大减少的备份数据量,提高了备份效率。但是每次备份都需要生成一个独立的增量备份文件,且所有备份之间的顺序关系不能搞混,否则恢复极为麻烦。

3.3 差异备份
差异备份与增量备份类似,都是先进行完整备份,然后将新增变化内容备份,不同的地方在于,差异备份每次对比的都是第一次完整备份,也就是说,差异备份的备份量会随着时间的增加不断增大,但即便如此也比每次都完整备份轻松许多,而且,差异备份恢复起来非常方便,仅需要第一次完整备份和最近一次的差异备份文件即可。

3.4 三种备份对比
完整备份 增量备份 差异备份
备份方法 备份所有内容 备份和上一次备份对比新增的内容 备份和上一次完整备份相比新增的内容
备份速度 最慢 最快 较快
恢复速度 最快(简单) 最慢(繁琐) 较快(较简单)
空间需求 最多 最少 较多
优势 最快最简单的恢复速度
仅需要最近一次完整备份就能恢复所有数据 较快的备份速度,除第一次完整备份外,所有增量备份都很快速
没有重复备份,空间需求量小 较快且较为简单的恢复速度(相比增量而言)
恢复时,仅需要最近一次完整备份和最近一次差异备份即可
劣势 空间需求量较大
备份文件大量重复 最慢的恢复速度,恢复步骤较为繁琐
恢复时需要先恢复最近一次完整备份,然后按顺序依次恢复增量备份内容 较慢的备份速度,会随着时间增加,增量备份消耗时间和空间越多
也存在重复备份文件

四:备份案例
4.1 tar 备份整个操作系统
[root@localhost ~]# tar -zcvpf /root-backup.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/media --exclude=/sys --exclude=/root-backup.tar.gz /

使用tar命令可以轻松实现指定内容备份,并且保留备份内容的权限归属等信息,可以使用指定的选项排除一些特定的目录,以免对备份造成影响:–exclude=
[root@localhost ~]# tar -zxvpf root-backup.tar.gz -C /

恢复时,同样使用tar命令,恢复完成后请先手动创建那些忽略掉的目录,并重启操作系统,当然如果SELinux开启的话,可能会有所影响。
4.2 数据备份脚本
#!/bin/sh
mkdir /home/temp
#创建一个临时文件
cp -a /home/data/* /home/temp
#数据存在data目录下,备份到temp目录下,所以先将数据拷过来
tar -zcPvf /home/data-$(date +%Y%m%d).tar.gz /home/temp
#将数据所在文件夹temp打包
rm -rf /home/temp/
#删除临时文件内容

find ./ -mtime +30 -name “*.tar.gz” -exec rm -rf {} ;
#删除该文件夹下超过30天的备份文件

该脚本可以结合定时计划任务,实现每天自动备份。
还有一些备份工具没有展示,比如rsync我们在网络服务中讲,mysqldump数据库阶段讲
另外,大家感兴趣可以自己研究下Clonezilla(再生龙)系统备份工具。

五、定时计划任务
Linux的crontab是用来定时执行程序的工具,并且crontab的服务crond是默认启动的,非常方便。
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
5.1 crontab命令
格式:crontab [-u user]
选项:
-e:用默认的vi编辑器编写计划任务规则
-r:删除掉编写好的计划任务
-l:查看所有的计划任务
5.2 时间循环周期格式

顺口溜:分时日月周
当分钟为 * 时表示每分钟都要执行指定程序,小时为 * 时表示每小时都要执行程序,其余类推
当分钟为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,小时为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推
当分钟为 */n 时表示每隔 n 分钟执行一次,小时为 */n 表示每隔 n 小时执行一次,其余类推
当分钟为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,小时为 a, b, c,… 时表示第 a, b, c…个小时要执行,其余类推
5.3 定时任务案例演示
每小时的整点执行一次 /bin/ls
0 * * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时的 0 分钟执行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 [email protected]
0 17 * * 1-5 mail -s “hi” [email protected] < /tmp/maildate

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分…执行 echo “hello earth”
20 0-23/2 * * * echo " hello earth "

5.4 脚本无法执行问题
如果我们使用 crontab 来定时执行脚本,无法执行,但是直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:
1、所有命令需要写成绝对路径形式。
2、在 shell 脚本开头使用以下代码:
#!/bin/sh
. /etc/profile
. ~/.bash_profile
3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得好几遍了生效,例如:
20 03 * * * . /etc/profile;/bin/sh /bash/test.sh

第十三章:系统启动管理
Linux运维+云计算
版本:V1.0

了解Linux的系统启动流程有利于排查系统启动异常的问题,解决启动故障,本章节我们来学习一下CentOS 7 和 6 系列的开机启动流程。

一、CentOS 6启动流程
1.1 开机加电自检
加电自检(英文:Power-OnSelf-Test=POST),是计算机硬件设备主板上的BIOS程序的一个功能,其作用是设备加电后检查所有设备是否可用,并且将最终检测记过通过显示器或LED设备显示出来,不过由于速度较快,我们很难感觉到,并且只要没有错误一般都会跳过显示。
1.2 磁盘分区表引导
通过BIOS确定引导哪一个存储设备后,则尝试引导该设备上的分区表,有可能是MBR也有可能是GPT,不管哪一个都将其中的代码加载到内存中,并运行起来。
1.3 grub菜单引导
grub是一个菜单引导程序,可以实现单系统或者多系统的选择功能,目前CentOS 6中仍旧使用grub来引导操作系统的内核。
扩展:grub的四个重要文件
第一个是stage1:安装在第1扇区,它负责加载存放于第2扇区的start程序。
第二个是stage1_5:stage1_5负责识别文件系统和加载stage2,所以stage1_5有多个,以支持不同文件系统的读取。在安装GRUB的时候,GRUB会根据当前/boot/分区类型,加载相应的stage1_5到第3扇区。stage1_5是由start加载的。
第三个是stage2:它负责显示启动菜单和提供用户交互接口,并根据用户选择或默认配置加载操作系统内核。同前两个文件不同,stage2是存放在磁盘上/boot/grub下。
第四个是menu.lst(/boot/grub/grub.conf的链接):grub.conf是一个基于脚本的文本文件,其中包含菜单显示的配置和各个操作系统的内核加载配置。GRUB根据grub.conf显示启动菜单,提供同用户交互界面。

default:定义默认启动的操作系统
timeout:定义选择操作系统菜单的等待时间
splashimage:指定我们选择kernel或操作系统菜单后面那张图片。
hiddenmenu:表示隐藏选择操作系统的菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。
title identify:指定一个操作系统,linux中可以有多个title;identify是这个操作系统的识别符,可以随意写。
root:用于指定grub所能识别的根,而不是根文件系统。
kernel:用于指定系统的内核文件的位置
initrd:帮助kernel完成系统的启动,例如加载根文件系统所在分区的驱动等。如果kernel本身有相应强大的功能,则不需要initrd
password:设定密码。放在title外表示进入操作系统等待菜单的编辑模式需要密码,而放在title内表示启动对应的操作系统需要密码,密码可以是明文或是用MD5进行加密过的。可以防止其他人编辑菜单进入单用户模式启动我们的系统
1.4 加载内核
将菜单中选择的内核加载到内存中,展开并启动一个微型操作系统
1.5 运行init进程
使用加载起来的内核程序执行Linux的第一个进程init进程,即初始进程{系统守护进程}
1.6 加载系统运行级别
加载/etc/inittab文件,确定其对应的系统运行级别,然后启动完整的操作系统
系统运行级别:/etc/inittab中runlevel分为0-6 ;7个等级
0:关机,halt
1:单用户模式(sigle user),root用户,无须认证;维护模式;
2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式(multi user),完全功能模式;文本界面;
4:预留级别:目前无特别使用目的,但习惯同3级别使用;
5:多用户模式(multi user),完全功能模式,图形界面;
6:重启模式,reboot

1.7 初始化系统
加载/etc/rc.sysinit文件完成初始化,主要包括设置主机名,设置IP等操作
1.8 根据启动级别开启服务
根据第六步确定的系统运行级别,加载对用目录下的服务脚本,来决定该级别下那些服务运行和启动。
目录:/etc/rcN.d/
1.9 登录系统
显示登陆提示,然后登陆系统

小实验:

  1. grub 加密:
    password --md5 1 1 1UrprW0$UzN7ozenwICzcPCQgiFts1
    这串密码可以通过命令grub-md5-crypt生成。
    a.密码添加在title前面
    将密码放在这个位置时,在选择grub菜单时就需要输入密码了。
    b.密码添加在title后面
    密码在这个位置时,选择完操作系统后,在进入系统引导时才需要输入密码。
  2. root密码找回
    a.重启系统后出现GRUB界面在引导装载程序菜单上,用上下方向键选择你忘记密码的那个系统键入“e” 来进入编辑模式。
    b.接下来你可以看到如下图所示的画面,然后你再用 上下键选择最新的内核(这里是第二行,kernel…),然后继续按“e”键。
    c.然后在编辑界面rhgb quiet后面加“空格”,然后键入“single”,或者直接输入数字的“1”并回车确定。
    d.回车后,按“b”键启动进入单用户模式,在这里修改root的密码。
    二、CentOS 7启动流程
    前两个步骤一致,不再重复了
    2.3 grub2引导菜单加载
    grub2的功能类似于grub,不过配置文件进行了重大调整
    grub2采用了模块化设计,使得grub2核心更加精炼,使用更加灵活,同时也就不需要像GRUB那样分为stage1,stage1_5,stage2这样三个阶段了。
    GRUB2和GRUB相比具有如下一些新特征:
    无 stage1 stage1.5 stage2
    配置文件采用新语法,支持脚本,假如新的命令,配置文件名为 grub.cfg
    分区号不再从 0开始,而是从 1开始
    支持更多到文件系统,如:ext4、hfs、ntfs,并可以直接从 lvm和raid中读取文件
    grub2有更可靠的方法在磁盘上有多系统时发现文件和目标内核,可以用命令发现系统设备号或者UUID。
    引入了设备模块,使得 core 镜像保持更小到尺寸
    在启动时没有选择菜单的话,按住shift即可强制显示菜单
    2.4 加载内核
    根据配置文件的指向,加载对应内核文件
    2.5 运行第一个进程systemd
    运行CentOS 7的第一个程序,systemd,然后使用systemd完成对后续的操作
    2.6 确定系统的运行级别
    确定操作系统的运行级别,此处有别于CentOS 6当中方案
    新版本的运行级别都定义在/lib/systemd/system中:
    [root@localhost grub2]# ls -l /lib/systemd/system/runlevel*.target
    lrwxrwxrwx. 1 root root 15 11月 19 17:34 /lib/systemd/system/runlevel0.target -> poweroff.target
    lrwxrwxrwx. 1 root root 13 11月 19 17:34 /lib/systemd/system/runlevel1.target -> rescue.target
    lrwxrwxrwx. 1 root root 17 11月 19 17:34 /lib/systemd/system/runlevel2.target -> multi-user.target
    lrwxrwxrwx. 1 root root 17 11月 19 17:34 /lib/systemd/system/runlevel3.target -> multi-user.target
    lrwxrwxrwx. 1 root root 17 11月 19 17:34 /lib/systemd/system/runlevel4.target -> multi-user.target
    lrwxrwxrwx. 1 root root 16 11月 19 17:34 /lib/systemd/system/runlevel5.target -> graphical.target
    lrwxrwxrwx. 1 root root 13 11月 19 17:34 /lib/systemd/system/runlevel6.target -> reboot.target
    修改Linux的运行级别:
    [root@localhost ~]#systemctl set-default *.target
    2.7 初始化系统
    加载指定文件完成初始化:/usr/lib/systemd/system/sysinit.target
    2.8 并行启动各种服务
    /usr/lib/systemd/system
    /etc/systemd/system
    通过上述两条加载所有需要的软件程序
    2.9 登陆系统
    进入登录等待页面

三、CentOS 6 和 CentOS 7 启动流程对比
3.1 启动过程对照关系:
CentOS 6 CentOS 7
开启电源 开启电源
BIOS自检 BIOS自检
分区表引导 分区表引导
GRUB菜单(选取内核、单用户模式) GRUB2菜单(救援模式resuce.target)
加载内核 加载内核
运行第一个进程init 运行第一个进程systemd
读取运行级别
/etc/inittab 读取运行级别
/etc/systemd/system/default.target
初始化
/etc/rc.d/rc.sysinit(设置主机名,ip等) 初始化
/usr/lib/systemd/system/sysinit.target
根据运行级别运行脚本/etc/rc.d/rcN.d 并行启动服务
启动mingetty,显示login界面 启动getty.target,显示login界面

3.2 运行级别对比

第十四章:服务启动管理
Linux运维+云计算
版本:V1.0

在CentOS 6当中系统采用的管理器是system v,其致命缺点就是无法并行启动服务,主要原因是,所有服务的管理都采用脚本管理,使系统启动服务方面效率极差。
CentOS 7中使用了全新的服务和进程管理工具:systemd,将权限进一步集中了起来,在服务管理方面最大的变化就是支持服务和进程的并行启动;同时systemd还具有日志管理等功能。
本章节就来讲解一下systemd的服务、启动项和日志管理功能。

一、服务、系统状态的查看
1.1 查看系统所有安装的服务项
[root@localhost ~]# systemctl list-unit-files --type=service
使用 PageUp或PageDown翻页,查看完毕后按q退出。
1.2 查看系统所有运行的服务项
[root@localhost ~]# systemctl list-units --type=service
如果看到某个服务项前面有一个红点,说明该服务存在问题,请进行排查。
使用 PageUp或PageDown翻页,查看完毕后按q退出。
1.3 查看系统所有开机自启动的服务项
[root@localhost ~]# systemctl list-unit-files --type=service | grep enabled
1.4 查看指定服务项状态
[root@localhost ~]# systemctl status <服务项名称>
执行命令之后,系统会显示该服务项的状态、是否已激活、描述以及最后十条日志。
如果服务项前面有一个红点,说明该服务存在问题,请根据日志进行排查。
例如:
查看 httpd 服务状态
[root@localhost ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2020-05-19 22:28:51 CST; 2 days left
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 7073 (httpd)
Status: “Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec”
CGroup: /system.slice/httpd.service
├─7073 /usr/sbin/httpd -DFOREGROUND
├─7074 /usr/sbin/httpd -DFOREGROUND
├─7075 /usr/sbin/httpd -DFOREGROUND
├─7076 /usr/sbin/httpd -DFOREGROUND
├─7077 /usr/sbin/httpd -DFOREGROUND
└─7078 /usr/sbin/httpd -DFOREGROUND

5月 22 22:28:51 localhost.localdomain systemd[1]: Starting The Apache HTTP Server…
5月 22 22:28:51 localhost.localdomain httpd[7073]: AH00558: httpd: Could not reliably determine the server’s fully qualifie…essage
5月 22 22:28:51 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
1.5 查看服务项的依赖关系
[root@localhost ~]# systemctl list-dependencies <服务项名称>
1.6 查看出错的服务
[root@localhost ~]# systemctl list-units --type=service --state=failed
1.7 清除服务项的错误状态
[root@localhost ~]# systemctl reset-failed <服务项名称>
1.8 查看系统启动耗时
[root@localhost ~]# systemd-analyze
1.9 查看各项服务启动耗时
[root@localhost ~]# systemd-analyze blame | grep .service
二、服务的管理
2.1 启动服务
[root@localhost ~]# systemctl start <服务项名称>
2.2 停止服务
[root@localhost ~]# systemctl stop <服务项名称>
2.3 重启服务
[root@localhost ~]# systemctl restart <服务项名称>
2.4 重新读取配置文件
如果该服务不能重启,但又必须使用新的配置,这条命令会很有用。
[root@localhost ~]# systemctl reload <服务项名称>
2.5 使服务开机自启动
[root@localhost ~]# systemctl enable <服务项名称>
2.6 使服务不要开机自启动
[root@localhost ~]# systemctl disable <服务项名称>
2.7 禁用服务
可以防止服务被其他服务间接启动,也无法通过start或restart命令来启动服务。
[root@localhost ~]# systemctl mask <服务项名称>
2.8 启用(解除禁用)服务
仅针对于已禁用的服务。
[root@localhost ~]# systemctl unmask <服务项名称>
2.9 重新读取所有服务项
修改、添加、删除服务项之后需要执行以下命令。
[root@localhost ~]# systemctl daemon-reload
三、Target 和 Runlevel 的关系
3.1 基本概念
Systemd 中的 target 可以理解为系统的“状态点”。
一个target里面一般包含多个unit,简单点说就是包含需要启动的服务组。
启动了某个target就意味将系统置于某个“状态点”。
Target可以与传统的 Runlevel 相对应,它们的映射关系如下表:

需要注意的是,Runlevel相对应的Target一定不能够同时启动。
当设置了某个服务自启动的时候,其实就是在往某个target的.wants目录中添加服务项的符号链接而已(默认添加到/etc/systemd/system/multi-user.target.wants)。
3.2 查看系统默认的启动级别
[root@localhost ~]# systemctl get-default
3.3 切换到某个启动级别
[root@localhost ~]# systemctl isolate <启动级别对应的 target 名>
例如
切换到图形界面
[root@localhost ~]# systemctl isolate graphical.target
3.4 设置系统默认的启动级别
[root@localhost ~]# systemctl set-default <启动级别对应的 target 名>
四、日志管理
4.1 开启日志持久化存储
Systemd默认只会把日志存储在内存中,一旦重启系统日志将全部丢失。所以强烈建议打开该功能。
去掉/etc/systemd/journald.conf这个文件内Storage=这一行前面的#号注释,然后将等号后面的内容改为persistent。
保存配置文件之后重启一下日志记录服务即可。
[root@localhost ~]# systemctl restart systemd-journald.service
4.2 查看自从本次开机后所有的日志信息
[root@localhost ~]# journalctl [-e] [-f]
-e 表示输出之后跳转到末行
-f 表示实时滚动显示
当没有使用-f时,使用PageUp或PageDown翻页,查看完毕后按q退出。
4.3 查看特定 Unit (服务)所有的日志信息
[root@localhost ~]# journalctl [-e] [-f] -u
当没有使用-f时,使用PageUp或PageDown翻页,查看完毕后按q退出。
4.4 查看特定时间点内所有的日志信息
[root@localhost ~]# journalctl --since=“yyyy-MM-dd hh:mm:ss” --until=“yyyy-MM-dd hh:mm:ss”
使用PageUp或PageDown翻页,查看完毕后按q退出。
例如
查看2020年5月20日09:30:00至2020年5月20日10:00:00之间的所有日志
[root@localhost ~]# journalctl --since=“2020-05-20 09:30:00” --until=“2020-05-20 10:00:00”
4.5 查看日志当前占用的磁盘空间
[root@localhost ~]# journalctl --disk-usage
4.6 修改日志最大占用的磁盘空间
去掉/etc/systemd/journald.conf这个文件内SystemMaxUse=这一行前面的#号注释,然后在等号后面填上数值即可。
例如
修改日志最大占用的磁盘空间为 50M
SystemMaxUse=50M
保存配置文件之后重启一下日志记录服务即可。
[root@localhost ~]# systemctl restart systemd-journald.service

你可能感兴趣的:(linux,apache,nginx,centos,运维)