Linux系统从入门到精通!全网最全笔记!

# 第0章 Linux基础入门

## 什么是计算机

### **计算机的组成:**

- **控制器**,是整个计算机的中枢神经,根据程序要求进行控制,协调计算机各部分工作及内存与外设的访问等。

- **运算器**,功能是对数据进行各种**算术运算**和**逻辑运算**。

- **存储器**,功能是存储程序、数据和各种信号、命令等信息。

- **输入设备**,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。常见的输入设备有键盘、鼠标等。

- **输出设备**,它把计算机计算后的信息输出出来。常用的输出设备有显示终端、打印机、绘图仪等。

![image-20220303114909360](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20220303114909360.png)

### 计算机的功能:

- 接收输入设备的指令和数据,经过cpu的数据和逻辑运算处理产生有用的信息存储起来或者输出到屏幕上。

- 那么我们的计算机所接受到的指令和数据都是什么样的呢?

- 其实我们的计算机只认识0,1代码。早期对计算机的全部操作都是采取人工操作方式进行的,早期的操作方式是由纸带或卡片打孔和没打孔来代替0和1输入计算机来实现一些功能的,就相当于是直接使用机器语言让计算机工作。但是使用机器语言去操控计算机有几个缺点:
  - 需要了解机器语言。
  - 需要了解所有硬件的相关功能函数。因为你的程序必须要写给机器看,你就得去参考机器本身的功能,然后针对该功能去编写程序代码。例如你要让DVD影片能够放映,那就得要参考DVD光驱的硬件信息。看参考手册是很费劲的。
  - 程序不具有可移植性。每个CPU都有独特的微指令集,同样,每个硬件都有其功能函数。
  -  程序具有专一性。因为这样的程序必须要针对硬件功能函数来编写,如果已经开发了一个浏览器程序,想要再开发文件管理程序时,还得要从头参考硬件的功能函数来继续编写。

- 为了解决这几个问题,计算机科学家就设计出一种让人类看得懂的程序语言,然后创造一种“编译器”来将这些人类写的程序语言翻译成机器能看懂的机器码。这样一来我们修改与编写程序就变得容易多了。目前常见的编译器有C,C++,JAVA等。

- 但是,在这样的环境下我们还得要考虑整体的硬件系统来设计程序。举例来说:当你需要将运行的数据写入内存中,你就得要自行分配一个内存块出来让自己的数据能够填上去,所以你还得要了解到内存的地址是如何定位的。为了要克服硬件方面老是需要重复编写句柄的问题,所以就有了操作系统。

## 操作系统简介

### **操作系统是什么**?

- 操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,向用户提供系统设备接口及使用界面,是配置在计算机硬件上的第一层软件,任何其它软件都必须在操作系统的支持下才能运行。

### 操作系统功能

#### 功能:

- 操作系统的主要工作是由操作系统内核实现的,操作系统内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用的接口(应用编程接口API,由操作系统实现提供的所有系统调用所构成的集合,是应用程序和系统之间的接口)呈现给用户。

#### 组成:

- 宏观:

image-20230220094154613

- 微观

image-20230220093407849

#### **操作系统内核的功能**

- 系统调用接口:程序员通过该接口与内核进行通信

- 进程管理:计算机可能同时有很多的工作在等待CPU运算处理,内核这个时候必须要能够控制这些工作,让CPU的资源做有效的分配才行。

- 内存管理:控制整个系统的内存管理,系统所有的程序代码与数据都必须要先存放在内核当中。通常内核会提供虚拟内存的功能,当内存不足时可以提供内存交换的功能。

- 文件系统管理 :例如数据的输入和输出等的工作,还有不同文件格式的支持等。

- 设备驱动:硬件的管理是内核的主要工作之一,设备的驱动程序就是内核管理着硬件的代码,设备的驱动程序可以使硬件准备好工作,时刻等待着程序的调用。好在目前都有所谓的“可加载模块”功能,可以将驱动程序编辑成模块,就不需要重新编译内核。

### 常见的操作系统

- UNIX、Linux类、MacOS、Windows类、iOS、Android、ChromeOS等等

## Linux 入门

### 开源共享精神

- 开源软件的特点就是把软件程序与源代码文件一起打包提供给用户,让用户在不受限制地使用某个软件功能的基础上还可以按需进行修改,或编制成衍生产品再发布出去。
- 用户具有使用自由、修改自由、重新发布自由以及创建衍生品的自由。这也正好符合了黑客和极客对自由的追求,因此国内外开源社区的根基都很庞大,人气也相当高。

#### 开源软件最重要的特性

- 低风险:使用闭源软件无疑把命运交付给他人,一旦封闭的源代码没有人来维护,你将进退维谷;而且相较于商业软件公司,开源社区很少存在倒闭的问题。
- 高品质:相较于闭源软件产品,开源项目通常是由开源社区来研发及维护的,参与编写、维护、测试的用户量众多,一般的bug还没有等爆发就已经被修补。
- 低成本:开源工作者都是在幕后默默且无偿地付出劳动成果,为美好的世界贡献一份力量,因此使用开源社区推动的软件项目可以节省大量的人力、物力和财力。
- 更透明:没有哪个笨蛋会把木马、后门等放到开放的源代码中,这样无疑是把自己的罪行暴露在阳光之下。

- 但是,如果开源软件为了单纯追求“自由”而牺牲程序员的利益,这将会影响程序员的创造激情,因此世界上现在有60多种被开源促进组织(Open Source Initiative)认可的开源许可协议来保证开源工作者的权益。
- 对于那些只知道一味抄袭、篡改、破解或者盗版他人作品的不法之徒,终归会在某一天收到法院的传票。
- 对于准备编写一款开源软件的开发人员,也建议先了解一下当前最热门的开源许可协议,选择一个合适的**开源许可协议**来最大限度保护自己的软件权益。

#### 著名的开源许可协议

- **GNU GPL**(**GNU General Public License**,**GNU**通用公共许可证):只要软件中包含了遵循GPL协议的产品或代码,该软件就必须也遵循GPL许可协议且开源、免费,因此这个协议并不适合商用软件。遵循该协议的开源软件数量极其庞大,包括Linux系统在内的大多数的开源软件都是基于这个协议的。GPL开源许可协议最大的4个特点如下所示。 
  - 复制自由:允许把软件复制到任何人的电脑中,并且不限制复制的数量。
  - 传播自由:允许软件以各种形式进行传播。
  - 收费传播:允许在各种媒介上出售该软件,但必须提前让买家知道这个软件是可以免费获得的;因此,一般来讲,开源软件都是通过为用户提供有偿服务的形式来盈利的。
  - 修改自由:允许开发人员增加或删除软件的功能,但软件修改后必须依然基于GPL许可协议授权。

image-20230220111118382

- **BSD**(**Berkeley Software Distribution**,伯克利软件发布版)许可协议:用户可以使用、修改和重新发布遵循该许可的软件,并且可以将软件作为商业软件发布和销售,前提是需要满足下面3个条件: 
  - 如果再发布的软件中包含源代码,则源代码必须继续遵循BSD许可协议。
  - 如果再发布的软件中只有二进制程序,则需要在相关文档或版权文件中声明原始代码遵循了BSD协议。
  - 不允许用原始软件的名字、作者名字或机构名称进行市场推广

image-20230220111215078

- **Apache**许可证版本(**Apache License Version**)许可协议:在为开发人员提供版权及专利许可的同时,允许用户拥有修改代码及再发布的自由。该许可协议适用于商业软件,现在热门的Hadoop、Apache HTTP Server、MongoDB等项目都是基于该许可协议研发的,程序开发人员在开发遵循该协议的软件时,要严格遵守下面的4个条件: 
  - 该软件及其衍生品必须继续使用Apache许可协议。
  - 如果修改了程序源代码,需要在文档中进行声明。
  - 若软件是基于他人的源代码编写而成的,则需要保留原始代码的协议、商标、专利声明及其他原作者声明的内容信息。
  - 如果再发布的软件中有声明文件,则需在此文件中标注Apache许可协议及其他许可协议。

image-20230220111255895

- **MPL**(**Mozilla Public License**,**Mozilla**公共许可)许可协议:相较于GPL许可协议,MPL更加注重对开发者的源代码需求和收益之间的平衡。

- **MIT**(**Massachusetts Institute of Technology**)许可协议:目前限制最少的开源许可协议之一,只要程序的开发者在修改后的源代码中保留原作者的许可信息即可,因此普遍被商业软件所使用。
- image-20230220111548074

### Linux的诞生

#### Multics计划

- 上世纪六十年代,人们还在用批处理计算机,也就是一次性给一批任务到计算机,然后等待结果,中途不能和计算机进行交互,而且准备作业需要耗费大量时间。
- 于是1965年,贝尔实验室(Bell),麻省理工学院(MIT)和通用电气(GE)准备联手开发“分时多任务处理系统”,即300台以上终端机可以同时连接一台大型计算机进行作业,并取名为Multics(Multiplexed Information and Computing System,多路信息计算系统)。
- 但由于项目进度落后,资金短缺,1969年,贝尔实验室放弃了这个项目,决定退出(后来Multics成功开发完成,尽管没有再被重视)。

#### Unix的诞生与打飞机游戏

- 调回到贝尔实验室的工程师看到费时的批处理机器,十分怀念先进的Multics。
- 一位工程师Ken Thompson在研发Multics的时候,写了一个叫太空大战(SpaceTravel),是飞机发射子弹那种类型的游戏,然而这个游戏只能运行在Multics上面,他很想要移植这个游戏继续玩。
- 1969年8月,Thompson在库房发现了一台闲置的PDP-7,刚好此时休假并且妻儿都去加利福尼亚探亲度假去了,经过四个星期的努力,用BCPL(Basic Combined Programming Language,基本组合编程语言)汇编语言编写了一组内核程序,还包括内核工具程序,以及一个小的文件系统。
- 完成之后,Thompson激动地把身边的同时叫过来,让他们来玩他的游戏。由于这个系统是由Multics简化而来,同事们就戏称这个系统为"UNiplexed Information and Computing Service”,即没路信息计算系统,缩写为Unics,取其谐音Unix。
- 这时已经是1970年了,于是就将1970年定为Unix元年,现代计算机的计时也就是这个时候开始的。

#### Unix的发展

- Unix实在太好用了,这套系统在Bell实验室广为流传。但Unix是用汇编语言写的,高度依赖硬件,于是Thompson和Dennis Ritchie合作准备用更高级的语言改写,提高可移植性。
- Thompson改进了BCPL,称为B语言,然而这套语言在内存方面有限制,一筹莫展。又和Ritchie尝试了Pascal,发现编译出来的内核性能并不好。最终Ritchie决定再对B语言进行改进,成为了大名鼎鼎的C语言,重新改写了Unix。
- 1974年7月,Bell实验室公开了Unix,引起了学术界的广泛讨论,并大量应用于教育目的。1978年学术界老大伯克利大学,推出了以Unix第六版为基础并加入改进的新Unix,并命名为BSD(Berkeley Software Distribution伯克利分发版),于是Unix的分支BSD系列就诞生了。
- 由于Unix的高度可移植性与强大的性能,加上当时并没有版权的纠纷,所以让很多商业公司开始了Unix操作系统的开发。
- 然而当时Bell属于AT&T,AT&T被《谢尔曼反托拉斯法》规定了不能销售除了电话机电报机等之外的商品,后来随着AT&T的分解,Bell可以卖出Unix了,第七版Unix明确提出“不可对学生提供源码”,Unix走向了商业化。

#### Minix操作系统

- Unix进行了商业化,教师们都用不起了,高昂的授权费导致很多大学停止了对Unix的研究。
- 1987年,身为ACM和IEEE两会资深会员的荷兰数学与计算机科学系统教授Andrew S. Tanenbaum开发了Minix操作系统,是Unix的缩小版,用于学生学习操作系统原理,很多技术大牛希望改进Minix,但遭到了AST教授的丑拒,他认为Minix就是为了教学,让学生一学期学完,并不想被加入杂乱的东西。

#### GNU计划

- Richard M.Stallman看不惯版权收费,于1984年创立自由软件体系GNU(Gun is Not Unix),拟定了普遍公用版权协议(General Public License,GPL),所有GPL协议下的自由软件都遵循着Copyleft(非版权)原则:自由软件允许用户自由拷贝、修改和销售,但是对其源代码的任何修改都必须向所有用户公开 。
- GNU希望开发一个类似UNIX并且是自由软件的完整操作系统——GNU系统。
- 到90年代初,GNU项目开发出许多高质量的免费软件,包括emacs编辑器、bash shell程序、gcc系列编译程序、gdb调试程序。

#### POSIX标准

- POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发的一簇标准,该标准是基于现有的UNIX 实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植和运行。

#### Linux终于诞生了

- 此时,IBM公司开发的MS-DOS操作系统、Apple公司开发的Mac操作系统,Unix操作系统,Minix操作系统全都要收费。
- GNU尽管已经开发出最受期盼的GNU C编译器,开发的操作系统却进度缓慢,渴求诞生一款自由软件操作系统来证明自己存在的价值。
- 与此同时,芬兰赫尔辛基大学的在校生Linus Benedict Torvalds(林纳斯·本纳第克特·托瓦兹)利用圣诞的压岁钱和贷款购买了一台386兼容电脑,并从美国邮购了一套Minix系统软件,在等待邮寄到达的期间,Linus认真学习了有关Intel 80386的硬件知识。
- 为了能通过Modem拨号连接到学校的主机上,他使用汇编语言并利用80386CPU的多任务特性编制出了相关程序。甚至为了将老式电脑的软件复制到新电脑上,为一些硬件编写了驱动程序。
- Linus逐渐认识到了Minix的诸多限制,产生了自己编写一个新的操作系统的想法。1991年4月,Linus花费了全部时间研究Minix-386系统,并尝试移植GNU的gcc、bash、gdb到新系统上。
- 1991年4月13日,Linus在comp.os.minix上发布信息说自己成功将bash移植到了Minix上,而且已经爱不释手,离不开这个shell软件了。
- 1991年7月3日,Linus在comp.os.minix上透露了正在进行Linux系统的开发,并已经开始考虑POSIX的兼容了。
- 1991年8月25日,Linus在comp.os.minix上发布了“What would you like to see in minix?”,透露出正在开发一个免费的386操作系统,新开发的系统会移植bash和gcc,并且声明他开发的操作系统没有用一行Minix的源代码。
- 1991年10月5日,Linus在comp.os.minix上发布消息,正式向外宣布Linux内核诞生(Free minix-like kernel sources for 386-AT)。Linux遵循GPL协议,也给GNU运动送上了一份最好的礼物。Linux提供内核,GNU提供外围软件,GNU/Linux就成了密不可分的体系。

- 此时时间线为1991年,他才22岁,如果说 Linux 是为了“自私”目的诞生的产物,想必很多人都会先嗤之以鼻。但其实 Linux 诞生之初,确实只是为了满足个人需求。

image-20230224151736419

### Linux的特点

- Linux因其高效率、稳定、易于裁剪、应用广等优势,成为了当今中高端服务器的主要操作系统,并且处于一个不可替代的地位。
- Linux与windows的对比

image-20230220111752511

- Linux成为开源软件的代名词

  - 陪伴互联网时代的7大开源软件
    - 加密互联网的安全协议OpenSSL
    - 数据仓库大王--MySQL
    - 万能开发工具Eclipse
    - 互联网的门卫Apache
    - 大数据的心脏Hadoop
    - 互联网的排版引擎WebKit

- Linux在服务器领域发展良好,尤其在政府、金融、农业、交通、电信等国家关键领域已经形成了大规模的市场应用

- Linux在桌面领域的发展良好,国内如中标麒麟Linux、红旗Linux、深度Linux等系统软件厂商都推出的Linux桌面操作系统,另外SUSE、Ubuntu也相继推出了基于Linux的桌面系统,特别是Ubuntu Linux,已经积累了大量社区用户

- Linux的低成本、强大的定制功能以及良好的移植性能,使得Linux在嵌入式系统方面也得到广泛应用,目前Linux以广泛应用于手机、平板电脑、路由器、电视和电子游戏机等领域。

- Linux在云计算/大数据领域的发展互联网产业的迅猛发展,促使云计算、大数据产业的形成并快速发展

- 结论:linux具有:
  - 源代码开放 
  - 真正的多用户多任务 
  - 完全兼容POSIX标准 
  - 强大的可移植性 
  - 丰富的网络功能
  - 良好的用户界面 
  - 可靠的系统安全
  - 高度的稳定性 

### Linux的应用领域

- 服务器领域
- 桌面应用领域 
- 嵌入式系统
- 集群、虚拟化、云计算、大数据平台基石

## 常见的Linux版本介绍

### 发行版本构成:

- Linux系统内核( Kernel ):是由Linux Torvalds 负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务的系统核心程序
- 内核功能组成:进程管理、定时器、中断管理、内存管理、模块管理)虚拟文件系统接口、文件系统、设备驱动程序、进程间通信、网络管理、系统启动等操作系统功能的实现
- Linux 内核下载:https://www.kernel.org/
- Linux发行套件系统:将Linux系统的内核与外围实用程序(Utilities)软件和文档包装起来,并提供一些系统安装界面和系统配置、设定与管理工具,就构成了一种发行版本
- Linux的发行套件系统其实就是Linux核心再加上外围的实用程序组成的一个大软件包
  根据GPL准则,市面流行的发行套件系统虽然都源自一个内核,并且都有自己各自的贡献,但都没有自己的版权,如:

image-20230220112130343

### 发行版本介绍:

#### RHEL

- RedHat Enterprise Linux)(简称为RHEL):全球最大的开源技术厂商,全世界内使用最广泛的Linux发布套件,提供性能与稳定性极强的Linux套件系统并拥有完善的全球技术支持。

image-20230220112241908

- REHL在国内大多数企业的服务器上使用,REHL可以免费下载使用,但后续系统部署、升级、维护、故障等都需要购买授权协议即购买服务,在学习Linxu中使用RHEL,会出现一系列的小问题,如YUM工具不免费等问题
- Red hat Linux
  - 最新版:Red Hat Enterprise Linux 9.1
  - 派生版: CentOS 、Scientific Linux、Oracle Linux

#### Centos

- 社区企业操作系统(Centos):最初是将红帽企业系统“重新编译/发布”给用户免费使用,Centos系统与REHL系统完全一致。
- 在没有RHEL授权的情况下使用Centos系统更加方便
- 国内使用Centos系统企业越来越多
- 可以使用RHEL不能使用的小工具,如YUM下载.
- 现今Centos系统已经被Red Hat公司收购,且依然免费

image-20230220112500913

#### 红帽用户桌面版(Fedora)

- 最初由红帽公司发起的桌面版系统套件(目前已经不限于桌面版)
- 用户可免费体验到最新的技术或工具,而功能成熟后加入到RHEL中。
- Fedora也是RHEL系统新技术的试验田

image-20230220112627792

#### 基于Debian的桌面版—Ubuntu(乌班图)

- Ubuntu是一款基于Debian派生的产品,对新款硬件具有极强的兼容能力。
- 普遍认为Ubuntu与Fedora都是极其出色的LINUX桌面系统

image-20230220112545749

#### 中标麒麟

- 2010年由两大国产操作系统——民用的“中标Linux” 和解放军研制的“银河麒麟”操作系统,在上海宣布合并
- 特点
  - 安全性较高
  - 完善的中文支持
  - 支持农历查询
  - 安全的云服务
  - 广泛应用于中国企业及政府部门

image-20230220112900994

## Linux认证

### 红帽Linux认证

#### 简介

- 红帽公司成立于1993年,总部位于美国,分支机构遍布全球,是全球首家收入超10亿美元的开源公司。红帽公司作为全球领先的开源和Linux系统提供商,其产品已被业界广泛认可并使用,尤其是RHEL系统在业内拥有超高的Linux系统市场占有率。
- 当前,红帽公司除了提供操作系统之外,还提供了虚拟化、中间件、应用程序、管理和面向服务架构的解决方案。
- 关注国际时事或炒股的同学一定很熟悉标准普尔500指数,在标准普尔公司选择的这500支股票中,由400支工业股票、20支运输业股票、40支公共事业股票以及40支金融业股票共同组成,它们联合反映了美国国家的经济情况,其中红帽公司就在其中(代码:RHT)。
- 红帽认证是由红帽公司推出的Linux认证,该认证被认为是Linux行业乃至整个IT领域价值最高的认证之一。
- 红帽认证考试全部采用上机形式,在考察学生基础理论能力的同时还考察了实践动手操作和排错能力。红帽公司针对红帽认证制定了完善的专业评估与认证标准,其认证主要包括红帽认证系统管理员(RHCSA)、红帽认证工程师(RHCE)与红帽认证架构师(RHCA)。
- 2014年6月10日,红帽公司在发布新版红帽企业版系统(RHEL  7)的当天即在红帽英文官网更新了其对培训政策的调整,原先的红帽认证技术专家(RHCT)被RHCSA替代,彻底退出历史舞台。考生只有先考试通过RHCSA认证后才能考取RHCE认证(一般是在一天的上下午分别完成)。

#### 认证构成

image-20230220113628189

#### 名称释义    

- RHCSA英文全称:Red Hat Certified System Administrator ,中文全称:红帽认证系统管理员
- RHCE英文全称:Red Hat Certified Engineer,中文全称:红帽认证工程师
- RHCA英文全称:Red Hat Certified Architect,中文全称:红帽认证架构师
- RHCSS英文全称:Red Hat Certified Security Specialist,中文全称:红帽认证安全专家
- RHCDS英文全称:Red Hat Certified Datacenter Specialist ,中文全称:红帽认证数据中心专家
- RHCVA英文全称:Red Hat Certified Virtualization Administrator,中文全称:红帽企业虚拟化管理
- 红帽 OpenStack 认证工程师
- 红帽 OpenStack 认证系统管理员

## 搭建Linux学习环境

### 如何安装linux操作系统:

- 安装独立的Linux系统,不再安装其他操作系统。 

- 安装Windows与Linux并存的多操作系统,启动时通过菜单选择要启动的操作系统。

- 在虚拟机中安装Linux操作系统。 

- 本次学习采用第三种方式,在虚拟机中安装linux操作系统。

### 创建虚拟机

#### 下载

- 先下载vmware workstation pro软件,下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html

- 下载完成后,退出所有的安全软件,并安装该软件。安装完成后需要激活,激活完成后打开该软件。

#### 创建虚拟机实例

- 文件菜单->新建虚拟机->典型->下一步

image-20230220115206964

- 稍后安装操作系统

image-20230220115249037

- 选择安装类型

image-20230220115321610

- 设置存储路径及名称

image-20230220115402570

- 设置磁盘容量及存储文件方式

image-20230220115436283

- 自定义硬件进行配置

image-20230220115500776

- 内存2GB

image-20230220115540739

- cpu设置:

image-20230220115609595

- 设置镜像文件加载路径:重要

image-20230220115654722

- 网络设置:NAT

image-20230220115717757

- 显示器设置:取消3D支持

image-20230220115746270

- 点击关闭后完成

image-20230220115820374

### 安装RHEL9.1

- 鼠标点进去,用键盘选择第一项,Install Red Hat Enterprise Linux 9.1。等待界面加载完成

  image-20230131172311456

- 进入安装向导,选择安装时的语言,这个随意,本人习惯使用英文。点击Continue(下一步)

  image-20230131171906095

- 图示为每一项的中文意思,KDUMP是一个系统崩溃时收集信息的工具,如果系统用于练习则不需要开启。

 image-20230131115504270

- 磁盘分区管理

image-20230220150538880

image-20230220150625996

image-20230220150659970

image-20230220150732915

> 根分区使用剩余所有空间,空间大小不填

- 设置root账户密码,如果设置的密码为弱密码,则需要点两次确定

  image-20230131120301995

- 安装之前还需要为Root用户设置密码(如果设置的密码为弱密码,则需要点两次确定。)

image-20230131163531801

- 直接点击Begin Installation(开始安装)

  image-20230131164347485

- 安装成功后点击Reboot(重启)

image-20230131164838465

- 重启后进入设置界面,点击start setup开始设置。

![image-20230131165001243](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230131165001243.png)

![image-20230131165029433](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230131165117752.png)

![image-20230131165117752](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230131165029433.png)

![image-20230131165252478](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230131165318359.png)

- 根据提示进行设置,并设置普通用户的用户名及密码

![image-20230131165318359](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230131165252478.png)

### RHEL部署完毕之后的设置

#### 关闭锁屏

- 活动->设置->隐私->锁屏

#### 打开终端

- 活动->终端

#### 安装远程连接linux的软件

- 安装xshell:打开链接https://www.xshell.com/zh/free-for-home-school/,填上你的邮件地址和姓名,软件下载地址会通过邮件发送。


#### 配置xshell进行远程登录

- RHEL9.1终端中查看本机IP:ip address
- xshell中选择文件菜单->新建->打开设置向导
  - 名称:自定
  - 主机:RHEL9.1的IP地址
  - 点击连接输入root(记住用户名打钩)及密码(记住密码打钩)

image-20230220153250656

#### 关闭防火墙及SELinux

```bash
[root@server ~]# systemctl  stop  firewalld  # 临时关闭

[root@server ~]# systemctl  disable   firewalld  # 取消开机启动

[root@server ~]# setenforce  0  # 临时关闭,重启失效
```

#### 设置主机名

```bash
[root@server ~]# hostnamectl  set-hostname  新主机名
[root@server ~]# reboot  # 重启系统
```

#### 制作快照

- vmware设置->虚拟机菜单->快照->拍摄快照->命名(见名知意)->拍摄快照->等待左下角进度跑完

- **恭喜你!!!到此所有的软件安装、操作系统的安装过程就结束了**

## 常见快捷键命令

|    快捷键    |     作用     |
| :----------: | :----------: |
|     tab      |   单词补全   |
|    ctrl+c    | 终止当前任务 |
|    ctrl+l    |     清屏     |
| ctrl+insert  |     复制     |
| shift+insert |     粘贴     |
| ctrl+shift+= |   放大字号   |
|    ctrl+-    |   缩小字号   |
|    ctrl+z    |   终止进程   |

## 正确的关机与重启

- 重启:reboot
- 关机:shutdown  now 

## linux操作系统学习大纲

![image-20230423100547330](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423100547330.png)

# 第一章 简单使用linux

##  Linux的组成

![image-20191225222517611](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/linuxzucheng.jpg)

- Linux内核:内核是系统的核心,是运行程序和管理    像磁盘和打印机等硬件设备的核心程序。
  文件系统: 文件存放在磁盘等存储设备上的组织方法。Linux能支持多种目前浒的文件系统,如ext4、FAT、VFAT、ISO9660、NFS、SMB等。

- Shell:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
- 应用程序:包括文本编辑器、编程语言、X Window、办公套件、Internet工具、数据库等。

- Linux的操作界面常称为Shell,Shell是操作系统提供给用户使用的界面(图形、字符),它提供了用户与内核进行交互操作的一种接口。当用户发出指令(命令或鼠标操作),先将这些指令发送给Shell,由Shell将用户的指令翻译后传送给内核,再由内核来控制硬件的工作。然后内核将硬件的工作情况发送给Shell,并由Shell返回硬件的工作信息和情况。
- Shell的分类:
  - 图形界面的Shell :KDE、GNOME
  - 字符界面的Shell:bash等 

## 使用桌面终端访问linux 

### 终端

- 终端:也称为终端设备,是计算机网络中处于网络最外围的设备,主要用于用户信息的输入以及处理结果的输出等。 
- 在活动中选择终端

image-20230220154127204

- 虚拟终端:同一台终端(物理设备)上虚拟出多个终端,它们之间互相不影响,这些终端就是虚拟终端,默认有6个,可通过ctrl + alt +f[1/2/3/4/5/6]来进行切换。

### shell命令提示符

- 例:[root@localhost ~]#
- root :当前登录的账户名,root为管理员
- localhost:主机名,默认为localhost
- ~ :该位置表示当前工作目录,~表示/root(普通账户  ~ :/home/普通账户名)
- 提示符标志:#或\$ ,表示账户身份,#表示root,$表示普通账户

### 使用命令操作linux系统

- 在终端窗口上输入命令,命令的格式:`主命令   参数    操作对象`

- 查看当前linux的发行版信息

```bash
[root@server ~]# cat  /etc/redhat-release
Red Hat Enterprise Linux release 9.1 (Plow)
# Plow时RHEL9的代号
```

- 查看内核版本

```bash
[root@server ~]# uname  -r
5.14.0-162.6.1.el9_1.x86_64
```

 ```bash
# 分析
5 - 内核版本.
14 - 主修订版本.
0-162 - 次要修订版本.
6.1 - 补丁版本.
x86_64  - 适用平台
 ```

- 查看shell的类型

```bash
# 方法1:
[root@server ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash


# 方法2:
[root@server ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
```

- 查看当前默认的shell

```bash
[root@server ~]# echo $SHELL
/bin/bash
```

- 查看网卡信息以及获取ip地址 

```bash
#查看ip地址
[root@server ~]# 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: ens160: mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:c1:d9:32 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.48.130/24 brd 192.168.48.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec1:d932/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

#注:lo网卡是环回网卡,主要用来本地测试;ens160才是我们远程连接的网卡。
```

#### 切换目录--cd

- 更改当前的工作目录,即切换目录
- 绝对路径(以/开始的路径)
- 相对路径(以当前工作目录开始的路径)

```bash
[root@server ~]# cd /
[root@server /]# cd /root
[root@server ~]# cd /home
[root@server home]# cd ~
[root@server ~]# cd  /etc
[root@server etc]# cd ..
[root@server /]# cd  .
```

#### 查看当前的工作目录--pwd

```bash
[root@server ~]# pwd

[root@server ~]# su - fox

[centos@server ~]$ pwd
/home/centos
# 注意:windows和linux系统的目录路径表示的不同
```

#### 浏览目录内容--ls

```bash
[root@server ~]# ls
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg
[root@server ~]# ls  /
afs  bin  boot  dev  dvd.repo  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

#### 修改密码--passwd

```bash
[root@server /]# passwd
更改用户 root 的密码 。
新的密码: 
无效的密码: 密码少于 8 个字符
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。
[root@server /]# passwd fox
更改用户 fox 的密码 。
新的密码: 
无效的密码: 密码未通过字典检查 - 太简单或太有规律
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。
[root@server /]# passwd -d fox  # 清除fox账户密码
清除用户的密码 fox。
passwd: 操作成功
```

###  重置root密码

#### 方法1:rd.break

- 第1步 重启系统,在下图所示界面按e键,在屏幕上显示内核启动参数

![image-20230423094826848](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423094826848.png)

- 第2步 找到linux这行,末尾空格后 输入 rd.break,然后按ctl+x

![image-20230423095117910](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423095117910.png)

- 第3步 以读写方式挂载/sysroot

![image-20230423095449223](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423095449223.png)

- 第4步:设置密码

![image-20230423095848378](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423095848378.png)

- 第6步 强制重置文件系统的上下文

![image-20230423100045802](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423100045802.png)

- 第7步退出,输入2次exit

![image-20230423100159883](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230423100159883.png)

- 系统会在此处稍微卡一会后进入正常登录界面。

#### 方法2:init方法

- 第1步:启动系统,并在GRUB2启动屏显时,按下e键进入编辑模式
- 第2步:在linux所在参数行尾添加以下内容:
  - 将ro修改为rw
  - 末尾添加init=/bin/sh
- 第3步:按Ctrl+x启动到shell

- 第4步:运行passwd,并按提示修改root密码或者使用如下命令修改密码:

```bash
echo "pwd" | passwd --stdin root
```

- 第5 步:重置文件系统上下文

```bash
touch /.autorelabel
```

- 第6步:运行命令exec /sbin/init来正常启动,或者用命令exec /sbin/reboot重启

### 通过远程软件操控服务器

#### 安装xshell

- 打开链接https://www.xshell.com/zh/free-for-home-school/,填上你的邮件地址和姓名,软件下载地址会通过邮件发送。


#### 配置xshell进行远程登录

- RHEL9.1终端中查看本机IP:ip address
- xshell中选择文件菜单->新建->打开设置向导
  - 名称:自定
  - 主机:RHEL9.1的IP地址
  - 点击连接输入root(记住用户名打钩)及密码(记住密码打钩)

image-20230220153250656

#### xshell中使用命令连接服务器

- 格式:ssh   root@服务器IP地址
- 如图:

- 输入用户名及密码

#### 使用xftp上传文件

- xftp是一款xshell自带的文件上传下载工具
- 用法:点击按钮进入xftp,左边为windows,右边为linux,通过鼠标拖拽上传下载

![image-20230424110132041](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230424110132041.png)

![image-20230424110212496](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230424110212496.png)

- 注意

  - 文件目录位置
  - 进入上传下载的进度条,完毕后才可关闭软件
  - 若无法上传,注意权限

- 例:将默认的yum源修改为阿里的yum源仓库

  - 第一步:预处理上传阿里yum源配置文件到/etc/yum.repos.d目录,

  - ```
    [root@server ~]# cd /etc
    [root@server etc]# rm  -rf yum.repos.d
    [root@server etc]# mkdir  yum.repos.d
    [root@server etc]# cd   yum.repos.d
    ```

  - 第二步:使用xftp上传阿里yum配置文件到/etc/yum.repos.d目录

  - ![image-20230424110805062](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230424110805062.png)

  - 第三步:重建缓存,注意保持网络畅通

  - ```bash
    [root@server yum.repos.d]# yum  makecache
    ```

### 练习

- 重新安装系统,完成系统设置,制作快照
- 虚拟机:典型->稍后安装操作系统->设置系统类型(Linux、RHEL9)->设置虚拟机名称(RHEL9_server)和存储路径->磁盘存储为单个文件->自定义硬件:
  - 内存:2G
  - cpu:1颗,2核心
  - CD/DVD:使用ISO映像文件,设置文件路径 
  - 网卡:NAT模式
  - 显示器:去掉3D加速支持
- RHEL9系统安装要求:
  - 硬盘分为三个分区:/boot 400M  swap  4G   /  剩余空间
  - 去掉KDUMP对钩
  - 设置root密码(123456),需要勾选ssh支持(第二个)
- 系统设置

```bash
[root@server ~]# systemctl  stop  firewalld
[root@server ~]# systemctl  disable   firewalld
[root@server ~]# setenforce  0
[root@server ~]# hostnamectl  set-hostname  新主机名
[root@server ~]# reboot

# 修改yum源为阿里源

# 制作快照:vmware设置->虚拟机菜单->快照->拍摄快照->命名(见名知意)->拍摄快照->等待左下角进度跑完
```

# 第二章 linux中执行命令

## 命令格式

### 命令分为两类

- 内置命令:由shell程序自带的命令 
- 外部命令:有独立的可执行程序文件,文件名即命令名

### 格式

```bash
主命令  参数    操作对象

# 注意:
下面是对于命令的语法的一些符号的说明:
[] :表示的是可选
...: 表示的可以存在多个参数
|表示是可选的
<>:必填
{}:表示作为一个整体存在的
```

### 分析

#### 参数

- 指定命令的运行特性,指明要运行命令中的哪一个功能代码。

- 短选项:例如:-l,-d,如果同一命令同时使用多个短选项,多数可合并。【注:有些命令的选项没有-】

- 长选项:例如--help,--human-readable

#### 操作对象

- 作用:命令的作用对象,即命令对什么生效。

- 有些命令可同时带多个操作对象,多个操作对象之间以空白字符分隔

#### 注意:

- 终止当前的命令:按【Ctrl+C】键可中断正在执行的命令

- 两种补全:
  - 补全命令:输入命令关键字的前几个字符后,按Tab键,可实现命令自动补全
  - 补全文件名和目录名:输入文件的前几个字符后,按tab键可自动补全
- 例:访问网卡配置文件

```bash
[root@server ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
```

## 查看命令帮助

### 查看bash内部命令帮助

```shell
[root@server ~]# help cd
```

### 命令 --help

```shell
[root@server ~]# cat ——help
示例如下:cat [OPTION]... [FILE]...  表明cat后面可以加上多个可选的选项以及多个可选的文件参数
```

### man

- man命令用来提供在线帮助,使用权限是所有用户。
- 使用man命令可以调阅其中的帮助信息,非常方便实用。

```shell
man command
```

```bash
[root@server ~]# man ls
```

image-20220609112123493

- 在man命令帮助信息的界面中,所包含的常用操作按键如下:

| 按键              | 作用                               |
| ----------------- | ---------------------------------- |
| 空格键,PaGe down | 向下翻一页                         |
| PaGe up,b        | 向上翻一页                         |
| home              | 直接前往首页                       |
| end               | 直接前往尾页                       |
| /                 | 从上至下搜索某个关键词,如“/linux” |
| ?                 | 从下至上搜索某个关键词,如“?linux” |
| n                 | 定位到下一个搜索到的关键词         |
| N                 | 定位到上一个搜索到的关键词         |
| q                 | 退出帮助文档                       |

- man命令的帮助信息的结构如下:

| 结构名称    | 代表意义                 |
| ----------- | ------------------------ |
| NAME        | 命令的名称               |
| SYNOPSIS    | 参数的大致使用方法       |
| DESCRIPTION | 介绍说明                 |
| EXAMPLES    | 演示(附带简单说明)     |
| OVERVIEW    | 概述                     |
| DEFAULTS    | 默认的功能               |
| OPTIONS     | 具体的可用选项(带介绍) |
| ENVIRONMENT | 环境变量                 |
| FILES       | 用到的文件               |
| SEE ALSO    | 相关的资料               |
| HISTORY     | 维护历史与联系方式       |

- **man手册的几个部分**

```shell
区段1:用户指令,查看命令的帮助
区段2:系统调用,查看可被内核调用的函数的帮助
区段3:程序库调用,查看函数和函数库的帮助
区段4:设备,查看特殊文件的帮助(主要是/dev目录下的文件)
区段5:文件格式,查看配置文件的帮助
区段6:游戏,查看游戏的帮助
区段7:杂项,惯例与协议等,例如Linux文件系统、网络协议、ASCII code等等的说明
区段8:系统指令,查看系统管理员可用的命令的帮助
区段9:内核内部指令,查看内核相关文件的帮助

使用如下命令可以知道某个命令在man的哪个区段有相关帮助文档:
[root@server ~]# whatis man
man (7)              - macros to format man pages
man (1)              - an interface to the on-line reference manuals
man (1p)             - display system documentation
[root@server ~]# man -f man
man (7)              - macros to format man pages
man (1)              - an interface to the on-line reference manuals
man (1p)             - display system documentation

[root@server ~]# man 1 man      
[root@server ~]# man 7 man
```

### info page

- info与man的用途其实差不多,都是用来查询命令的用法或者是文件的格式。
- 但是与man page不同的是,info page则是将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的『超链接』来跳到各不同的页面中,每个独立的页面也被称为一个节点(node)。 
- 不过你要查询的目标数据的说明文件必须要以info的格式来写成才能够使用info的特殊功能(例如超链接)。 而这个支持info命令的文件默认是放置在/usr/share/info/这个目录当中的。 

```bash
[root@server info]# info info
```

![image-20220509112044065](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20220509112702425.png)

- 第一行的信息表示:
  - Next:下一个节点的名称为Stand-alone Info,你也可以按 `n` 到下个节点去;
  - Up:回到上一层的节点总揽画面,你也可以按 `u` 回到上一层;

- 输入n/N后显示如下:

![image-20220509112702425](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20220509112044065.png)

- Prev:前一个节点,输入 `p` 可回到前一个节点。

- info page当中可以使用的按键:

| 快 捷 键 | 作 用                                   |
| -------- | --------------------------------------- |
| 上箭头   | 向上移动一行                            |
| 下箭头   | 向下移动一行                            |
| PgUp     | 向上翻一页                              |
| PgDn     | 向下翻一页                              |
| Tab      | 在有“*”符号的节点间进行切换             |
| 回车     | 进入有“*”符号的子页面,查看详细帮助信息 |
| u        | 进入上一层信息                          |
| n        | 进入下一小节信息                        |
| p        | 回到上一小节信息                        |
| s或者/   | 在info page中使用关键字搜索             |
| ?       | 查看帮助信息                            |
| q        | 退出 info 信息                          |

## date命令

### 作用:

- date命令用于显示或设置系统的时间与日期

### 格式

```bash
date  -参数  +显示日期时间格式参数
```

- 用户只需在强大的date命令后输入以 `+` 号开头的格式参数,即可按照指定格式来输出系统的时间或日期,这样在日常工作时便可以把备份数据的命令与指定格式输出的时间结合到一起。例如,把打包后的文件自动按照“年-月-日”的格式打包成“backup-2020-9-1.tar.gz”,用户只需要看一眼文件名称就能大概了解到每个文件的备份时间了。

### 常见参数:

| 参数 | 作用                     |
| ---- | ------------------------ |
| %Y   | 完整年份(例如:2020)   |
| %m   | 月份(1~12)             |
| %d   | 本月中的第几天           |
| %H   | 小时(00~23)           |
| %M   | 分钟(00~59)           |
| %j   | 今年中的第几天           |
| %X   | 相当于%H:%M:%S           |
| %Z   | 显示时区                 |
| %A   | 星期几 (Sunday-Saturday) |
| %p   | 显示本地AM或PM           |

### 示例

```shell
[root@server ~]# date
2023年 02月 20日 星期一 16:39:09 CST
```

```shell
[root@kongd ~]# date "+%j"
306
# date命令中的参数%j可用来查看今天是当年中的第几天。这个参数能够很好地区分备份时间的新旧,即数字越大,越靠近当前时间。该参数的使用方式以及显示结果如下所示:
```

```shell
[root@server ~]# date "+%Y-%m-%d %H:%M:%S"
2023-02-20 16:39:32
```

```shell
[root@server ~]# date  –s  20170303   修改为2017-03-03
[root@server ~]# date  -s  15:03       修改时间为15:03
[root@server ~]# date  -s  “20180707   10:12”  合并修改
```

```bash
[root@server ~]# date  -d  “+2  day”  +%d 显示2天后日期
[root@server ~]# date  -d  “-5  day”  +%d 显示5天前日期
```

## timedatectl命令

### 作用

- timedatectl命令用于设置系统的时间,英文全称为:“time date control”,若发现电脑时间跟实际不符?如果只差几分钟的话,我们可以直接调整,但如果差几个小时,那么除了调整当前的时间,还有必要检查下时区了

### 格式

```bahs
timedatectl [OPTIONS...] COMMAND ...
```

### timedatectl命令中的参数以及作用:

| 参数           | 作用         |
| -------------- | ------------ |
| status         | 显示状态信息 |
| list-timezones | 列出已知时区 |
| set-timezone   | 设置生效时区 |
| set-time       | 设置系统时间 |

#### 查看系统时间与时区:

```shell
[root@server ~]# timedatectl status
               Local time: 一 2023-02-20 16:43:52 CST
           Universal time: 一 2023-02-20 08:43:52 UTC
                 RTC time: 一 2023-02-20 08:43:52
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```

#### 设置时区

- 如果您查到的时区不是上海(Asia/Shanghai),可以手动进行设置:

```shell
[root@server ~]#  timedatectl set-timezone Asia/Shanghai
```

- 如果时间还是不正确,我们可以手动的修改系统日期:

```shell
[root@server ~]# timedatectl set-ntp no # 先关闭ntp时间同步
[root@server ~]# timedatectl set-time 2021-05-18
```

- 而如果想修改时间的话,也很简单:

```shell
[root@server ~]# timedatectl set-time 9:30
[root@server ~]# date 
Tue May 18 09:30:01 CST 2021
[root@server ~]# timedatectl set-ntp yes
```

## **查看日历**

- **格式:cal    月份   年份**

- 例:

```bash
[root@server ~]# cal 05 2023

[root@server ~]# cal  2023
```

## 查看目录下的文件:ls(list)

### 作用

- 查看目录下的内容

### 格式

```bash
ls  -参数  操作对象
```

### 参数

| **参数** | **功能**                                                     |
| :------: | ------------------------------------------------------------ |
|  **-l**  | 以长格形式显示文件和目录的详细信息,ls命令默认只显示名称的短格式。 |
|  **-d**  | 显示指定目录本身的信息,而不显示目录下的各个文件和子目录的信息。 |
|    -c    | 按文件的修改时间排序后,予以显示。                           |
|  **-h**  | 以更人性化的方式显示出目录或文件的大小,默认的大小单位为字节,使用-h选项后将显示为K、M等单位。此选项需要和-l选项结合使用才能体现出结果。 |
|  **-R**  | 以递归的方式显示指定目录及其子目录中的所有内容。             |
|    -a    | 显示所有子目录和文件的信息,包括名称以“.”开头的隐藏目录和隐藏文件。 |
|    -A    | 与-a选项的作用类似,但不显示表示当前目录的“.”和表示父目录的“..”。 |
|    -i    | 显示文件索引节点号(inode)。一个索引节点代表一个文件,在linux中保存在磁盘分区中的文件都给它分配一个编号,称为索引节点号inode。 |
|    -s    | 按照文件大小排序                                             |

```bash
[root@server ~]# ls /
[root@server ~]# ls   -dl    /root
```

### ls浏览后颜色表示

- 白色:普通文件
- 蓝色:目录
- 红色:压缩包文件
- 黄色:设备文件
- 绿色:可执行文件

# 第三章 linux文件类型和根目录结构

## Linux文件类型

| 第一个字符 | 文件类型                                 | 说明                                                         |
| :--------: | ---------------------------------------- | ------------------------------------------------------------ |
|     -      | 普通文件                                 | 类似于Windows的记事本                                        |
|     d      | 目录文件                                 | 类似于windows文件夹                                          |
|     c      | 字符设备文件                             | 串行端口设备,顺序读写,键盘                                 |
|     b      | 块设备文件                               | 可供存储的接口设备,随机读写,硬盘                           |
|     p      | 管道文件                                 | 用于进程间的通信                                             |
|     s      | 套接字文件                               | 通常用于网络上的通信。可以启动一个程序来监听客户端的要求,客户端可以通过套接字来进行数据通信 |
|     l      | 符号链接又叫软链接,和原文件不是一个文件 | 例如Windows的快捷方式,如果原始文件被删除,所有指向它的符号链接也就都被破坏了。软链接有自己的node,是linux特殊文件的一种,作为一个文件,它的数据是它所连接的文件的路径。符号链接可以跨越文件系统,也可以为目录建立。 |
|            | 硬链接                                   | 只能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引(也称为inode)。当移动或者删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在件结构中的位置。 |

```bash
[root@localhost ~]# ll   /usr/bin/ls
-rwxr-xr-x. 1 root root 143368 Apr 27  2020 /usr/bin/ls
[root@localhost ~]# ll  -d /home
drwxr-xr-x. 3 root root 20 Apr 16 14:46 /home
[root@localhost ~]# ll   /dev/tty
crw-rw-rw-. 1 root tty 5, 0 Jun  9 11:48 /dev/tty
[root@localhost ~]# ll   /dev/sr0
brw-rw----. 1 root cdrom 11, 0 Jun  9 11:48 /dev/sr0
[root@localhost ~]# ll  /dev/nvme0n1
brw-rw----. 1 root disk 259, 0 Jun  9 11:48 /dev/nvme0n1
[root@localhost ~]# ll   /usr/bin/yum
lrwxrwxrwx. 1 root root 5 Aug  5  2020 /usr/bin/yum -> dnf-3
```

## Linux的目录结构

###  FHS

#### 概念

- filesystem hierarchy standard文件系统层级标准,定义了在类Unix系统中的目录结构和目录内容,即让用户了解到已安装软件通常放置于哪个目录下。

#### **Linux目录结构的特点**

- 使用树形目录结构来组织和管理文件。
- 整个系统只有一个根目录(树根),Linux的根目录用“/”表示
- 其他所有分区以及外部设备(如硬盘、光驱等)都是以根目录为起点,挂接在目录树的某个目录中的,通过访问挂载点目录,即可实现对这些分区的访问。
- 结构图:

![image-20191226120257094](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/dir.jpg)

#### 常见目录用途

| 文件名       | 描述                                                         |
| ---------- | ------------------------------------------------------------ |
| /          | Linux文件系统的最上层根目录,其他所有目录均是该目录的子目录   |
| /boot        | 存放系统启动时所需的文件,这些文件若损坏常会导致系统无法启动,一般不要改动 |
| /root        | 超级用户的个人目录,普通用户没有权限访问                     |
| /home        | 存放一般用户的个人目录                                       |
| /bin         | Binary的缩写,存放普通用户可执行的程序或命令                  |
| /sbin        | 和/bin类似,这些文件往往用来进行系统管理,只有root可使用      |
| /lib       | 是库(library)英文缩写,存放系统的各种库文件                |
| /lib64     | 存放系统本身需要用到64位程序的共享函数库(library)            |
| /usr | 一般用户程序安装所在的目录,用于安装各种应用程序 |
| /opt | 该目录通常提供给较大型的第三方应用程序使用,例如Sun Staroffice、Corel WordPerfect,这可避免将文件分散至整个文件系统 |
| /etc         | 存放了系统管理时要用到的各种配置文件和子目录                 |
| /var         | 通常各种系统日志文件放在这里                                 |
| /run       | 保存自系统启动以来描述系统信息的文件                         |
| /dev | dev 是设备(device)的英文缩写。包含所有的设备文件 |
| /mnt和/media | 可以临时将别的文件系统挂在这个目录下,即为其他的文件系统提供安装点 |
| /tmp         | 用来存放不同程序执行时产生的临时文件                         |
| /srv         | srv 是服务(server)的简写,服务启动之后需要访问的数据目录     |
| /sys         | 本目录是将内核的一些信息映射文件,以供应用程序所用            |
| /proc        | 可以在这个目录下获取系统信息。这些信息是在内存中由系统自己产生的 |

#### 注意:

- 系统再带的目录不要随意删除
- 目录的名称的区分大小写的
- FHS标准并不是一种强制约束标准,但是一种经验的总结,应灵活使用

### 路径以及工作目录

#### **路径**

- 用“路径”来表示某个文件(或目录)在目录结构中所处的位置。顾名思义,路径是指从树型目录中的某个目录层次到达某一文件或子目录的一条线路,路径由以“/”为分隔符的多个目录名构成。
- 路径可分为:
          - 绝对路径:是指以根目录“/”为起点来表示系统中某个文件(或目录)的位置的方式
  - 相对路径:是以当前目录为起点,表示系统中某个文件或目录在目录结构中的位置的方式。

#### **工作目录**

- 用户当前所处的位置,使用`pwd`命令查看

- 更改当前的工作目录,即切换目录:`cd 路径`

```bash
[root@localhost ~]# pwd
/root
[root@localhost ~]# cd   /
[root@localhost /]# pwd
/
#回到当前用户的家(主)目录
[root@localhost /]# cd ~    
[root@localhost ~]# pwd
/root
#回到当前目录的上一级目录
[root@localhost ~]# cd   ..
#切换到之前的目录
[root@localhost /]# cd   -
/root
#回到当前目录
[root@localhost ~]# cd .
```

# 第四章 从命令行管理文件

## **文件命名规则**:

- 不能使用/来当文件名,/是用来做根的,也是用来做路径分隔符的

- 文件名不能超过255个字符

- 区分大小写file File FILE fIle root  Root  ROOT rOOt ROOT 

- 目录也是文件,在同一路径下,两个不同类型文件不能同名

## 创建链接文件

### Linux系统中硬盘文件存储原理

#### 硬盘数据分类

- 用户数据(user  data):即文件的数据块(data block),存储数据真实空间
- 元数据(metadata):存储文件附加属性,如:文件的大小、创建的时间、所有者等信息

### 硬连接

#### 原理:

- linux系统允许多个文件指向同一个inode,即允许一个文件拥有多个有效地路径名

- 理解:硬连接就是指向原始文件inode的指针

#### 查看方法

- ll  文件名
- stat  文件名

#### 建立硬连接

- 格式:

```bash
ln  -参数   源文件   目标连接文件
```

- 例1:

```shell
[root@server ~]# touch  m1.txt
[root@server ~]# stat  m1.txt
  文件:m1.txt
  大小:0             块:0          IO 块:4096   普通空文件
设备:fd00h/64768d    Inode:16802638    硬链接:1  # 初始连接数为1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2022-12-13 18:30:25.883879146 +0800
最近更改:2022-12-13 18:30:25.883879146 +0800
最近改动:2022-12-13 18:30:25.883879146 +0800
创建时间:2022-12-13 18:30:25.882879146 +0800


[root@server ~]# ln   m1.txt   m2.txt   # 建立m2.txt指向m1.txt的硬连接
[root@server ~]# stat  m1.txt
  文件:m1.txt
  大小:0             块:0          IO 块:4096   普通空文件
设备:fd00h/64768d    Inode:16802638    硬链接:2   #  连接数加1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2022-12-13 18:30:25.883879146 +0800
最近更改:2022-12-13 18:30:25.883879146 +0800
最近改动:2022-12-13 18:31:22.487877027 +0800
创建时间:2022-12-13 18:30:25.882879146 +0800
```

#### 注意

- 硬连接建立后,删除源文件后数据依然可以访问,只有硬连接为0时,数据旧无法访问了

```shell
[root@server ~]# echo "hello"  >   k1.txt
[root@server ~]# cat  k1.txt
hello
[root@server ~]# stat  k1.txt
  文件:k1.txt
  大小:6             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:16802639    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0

[root@server ~]# ln  k1.txt   k2.txt   # 建立硬连接
[root@server ~]# cat  k2.txt
hello
[root@server ~]# stat  k1.txt
  文件:k1.txt
  大小:6             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:16802639    硬链接:2   #  硬连接数变更
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0

[root@server ~]# rm  -f  k1.txt    #  删除文件,相当于删除一个硬连接
[root@server ~]# cat  k2.txt
hello

[root@server ~]# stat  k2.txt
  文件:k2.txt
  大小:6             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:16802639    硬链接:1   # 硬连接变更
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0
```

- 硬连接不能给目录建立

```shell
[root@server ~]# mkdir  n1
[root@server ~]# ln  n1  n2
ln: n1: 不允许将硬链接指向目录
```

- 目录自带2个硬连接,即目录中的  .   ..   ,表示当前目录和上一级目录

```shell
[root@server ~]# cd  n1
[root@server n1]# ls  -a
.  ..
[root@server4 n1]# stat  .   #  查看. 的硬连接,即当前目录的硬连接
  文件:.
  大小:6             块:0          IO 块:4096   目录
设备:fd00h/64768d    Inode:2777695     硬链接:2
权限:(0755/drwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0

[root@server n1]# stat  ..   #  查看.. 的硬连接,即上一级目录的硬连接
  文件:..
  大小:4096          块:8          IO 块:4096   目录
设备:fd00h/64768d    Inode:16797825    硬链接:22
权限:(0550/dr-xr-x---)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:admin_home_t:s0
```

- 不可以在不同的文件系统内建立硬连接,由于inode是当前文件在本文件系统的索引值即只能在本分区使用,应以硬连接不能跨越文件系统

### 软连接

#### 原理:

- 软连接是一种符号连接,类似于windows的“快捷方式”,仅包含所连接的路径名

#### 格式

```bash
ln  -s   源文件  目标连接名
```

#### 例1:

```shell
[root@server ~]# echo  "china"  >  h1.txt   #  新建文件
[root@server ~]# ln  -s  h1.txt   h2.txt    # 创建软连接,指向h2.txt
[root@server ~]# ll  h2.txt
lrwxrwxrwx. 1 root root 6 12月 13 18:52 h2.txt -> h1.txt   #  查看连接关系
[root@server ~]# stat  h1.txt
  文件:h1.txt
  大小:6             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:2777696     硬链接:1   # 硬连接还是1,没有变化
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
环境:unconfined_u:object_r:admin_home_t:s0
```

#### 例2:建立网卡配置文件的软连接

```shell
[root@server ~]# ln  -s  /etc/NetworkManager/system-connections/ens160.nmconnection   /root/nic
[root@node4 ~]# ll  /root/nic
lrwxrwxrwx. 1 root root 43 12月 13 18:56 /root/nic -> /etc/sysconfig/network-scripts/ifcfg-ens160
[root@server ~]# cat  nic
```

#### 注意

- 软连接只是一种指向关系,删除源文件则数据不可访问

```shell
[root@server ~]# echo  "china"  >  d1.txt
[root@server ~]# ln  -s  d1.txt  d2.txt  
[root@server ~]# ll  d2.txt
lrwxrwxrwx. 1 root root 6 12月 13 19:00 d2.txt -> d1.txt
[root@server ~]# cat  d2.txt
china
[root@server ~]# rm  -f  d1.txt
[root@server ~]# cat  d2.txt   #  连接失效
cat: d2.txt: 没有那个文件或目录
```

- 可以通过ll命令查看软连接实际执行文件及位置

- 更改软连接方法:ln  -snf   新文件名     软连接名
- 删除软连接,只是删除指向关系,源数据依然可以访问

### 软硬连接的区别

- 硬连接中源文件与连接文件公用一个inode号,是同一个文件,软连接中源文件与连接文件拥有不同inode号,是2个不同的文件

```shell
[root@server ~]# echo  "hello"  >  s1  
[root@server ~]# ln  s1  s2   # 建立硬连接
[root@server ~]# stat  s1
  文件:s1
  大小:6             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:16802662    硬链接:2
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)

[root@server ~]# stat  s2
  文件:s2
  大小:6             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:16802662    硬链接:2    #  s1  s2  indoe号相同:16802662
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)

[root@server ~]# ln  -s  s1  s3
[root@server ~]# stat  s3
  文件:s3 -> s1
  大小:2             块:0          IO 块:4096   符号链接
设备:fd00h/64768d    Inode:16802663    硬链接:1   # 软连接s3 inode:16802663不同
```

- 软连接的指向关系可以查看,硬连接不可以查看

- 连接数不同,软连接数不会增加

- 文件大小不同,硬连接文件大小与源文件一样

- 软连接不受任何文件系统的影响,任何用户都可以创建指向目录的软连接

  

## 目录操作命令

### 创建目录(make directory)

#### 格式:

```bash
mkdir  [-p]  [/路径/]目录名
```

#### 参数

- -p  可快速创建出目录结构中指定的每个目录,对于已存在的目录不会被覆盖
- -v  显示创建目录的详细过程

#### 例:

```bash
[root@server ~]# mkdir  t1
[root@server ~]# mkdir  t2  t3  t4   #  批量一次性新建
[root@server ~]# mkdir  -p  n1/n2/n3   # 新建递归目录
```

### du命令

- 作用:统计目录及文件的空间占用情况,查看某个目录中的各级子目录所占用的磁盘空间数。

- 命令格式: du  [参数]  [目录名]
- 参数:

| **选项** | **功能**                                                     |
| -------- | ------------------------------------------------------------ |
| -a       | 统计磁盘空间占用时包括所有的文件,而不仅仅只统计目录。        |
| -s       | 只统计每个文件所占用空间总的大小,而不是统计每个子目录、文件的大小。 |
| **-h**   | 以K,M,G为单位显示磁盘使用情况,以提高信息的可读性。           |

## 新建文件

### 创建普通文件

#### touch用法1:

- 如果文件已存在,更新文件的三个时间,`stat`可以查看文件的详细信息

```bash
[root@server ~]# stat /etc/hostname
  File: /etc/hostname
  Size: 22              Blocks: 8          IO Block: 4096   regular file
Device: 10302h/66306d   Inode: 8608116     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:hostname_etc_t:s0
Access: 2022-06-09 11:19:35.484027446 +0800
Modify: 2022-04-16 14:46:36.153011877 +0800
Change: 2022-04-16 14:46:36.153011877 +0800
 
 [root@server ~]# stat /etc/hostname
  文件:/etc/hostname
  大小:7             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:17805263    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2023-04-23 10:01:42.285018639 +0800
最近更改:2023-03-22 11:20:57.098407291 +0800
最近改动:2023-03-22 11:20:57.098407291 +0800
创建时间:2023-03-22 11:20:57.097407349 +0800

# 分析
# atime,即access time,访问文件的时间,查看了一下文件内容(cat),文件的atime时间会更新    

# mtime,即modify time,修改内容的时间,文件内容被改变了,ctime会更新

# ctime,即change time,修改文件元数据的时间
```

```bash
[root@server ~]# touch /etc/hostname
[root@server ~]# date
2023年 04月 24日 星期一 09:37:38 CST
[root@server ~]# stat /etc/hostname
  文件:/etc/hostname
  大小:7             块:8          IO 块:4096   普通文件
设备:fd00h/64768d    Inode:17805263    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2023-04-24 09:37:36.800493399 +0800
最近更改:2023-04-24 09:37:36.800493399 +0800
最近改动:2023-04-24 09:37:36.800493399 +0800
创建时间:2023-03-22 11:20:57.097407349 +0800
```

#### touch用法2

- 如果文件不存在,则表示创建文件

- 格式:

```bash
touch 文件名1 文件名2 文件名3

touch {文件名1,文件名2,文件名3}
```

- 例1:

```bash
[root@server ~]# touch  p1.txt
[root@server ~]# touch  p2.txt  p3.txt  p4.txt
[root@server ~]# touch  {p5,p6,p7}.txt
[root@server ~]# touch  {1,2}{3,4}
[root@server ~]# touch  abc{1..100}
```

#### 示例

- tree命令

  - 作用:显示目录下文件的树形拓扑图及摘要

  - 格式:

  - ```
    tree  -参数 路径
    ```

  - 参数

  - ```bash
    -a : 所有文件包含显示隐藏文件
    -f : 列出文件的完整路径内容
    -d :只显示目录
    -L : 设置显示最大深度,如:tree -f -L 2 
    ```

- 按照下面的结构新建文件及目录

image-20221210085853398

### 创建大容量文件

#### 作用

- 制作指定个数及容量的空文件

#### 格式

```bash
dd    if=来源  of=新文件名  count=数据块个数  bs=块容量
```

#### 分析

- if=/dev/zero    zero空数据设备文件,可以向其它文件中填充无数个数据0
- of=新文件名,一般给出存储路径
- count=:新文件由几个数据块组成
- bs=:一个数据块容量

#### 示例

- 例1:制作100MB空数据文件

```shell
[root@server ~]# dd  if=/dev/zero  of=/root/z1  count=2  bs=50M
```

- 例2:制作2G文件

```shell
[root@server ~]# dd  if=/dev/zero  of=/z2  count=1  bs=2GB
```

- 例3:制作光盘镜像

```shell
[root@server ~]# dd  if=/dev/sr0  of=/RHEL8.5.iso
```

## 删除文件

### 格式:

```bash
rm  -参数  文件名
```

### 用法:

- 删除文件: rm    文件名
- 删除目录:rm  -r  目录名
- 强制删除不确认:rm  -f  文件名

### 注意

- **删除前必须确认路径及名称**
- **删除文件时必须将文件名及扩展名写全**

## 数据流和重定向

### 数据流

- 标准输入(standard input,简称stdin):默认情况下,标准输入指从键盘获取的输入
- 标准输出(standard output,简称stdout):默认情况下,命令执行所回传正确的信息会输出到屏幕上
- 标准错误输出(standard error output,简称stderr):默认情况下,标准错误输出可理解为命令执行失败后,所回传的错误信息会输出到屏幕上
- 不管正确或错误的数据都是默认输出到屏幕上,所以屏幕是混乱的。所以就需要用数据流重定向将这两条数据分开。数据流重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备去,而分别传送所用的特殊字符如下所示:

- 标准输入(stdin):代码为0
- 标准输出(stdout):代码为1
- 标准错误输出(stderr):代码为2

### 重定向操作符

#### 概念

- 重定向操作符可以将命令输入和输出数据流从默认设备重定向到其他位置。
- 重定向操作符本身不是命令,而是命令中附加的可改变命令的输入和输出对象的特殊符号。

#### 符号

- 输出重定向操作符:`>`      `>>`
- 输入重定向操作符:`<`      `<<` 

#### 用法

```bash
命令 >文件 或 命令  1>文件 : 将命令执行后的结果不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件

命令  2>文件 : 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件

命令  2>/dev/null : 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是写入到空设备文件(黑洞)中,即将输出的错误信息丢弃掉

命令  &>文件 命令  >&文件 : 将命令执行后的正确输出信息和错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件

命令 >>文件 : 将命令执行后的正确输出信息以追加的方式写入到指定的文件中,不覆盖原文件内容,若指定的文件不存在,则自动创建该文件

命令 <文件 : 使命令从指定的文件中读取数据作为输入

命令 <<结束标识字符串 : 在命令行读取数据作为输入,直到遇到指定的结束标识字符串
```

#### 输出重定向案例

- 例1:输出重定向(覆盖)

```bash
[root@server ~]# date  1> date.txt 
```

![)](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/redir03.png)

- 例2:输出重定向(追加)

```bash
[root@server ~]# date >> date.txt 
```


![)](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/redir04.png)

- 例3:错误输出重定向

```bash
[root@server ~]# ls /home/  /aaa >list.txt 
ls: 无法访问/aaa: 没有那个文件或目录
[root@server ~]# ls /home/  /aaa >list.txt 2>error.txt    # 重定向到不同的位置
```


![](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/redir05.png)

- 例4: 正确和错误都输入到相同位置

```bash
[root@server ~]# ls /home/  /aaa &>list.txt  # 混合输出
```

![](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/redir06.png)

- 例5: 正确和错误都输入到相同位置

```bash
[root@server ~]# ls /home/  /aaa >list.txt 2>&1    # 重定向到相同的位置
```

![](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/redir07.png)

- 例6:重定向到空设备/dev/null

```bash
[root@server ~]# ls /home/  /aaa >list.txt 2>/dev/null     # 将产生的输出丢掉
```

![](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/redir08.png)

```bash
[root@server ~]# ls /home/  /aaa &>/dev/null  #将产生的输出丢掉
```

![image-20220505112626220](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20220505112626220.png)

#### 输入重定向案例

- 例1:从文件读取数据作为cat命令的输入

```bash
[root@server ~]# echo  test > file    
[root@server ~]# cat  < file
test
```

- 例2:标准输入重定向`<<`并不表示追加,而是表示输入结束的意思,即作为一个结束符。

```bash
[root@server ~]# cat > file3 << end
> china
> china
> hello
> end
[root@server ~]# cat file3
china
china
hello

# 输入end终止输入,不必输入ctrl+d来结束
```

### 将标准输出重定向到文件

#### echo命令

- 作用:向终端设备上输出字符串或变量提取后的值
- 格式

```bash
echo  "字符串" 
echo  "$量"
```

- 例:

```shell
[root@server ~]# echo  "hello world"

```

```bash
[root@server ~]# str1="hello world"
[root@server ~]# echo  "$str1"
hello world
[root@server ~]# num=1024
[root@server ~]# echo  "$num"
1024

[root@server ~]# echo $SHELL
/bin/bash
```

#### 将标准输出重定向到文件

```bash
[root@server ~]# echo  "hello"  > /root/test/file
[root@server ~]# echo  "world" >> /root/test/file
```

##  tee命令读取数据输出到文件

### tee命令

#### 作用

- 读取标准输入的数据,并将其内容输出到文件的同时输出到屏幕(即想把输出保存到文件中,又想在屏幕上看到内容)

- tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时输出到文件。

​         ![tee](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/tee.jpg)

#### 格式

```bash
tee 参数  文件名
```

#### 参数

- -a或--append,附加到现有文件的后面,而非覆盖它
- -i或--ignore-interrupts  忽略中断信号
- --help  在线帮助

#### 例

```bash
[root@server ~]# tee test1.txt
aaa
aaa
bbb
bbb
ccc
ccc   # 输入ccc并回车后按下ctrl+d 结束输入
[root@server ~]# cat test1.txt 
aaa
bbb
ccc
```

```bash
[root@server ~]# tee -a test1.txt  # 追加
123
123
456
456
[root@server ~]# cat test1.txt 
aaa
bbb
ccc
123
456
```

### 管道符:|

#### 作用

- 用于两个命令或者多个命令相连接,将管道符左边命令的输出作为管道符右边命令的输入

#### 格式

```bash
命令A  | 命令2  | 命令3  ……
```

#### 例

```bash
[root@server ~]# more  test1.txt  | wc -l  # 统计行数
5
[root@server ~]# cat  /etc/group | tee  test2.txt

[root@server ~]# cat  /etc/group | tee  test1.txt  test2.txt 
```

## vi/vim文本编辑器

### 为什么学vi

- 在Linux系统中一切都是文件,配置一个服务就是使用文本编辑器修改配置文件的参数
- 所有的Unix 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在;
- 很多个别软件的编辑接口都会主动调用 vi,如:crontab, visudo 等指令
- Vim的发布最早可以追溯到1991年,英文全称为:“Vi IMproved”,也就是对vi编辑器的提升版本,最大的特点是以字体颜色辨别语法的正确性,方便程序设计,编辑速度快

### vim编辑器的三种模式

#### 结构图:

![image-20230424104906036](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230424104906036.png)

#### 概念

- 命令模式:也成为了阅读模式,可以控制光标移动,对文本进行查看、删除、复制粘贴等操作(默认)

- 编辑模式:也称为插入模式,可以对文本进行编辑

- 末行模式:保存、退出、设置编辑环境
- 进入的顺序
  - 刚打开文件后进入的为命令模式(默认)
  - 命令模式点击i'键进入输入模式,点击Esc返回命令模式
  - 命令模式中点击冒号进入末行模式,点击Esc返回
  - 输入模式与末行模式不可以相互进入   

### 命令模式的快捷键

#### 光标跳转按键

| 功能                   | 按键              |
| ---------------------- | ----------------- |
| 光标按单个字符移动     | ↑、↓、←、→        |
| 光标按照单词向后跳转   | w                 |
| 光标按照单词向前跳转   | b                 |
| 光标跳转至行首         | ^                 |
| 光标跳转至行尾         | $                 |
| 文档首行第一个字符     | gg                |
| 文档最后一行第一个字符 | G                 |
| 跳转到指定行           | 行号gg 或者 行号G |

#### 复制、粘贴、删除

| 功能                                   | 按键      |
| -------------------------------------- | --------- |
| 删除光标所在行                         | dd        |
| 删除从光标处开始的n行                  | 数字dd    |
| 删除光标前至行首字符                   | d^        |
| 删除光标及之后的所有字符               | d$        |
| 复制光标所在行                         | yy        |
| 复制从光标处开始的n行                  | 数字yy    |
| 将缓冲区的内容粘贴到光标所在行的下一行 | p(小写) |
| 将缓冲区的内容粘贴到光标所在行的上一行 | P(大写) |
| 撤销操作                               | u         |

### 编辑模式的快捷键

- 可通过如下任意一种功能键从命令模式切换到编辑模式
- 按esc键可从编辑模式切换到命令模式

| 功能                                 | 按键           |
| ------------------------------------ | -------------- |
| 在光标前插入                         | i              |
| 在光标所在行行首第一个非空字符前插入 | I(大写字母i) |
| 在光标后插入                         | a              |
| 在光标所在行末尾插入                 | A              |
| 在光标所在行上一行插入               | O(大写字母)  |
| 在光标所在行下一行插入               | o(小写字母)  |
| 删除光标所在字符并进入插入模式       | s(小写字母)  |
| 删除当前行并进入插入模式             | S(大写字母)  |

### 末行模式的快捷键

- 按`:`或者`/`可从命令模式切换到末行模式
- 按esc键可从末行模式切换到命令模式。

#### 查找关键字并替换

| 功能                                                         | 按键               |
| ------------------------------------------------------------ | ------------------ |
| 从上而下在文件中查找字符串“word”(可按n键定位到下一个匹配的被查找字符串) | /word              |
| 将当前行中查找到的第一个字符“old”替换为“new”                 | :s /old/new        |
| 将当前行中查找到的所有字符“old”替换为“new”                   | :s /old/new/g      |
| 在行号“n1,n2”范围内替换所有的字符串“old”为“new”              | :n1,n2 s/old/new/g |
| 将整个文件内的字符串“old”替换为“new”                         | :% s/old/new/g     |

#### 保存退出

| 功能                                             | 按键         |
| ------------------------------------------------ | ------------ |
| 退出vi/vim编辑器,未对文件做任何编辑操作才可退出 | :q           |
| 不保存文档内容,强制退出vi/vim编辑器             | :q!          |
| 保存文件                                         | :w           |
| 将文件另存为/dir/file                            | :w /dir/file |
| 保存文件内容并退出vi/vim编辑器                   | :wq 或者 ZZ  |
| 强制保存并退出                                   | :wq!         |

#### 其他操作

| 功能                         | 按键          |
| ---------------------------- | ------------- |
| 在当前文件中读入其他文件内容 | :r  /dir/file |
| 查找含有"word"的行并删除     | :g/word/d     |
| 显示行号                     | :set nu       |
| 关闭行号显示                 | :set nonu     |
| 删除n1-n2行内容              | :n1,n2  d     |
| 复制n1-n2行到第n行后面       | :n1,n2 co n   |

### 示例

- 使用vim编写c程序,实现编译执行

```bash
vim  test.c
# 输入代码
#include
int main(void)
{
  
    int i,j;
    for(i=1;i<10;i++)
        printf("%d\t",i);
    printf("\n");

    for(i=1;i<66;i++)
        printf("-");    
    printf("\n");

    for(i=1;i<10;i++)
    {
        for(j=1;j<10;j++)
                if(i>=j)
                    printf("%d\t",i*j);
        printf("\n");
    }
}

gcc  test.c   #  执行编译
./a.out    # 运行查看结果
1    2    3    4    5    6    7    8    9    
-----------------------------------------------------------------
1    
2    4    
3    6    9    
4    8    12    16    
5    10    15    20    25    
6    12    18    24    30    36    
7    14    21    28    35    42    49    
8    16    24    32    40    48    56    64    
9    18    27    36    45    54    63    72    81    
```

### vim的配置文件

```shell
[root@server ~]# vim   /etc/vimrc  或者  vim  ~/.vimrc
    set hlsearch            "高亮度反白
    set backspace=2     "可随时用退格键删除
    set autoindent        "自动缩排
    set tabstop=4            "缩进
    set softtabstop=4   softtabstop是“逢4空格进1制表符”,前提是你tabstop=4
    set shiftwidth=4      自动缩进空格长度
    set mouse=a                "使用鼠标
    set selection=exclusive
    set selectmode=mouse,key
    set ruler               "可显示最后一行的状态
    set showmode            "左下角那一行的状态
    set nu                  "可以在每一行的最前面显示行号啦!
    set bg=dark             "显示不同的底色色调
    syntax on               "进行语法检验,颜色显示    
```

### vim 的异常处理

#### 模拟异常

```shell
[root@server ~]# vim  test
# 输入一些内容,正常保存退出
[root@server ~]# vim  test
# 点击ctrl+z 键 模拟异常退出
[root@server ~]# vim  test  # 此时出现问题
E325: 注意
发现交换文件 ".test.swp"
            所有者: root    日期: Sun Dec 18 14:05:17 2022
            文件名: ~root/test
            修改过: 否
            用户名: root      主机名: node3
           进程 ID: 8532 (仍在运行)
正在打开文件 "test"
              日期: Sun Dec 18 14:05:05 2022

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    如果是这样,请用 ":recover" 或 "vim -r test"
    恢复修改的内容 (请见 ":help recovery")。
    如果你已经进行了恢复,请删除交换文件 ".test.swp"
    以避免再看到此消息。

交换文件 ".test.swp" 已存在!
以只读方式打开([O]), 直接编辑((E)), 恢复((R)), 退出((Q)), 中止((A)): 
```

#### 原因

- 在编辑过程中,某些原因倒置vim中断退出,下次打开时,同名的交换文件(.swp)与源文件内容不一致,需要进行后续设置

#### 处理流程

- 正常打开
- 点击R键,后回车
- 正常编辑,保存退出
- 删除隐藏的交换文件

```shell
# 如上例的test文件
[root@server ~]# ls  -a
[root@server ~]# rm  -f .test.swp   #  删除对应隐藏的交换文件
[root@server ~]# vim  test  # 再次尝试打开,结果显示正常
```

### vim练习

#### 修改主机名

```bash
[root@server ~]# vim /etc/hostname
```

#### 设置登录欢迎语

```bash
[root@server ~]# vi /etc/motd
hello
```

# 第五章 文件内容显示

## 浏览普通文件

### 文件内容查看

#### cat  命令

- 作用:查看文件内容,适合数据量较少
- 格式:cat   -参数   文件名
- 参数:
  - -n:显示行号,加上
  - -b:文件中所有非空行增加行号,编号从1开始
- 例1:

```shell
[root@server ~]# cat   /etc/passwd
[root@server ~]# cat   -n  /etc/passwd
```

- 例2:将显示结果重定向输出到另一个文件中

```shell
[root@server ~]# touch  pwd.txt
[root@server ~]# cat  /etc/passwd  >  pwd.txt  # > 为重定向符
[root@server ~]# cat  pwd.txt
```

- 合并文件:

```shell
[root@node1 ~]# touch  t1.txt  t2.txt  t3.txt
[root@node1 ~]# echo  "hello"  >  t1.txt
[root@node1 ~]# echo  "world"  >  t2.txt
[root@node1 ~]# cat  t1.txt  t2.txt  >  t3.txt
[root@node1 ~]# cat  t3.txt
hello
world
```

- 注意:tac命令是倒置输出文件内容

#### tac

- **作用:倒叙访问文件内容**
- 格式:tac   参数 文件名
- **例如:** **tac      /etc/passwd**

#### more 命令

- 作用:翻页查看文件内容,适合内容较多的文件查看
- 格式:more  文件名
- 注意:使用回车则一行一行查看,使用空格则整页查看,点击q键退出查看

```shell
[root@server ~]# more  -sp  /etc/passwd #  -sp  减少空白行,先清屏后输出
```

#### less命令

- 作用:同more命令
- 格式:less    文件名
- 注意:可以使用上下键进行浏览,点击q退出浏览

#### head命令

- 作用: 查看文档前n行的内容
- 格式:head  -数字   文件名
- 例:

```bash
[root@server ~]# head  /etc/passwd    #  默认查看文档前10行内容
[root@server ~]# head -5 /etc/passwd
```

#### tail命令

- 作用:查看文档后n行内容
- 格式:tail  -参数  文件名
- 参数
  - -数字:查看倒数行数
  - -f:动态刷新, 实时显示日志文件并且能动态更新
- 例:

```bash
[root@server ~]# tail  /etc/passwd     # 默认查看文档后10行内容
[root@server ~]# tail  -1  /etc/passwd
[root@server ~]# tail  -f  /var/log/messages   # 监视日志
[root@server ~]# head  -6 /etc/passwd | tail -1  # 查看第6行
```

### 文件信息查看

#### file 命令

- 作用:查看文件类型
- 格式:file  -参数  文件名
- 文件类型:
  - ASCII  file :ASCII文本字符文件
  - empty:空文件
  - block special :块设备文件
  - character  special :字符设备文件
  - diretory:目录

#### stat 命令

- 作用:显示文件属性信息
- 格式:stat  文件名
- 注意:一般通过该命令查看大小、Inode、硬链接、软连接

## 文件内容过滤显示—grep

### 作用:

- 在指定的普通文件中查找并显示含有指定字符串的行,也可与管道符一起使用

### 格式

```bash
grep   -参数  查找条件  文件名
```

### 参数

| 选项 | 说明                                        |
| ---- | ------------------------------------------- |
| -c   | 仅显示找到的行数                            |
| -i   | 忽略大小写                                  |
| -n   | 显示行号                                    |
| -v   | 反向选择——仅列出没有“关键词”的行            |
| -A   | -A 2    搜索时显示匹配到的那一行以及下2行   |
| -B   | -B 2    搜索时显示匹配到的那一行以及上2行   |
| -C   | -C 2    搜索时显示匹配到的那一行以及上下2行 |

### /etc/passwd文件含义

#### 作用

- 记录用户账户信息:共分为7段,使用冒号分割

#### 含义

- 文件内容意义:账户名:密码代号x:UID:GID:注释:家目录:SHELL

- 第7列/sbin/nologin:不允许登录

#### 示例

```shell
# 在passwd中检索包含root的行信息
[root@server ~]# grep   -n  “root”   /etc/passwd

# 在passwd检索不能登录的信息
[root@server ~]# grep  -n   "/sbin/nologin"   /etc/passwd

# 在passwd中检索可以登录的账户信息
[root@server ~]# grep  -nv   "/sbin/nologin"   /etc/passwd (反向)

# 检索包含“halt”的行及下3行信息
[root@server ~]# grep  -nA3  "halt"  /etc/passwd

# 检索包含“sshd”的行及上5行信息
[root@server ~]# grep  -nB5   “sshd”  /etc/passwd 

# 检索包含“ftp”的行及上下2行
[root@server ~]# grep   -nC2   “ftp”   /etc/passwd

# 检索不能登录的账户个数
[root@server ~]# grep   -c   “/sbin/nologin”  /etc/passwd  
# 相当于 grep  -n  “/sbin/nologin”  /etc/passwd | wc  -l

# 检索包含大小写字母d的行信息
[root@server ~]# grep  -ni  "d"  /etc/passwd
```

#### 使用特殊符号匹配

| 匹配模式               | 说明                                    |
| ---------------------- | --------------------------------------- |
| grep  h  文件名        | 查找文件里有字符h的行                   |
| grep  ^[q]  文件名     | 匹配以q开始的行                         |
| grep  ^[qf]  文件名    | 匹配以q或者f开头的行                    |
| grep  ^[ ^qf ]  文件名 | 不匹配以q或者f开头的行                  |
| grep ^[0-9]  文件名    | 匹配以数字开头的行                      |
| grep  q$  文件名       | 匹配以q结束的行                         |
| grep  ^$               | 过滤空白行                              |
| grep  -r  h  ./*       | 如果要明确搜索当前目录中的子目录有h的行 |
| grep  -d s kip  h  ./* | 忽略当前目录下的子目录下的普通文件      |

```bash
[root@server ~]# grep  ^a /etc/passwd

[root@server ~]# grep  -n  “^root” /etc/passwd

[root@server ~]# grep  -n  "^#"  /etc/sos/sos.conf

[root@server ~]# grep  -n  [0-9]$  /etc/sos/sos.conf

[root@server ~]# grep  -n  ^$  /etc/sos/sos.conf
```

## 切割显示-cut

### 作用

- cut命令用于按列提取文本内容

### 格式

```bash
cut  -d  "分隔符"  -f列数字  文件名
```

### 示例

- /etc/passwd文件在保存用户数据信息时,每一项值之间是采用冒号来间隔的,如:

```bash
[root@server ~]# head  2 /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin
```

- 基于“行”的方式来提取数据是比较简单的,只需要设置好要搜索的关键词即可,但如果按列搜索,不仅要使用-f参数来设置需要看的列数,还需要使用-d参数来设置间隔符号。

```shell
[root@kongd ~]# cut -d : -f1 /etc/passwd
root
bin
daemon
adm
lp
```

- 例:提取内核版本号

```bash
[root@server ~]# uname -a | cut -d " " -f3
```

- 例:提取IP地址

```bash
[root@server ~]# ip a | grep ens160 | grep inet | cut -d "/" -f1 | cut -d " " -f6
# 注意空格
```

- 例:提取mac地址

```bash
[root@server ~]# ip a | grep link/ether | cut -d " " -f6
```

## 排序显示-sort

### 作用

- sort命令用于对文本内容进行排序显示

### 格式:

```bash
sort -参数 文件名
```

### 参数

| 选项 | 作用           |
| ---- | -------------- |
| -f   | 忽略大小写     |
| -b   | 忽略缩进与空格 |
| -n   | 以数值型排序   |
| -r   | 反向排序       |
| -u   | 去除重复行     |
| -t   | 指定间隔符     |
| -k   | 设置字段范围   |

### 示例

- sort命令执行后默认会按照字母顺序进行排序

```shell
[root@server ~]# cat fruit.txt 
banana
pear
apple
orange
[root@server ~]# sort fruit.txt 
apple
banana
orange
pear

[root@server ~]# cat  /etc/passwd | cut -d : -f1 | sort  # 取出所有账户名
```

- sort   -u参数进行去重操作:

```shell
[root@server ~]# cat sort.txt 
Welcome to openlab.com
Red Hat certified
Welcome to openlab.com
Free Linux Lessons
Linux Course
[root@server ~]# sort -u sort.txt 
Free Linux Lessons
Red Hat certified
Welcome to openlab.com
```

- 数字排序

```shell
[root@server ~]# cat number.txt 
45
12
3
98
82
67
24
56
9
[root@server ~]# sort -n number.txt 

[root@server ~]# sort -nr number.txt  # 降序
```

- 下面的内容是节选自/etc/passwd文件中前五个字段的内容,并进行混乱排序后的样子:

```shell
[root@kongd ~]# cat user.txt 
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon
polkitd:x:998:996:User for polkitd
geoclue:x:997:995:User for geoclue
rtkit:x:172:172:RealtimeKit
pulse:x:171:171:PulseAudio System Daemon
qemu:x:107:107:qemu user
usbmuxd:x:113:113:usbmuxd user
unbound:x:996:991:Unbound DNS resolver
rpc:x:32:32:Rpcbind Daemon
gluster:x:995:990:GlusterFS daemons
```

- 上面其实是五个字段,各个字段之间是用了冒号进行间隔,如果想以第三个字段中的数字作为排序依据,那么就可以用-t参数指定间隔符,-k参数指定第几列,-n参数进行数字排序来搞定:

```shell
[root@server ~]# sort -t : -k 3 -n user.txt 
rpc:x:32:32:Rpcbind Daemon
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon
qemu:x:107:107:qemu user
usbmuxd:x:113:113:usbmuxd user
pulse:x:171:171:PulseAudio System Daemon
rtkit:x:172:172:RealtimeKit
gluster:x:995:990:GlusterFS daemons
unbound:x:996:991:Unbound DNS resolver
geoclue:x:997:995:User for geoclue
polkitd:x:998:996:User for polkitd
```

## 去重显示-uniq

### 作用

- uniq命令用于去除文本中连续的重复行

### 格式

```bash
uniq -参数 文件名
```

### 示例

- 对比两个文本内容进行操作

```shell
[root@server ~]# cat uq1.txt 
Welcome to openlab.com
Welcome to openlab.com
Welcome to openlab.com
Welcome to openlab.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
[root@kongd ~]# uniq uq1.txt 
Welcome to openlab.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
```

## 文件中字符替换显示-tr

### 作用

- tr 指令从标准输入读取数据,经过替换或者删除后,将结果输出到标准输出

### 格式

```bash
tr  -参数  替换内容  新内容
```

### 参数

- -c   :反选设定字符,符合 “替换内容” 的部份不做处理,不符合的剩余部份才进行转换
- -d   :删除指令字符
- -s   :缩减连续重复的字符成指定的单个字符

### 示例

- 小写字母全部转换成大写字母

```shell
[root@server ~]# cat /etc/passwd  | tr a-z A-Z 
```

- 提取IP地址

```bash
[root@server ~]# ip a | grep ens160 | grep inet | cut -d /  -f1 | tr -s ' ' | cut -d ' ' -f3
```

# 第六章 文件的其它操作命令

## 文本内容统计wc

### 作用

- wc命令用于统计指定文本文件的行数、字数或字节数

### 格式

```bash
wc -参数 文件名
```

### 参数

| 选项 | 作用         |
| ---- | ------------ |
| -l   | 只显示行数   |
| -w   | 只显示单词数 |
| -c   | 只显示字节数 |

### 示例

- 统计所有

```shell
[root@server ~]# wc  /etc/passwd
  37    88     2083 /etc/passwd
# 行数  单词数  字节数  
```

- 配合管道符计算

```bash
[root@server ~]# ll / | wc -l   # 文件数

[root@server ~]# grep  "/bin/bash"  /etc/passwd  |  wc -l

[root@server ~]# cat /etc/passwd | cut -d ":" -f1 | wc -l
```

## 复制、移动文件

### 复制文件或目录

#### 格式

```bash
cp  -参数  源文件   目标文件
```

#### 参数

| **选项** | **功能**                                                     |
| -------- | ------------------------------------------------------------ |
| -a       | 通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录 |
| -d       | 拷贝时保留链接                                               |
| -f       | 在覆盖已经存在的目标文件时不提示                             |
| -i       | 在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝 |
| -p       | 除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中 |
| -r       | 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名 |

#### 示例

```bash
[root@server ~]# cd  ~
[root@server ~]# touch  t1.txt
[root@server ~]# cp  t1.txt   /
[root@server ~]# touch  t2.txt
[root@server ~]# cp  t2.txt   /t3.txt   # 另存为
[root@server ~]# cp  p1   /   # 报错,目录需加-r
[root@server ~]# cp  -r  p1  /
[root@server ~]# cp  -r   p2   /p3    # 目录另存为

[root@server ~]# mkdir  -p  /t1/t2/t3
[root@server ~]# cp -a /t1  ~
[root@server ~]# ls
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg  t1
[root@server ~]# cd t1
[root@server t1]# ls
t2
[root@server t1]# cd t2
[root@server t2]# ls
t3
[root@server t2]# ll
总用量 0
drwxr-xr-x 2 root root 6  4月 25 10:39 t3
```

### 移动文件或目录

#### 作用

- mv命令用于剪切或重命名文件

#### 格式

```bash
mv [选项] 源文件名称 目标文件名称
```

#### 注意

- 剪切操作不同于复制操作,因为它会把源文件删除掉,只保留剪切后的文件。
- 如果在同一个目录中将某个文件剪切后还粘贴到当前目录下,其实本质就是对文件进行了重命名操作。

```shell
[root@server ~]# touch  t3.txt
[root@server ~]# mv  t3.txt   /etc   #源为文件,目标为目录 ,为移动

[root@server ~]# touch  t3.txt
[root@server ~]# mv  t3.txt   t4.txt  # 源为文件 ,目标为文件,位置不变,为改名
```

##  查找文件

### 查找文件路径

#### whereis命令

- 作用:可以搜索系统命令的可执行文件路径和说明文档
- 格式

```bash
whereis  命令名
```

- 例

```bash
[root@server ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
[root@server ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@server ~]# whereis cd
cd: /usr/bin/cd /usr/share/man/man1/cd.1.gz /usr/share/man/man1p/cd.1p.gz
```

#### which命令

- 作用:搜索系统命令的可执行文件
- 格式

```bash
which  命令名
```

- 例

```bash
[root@server ~]# which cd
/usr/bin/cd
[root@server ~]# which cat
/usr/bin/cat
[root@server ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls
[root@server ~]# ls --color=auto   # ls是它的别名
公共  模板  视频  图片  文档  下载  音乐  桌面  anaconda-ks.cfg  t1
```

### 查找文件-find

#### 作用

- 按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件

#### 格式

```bash
find  查找路径   查找条件  具体条件  操作
```

#### 注意

- find命令默认的操作是print输出
- find是检索文件的,grep是过滤文件中字符串

#### 参数

| 参数                                   | 作用                                                         |
| -------------------------------------- | ------------------------------------------------------------ |
| -name                                  | 根据文件basename匹配名称                                     |
| -size                                  | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) |
| -mtime [+\|-]n                         | 匹配修改内容的时间(-4指小于等于4天内的文件名;+4,大于等于5天前的文件名;4指前4~5那一天的文件) |
| -atime [+\|-]n                         | 匹配访问文件的时间                                           |
| -ctime [+\|-]n                         | 匹配修改文件权限的时间                                       |
| -newer f1 !f2                          | 匹配比文件f1新但比f2旧的文件                                 |
| -perm                                  | 匹配权限(mode为完全匹配,-mode为包含即可)                  |
| -user                                  | 匹配所有者                                                   |
| -group                                 | 匹配所有组                                                   |
| -nouser                                | 匹配无所有者的文件                                           |
| -nogroup                               | 匹配无所属组的文件                                           |
| -type b/d/c/p/l/f                      | 匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件) |
| -depth                                 | 先从该目录子目录下查找,再查找该目录                         |
| -maxdepth levels
-mindepth levels | 最多查找多少层目录;最少查找多少层目录                       |
| -delete                                | 将找到的文件删除,如果是目录只能删除找到的空目录。           |
| -exec …… {}\;                          | 后面可跟用于进一步处理搜索结果的命令                         |

#### 示例

- 按照文件名搜索
  - -name: 按照文件名搜索
  - -iname: 按照文件名搜索,不区分文件名大小写
  - -inum: 按照 inode 号搜索
  - 没有那个文件或目录:find命令在执行时,在内存中自己产生的临时文件,执行完既消失
  - 注意:搜索位置越大,消耗系统资源越多,在生产服务器上搜索的时候,尽量不在根目录下搜索,把搜索的范围尽量控制在最小

```shell
# /目录下检索名为passwd的文件
[root@server ~]# find  /  -name  "passwd" -print

# /etc下检索host开头的文件
[root@server ~]# find /etc -name "host*" -print

# 在/目录查找以a开头文件
[root@server ~]# find  /  -name  "a*"

# 在/目录中查找以b开头的不区分大小写的文件
[root@server ~]# find / -iname "b"

# 在/etc目录下检索以b开头共4个字符的文件
[root@server ~]# find  /etc  -name  "b???"

# 在/etc目录下检索第二个字母为c的文件
[root@server ~]# find  /etc  -name  "?c*"

# /目录下检索扩展名为.cfg的文件
[root@server ~]# find  /  -name  "*.cfg"

# /目录下检索扩展名为.txt的文件并统计个数
[root@server ~]# find  /  -name  "*.txt"  |  wc  -l
```

- 按照文件大小搜索

  - -size [+|-]大小: 按照指定大小搜索文件,“+”的意思是搜索比指定大小还要大的文件, “-”的意思是搜索比指定大小还要小的文件  

  - 单位:可以通过man  find  查看size参数的单位

    ```
        #这是默认单位,如果单位为b或不写单位,则按照512 Byte搜索。
        ' b':for 512-byte blocks(this is the default if no suffix is used)
        
        #搜索单位是c,按照字节搜索。
        'c':for bytes
      
        #搜索单位是w,按照双字节(中文)搜索。
        'w':for two-byte words
     
        #按照KB单位搜索,必须是小写的k。
        'k':for Kilobytes(units of 1024 bytes)
     
        #按照MB单位搜索,必须是大写的M
        'M':for Megabytes(units of 1048576 bytes)
     
        #按照GB单位搜索,必须是大写的G
        ' G':for Gigabytes(units of 1073741824 bytes)
    ```

```bash
[root@master ~]# find / -size -1k

[root@master ~]# find  /   -size  +100M

[root@server ~]# find . -empty  # 空文件
```

- 按照修改时间搜索
  -  -atime [+|-]时间: 按照文件访问时间搜索
  - -mtime [+|-]时间: 按照文件数据修改时间搜索
  - -ctime [+|-]时间: 按照文件状态修改时间搜索
  - -newer file: 把比file修改时间更新的文件列出来
  - 注意:时间范围问题
    - -5:代表 5 天内修改的文件。
    - 5:代表前 5~6 天那一天修改的文件。
    - +5:代表 6 天前修改的文件。  

![image-20191227204132704](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/findtime.jpg)

```bash
[root@master ~]# find  /  -mtime -10  -empty  10天以内的空文件
```

- 按照权限搜索
  - -perm   权限模式: 查找文件权限刚好等于“权限模式”的文件 ,常用
  - -perm   -权限模式: 查找文件权限全部包含“权限模式”的文件
  - -perm   +权限模式: 查找文件权限包含“权限模式”的任意一个权限的文件
  - 如果要在整个系统中搜索权限中包括SUID权限的所有文件,只需使用-4000即可:

```shell
[root@server ~]# find . perm  755
[root@server ~]# find / -perm -4000
```

- 按照所有者和所属组搜索  
  - -uid 用户 ID: 按照用户 ID 查找所有者是指定 ID 的文件
  - -gid 组 ID: 按照用户组 ID 查找所属组是指定 ID 的文件
  - -user 用户名: 按照用户名查找所有者是指定用户的文件
  - -group 组名: 按照组名查找所属组是指定用户组的文件
  - -nouser: 查找没有所有者的文件 ,常用,主要用于查找垃圾文件,还有一种情况就是外来文件,比如光盘和U盘中的文件如果是由Windows复制来的(也就是文件是由windows建立的),在Linux中查看就是没有所有者的文件;再比如手工源码包安装的文件,也有可能没有所有者(由其他系统打的源码包)

```bash
[root@server ~]#  find . -user root
[root@server ~]#  find  / -nouser   # 查看无所有者的文件
```

- 按照文件类型搜索
  -  -type d: 查找目录
  - -type f: 查找普通文件
  - -type l: 查找软链接文件 
  - …… 

```bash
[root@server ~]# find  /dev  -type  b
[root@server ~]# find  ~  -type  d
[root@server ~]# find  /dev  -type  c  -size  -10k
```

- 逻辑运算符 
  - -a: and 逻辑与
  - -o: or 逻辑或
  - -not: not 逻辑非
  - 优先级:与>或>非

```shell
[root@server ~]# find  /  -size  +10k  -a  -size  -50k
[root@server ~]# find  /etc   -name  "e*"  -o  -name  "f*"
[root@server ~]# find  /etc   -name   "d*"   -user  root  # 默认为and  
```

- -exec参数
  - 作用:用于把find命令搜索到的结果交由紧随其后的命令作进一步处理,类似于管道符,该参数必须为带减号的长参数。
  - 使用-exec命令结尾必须为\;

```bash
# 将/root 目录下的属于root账户的文件检索出来后拷贝到/目录下的find1目录中
[root@server ~]# find ~ -user root -exec cp -a {} /find1/ \;
```

## 压缩和解压缩

### zip和unzip命令

#### 格式

```bash
zip FILE  # 压缩
unzip FILE   # 解压缩
```

#### 示例

```shell
# 素材准备:
[root@server ~]# mkdir  /test
[root@server ~]# cd  /test
[root@server test]# for i in {1..5};do echo "test$i" > test$i.txt;done
[root@server test]# ls
test1.txt  test2.txt  test3.txt  test4.txt  test5.txt 

[root@server test]# mkdir dir1
[root@server test]# cp /etc/fstab dir1
```

```bash
# 例1: 使用zip压缩文件test1.txt
[root@server test]# zip test1.zip test1.txt
    
# 压缩率为最高压缩test2.txt,-1 : 最快压缩,压缩率最差,-9 : 最大压缩,压缩率最佳
[root@server test]# zip -9 test2.zip test2.txt
 
# 例2: 将当前目录dir1连同目录下文件一起压缩
[root@server test]# zip -r dir1.zip dir1

# 例3: 向压缩文件中test1.zip中添加test2. txt文件
[root@server test]# zip -m test1.zip test2.txt

# 例4: 删除压缩文件中的文件
[root@server test]# zip -d test1.zip test2.txt
    
# 例5: 压缩文件时排除某个文件
[root@server test]# zip test.zip *.txt -x test1.txt

# 例6: 解压文件test2.zip
[root@server test]# unzip test2.zip 

# 例7:将压缩文件text.zip在指定目录dir1下解压缩 
[root@server test]# unzip test.zip -d dir1
     
# 例8:  查看压缩文件目录,但不解压
[root@server test]# unzip -v test.zip 
```

### gzip命令

```shell
# 例1: 使用gzip压缩文件
[root@server test]# gzip test1.txt 

# 例2: 使用gzip压缩目录下文件
[root@server test]# gzip -r dir1
[root@server test]# ls dir1
#注意: 以上压缩之后原始文件就没有了。

# 例3: 压缩但保留原始文件
[root@server test]# gzip -c test2.txt > test2.txt.gz
```

### bzip2命令

```shell
# bzip2是更新的Linux压缩工具,比gzip有着更高的压缩率。

[root@server test]# [root@server test]# bzip2  test3.txt  # 源文档不保留

[root@server test]# bzip2  -9  -c test3.txt > test3.txt.bz2 # 用最佳的压缩比压缩,并保留原本的档案
```

### xz、unxz命令

```shell
# 例1:压缩文件
[root@server test]# xz test5.txt

# 例2:压缩dir1目录下文件
[root@server test]# xz dir1/*
[root@server test]# ls dir1

# 例3:查看压缩文件内容
[root@server test]# xzcat test5.txt.xz 
test1

# 例4:解压缩(xz -d等价于unxz)
[root@server test]# unxz test5.txt.xz 
```

## tar归档命令

### 格式

```bash
tar  -参数  [args]……
```

### 参数

#### 常用参数

| 选项 | 功能                 |
| ---- | -------------------- |
| -c   | 创建.tar格式的包文件 |
| -x   | 释放.tar格式的包文件 |
| -t   | 查看包中的文件列表   |

#### 必选参数

| 选项 | 功能                                                         |
| ---- | ------------------------------------------------------------ |
| -f   | 用于指定打包文件名。
当与-c选项一起使用时,创建的tar包文件使用该选项指定的文件名
当与-x选项一起使用时,则释放该选项指定的tar包文件 |

#### 辅助参数

| 选项            | 功能                                                         |
| --------------- | ------------------------------------------------------------ |
| -v              | 表示在命令执行时显示详细的提示信息                           |
| -p              | 打包时保留文件及目录的权限                                   |
| z               | 调用gzip程序,以gzip格式压缩或解压缩文件(.tar.gz)          |
| -j              | 调用bzip2程序,以bzip2格式压缩或解压缩文件(.tar.bz2)       |
| -J              | 使用xz压缩或解压缩文件(.tar.xz),xz的压缩率通常比bzip2更高 |
| -C(大写字母C) | 和-x选项一起使用,表示释放包时指定释放的目标路径             |

#### 额外参数

```bash
# 打包时排除某个文件
tar cf 文件名.tar --exclude=路径/文件 路径
注:此处的路径前后需要保持保持一致,统一使用绝对路径或者相对路径
```

### 格式

#### 打包

- 作用:创建(非压缩的)打包文件,将指定的一个或多个文件或目录备份生成为一个指定的包文件

```bash
tar  cvf/cfv/-cvf  文件名.tar  要打包的目录或文件名
```

- 列出包文件中的文件列表

```bash
tar  t[v]f  包文件名`
```

#### 打包压缩

- 作用:为节省存储空间,通常需要生成压缩格式的tar包文件,tar命令支持三种不同的压缩方式

```bash
tar  czf/-czf 文件名.tar.gz  要打包压缩的目录或文件名……
tar  cjf/-cjf 文件名.tar.bz2  要打包压缩的目录或文件名……
tar  cJf/-cJf 文件名.tar.xz  要打包压缩的目录或文件名……
```

- 提取包文件到指定目录

```bash
tar  xf/-xf/-xzf 文件名.tar.gz  [-C 目标路径]
tar  xf/-xf/-xjf 文件名.tar.bz2  [-C 目标路径]
tar  xf/-xf/-xJf 文件名.tar.xz  [-C 目标路径]
```

### 示例

- 将/etc下所有内容打包压缩到/root目录中

```bash
[root@server ~]# tar   -cvf  taretc.tar.gz   /etc
```

- 解压缩

```bash
[root@server ~]# mkdir temp
[root@server ~]# mv taretc.tar.gz  temp
[root@server ~]# cd temp
[root@server temp]# 
[root@server temp]# tar   -xvf  taretc.tar.gz
```

- 注意:参数中-c 与 -x 不能同时使用

# 第七章 命令解释器-shell

## 概述

### 概念

- shell:壳,命令解释器,负责解析用户输入的命令
- 图:

### 分类:

- 内置命令 (shell内置),shell为了完成自我管理和基本的管理,不同的shell内置不同的命令,但是大部分都差不多
- 外置命令,在文件系统的某个目录下,有个与命令名称相同的文件

### type 命令

#### 作用

- 查看命令是内置命令、外置命名、alias命令

#### 格式

```bash
type  -参数  命令名
```

#### 参数

- `type  -a `列出当前命令可以如何执行
- `type  -t `仅列出命令按照哪种方式执行

#### 例

```bash
[root@server ~]# type -a  cd
cd 是 shell 内建
cd 是 /usr/bin/cd

[root@server ~]# type cd
cd 是 shell 内建

[root@server ~]# type -t  cd
builtin   # 内置命令

[root@server ~]# type tree
tree 是 /usr/bin/tree
[root@server ~]# type -t  tree
file

[root@server ~]# type wget
wget 是 /usr/bin/wget

[root@server ~]# type ls
ls 是“ls --color=auto”的别名

[root@server ~]# type ping
ping 是 /usr/sbin/ping

[root@server ~]# alias ping='ping -c 5'

[root@server ~]# type ping
ping 是“ping -c 5”的别名

[root@server ~]# ping  www.qq.com
PING ins-r23tsuuf.ias.tencent-cloud.net (101.91.22.57) 56(84) 比特的数据。
64 比特,来自 101.91.22.57 (101.91.22.57): icmp_seq=1 ttl=128 时间=31.0 毫秒
64 比特,来自 101.91.22.57 (101.91.22.57): icmp_seq=2 ttl=128 时间=29.2 毫秒
64 比特,来自 101.91.22.57 (101.91.22.57): icmp_seq=3 ttl=128 时间=29.1 毫秒
64 比特,来自 101.91.22.57 (101.91.22.57): icmp_seq=4 ttl=128 时间=30.8 毫秒
64 比特,来自 101.91.22.57 (101.91.22.57): icmp_seq=5 ttl=128 时间=30.6 毫秒

--- ins-r23tsuuf.ias.tencent-cloud.net ping 统计 ---
已发送 5 个包, 已接收 5 个包, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 29.122/30.150/31.043/0.825 ms
```

### 执行原理

- 系统为了让用户在命令行快速方便地执行命令,将可执行文件的路径存储在环境变量PATH中,使得shell知道命令的可执行文件位置
- PATH环境变量:当用户每次执行外部命令的时候都会去该变量所记录的路径下搜索和命令同名的二进制文件,如果有则执行该二进制文件,如果没有则提示命令找不到。

```bash
[root@server ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
```

## Linux 中的特殊符号

| 特殊符号        | 功能                                                         | 说明                                                         |
| --------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| ;               | 可使用分号分隔多条命令                                       | 在一行上输入和执行多条较短的命令,可使用分号来分隔命令       |
| *               | 匹配任意零个或者多个字符                                     | 不能用于创建文件                                             |
| ?              | 匹配任意单个字符                                             | 不能用于创建文件                                             |
| []              | 匹配方括号中的任意一个字符,表示范围可以用"-”                | 不能用于创建文件                                             |
| [^]或者[!]      | 匹配方括号中的任意一个字符或数字后进行取反                   | 用于查找和删除文件,不用于创建文件                           |
| {string,string} | 匹配括号中的任意一个字符串,表示一个范围时,字符串之间个".." | 可用于创建、查看、删除文件                                   |
| \               | 使\后面的特殊字符失效                                        | 例如:可以在命令行后面加一个\,再按回车键时并不表示执行该命令,而是表示换行,通过此方式将一个较长的命令分成多行表达,增强命令的可读性。换行后系统自动显示提示符`>` |
| `               | 反引号,一般用于引用命令,执行的时候反引号里面的命令会被执行,与$()作用相同 |                                                              |
| '               | 单引号,将单引号内的所有内容都原样输出                       | 所有特殊字符在单引号里面都会失去特殊含义                     |
| "               | 双引号,除了几个特殊字符外,将双引号内的几乎所有内容都原样输出 | ”$“和“\”以及“ ` ”在双引号里面仍然保留自己的特殊含义          |

## 命令别名

### 作用

- 别名:是命令的快捷方式,对于需要经常执行,并需要很长时间输入的长命令创建快捷方式很有用。

### 格式

```bash
alias 别名='原命令 - 参数'
```

### 查看设置的别名

```bash
[root@server ~]# 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 ping='ping -c 5'    # 上例新建的
alias rm='rm -i'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep='xzgrep --color=auto'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'
```

### 常用的别名

#### untar

- 由于 tar 命令的参数太多不好记忆,所以将解压缩设为如下:

```bash
alias untar='tar -zxvf '
```

#### wget

- 下载大文件时的断点续连,防止网络异常中断:

```bash
alias wget='wget -c '
```

#### **getpass**

生成 20 个字符的随机数密码,使用 openssl 命令,但命令又很长不方便,可以设置别名:

```bash
alias getpass="openssl rand -base64 20"
```

#### ping

- ping   url时会无限次输出,但其实没多大意义,可以使用 -c 命令将其限制为 5 次输出:

```bash
alias ping='ping -c 5'
```

#### speed

- 测试网速命令speedtest-cli ,为了方便使用可以设置别名:
- 安装: speedtest-cli是基于python编写的需要使用pip工具下载

```bash
[root@server ~]# pip install  speedtest-cli
bash: pip: command not found...
Install package 'python3-pip' to provide command 'pip'? [N/y] y


 * Waiting in queue... 
 * Loading list of packages.... 
The following packages have to be installed:
 python3-pip-21.2.3-6.el9.noarch    A tool for installing and managing Python3 packages
Proceed with changes? [N/y] y

```

- 查看手册

```bash
[root@server ~]# speedtest-cli  --help

# 常用参数
--list:根据距离显示speedtest.net的测试服务器列表

--server:指定列表中id的服务器来做测试

--share:分享你的网速,该命令会在speedtest网站上生成网速测试结果的图片

--simple:只显示ping和上下行速度
```

- 例

```bash
[root@server ~]# speedtest-cli  --list
Retrieving speedtest.net configuration...
36646) China Unicom HeNan 5G (Zhengzhou, China) [434.03 km]
16145) Lanzhou,China Mobile,Gansu (Lanzhou, China) [505.69 km]
35527) China Broadcasting Network Group Sichuan (Chengdu, China) [606.95 km]
23844) China Telecom Wuhan Branch (Wuhan, China) [648.22 km]
 4870) 湖南联通5G (Changsha, China) [776.52 km]
51451) Viettel Network (Bac Ninh, Vietnam) [1481.67 km]
34705) ZHOST.VN (Ha Noi, Vietnam) [1502.17 km]
11430) VIETPN CO, LTD (Ha Noi, Viet Nam) [1502.17 km]
55023) GEENET COMMUNICATION (Dibrugarh, India) [1533.77 km]
45929) Lao Telecom (Muang Xai, Laos) [1655.95 km]

[root@server ~]# speedtest-cli  --list  |  grep  China   # 过滤中国地区的ISP
36646) China Unicom HeNan 5G (Zhengzhou, China) [434.03 km]
16145) Lanzhou,China Mobile,Gansu (Lanzhou, China) [505.69 km]
35527) China Broadcasting Network Group Sichuan (Chengdu, China) [606.95 km]
23844) China Telecom Wuhan Branch (Wuhan, China) [648.22 km]
 4870) 湖南联通5G (Changsha, China) [776.52 km]


# 36646) China Unicom HeNan 5G (Zhengzhou, China) [434.03 km]  解释:
# 36646: 服务器id
# China Unicom HeNan 5G:网络ISP,中国联通(河南)
# Zhengzhou, China:服务器所在地址
# 434.03 km:两台服务器地理位置之间距离
```

```bash
# 分享,可以在网站查看生成的图片
[root@server ~]# speedtest-cli --server 36646 --share   #  需要更换服务器id
Retrieving speedtest.net configuration...
Testing from China Telecom (113.132.176.202)...
Retrieving speedtest.net server list...
Retrieving information for the selected server...
Hosted by China Unicom HeNan 5G (Zhengzhou) [434.03 km]: 30.326 ms
Testing download speed................................................................................
Download: 155.98 Mbit/s
Testing upload speed......................................................................................................
Upload: 85.31 Mbit/s
Share results: http://www.speedtest.net/result/14700390192.png  # 图片url
```

image-20230506102226558

- 设置别名:需要更换id

```bash
alias speed='speedtest-cli --server 36646 --simple'

[root@server ~]# speed
Ping: 367.255 ms
Download: 194.83 Mbit/s
Upload: 96.23 Mbit/s
```

#### ipe

- 公网 IP别名设置:

```bash
alias ipe='curl ipinfo.io/ip'

[root@server ~]# alias ipe='curl ipinfo.io/ip'
[root@server ~]# ipe
113.132.176.202[root@server ~]# 
```

#### c

- 清屏,一般使用 ctrl + l 快捷键,也可以将 clear 命令定义得更短,这样使用起来更直接,更粗暴。

```bash
alias c='clear'
```

### 删除别名

#### 格式

```bash
unalias 别名
```

#### 例

```bash
[root@server ~]# alias 
[root@server ~]# unalias ping
[root@server ~]# alias 
```

### 注意:

- 在命令行中使用alias命令设置的别名仅在该次登入有效,如果重新开启一个 Shell,或者重新登录系统,则这些alias将无法使用。

- 在linux中提供alias永久化的方法:
  - 将别名命令写入到~/.bashrc和/etc/bashrc文件中
  - 执行 source     ~/.bashrc 和 source   ~/etc/bashrc 生效
- 例

```bash
[root@server ~]# alias ping='ping -c 5'
[root@server ~]# ping  www.qq.com
# 关闭shell,重新打开
[root@server ~]# ping  www.qq.com  # 别名失效
[root@server ~]# vim  ~/.bashrc
# 写入别名
[root@server ~]# source  ~/.bashrc   # 生效,注意切换仅对当前账户生效
[root@server ~]# vim  /etc/bashrc
# 写入别名
[root@server ~]# source   /etc/bashrc   
# 切换到普通账户测试
```

## 命令历史

### 作用

- history命令可以查阅命令历史记录

### 格式

```bash
history -参数
```

### 参数

```bash
number:显示最近number条命令历史
-c:清空当前历史命令
```

```bash
[root@server ~]# history  5
   13  vim  ~/.bashrc
   14  ping  www.baidu.com
   15  source  ~/.bashrc
   16  ping  www.baidu.com
   17  history  5

[root@server ~]# !16   # 将第16命令在执行一遍
```

### 设置history记录命令条数

```bash
[root@server ~]# vim  /etc/profile

# 定位:HISTSIZE=1000

#退出后重启:reboot
```

# 第八章 账户和组管理

## 账户和工作组的分类

### 用户分为三类:

- 超级账户——账户名为root,它具有一切权限,只有进行系统维护(例如:建立用户等)或其他必要情形下才用超级用户登录,以避免系统出现安全问题。

- 系统账户——是Linux系统正常工作所必需的账户,主要为了满足相应的系统进程对文件属主的要求而建立的,如:bin、daemon、adm、sshd等,注意:系统账户不能登录。

- 普通用户——是为了让使用者能够使用Linux系统资源而建立的,大多数用户属于此类。  

### 工作组分析两类:

- 基本组(私有组):新建立账户时,若没有指定账户所属的工作组,会建立和账户名相同的组

- 扩展组(公有组):可以容纳多个用户,组中的账户都具有组所拥有的权利。

### 账户和工作组的配置文件

- 账户名、密码、工作组信息和工作组密码存储在以下配置文件中

| **文件功能**   | **文件名称** |
| -------------- | ------------ |
| 用户账号文件   | /etc/passwd  |
| 用户密码文件   | /etc/shadow  |
| 工作组账号文件 | /etc/group   |
| 工作组密码文件 | /etc/gshadow |

#### 用户账号文件

- /etc/passwd 是一个文本文件,用于定义系统的账号,由于所有账户都对passwd有读权限,所以该文件中只定义用户账号,而不保存口令。

```bash
[root@server ~]# ll  /etc/passwd
-rw-r--r--. 1 root root 2083  4月 26 14:39 /etc/passwd

[root@server ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
```

- /etc/passwd文件中字段说明

  - 由7个字段组成,字段之间用“:”分隔,意义:账号名:密码:UID:GID:个人资料:主目录:Shell
  - 账号名:用户登录Linux系统时使用的名称。
  - 密码:以前是以加密格式保存密码的位置,现在密码保存在/etc/shadow文件中,此处只是密码占位符“x”或“*”。若为“x”,说明密码经过了shadow的保护。
  - UID:账户的ID值,是一个数字标识,相当于账户的“身份证编号”,具有唯一性
    - root账户UID——0
    - 系统账户的UID——1~999
    - 普通账户的UID——≥1000
    - 注意:普通账户从1000开始编号,连续编号,即使系统管理员某些账户号码未使用,普通账户也不可使用
  - GID:基本组的ID值,用来区分不同的工作组,相同的组具有相同的GID。
  - 个人资料:注释信息,可以记录账户的完整姓名、地址、办公室电话、家庭电话等个人信息。
  - 家目录:类似Windows 的个人目录,通常是/home/账户名
  - Shell:定义用户登录后激活的Shell,默认是Bash Shell

- id 命令

  - 作用:查看账户的UID、GID等信息

  - 格式

  - ```bash
    id  账户名
    ```

  - 例

  - ```bash
    [root@server ~]# id root
    用户id=0(root) 组id=0(root) 组=0(root)
    ```

#### 用户密码文件

- /etc/shadow存储密码加密后的密文,又称为“影子文件”,该文件为了保证了账户密码的安全性只有 root 账户拥有读权限,注意:若该文件权限发生变化,需要留心恶意攻击

```bash
[root@server ~]# ll  /etc/shadow
----------. 1 root root 1130  4月 26 14:39 /etc/shadow

[root@server ~]# head  -1 /etc/shadow
root:$6$u6dOBCaz335byzFq$WcZK5t3EAHzCxy0AP8rscP/CrM/SZLzZZDCzkE2T6yiVpnSz92iWt/wd4jL9oBfFglbVrdhsUmRCVfWKTqNdv/::0:99999:7:::    
```

- /etc/shadow文件中的每行9个字段的含义为:

```bash
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
```

#### 工作组账号文件

- /etc/group文件存储每个组工作组信息

```bash
[root@server ~]# ll  /etc/group
-rw-r--r--. 1 root root 810  4月 26 14:39 /etc/group
[root@server ~]# head -1 /etc/group
root:x:0:
```

- 字段说明:           

| **字段**  | **说明**                                                     |
| --------- | ------------------------------------------------------------ |
| Groupname | 组的名字                                                     |
| Passwd    | 组的加密口令                                                 |
| GID       | 是系统区分不同组的ID,在/etc/passwd域中的GID字段是用这个数来指定账户的基本组 |
| Userlist  | 是用“,”分开的账户名,列出的成员以该组为附加组               |

## 用户管理

### 添加新用户

#### 格式

```bash
useradd   -参数  账户名
```

#### 参数

```bash
-c 注释信息:设置相关的说明信息,如,:真实姓名、邮箱地址等。
-d:目录:设定账户的家目录(默认为/home/用户名)。
-e YYYY-MM-DD:设置用户的失效日期,此日期后将不能使用该账号。
-f 天数:指定密码到期后多少天账号被禁用,若指定为0,则表示账号到期后被立即禁用;若指定    为-1,则表示账号过期后不被禁用(即密码永不过期)。
-g 组名或GID号:为账户指定所属的基本组,该组在指定时必须已存在。
-G:组名或GID号列表:为账户指定所属的扩展组,各组在指定时已存在,附加组可以有多个,组之间用“,”分隔。
-M:不创建账户家目录。
-N:不创建与账户名同名的基本组。
-p:密码:指定账户的登录密码。
-s shell名:指定账户登录后使用的Shell,默认是bash。
-u 用户号:设置账号的UID,默认是已有账户的最大UID加1。如果同时有-o选项,则可以重复使用其他用户的标识号。
```

***chgrp命令***

chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。

命令格式
chgrp [选项] [组] 文件...

选项
-c或——changes:效果类似“-v”参数,但仅会显示更改的部分;
-f或–quiet或——silent:不显示错误信息;
-h或–no-dereference:只对符号连接的文件作修改,而不是该其他任何相关文件;
-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose:显示指令执行过程;
–reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
命令参数
组:指定新工作名称;
文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。

示例

改变目录的属组,包括目录下的所有文件
> chgrp -R www rumenz
> 1
> 根据指定文件改变文件的群组属性
> chgrp --reference=1.txt 2.txt
> 1
> 改变文件2.txt的群组属性,使得文件2.txt的群组属性和参考文件1.txt的群组属性相同

通过群组识别码改变文件群组属性
> creep -R 27 ruemnz
> 1
> 27代表的是mysql组
>

- 例1:新建账户test1,查看对应配置文件和家目录

```bash
[root@server ~]# useradd test1

[root@server ~]# tail  -1  /etc/passwd
test1:x:1001:1001::/home/test1:/bin/bash

[root@server ~]# tail  -1  /etc/shadow
test1:!!:19483:0:99999:7:::   # 注意 :!!表示密码尚未设置

[root@server ~]# ls  -ld /home/test1
drwx------. 3 test1 test1 78  5月  6 13:55 /home/test1

[root@server ~]# ls  -A /home/test1
.bash_logout  .bash_profile  .bashrc  .mozilla
```

- 例2:新建账户test2,指定UID为2001、登录Shell为/bin/bash,账号永不过期

```bash
[root@server ~]# useradd  -u  2001  -s  /bin/bash -e  -1  test2
```

- 例3:新建用于访问FTP的test3账户,禁止其登录且不创建家目录

```
[root@server ~]# useradd  -M  -s /sbin/nologin  test3
```

- 例4:新建账户test4,UID=3001, 工作组=test1 , 家目录=/test

```bash
[root@server ~]# useradd  test4  -u  3001  -g  test1  -d  /test 
```

### 修改账户信息

#### 格式

```bash
usermod   -参数   账户名
```

#### 参数

- 常用参数 -c,-d,-m,-g,-G,-s,-u 等,意义与useradd命令中的参数相同
- -l   新账户名:更改账户的名称,必须在该用户未登录的情况下才能使用
- -L:锁定(暂停)用户账户,使其不能登录使用
- -U:解锁用户账户

#### 示例

- 例1:将用户test1的名称修改为TEST1,并暂停使用该账号

```bash
[root@server ~]# usermod  test1  -l  TEST1  -L
```

- 例2:将上例账户test4的家目录移至/home/test4目录下

```bash
[root@server ~]# ls /home

[root@server ~]# mkdir  /home/test4

[root@server ~]# usermod  test4  -d  /home/test4

[root@server ~]# tail  -1  /etc/passwd
test4:x:3001:1001::/home/test4:/bin/bash
```

### 账号设置密码

#### 原则

- Linux的账户必须设置密码后,才能登录系统

#### 格式

```bash
passwd  -  参数  账户名
```

#### 参数

```bash
-d:清空指定用户的口令,与未设置口令的账户不同,未设置口令的账户无法登录系统,而口令为空的账户可以。
-e:使用户的账号密码立即过期,强迫用户下次登录时必须修改口令。
-i:口令过期后多少天停用账户。
-l:锁定(停用)用户账户。
-n:指定口令的最短存活期。
-x:指定密码的最长使用期限。
-u:解锁用户账户。
```

#### 示例

- 例1:设置root账户密码

```bash
[root@server ~]# passwd root
更改用户 root 的密码 。
新的密码: 
无效的密码: 密码少于 8 个字符
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。
```

- 例2:为上例test2、test4设置密码

- 例3:锁定账户test2,尝试登录

```bash
[root@server ~]# passwd  -l  test2
```

#### 注意

- 密码不能为空
- 密码不要写成回文
- 可以使用以下命令设置密码

```bash
echo 密码 | passwd  --stdin 用户名
```

```bash
echo 密码 | passwd  --stdin 用户名  >  /dev/null    # 无信息提示
```

- 只有 root 用户才能指定用户名

```bash
[root@server ~]# useradd test5
[root@server ~]# passwd  test5
更改用户 test5 的密码 。
新的密码: 
无效的密码: 密码少于 8 个字符
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# su test5
[test5@server root]$ passwd  test5
passwd:只有 root 户才能指定用户名。
```

### 删除账号

#### 格式

```bash
userdel  账户名
```

#### 参数

- -r:在删除该账户的同时,一并删除该账户对应的家目录

#### 示例

- 例:删除上例的TEST1、test2、test3、test4

```bash
[root@server ~]# userdel    -r  TEST1

[root@server ~]# userdel    -r  test2
userdel: user test2 is currently used by process 33647

# 上述问题在于使用su登录了账户,可以通过ctrl+d多次退出再次尝试
[root@server ~]# userdel  -r  test2
[root@server ~]# userdel  -r  test3
[root@server ~]# userdel  -r  test4
```

### 账户切换

#### 格式

```bash
su   账户名
```

#### su和su - 命令区别

- 区别:加载的配置文件不一样
- `su`切换方式加载的文件:`~/.bashrc,/etc/bashrc`
- `su -`切换方式加载的文件:`/etc/bashrc,/etc/profile,~/.bashrc,~/.bash_profile`

- 注意:su  - 相当于重新建立环境,若全局变量需要继续使用则不能使用su  - 命令

#### 注意

- 从root用户切换到任何用户不需要密码验证,而从普通用户到root或其他普通用户均需要输入目标用户的密码且验证成功后才可切换。

### 控制用户对系统命令的使用权限

#### 作用

- 使用`sudo`命令可以提高普通用户的操作权限,使用前需要root进行配置
- 例

```bash
[root@server ~]# su  fox
[fox@server root]$ cd  /root
bash: cd: /root: 权限不够
[fox@server root]$ sudo  cd  /root

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] fox 的密码:
fox 不在 sudoers 文件中。此事将被报告。
```

#### sudo的执行流程如下:

- 当执行sudo提权时,需要输入自己密码来确认(root执行sudo时不需要输入密码)
- 若密码输入成功,系统会去/etc/sudoers文件中查找该用户是否有执行sudo的权限
- 若用户具有执行sudo的权限,便开始sudo后续接的命令;

#### 配置/etc/sudoers文件方式

- 执行visudo  或  vim /etc/sudoers

```bash
[root@server ~]# visudo

   root     ALL=(ALL)              ALL
# 账户名  允许使用的主机=(以谁的身份)  可执行的命令列表

#说明:ALL是关键字,代表任何身份、主机或命令。
```

#### 示例

- 例::上例继续

```bash
[root@server ~]#  vim /etc/sudoers
# 定位100行输入:
fox        ALL=(ALL)    ALL
# 需要wq!强制保存退出
[root@server ~]# su fox
[fox@server root]$ cd /root
bash: cd: /root: 权限不够
[fox@server root]$ sudo  cd /root
[sudo] fox 的密码:
[fox@server root]$ pwd
/root
```

## 工作组管理 

### 创建工作组

#### 格式

```bash
groupadd   -参数  工作组名
```

#### 参数

-g   GID:指定新工作组的GID,默认值是已有的最大的GID加1
​-r: 建立一个系统组账号,与-g不同时使用时,则分配一个1~999的GID

#### 示例

- 例1:新建工作group1

```bash
root@server ~]# groupadd  group1
```

- 例2:向系统中添加一个组ID为2000,组名为group2的新组

```bash
[root@server ~]# groupadd  group2  -g  2000 
[root@server ~]# tail  -2  /etc/group
group1:x:1002:
group2:x:2000:
```

### 修改工作组

#### 格式

```bash
groupmod  -参数   工作组名
```

#### 参数

- -g  GID——为用户组指定新的组标识号
- -n  新用户组——将用户组的名字改为新名字修改用户组的名称和用户组的GID值

#### 示例

- 例:将组group1的GID修改为3000,组名修改为group11

```bash
[root@server ~]# groupmod  -g  3000  -n  group11  group1

[root@server ~]# tail  -1  /etc/group
group11:x:3000:
```

### 添加/删除组成员

#### 格式

```bash
gpasswd -参数  账户  工作组
```

#### 参数

```bash
-r : 删除组密码
-a : 把用户加入组
-d : 把用户从组中删除。
-M : 可同时添加多个用户
-A : 给组指派管理员。
```

#### 示例

- 例:新建账户temp1、temp2后加入group2组,并指派temp1为group2工作组的管理员

```bash
[root@server ~]# gpasswd  -a  temp1  group2
正在将用户“temp1”加入到“group2”组中

[root@server ~]# gpasswd  -a  temp2  group2
正在将用户“temp2”加入到“group2”组中

[root@server ~]# gpasswd  -A  temp1  group2
```

#### 注意

- 只有root用户和组管理员才能够使用该命令

### 删除工作组

#### 格式

```bash
groupdel  工作组名
```

#### 示例

- 例1:删除组group11

```bash
[root@server ~]# groupdel  group11
```

#### 注意

- 被删除的组若是基本组,则必须先删除引用该基本组的用户,然后再删除该基本组

  

## 查看用户登录系统的情况

### users命令

#### 作用

- 查看当前登录系统的用户

#### 例

```bash
[root@server ~]# users
root
```

### last命令

#### 作用

- 列出目前与过去登入系统的用户相关信息,该命令默认会去读取/var/log/wtmp文件,并把该文件记录的登入系统的用户名单全部显示出来

#### 例

```bash
[root@server ~]# last
root     pts/0        192.168.48.1     Sat May  6 14:36   still logged in
test4    tty2         tty2             Sat May  6 14:26 - 14:33  (00:07)
root     pts/2        192.168.48.1     Sat May  6 10:51 - 14:34  (03:43)
root     pts/1        192.168.48.1     Wed Apr 26 15:40 - 12:40 (9+21:00)
root     tty2         tty2             Wed Apr 26 15:16 - 14:18 (9+23:01)
reboot   system boot  5.14.0-162.6.1.e Wed Apr 26 15:15   still running
root     tty2         tty2             Wed Apr 26 14:55 - down   (00:19)
reboot   system boot  5.14.0-162.6.1.e Wed Apr 26 14:54 - 15:15  (00:20)
root     tty2         tty2             Wed Apr 26 14:45 - crash  (00:09)
reboot   system boot  5.14.0-162.6.1.e Wed Apr 26 14:43 - 15:15  (00:32)

wtmp begins Wed Apr 26 14:43:13 2023
[root@server ~]# last  -2   # 最近2条登录信息
root     pts/0        192.168.48.1     Sat May  6 14:36   still logged in
test4    tty2         tty2             Sat May  6 14:26 - 14:33  (00:07)

wtmp begins Wed Apr 26 14:43:13 2023
[root@server ~]# last -f /var/log/wtmp  -n 3
root     pts/0        192.168.48.1     Sat May  6 14:36   still logged in
test4    tty2         tty2             Sat May  6 14:26 - 14:33  (00:07)
root     pts/2        192.168.48.1     Sat May  6 10:51 - 14:34  (03:43)

wtmp begins Wed Apr 26 14:43:13 2023
```

### lastlog命令

#### 作用

- 查看每个账号的最近登录时间,该命令会读取/var/log/lastlog文件

#### 例

```bash
[root@server ~]# lastlog
Username      Port     From             Latest
root          pts/0    192.168.48.1     六 5月  6 14:36:03 +0800 2023
bin                                     **从未登录过**
daemon                                  **从未登录过**
……
```

### w命令

#### 作用

- 显示登录到系统的用户信息

#### 例

```bahs
[root@server ~]# w
 15:04:43 up  5:27,  1 user,  load average: 0.00, 0.02, 0.04
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0     14:36    1.00s  0.20s  0.01s w
```

#### 结果分析

- 第一行显示当前的系统时间、开机多久、登录到系统中的用户数和系统平均负载(平均负载是指在1分钟、5分钟、15分钟内系统负载情况)
- 第二行只是各个项目的说明
  - USER:表示登录系统的用户
  - TTY:表示用户使用的TTY名称
  - FROM:表示用户从哪里登录进来
  - LOGIN@:用户登录的日期和时间
  - idle:表示空闲时间
  - JCPU:在某段时间内所有与该终端相关的进程任务所耗费的cpu时间
  - PCPU:当前活动进程使用的系统时间
  - WHAT:表示当前用户执行的进程名称和选项
- 第三行以后,每行代表一个用户登录的信息。

### who命令

#### 作用

- 显示目前登录到系统的用户,会从/var/run/utmp文件来获取信息 

#### 例

 ```bash
[root@server ~]# who
root     pts/0        2023-05-06 14:36 (192.168.48.1)
[root@server ~]# who  -s
root     pts/0        2023-05-06 14:36 (192.168.48.1)
[root@server ~]# who  -a
           系统引导 2023-04-26 15:15
           运行级别 5 2023-04-26 15:16
           tty2         2023-05-06 14:33        33767 id=      终端=0 退出=0
           pts/1        2023-05-06 12:40        2470 id=ts/1  终端=0 退出=0
           pts/2        2023-05-06 14:34        32840 id=ts/2  终端=0 退出=0
root     + pts/0        2023-05-06 14:36   .    35228 (192.168.48.1)
 ```

#### 结果分析

| who命令的输出格式 | 名称         | 状态                         | 终端                 | 时间               | 活动                                                         | 进程标识              | 主机名                            |
| ----------------- | ------------ | ---------------------------- | -------------------- | ------------------ | ------------------------------------------------------------ | --------------------- | --------------------------------- |
| 说明              | 用户的登录名 | 表明终端是否对用户都是可写的 | 类似于pts/1、pts/2等 | 用户登录系统的时间 | 某个用户在自己的终端上最后一次活动发生以来到现在的时间,如果是".",表示一分钟内的终端活动 | 用户登录shell的进程id | 登录到linux系统上的客户端机器标识 |

```bash
[root@server ~]# who -b  列出系统最近启动的日期
         system boot  2022-05-09 15:38
[root@server ~]# who -m  列出关于当前终端的信息
root     pts/0        2022-05-09 15:38 (192.168.168.1)
[root@server ~]# who am i
root     pts/0        2022-05-09 15:38 (192.168.168.1)
[root@server ~]# who am I
root     pts/0        2022-05-09 15:38 (192.168.168.1)
[root@server ~]# who -q   列出在本地系统上的用户和用户数的清单
root
# users=1 

[root@server ~]# who -r  显示当前系统的运行级别
         run-level 3  2022-05-09 15:38
[root@server ~]# who -u  显示当前每个用户的用户名、登录终端、登录时间、终端活动、进程和主机名
root     pts/0        2022-05-09 15:38   .          1510 (192.168.168.1)
[root@nserver ~]# who -T  显示tty终端的状态,“+”表示对任何人可写,“-”表示仅对root用户或所有者可写,“?”表示遇到终端故障
root     + pts/0        2022-05-09 15:38 (192.168.168.1)
[root@server ~]# who -w   和-T一样
root     + pts/0        2022-05-09 15:38 (192.168.168.1)
```

# 第九章 Linux文件系统权限

## 文件的一般权限

### 文件详细信息

![image-20220512154535149](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20220512154535149.png)

### 文件权限构成

#### 权限针对三类对象定义

- owner 所有者,缩写u

- group 所属组,缩写g

- other 其他人,缩写o

#### 访问者三种权限

![image-20230506171243191](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230506171243191.png)

#### 组成

| 字符表示 | 二进制表示 | 数字表示 |
| :------: | :--------: | :------: |
| **---**  |  **000**   |  **0**   |
| **--x**  |  **001**   |  **1**   |
| **-w-**  |  **010**   |  **2**   |
| **-wx**  |  **011**   |  **3**   |
| **r--**  |  **100**   |  **4**   |
| **r-x**  |  **101**   |  **5**   |
| **rw-**  |  **110**   |  **6**   |
| **rwx**  |  **111**   |  **7**   |

![image-20191227105848298](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/dir5.jpg)

#### 文件与目录权限含义

| 权限         | 对文件的影响               | 对目录的影响                                                 |
| ------------ | -------------------------- | ------------------------------------------------------------ |
| r(read)    | 可以读取文件的内容         | 可以列出目录的内容,即目录下的文件的文件名                   |
| w(write)   | 可以更改文件的内容         | 可以创建或者删除目录中的任一文件(只有w权限无法创建删除文件,需要和x权限一起使用) |
| x(execute) | 可以作为可执行文件,如脚本 | 可以切换到目录,如cd命令                                     |

| 文件可能出现的权限      | 目录可能出现的权限 |
| ----------------------- | ------------------ |
| ---、r--、r-x、rw-、rwx | ---、r-x、rwx      |

#### 注意

- root账户不受文件权限的读写限制,执行权限受限制

#### 示例

- 例1:写出下列文件的字符权限
  - 764 : rwxrw-r--
  - 642: rw-r---w-
  - 153: --xr-x-wx
  - 731: rwx-wx--x
- 例2:写出下列文件的数字权限
  - r-xrw-r-- :  564
  - rw--w--wx : 623
  - rw-r--r-- :  644

### chmod命令

#### 作用

- chmod(change mode):修改文件或目录的权限

#### 格式

```bash
# 格式1
chmod  [选项]  [ugoa][+-=][rwx]  文件或目录...

# 格式2
chmod  [选项]  nnn  文件或目录...`
```

#### 参数

- -R:递归修改指定目录下所有文件、子目录的权限

- ugoa:表示权限设置所针对的用户类别,可以是其中字母中的一个或组合,u(user)表示文件或目录的属主(所有者);g(group)表示属组内的用户;o(others)表示其他用户;a(all)表示所有用户(即u+g+o)
- +或-或=:表示设置权限的操作动作,+代表添加;-代表取消;=表示只赋予给定的权限,并取消原有的权限。
- rwx:用字符形式表示的所设置的权限,可以是其中一个字母或组合
- nnn:用数字表示的权限

#### 示例

- 例1

```bash
[root@server ~]# touch  t1.txt
[root@server ~]# ll  t1.txt
-rw-r--r--. 1 root root    0  5月  6 17:29 t1.txt

[root@server ~]# chmod  +x  t1.txt
[root@server ~]# ll  t1.txt
-rwxr-xr-x. 1 root root 0  5月  6 17:29 t1.txt

[root@server ~]# chmod  o+w  t1.txt
[root@server ~]# ll  t1.txt
-rwxr-xrwx. 1 root root 0  5月  6 17:29 t1.txt
```

- 例2

```bash
[root@server ~]# touch  t2.txt
[root@server ~]# ll  t2.txt
-rw-r--r--. 1 root root 0  5月  6 17:27 t2.txt
[root@server ~]# chmod  777  t2.txt
[root@server ~]# ll  t2.txt
-rwxrwxrwx. 1 root root 0  5月  6 17:27 t2.txt
[root@server ~]# chmod  000  t2.txt
----------. 1 root root 0  5月  6 17:27 t2.txt
```

- 例3

```bash
[root@server ~]# mkdir  -p  m1/m2/m3
[root@server ~]# touch  m1/m2/m3/t3.txt
[root@server ~]# cd m1
[root@server m1]# tree
.
└── m2
    └── m3
        └── t3.txt

2 directories, 1 file

[root@server m1]# cd ..
[root@server ~]# ls -ld  m1

drwxr-xr-x. 3 root root 16  5月  6 17:33 m1
[root@server ~]# cd m1

[root@server m1]# ls -ld m2
drwxr-xr-x. 3 root root 16  5月  6 17:33 m2

[root@server m1]# cd m2
[root@server m2]# ls -ld m3
drwxr-xr-x. 2 root root 20  5月  6 17:34 m3

[root@server m2]# cd m3
[root@server m3]# ll t3.txt
-rw-r--r--. 1 root root 0  5月  6 17:34 t3.txt

[root@server ~]# chmod -R 755  m1   # 递归设置
[root@server ~]# ll m1
总用量 0
drwxr-xr-x. 3 root root 16  5月  6 17:33 m2
[root@server ~]# cd m1
[root@server m1]# ll m2
总用量 0
drwxr-xr-x. 2 root root 20  5月  6 17:34 m3
[root@server m1]# cd m2
[root@server m2]# ll m3
总用量 0
-rwxr-xr-x. 1 root root 0  5月  6 17:34 t3.txt

```

### chown命令

#### 作用

- 修改文件或目录的所有者和属组

#### 格式

- 修改文件或目录的所属者

```bash
chown   -参数  所有者:所属组  文件名或目录名
# 参数-R递归设置
```

#### 示例

```bash
[root@server m2]# cd  ~
[root@server ~]# touch  t4.txt
[root@server ~]# ll t4.txt
-rw-r--r--. 1 root root 0  5月  6 17:40 t4.txt
[root@server ~]# chown  fox:fox t4.txt
[root@server ~]# ll t4.txt
-rw-r--r--. 1 fox fox 0  5月  6 17:40 t4.txt
```

## 特殊权限

### 概述

- 在Linux系统中,用户对文件或目录的访问权限除了r、w、x三种一般权限外,还有SET UID(SUID)、SET GID(SGID)、Sticky Bit(粘滞位)三种特殊权限,用于对文件或目录进行更加灵活方便的访问控制。

- SUID 权限的含义:是为了让一般用户在执行某些程序的时候, 在程序的运行期间, 暂时获得该程序文件所属者的权限。  

### SUID权限

#### 使用场景

- 例如:student用户要更改自己的密码
-  student 在执行 passwd 修改自己的密码时, 其修改的密码, 最终是需要保存到 /etc/shadow 这个文件中, 而这个文件的权限是 `---------`,它的拥有者是 root ,也只有 root 可以“ 强制” 存储, 其他用户连看都不行
- 可偏偏 student 去执行 passwd (/usr/bin/passwd) ,却可以更新自己的密码
- 这就是因为有 s 权限的存在,当 s权限在拥有者的权限位上时, 即如`-rwsr-xr-x`这样时, 称为 `SUID`。SUID 即 Set UID , UID 指的是拥有者的的 ID, 而这个程序 (/usr/bin/passwd) 的拥有者为(root) 。    

```bash
[root@server ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 32648  8月 10  2021 /usr/bin/passwd
```

#### 注意:

-  suid仅对二进制文件有效
- 在执行过程中,调用者会暂时获得该文件的所有者权限
- 该权限只在程序执行的过程中有效

### SGID 权限

#### SGID 可以用在两个方面:

- 文件: 如果 SGID 设置在二进制文件上, 则不论用户是谁,在执行该程序的时候,程序的所属组将会变成该程序文件的所属组。
- 目录:如 果 SGID 是设置在 A 目录上, 则在 A 目录内所建立的文件或目录的所属组, 将会是此 A 目录的所属组

#### 注意

- 一般SGID 多用在特定的多人团队的项目开发上,在系统中用的很少

### Sticky Bit权限

- Sticky Bit (SBit) 当前只针对目录有效, 对文件没有效果。
- 其对目录的作用:
  - 在 具 有 SBit 的目录下, 用户若在该目录下具有 w 及 x 权限 , 则当用户在该目录下建立文件或目录时, 只有文件拥有者与 root 才有权力删除。
  - 例如:当 student 用户属于 A 目录的组成员或属于 other ,且拥有 wx 权限时, 可以对该目录内任何人建立的目录或文件进行“ 删除/重命名/移动” 等操作。 如果将 A 目录加上了 Sticky Bit 权限, 则 student用户只能针对自己建立的文件或目录进行“ 删除/重命名/移动” 等操作。

### 设置特殊权限

- 为文件或目录添加三种特殊权限同样可以通过chmod命令来实施,使用“u±s”、“g±s”、“o±t”的字符权限模式分别用于添加和移除SUID、GUID、sticky权限。

- 若使用数字形式的权限模式,可采用“nnnn”格式的四位八进制数字表示,其中:后面三位是一般权限的数字表示,前面第一位则是特殊权限的标志数字:

> ​    0——表示不设置特殊权限
> ​    1——表示只设置sticky
> ​    2——表示只设置GUID权限
> ​    3——表示只设置SGID和sticky权限
> ​    4——表示只设置SUID权限
> ​    5——表示只设置SUID和sticky权限
> ​    6——表示只设置SUID和SGID
> ​    7——表示同时设置SUID、GUID、sticky3种权限

## ACL 权限

###  作用

- 给指定的用户指定目录分配指定的权限。

### ACL权限管理命令

#### 查看ACL权限

- 格式

```bash
getfacl  文件名
```

- 例

```shell
[root@server ~]# touch  temp.cfg

[root@server ~]# getfacl  temp.cfg   # getfacl命令
# file: temp.cfg
# owner: root
# group: root
user::rw-
group::r--
other::r--
```

#### 设定ACL权限

- 格式

```bash
setfacl  -参数  文件名
```

- 参数

```bash
-m:设定 ACL 权限
    给用户设定 ACL 权限:setfacl -m u:用户名:权限 指定文件名
    给用户组设定 ACL 权限:setfacl -m g:组名:权限 指定文件名

-x:删除指定的 ACL 权限;

-b:删除所有的 ACL 权限;

-d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;

-k:删除默认 ACL 权限;

-R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效
```

#### 示例

- 例:root用户在根目录下创建目录/project及所属工作组QQgroup,所属组里面创建两个用户zhangsan和lisi,此文件权限是770,再创建一个旁听用户 pt,给他设定/project目录的 ACL 为 r-x。

```shell
[root@server ~]# mkdir /project
[root@server ~]# useradd zhangsan
[root@server ~]# useradd lisi
[root@server ~]# groupadd QQgroup
[root@server ~]# gpasswd -M zhangsan,lisi QQgroup
[root@server ~]# chown root:QQgroup /project
[root@server ~]# chmod 770 /project
[root@server ~]# ll -d /project
drwxrwx---. 2 root QQgroup 6  5月  6 18:12 /project
[root@server ~]# useradd pt   # 新建旁听账户
[root@server ~]# setfacl -m u:pt:rx /project
[root@server ~]# ll -d /project  # 注意:某文件下有+标志则说明其具有acl权限
drwxrwx---+ 2 root QQgroup 6  5月  6 18:12 /project
[root@server ~]# getfacl /project
getfacl: Removing leading '/' from absolute path names
# file: project
# owner: root
# group: QQgroup
user::rwx
user:pt:r-x
group::rwx
mask::rwx
other::---

```

```shell
# 为了验证 pt 用户对于 /project 目录没有写权限,我们用 su 命令切换到 pt 用户,然后进入 /project 目录,在此目录下创建文件,看是否能成功:
[root@server ~]# su - pt
[pt@server ~]$ cd /project
[pt@server project]$ touch test.txt
touch: 无法创建 'test.txt': 权限不够
```

###  删除acl权限

```shell
# 删除指定用户的 ACL 权限
setfacl -x u:用户名 文件名
# 删除指定用户组的 ACL 权限
setfacl -x g:组名 文件名
# 删除文件的所有 ACL 权限
setfacl -b 文件名
```

## 权限掩码umask

### 新建文件权限与umask关系

- 在Linux系统中,当用户创建一个新的文件或目录时,系统都会为新建的文件或目录分配默认的权限,该默认权限与umask值有关

- 新建文件的默认权限=0666-umask值    (减去)
- 新建目录的默认权限=0777-umask值

### 查看默认umask值

```shell
[root@server ~]# umask
0022

0022
[root@server ~]# touch  file1
[root@server ~]# mkdir  dir1

[root@server ~]# ll  -d  file1 dir1
drwxr-xr-x. 2 root root 6  5月  6 18:23 dir1    #  755
-rw-r--r--. 1 root root 0  5月  6 18:23 file1   #  644

```

### 修改默认umask

```bash
[root@server ~]# umask 000     # 临时修改
[root@server ~]# touch  file2
[root@server ~]# mkdir  dir2
[root@server ~]# ll -d  file2  dir2
drwxrwxrwx. 2 root root 6  5月  6 18:26 dir2
-rw-rw-rw-. 1 root root 0  5月  6 18:25 file2
```

# 第十章 管理Linux的联网


## RHEL9版本特点

- 在RHEL7版本中,同时支持network.service和NetworkManager.service(简称NM)。

- 在RHEL8上默认只能通过NM进行网络配置,包括动态ip和静态ip,若不开启NM,否则无法使用网络

- RHEL8依然支持network.service,只是默认没安装,可以通过`yum install network-scripts`来安装传统的network.service,不过redhat说了,在下一个rhel的大版本里将彻底废除,因此不建议用network.service。

- 在RHEL9上,使用NM进行网络配置,ifcfg (也称为 文件)将不再是网络配置文件的主存储。虽然 ifcfg 样式仍然可用,但它不再是 NetworkManager 存储新网络配置文件的默认位置。从 RHEL 9.0 开始,RHEL 以 key-file 格式在 /etc/NetworkManager/system-connections/ 中存储新的网络配置。配置以旧格式存储在 /etc/sysconfig/network-scripts/ 中的连接仍然可以正常工作。对现有配置集的修改会继续更新旧的文件。

## NM特点

- NetworkManager是2004年Red Hat启动的项目,旨在能够让Linux用户更轻松地处理现代网络需求,能自动发现网卡并配置ip地址。

- **NetworkManager的特点**

  - **NM能管理各种网络**

    > 有线网卡、无线网卡
    > 动态ip、静态ip
    > 以太网、非以太网
    > 物理网卡、虚拟网卡

  - **工具齐全**:命令行、文本界面、图形界面、web

  - **广纳天地**:管理各种网络,有线、无线、物理、虚拟

  - **参数丰富**:多达200多项配置参数(包括ethtool参数)

  - **一统江湖**:RedHat系、Suse系、Debian/Ubuntu系,均支持

  - **大势所趋**:下一个大版本的rhel只能通过NM管理网络

##  配置网络

### 概念

- 网络接口是指网络中的计算机或网络设备与其他设备实现通讯的进出口,一般是指计算机的网络接口即网卡设备

- 从RHEL7开始引入了一种新的“一致网络设备命名”的方式为网络接口命名,该方式可以根据固件、设备拓扑、设备类型和位置信息分配固定的名字。网络接口的名称的前两个字符为网络类型符号,如:
  - en——表示以太网(Ethernet)
  - wl表示无线局域网(wlan)
  - ww表示无线广域网(wwan);
- 接下来的字符根据设备类型或位置选择,如: 
       o——表示内置(onboard)于主板上的集成设备(即集成网卡)及索引号;
         s——表示是插在可以热拔插的插槽上的独立设备及索引号;
         x——表示基于MAC地址命名的设备;
         p——表示PCI插槽的物理位置及编号。

- 注意:一个网络接口,可以有多个网络连接,但同一时间只能有一个网络连接处于活动状态。

### 方法

#### nmcli命令

- 作用:nmcli,可以实现创建,显示,编辑,删除,激活和停用网络连接以及控制和显示网络设备状态等
- 查看网卡信息

```bash
[root@server ~]# nmcli  c  show   # 全写为:nmcli connection show
[root@server ~]# nmcli con show ens160  # 查看指定网卡的详细信息,q键退出
[root@server ~]# nmcli dev status  #查看已有设备的连接状态
[root@server ~]# nmcli dev show  # 看所有网络设备详情,q键退出
```

- 激活和关闭网络连接

```bash
[root@server ~]# nmcli c up 网卡名  # 激活,也是重启网卡的一种方法
[root@server ~]# nmcli c down 网卡名  # 关闭
```

- 添加网络连接

```bash
# 例:添加网络连接ens161
[root@server ~]# nmcli c add type ethernet ifname ens160 con-name ens161 autoconnect yes  ip4 192.168.48.135/24  gw4 192.168.48.2
连接 "ens161" (37bc8e79-92ea-4c01-a4af-1dfd7c687014) 已成功添加。

[root@server ~]# nmcli  c  up  ens161   # 不能在xshell操作,否则ssh连接断掉
[root@server ~]# nmcli  c show
[root@server ~]# nmcli  c  up  ens160
```

- 设置静态IP

```bash
[root@server ~]# nmcli c modify ens160 ipv4.method manual  ipv4.addresses '192.168.48.134/24'  ipv4.gateway '192.168.48.2'  ipv4.dns  '114.114.114.114'
[root@server ~]# nmcli  c  up  ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)
[root@server ~]# ip a

# ipv4.method manual:手动获取**
```

- 增加ip地址

```bash
[root@server ~]# nmcli c mod ens160 +ipv4.addresses 192.168.48.136/24
[root@server ~]# nmcli  c  up  ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@server ~]# ip a
```

- 删除网络连接

```bash
# 删除上例的ens161
[root@server ~]# nmcli  c  show
NAME    UUID                                  TYPE      DEVICE 
ens160  0f83fcfd-bc6d-3866-b82b-fc4b09df2068  ethernet  ens160 
ens161  37bc8e79-92ea-4c01-a4af-1dfd7c687014  ethernet  --     
[root@server ~]# nmcli  c  del  ens161
成功删除连接 "ens161" (37bc8e79-92ea-4c01-a4af-1dfd7c687014)。
[root@server ~]# nmcli  c  show
NAME    UUID                                  TYPE      DEVICE 
ens160  0f83fcfd-bc6d-3866-b82b-fc4b09df2068  ethernet  ens160 
```

#### 修改配置文件

```shell
# 设置静态IP

[root@server ~]# cd /etc/NetworkManager/system-connections
[root@server system-connections]# ls
ens160.nmconnection
[root@server system-connections]# vim ens160.nmconnection 

[connection]
id=ens160
uuid=d97d603d-5bb5-3d11-bfeb-11fbc8cb867d
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1682493359

[ethernet]

[ipv4]
address1=192.168.48.134/24,192.168.48.2
dns=114.114.114.114;
method=manual

[ipv6]
addr-gen-mode=eui64
method=auto

[proxy]


[root@server ~]# nmcli c reload 
[root@server ~]# nmcli c up ens160 

# 会话和网卡的关系:一个网卡可以有多个会话,但是一个时刻只能连接到一个会话
```

#### 可视化配置

- 命令:nmtui
- image-20230506185547675

### ping命令

#### 作用

- 用来检测网络的连通情况和分析网络速度
- 根据域名得到服务器 IP
- 根据 ping 返回的 TTL 值来判断对方所使用的操作系统及数据包经过路由器数量。

- 格式

```bash
ping  -参数  目标主机IP或域名
```

#### 参数

- -c 数字:用于设定本命令发出的ICMP消息包的数量,若无此选项,则会无限次发送消息包直到用户按【Ctrl+C】组合键才终止命令。
- -s 字节数:设置ping命令发出的消息包的大小,默认发送的测试数据大小为56字节;自动添加8字节的ICMP协议头后,显示的是64字节;再添加20字节的IP协议头,则显示的为84字节。最大设置值为65507B
- -i 时间间隔:设定前后两次发送ICMP消息包之间的时间间隔,无此选项时,默认时间间隔为1秒。为了保障本机和目标主机的安全,一般不要小于0.2秒
- -t:设置存活时间TTL(Time To Live)

```bash
[root@server ~]# ping -c 2  www.baidu.com
```

#### 显示内容分析

- **bytes 值:**数据包大小,也就是字节

- **time 值:**响应时间,时间越小,速度越快

- **TTL 值:**Time To Live, 表示 DNS 记录在 DNS 服务器上存在的时间,它是 IP 协议包的一个值,告诉路由器该数据包何时需要被丢弃。通过TTL 值判断目标系统类型:默认情况下,Linux 系统的 TTL 值为 64 或 255,win11 系统值为644,UNIX 主机的 TTL 值为 255

  

## 通过域名访问主机

### 静态解析

#### 作用

- 通过配置/etc/hosts文件实现域名解析

#### 方法

```bash
[root@server ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.134   www.openlab.com

[root@server ~]# ping www.openlab.com
```

### DNS域名解析

## 从网站下载文件

### wget命令

#### 作用

- 用于在终端命令行里下载网络文件,英文全称为:“web get”

#### 格式

```bash
wget  -参数  URL
```

#### 参数

```bash
-P  下载到指定目录 
-t  最大尝试次数 
-b  后台下载模式
-c  断点续传  
-p  下载页面内所有资源,包括图片、视频等 
-r  递归下载
```

```bash
[root@server ~]# wget  https://dldir1.qq.com/qqfile/qq/QQNT/2355235c/linuxqq_3.1.1-11223_x86_64.rpm

# 下载qq软件
```

2、curl命令是一个网络工具,其主要作用是通过http、https、ftp等方式下载/上传文件

```bash
[root@server ~]# curl www.baidu.com -o index.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2381  100  2381    0     0  23343      0 --:--:-- --:--:-- --:--:-- 23116

[root@server ~]# ll  index.html 
-rw-r--r--. 1 root root 2381  5月  6 19:12 index.html
```

## VMware三种网络模式

### 概述

- vmware提供三种网络工作模式:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)
- ![image-20230507091606567](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507091606567.png)
- vmware->编辑菜单->虚拟网络编辑器

image-20230507091730407

### Bridged(桥接模式)

#### 概念

- 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信
- 在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰
- 在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致

#### 分析图

![image-20230507091913737](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507091913737.png)

#### 注意

- 虚拟交换机必须桥接到本机电脑使用的网卡,不要选自动
- 虚拟机的ip跟本机同一个网段,网关相同
- 桥接模式配置简单,如果网络环境中ip资源很缺少或对ip管理比较严格,则桥接模式就不太适合

### NAT(地址转换模式)

#### 工作原理

- NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。其网络结构如下图:

![image-20230507092256033](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507092256033.png)

#### 注意

- NAT模式是利用虚拟的NAT设备以及虚拟DHCP服务器来使虚拟机连接外网,VMware Network Adapter VMnet8虚拟网卡是用来与虚拟机通信的
- 如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择

### Host-Only(仅主机模式)

#### 概念

- Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的
- Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯

#### 工作原理

![image-20230507092720400](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507092720400.png)

# 第十一章 管理Linux软件包和进程

## 源码下载安装软件

### 概念

- 源码文件:程序编写者使用C或C++等语言编写的原始代码文本文件
- 源码文件使用.tar.gz或.tar.bz2打包成压缩文件

### 特点

- 源码包可移植性好,与待安装软件的工作环境依赖性不大

- 由于有编译过程,其代码运行效率较高,是针对当前使用者环境的“量体裁衣”

- 安装功能可以定制,可以选择需要的功能进行安装

- 卸载方便,只需删除对应安装目录即可,没有Windows“注册表”的概念

- 安装过程较为麻烦

### 安装过程

- 下载解压缩源码压缩包

- 分析安装软件环境

- 编译软件

- 安装软件

### 例:安装Apache源码包

#### 准备工作

- 安装必备的编译软件

```bash
[root@server ~]# yum  install  gcc   gcc-c++  -y
```

#### 下载apache源码包

```bash
[root@server ~]# wget  https://dlcdn.apache.org/httpd/httpd-2.4.57.tar.gz
```

#### 解压缩

```bash
[root@server ~]# tar  xzvf  httpd-2.4.57.tar.gz 
[root@server ~]# cd   httpd-2.4.57
```

#### 安装环境分析

- 软件包目录中有configure可执行文件,用于对安装环境进行测试、检测所需库文件、工具文件是否存在、检测依赖关系、编译器汇编器连接器的检查
- 执行方式:./configure

```bash
[root@server httpd-2.4.57]# ./configure
# 提示缺少apr软件,则安装
[root@server httpd-2.4.57]# yum install  apr* -y
[root@server httpd-2.4.57]# ./configure  # 重新检测
# 提示缺少pcre软件,下载安装
[root@server httpd-2.4.57]# yum  install  pcre*  -y
[root@server httpd-2.4.57]# ./configure
```

####  编译软件

- 作用:安装./configure命令生成的Makefile文件中记录的信息进行编译,生成二进制安装文件
- 格式:make
- 注意:make过程中若报错,需要查看提示信息,根据信息修改,一般为缺少头文件等问题

```bash
[root@server httpd-2.4.57]# make
# 提示缺少redhat-rpm-config软件包
[root@server httpd-2.4.57]# yum install redhat-rpm-config
[root@server httpd-2.4.57]# make
```

#### 安装软件

- 根据make命令生成的二进制安装文件,进行软件安装,默认安装目录:usr/local或者/usr/loacl/bin目录下

- 方法:make  install

```bash
[root@server httpd-2.4.57]# make  install
```

- 注意:也可以使用符号连接多条语句

```bash
./configure && make && make install  
```

## RPM管理工具

### 概念

#### RPM

- RPM(Redhat Package Manager)由Red Hat公司提出的一种软件包管理标准

- 是Linux各发行版中应用最广泛的软件包格式之一(还有debian的发行版deb安装包)。
- 产生原因:软件制作者在其工作环境下将软件编译完毕后再进行发布,以此减少安装编译时间,要求:软件安装环境与编译时的环境要相同  

#### RPM安装软件要求

- 软件安装环境必须与打包软件环境一致

- 必须满足软件依赖性

- 软件卸载时必须小心,最底层软件不能先卸载

#### rpm软件包命名格式

- 含义:软件名-版本号-发行号.操作系统版本.硬件平台的类型.rpm
- 如:zsh-5.0.2-14.el7.x86_64.rpm

| zsh    | -5       | 0        | 2      | 14           | el7         | x86         | 64           |
| ------ | -------- | -------- | ------ | ------------ | ----------- | ----------- | ------------ |
| 软件名 | 主版本号 | 次版本号 | 修订号 | 软件发布次数 | 发行商RHEL7 | CPU架构平台 | 支持系统位数 |

#### rpm包相关网站

- http://rpmfind.net/
- http://rpm.pbone.net/

### rpm软件安装

#### 格式

```bash
rpm  -参数   软件包名
```

#### 参数

| 参数          | 说明                           |
| ------------- | ------------------------------ |
| -i, --install | 安装软件包                     |
| --nodeps      | 不验证软件包依赖               |
| --force       | 安装时提示已安装则重新覆盖安装 |
| -v, --verbose | 提供更多的详细信息输出         |
| -U            | 软件包升级                     |
| -e            | 软件包卸载                     |

#### 安装过程:

- 读取PRM软件包头部数据,进行软件依赖性查询

- 若满足条件则安装否则安装失败

### 示例

#### 安装nginx

```bash
[root@server ~]# wget  http://nginx.org/packages/rhel/9/x86_64/RPMS/nginx-1.24.0-1.el9.ngx.x86_64.rpm

[root@server ~]# rpm -ivh  nginx-1.24.0-1.el9.ngx.x86_64.rpm 
```

#### 安装qq

```bash
[root@server ~]# cd  /
[root@server /]# wget  https://dldir1.qq.com/qqfile/qq/QQNT/2355235c/linuxqq_3.1.1-11223_x86_64.rpm

[root@server /]# rpm  -ivh  linuxqq_3.1.1-11223_x86_64.rpm 
错误:依赖检测失败:
    libXScrnSaver 被 linuxqq-3.1.1_11223-1.x86_64 需要
[root@server /]# yum install  libXScrnSaver
[root@server /]# rpm  -ivh  linuxqq_3.1.1-11223_x86_64.rpm 
```

![image-20230507101952745](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507101952745.png)

#### 直接下载并安装wps

```bash
[root@server /]# rpm  -ivh  https://wps-linux-personal.wpscdn.cn/wps/download/ep/Linux2019/11698/wps-office-11.1.0.11698-1.x86_64.rpm
```

![image-20230507102319605](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507102319605.png)

#### 卸载

```bash
[root@server /]# rpm -evh tree
```

### rpm查询功能

#### 格式

```bash
rpm –q  包名
# -q常与下面参数组合使用
```

| 参数 | 说明                                 |
| ---- | ------------------------------------ |
| -a   | 查询所有已安装的软件包               |
| -l   | 显示已安装软件包的相关文件列表和信息 |
| -f   | 查询文件所属软件包                   |
| -i   | 显示已经安装的rpm软件包信息          |

#### 示例

```bash
# 查询某个包有没有安装(包名不能写错)
[root@server ~]# rpm -q httpd

# 查询所有已经安装的包
[root@server ~]# rpm -qa

# 查询安装该包后会产生哪些文件
[root@server /]# rpm -ql gcc

#查询该文件由哪个软件包产生
[root@server /]# rpm -qf /usr/bin/ls
coreutils-8.30-12.el8.x86_64
```

## YUM/DNF管理工具  

### 概念

#### YUM

- YUM (Yellow dog Updater,Modified) 
- RHEL8中默认使用的软件批量管理工具由原版本的yum换成了速度更快的dnf(DNF = Dandified YUM),原有的yum命令仅为dnf的软链接,当然依旧可以使用。

```bash
[root@server /]# ll `which yum`

lrwxrwxrwx. 1 root root 5  9月 15  2022 /usr/bin/yum -> dnf-3
```

#### YUM/DNF 功能

- 在线下载、 安装、 卸载、 升级rpm软件包
- 自动查找并解决rpm包之间的依赖关系,一次性安装所有具有依赖关系的rpm包,而无需管理员逐个、 手工地去安装每一个rpm包 

#### 工作原理

- 将编译好的软件放置在YUM服务器中,并将这些软件的依赖性等信息记录下来形成表格组成数据库
- 用户安装软件时会向网络中的YUM服务器下载对应表格并与本机RPM数据库进行比较,最后一同下载全部软件进行安装,自动解决依赖性
- YUM软件仓库:记录软件依赖性等信息的数据库

![image-20230507103047008](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507103047008.png)

- 系统会去读取`/etc/yum.repos.d/`目录下的`.repo`结尾的文件,从该文件中读取以下内容实现装包:
  - 包含各种rpm安装文件的软件仓库(rhel8有两个仓库,rhel7只有一个仓库)
    - BaseOS存储库:提供一套核心的底层操作系统功能,为基础软件安装库
    - AppStream存储库:包括额外的用户空间应用程序、运行时语言和数据库

### 命令

```bash
# 查看包、包组相关信息
yum repolist [all]  # 查看系统中yum资源库配置信息
yum list all  # 列出仓库里所有可安装的软件包
yum list installed [包名]  # 列出己经安装的所有的或指定的rpm包(包名中可使用匹配符)
yum info 包名  # 查看指定软件包的详细信息
yum grouplist  # 查看仓库里而所有包组
yum groupinfo 包组名  #查看指定包组里而的详细信息

# 安装、更新包和包组
yum install [-y] 包名 # 安装指定的软件包,-y则在工作过程中需要使用者响应, 这个选个参数可以直接回答yes
yum update [-y] 包名 # 升级指定的软件包或主机中所有已安装的软件包
yum groupinstall 包组名 # 安装指定包组里面的所有包

# 卸载软件包
yum remove [-y] 包名 # 卸载已经安装在系统中的指定的软件包

# 搜索文件由哪个包产生
yum provides 文件名   # 查找指定的文件属于哪个包
yum whatprovides /etc/fstab   # 查看这个文件是由那个包提供的

# 模糊搜索包名
yum search 模糊包名 #  查看模糊包名的软件包
#  清空缓存
yum clean packages all #  清除下载到本机的指定的软件包或所有软件包的yum源缓存
```

### 配置yum源

#### 建立本地源

```bash
# 将本地光盘挂载至本地目录/media下
[root@server /]# mount /dev/cdrom /media
mount: /media: WARNING: source write-protected, mounted read-only.

# 注意有2个yum源
[root@server /]# cd /media/
[root@server media]# ls
AppStream  EFI   extra_files.json  images    media.repo               RPM-GPG-KEY-redhat-release
BaseOS     EULA  GPL               isolinux  RPM-GPG-KEY-redhat-beta

# 移动到yum源配置文件路径
[root@server media]# cd /etc/yum.repos.d
[root@server yum.repos.d]# ls
CentOS-9-Stream.repo  redhat.repo

# 备份已存在yum源配置文件,使其失效
[root@server yum.repos.d]# mv CentOS-9-Stream.repo CentOS-9-Stream.repo.back
[root@server yum.repos.d]# mv redhat.repo redhat.repo.back
[root@server yum.repos.d]# ls
CentOS-9-Stream.repo.back  redhat.repo.back

# 新建本地yum源配置文件
[root@server yum.repos.d]# vim  dvd.repo

[BaseOS]
name=BaseOS
baseurl=file:///media/BaseOS
gpgcheck=0

[Appstream]
name=Appstream
baseurl=file:///media/AppStream
gpgcheck=0

# 重建缓存
[root@server yum.repos.d]# yum  makecache
[root@server yum.repos.d]# yum repolist

# 验证能否装包成功
[root@master ~]# yum install tree -y
```

#### 建立网络源

- Redhat9暂时无公开的网络源,可以使用Centos9的yum源
- 使用xftp将配置文件上传到/etc/yum.repos.d目录
- 重建缓存生效

## 管理进程

### 概念

#### 程序、进程、线程

- 程序: 二进制文件,文件存储在磁盘中,例如/usr/bin/目录下
- 进程:进程是已启动的可执行程序的运行实例
- 进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程

- 线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

- 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有
- 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行。

#### 进程分类

![image-20191227133018237](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/proc1.jpg)

### 查看进程

#### ps命令

- 作用:ps显示某个时间点的程序运行情况

- 格式

```bash
ps  -参数
```

- 参数

```bash
-a :显示所有用户的进程
-u :显示用户名和启动时间
-x :显示 没有控制终端的进程
-e :显示所有进程,包括没有控制终端的进程
-l :长格式显示
-w:宽行显示,可以使用多个 w 进行加宽显示 
-f:做一个更完整的输出
```

- 示例

```bash
# 查看当前用户的进程
[root@server ~]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0   32343   32342  0  80   0 - 56088 do_wai pts/2    00:00:00 bash
4 R     0   33566   32343  0  80   0 - 56375 -      pts/2    00:00:00 ps


说明:
F:代表这个程序标志(process flags),说明这个程序的权限。常见号码有:4表示此程序的权限为root;1表示此子程序仅进行复制(fork)而没有实际执行(exec)
S:代表这个程序的状态(STAT),主要的状态有:
    R(Running):该程序正在运作中;
    S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒;
    D:不可被唤醒的睡眠状态,通常可能是在等待I/O的情况;
    T:停止状态(stop),可能是在工作控制(后台暂停)或traced状态;
    Z(Zombie):僵尸状态,程序已经终止但却无法被移除至记忆体外。
    +:位于后台的进程组
UID/PID/PPID:代表此程序被该UID所拥有/程序的PID号码/此程序的父进程PID号码。
C:代表CPU使用率,单位为百分比;
PRI/NI:Priority/Nice的缩写,代表此程序被CPU所执行的优先顺序,数值越小代表该程序越快被CPU执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR是kernel funcition,指出该程序在内存的哪个部分,如果是running的程序,一般会显示-。SZ代表此程序用掉多少内存,WCHAN表示目前程序是否运作中,若为-表示正在运行。
TTY:登入者的终端机位置,若为远程终端登入则使用动态终端界面(pts/n)。
TIME:使用掉的CPU时间,即此程序实际花费CPU运作的时间。
CMD:触发此进程的指令是什么。

# 查看所有用户执行的进程的详细信息
[root@server ~]# ps -le
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 44776 do_epo ?        00:00:01 systemd
1 S     0       2       0  0  80   0 -     0 -      ?        00:00:00 kthreadd
1 I     0       3       2  0  60 -20 -     0 -      ?        00:00:00 rcu_gp
```

```shell
#  查看当前用户的进程
[root@server ~]# ps -u
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        1280  2.2  0.2 237304  5408 tty1     Ss+  15:54   0:00 -bash
root        1415  0.1  0.2 237172  5092 pts/0    Ss   15:55   0:00 -bash
root        1452  0.0  0.2 268484  4008 pts/0    R+   15:55   0:00 ps -u
[root@localhost ~]# ps aux |less
USER       PID %CPU %MEM    VSZ   RSS TTY     STAT START   TIME COMMAND
root         1     0.0     0.0          2164   648 ?          Ss   08:47     0:00 init [5]  

说明:
USER:     运行进程的用户
PID:     进程ID
%CPU:  CPU占用率
%MEM: 内存占用率
VSZ:    占用虚拟内存
RSS:      占用实际内存 驻留内存
TTY:     进程运行的终端
STAT:    进程状态     man ps (/STATE)            
      R     运行
      S     可中断睡眠 Sleep
      D        不可中断睡眠
      T     停止的进程 
      Z        僵尸进程
      X     死掉的进程
      
          s        进程的领导者,父进程
          <     <优先级较高的进程
         N     N优先级的进程
         +     +表示是前台的进程组
         l      以线程的方式运行    
START:    进程的启动时间
TIME:    进程占用CPU的总时间
COMMAND: 进程文件,进程名

[root@server ~]# ps -le
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 44776 do_epo ?        00:00:01 systemd
```

```shell
# 自定义显示字段
[root@server ~]# ps axo user,pid,ppid,%mem,command
USER         PID    PPID %MEM COMMAND
root           1       0  0.7 /usr/lib/systemd/systemd --switched-root --system
root           2       0  0.0 [kthreadd]
root           3       2  0.0 [rcu_gp]
```

```bash
# 查看进程树
[root@server ~]# pstree
```

```bash
# 查看指定进程的PID
[root@server ~]# ps aux | grep sshd

[root@server ~]# cat /run/sshd.pid

# 查看指定进程的PID
[root@server ~]# pgrep -l sshd

[root@server ~]# pidof sshd

# 查看指定进程的PID
[root@server~]# pidof sshd
```

#### top命令

- 格式

```bash
top [-d 数字]  |  [-bnp]
```

- 参数

```shell
-d:后面可以接秒数,就是整个进程界面更新的秒数,默认是5秒
-b:以批次的方式执行top,还有更多的参数可用。通常会搭配数据流重定向来将批处理的结果输出为文件。
-n:与-b搭配,进行几次top的输出结果
-i:不显示闲置或者僵死的进程信息
-c:显示进程的整个命令路径,而不是只显示命令名称
-s:使top命令在安全模式下运行,此时top的交互式指令被取消,避免潜在危险
-p:指定某些个PID来进行查看检测
```

```bash
[root@localhost ~]# top -d 1
[root@localhost ~]# top -d 1 -p id                    查看指定进程的动态信息
```

- top的输出可以分为**统计信息区**和**进程信息区**两个部分,即前5行为统计信息区,后面为进程信息区。
  - 统计信息区

  ```bash
  第一行为任务队列信息:top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06
  17:21:03表示当前系统时间;
  up 4:32表示系统已经启动4小时32分钟了;
  5 users表示当前登录系统的用户数;
  load average: 0.19, 0.08, 0.06表示系统1分钟、5分钟、15分钟前到现在的平均负载(如果是1表示满负载)
  
  第二行:Tasks: 483 total,  3 running, 480 sleeping,  0 stopped,  0 zombie
  483 total进程的总数  
  3 running正在运行的进程数
  480 sleeping处于休眠状态的进程数
  0 stopped停止的进程数
  0 zombie僵死的进程数
  
  
  第三行:%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
  0.3 us表示用户进程占用CPU的百分比
  0.7 sy系统进程占用CPU的百分比;
  0.0 ni用户进程空间内改变过优先级的进程占用CPU的百分比
  99.0 id空闲CPU占用的百分比
  0.0 wa代表I/Owait表示等待输入、输出的进程占用CPU的百分比;
  0.0 hi表示cpu服务于硬件中断所耗费的时间总额
  0.0 si表示cpu服务于软件中断所耗费的时间总额;
  0.0 st表示虚拟机被hypervisor偷去的cpu时间
  另外,如果是多内核设备,可按下数字键“1”来切换成不同cpu的负载率。
  
  第四行、第五行
  MiB Mem :   1790.0 total,   1278.5 free,    240.5 used,    271.0 buff/cache
  MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1393.8 avail Mem
  total系统的内存大小
  free目前空余内存大小
  used已经使用的内存大小
  ```

  - 进程信息区:显示了每个进程的运行状态

  ```bash
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0  179104  13540   8728 S   0.0   0.7   0:01.22 systemd
  PID:进程的id
  USER:进程所有者的用户名
  PR:进程优先级
  NI:nice值。负值表示高优先级,正值表示低优先级
  VIRT:进程使用的虚拟内存总量,单位为KB
  RES:进程使用的、未被换出的物理内存大小,单位KB
  SHR:共享内存大小,单位KB
  S:进程状态,D表示不可中断的睡眠状态,R表示运行状态,S表示睡眠状态,T表示跟踪/停止,Z表示僵死进程
  %CPU:上次更新到现在的CPU时间占用百分比
  %MEM:进程占用的物理内存百分比
  TIME+:进程总计使用的CPU时间,单位为1/100秒
  COMMAND:正在运行进程的命令名或者命令路径
  ```

- 注意:可以在RHEL8.5中安装epel-release源后安装htop,是top的升级版

### kill命令

#### 作用

- 强制结束进程

#### 格式

```bash
kill  进程名/pid
killall  进程名/pid
```

# 第十二章 磁盘管理

## 磁盘简介

### 概念

- 硬盘是由一片或多篇带有磁性的铝合金制的盘片构成,是一种大容量、永久性的外部存储设备
- 组成:盘片、马达驱动、缓存、控制电路、接口
- 图

![image-20230507111523711](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507111523711.png)

### 逻辑结构

- 磁道:由内到外的同心圆
- 扇区:半径组成的扇形磁道存储区
- 柱面:多个盘片的统一磁道
- 图:

![image-20230507111706944](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230507111706944.png)

## 虚拟机添加新硬盘

### 物理设备的命名规则

#### 传统设别

![image-20230514165248447](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230514165248447.png)

#### 固态硬盘

- nvmen磁盘号[p1-10]

### 虚拟机添加新硬盘

#### 过程

- 关机

- 编辑虚拟机设置

![](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230514165621442.png)

- 点击添加

image-20230514165733550

- 选择硬盘后下一步

image-20230514165819186

- 选择磁盘类型:SATA(A)

image-20230514165905524

- 创建新虚拟磁盘

image-20230514165943508

- 20GB,单个文件

image-20230514170011932

- 默认命名,点击完成

image-20230514170037164

#### 注意

- 在添加3块硬盘,最终共4个新硬盘

## 硬盘分区概述

### MBR分区

#### 概念

- MBR(Master Boot Record,主引导记录)包含硬盘一系列参数和一段引导程序,硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序
- MBR是由分区程序(如Fdisk.exe)所产生的,它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存
- MBR位于整个硬盘的0磁道0柱面1扇区
  - 主引导扇区512B
  - MBR=446B
  - DPT(Disk  Partition  Table硬盘分区表)=64B
  - 最后两个字节“55,AA”是分区的结束标志

#### MBR分区类型

- 主分区(primary partition)
  - 一块硬盘最多4个主分区,主分区不可以再进行二次分区
  - 主分区可以直接建立文件系统,存放数据
  - 可以用来引导、启动操作系统 
- 扩展分区(extended partition)
  - 一块硬盘最多一个扩展分区,加主分区最多4个
  - 不能创建文件系统
  - 可以划分逻辑分区
- 逻辑分区(logical partition)
  - 可以创建文件系统,存放数据
  - 逻辑分区的数量没有限制。

- 支持的分区数量:4个主分区或者3个主分区1个扩展分区

  image-20230514163756423

  ![image-20230514163825895](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230514163825895.png)

- 为什么MBR最多只能有4个主分区: 因为分区表占据64个字节,其中每个分区的信息占用16个字节,分区表里面可以记录四个分区信息描述。

### GPT分区

#### 产生原因

- MBR分区表中最高支持磁盘容量为2.2TB
- MBR分区表中,没有备份机制,分区表被干掉则磁盘全部死光光
- MBR中存储开机管理程序的容量只有446B,无法存储较多内容

#### 概念

- GPT(GUID Partition Table,全局唯一标识分区表)是一种比MBR分区更先进、更灵活的磁盘分区模式
- GPT分区表使用LBA(Logical Block Address)逻辑区块地址来记录磁盘引导、分区的相关信息
  - LAB区块大小(512B-4KB),默认为512B
  - LAB区块共68个,前34个记录分区信息,后34个进行备份
  - 图:

![image-20230514164423746](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230514164423746.png)

- 不在区分主分区与其它分区,默认情况下,GPT最多可支持128个分区
- 支持大于2.2TB的总容量及大于2.2TB的分区,最大支持18EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)
- GPT分区机制在较老的BIOS中不能识别,则提供了一个UEFI (Unified Extensible Firmware Interface)统一的可扩展固件接口,来取代传统的BISO,又称为UEFI BIOS,UEFI使用C语言编写,支持较多的平台

### lsblk命令

#### 作用

- 查看磁盘信息

#### 格式

```bash
lsblk 参数  设备名
```

#### 参数

```bash
-d :仅列出硬盘本身信息,不显示分区信息
-f :列出磁盘的内的文件系统名称
-i : 使用ASCII码格式输出信息
-t :显示磁盘的详细信息
-p :显示设备完整名称
```

#### 示例

```shell
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sr0            11:0    1  8.4G  0 rom  
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  400M  0 part /boot
└─nvme0n1p2   259:2    0 19.6G  0 part 
  ├─rhel-root 253:0    0 15.6G  0 lvm  /
  └─rhel-swap 253:1    0    4G  0 lvm  [SWAP]
```

```bash
# 显示内容分析
NAME :设备名称,默认省略前导/dev 目录名
MAJ:MIN :主要:次要 设备代码
RM :是否可以卸载
SIZE : 容量
RO :是否为 只读 
TYPE : 设备类别(磁盘、分区、光盘等)
MOUNTPOINT :挂载点
```

## 硬盘分区

### 使用fdisk管理分区

#### 作用

- fdisk命令工具默认将磁盘划分为==MBR==格式的分区

- 命令:fdisk  设备名
- 注意:fdisk命令以交互方式进行操作的,在菜单中选择相应功能键即可

| 指令 | 作用                     | 指令 | 作用                                   |
| ---- | ------------------------ | ---- | -------------------------------------- |
| a    | 调整磁盘的启动分区       | p    | 显示当前磁盘的分区信息                 |
| d    | 删除磁盘分区             | t    | 更改分区类型                           |
| l    | 显示所有支持的分区类型   | u    | 切换所显示的分区大小单位               |
| m    | 查看所有指令的帮助信息   | n    | 创建新分区                             |
| q    | 不保存更改,退出fdisk命令 | w    | 把修改写入磁盘分区表,然后退出fdisk命令 |
| g    | 新建一个空的GPT分区表    | o    | 新建一个空的DOS分区表                  |

#### 示例

- 例1:对/dev/sdb硬盘进行分区,方式:P+P+P+E(l+l+l),容量自定

```bash
[root@server ~]# fdisk  /dev/sda

欢迎使用 fdisk (util-linux 2.37.4)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

设备不包含可识别的分区表。
创建了一个磁盘标识符为 0x4cd88da9 的新 DOS 磁盘标签。

命令(输入 m 获取帮助):n   # 输入n表示新建
分区类型   
   p   主分区 (0 primary, 0 extended, 4 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):p    # 输入p或直接回车
分区号 (1-4, 默认  1):   # 默认回车
第一个扇区 (2048-41943039, 默认 2048):    # 默认回车
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (2048-41943039, 默认 41943039): +2G  # 直接输入+容量及单位

创建了一个新分区 1,类型为“Linux”,大小为 2 GiB。
命令(输入 m 获取帮助):n   # 同上
分区类型
   p   主分区 (1 primary, 0 extended, 3 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):

将使用默认回应 p。
分区号 (2-4, 默认  2): 
第一个扇区 (4196352-41943039, 默认 4196352): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (4196352-41943039, 默认 41943039): +3G

创建了一个新分区 2,类型为“Linux”,大小为 3 GiB。

命令(输入 m 获取帮助):n  # 同上
分区类型
   p   主分区 (2 primary, 0 extended, 2 free)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p):

将使用默认回应 p。
分区号 (3,4, 默认  3): 
第一个扇区 (10487808-41943039, 默认 10487808): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (10487808-41943039, 默认 41943039): +2G

创建了一个新分区 3,类型为“Linux”,大小为 2 GiB。

命令(输入 m 获取帮助):n   
分区类型  
   p   主分区 (3 primary, 0 extended, 1 free)   
   e   扩展分区 (逻辑分区容器)
选择 (默认 e):e   # 选择e新建扩展分区

已选择分区 4
第一个扇区 (14682112-41943039, 默认 14682112): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (14682112-41943039, 默认 41943039):   # 回车,剩余容量全部分配

创建了一个新分区 4,类型为“Extended”,大小为 13 GiB。

命令(输入 m 获取帮助):n
所有主分区都在使用中。
添加逻辑分区 5      # 新建逻辑分区
第一个扇区 (14684160-41943039, 默认 14684160): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (14684160-41943039, 默认 41943039): +2G

创建了一个新分区 5,类型为“Linux”,大小为 2 GiB。

命令(输入 m 获取帮助):n
所有主分区都在使用中。
添加逻辑分区 6
第一个扇区 (18880512-41943039, 默认 18880512): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (18880512-41943039, 默认 41943039): +3G

创建了一个新分区 6,类型为“Linux”,大小为 3 GiB。

命令(输入 m 获取帮助):n
所有主分区都在使用中。
添加逻辑分区 7
第一个扇区 (25174016-41943039, 默认 25174016): 
最后一个扇区,+/-sectors 或 +size{K,M,G,T,P} (25174016-41943039, 默认 41943039):   # 回车,剩余全部分配

创建了一个新分区 7,类型为“Linux”,大小为 8 GiB。

命令(输入 m 获取帮助):p   # 显示分区列表
Disk /dev/sda:20 GiB,21474836480 字节,41943040 个扇区
磁盘型号:VMware Virtual S
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4cd88da9

设备       启动     起点     末尾     扇区 大小 Id 类型
/dev/sda1           2048  4196351  4194304   2G 83 Linux
/dev/sda2        4196352 10487807  6291456   3G 83 Linux
/dev/sda3       10487808 14682111  4194304   2G 83 Linux
/dev/sda4       14682112 41943039 27260928  13G  5 扩展
/dev/sda5       14684160 18878463  4194304   2G 83 Linux
/dev/sda6       18880512 25171967  6291456   3G 83 Linux
/dev/sda7       25174016 41943039 16769024   8G 83 Linux

[root@server ~]# lsblk  # 查看
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
├─sda2          8:2    0    3G  0 part 
├─sda3          8:3    0    2G  0 part 
├─sda4          8:4    0    1K  0 part 
├─sda5          8:5    0    2G  0 part 
├─sda6          8:6    0    3G  0 part 
└─sda7          8:7    0    8G  0 part 
sdb             8:16   0   20G  0 disk 
sdc             8:32   0   20G  0 disk 
sr0            11:0    1  8.4G  0 rom  
nvme0n1       259:0    0   20G  0 disk 
├─nvme0n1p1   259:1    0  400M  0 part /boot
└─nvme0n1p2   259:2    0 19.6G  0 part 
  ├─rhel-root 253:0    0 15.6G  0 lvm  /
  └─rhel-swap 253:1    0    4G  0 lvm  [SWAP]

```

- 例2:对/dev/sdc,进行分区,P+P+E (l+l)  P:1G  P:3G  L: 10G  L:剩余

#### 注意

- 若无法查看,则表示分区信息还未写入内核(常见情况),输入==partprobe==命令 进行手动将分区信息同步到内核,再不行就重启

### 使用gdisk管理分区

#### 注意

- 注意:gdisk命令针对GPT分区格式,若在MBR分区格式下进行添加分区,则所有数据会全部丢失,切记:一块硬盘中fdisk与gdisk不能混用
- 格式:gdisk    设备名

#### 示例

- 例:对/dev/sdd进行gdisk分区,3个分区,容量自定

```bash
[root@server ~]# gdisk  /dev/sdc
GPT fdisk (gdisk) version 1.0.7

Partition table scan:  # 显示已存在的分区类型
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.

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}: +3G
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

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

Command (? for help): n
Partition number (3-128, default 3): 
First sector (34-41943006, default = 10487808) or {+-}size{KMGTP}: 
Last sector (10487808-41943006, default = 41943006) or {+-}size{KMGTP}: +4G
Current type is 8300 (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/sdc: 41943040 sectors, 20.0 GiB
Model: VMware Virtual S
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 9FCD84E9-064C-416F-8829-34D7F7BE3542
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 23068605 sectors (11.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         6293503   3.0 GiB     8300  Linux filesystem
   2         6293504        10487807   2.0 GiB     8300  Linux filesystem
   3        10487808        18876415   4.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   # 输入y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
├─sda2          8:2    0    3G  0 part 
├─sda3          8:3    0    2G  0 part 
├─sda4          8:4    0    1K  0 part 
├─sda5          8:5    0    2G  0 part 
├─sda6          8:6    0    3G  0 part 
└─sda7          8:7    0    8G  0 part 
sdb             8:16   0   20G  0 disk 
sdc             8:32   0   20G  0 disk 
├─sdc1          8:33   0    3G  0 part 
├─sdc2          8:34   0    2G  0 part 
└─sdc3          8:35   0    4G  0 part 
```

#### 注意

- 实际工作中,硬盘分区是应保留一定的自由空间,以备将来分区空间不足时可以临时扩容

## 格式化

### 概念

#### 格式化的目的

- 当我们拿到了一张大白纸,首先为了使用方便要裁剪,然后为了书写工整要先画格,这里的“白纸”就是原始的硬盘,而“裁剪”意味着分区,然后的“画格”就是格式化,最后写入内容

- 格式化是对分区建立文件系统,文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法

#### 文件系统组成-ext2

- 组成:super block(超级块)、inode (索引块)、block(数据块)
- super block:又称为“硬盘地图”,记录文件系统的整体信息,如:inode/block块的总量、使用量、空闲块量、文件系统格式等相关信息
- inode:记录文件的属性,一个文件占用一个inode块,并且记录次文件的数据所在的block块的号码,默认为128B大小,存储:文件访问权限、文件所有者与所属组、文件大小、创建时间或修改内容时间、最有一次访问时间、特殊权限、真实数据地址
- block块:记录实际文件的内容,在EXT2文件系统中分为1KB、2KB、4KB容量,文件太大时,会占用多个数据块
- 图:

image-20230515093726352

#### 查看文件系统格式

- 方法:输入mkfs在键入tab(点击2次)进行命令补全,可显示支持的文件系统格式
- 例

```bash
[root@server ~]# mkfs
mkfs  mkfs.cramfs  mkfs.ext2  mkfs.ext3  mkfs.ext4  mkfs.fat  mkfs.minix   mkfs.msdos   mkfs.vfat  mkfs.xfs     
```

### 格式化命令

```bash
mkfs.xfs  -参数   硬盘分区名

mkfs.ext4  -参数  硬盘分区名
```

### 参数

```bash
-f:强制格式化,已存在文件系统时需要使用
-c:建立文件系统前先检查坏块。
-V:输出建立文件系统的详细信息
```

### 示例

- 例1:恢复快照,删除之前的虚拟硬盘文件,添加新硬盘,分区后格式化

```bash
[root@server ~]# gdisk  /dev/sda   (2G+3G+4G)
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
├─sda2          8:2    0    3G  0 part 
└─sda3          8:3    0    4G  0 part 

[root@server ~]# mkfs.xfs  /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=131072 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=524288, 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@server ~]# mkfs.xfs  /dev/sda2

[root@server ~]# mkfs.ext4  /dev/sda3
```

- 例2:格式化/dev/sda2 ,并使用inte的cpu多线程技术进行多数据流读写系统

```bash
[root@server ~]# grep 'processor' /proc/cpuinfo    # 查看核心数
processor    : 0
processor    : 1

[root@server ~]# mkfs.xfs  -d agcount=2  /dev/sda2
# -f:强制格式化
# -d:指定核心数
```

- 例3:制作大文件/filedev,容量2G,格式化为xfs文件系统

```bash
[root@server /]# dd  if=/dev/zero  of=/filedev  count=2 bs=1G

[root@server /]# mkfs.xfs -f /filedev 
# -f: 最好加上-f强制格式化
```

### blkid命令

#### 作用

- 显示设备的UUID值和文件系统名称

#### UUID

- UUID:全局单一标识符(Universally Unique Identifier),Linux系统会给所有设备分配一个唯一的UUID值,以方便挂载

#### 格式

```bash
blkid  设备名
```

#### 示例

```bash
[root@server ~]# blkid  /dev/sda1
/dev/sda1: UUID="2f3bfdcc-b4ff-488f-aa4d-7137c2b4fd7d" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="96058c70-ea76-41d4-a677-9e5574a06220"

# 显示内容:设备名    UUID值    文件系统类型(TYPE)

[root@server ~]# blkid  # 全部查看
```

## 挂载

### 概念

- mount point:挂载点,是一个目录,该目录是进入磁盘分区(文件系统)的入口

- 挂载:将一个分区或者设备挂载至挂载点目录,建立连接,通过挂载点目录进入分区空间

### mount命令

#### 格式

```bash
mount  [-t  文件系统类型]  设备名   挂载点目录
```

#### 参数

```bash
-a:依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
-t:指定文件系统类型
-o 特殊设备选项:挂载设备时使用逗号分割输入额外参数
```

![image-20230515095308482](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230515095308482.png)

#### 示例

- 例1:新建挂载目录,挂载/dev/sda1

```bash
[root@server ~]# mkdir  /msda1
[root@server ~]# mount  /dev/sda1  /msda1
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part /msda1
├─sda2          8:2    0    3G  0 part 
└─sda3          8:3    0    4G  0 part 
```

- 例2:使用UUID值挂载/dev/sda2

```bash
[root@server ~]# blkid  /dev/sda2
/dev/sda2: UUID="27301fb0-2d51-40a7-8508-fd11550c4aaa" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="93b2b535-d875-44e4-9134-87b0c203d046"
[root@server ~]# mkdir  /msda2
[root@server ~]# mount UUID="27301fb0-2d51-40a7-8508-fd11550c4aaa"  /msda2
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part /msda1
├─sda2          8:2    0    3G  0 part /msda2
└─sda3          8:3    0    4G  0 part 
```

- 例3:挂载光盘

```bash
[root@server ~]# mount  /dev/sr0  /media
mount: /media: WARNING: source write-protected, mounted read-only.# 只读挂载

[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part /msda1
├─sda2          8:2    0    3G  0 part /msda2
└─sda3          8:3    0    4G  0 part 
sr0            11:0    1  8.4G  0 rom  /media
```

- 例4:查看挂载信息

```bash
[root@server ~]# mount

[root@server ~]# mount | grep /dev/sda
```

#### 注意

- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中

- 单一目录不应该重复挂载多个文件系统

- 作为挂载点的目录,应为空目录,否则原有数据会隐藏

```bash
[root@server ~]# mkdir  /msda3
[root@server ~]# echo  "hello"  >  /msda3/test.txt
[root@server ~]# ls  /msda3
test.txt
[root@server ~]# mount  /dev/sda3  /msda3
[root@server ~]# ls  /msda3  # test.txt隐藏,卸载设备后恢复
lost+found

# lost+found目录作用:使用标准的ext文件系统格式才会产生的一个目录,当软件或者硬件出现错误,导致文件系统不一致时会把有问题的文件放到lost+found目录种,所以是一种恢复丢失文件的方法,误删除时可使用mklost+found创建
```

### umount命令

#### 作用

- 卸载分区,要移除USB磁盘、U盘、光盘和硬盘时,需要先卸载

#### 格式

```bash
umount  参数   设备名称[挂载点]
```

#### 参数

```bash
-f :强制卸载
```

#### 示例

```bash
[root@server ~]# umount  /dev/sda1
[root@server ~]# umount  /dev/sda2
[root@server ~]# umount  /dev/sr0
```

#### 注意

- 若正使用文件系统,则应使用cd命令离开该目录后再卸载

```bash
[root@server ~]# cd  /msda3
[root@server msda3]# ls
lost+found
[root@server msda3]# umount  /dev/sda3
umount: /msda3: 目标忙.
[root@server msda3]# cd  ~   # 离开需要卸载的目录
[root@server ~]# umount  /dev/sda3
[root@server ~]# ls  /msda3   # 原先隐藏的文件,卸载设别后会显示
test.txt
```

### 开机挂载

#### 作用

- 由于mount为手动挂载,重启后就会卸载,则修改/etc/fstab配置文件,实现开机自动挂载
- 例

```bash
[root@server ~]# mount   /dev/sda1  /msda1
[root@server ~]# lsblk 
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part /msda1  # 已挂载
……

[root@server ~]# reboot

[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part 
……
```

#### 配置文件分析

- 路径:/etc/fstab

![image-20230515102832932](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230515102832932.png)

- 共六列,分别为:
  - 设备名称或其UUID值
  - 挂载点目录
  - 文件系统名称
  - 文件系统参数:default
  - 是否备份,0
  - fsck:开机是否用fsck进行扇区检查,但xfs文件系统不支持则为 0

#### 示例

- 将/dev/sda1挂载到/msda1中,并设置开机挂载,重启后检查

```bash
[root@server ~]# vim   /etc/fstab
/dev/sda1        /msda1  xfs     defaults        0       0

[root@server ~]# mount  -a  # 挂载所有,进行测试,
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part /msda1
[root@server ~]# reboot
[root@server ~]# lsblk
# 注意:为了防止语法错误,必须进行测试,否则开机无法启动
```

#### 注意

- 根目录/ 是必须挂载的﹐而且一定要先于其它mount point 被挂载

- 其它mount point 必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则(FHS)

- 所有mount point 在同一时间之内﹐只能挂载一次。

- 所有partition 在同一时间之内﹐只能挂载一次。

### 特殊挂载

#### 挂载大文件

- 当只有一个分区,剩余空间还很大,自由空间很小不能进行新的分区,则可以在当前分区制作一个大文件,在进行挂载,相当于一个新的分区来使用
- 例:建立根目录下新建1GB大文件,挂载并开机挂载使用

```bash
[root@server ~]# dd  if=/dev/zero  of=/loopdev  count=1  bs=1G

[root@server ~]# mkfs.xfs  -f  /loopdev 

[root@server ~]# mkdir  /mloop

[root@server ~]# mount -o loop /loopdev  /mloop 

[root@server ~]# lsblk

[root@server ~]# vim  /etc/fstab
/loopdev        /mloop  xfs     defaults        0       0

[root@server ~]# mount  -a

[root@server ~]# reboot

[root@server ~]# lsblk
```

#### 增加swap分区

- swap分区:类似于Windows系统虚拟内存的功能,将一部分硬盘空间虚拟成内存来使用,从而解决内存容量不足的情况,因为swap毕竟是用硬盘资源虚拟的,所以速度上比真实物理内存要慢
- 查看:

```bash
[root@server ~]# free -h
        total        used        free      shared  buff/cache   available
Mem:    1.9Gi       733Mi       985Mi       15Mi       380Mi       1.2Gi
Swap:   4.0Gi          0B       4.0Gi
```

- 添加过程:新建分区->格式化该分区->启用新的swap->查看系统信息->挂载

- 例1:/dev/sda中划分5G空间为swap分区,并开机挂载使用

```bash
[root@server ~]# gdisk  /dev/sda
GPT fdisk (gdisk) version 1.0.7

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): n
Partition number (4-128, default 4): 
First sector (34-41943006, default = 18876416) or {+-}size{KMGTP}: 
Last sector (18876416-41943006, default = 41943006) or {+-}size{KMGTP}: +5G
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to '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/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.
[root@server ~]# lsblk  # 若未显示sda4则使用partprobe命令更新

NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0           7:0    0    1G  0 loop /mloop
sda             8:0    0   20G  0 disk 
├─sda1          8:1    0    2G  0 part /msda1
├─sda2          8:2    0    3G  0 part /msda2
├─sda3          8:3    0    4G  0 part 
└─sda4          8:4    0    5G  0 part 
……

[root@server ~]# mkswap  /dev/sda4   # swap格式化
正在设置交换空间版本 1,大小 = 5 GiB (5368705024  个字节)
无标签,UUID=b9eaced8-4e7a-4ce3-9287-ac848c5f04ae

[root@server ~]# swapon  /dev/sda4    # 启用

[root@server ~]# free  -h   # 查看容量

[root@server ~]# vim  /etc/fstab   # 开机挂载
/dev/sda4       swap    swap    defaults        0       0

[root@server ~]# reboot

[root@server ~]# free  -h
```

- 例2:使用大文件建立swap

```bash
[root@server ~]# dd  if=/dev/zero  of=/swapdev  count=1  bs=1G

[root@server ~]# mkswap  /swapdev

[root@server ~]# chmod  600  /swapdev   # 更改权限,否则不安全

[root@server ~]# swapon  /swapdev

[root@server ~]# vim  /etc/fstab
/swapdev        swap    swap    defaults        0       0
# fstab中设备来源于大文件,则fstab中不能使用UUID值作为挂载设备名

[root@server ~]# free  -h  
# 注意,若free显示swap容量为及时增加,可使用下列命令查看

[root@server ~]# swapon -s   # 此时列表中有对应swao新空间即可
```

#### 注意

- swap在服务器中有时会关闭,如数据库服务器,但一般用于服务器内存剩余空间有一定压力时会触发使用swap空间,则swap空间大小设置一般为:当物理内存小于2G时,swap分区大小为物理内存的2倍;超过2G的部分,swap分区大小跟物理内存相等

- 可以使用 swapoff命令停用部分swap空间 

  

## 查看磁盘空间使用量

### df命令

#### 作用

- 列出文件系统的磁盘空间占用情况
- df,disk free,通过文件系统来快速获取空间大小的信息,当我们删除一个文件的时候,这个文件不是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已经删除的文件, df记录的是通过文件系统获取到的文件的大小,他比du强的地方就是能够看到已经删除的文件,而且计算大小的时候,把这一部分的空间也加上了,更精确了

#### 格式

```bash
df -参数 目录或文件名
```

#### 参数

```bash
 -a:列出所有的文件系统,包括系统特有的/proc等文件系统
 -k:以KB的容量显示各文件系统
 -m:以MB的容量显示各文件系统
 -h:以人们较易阅读的GB,MB,KB等格式自行显示
 -H:以M=1000K替代M=1024K的进位方式
 -T:连同该分区的文件系统名称(例如ext3)也列出
 -i:不用硬盘容量,而以inode的数量来显示

# 由于df主要读取的数据几乎都是针对整个文件系统,因此读取的范围主要是在Super block内的信息,所以这个命令显示结果的速度非常快速。
```

#### 示例

```bash
[root@server ~]# df  -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  968M     0  968M    0% /dev/shm
tmpfs                  388M  9.7M  378M    3% /run
/dev/mapper/rhel-root   16G  8.5G  7.2G   54% /
/dev/sda2              3.0G   54M  3.0G    2% /msda2
/dev/sda1              2.0G   47M  2.0G    3% /msda1
/dev/loop0            1014M   40M  975M    4% /mloop
/dev/nvme0n1p1         395M  235M  160M   60% /boot
tmpfs                  194M   52K  194M    1% /run/user/42
tmpfs                  194M   36K  194M    1% /run/user/0
```

### du命令

#### 作用

- du:显示磁盘空间使用量(统计目录或文件所占磁盘空间大小),在默认情况下,文件大小的单位是KB。
- du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和,当文件系统也确定删除了该文件后,这时候du与df就一致了

#### 格式

```bash
du  -参数   文件或目录名
```

#### 参数

```bash
-a : 列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已;
-h : 以人们较易读的容量格式(G/M)显示;
-s : 列出总量,而不列出每个个别的目录占用了容量;
-S : 不包括子目录下的总计,与-s有点差别;
-k : 以KB列出容量显示;
-m : 以MB列出容量显示。
```

## RAID

### 概念

- 当今CPU性能每年可提升30%-50%但硬盘仅提升7%
- 硬盘在服务器中需要持续、频繁、大量的I/O操作,故障机率较大,则需要对硬盘进行技术改造,提升读写性能、可靠性
- 1988年,加利福尼亚大学伯克利分校首次提出并定义了RAID技术概念
- 原理:RAID(**Redundant Array of Independent Disks**)将多个硬盘设备组成一个大容量、安全更好的磁盘阵列,并将数据切割成多个片段后分别存储到不同的物理硬盘上,利用分散读写技术来来提升硬盘性能,同时也备份了多个副本到不同硬盘中,拥有了备份冗余功能

### 常见RAID组建方案

#### RAID0

- 原理:把至少2块硬盘通过硬件或软件方式串联,组成一个大的卷组,并将数据依次写入到各个硬盘

- 优点:数据同步传输,读取/写入分开,性能大大提升
- 缺点:若任意一块硬盘故障会导致整个系统的数据损坏,无备份冗余能力错误修复能力
- 总结:使用率100%,至少2块磁盘才能使用,优点是快,提升磁盘的读写速度,缺点是不安全
- 图:

image-20230515135305458

#### RAID1

- 产生原因:若生产环境对硬盘的读写速度没有较大要求,但希望增加数据安全性时可使用RAID
- 原理:把至少2块硬盘绑定起来,写入数据时将数据同时也写入另一或多块硬盘中,
- 本质:多个硬盘作为镜像备份
- 优点:数据备份冗余安全性大大提升
- 缺点:硬盘利用率下降
- 总结:是镜像,使用两块磁盘,一式两份的方式,支持容错,冗余,数据安全不丢失,缺点是速度不快,使用率50%,成本较大。
- 图:

image-20230515135519270

#### RAID5

- 产生原因:兼顾“读写速度”、“数据安全”、“成本”的一种折中方式

- 原理:需至少三块硬盘,将数据分块存储到不同硬盘中,硬盘中必须存储其它一个硬盘的parity(奇偶校验信息)

- 优点:兼顾性能,通过“奇偶校验”替代“镜像备份”

- 缺点:硬盘数据安全性较低

- 总结:使用率(n-1)/n*容量,磁盘坏了会立即补上,数据会恢复
- 图:

image-20230515135606880

#### RAID10 (主流)

- 本质:RAID1+RAID0 的组合

- 原理:至少需要4块硬盘,先制作两两的RAID1阵列,以保证安全性,在两两制作RAID0,以提高读写速度

- 优点:兼具速度和安全性

- 缺点:成本较高
- 图:

![image-20230515135651893](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230515135651893.png)

### mdadm命令

#### 作用

- 管理系统中的RAID磁盘阵列

#### 格式

```bash
mdadm   [模式]     -参数   [成员设备名称]
```

#### 参数

```bash
-a :检测设备名称   
-n :指定硬盘数量
-l :指定RAID级别   
-C :创建RAID
-v :显示过程     
-f :模拟设备损坏
-r :移除设备     
-Q : 查看摘要
-D :查看详细信息   
-S :停止RAID磁盘阵列 
```

#### 示例

- 例1:关机后添加4块硬盘,创建RAID10

```bash
[root@server ~]# lsblk 
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
sdb             8:16   0   20G  0 disk 
sdc             8:32   0   20G  0 disk 
sdd             8:48   0   20G  0 disk 
sde             8:64   0   20G  0 disk 
……
```

```bash
[root@server ~]# mdadm  -Cv /dev/md0  -a yes -n 4 -l 10 /dev/sda  /dev/sdb  /dev/sdc  /dev/sdd
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: size set to 20954112K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# 分析
-Cv:创建RAID 并显示过程
/dev/md0:新的RAID阵列名
-a  yes:检测并自动创建RAID设备文件
-n 4:硬盘数量为4块
-l 10:RAID级别为RAID10

[root@server ~]# mdadm  -D /dev/md0   # 查看信息
```

```bash
[root@server ~]# mkfs.xfs  /dev/md0
[root@server ~]# mkdir   /RAID
[root@server ~]# mount    /dev/md0   /RAID
[root@server ~]# df  -h
文件系统               容量  已用  可用 已用% 挂载点
devtmpfs               4.0M     0  4.0M    0% /dev
tmpfs                  968M     0  968M    0% /dev/shm
tmpfs                  388M  9.7M  378M    3% /run
/dev/mapper/rhel-root   16G  4.2G   12G   27% /
/dev/nvme0n1p1         395M  235M  160M   60% /boot
tmpfs                  194M   52K  194M    1% /run/user/42
tmpfs                  194M   36K  194M    1% /run/user/0
/dev/md0                40G  319M   40G    1% /RAID
[root@server ~]# vim  /etc/fstab  
/dev/md0        /RAID   xfs     defaults        0       0
```

- 例2:修复损坏的RAID

```bash
# 模拟某个硬盘损坏
mdadm   /dev/md0   -f  /dev/sdb
[root@server ~]# mdadm   /dev/md0   -f  /dev/sdb
mdadm: set /dev/sdb faulty in /dev/md0
# 此期间不影响RAID的使用

[root@server ~]# mdadm   -D  /dev/md0
[root@server ~]# umount  /RAID
[root@server ~]# mdadm  /dev/md0  -a  /dev/sde  # 添加新硬盘
mdadm: added /dev/sde
[root@server ~]# mdadm   -D  /dev/md0
[root@server ~]# mount  -a   # 重新挂载
```

#### 取消RAID

- 注意:实际生产环境中,若取消RAID10之前必须备份出其数据,否则已存在数据无法使用

- 例:上例RAID10解散

```bash
[root@server ~]# umount /dev/md0
[root@server ~]# vim  /etc/fstab   # 删除开机挂载项,切记
[root@server ~]# mdadm  -S /dev/md0  # 停止
mdadm: stopped /dev/md0
```

### RAID备份盘技术

#### 产生原因

- 在RAID10中若RAID1中的某个硬盘损坏,在修复完毕前恰巧另一块RAID1的硬盘也损坏,则数据就彻底丢失

#### 原理

- 在RAID中添加一个大容量的备份盘来预防此类事故,某块硬盘故障,备份盘同步恢复,无须人工干预。

- 分析RAID10需要4块硬盘,备份盘需要1块硬盘,共5块硬盘

#### 创建RAID10+备份盘阵列系统

```bash
[root@server ~]# mdadm -Cv /dev/md1 -a yes -n 4 -l 10 -x 1  /dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: layout defaults to n2
mdadm: layout defaults to n2
mdadm: chunk size defaults to 512K
mdadm: /dev/sda appears to be part of a raid array:
       level=raid10 devices=4 ctime=Mon May 15 14:00:24 2023
mdadm: /dev/sdb appears to be part of a raid array:
       level=raid10 devices=4 ctime=Mon May 15 14:00:24 2023
mdadm: /dev/sdc appears to be part of a raid array:
       level=raid10 devices=4 ctime=Mon May 15 14:00:24 2023
mdadm: /dev/sdd appears to be part of a raid array:
       level=raid10 devices=4 ctime=Mon May 15 14:00:24 2023
mdadm: /dev/sde appears to be part of a raid array:
       level=raid10 devices=4 ctime=Mon May 15 14:00:24 2023
mdadm: size set to 20954112K
Continue creating array? y   # 输入y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
# 注意:-x  1  表示备份盘  1块硬盘 ,一般命令最后一个硬盘为备份盘

[root@server ~]# mdadm  -D  /dev/md1
```

```bash
[root@server ~]# mdadm  /dev/md1  -f /dev/sdb  # 模拟损坏
mdadm: set /dev/sdb faulty in /dev/md1

[root@server ~]# mdadm  -D  /dev/md1   # 发现/dev/sdf正在同步恢复中
```

## 管理逻辑卷

### 工作原理

#### 产生原因

- 硬盘分区或部署为RAID后在修改分区大小时就非常不容易,此时用户随着实际的需求变化而动态调整硬盘分区大小时受到限制,无灵活性

- LVM(**Logical Volume Manager** )允许用户对硬盘资源进行动态调整

#### 认识Linux逻辑卷

- LVM是 Logical Volume Manager(逻辑卷管理)的简写,LVM将若干个磁盘或者磁盘分区连接为一个整块的卷组,形成一个存储池。
- 通过LVM技术,屏蔽了磁盘分区的底层差异,管理员可以在卷组上任意创建逻辑卷,并进一步在逻辑卷上创建文件系统
- 管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。

- 假设有三块磁盘/dev/sdb、/dev/sdc和/dev/sdd用来划分逻辑卷,LVM模型如图所示:

![image-20220621112228450](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20220621112228450.png)

#### LVM基本概念

- PE(physical extent)物理区域:物理区域是物理卷中可用于分配的最小存储单元,物理区域的大小默认为4MB。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致
- 物理卷(physical volume):简称PV,物理卷可以是整个硬盘、硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数
- 卷组**(Volume Group)**:简称VG,可以看成单独的逻辑磁盘,建立在PV之上,一个卷组中至少要包括一个PV,在卷组建立之后可以动态的添加PV到卷组中。卷组的名称可以自定义
-  逻辑卷(logical volume):简称LV,相当于物理分区。逻辑卷建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态的扩展或缩小空间。系统中的多个逻辑卷,可以属于同一个卷组,也可以属于不同的多个卷组

### 部署逻辑卷

#### 常用的LVM部署命令

| 功能/命令 | 物理卷管理 | 卷组管理  | 逻辑卷管理 |
| --------- | ---------- | --------- | ---------- |
| 扫描      | pvscan     | vgscan    | lvscan     |
| 建立      | pvcreate   | vgcreate  | lvcreate   |
| 显示      | pvdisplay  | vgdisplay | lvdisplay  |
| 删除      | pvremove   | vgremove  | lvremove   |
| 扩展      |            | vgextend  | lvextend   |
| 缩小      |            | vgreduce  | lvreduce   |

#### 示例

- 例1:恢复快照,在虚拟机中添加3块新硬盘,2块硬盘创建物理卷及卷组,划分出150MB空间的逻辑卷并格式化挂载使用

```shell
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
sdb             8:16   0   20G  0 disk 

[root@server ~]# pvcreate   /dev/sda  /dev/sdb    # 创建物理卷
  Physical volume "/dev/sda" successfully created.
  Physical volume "/dev/sdb" successfully created.
  
[root@server ~]# vgcreate  VG1  /dev/sda   /dev/sdb   # 创建卷组/dev/VG1
  Volume group "VG1" successfully created

[root@server ~]# vgdisplay /dev/VG1   # 查看信息

[root@server ~]# lvcreate   -n   lv1   -L   150M    VG1  # 创建逻辑卷
  Rounding up size to full physical extent 152.00 MiB
  Logical volume "lv1" created.

[root@server ~]# lvdisplay  /dev/VG1/lv1    # 查看信息

[root@server ~]# mkfs.xfs  /dev/VG1/lv1    # 格式化
 
[root@server ~]# mkdir   /LVM1   # 创建挂载目录

[root@server ~]# mount  /dev/VG1/lv1   /LVM1  # 挂载

[root@server ~]# vim  /etc/fstab   # 配置开机挂载
/dev/VG1/lv1    /LVM1   xfs     defaults        0       0

[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
└─VG1-lv1     253:2    0  152M  0 lvm  /LVM1
```

- 例2:基于上例,VG1卷组划分出200MB空间的逻辑卷并格式化挂载使用

```bash
[root@server ~]# lvcreate   -n   lv2   -l   50    VG1 # 
  Logical volume "lv2" created.
# 注意:
-l :表示以PE物理卷基本存储单位4MB为单位划分,给出4MB的倍数
-L :直接给出容量,如150MB,注意实际容量趋近于150MB
```

```bash
[root@server ~]# mkfs.xfs  /dev/VG1/lv2

[root@server ~]# mkdir  /LVM2

[root@server ~]# vim  /etc/fstab
/dev/VG1/lv2    /LVM2   xfs     defaults        0       0

[root@server ~]# mount  -a

[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─VG1-lv1     253:2    0  152M  0 lvm  /LVM1
└─VG1-lv2     253:3    0  200M  0 lvm  /LVM2
```

### 调整逻辑卷大小

#### 扩展卷组

- 例:将/dev/sdc扩容到VG1卷组中

```shell
[root@server ~]# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

[root@server ~]# vgextend  /dev/VG1  /dev/sdc
  Volume group "VG1" successfully extended
[root@server ~]# vgdisplay /dev/VG1
```

#### 逻辑卷的扩大与缩小

- 例1:xfs文件系统类型的lvm的扩容

```shell
# 将lv1逻辑卷扩容到300MB
[root@server ~]# umount  /dev/VG1/lv1
[root@server ~]# lvextend -L 300M /dev/VG1/lv1
  Size of logical volume VG1/lv1 changed from 152.00 MiB (38 extents) to 300.00 MiB (75 extents).
  Logical volume VG1/lv1 successfully resized.
  
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─VG1-lv1     253:2    0  300M  0 lvm  /LVM1
└─VG1-lv2     253:3    0  200M  0 lvm  /LVM2

[root@server ~]# lvdisplay   

# 注意:使用 -L +100M增加了100M,如果增加到400M,使用-L 400M

[root@server ~]# lvextend -L +100M /dev/VG1/lv1
  Size of logical volume VG1/lv1 changed from 300.00 MiB (75 extents) to 400.00 MiB (100 extents).
  Logical volume VG1/lv1 successfully resized.
[root@server ~]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda             8:0    0   20G  0 disk 
├─VG1-lv1     253:2    0  400M  0 lvm  /LVM1
└─VG1-lv2     253:3    0  200M  0 lvm  /LVM2

# 注意:此时文件系统没有扩容
[root@server ~]# df -h  |  grep  lv1
/dev/mapper/VG1-lv1    147M  8.9M  138M    7% /LVM1

# 使用xfs_growfs文件系统扩容
[root@server ~]# xfs_growfs  /dev/VG1/lv1
meta-data=/dev/mapper/VG1-lv1    isize=512    agcount=4, agsize=9728 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=38912, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1368, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 38912 to 102400

[root@server ~]# df -h  |  grep  lv1
/dev/map:per/VG1-lv1    395M   11M  384M    3% /LVM1

[root@server ~]# mount  /dev/VG1/lv1  /LVM1
```

- 例2:对lv2逻辑卷缩容到200MB

```bash
# 相对于扩容,对逻辑卷缩容有风险,则最好提前备份
[root@server ~]# umount  /dev/VG1/lv2

[root@server ~]# lvreduce -L 200M /dev/VG1/lv2
  New size (50 extents) matches existing size (50 extents).

[root@server ~]# mount /dev/VG1/lv2   /LVM2   
```

## 综合项目--搭建论坛

### 项目架构

#### 整体结构

- 使用LNMP环境+Discuz论坛源程序

- LNMP= Linux + Ngnix + mariadb + PHP

#### Nginx

- 最初于2004年10月4日为俄罗斯知名门户站点而开发的

- Nginx是一款轻量级的网站服务软件,因其稳定性和丰富的功能而深受信赖,

- 特点:低系统资源、占用内存少且并发能力强,是目前主流网站使用的http服务程序

image-20230515150430249

#### Mariadb

- Mariadb是一种数据库软件
- 由开源社区维护,是MySQL的分支,几乎完全兼容MySQL,两者性能基本一致,操作十分相似

#### PHP

- PHP(Hypertxt Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于 1995年,它吸取了 C 语言、Java 语言及 Perl 语言的很多优点,具有开源、免费、快捷、跨平台性强、效率高等优良特性,是目前 Web 开发领域最常用的语言之一
- Discuz默认使用PHP编写

#### Discuz

- Discuz一套通用的社区论坛软件系统
- 自2001年6月面世以来,Discuz!已拥有15年以上的应用历史和200多万网站用户案例,是全球成熟度、覆盖率最大的论坛软件系统之一
- 2010年8月23日被腾讯收购
- 网址:https://www.discuz.vip/

### 项目准备

#### 安装RHEL8.5系统

#### 配置系统

- 关闭安全软件

```bash
[root@localhost ~]# systemctl  stop  firewalld     # 关闭防火墙
[root@localhost ~]# systemctl  disable  firewalld  # 取消开机启动
[root@localhost ~]# setenforce 0   # 关闭SELinux
```

- 修改主机名

```bash
[root@localhost ~]# hostnamectl  set-hostname  server  # 设置主机名位server
[root@localhost ~]# reboot    # 重启系统
[root@server ~]# setenforce 0  # 重新关闭SELinux
```

- 使用xftp上传CentOS-8-Stream.repo的yum配置文件到/etc/yum.repos.d

```bash
[root@server ~]# cd  /etc
[root@server etc]# rm   -rf  yum.repos.d
[root@server etc]# mkdir   yum.repos.d
# 上传文件
[root@server etc]# yum  clean all
[root@server ect]# yum  makecache
```

- 测试网络连通性:ping  www.qq.com
- 制作快照

#### 下载所需软件

- 下载LNMP一键安装包
  - 网址:https://lnmp.org/download.html
  - 使用windows的迅雷下载安装包:http://soft.vpser.net/lnmp/lnmp1.9-full.tar.gz
  - 使用xftp将安装包上传到RHEL8.5系统的根目录中

- 下载Discuz安装包
  - 使用windows迅雷下载Discuz!x3.5安装包
  - 地址:https://gitee.com/Discuz/DiscuzX/attach_files/1345207/download
  - 在windows系统解压缩后备用

### 部署项目

#### 部署lLNMP环境

- 解压缩

```bash
[root@server ~]# ls  /
bin   dev  home  lib64                media  opt   root  sbin  sys  usr
boot  etc  lib   lnmp1.9-full.tar.gz  mnt    proc  run   srv   tmp  var
[root@server ~]# cd /
[root@server /]# tar  xvf  lnmp1.9-full.tar.gz 
```

- 安装

```bash
[root@server /]# cd  lnmp1.9-full/
[root@server lnmp1.9-full]# ./install.sh   # 执行安装脚本
+------------------------------------------------------------------------+
|          LNMP V1.9 for RHEL Linux Server, Written by Licess          |
+------------------------------------------------------------------------+
|        A tool to auto-compile & install LNMP/LNMPA/LAMP on Linux       |
+------------------------------------------------------------------------+
|           For more information please visit https://lnmp.org           |
+------------------------------------------------------------------------+
You have 11 options for your DataBase install.
1: Install MySQL 5.1.73
2: Install MySQL 5.5.62 (Default)
3: Install MySQL 5.6.51
4: Install MySQL 5.7.38
5: Install MySQL 8.0.30
6: Install MariaDB 5.5.68
7: Install MariaDB 10.3.35
8: Install MariaDB 10.4.25
9: Install MariaDB 10.5.16
10: Install MariaDB 10.6.8
0: DO NOT Install MySQL/MariaDB
Enter your choice (1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or 0):  # 数据库安装版本:回车默认

===========================
Please setup root password of MySQL.
Please enter: 123456   # 设置数据库的密码为123456

===========================
Do you want to enable or disable the InnoDB Storage Engine?
Default enable,Enter your choice [Y/n]: y  # 是否启用mysql innodb引擎,输入y
You will enable the InnoDB Storage Engine
===========================
You have 9 options for your PHP install.
1: Install PHP 5.2.17
2: Install PHP 5.3.29
3: Install PHP 5.4.45
4: Install PHP 5.5.38
5: Install PHP 5.6.40 (Default)
6: Install PHP 7.0.33
7: Install PHP 7.1.33
8: Install PHP 7.2.34
9: Install PHP 7.3.33
10: Install PHP 7.4.30
11: Install PHP 8.0.20
12: Install PHP 8.1.7
Enter your choice (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12): # 选择php版本,默认回车

===========================
You have 3 options for your Memory Allocator install.
1: Don't install Memory Allocator. (Default)
2: Install Jemalloc
3: Install TCMalloc
Enter your choice (1, 2 or 3):    # 选择是否安装内存优化,不安装,回车

Press any key to install...or Press Ctrl+c to cancel  # 按任意键开始安装

#  等待……
Checking ...
Nginx: OK
MySQL: OK
PHP: OK
PHP-FPM: OK
Clean Web Server src directory...
+------------------------------------------------------------------------+
|          LNMP V1.9 for RHEL Linux Server, Written by Licess          |
+------------------------------------------------------------------------+
|           For more information please visit https://lnmp.org           |
+------------------------------------------------------------------------+
|    lnmp status manage: lnmp {start|stop|reload|restart|kill|status}    |
+------------------------------------------------------------------------+
|  phpMyAdmin: http://IP/phpmyadmin/                                     |
|  phpinfo: http://IP/phpinfo.php                                        |
|  Prober:  http://IP/p.php                                              |
+------------------------------------------------------------------------+
|  Add VirtualHost: lnmp vhost add                                       |
+------------------------------------------------------------------------+
|  Default directory: /home/wwwroot/default                              |
+------------------------------------------------------------------------+
|  MySQL/MariaDB root password: 123456                          |
+------------------------------------------------------------------------+
+-------------------------------------------+
|    Manager for LNMP, Written by Licess    |
+-------------------------------------------+
|              https://lnmp.org             |
+-------------------------------------------+
nginx (pid 350414) is running...
php-fpm is runing!
 SUCCESS! MySQL running (351009)
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      5          127.0.0.1:631       0.0.0.0:*          
LISTEN 0      128        127.0.0.1:6010      0.0.0.0:*          
LISTEN 0      128        127.0.0.1:6011      0.0.0.0:*          
LISTEN 0      50           0.0.0.0:3306      0.0.0.0:*          
LISTEN 0      128          0.0.0.0:111       0.0.0.0:*          
LISTEN 0      128          0.0.0.0:80        0.0.0.0:*          
LISTEN 0      128          0.0.0.0:80        0.0.0.0:*          
LISTEN 0      32     192.168.122.1:53        0.0.0.0:*          
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*          
LISTEN 0      5              [::1]:631          [::]:*          
LISTEN 0      128            [::1]:6010         [::]:*          
LISTEN 0      128            [::1]:6011         [::]:*          
LISTEN 0      128             [::]:111          [::]:*          
LISTEN 0      128             [::]:22           [::]:*          
Install lnmp takes 24 minutes.
Install lnmp V1.9 completed! enjoy it.
# 成功
```

#### 设置论坛安装文件

- 使用xftp将Discuz_X3.5_SC_UTF8_20230316目录中的upload目录上传到nginx的启动目录/home/wwwroot/default内

- 设置nginx

```bash
[root@server /]# cd  /home/wwwroot/default
[root@server default]# chmod  -Rf  777  upload
[root@server default]# chown  www:www  -R  /home/wwwroot/default/upload
[root@server default]# vim   /usr/local/nginx/conf/nginx.conf
# 定位第69行将 /home/wwwroot/default  修改为  /home/wwwroot/default/upload
[root@server default]# cd  /usr/local/nginx/sbin
[root@server sbin]# ./nginx  -s   reload  # 重启nginx
```

#### 安装论坛软件

- windows中打开浏览器输入服务器ip ,按照Discuz安装向导提示操作

image-20230515160234403

image-20230515160303506

![image-20230515160322914](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230515160322914.png)

image-20230515160418770

image-20230515160509895

- 下一步后成功

image-20230515160540162

- 直接访问站点,测试

![image-20230515160621213](https://foxandy007.oss-cn-chengdu.aliyuncs.com/typora_img/image-20230515160621213.png)

##########

你可能感兴趣的:(linux,开发语言)