Linux详解

01  计算机组成原理

1、什么是计算机?
    计算机俗称电脑,就相当于一种人造人, 电脑二字蕴含着人类的对计算机的终极期望,希望一通电就能够像人脑一样去工作
    

2、为何要有计算机?
    为了造出一种机器来取代人去工作,计算机就相当于人类的奴隶

 
3、计算机的核心组成

 
    由五大部分组成:
        控制器:是计算机的指挥系统,负责控制所有其他硬件的运行 -------》大脑
        
        运算器:数学运算+逻辑运算-------------------------------------》大脑
        
            cpu = 控制器 + 运算器 ------------------------------------》大脑
        
     
          存储器:是计算机的记忆设备
            内存/主存  RAM:基于电信号来存储数据 -------------------------》大脑记忆功能
                1 0  1  1 0  0 0
                优点:存取速度都快
                缺点:没有办法持久存储,断电数据就全部丢失
                
                
            外存·械磁盘基于磁信号来存储数据---------------》相当于笔记本
                优点:可以持久保存数据
                缺点:存储速度都慢        
        
        输入设备
            键盘、鼠标
        
        输出设备
            显示器、音响、打印机

    
    
4、站在计算机硬件的角度:一个程序在计算机中是怎么运行起来的?(*****)
    在运行程序之前:
        程序最先一定是先存放于硬盘中的(程序的安装本质也就是把一堆代码文件放到硬盘的各个位置)
            
    程序开始运行分两个阶段
        1、加载阶段/启动阶段: 把程序的指令或数据从硬盘读入内存
        
        2、执行阶段:cpu从内存中取出指令来运行
        
        
        硬盘、内存里存的东西长什么样子?        0101010101110011
        如何提升程序的启动速度?          提升硬盘速度(对内存)                                                                                                                         提升内存大小(多进程)    内存速度(对cpu)

                   
5、计算机组成详解:

 
    处理器详解:
        cpu内部的 指令集(执行模板)                                                                                                                 精简指令集: 短 多                                                                                                                             复杂指令集: 长 少
            x86:指的是cpu的指令集是复杂指令集
            
            64位:cpu一次性能够从内存中取出多少位二进制数,
                    64位cpu代表,cpu一次性从内存中取出64位二进制数,也就是64位的cpu认为64位二进制数才是一条完整的指令
            
                补充:一个二进制数又称之为一个bit,比特位
            
            
            了解:

                64位的cpu可以 运行64位、32位的程序
                
                32位的cpu只能运行32位的程序
                
            
            软包:nginx-1:1.20.1-14.el9_2.1.x86_64 (软件的版本与cpu的兼容性)
            
            
        多线程:CPU内部存在多条流水线                (详解见06 操作系统补充)
        2核4线程:真2核(两个CPU),假4核(一个CPU两个线程)
            


    存储器详解:

   CPU--寄存器(与cpu材质一样)--高速缓存--内存--硬盘
        

CMOS:与内存一样断电数据就丢,但特点是耗电量非常低,由主板上的电池负责供电

              CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS硬件配置和用户对某些参数的设定。
        
        1B(字节)= 8bit         bit--二进制位       
        1KB=2(10)B=1024B; 括号中的数字为2的指数(即多少次方) 
        1MB=2(10)KB=1024KB=2(20)B; 
        1GB=2(10)MB=1024MB=2(30)B。 
        1TB=2(10) GB=1024GB=2(40)B 
        1PB=2(10) TB=1024TB=2(50)B 
        1EB=2(10) PB=1024PB=2(60)B 
        1ZB=2(10) EB=1024EB=2(70)B 
        1YB=2(10) ZB=1024ZB=2(80)B 
        
        虽然计算机上存放的都是一个个的bit位,但是计算机存取硬盘的单位都是一个扇区,一个扇区512个字节
        
        
        机械磁盘找到数据需要花费的时间:(*****)
            平均寻道时间: 机械手臂上的磁头找到存储数据的那一圈磁道所花费的时间 ---》5ms
            平均延迟时间: 磁盘转半圈的速度 ---》4ms

        500 * 1024 * 1024 * 1024 * 8 bit  标准

        500 * 1000 * 1000 * 1000 * 8 bit   实际硬盘

        虚拟内存:(*****)
            在硬盘上分出一个空间作内存,称之为swap分区
            
            swap分区做虚拟内存
                1、是一种保命措施,而不是提效措施
                2、什么时候用?
                    程序运行时也会产生新的数据,一旦物理内存不够用了,就会把物理内存中一些数据交换到swap分区上
                    整个过程计算机的速度被降低,但是保证不崩溃

          硬盘  硬件Raid(磁盘阵列)  --->P14      raid 0条带   raid 1镜像   raid 5   raid 10

 

特点:数据条带化,无校验,不提供数据保护; 数据并发写入多个硬盘。

优点:RAID读写性能最高,100%的磁盘空间利用率。

缺点:此方式硬盘数据没有冗余,没有容错,一旦一个物理硬盘损坏,则所有数据均丢失。

适用:RAID0 适合于对数据量大,但安全性要求不高的场景,比如音像、视频文件的存储等。


              

特点:数据镜像,无校验(检查)。 一半的空间存储冗余数据,但是在所有的RAID中数据安全性 最高。

优点:所有的RAID中安全性能最高,即使一块磁盘发生故障,仍能正常运转。 镜像磁盘没有完全 故障,数据就不会丢失。

缺点:一半的磁盘空间用于存储冗余数据,磁盘空间利用率50%

适用:数据安全性要求比较高的场景,如邮件系统,数据库等。

     

特点:数据条带化,校验数据均匀分布在每个物理磁盘上。 当某个物理磁盘发生故障,可根据同一条带的其他数据块和对应的校验数据来重建损坏的数据。

优点:允许1个物理磁盘发生故障,而不丢失数据。 读取性能相对较高,磁盘空间利用率大于 RAID1+0。

缺点:写入性能相对低。 重建数据时,性能会受到较大的影响,最少需要三个磁盘才能构建。  

适用:RAID5可理解为RAID0和RAID1折中方案,兼顾储存性能,数据安全和存储成本等因素。

特点:RAID1与RAID0的结合,先创建RAID1,再创建RAID0

优点:读取性能仅次于RAID0。 镜像中的磁盘没有全部故障,数据就不会丢失。 一半的物理磁盘 发生故障时,仍可以运转。

缺点:成本高。 磁盘利用率50%,一半的空间用于冗余数据。至少需要四块磁盘。

适用:适用于读写性能要求高,数据安全大于磁盘成本的场景。 如银行、数据库等

                    

二、什么是编程语言
        编程语言与英语、法语、汉语一样,都是一种事物与另外一种事物沟通的工具
        
        
        你 --------英语-----------------英国人
        你 --------汉语-----------------中国人
        你 --------编程语言-------------计算机
                    
             print --工具转换--> 010101010
            
        
        
三、什么是编程?什么是程序
    
    编程就是把你想让计算机做的事情的步骤,用编程语言给翻译下来,写入一系列文件中
    
    这一系列文件就称之为程序,计算机本身并不会运行,计算机的运行都是受程序的控制
        
        
    银行行长------------------------------------------------------------------------------小员工
                   要求用户输入账号
                   要求用户输入密码
                   判断 用户输入的账号 == "正确的账号" 并且 用户输入的密码 == "正确的密码"
                        做后续的xxxx
                   否则:
                        提示用户重新输入账号密码
    
    
    
    银行行长------------------------------------------------------------------------------计算机
                  用编程语言把上面的步骤给翻译一下
    
    
    
四、程序的分类
    细说的话程序可以分为两大类:
        1、应用程序:给用户使用/应用的程序
        2、操作系统:
            操作系统是一个协调管理控制计算机硬件资源与应用软件的一个控制程序
            
            
            只有操作系统才能控制计算机硬件
            应用程序但凡要操作硬件都要给操作系统发请求

      
    计算机体系的三层结构:(***)

 
        1.应用程序
        
        2.操作系统(文件)---eg:将操作系统控制硬盘写入读取的动作定义为文件
        
        3.计算机硬件

02  操作系统

1、操作系统是什么?

 
操作系统是一个协调、管理、控制计算机硬件资源给应用程序使用的一种控制程序

    计算机三层体系
        应用程序:图形界面          命令解释器   (无法直接接触操作系统

        操作系统:windows操作系统   linux

        计算机硬件(cpu、内存、硬盘)
        
2、为何要有操作系统?操作系统与应用程序有何区别?
    
    为了方便上层的应用程序开发(操作系统把复杂的硬件控制的代码都给写好了,然后对上层提供简单的功能)
    
    

    操作系统与应用程序
        操作系统:是负责控制硬件的程序,给上层 应用程序来调用
        
        应用程序:是给用户使用的程序

(应用程序不经过命令解释器与操作系统交互反应会更快)
        
        
    补充: 计算机体系结构详解---》图

         
3、操作系统的构成(*****)

 
        操作系统由两部分构成:
            1、系统调用接口:为上层的应用程序提供的一系列的功能(对上)
            
            2、内核:负责控制硬件的运行的(对下)
    
   
        操作系统的两种工作状态:
            1、用户态:执行的是系统调用接口层的代码,负责跟上层的应用程序打交道
            2、内核态:执行的是内核某部分代码,负责跟底层的硬件打交道
            
        操作系统的整个运行过程会频繁发生用户态与内核态的切换


    解答问题
        操作系统启动之后,应用程序又是如何启动/运行的?
        
        
        双击快捷方式-------》图形界面-------》windows系统------------》硬件
            指令             应用程序
        
        
        执行某个命令-------》命令解释器bash-------》linux系统------------》硬件
            指令             应用程序
               
            
        1、操作系统接到启动程序的指令
        
        2、操作系统会控制硬件来运行某个应用程序
            操作系统控制硬盘把程序的代码文件读入内存
            操作系统控制cpu去内存里读取程序的指令来运行

                           
  4、操作系统的分类
    个人电脑:
        台式机:windows
        mac:macOS
        
    服务器:
        linux(网络)

             
5、操作系统发展史(**)
    第一代计算机
        特点:
            1、没有操作系统的概念
            2、所有的程序设计都是直接操控硬件
        
        多个程序的运行流程:串行 ----》一个程序运行完毕,另外一个程序才能启动
        
        优点:
            程序以及它的程序是独享整个计算机资源
        缺点:
            1、资源浪费(即便程序出问题了,调试程序的过程中你不用计算机,但是别人也用不了)
            2、串行
            
            
    第二代计算机:
        特点:
            诞生了批处理系统:一下处理一批程序,但这些程序还是串行的
            
        优点:
            批处理提升计算机资料的利用率,一个程序出错只输出结果,不影响下一个程序的运行
            
        缺点:
            1、程序无法实时调式程序
            2、串行
            
            
    第三代计算机:
        硬件的发展:io(input 与 output  输入与输出)+运算的功能集成在一台计算机里

 
        操作系统的核心技术

         -多道技术---》控制多个/多道程序看起来是同时运行(******)
            1、空间上的复用(共享)
                复用的是内存,指的是多个程序能够同时读入内存里----都被启动
                
                空间上的复用必须注意一个点:
                    加载到内存中的多个程序所占用的内存空间必须是隔离的才行(安全性)
                
                
            2、时间上的复用
                复用的是cpu的时间,指的是cpu在多个内存中的程序之间快速的切换----近似于在同时运行,实质上依然是单个运行
                
                什么情况切换:
                    1、遇到io操作一定会切换(读取写入操作时先切换别的)
                    2、没有遇到io操作,也要切换,因为要让cpu能够雨露均沾  
        
        一个cpu同一时间只能做一件事
            并发:多个任务看起来是同时运行的,只有单核也能实现并发
            并行:多个任务是真正意义上的同时运行的,只能多核才能实现并行
        
                
        

        诞生:分时操作系统CTTS
            多个联机终端+多道技术
            
            特点:
                1、每个程序员/程序都以为自己独占计算机资源
                2、多个程序的运行是并发的
            
            
        诞生:MULTICS(支持更多的联机终端)
        
        
        简易版的multics即UNIX(ken THOMSON)
            1970 unix元年
            
            tcp/ip就是unix上进行开发与测试
            
            
        GNU活动:
        
            GPL开源协议:
                开放源代码,所有人都可以来抄我的源代码,并且可以在此基础上进行修改完善
                
                修改完善之后,你可以收费,但是你也必须开放源代码允许别人抄写
        
        
      谭宁邦(开发minix)
        
      芬兰大学生-李纳丝linus----》linux(加入GPL)-----发行版(redat系列、debian系列 )
        
        
   6、    发行版(redat系列、debian系列 )
        
    redat系列
        Fedora----------->RHEL------------>CentOS(dnf/yum)
            
                  redhat5(license)
                    
                  redhat6     ------------》centos6 ---centos7.9
            
            
        Fedora ---------》centos stream-----》RHEL版
            
        
    debian系列:ubuntu系列
        
        debian---》ubuntu
                    apt-get

     
    国产系
    
    
7、安装的操作系统版本
    centos7.9
    centos9----》rockylinux9.3
    
    ubunt22.04.4 LTS

补充:什么是驱动程序
    驱动程序:是硬件厂商专门为自己的某款硬件设备开发的,用于驱动该硬件运行的专项程序(必须遵循操作系统的标准

03  操作系统安装


1、操作系统的安装原理介绍

 
    安装的操作的核心原理简介:

        操作系统本质就是一种程序。从大的层面看安装程序的本质就是把这个程序的文件存入硬盘
        
        操作的iso包(又称之为操作系统镜像):iso的本质就是一个压缩包,里面放着一堆操作的代码文件


    详解:
        1、用另外一台机器从网上下载一个iso镜像包,将该iso包存入移动硬盘、光盘、U盘中---》得到一个启动盘
        
        2、把启动盘插入你的计算机中(接下来要做的事情,是把启动盘里的操作系统数据拷贝到你自己的电脑的硬盘里)
        
        3、按下电源键,启动计算机,固定先启动bios程序(basic input output system)
        
        bios启动之后,会根据配置去某些地方加载真正的操作系统代码,bios的配置信息是存放于CMOS中的
        
        找到启动盘后
        bios会将启动盘里的操作系统读入内存,然后bios会控制cpu去内存中执行代码,然后真正的操作系统就运行起来
        
        接下来负责掌管硬件运行的就是真正的操作系统了,bios就可以退出舞台
        
        4、把启动盘里的操作系统拷贝到本地硬盘

        
2、操作系统的启动流程

    1、按电源键,通电
    2、先执行bios程序,由bios程序临时接管整个硬件的控制
    3、bios会读取自己的配置项(CMOS),找到一个启动盘(存放有操作系统的硬盘、光盘、移动u盘)
    4、找到启动盘之后,会先读取启动盘的第一个扇区的数据512Byte拉起bootloader程序(前446引导信息,64是分区信息,后2位是结束的标志位)
        446字节的引导程序又称之为bootloader(grub程序是我们常用的一种bootloader)
        

    5、bootloader程序启动之后,负责把操作系统后续的代码都加载到内存中,然后运行起来
    

    6、接下来就由真正的操作系统掌握整个计算机的运行,

    7、bios操作会去检查各个驱动程序、硬件是否正常,反馈给真正的操作系统,然后就可以退出舞台


3、安装操作系统(*****)
    vmware workstation (应用程序):可以创建出一台一台的虚拟机

4、linux的目录结构简单介绍
    windows系统多根结构
        E:\vmmachine\vm1\vmware-0.log

        D:\appium\androidsdk\"SDK Readme.txt"
        

    linux系统是单根结构
        /a/b/c/d/e/f.txt

补充:磁盘分区,操作系统定义 “文件夹”概念体系(文件夹无法存储数据,由对应的磁盘区域进行存储),用以关联作为磁盘分区后各区的挂载点(计算机的C D E盘实际上是一个个文件夹)      路径从右往左依次进行分析


5、简单bash命令操作
    echo hello
    ip a
      # ubuntu提权---》临时具有管理员权限,需要加命令前加上sudo
        sudo cat /etc/shadow

04  网络基础

1.什么是互联⽹?
互联⽹过去⼜称为“信息⾼速公路”,是⽤来⾼速传输数据的

2.为何要有互联⽹?
为了打破地域限制,进⾏⾼速的数据传输

3.互联⽹的构成
    电话 = 电话⽹络 + 规范(英语)
    寄快递 = 快递⽹络 + 规范 (快递的填写标准)
    互联⽹ = 信息⾼速公路(⼀些列连在⼀起的⽹络设备)+ 规范(⽹络协议)
    补充:规范/协议存在的意义是啥?
    所有⽹络的设备都需要学会⽹络通信协议,只有这样,包裹在发送过程中才能被沿途设备理解,从⽽确保成功发给下⼀站
    ⽹络通信协议就相当于计算机界的英语,要求所有设备都学会

    

互联⽹通信协议
   

OSI七层协议:
        第⼀层:物理层(位)
            数据称之为:bit
            负责:传输电信号
            单纯的 电信号 没有任何意义,要让其有意义必须对其进⾏分组

        第⼆层:数据链路层 (数据帧)---ethernet 以太⽹协议
            规定:
            1.⼀组电信号称之为数据帧
           

            2.每⼀个数据帧由两部分构成
            (1)head:头的⻓度固定 18字节
            发送者的地址:6字节
            接受者的地址:6字节
            数据描述信息:6字节
            (2)data:默认最⻓是1500字节
           

             3.以太协议的head⾥⽤的地址就是mac地址

            什么是mac地址:
            mac地址:⽹卡上的地址,每⼀个mac地址都是全世界独⼀⽆⼆的地址

            计算机通信基本靠吼:⼴播(内网)
                在局域⽹内⽤的就基于以太⽹(⽤的是mac地址找到对⽅在哪)协议的⼴播⽅式
            强调:mac地址是在局域⽹内部⽤的地址,出不了局域⽹

        第三层:⽹络层(数据包)---ipv4协议(跨局域⽹通信,需要ip地址来标识局域⽹在哪⾥)
            总结:
                mac地址可以⼀个局域⽹独⼀⽆⼆的计算机
                ip地址可以⽤来标识独⼀⽆⼆的局域⽹在哪⾥

                ip地址+mac地址:就定位到全世界范围内独⼀⽆⼆的计算机

            ip协议的规定:
            1.数据被称之为:数据包
            2.数据由两部分构成:
                head
                    源ip地址
                    ⽬的ip地址
                data:
                    数据部分,最⻓65515个字节


        ipv4地址组成:
        00000000.00000000.00000000.00000000 ------->0.0.0.0
        11111111.11111111.11111111.11111111. -------->255.255.255.255
        ip地址的职责,或者说⼀个ip地址要反应两种信息:
            1.要能标识出全世界范围内独⼀⽆⼆的⼀个局域⽹
            2.⼀个ip地址与局域⽹内某台机器的mac地址是⼀⼀对应关系(访问时只用一个,附带另一个)

        192.168.71.1 --------- ⼀⼀对应 ---->局域⽹内的某台机器的mac地址
        为来能让⼀个ip地址同时表示出上⾯两层含义,在ip地址上⼜增加⼀种地址--->⼦⽹掩码
            192.168.71.7
            11000000.10101000.01000111.00000111
            11000000.10101000.01000111.00000000 ----->192.168.71.0
            11000000.10101000.01000111.00000111 ----->192.168.71.7

            ⼦⽹掩码
            192.168.71.7/24
            IP地址:1000000.10101000.01000111.00000111

            24位⼦⽹掩码:11111111.11111111.11111111.00000000 ----->255.255.255.0(表示前24位为网络地址(局域网))
            ⽹络地址: 11000000.10101000.01000111.00000000 ----->192.168.71.0

            网络地址:子网掩码与IP地址作 与 运算

 通信的前提:
            发送端需要事先知道对⽅ip地址
            mac地址怎么办:
            arp协议:负责将ip地址解析成mac地址   

同局域⽹内通信
            发送端:192.168.71.7/24
            接受端:192.168.71.8/24

            在通信之前----> arp协议开始⼯作
                1.计算机发送端与接受端的⽹络地址/⼦⽹地址
                    发送端:192.168.71.0
                    接收端:192.168.71.0
                2.判断发送端的⼦⽹地址 = 接收端的⼦⽹地址
                    在⼀个局域⽹内,确定接下来就在⼀个局域⽹内:mac+⼴播
                    问题来了?arp协议怎么帮我们拿到对⽅的mac地址
             arp协议发送⼀个⼴播包:
            ⾃⼰的mac地址 FFFFFFFFFFFF(表示要对方的mac) 192.168.71.7/24 192.168.71.8/24
                     192.168.71.8这台机器返回给客户端⾃⼰的mac地址

            真正的通信:
                1号机器的mac 3号机器的mac 192.168.71.7/24 192.168.71.8/24 数据部分

       

跨局域⽹通信
            1号机器-发送端:192.168.71.7/24
            2号机器-接收端:172.16.202.8/24

            在通信之前准备⼯作---- arp协议开始⼯作
                1.计算发送端与接收端的⽹络地址/⼦⽹地址
                    发送端:192.168.71.0
                    接收端:172.16.202.0
                2.判断 发送端的⼦⽹地址 != 接收端的⼦⽹地址
                    不在⼀个局域⽹内,确定接下来是要跨局域⽹通信:mac+⼴播
                    问题来了,跨局域⽹通信靠谁?---- 靠路由器-----要获得路由器的mac地址
                    ⾃⼰的mac地址 FFFFFFFFFFFF 192.168.71.7   192.168.71.1(路由器网关)
                192.168.71.1⽹关返回⾃⼰的mac给1号机器,1号机器⼿⾥有⽹关mac,就可以把信息送给⽹关

            真正通信:
                1号⾃⼰的mac地址 ⽹关的mac地址 192.168.71.7/24 172.16.202.8/24 数据部分


        总结:
        通信的前提⼀定要拿到对⽅的地址
        ip地址+mac地址:可以表示全世界范围内独⼀⽆⼆的⼀台计算机
        有arp协议的加持:拿到ip对使⽤者来说就相当于拿到ip+mac
        所以,拿到了对⽅的ip地址就能够表示全世界范围内独⼀⽆⼆的⼀台计算机

    

私网IP接入公网(获得对应的公网IP)后显露于公网中,便可以被其他私网中的IP访问

第四层传输层(数据段):tcp/udp 基于端口工作的


        但凡是基于tcp协议或者udp协议工作的应用程序,都会拥有一个独一无二的端口号(在一个操作系统里端口的范围0-65535)

        ip(含mac)+port: 全世界范围内独一无二的一个基于网络通信应用程序

      
  

 第五层应用层:
        应用程序是自己开发,所以应用层用用什么协议应用程序自己定义就好
        http协议、ssl协议


        socket抽象层:


        位于传输层与应用层之间
        socket层是对传输层及其以下的封装,封装完之后提供了一系列简单的功能给上次应用程序去调用
        基于网络通信的应用程序基本上都是基于socket开发的,所以又称之为套接字程序

四、dns

 
1、dns是什么
dns(domain name server):负责把域名解析为ip地址

什么是域名:
    www.baidu.com 180.101.50.242
    egonlin.com

域名结构详解:
    www.baidu.com

    三级域名.二级域名.一级域名/顶级域名
        域名层层分级的原因:
            1、每一段都有特定的意义,用最少得字符表达出最多的含义,十分方便用户记忆
            2、解析记录分层管理,不需要某一个dns存下所的有的解析记录


2、为何要有dns
    为了让你用户记忆(用户记忆域名就可以,dns负责将域名解析为ip地址进行,强调:域名不能用来通信)


3、如何用dns
    dns的分类(了解)

权威 DNS(Authoritative DNS)是指在域名系统中,负责提供特定域名准确信息的服务器

    dns的查询流程
        dns的查询分两种:
            1、递归:我不知道,但我帮你拿
            2、迭代:我不知道,但是我知道有人知道,你自己去拿

    命令验证查询流程(解析过程)
        # yum install bind-utils -y
        dig +trace egonlin.com

1、dns后续
dns的解析记录类型:

  1. A 记录(Address Record)
    • 定义:将域名指向一个 IPv4 地址。例如,将example.com指向192.168.1.1
    • 用途:最常见的记录类型,用于实现域名到服务器 IP 地址的基本映射,让用户通过域名能够访问到对应的网站或服务器。
  2. AAAA 记录(AAAA Address Record)
    • 定义:将域名指向一个 IPv6 地址。如将example.com指向2001:0db8:85a3:0000:0000:8a2e:0370:7334
    • 用途:随着 IPv6 的逐渐普及,用于为支持 IPv6 的网络设备或服务器提供域名解析,确保在 IPv6 网络环境下能够通过域名正确访问目标资源。
  3. CNAME 记录(Canonical Name Record)
    • 定义:将一个域名指向另一个域名,即别名记录。例如,www.example.comexample.com的一个别名,通过 CNAME 记录可以将www.example.com指向example.com
    • 用途:常用于为服务器或服务创建易于记忆的别名,方便用户访问,同时也便于在服务器或服务迁移时,只需修改 CNAME 记录指向的目标域名,而无需更改所有相关的域名配置。
  4. MX 记录(Mail Exchange Record)
    • 定义:指定了接收该域名电子邮件的邮件服务器。例如,对于example.com域名,MX 记录会指向邮件服务器mail.example.com
    • 用途:确保电子邮件能够正确地发送到目标域名的邮件服务器上,实现邮件的正常收发。
  5. TXT 记录(Text Record)
    • 定义:可以存储任意文本信息,如域名的说明、验证信息等。例如,用于 SPF(Sender Policy Framework)记录,以防止电子邮件伪造。
    • 用途:常用于各种验证和配置目的,如域名所有权验证、邮件服务器的配置说明等。
  6. NS 记录(Name Server Record)
    • 定义:指定了负责该域名解析的权威名称服务器。例如,example.com的 NS 记录可能指向ns1.example.comns2.example.com
    • 用途:用于明确域名的解析责任,告知其他 DNS 服务器应该向哪些名称服务器查询该域名的相关信息。
  7. PTR 记录(Pointer Record)
    • 定义:是 A 记录的反向记录,它将 IP 地址映射到域名。例如,IP 地址192.168.1.1对应的 PTR 记录可能是server.example.com
    • 用途:常用于反向域名解析,主要用于邮件服务器验证、网络管理和安全等方面,帮助确定某个 IP 地址是否属于特定的域名,以及进行反向查找以获取与 IP 地址相关的域名信息。


各种解析及其优先级
    1、用户用浏览器访问某个域名
        Chrome DNS 缓存 > HOSTS文件 > 系统DNS缓存 > DNS服务器。
    
        hosts文件(需要有管理员权限才能编辑,存放的是A记录)
            windows:C:\Windows\System32\drivers\etc\HOSTS
            linux:/etc/hosts
    
    2、不用浏览器访问
        HOSTS文件 > 系统DNS缓存 > DNS服务器。

          eg: 系统缓存随着HOSTS文件的改变而改变

05  网络进阶


2、网络通信(跨网段)必备四种地址
        

        不跨网段有两种地址就可以
            ip地址
            子网掩码
        跨网段通信其实三种地址就够用
            ip地址
            子网掩码
            网关ip地址
        如果要用名字访问,还需要再拥有一种地址
            dns服务器的地
            
        补充:
            东西流量:服务器集群机器之间进行通信
            南北流量:与外网进行通信
           
            
        上述地址的获取方式有两种:
            动态获取:dhcp ---》个人用户
            静态/永久配置:把ip地址信息写到网卡配置文件
            
                  
3、网络通信流程(******)                归于socket层(操作系统)管理
    
    网络程序分两大类:
        1、C/S架构
            client ------------------server
        
        2、B/S架构
            browser(浏览器)------------------server
        
     基于B/S架构通信:    
    1、打开浏览器输入一个url地址

                        url 统一资源定位符(URL地址),有时也被俗称为 网页地址(网址),如同在网络                          上的门牌,是因特网上标准的资源的地址(Address) 
        http:// egonlin.com:80 /

    2、计算机会请求本地dns把域名egonlin.com解析为ip地址
        http:// 1.1.1.1:80 /
        (ip+端口+路径 = 独一无二的资源)
    3、应用层封包:用http协议把数据封装一下
        
    4、传输层:用tcp协议封装一下,打上tcp的头(源端口,目标端口)
            
    5、网络层:用ip协议封装一下,打上ip头(源ip,目标ip)
        
    6、数据链路层:用ethernet协议封装一下,打上ethernet协议的头(源mac、目标mac)
        注意:以太网协议的数据部分默认最大传输单元是1500字节 ----》MTU
        
                   数据包需要分片发送,以1500个字节为单位

eg:  以太网数据包的数据部分(网络层封装后的数据包),最大长度为 1500 字节,而现在的 IP 数据包长度为 5000 字节。5000 / 1500 = 3.33 因此,IP 数据包必须分割成四个包。每个包都需要重复包含一次的 IP 标头(20 字节),所以额外增加的 3 次乘以 20 得 60,需要冗余多发 60 个字节,加载一起 4 个包 = 5600 字节
        
        
4、tcp协议、udp协议
    tcp:可靠协议(stream-----流式协议)
        不是因为有双向通路才可靠(先通过已知的IP和端口号建立虚拟链接,占用操作系统的部分资源保持对通信对方的记录)
        可靠是可靠在: 有确认机制(存于内存中的数据在收到确认信息后才会删除)
    
    
    udp:不可靠协议
        udp协议特点:没有链接
        
        没有确认机制,不可靠
        
        相对tcp协议来说数据传输效率高

eg:  一般情况多为服务端率先断开连接(尽快对下一个请求进行服务),TIME_WAIT增多------访问量大幅增加(高并发)

eg:  x  x+1  x+2  y  y+1  y+2  在一组数据上+1用于验证对方身份

SYN-RCVD状态   ------>进入半连接池等待(队列)--占用内存

syn洪水攻击--拒绝服务(DoS):攻击者发送大量 SYN 包,源 IP 地址是虚假的或不存在的,服务器发出的 SYN-ACK 包无法找到目标地址,也就无法收到最后的 ACK 包,TCP 连接处于半连接状态。服务器会持续等待并可能重复发送 SYN-ACK 包,消耗大量资源占用半连接池,当资源被耗尽时,服务器就无法响应合法用户的请求。

    

5、了解
    子网划分核心:就是控制子网掩码的长短来让ip地址分散到不同的网段/子网里

24位子网掩码---->0-255

25位子网掩码---->0-127  128-255

26位子网掩码---->0-63  64-127  128-191  192-255
    
    192.168.71.7/24
    
    
    11000000.10101000.01000111.00000111 ---> 192.168.71.7
    
    11000000.10101000.01000111.00000001 ---> 192.168.71.0
    11000000.10101000.01000111.00000001 ---> 192.168.71.1
    11000000.10101000.01000111.00000010 ---> 192.168.71.2
    11000000.10101000.01000111.00000011 ---> 192.168.71.3
    11000000.10101000.01000111.00000100 ---> 192.168.71.4
                              .....
    11000000.10101000.01000111.11111111 ---> 192.168.71.255
    
    11111111.11111111.11111111.00000000 ---> 24位子网掩码
    
    11000000.10101000.01000111.00000000 ---> 192.168.71.0
    

    
        
    192.168.71.7/25
    
    

    11000000.10101000.01000111.00000000 ---> 192.168.71.0
    11000000.10101000.01000111.00000001 ---> 192.168.71.1
    11000000.10101000.01000111.00000011 ---> 192.168.71.2
    ........
    11000000.10101000.01000111.01111111 ---> 192.168.71.127  一直到127为止计算出的网络地址都是192.168.71.0 

    11000000.10101000.01000111.10000000 ---> 192.168.71.128  
    11000000.10101000.01000111.10000001 ---> 192.168.71.129 
    11000000.10101000.01000111.10000010 ---> 192.168.71.130
    。。。
    11000000.10101000.01000111.11111111 ---> 192.168.71.255  一直到127为止计算出的网络地址都是192.168.71.128


    11111111.11111111.11111111.10000000 ---> 25位子网掩码
    
    11000000.10101000.01000111.10000000 ---> 192.168.71.128
    

只划分IP层面物理层面依然会根据mac地址进行广播,所以需要划分广播域来配合子网划分
    vlan:
        lan局域网
        vlan:虚拟局域网,通过虚拟技术把一个交换机分成多个广播域去用,一个广播域就是一个小的局域网
              一个局域网内的广播包与另外一个局域网是隔离

    特殊ip地址总结:
    
        1、私网地址
            10.0.0.0~10.255.255.255,表示一个A类地址
            172.16.0.0~172.31.255.255,表示16个B类地址
            192.168.0.0~192.168.255.255,表示256个C类地址

        2、其他
        
        172.16.110.0 
        172.16.110.1
        172.16.110.255

        0.0.0.0:0.0.0.0:80 ----> 192.168.71.7 80
        255.255.255.255

        127.0.0.1 本地回环网卡lo固定使用的地址

access口:  打上vlan标签

trunk口: 连接两台交换机

eg: 服务器内置多台虚拟机  网卡-->交换机    虚拟机内置打上vlan标签      二层模式

06  shell基础与操作系统补充

1、linux系统构成(温故知新)

 
    从功能维度去划分:
        有两大部分构成:
            系统调用接口:负责跟上层的应用程序打交道
            内核:负责跟下层的硬件打交道
            
            
        补充:应用程序本身是无法操作硬件的,但凡想操作硬件都要给系统发请求
    
    
    
        操作系统的两种工作状态:
            用户态: 运行的系统接口代码在与应用程序打交道
            内核态:运行的是系统的内核代码在与硬件打交道
    
    
    
    从文件维度进行划分
        操作系统源自iso镜像文件,镜像文件本质就是一个压缩包,压缩里放着一系列的系统的文件
        
        这些文件分为两大类:bootfs+rootfs
        
        
            bootfs(系统启动前):包含启动文件(bootloader程序,不是以文件的形式存在,是直接写入硬盘的第一个扇区/mbr)、内核文件(/boot/vm...)
                
            rootfs(系统启动后):本质就是一堆文件夹/文件

        
2、linux系统的启动顺序(温故知新)+ 进程/线程

    补充:进程与程序
        程序:就是一个或者一系列代码文件---》静态
        
        进程:就是一个程序的运行过程(资源)--------》动态

        线程是进程中的一个执行单元,是进程的细分,单只进程当中代码的运行过程。是 CPU 调度和分派的基本执行单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件句柄等,但每个线程都有自己独立的栈空间和程序计数器,用于记录线程的执行状态和局部变量等信息。

         一个进程自带一个线程------>一个进程至少包含一个线程,这个线程通常被称为主线程

        ### 多进程模式

        ### 多线程模式
        

        进程代表的是程序的  运行过程,而负责运行整个过程是操作系统,所以  进程是操作系统的最核心的概念没有之一

 程序运行 :  操作系统-->硬盘-->内存-->CPU(指令)-->硬盘 

    1、加电,先启动bios
    2、bios负责找到启动盘
    3、bios读取启动盘第一块扇区mbr主引导记录(放着的是bootloder程序)放入内存,让cpu来执行,bootloader成功启动
    4、bootloader启动之后,负责从硬盘中找到内核文件读入内存,并启动,此时操作系统就启动起来
    
        操作系统启动起来负责管理一系列进程,这些进程可以分为两大类
            内核先启动一个老祖宗程序,pid为0
            
                0号进程负责运行两个顶级程序,产生两个顶级的进程
                    运行init程序,pid号为1:是所有用户态进程的祖宗
                    运行kthreadd程序,pid2:是素有内核态进程的祖宗
        

       
    linux系统启动级别  

 
        init ...   切换

        init 0 # 关机
        init 6 # 重启
        init 3 # -- multi-user.target,进入字符终端(进入bash环境)
        init 5 # 进入图形界面(前提需要安装图形桌面) -- graphical.target
                     yum -y group install "Server with GUI"

        systemctl get-default   获得当前启动级别

        systemctl set-default   修改启动级别

终端

###   切换终端:  在大多数 Linux 发行版中,可通过按下 “Ctrl + Alt + F1” 至 “F6” 键来切换到虚拟终端,每个虚拟终端代表一个独立的登录会话。通常,图形用户界面默认在 “Ctrl + Alt + F7” 虚拟终端上运行。 

      每个终端都可以独立运行各种命令和程序,它们各自占用一定的系统资源,如 CPU 时间、内存等。

      每个终端都有自己独立的环境变量设置

      在一个终端中打开、编辑或删除文件,只要没有其他终端同时对同一个文件进行操作,就不会产生影响。

shell基础

       
3、shell解释器介绍

    在默认启动级别为3的情况下,linux系统启动之后默认会启动一个命令解释器铺满全屏幕给你去(称之为字符终端),只能在里面敲命令。linux系统中的命令解释器称之为shell,翻译为壳,表达了对系统接口封装的思想。      解释器-->对系统接口的封装
    
    具体来说shell解释器分为很多种类,默认用的bash这种
    

4、shell交互式环境
        []内各个部分的意思:
        
            第一部分: 登录的用户名
            第二部分@: 分割符
            第三部分:主机名字
            第四部分:当前所在的文件夹
                ~: 代表当前用户的个人文件夹/家目录
                    root用户的家目录/root
                    普通用户的家目录/home/用户名  
        []括号外:
            $: 当前登录的用户身份是一个普通用户
            #:当前登录的用户身份是一个超级管理员
        补充:
            useradd 用户名
            passwd 用户名  # 交互式
            echo "123" | passwd --stdin egon # 非交互式


        ####  根目录是系统级的目录,关乎整个系统的运行和管理;而家目录是用户级的目录,主要用于用户个人文件的存储和个性化设置。

5、shell脚本
    脚本就是一个简单的程序(整个程序就是一个文件)
    把你执行某个任务需要的10条命令扔到一个文件里,该文件就是一个shell脚本

6、shell命令的基本语法
    ls -l /boot
    三大组成部分:
        ls:命令,代表要做什么事情
        -l:选项,控制命名具体怎么做(可选部分)
        /boot: 参数,命令具体操作的目标(可选部分)
    
7、bash解释器交互式环境的一些特性/快捷方式
    ctrl+c: 强制终止当前命令的执行
    ctrl+l:清屏,等同于clear命令
    
    ctrl+a   光标移到命令行的最前端
    ctrl+e   光标移到命令行的后端

    history 查出命令的编号,然后!编号
    history -c # 清空历史记录
    上下箭头 查出历史命令
    
    !$ # 取上一条命令的参数


    tab键补全

8、shell命令的种类与优先级

    1、带着路径用命令(指名道姓的去某个位置找命令)  最高级

    绝对路径:从根开始的路径,例如/a/b/c/1.txt

    相对路径:   不是从根开始的路径,例如b/c/1.txt
            相对路径会相对于你当前所在的文件夹作为起始点往后查找
            
            .: 代表当前目录
                b/c/1.txt 等同于 ./b/c/1.txt
            ..: 代表当前目录的上一级目录
                   
    /bin/ls # 绝对路径
    ./ls    # 相对路径,前提必须cd /bin下
    
    bin/ls
    usr/bin/ls
    ./ls
    
    ./ls 就是带着路径        ls 直接用就是不带路径

=======================================》不带路径访问: 孤零零一个ls,没有任何前缀

    2、别名:用来alias命令制作的命令          (临时性)

        alias  查看别名
        alias xxx="ls /etc/sysconfig/network-scripts;echo 123;echo 456"
        unalias xxx

         如果要别名永久生效,需要把别名的设置语句添加到 shell 的配置文件中

         nano ~/.bashrc       #编辑

         alias ll='ls -alh'        #添加别名

         alias ..='cd ..'           

         source ~/.bashrc     #使配置文件生效


    3、Compound Commands复合命令
        for((i=0;i<3;i++));do echo 66666;......; done       循环
        
        if        条件


    4、function定义命令/函数
        # 1、定义
        function f() {
            echo 111;
            echo 222;
            echo 333;
        }
        
        # 2、调用
        f 

    
    5、built_in内置命令(内置在shell解释器中,解释器内部集成, 速度更快

         内置命令不会额外产生进程,非内置命令运行时会临时产生进程
            
        type cd                   查看是否为内置命令   type ...
        type pwd
    
        

    6、hash缓存机制(把敲得命令缓存内存中,下次直接会省去查找与加载的开销,直接使用即可)----->一种优化机制
        hash
        hash -r # 清空
            
            
    
    7、环境变量PATH(与命令查找有关系、负责兜底)---->一种查找命令的机制
            
            
        name="egon"
        age=18
        
        echo $age
            
            
        环境变量:在系统任意位置都能访问到,是全局有效的变量
        
        PATH变量的值存的是冒号分隔开的的一堆存放命令的文件夹

        命令使用(优先级):  带着路径走1(优先级最高);不带路径使用命令依次查询2、3、4、5、6、7,环境变量(7)用来兜底,从左至右依次在存放的文件夹中查询

                                                                                                             命令不要重名        
   eg :  在命令前加 \  临时取消命令的别名==带绝对路径使用     
      

 用shell脚本创建一条命令
        # 1、编辑了一个小脚本
            vi mmm ----》按a进入编辑模式----》写入内容:echo mmmmmmmmmm---->按ESC退出编辑模式-----》shift+冒号---》输入wp保存退出
            
        # 2、赋予可执行权限
            chmod +x /root/mmm
            
           
        想要不加任何前缀去调用mmm方法有两种
            方法一:把该脚本移动到PATH的某个文件夹下面
            
            方法二:把该脚本所在的文件夹添加到PATH里 ( :后面继续加 )

                           echo $PATH                                                                                                                                       PATH= ...... : ......          PATH= $PATH : ......
            
                 

9、一些简单的常用命令

    man ls   (man手册)
    或者是命令后-h或者--help   
    
    # 设置主机名
    hostname
    hostnamectl set-hostname test # 永久设置,重启也有效 ----》改动的文件是/etc/hostname


    # 设置启动级别
    systemctl set-default graphical.target  // 图形界面
    systemctl set-default multi-user.target  // 字符终端
    systemctl get-default
    

    # 查看ip地址信息
    # 查看所有活跃的网卡
    ip a
    ifconfig # yum install net-tools -y

    # 查看单块网卡
    ifconfig ens33
    ip a show ens33

    
    # 激活网卡
    ifconfig ens33 up
    用ifconfig需要下载net-tools
    nmcli conn up ens33  # 推荐使用该命令

    # 查看设置系统时间
    date
    date "+%F"
    date "+%Y-%m-%d %H:%M:%S"

    
    date -s "2024-04-15 11:11:11" # 系统时间
    
    # 重启
    shutdown -h 10 # 10分钟后关机
    shutdown -h now # 立刻关机
    shutdown -r 10 # 10分钟后重启
    shutdown -r now # 立刻重启----》init 6,reboot
    shutdown -c # 取消掉将要执行的关机或重启

   #  查看系统相关信息
    cat /etc/redhat-release            红帽系
    cat /etc/os-release                   ubuntu
    uname -a
    uname -r
    uname -m

    
   #  中文展示
    echo $LANG
    LANG=zh_CN.UTF-8
    补充:export  设置为环境变量
              效果:从当前进程生效,以及该进程的子子孙孙都生效
                         永久有效-->修改配置文件
    centos9输出中文,需要先安装语言包        yum install glibc-langpack-zh # rockylinux

 #  设置时间
    (了解知识)
        date -s "2011-11-11 11:11:11" # 系统时间
        hwclock -w   # 立刻把系统时间保存到硬件
        

    对于一个集群来讲时间一致非常重要
        服务器集群如何同步时间:
            集群中所有的机器--------》时间服务器(ntp服务器)
    设置时间的命令
        timedatectl 查看
        timedatectl set-timezone Asia/Shanghai
        timedatectl set-ntp yes/no

07  文件管理基础

 变量--->内存      文件--->硬盘

1、linux的目录结构(单根结构)

 
        整个系统目录结构是一个树形结构
            树根:/
    
        一切皆文件的设计思想
        
            文件夹是用来组织文件
            linux中的文件夹 ----》目录文件

            
2、绝对路径、相对路径

 
        绝对路径:
            以/开头的路径
            特点:当前无论你在哪个文件夹下面,用绝对路径肯定能找到目标文件
            /a/b/c/d/1.txt
        相对路径:
            不是以/开头的路径
            特点:基于当前文件夹往后进行查找
            cd /a/b/c/
            d/1.txt
        特殊符号:
            .  :代表当前目录,例如:./b/c/1.txt
            ..  : 代表上一级目录
            ../../../a.txt
            ~: 代表的是当前登录用户的家目录
                root----》/root
                普通----》/home/用户名

        补充:
            windows的文件夹不区分大小写
            linux的文件夹区分大小写

 3、文件的种类

 
    对比windows系统,区分文件,用后缀名区分
        a.txt  # 文本文件
        a.mp4  # 视频文件
        a.jpg  # 图片文件

##  null  黑洞文件
    
    ls -l 

 (第一位)
    -: 代表的是普通文件,包含文本文件、图片、视频
    d:代表的是目录文件,本质就是文件夹

    b: 代表的是block块设备文件,例如:ls -l /dev/sda
           站在硬盘的角度最小读写单位是一个扇区
           站在操作系统的角度最小的读写单位一个block块(默认是由8个扇区组成)
    l:代表的是软连接,就相当于windows系统中快捷方式
  
  

    4、linux各个目录的作用(***)


    /etc下 各个文件的作用 ----配置信息 
        /etc/sysconfig/network-script/,网络配置文件目录,具体的网卡配置文件rockylinux有变动
        /etc/NetworkManger/system-connections    # centos9
     
        /etc/hostname   系统主机名配置文件
        /etc/resolv.conf   dns客户端配置文件
        /etc/hosts   本地域名解析配置文件
        /etc/fstab    系统挂载目录 开机自启动挂载列表
        /etc/passwd  系统用户文件
        
        dd if=/dev/zero of=/tmp/a.txt bs=10M count=3   将...写入...中  块大小10M 写三次共30M
        dd if=/dev/sda of=/tmp/a.txt bs=10M count=3     (快速填充文件大小)


    /var/log # 存放日志
        /var/log/messages # 系统日志
    
    
   /tmp     # 相当于windows系统的回收站

   /dev/null   # 黑洞文件

   /sbin    存放系统管理员使用的系统管理命令和工具

               如init进程;  udevd,管理设备文件系统和热插拔设备; fdisk;ifconfig;mkfs;service;chkconfig;

               它和 /bin/ 目录类似,都存放可执行文件。但 /bin/ 目录中的命令是供所有用户使用的                    基本命令,如 lscdcp 等,而 /sbin/ 目录中的命令主要是面向系统管理员的管理工                  具。 

/proc       ----是一个虚拟文件系统,它并不占用实际的磁盘空间,而是在内存中动态生成。它允许用户空间的程序通过读取和写入proc目录下的文件来与内核进行交互,获取系统的各种信息

           /proc/cpuinfo 查询系统内存

           /proc/meminfo 查询系统CPU

           /proc/self 指向当前正在运行的进程自身

           /proc/sys/... 在不重启的情况下调整内核参数

             


    5、远程连接工具
    

服务器上安装服务端程序:openssh-server
        systemctl status sshd # 配置文件/etc/ssh/sshd_config
        systemctl restart sshd # 重启会重新加载配置文件
    
    在个人电脑要按照一个ssh的客户端程序
        ssh的客户端种类:
            windows:
                1、xshell
                2、secureCRT
                3、putty
            
            mac:
                本身就自带ssh客户端
                xterm


    
    
    6、文件管理相关命令

 
    6.1 基础命令
        # (1)查看当前所在的文件夹
        pwd 
        
        # (2)切换目录
        cd /etc/sysconfig
        cd /etc
        cd sysconfig
        
        cd .
        cd ..
        cd                # 等同于cd ~
        
        cd -               # 切换到上一次所在的文件夹
        
        # (3)查看目录层级结构
        yum install tree -y
        tree
        tree -F # 针对目录会在结尾加/来表示
        
        tree -a # 隐藏文件也会展示     文件前面加  .  表示隐藏目录/文件
        tree -d # 只展示目录
        
        tree -F -a -L 1 /tmp/  # 指定查看的层级
        
        
        # (4)ls浏览命令
        
        ls -l # 查看的是文件的元数据
        
        ls -lh # 文件大小带着单位
        
        ls -a # 可以查看到点开头的文件这种隐藏文件
        
        ls -dl /tmp # 查看某个目录本身的元数据
        
        ll # 等同于ls -l --color=auto
        
        
        # ls -l查看出的各部分元数据的含义
        [root@www ~]# ll /tmp/a.txt 
        -rwxr-xr--. 1 root group1 31457280 4月  16 14:21 /tmp/a.txt
        -:文件的类型
        rw-r--r--:权限
            
        .  : 代表该文件是在开启selinux(安全上下文)的情况下创建
                setenforce 0 # 临时关闭selinux
                vi /etc/sysconfig/selinux  # 永久关闭
                    修改:
                    SELINUX=disabled
                
                getenforce      enforcing-->开启            permissive-->关闭(无影响)
                
           1: 硬链接数    
            
            root: 属主
            group1:属组
            
            31457280: 文件的大小
           
            4月  16 14:21:文件的内容修改时间modify time--》mtime
            
            /tmp/a.txt: 文件名

 
    6.2 文件的三种时间(mtime、atime、ctime)
        stat /tmp/111.txt
            最近访问
            atime: 查看一次文件内容,atime就会变一次
            最近更改
            mtime:文件内容改动,该时间才会变  
            最近改动
            ctime:文件元数据(权限、属主、属组变化)的变量、文件内容的变化,该时间都会变
    
    
        覆盖写文件
            echo 111111111111111111 > /tmp/111.txt
 

    
    6.3 文件管理命令
    # 1、普通文件、目录文件
        # 创建
            # (1)创建普通文件
            # 注意:touch创建的都是普通文件(包含、图片、视频、文本文件)
            touch /tmp/222.txt 
            touch /tmp/1.jpg
            touch /tmp/1.mp4
            
            touch /tmp/{1..10}.txt
            touch /tmp/{a..c}.txt
            touch /tmp/Ego{n,N}.txt
            
            # (2)创建目录
            mkdir -p /tmp/a/b/c/d/e
            mkdir /tmp/mmm{1..3}
        # 复制
            # (1)复制普通文件
                cp /etc/hosts /tmp/   # 目标/tmp/hosts
                cp /etc/hosts /tmp/1.txt   # 目标/tmp/1.txt(改名)
            
            #(2)复制目录
            cp -r /etc /tmp
            cp -r /etc /tmp/xxx  (改名)

            # (3)  远程

            scp local_file remote_username@remote_ip:remote_file 本地复制到远程

            scp remote_username@remote_ip:/home/user/example.txt(远程文件) .(本地目录)

        
        # 移动(剪切)
            (1) 移动普通文件
                mv /a/b/c.txt   /tmp/
                mv /a/b/c.txt   /tmp/b.txt
            
          (2)移动目录
                同上(不需要加-r)
                
          (3)改名字
            在同一个文件夹下面
            mv a.txt b.txt
        
        # 删除
            rm -rf /tmp/*  # 删除/tmp下所有的内容           -r  递归       -f  取消提示   -d 删除空目录

            mv  /a/b/c.txt   /tmp/        将文件剪贴至回收站==有备份删除

            truncate  -s  0   文件...       rm -rf  文件...   (文件过大时存在的链接关系过多导致rm删除过慢,附加一条truncate指令将大小伪装至0进行删除,文件删除的本质未删除数据,只是解除了链接的关系,详解见文件系统,等再次建立新的链接后对数据区域进行写入覆盖才会彻底删除以前的数据,所以删除后数据存在被恢复的风险)
            
    
    # 2、文件内容如何操作(文本文件)
    
        cat /etc/hosts # 查看所有内容
        
        # 了解
        less # 上下键翻页,输入q退出
        

        head -3 /etc/passwd # 查看头几行
        
tail -3 /etc/passwd # 查看末尾几行
        
        ps aux | head -3        查看前三个进程
        ps aux | tail -3            查看末尾进程
    
    
        tail -f /var/log/messages # -f可以动态查看文件新增的内容
        echo 111 > /tmp/a.txt # 覆盖写    ---->覆盖写的动态查询不到
        echo 111 >> /tmp/a.txt # 追加写

        

        dd if=/dev/zero of=/tmp/a.txt bs=10M count=3   将...写入...中  块大小10M 写三次共30M
        dd if=/dev/sda of=/tmp/a.txt bs=10M count=3     (快速填充文件大小)

08  文件管理高级 

1、命令行文本编辑器vi、vim

可视块------------> ctrl + v   

---->方向键选择内容-----> i 在内容前插入   a  在内容后插入    d 删除所选内容 ----->连点两次esc(针对于插入)

vim 命令

末行模式:

标number    set nu

查找关键字        / 关键字

命令行模式:

复制粘贴     yy复制一行 p粘贴一行 dd 删除一行               1,2 co 5把1到2行复制到第五行

dd

删除光标所在行

ndd

删除当前行(包括此行)后 n 行文本

dG

删除光标所在行一直到文件末尾的所有内容

p

将剪贴板中的内容粘贴到光标后

P(大写)

将剪贴板中的内容粘贴到光标前

y

复制已选中的文本到剪贴板

yy

将光标所在行复制到剪贴板,此命令前可以加数字 n,可复制多行

在末行模式下的替换指令
        语法:
            :定位 s@@@g    或者:定位 s/   /    /g 

        具体用法示范:
            # 特殊服务转义+替换
              将全文本中的  /a/b/c/1.txt   转换为  /mmm/111.txt    
                :%s /      \/a\/b\/c\/1\.txt                 /          \/mmm\/111\.txt                 /g
                
                :%s /\/a\/b\/c\/1\.txt/\/mmm\/111\.txt/g
            
            :%s @@@g
            :%s ###g
            
            %s @      /a/b/c/1.txt          @     /mmm/111.txt    @g
            %s @/a/b/c/1.txt@/mmm/111.txt@g

              行定位:
                 %:定位到所有行
                 1,5: 1到5行
                  ,8 : 首先光标要移动到某一行,以这一行为起始一直到第8行
                 2,$ : 从第二行到最后一样

vi编辑器原理:

数据写入内存,保存后写入硬盘;如果未保存时退出,实际上数据已经写入硬盘中的隐藏文件,下次进入时会进行调动,将原文件删除并将隐藏文件重命名为原文件进行保存。

vim -O   .txt     .txt     同时编辑        crtl w  切换文本

比对两个文件
            diff -u aaa.txt bbb.txt

            vim diff -u aaa.txt bbb.txt     (在编辑器中)
            以aaa.txt的内容作为参照,看一下bbb.txt有何变动

2、文本处理三剑客

 
    sed:

 
        1、stream editor流式编辑器,不会一下子把文件内容全部读入内容
            而是读一行到内存处理一行,然后再读下一行

        2、非交互式编辑修改文本文件内容


   sed的用法:
            sed '定位+命令' a.txt
        
            定位的方式:
                行定位:
                    1
                    1,3
                    
                正则定位:
                    /^egon/   以标志词开始
                    /egon$/   以标志词结束
                    /egon/      包含标志词的
        
               
                行定位+正则定位
                    1,3
                    1,/egon/
        
                指定具体的某几行
                    sed '1p;3p;5p' 1.txt
                    sed '1p;3d;5p' 1.txt
            
            命令:
                p 打印
                d 删除
                s///g  替换
                        
            sed '1p' a.txt
            sed '1,3p' a.txt
            sed '1,3d' a.txt            
            sed '1,3s/xxx/yyy/g ' a.txt

sed是支持管道符号
                ps aux | sed '1,50d' # 可以处理一个命令的输出结果
如何写入文件:加一个选项-i
                -i: 把输出到屏幕中的内容覆盖写入文件
            
                sed -i '1,3p' 1.txt

试验:
            [root@www ~]# cat 1.txt 
            egon1111
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            [root@www ~]# 
            [root@www ~]# sed '' 1.txt
            egon1111
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            [root@www ~]# 
            [root@www ~]# sed -n '' 1.txt         #      -n   取消掉默认打印   如果没有命令进行输出的话,默认一行一行打印全文

# 定位到第一行进行打印
            [root@www ~]# sed '1p' 1.txt
            egon1111          #打印的内容
            egon1111          # 不加 -n的话会打印
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            [root@www ~]# sed -n '1p' 1.txt
            egon1111

# 行号-范围匹配
            [root@www ~]# sed  '1,3p' 1.txt
            egon1111
            egon1111
            22222egon
            22222egon
            3333egon33333
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
        
            [root@www ~]# 
            [root@www ~]# cat 1.txt 
            egon1111
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
          

正则匹配
            [root@www ~]# sed  '/egon$/p' 1.txt
            egon1111
            22222egon
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            6666egon6666egon666egon

行号+正则
                    
            sed  '1,/xxx/p' 1.txt     # 从第一行到最近一次匹配/xxx/的行截止

            [root@www ~]# cat 1.txt 
            egon1111
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
       
            [root@www ~]# sed '1,/xxx/p' 1.txt 
            egon1111
            egon1111
            22222egon
            22222egon
            3333egon33333
            3333egon33333
            4444xxx44444
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon

# 删除命令   
            [root@www ~]# 
            [root@www ~]# cat 1.txt 
            egon1111
            22222egon
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
    
            [root@www ~]# sed '2d' 1.txt    删除或改动匹配到的不会进行默认输出
            egon1111
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
           
            [root@www ~]# sed '1p;2d;5p' 1.txt 
            egon1111
            egon1111
            3333egon33333
            4444xxx44444
            5555xxx55555xxxx555xxx
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
       
 

# 替换命令

            sed '1,3 s/egon/EGON/g'
                     
                
            [root@www ~]# cat 1.txt 
            egon1111
            22222egon
            3333egon33egon333egon
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            [root@www ~]# 
            [root@www ~]# sed '1,3s/egon/EGON/g' 1.txt 
            EGON1111
            22222EGON
            3333EGON33EGON333EGON
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            [root@www ~]# 
            [root@www ~]# 
            [root@www ~]# 
 

# 不写定位定位所有行
            sed 's/egon/EGON/g' 1.txt 
 

# 行号定位+正则定义
            [root@www ~]# cat 1.txt 
            egon1111
            22222egon
            3333egon33egon333egon
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon
            [root@www ~]# 
            [root@www ~]# 
            [root@www ~]# sed '1,/egon$/   s/egon/EGON/g' 1.txt 
            EGON1111
            22222EGON
            3333egon33egon333egon
            4444xxx44444
            5555xxx55555xxxx555xxx
            6666egon6666egon666egon

awk:

 
        格式化输出,针对的是有规律的文本文件

        语法:    
            awk -F':' '定位+命令' /etc/passwd

            -F: 指定分隔符,不指定默认以空格为分割符(空格数量可以为一个或多个)

        定位方式:
                1、行号
                    NR==5
                    NR>=1 && NR<=3
                    
                    NR<=3 || NR >= 5

                 2、正则定位
                                    /正则表达式/
          命令:
                           {print }

awk的运行逻辑
            awk -F':' 'NR>=1 && NR<=3{print $1}' /etc/passwd
1、读入文本的一行内容,进行处理
                (1)先把这行内容整体赋值给一个变量$0
                (2)以冒号为分隔符对该行进行分割
                    第一段内容 --赋值给---》$1
                    第二段内容 --赋值给---》$2
                    第三段内容 --赋值给---》$3
        
                (3)把行号赋值NR变量
                
                (4)把这一行分的段数赋值给变量NF
                
  2、执行规则'NR>=1 && NR<=3{print $1}'
            
            后续就是重复1,2步直到处理完文件的所有行

练习:
            针对文件/etc/passwd

            1、取第三行后,第1列与第2列
            awk -F':' 'NR>3{print $1,$2}' /etc/passwd       , 表示列与列之间的空格
            awk -F':' 'NR>3{print $1"------"$2}' /etc/passwd    " "存放列与列间的自定义分隔符
            2、取第一行与第五行的最后一列
            awk -F':' 'NR==1 || NR==5{print $NF}' a.txt             #最后一列    # || 与      &&或
            awk -F':' 'NR==1 || NR==5{print $(NF-1)}' a.txt         #倒数第二列
            
            
            补充:[root@www ~]# awk -F':' '{print NR,$1,NF}' a.txt

            
            3、取root开头的行的,第1列与第三列
            awk -F':' '/^root/{print $1,$3}' a.txt                                   #正则表达式
            4、第一列内容等于root的行,打印出第1、3列
            awk -F: '$1 == "root"{print $1,$3}' a.txt
            5、第一列内容是r开头的行,打印出第1、3列
            awk -F: '$1 ~ /^r/ {print $1,$3}' a.txt
            6、最后一列内容是bash结尾的行,打印出第1、3列
            awk -F: '$NF ~ /bash$/ {print $1,$3}' a.txt

            7、第一列内容不是r开头的行,打印出第1、3列
            awk -F: '$1 !~ /^r/ {print $1,$3}' a.txt
 

 awk命令也支持管道符号
            ps aux结果的前十行,取pid与command列
            ps aux | awk 'NR<=10{print $2,$NF}' 

补充:默认分隔符是1个或多个空格,案例如下
        [root@www ~]# cat b.txt 
        aaa             bbb                    ccccc
        111 222               33333
        [root@www ~]# 
        [root@www ~]# awk '{print $1,$3}' b.txt 
        aaa ccccc
        111 33333
 

grep:

                 过滤文本或者过滤命令的结果
        

        用法:
            grep 选项 '正则' 文件路径
            
            命令  | grep 选项 '正则' 
    
        选项:
    
            -n:加上行号
            -i: 忽略大小写
            -r: 递归过滤某个文件夹,把匹配成果文件路径及所匹配到的文件中的内容展示出来
            -rl: 递归过滤某个文件夹,把匹配成果文件路径展示出来
    
                grep -rl 'root' /a
    

 
            -v:取反
                [root@www ~]# grep '111' 1.txt
                111
                [root@www ~]# 
                [root@www ~]# 
                [root@www ~]# 
                [root@www ~]# grep -v '111' 1.txt
                222
                333
                444
                [root@www ~]# 
                [root@www ~]# 
                [root@www ~]# cat 1.txt 
                111
                222
                333
                444

    
        正则表达式
            grep '^root' a.txt
            grep 'root$' a.txt
    
    
        练习:
            过滤某个进程
                ps aux | grep 'sleep'
            
            过滤某个进程,然后去掉grep命令本身产生的进程
            
                ps aux | grep 'sleep' | grep -v 'grep' 连续过滤
                 或者 ps aux |grep '[s]leep'   ##正则

3、文件查找命令    

 
按照文件名查找:
        find /etc -name "ifcfg-ens33"
        find /etc -name "ifcfg-*"
        find /etc -name "*cfg* 

按照大小查找
        find /etc -size +3M # 大于3M
        find /etc -size 3M # 等于3M
        find /etc -size -3M # 小于3M
            
 指定查找的深度:
        find /etc -maxdepth 5 -size +3M -name "*.log"
        
    -a与-o
        -a:并且(默认为-a,不用写)
        -o:或者
        
        find /etc -size +3M -o -name "*.log"  # 找到大于3M或者文件名是.log结尾的 

按照时间查找
        [root@localhost ~]# find /etc -mtime +3                 # 修改时间超过3天
        [root@localhost ~]# find /etc -mtime 3                  # 修改时间等于3天
        [root@localhost ~]# find /etc -mtime -3                 # 修改时间3天以内

    
        find /xxx -mtime +3 -name "*bak*" -exec rm -rf {} \;

根据文件类型进行查找
        find /etc -type f -name "*.log" -size +3M -exec rm -rf {} \;     查找文件
        find /etc -type d        查找目录
          
找到之后进行某种操作
    
        find /etc -size -3M -exec cp -ra {} /test/ \;
        find /aaa -size -3M -exec mv {} /test/ \;
        find /log -size +10M -exec rm -rf {} \;
        
        
        补充:-exec   命令    {}    \;  #对查找到的每个文件或目录执行指定的命令   

                                                     #{}  占位符  代表查找到的每个文件或目录

                   cp -a # -a拷贝源文件的元数据+内容   

                   cp -r  #  递归

4、上传下载

 
    # yum install wget -y
    wget http://egonlin.com/wp-content/uploads/2021/07/%E5%A4%B4%E5%83%8F.jpg 
    wget http://nginx.org/download/nginx-1.22.1.tar.gz
    wget -O /xxx/1.tar.gz http://nginx.org/download/nginx-1.22.1.tar.gz

             -O  指定文件路径文件名(wget)  -o (curl)   

             -c 断点续传
    
    # 如果遇到ssl问题,有两种方案尝试
    1、--no-check-certificate
        wget  --no-check-certificate  https://nginx.org/download/nginx-1.22.1.tar.gz

           (ssl----安全套接层,是一种为网络通信提供安全及数据完整性的安全协议)

    2、改用http协议下载
        wget http://xxxxxxxxxxx

curl -o /xxx/1.png http://www.xxx.com/1.png
       -s   (静默输出,不打印内容;  curl默认下载完成的同时展示文件内容)
    如果碰到ssl相关报错提示,有两种方案尝试
    1、-k
    curl -k -o /xxx/1.png https://www.xxx.com/1.png

    2、改用http协议
    curl -o /xxx/1.png http://www.xxx.com/1.png
    

  

 curl命令的额外用法:可以把网上的脚本下载到本地后立即执行###

# 准备服务器,并且在服务上放置好一个脚本文件
        ubuntu-->apt-get install nginx -y       # centos-->yum install nginx -y
        
        cd /var/www/html
        mkdir test
        vi a.sh  # 随便几行命令
        systemctl start nginx
    
    # 在客户端
        curl -s http://192.168.71.8/test/a.sh | bash
    
    # 安装yum install lrzsz -y
    

   ### 图形化界面

    rz :上传       
  

    sz :下载 

5、文件管理的:输入输出重定向

 
    储备知识:文件描述符
    
    文件描述符是什么?
        进程但凡打开一个文件,操作性系统都会为打开的文件分配一个编号(>=0的整数)
    
        这个编号就称之为文件描述符(也称之为文件句柄) 

整体的关系:
        进程(打开文件,进行输入输出)-----------》文件描述符-------》操作系统内核--------》硬盘
    
    
    一个进程运行起来之后,我们要用它的时候无非就是与之交互
        交互=输入+输出
        输入输出背后对应的机制是什么?
            在linux系统中很简单,一切皆文件,所以
                对于进程来讲:
                    输入操作----》某个打开的文件---》某个文件描述符   #对应
                    输出操作----》某个打开的文件---》某个文件描述符   #对应

        0文件描述符:代表标准输入
        1文件描述符:代表标准正确输出
        2文件描述符:代表标准错误输出 

tty--> 指令用于显示当前终端设备的文件名

/dev/pts/0     虚拟终端文件(远程连接的)                 /dev/tty/0    服务端自带的终端文件

重定向符号:
        > : 覆盖写入    ----有内容就覆盖,没有文件就创建并写入
        >> : 追加写入

   

------>>默认打开的文件为终端文件                   
    asdfasfasdfa 2>/tmp/a.txt     ##将错误输出覆盖写入自定义文件中,不显示
    ip a 1>/tmp/a.txt          ##将正确输出覆盖写入自定义文件中,不显示  

        ip a 1> /tmp/run.log
        ip a > /tmp/run.log  # 不加任何数字,默认就是文件描述符1
      
    

    命令  1>/tmp/a.txt 2>/tmp/b.txt
    
    命令  1>/dev/null 2>/dev/null            ### null 黑洞文件
    
    命令  &>/dev/null # &符号代表1和2     ##将所有输出覆盖写入... ...
    

标准输入
        
    cat > /tmp/xxx.txt << "EOF"             将大量文本内容写入指定的文件中
    11111111111
    2222222222222222
    333333333333333333
    444444444444444444
    echo $PATH
    555555555555555555
    66666666666666666666
    EOF

##   > 覆盖输入   >> 追加输入   <<  逐行输入   "" 不执行文本中的指令      EOF 表示开始结束位置

6、字符处理命令

        
sort命令:  默认字符串比大小对文件内容进行排序

                   -n     以数值大小进行排序           -t 指定分隔符,默认为空格

                   -r       以相反的顺序排序              -k 以某列进行排序

         sort -t":" -k2 b.txt     以冒号为分隔符对第二列进行排序
    
    
unqi去重命令:
    cat file.txt |sort |uniq -c|sort -rn

# sort 以排序的逻辑将相同内容放在一起

# -c 去重时在开头显示重复的次数

# sort -rn以相反的顺序对数值大小进行排序
    

访问排名前十的ip地址
    awk '{print $1}' access.log | sort|uniq -c|sort -rn |head -10

cut命令:

简化版awk   --->   cut -d':'  -f1,2,3    #以冒号为分隔符展示前三段的内容

                  -d 指定分隔符          -f 显示指定字段内容

wc命令:统计

             - l   统计文件行数      

      ps aux | wc -l      #统计正在运行的进程数(一般统计时减2  标题和命令自身进程各占一行) 

7、打包压缩

 
    打包:把多个文件放到一起,得到一个打包文件
    压缩:对打包的文件进行空间上的缩减

yum install gz* xz* bzip* -y                 gzip   bzip2压缩算法     只适用于Linux

tar -zcvf   /root/backup.tar.gz    /usr/local/

tar --help(查看参数)

file /root/backup.tar.gz #查看文件格式

  • -z:使用 gzip 算法对归档文件进行压缩,生成 .gz 后缀的压缩文件。

  • -c:表示创建一个新的归档文件。

  • -v:以详细模式运行,在操作过程中会显示被处理的文件和目录的名称。

  • -f:指定归档文件的名称,后面紧跟要创建的归档文件的路径和文件名,这里是 /root/backup.tar.gz

  • /usr/local/:指定要归档和压缩的源目录,即要把 /usr/local/ 目录下的所有内容打包到归档文件中 

        

tar xvf a.tar.bz2 -C /data/      # 解压缩不区分算法

## -C   用于指定解包文件的目标目录,如果不指定 -C 选项,tar 会将文件解包到当前工作目录                   下。           

     -x    即解包、提取
        

让我们的压缩包不带着被打包目录
            # 1、先切入被打包目录下
            cd  /data 
            # 2、进行打包压缩操作
            tar -cvzf ../a.tar.gz ./*   
        

 tar -zcvf `date '+%Y_%m_%d_%H_%M_%S'`.tar.gz   /data

整个  `date '+%Y_%m_%d_%H_%M_%S'`.tar.gz  会生成一个以当前日期和时间命名的 .tar.gz 文件名,例如 2024_10_01_12_30_00.tar.gz

# 如果想要把找到的结果进行打包压缩,使用xargs   -->使不支持管道符的指令支持管道符
    find /test -name "*.txt" -exec tar czf ../111.tar.gz {} \; # 会丢文件
    find /test -name "*.txt" | xargs tar czf ../222.tar.gz     # 所有找到的文件都被被打包 

        
        
    zip(Window  Linux通用): 安装yum install zip -y
        打包压缩:
        zip -q aaa.zip /data/1.txt /data/2.txt /data/3.png        # -q 安静模式,不显示过程
        zip -rq bbb.zip /data/               # -r 递归,压缩整个目录
    
        解压缩( yum install unzip)
        unzip bbb.zip -d /nnn              # -d  指定解压文件的目标目录

8、大文件切分与合并

 
    tar czf a.tar.gz /etc/

    # 拆分
    split -b 2M a.tar.gz # 以10M为单位切分成多分


    # 组合
    
    cat xa* > b.tar.gz              #一次全部写入可以用 >

    # md5sum计算两个文件的结果如果一样,就代表两个文件内容一模一样(哈希算法的一种)
    md5sum a.tar.gz
    md5sum b.tar.gz

补充:文件完整性校验----哈希算法(hash)

文件源内容一样,相同的hash算出来的结果也一定一样,反之亦然

根据hash值不能反推出原内容

9、文件系统(***)(df)

    文件系统是什么?
        文件系统是操作中用来控制硬盘的一种程序         ext4       xfs     btrfs

        
    每个硬盘分区都要有一个文件系统           每一个分区都对应一个文件系统
        硬盘分区----》打隔断,分割出一个个小空间
        文件系统----》对一个个小空间做装修,负责把空间的数据组织好
  
    文件系统组织好了之后带来的方便之处 :
        使用者-----》    block块(文件系统)-----》n个扇区(硬盘的读写单位)

        使用者使用文件系统将扇区进行管理后形成的block块

        
    一个文件系统包含的三大类块

        文件有两部分数据构成:
            元数据:ls -l的结果如权限、属主、数组-------》inode block块
            内容数据:cat看到的结果,真正的内容  -------》data block  

            superblock超级块:记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等
        其中:
                  superblock一个文件系统整体就一个
                  对一个文件来说:
                          inode block就1个
                          data block可能有多个


    查看文件系统类型
        df -T          # 查看文件系统类型

        df -h           # 空间使用量带单位

        df -i            # inode号的使用量

df  ----------------显示已挂载文件系统的磁盘使用情况

        

      硬盘满了,分两种情况:
            假设硬盘空间10个G
            1、inode号耗尽:存1000 0000个空文件,耗尽inode号
                测试命令:for((i=1;i<=300000;i++)){ touch $i.txt; }
                
            2、磁盘空间耗尽:只存一个文件,但是这个文件有12G
                测试命令:dd if=/dev/zero of=目标路径/1.txt bs=10G count=3  (写0快速填充

        dd if=/dev/zero of=/tmp/a.txt bs=10M count=3   将...写入...中  块大小10M 写三次共30M
        dd if=/dev/sda of=/tmp/a.txt bs=10M count=3     (快速填充文件大小)
        
        补充:动态检测某个命令的结果
        watch -n 1 "df -i |grep sda1"     
每一秒更新一次


    查看一个文件内容底层流程
        文件夹也是文件:
            元数据:权限、属主、属组、、、------》inode block块
            内容数据:存的该文件夹包含的--------》data block块
                子文件名-----》对应的inode块的编号
                子文件夹名-----》对应的inode块的编号
    
        普通文件
            元数据:权限、属主、属组、、、--------》inode block块
            内容数据:你写的文件中的数据--------》data block块
    
    
        cat /etc/passwd
        ll   -di    /          ---->查看根的inode号


    
    
    
    10、硬链接、软连接

 
        硬链接:目标文件与源文件指向同一个inode号
            ln /1.txt /2.txt
            
            特点:
                1、改动一个文件元数据或内容,另外一个也跟着变
                2、删除源文件,仅仅只是解除了源文件名与inode号的关联关系
                    所以不会影响目标文件(链接后两个文件地位相同,可以不分源与目的)
                3、硬链接无法跨分区(硬盘分区-->文件系统-->inode号)
                    [root@localhost ~]# ln  /1.txt /boot/3.txt
                    ln: 无法创建硬链接"/boot/3.txt" => "/1.txt": 无效的跨设备连接

                4、不能对目录做硬链接
                    
      

 软连接:目标文件指向的是源文件的文件名
        
            ln -s /1.txt /4.txt
            
            特点:
                1、改动一个文件内容,另外一个也跟着变
                    改元数据的话,彼此之间不会互相影响
                2、删除源文件/1.txt,目标文件不可用    
                3、软连接可以跨分区,因为是指向文件名             
                    ln -s /1.txt /boot/5.txt
    
                4、可以对目录做软链接(因为可以跨分区)

09  权限管理

1、用户、组管理(*****)

    什么是用户?组?
        如果把整个系统当成一个家公司      
        用户指的就是一个个员工        
        超级管理员就是所有员工里的老板        
        组指的就是部门
    
    
    为何要有用户?组?
        为了划分权限
            具体来说分成三大类:
                u:文件归属的主人,简称属主
                g:文件归属的组,简称属组
                o:不是u也不是g里的成员,统称为其他人o
                
                
        每个进程都是以某个用户xxx身份启动
            ps aux # 第一列就是当前进程的用户身份
    
    
            当该要操作某个文件时,进程会以xxx用户去依次匹配
                1、xxx用户是否是目标文件的属主,若是,则直接对应属主的权限,否则继续往下对应
                2、xxx用户是否是目标的文件的属组内的成员,若是,则直接对应属组的权限,否则继续往下对应                
                3、xxx用户归属其他人
    
        
        敲命令也是在启动进程,该进程的什么是谁?
            1、如果没做过任何配置,默认用户身份是你当前登录的用户
            2、可以对程序进行配置,指定其以什么用户身份启动
    
    
    如何管理用户?组?
        用户的增删除改查
            useradd egon
            groupadd group1                    
            
            id egon   查询用户信息
                 uid: 用户的身份证号(系统是uid号来识别用户)
                     0----》     超级管理的uid,通常只有一个
                     1-999----》    系统用户所使用的uid
                     >1000----->       后续创建的用户
                     
                gid:用户的主组gid号(创建用户会默认会创建一个与用户名同名的组,作为该用户的主组)    

                groups: 该用户所在所有的组=主组+附加组
                
                
                
            与用户相关的一系列文件
            
                /etc/passwd : 存放的是用户详细信息 

  用户名:密码占位符:uid:gid:用户描述:用户家目录:登陆用户后自动执行的第一条指令

         
                /etc/shadow : 存放的是用户的密码(了解)

                
                /etc/group : 存放的是组信息
                /etc/gshadow: 存放组密码(了解)
        
        
                # 了解:
                /etc/skel # 家目录里的隐藏文件的源模板
                /home/egon: 家目录 (创建一个用户后家目录自带隐藏文件)
                /var/spool/mail/egon # 邮箱文件
        
        
            查看用户(补充)
                who             所有登录用户信息
                whoami       当前登录用户信息
                pkill -KILL -u egon # 强制某个用户下线
                
                
            删除用户:
                userdel -r tom     (不加 - r 会有用户家目录残留)
        
        
            创建用户详细(了解)
                useradd lili -s /sbin/nologin -u 2000      -g it        -G salve    -d /abc
                                   登录shell            uid       主组group  附加组    用户家目录

            加密码

            passwd testuser  (暗文)

            echo ...  | passwd --stdin testuser  (明文)
        
            修改用户
                usermod -g group1 lili

                usermod -G group2 lili  # 单纯的覆盖附加组
                usermod -a -G group2 lili # 在原有的基础上增加附加组
        
        组的增删改查
            groupadd group1            
            groupmod -n sale salve    修改后   原
            groupdel -r group1    删
                
        组成员管理:
                groupadd it
                useradd user01
                useradd user02
                useradd user03

                gpasswd -a user01 it          #往组里添加成员
                gpasswd -M user02,user03 it
                            
                gpasswd -d user01 it # 从it组里删掉成员user01

2、文件权限(*****)

 
    文件的权限分类:
        9位,3位一组,每一组都由三部分组成
            r
            w
            x                                  
    文件的权限的归属角色有三类:
        u: 属主
        g: 属组
        o:其他人                
        
    谁来用文件的权限---》进程    
    进程来用文件的时候,如何匹配权限的呢?
        1、进程启动(必须赋予某种身份)
            进程启动时的身份是怎么来的?
                (1)默认为当前登录用户
                (2)在配置文件里修改指定进程启动的身份
    
        2、拿着进程的用户身份,去匹配目标文件的权限
            进程的用户身份会依次配文件的
                u---> 9段权限的前三段              
                g---> 9段权限的中三段                
                o---> 9段权限的后三段                        
       
    修改权限的命令:
    
        属主属组(用分隔属主和属组)
            chown egon.group1 1.txt    #属主属组都改
            chown egon 1.txt  # 改属主
            chown .group2 1.txt  # 改属组

            chgrp  组  文件名      # 只改组
                
            chown -R egon.group1 /a # 递归着修改,包括/a文件夹本身及其子子孙孙
            
        
        如何修改权限
            r---->4
            w---->2
            x---->1            
            # 用rwx去修改
                chmod u+x,g+wx,o-r 1.txt
                chmod u=rx,g=rx,o=r 1.txt
                
                chmod a=r 1.txt  #u g o 三个权限同时改
                chmod a=- 1.txt # 等同于chmod a=--- 1.txt

            # 用户数字代号修改
                # 1、u权限为rw,g权限为r,o的权限为rx                                
                chmod 645 1.txt
                       
            chmod -R 777 /a # 包含/a在内的子子孙孙 递归
            
            
                
        权限对于目录、普通文件的意义
            目录本身:
                r:可以浏览到目录下的子文件、子文件夹名----》ls 目录
                w:可以在该目录下创建、删除、移动子文件、子文件夹
                x:可以cd切换到该目录下
                
                
            文件内容:
                r:读取文件的内容------》例如:cat 文件.txt
                w: 可以更改文件的内容----》例如:echo 111 >> 1.txt 
                x: 可以执行文件内的的代码/指令,即把 文件当命令执行
                
                    命令分为两大类:
                        1、二进制的命令:/usr/bin/ls----》只需要拥有对它的x权限就可以执行
                        
                        2、脚本文件(内容是一对普通文本)----》需要对它拥有r+x权限

                               ### bash /tmp/a.sh  需要先把内容读取到内存中  r+x
                    
                
             ### eg :
            文件夹:/a/b/c/
                1、当前进程的用户身份要对沿途经过的所有文件夹都有一个权限x
                
                2、对c文件夹的
                    r--》浏览器里面的内容(子文件、子文件夹名)
                    w--》在该文件夹创建、删除、移动内容(子文件、子文件夹名) 
            
            文件:/a/b/c/1.txt
                1、当前进程的用户身份要对沿途经过的所有文件夹都有一个权限x
            
                2、对1.txt拥有
                    r---》读取1.txt内容
                    w---》写1.txt的内容                    
                    x---》可以执行1.txt里面的指令(如果是脚本文件还需搭配一个r权限)

###  使用vi编辑器时,没有对文件的写权限写入失败,但是如果对该文件所在的目录赋予一个写权限,vi编辑器便可以对该文件进行写入操作---->由于vi编辑器的底层逻辑  .a.txt.swap(详见编辑器vi)
            
            
            
    文件的特殊权限:
        suid
            1、给命令文件加的权限
                chmod u+s /usr/bin/passwd             chmod u-s /usr/bin/passwd

                效果:
                    passwd # ----》/etc/shadow
                    
                    加了suid权限的命令在启动时的进程用户身份会用自己的命令文件的属主身份

     # passwd命令自带suid权限
                    
                
                
        sgid
            1、可以给文件夹加
                chmod g+s /aaa # 后续在/aaa 文件夹下创建的文件、文件夹的属组都会继承自/aaa文件夹自己的属组
                
                
        
        sticky
            chmod o+t /share                 chmod o-t /share
                在/share文件下的文件只能被root用户及属主自己操作

                ###一般用于在共享文件夹下各个用户只能对自己的文件进行操作
                      
        特殊权限的数字代号
            suid===》4
            sgid----》2
            sticky----》1                                    
        chmod 0755 a.txt
        chmod 7755 a.txt
        chmod 4755 a.txt
                                        
            
    

umask值可以控制创建文件、文件夹时的默认权限
            
        在root用户下默认创建
            文件的权限:644
            文件夹的权限:755            
        
        为何默认是上述权限:
            系统默认权限
                文件的权限--》666
                文件夹的权限--》777
                 
            文件及文件夹的默认创建权限是:系统默认权限+umask值计算出来一个结果
                          
            创建文件夹的权限
                777 022 ---》755
                777 000 ---》777
                777 066 ---》711                                
            创建文件的权限              
                666 066 ---》600
                666 023 ---》644

# umask 022        修改默认权限

3、su切换用户(*****)

 
    按照进入shell环境方式的不同,分为两种:
        

        登录shell:登录账号密码,su - egon
        非登录shell:在shell环境中直接输入命令进入的shell环境,su egon
        

        二者的区别的就是使用时加载(依次加载)的配置文件不同:
        
            登录shell:
                /etc/profile
                /etc/profile.d/脚本
                ---------------------------》centos9.3会多执行1次/etc/bashrc
                ~/.bash_profile
                ~/.bashrc
            
                /etc/bashrc
            
            非登录shell:
                ~/.bashrc
                /etc/bashrc
                
                /etc/profile.d/脚本
                
        
        写入配置文件,登录用户shell)时自动执行:

        配置环境变量     
        PATH=$PATH:/usr/local/nginx/sbin
        export PATH        # 让shell的子子孙孙shell都运行所写配置,全局生效
        
        写入  /etc/profile 对登录shell生效 ;     写入 ~/.bashrc  对登录与非登录shell都生效


    切换用户过程中加载的配置文件

4、sudo(*****)

 
    让普通用户只用自己的账号密码进行认证,操作时可以临时获取管理的某种权限
    
    
    修改sudo配置文件的两种方式
        visudo # 专门编辑文件/etc/sudoers
        visudo -c # 检查文件语法
                        
        vi /etc/sudoers

 %wheel   对组的用户进行修改放权

命令路径需为绝对路径(完整路径)

别名(详解见shell基础需要大写 Alias

超过一行用" \ "换行          排除的命令写在最后 !/.../.../...

10   软件包管理

 

RPM

------>红帽系   

# cat  /etc/os-release     查看系统信息       uname -r  内核版本        uname -m  cpu架构

下载rpm包

# 方式三没有光驱,镜像在系统中直接进行挂载

rpm命令

rpm -qf   查询路径

下载rpm从而安装源(自动生成应用对应的repo文件)---->yum安装包(通过repo安装应用包)

安装完成后看一下时间问题

# 修改时区设置(以mysql为例):写入到配置文件/etc/my.cnf需要重启mysql实例:
[mysqld] 
。。。
default-time-zone=timezone
修改为
default-time-zone = '+8:00'

系统时区也要正确
date  # 看一下
timedatectl set-timezone 'Asia/Shanghai'  # 用这条命令设置

yum

###  一个yum源头,两个配置文件

 rpm安装需要一步一步安装依赖包,yum可以将软件包及其依赖包一次全部安装

配置文件

  /etc/yum.conf     #进行基础设置   是否缓存,缓存到哪等

  /etc/yum.repos.d/...  .repo    #yum源配置文件(可以存在多个)   告诉去哪里找rpm软件包

                                ### 本地yum源配置文件----yum源就在本地

vi my.repo

# baseurl  写到yum.repos.d中的repodata文件的父目录即可

                                    ### 网络yum源配置文件(http://ip/...)

从别的主机镜像中获取

或者直接从网络上下载获取

                  

yum 命令

enabled=0  关闭某个仓库 

yum repolist  (all)       查询(所有)仓库状态                 yum list   列出仓库中的软件包

yum grouplist
yum groupinstall "软件组的名字" -y
yum groupremove "软件组的名字" -y

yum install httpd -y       下载           
yum install httpd* -y 
yum remove httpd -y         卸载(只删除了一个软件包,其所安装的依赖还需一个一个进行删除)

yum reinstall http -y            重装


yum makecache # 只针对元数据做缓存
yum clean all # 清除所有缓存,包括元数据与缓存到本地的软件包

yum history                       # 查看执行过的yum命令历史记录
yum history info ID号             # 查看具体某一条yum命令的详细信息
yum history undo ID号             # 撤销执行过的历史命令--->将软件与所安装的依赖全部清理


yum install https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/samba-4.10.16-5.el7.x86_64.rpm
yum localinstall samba-4.10.16-5.el7.x86_64.rpm


yum provides 文件路径   # 等同于rpm -qf 文件路径


如何制作自己的yum源头
    1、先准备rpm包,扔到一个文件夹中/my_rpms
        rpm包的来源:
            1、镜像

               mkdir /my_rpms

               mount  /dev/sr0   /opt/

               cp /opt/Packages/.....        /my_rpms/          # 从镜像中拷贝所需要的rpm包
            2、网上的yum源
            3、使用yum命令把某个仓库里的包下载到本地(只下载不安装)
                yum install --downloadonly  --downloaddir=/my_rpms   httpd -y  

                                   #仅下载                      #指定文件夹            #下载什么
                
            4、开启keepcache=1    保留测试环境中的缓存,最后将所有缓存文件夹中的rpm包汇总到一个文件夹中,生成自己的yum源
            
    
    2、在上述文件夹/my_rpms下生成repodata目录(存放依赖性关系)
        yum install createrepo -y    #通过下载的工具生成
        
        createrepo /my_rpms
    
    
    3、安装软件,通过该软件把你的文件/my_rpms共享出去
        客户端与服务都关闭selinux与防火墙
            systemctl stop firewalld
            setenforce 0
            
        服务端安装
            yum install vsftpd -y
            
        把服务机器的yum仓库放到/var/ftp目录下
            ln -s /my_rpms /var/ftp/my_rpms
            或者用cp、mv都可以
              
    
使用者:
    配置一个repo文件,baseurl指向上面的yum源地址
    cat > my.repo << EOF
    [local]                                               # 基于本地
    name=local
    baseurl=file:///my_rpms
    enabled=1
    gpgcheck=0
    EOF
    
    
    cat > ftp.repo << EOF
    [local]                                                    # 网络获取,通过vsftp
    name=local
    baseurl=ftp://服务都ip地址/my_rpms
    enabled=1
    gpgcheck=0
    EOF
    
        

源码安装

      1、定制化更强,某些功能yum安装时无法增加进去,只能使用源码安装

      2、源码安装的应用无法调用system管理,需要自己配置

            vim /usr/lib/systemd/system/nginx.service    #编写配置文件进行system管理

      3、制作软连接:一般./configure指定的prefix目录都会具体到应用的版本,这样方便区分,但是在用的时候一般都会做软连接,这样既方便用也方便后续升级

             ln -s /usr/local/nginx1.12.2    /usr/local/nginx    #为了方便使用软连接取消版本号

      4、默认yum安装配置路径  /etc/nginx/               

           yum安装所有文件分别存储:

           /var/log/nginx   存放日志     /var/lib/   存放运行时产生的数据

           /usr/bin   可执行文件          /usr/lib    库文件

               

          默认源码安装配置路径  /usr/local/nginx/          源码安装所有文件都在一起

### 具体实例见nginx详解---nginx的源码安装/一篇读懂redis的部署

    yum install gcc gcc-c++ autoconf automake make -y ---->或者直接 yum groupinstall "Development tools" -y                   # 下载源码安装编译环境
    yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

        
    wget https://nginx.org/download/nginx-1.24.0.tar.gz
    tar xf nginx-1.24.0.tar.gz
    
    cd nginx-1.24.0
    # 1、定制安装信息
    ./configure --prefix=/usr/local/nginx_1.24.0  --with-http_stub_status_module --with-http_ssl_module --with-stream --with-http_gzip_static_module --with-http_sub_module

                                       #源码安装默认路径     --prefix指定路径     --with-... ...指定功能安装


    
    # 2、编译
    make -j 4 # 并发4个任务去编译  指定几线程并发编译,一般为cpu个数的两倍
    make -j    #最大并发执行编译,会增大负载
    
    # 3、安装
    make install

    cd /usr/local/nginx/

    ll sbin/      # 默认启动命令文件

    ./sbin/nginx   # 启动nginx

    

    # 使用
    ln -s /usr/local/nginx_1.24.0 /usr/local/nginx
    

后台更新,使用链接方式使更新版本变更不显示出来,统归为nginx
    
    
    # 补充连接多个命令组成一条大命令
    # 分号:左边命令运行完毕,无论成功与否,都会执行右边的命令
        make -j4;make install
    
    # && :左边命令运行成功之后,才能执行右边的命令
        make -j4 && make install

11   存储管理

1、硬盘分区

 

sd开头,sda代表第一块盘,sdb代表第二块,sda1代表第一块盘的第一个分区
sd中的d代表disk,s代表sata或sas接口

分区主要分为三类: 主分区<-   扩展分区<-   逻辑分区

 #1、逻辑分区属于扩展分区,扩展分区属于主分区
 #2、主分区又叫做引导分区,是可以安装系统的分区

分区工具 

                     fdisk 工具用于 MBR 格式
                     gdisk 工具用于 GPT 格式

    MBR 分区,MBR 的意思是 "主引导记录"。MBR 最大支持 2TB 容量,在容量方面存在着极大的瓶颈。并且只支持创建最多4个主分区,。而GPT分区方式就没有这些限制
    GPT 分区(ubuntu装系统默认就是GPT分区),GPT 意为 GUID 分区表,它支持的磁盘容量比 MBR 大得多。这是一个正逐渐取代 MBR 的新标准,它是由 UEFI 辅住而形成的,将来 UEFI 用于取代老旧的 BIOS,而 GPT 则取代老旧的 MBR。

2、MBR分区 

 lsblk /dev/sda                                              # 查看设备及其分区
 fdisk -l                                                           # 查看分区 查看磁盘分区及详细信息

 fdisk /dev/sdb

Command (m for help): m #输入m列出常用的命令
 
Command action
a toggle a bootable flag     #切换分区启动标记
 
b edit bsd disklabel     #编辑sdb磁盘标签
 
c toggle the dos compatibility flag     #切换dos兼容模式
 
d delete a partition     #删除分区
 
l list known partition types     #显示分区类型
 
m print this menu     #显示帮助菜单
 
n add a new partition     #新建分区
 

o create a new empty DOS partition table #创建新的空白分区表
 
p print the partition table     #显示分区表的信息
 
q quit without saving changes     #不保存退出
 
s create a new empty Sun disklabel     #创建新的Sun磁盘标签
 
t change a partitions system id         #修改分区ID,可以通过l查看id
u change display/entry units     #修改容量单位,磁柱或扇区
 
v verify the partition table     #检验分区表
 
w write table to disk and exit     #保存退出
 
x extra functionality (experts only)     #拓展功能

3、GPT分区 

 # 需要安装命令
 yum install gdisk -y 
 gdisk /dev/sdc
......
Command (? for help): m
b    back up GPT data to a file                            #将GPT数据备份到文件中
 
c    change a partition's name                            #更改分区的名称
 
d    delete a partition                                    #删除分区
 
i    show detailed information on a partition            #显示分区的详细信息
 
l    list known partition types                            #列出已知的分区类型
 
n    add a new partition                                    #添加一个新的分区
 
o    create a new empty GUID partition table (GPT)        #创建一个新的空GUID分区表(GPT)
p    print the partition table                            #打印分区表
 
q    quit without saving changes                            #没有保存更改就退出
 
r    recovery and transformation options (experts only)    #恢复和转换选项(仅限专家使用)
s    sort partitions                                        #年代分类分区
 
t    change a partition's type code                        #不要更改分区的类型代码
 
v    verify disk                                            #验证磁盘
 
w    write table to disk and exit                        #将表写入磁盘并退出
 
x    extra functionality (experts only)                    #额外功能(仅限专家使用)
?    print this menu                                        #打印菜单

4、格式化制作文件系统与挂载(df) 

磁盘必须格式化制作文件系统,然后挂载才能使用
针对一块硬盘/dev/sdb   可以不分区,直接格式化制作文件系统

 mkfs.xfs /dev/sdb                    # /dev/sdb整体就是一个分区

也可以基于mbr或者gpt分区方式分区完毕后,针对某一个分区比如/dev/sdb1制作文件系统

 mkfs.xfs /dev/sdb1

挂载

mount  /dev/sdb1  /opt/
 
卸载
umount /dev/sdb1 # 或者umount /opt
 
强制卸载
umount -l /dev/sdb1 # 或者umount -l /opt

mkfs.xfs -f /dev/sdb1      # 强制重新格式化,需要加-f

自动挂载

 两种方法:

方式一:将挂载命令写入文件/etc/rc.local(注意这是一个软连接,目标文件初始并没有x执行权限,需要加才行)
注意:centos7下/etc/rc.local文件里配置的开机启动项不执行的解决办法

 ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 7月  13 21:08 /etc/rc.local -> rc.d/rc.local
 ll /etc/rc.d/rc.local  # 没有执行权限,需要加上!!!!!!!!!!!!!!!!!!
-rw-r--r--. 1 root root 523 11月  6 15:03 /etc/rc.d/rc.local
 chmod +x /etc/rc.d/rc.local 

方式二:编辑 /etc/fstab

blkid  | grep sdb1         # 查看设备属性信息,特别是设备的 UUID(通用唯一识别码)、文件系统                                         类型等关键信息。

UUID:.......     /opt    xfs   defaults   0     0    

mount -a   #  全部挂载

df  -h    #查看挂载情况(详解见文件系统)

df  ----------------显示已挂载文件系统的磁盘使用情况

5、swap分区 (free)

free

 free -m       #  显示系统内存使用情况           

                    #  - m  以兆字节(MB)为单位显示内存大小。

  • total:表示物理内存或交换空间的总量。
  • used:表示已使用的内存或交换空间的量。
  • free:表示空闲的内存或交换空间的量。
  • shared:表示多个进程共享的内存量。
  • buff/cache:表示系统用于缓存文件系统数据的内存量,其中 buff 是块设备的读写缓冲区优化操作系统写操作),cache 是文件系统的页缓存优化操作系统读操作)。(操作系统借用的)
  • available:表示真正可用于新进程的内存量。(它考虑了缓存和缓冲区可以被回收的部分)
  • echo 3 > /proc/sys/vm/drop_caches    可用内存不够,清理buff/cache增加可用内存(慎用)  

free -s 2        #  指定每隔多少秒刷新一次内存使用信息,实现实时监控。例如,每隔 2 秒刷新一次

free -h           #  以人类可读的格式显示内存大小,使用 K(千字节)、M(兆字节)、G(吉字节)                            等单位

(在buff中多等待几次操作一并写入硬盘)

制作swap

 fdisk /dev/sdb  # 分出一个1G的硬盘空间
 mkswap /dev/sdb1  # 格式化为swap

free  -m
                    total        used        free      shared  buff/cache   available
Mem:           1980         185      1568           9         225        1601
Swap:          1023           0        1023
 swapon /dev/sdb1     # 激活 
free  -m
                   total          used       free      shared  buff/cache   available
Mem:           1980         186       1567           9         225        1600
Swap:          2047           0          2047
swapon -s    #  查看

swapoff  /dev/sdb1    # 关闭

如果磁盘没有过多的分区可用,也可以通过文件增加SWAP空间,本质上还是磁盘

df -h   # 查找空闲量大的分区的挂载点

 dd if=/dev/zero of=/swap_file bs=1M count=200     # 选择挂载点为 / 的分区创建swap文件
 chmod 0600 /swap_file 
 free -m
                    total        used        free      shared  buff/cache   available
Mem:           1980         185        1364           9         430        1598
Swap:             0           0           0
 mkswap -f /swap_file 
swapon /swap_file
 free  -m
                    total        used        free      shared  buff/cache   available
Mem:           1980         222        1300           9         458        1550
Swap:           199           0         199
 

6、xfs文件系统备份与恢复

 rpm -qf `which xfsdump`
xfsdump-3.1.7-1.el7.x86_64
 rpm -qf `which xfsrestore`
xfsdump-3.1.7-1.el7.x86_64

yum install xfsrestore -y

全量备份:  指的是对指定范围内的所有数据进行完整备份,涵盖了系统中的全部文件、文件夹、数                    据库记录等。

增量备份:  仅备份自上次备份(可以是全量备份或增量备份)以来发生变化的数据

            eg: 透过文件系统的UUID来分辨备份档,因此不能备份相同UUID的文件系统(例如lvm镜像)

# 1、数据备份    0--->全量备份    1---->增量备份
# 1.1 先做全量备份,切记“备份的源路径”末尾不要加左斜杠 /
注意:
(1)-L与-M后的你起的名字保持一致就行,也方便你记忆
(2)备份的源路径写/dev/sda1这种文件系统名字是通用写法,虽然在centos7.9中写挂载点路径虽然也可以,但是还是推荐用通用的靠谱一些
xfsdump -l 0 -L sdb3_bak -M sdb3_bak -f 全量备份的成果路径1 备份的源路径 
 
# 1.2 再做增量备份
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f 增量备份的成果路径2 备份的源路径 
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f 增量备份的成果路径3 备份的源路径 
xfsdump -l 1 -L sdb3_bak -M sdb3_bak -f 增量备份的成果路径4 备份的源路径 
 
# 2、数据恢复
# 2.1、先恢复全量备份
xfsrestore -f 全量备份的成果路径1 数据恢复的路径
# 2.2、再依次恢复增量
xfsrestore -f 增量备份的成果路径2 数据恢复的路径
xfsrestore -f 增量备份的成果路径2 数据恢复的路径
xfsrestore -f 增量备份的成果路径2 数据恢复的路径

7、lvm (逻辑分区----动态扩容)

     逻辑卷管理LVM是硬盘的一个系统工具。传统分区使用固定大小分区,重新调整大小十分麻烦。但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑卷的扩大缩小,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。

物理卷(PV):(physical volume),把常规的磁盘设备通过pvcreate命令对其进行初始化,形成了物理卷。其实就是硬盘或分区。(面粉)
 
卷组(VG):(volume group),把多个物理卷组成一个逻辑的整体,这样卷组的大小就是多个硬盘之和。或者理解就是由一个或多个PV组成的整体。(面团)
 
逻辑卷(LV):(logical volume),从卷组中划分需要的空间大小出来。用户仅需对其格式化然后即可挂载使用。从VG中切割出的空间用于创建文件系统。(切成馒头)
 
基本单元(PE):(physical extend),分配的逻辑大小的最小单元,默认为4MB的基本块。(假设分配100MB逻辑空间,则需要创建25个PE)

# 优点:
# 1、可以在系统运行的状态下动态的扩展文件系统的大小。
 
# 2、文件系统可以跨多个磁盘,因此文件系统大小不会受物理磁盘的限制
# 3、可以增加新的磁盘到LVM的存储池中。
# 4、可以以镜像的方式冗余重要的数据到多个物理磁盘。
# 5、可以方便的导出整个卷组到另外一台机器。
 
# 缺点:
# 1、因为加入了额外的操作,存取性能受到影响
# 2、当卷组中的一个磁盘损坏时,整个卷组都会受到影响
解释:LVM如果有一个磁盘损坏,整个lvm都坏了,lvm只有动态扩展作用,
方案:底层用RAID(详见计组详解) + 上层LVM = 既有冗余又有动态扩展
 
# 2、在从卷组中移除一个磁盘的时候必须使用reducevg命令(该命令要求root权限,并且不允许在快照卷组中使用)

 

(lv的快照与lv需在同一个vg中)

yum install -y lvm2

 制作pv
 pvcreate /dev/sdb1  # 对分区做
 pvcreate /dev/sdb2  # 对分区做
 pvcreate /dev/sdb3  # 对分区做
 pvcreate /dev/sdc   # 对整块盘做
 pvs                         # 查看
 pvscan                   # 查看

制作vg----将pv划入vg

# 制作一个vg1:
 vgcreate vg1 /dev/sdb1 /dev/sdc  # 包含/dev/sdb1与/dev/sdc两个pv
 vgs
# 也可以再制作一个vg2:
 vgcreate vg2 /dev/sdb2 /dev/sdb3  # 包含/dev/sdb2与/dev/sdb3两个pv
 vgs
 

创建逻辑卷lvm
                    -L    #逻辑卷大小
                     -n    #逻辑卷名字
# 从vg1中分出来逻辑卷lv1_from_vg1、lv2_from_vg1
 lvcreate -L 100M -n lv1_from_vg1 vg1
 lvcreate -L 200M -n lv2_from_vg1 vg1 
# 从vg2中分出来一个建逻辑卷lv1_from_vg2、lv1_from_vg2
 lvcreate -L 300M -n lv1_from_vg2 vg2
 lvcreate -L 400M -n lv2_from_vg2 vg2
 
 lvs        #  查看
 
# 把vg的100%空间都给lv
lvcreate -l 100%VG -n lv的名字 vg的名字

格式化并挂载

mkfs.xfs /dev/vg1/lv1_from_vg1 
mkfs.xfs /dev/vg1/lv2_from_vg1 
mkfs.xfs /dev/vg2/lv1_from_vg2 
mkfs.xfs /dev/vg2/lv2_from_vg2  
mount /dev/vg1/lv1_from_vg1 /test1/
mount /dev/vg1/lv2_from_vg1 /test2/
mount /dev/vg2/lv1_from_vg2 /test3/
mount /dev/vg2/lv2_from_vg2 /test4/ 
df               # 查看

扩容

# 1、新增一块盘或者一个分区
fdisk /dev/sdb ......
partprobe
ls /dev/sdb4
 
# 2、新增一个pv
pvcreate /dev/sdb4
 
# 3、把新增的pv扩到vg2里
vgextend vg2 /dev/sdb4
vgs  # 可以看到vg2扩容了
 
# 4、接下来对lv1_from_vg2扩容
lvextend -L +1000M /dev/vg2/lv1_from_vg2 
xfs_growfs /dev/vg2/lv1_from_vg2  # 扩展逻辑卷后需要更新fs文件系统

删除(仅在未开始使用时可执行删除操作)

 # 删除lv之前需要先卸载挂载点
umount /test3
lvremove /dev/vg2/lv1_from_vg2 
 
# 删vg
vgremove vg2
 
# 删pv:只能删掉那些不属于任何vg的pv
pvremove /dev/sdb2
pvremove /dev/sdb3


 

lvm快照

快照的本质就是一个特殊的lv,创建快照后,如果源数据卷中的某部分文件被更新了,会将这部分的老数据赋给快照的空间,这就要求快照的空间一般与原lv大小相同,如果原lv数据全部被修改,则快照将记录原lv的全部原数据

 
# 1、查看vg1容量是否充足
lv1_from_vg1 属于卷组vg1,而vg1有足够的容量来分配给快照卷
vgs
# 2、在vg1卷组里创建一个lv1_from_vg1的逻辑卷
lvcreate -L 1G -s -n lv1_from_vg1_snap /dev/vg1/lv1_from_vg1
lvs          # 查看                                  
 
# 3、修改文件/test/1.txt          ----lv1_from_vg1中已存在文件1.txt  
[root@egon ~]# echo "123456" >> /test1/1.txt 
 
# 4、恢复数据
挂载快照,注意:快照在挂载的时候由于和原来的lvm是同一个UUID,而XFS是不允许相同UUID的文件系统挂载,所以需要加选项 -o nouuid
mount -o nouuid /dev/vg1/lv1_from_vg1_snap /opt/
cp /opt/1.txt /test1/1.txt 
cp:是否覆盖"/test1/1.txt"? y


以上为单个文件的恢复,如果要恢复的文件过多,直接进行合并更为方便
先卸载数据源与快照,再进行合并,快照会自动删除,一次性的 
umount /test1
umount /opt
lvconvert --mergesnapshot /dev/vg1/lv1_from_vg1_snap 
mount /dev/vg1/lv1_from_vg1 /test1/
cat /test1/1.txt  # 数据还原回来了
 

12   进程管理(******)

补充:

proc----是一个虚拟文件系统,它并不占用实际的磁盘空间,而是在内存中动态生成。它允许用户空间的程序通过读取和写入proc目录下的文件来与内核进行交互,获取系统的各种信息

/proc/cpuinfo 查询系统内存

/proc/meminfo 查询系统CPU

/proc/self 指向当前正在运行的进程自身

/proc/sys/... 在不重启的情况下调整内核参数

储备知识:

       

多道技术(详见操作系统)

进程三大类状态及切换

进程在运行中不断的改变运行状态,主要可以分为三大状态
1)就绪状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
2)执行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态
3) 阻塞(Blocked)状态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
 
就绪–>执行
处在就绪状态的进程,当调度器为其分配了处理机后,就变成了执行状态。
 
执行–>就绪
执行状态的进程在其执行过程中,时间片跑完了不得不让出处理机,于是从执行变成就绪状态。
 
执行–>阻塞
正在执行的进程等待某种事件而无法继续执行时,便从执行状态变成阻塞状态。
 
阻塞–>就绪
处在阻塞状态的进程,如果等待的时间发生,则从阻塞状态转变成就绪状态。
        

同步与异步:任务的启动/调用方式
            同步:
                多个任务是同步执行的指的是启动一个任务之后,必须在原地等待该任务运行完毕之后,才能启动下一个任务并且运行
                
            异步:
                提交完一个任务之后,不用在原地等待该任务运行完毕
                就能立即提交下一个任务执行
                                        
                    补充&符号:
                          &作用:在bash命令后加&符号,可以把该命令放到后台运行
        
        
并发/并行 串行:指的是任务给人展现出的运行的效果
            并发/并行:多个任务是”同时“运行的(调用异步展现的是并发)----管道符 | 解除物理隔离使多个命令程序“同时”运行
            
            串行:一个任务运行完毕,才能运行下一个(调用同步展现的是串行)
        
        
阻塞与非阻塞:任务在操作系统中的运行状态

            会引起阻塞的事项:
                1、硬盘io(读写)
                2、网络io
                3、sleep命令  # 休息等待                
                4、read命令   # 等待用户输入

  

 一、进程的结构:树形结构


        0号:整个系统的祖宗进程
        
        0号进程会产生两个进程1号和2号
        
            1号:是所有用户态进程的祖宗
            2号:是所有内核台进程的祖宗

 父子进程:

         一个应用程序可能会启动多个进程,说具体点,应用程序是发送请求给操作系统来创建进程,因为进程是操作系统管理的逻辑概念
   父进程:程序运行时产生的第一个进程
   子进程:由父进程发起系统调用fork0),让操作系统创建出一个子进程    

          
    二、进程的状态

     
        分为两大类:
        
            活着的
                1、运行着的-------》R
                        正在执行:手里拿着cpu正在运行
                        就绪(随时可以投入运行):正在等待操作系统分配cpu,一旦分配到,就可以立即投入运行
                
                2、阻塞的----》S或D
                    S:可中断的睡眠    

                1、硬盘io(读写)
                2、网络io
                3、sleep命令  # 休息等待                
                4、read命令   # 等待用户输入
                        可以用例如ctrl+c, kill -9 pid号命令来终止
                    
                    D: 不可中断睡眠(因为存储设备太忙了响应不过来了,例如读写操作)
                        不可以被中止(linux系统为了防止数据丢失的一种保护机制
            
            
            死了的
                1、僵尸进程-----》Z-----zombie
                    僵尸进程是操作系统的一种优化机制
                        一个进程死掉之后,会把其占用的cpu、内存资源都释放掉,但是会保留该进程的                           状态信息,例如pid号、存在过的一些运行信息
                        这些保留下来的信息都是操作系统给父进程准备的(让父进程看的)
    
                    每个进程死掉之前都会进入僵尸进程的状态                    
                    僵尸进程通常由父进程来回收,一般看不到,如果大量僵尸进程未被正常回收占用pid号,杀死其父进程交由1号进程进行回收

                     ## 孤儿进程   子进程还在运行的时候父进程死了,称之为孤儿进程,父进程自动转                                                换为1号进程
                    
                2、退出的进程---》X几乎看不到
                
        
        补充
            +号:前台运行的进程
            s:表示该进程是会话(session)的领导/领导进程,用来接收用户请求,然后自己不干给儿子进程去干            
            l:当前进程是多线程模式  (详解见06 操作系统补充)             
            <: 高优先级的进程                        
            T:暂停

            N: 低优先级 (nice)

###  进程的暂停与恢复

# 1、准备一个程序:a.sh
#!/bin/bash 
for i in `seq 1 1000000`;
do
    sleep 1
    echo $i >> /tmp/run.log
done 
# 2、运行程序a.sh,启动一个进程
sh a.sh & 
# 3、查看日志
tail -f /tmp/run.log 
# 4、打开另外一个终端测试暂停与恢复,观察你的run.log有何反应
ps aux | grep a.sh
kill -SIGSTOP pid号
kill -SIGCONT pid号

三、查看进程  ps aux    

-a         #显示一个终端的所有进程 
-u        #选择有效的用户id或者是用户名
-x         #显示没有控制终端的进程,同时显示各个命令的具体路径。

ps aux |head -5

USER:    运行进程的用户
 
PID:    进程ID   (ppid  父进程ID)
 
%CPU:    CPU占用率
 
%MEM:    内存占用率,指的是实际内存RSS占用率
 
VSZ:    占用虚拟内存,单位:KB(killo Bytes)
         VSZ是指已分配的线性空间大小,这个大小通常并不等于程序实际用到的内存大小,产生这个的可能性很多 
         比如内存映射,共享的动态库,或者向系统申请了更多的堆,都会扩展线性空间大小。
 
RSS:    占用实际内存,单位:KB(killo Bytes)
        RSZ是Resident Set Size,常驻内存大小,即进程实际占用的物理内存大小
 
TTY:    进程运行的终端    
START:    进程的启动时间
TIME:    进程占用CPU的总时间
COMMAND: 进程文件,进程名
          带[]号的代表内核态进程
          不带[]号的代表用户态进程
补充Centos9中还有一个大写字母I的进程状态
大写字母"I"代表的进程状态是"Idle kernel thread",这意味着该进程是一个空闲的内核线程,不是用户模式下的空闲进程。这个状态通常只应用于内核线程,用户进程通常不会有这个状态。

补充:

VSZ虚拟内存RSS物理内存

1、什么是MMU(内存是超配的)
在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。
为了解决此类问题,现代CPU引入了MMU(Memory Management Unit 内存管理单元)。
MMU 的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由MU负责将虚址映射为物理地址。
MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。

2、什么是内存分页
内存分页(Paging)是在使用MMU的基础上,提出的一种内存管理机制。
将虚拟地址和物理地址按固定大小(4K)分割成页(page)和页帧(page frame),并保证页与页帧的大小相同。
这种机制,从数据结构上,保证了访问内存的高效,并使os能支持非连续性的内存分配。

3、什么是页表
在上文中提到,虚拟地址与物理地址需要通过映射,才能使CPU正常工作。而映射就需要存储映射表。在现代CPU架构中,映射关系通常被存储在物理内存上一个被称之为页表(page table)的地方。如下图: 

4、进一步优化,引入TLB(Translation lookaside buffer,页表寄存器缓冲)由上一节可知,页表是被存储在内存中的。我们知道CPU通过总线访问内存,肯定慢于直接访问寄存器的。为了进一步优化性能,现代CPU架构引入了TLB,用来缓存一部分经常访问的页表内容。
如下图:

       这种overcommit的内存申请模式的好处是,可以有效提高系统内存的利用率,但坏处就是在所有进程都试图真的用完申请的内存空间时,物理内存可能会发生不够用,系统为了保命,只能杀掉一些进程,这就是OOM。

      系统级OOM ------系统总是在物理内存不够时,才进行swap交换,swap分区本质就是拓展出的内存。swap大小是有上限的,一旦swap使用完,操作系统会触发00M-Killer机制,选取某个进程ki11掉以释放内存。                              

四、top命令结果解析

查看进程树

rpm -qf `which pstree`
psmisc-22.20-16.el7.x86_64
pstree
pstree 104239
bash───bash───bash───bash───pstree 

查看ppid--父进程标识符

ps -elf | head -10
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 11月01 ?      00:00:07 /usr/lib/systemd/systemd --system --deserialize 20
root          2      0  0 11月01 ?      00:00:00 [kthreadd]
root          4      2  0 11月01 ?      00:00:00 [kworker/0:0H]
root          6      2  0 11月01 ?      00:00:06 [ksoftirqd/0]
root          7      2  0 11月01 ?      00:00:00 [migration/0]
root          8      2  0 11月01 ?      00:00:00 [rcu_bh]
root          9      2  0 11月01 ?      00:00:03 [rcu_sched]
root         10      2  0 11月01 ?      00:00:00 [lru-add-drain]
root         11      2  0 11月01 ?      00:00:01 [watchdog/0] 

top 命令

top
top -d 1  # 1秒刷新一次
top -d 1 -p 进程的pid

top -d 1 -p `pgrep nginx | head -1`
top -d 1 -p `pgrep sshd | head -1`,33  # 查看sshd以及pid为33的进程
top -d 1 -u nginx  # 查看指定用户进程
top -b -n 2 > top.txt  # 将2次top信息写入到文件

vmstat  1  2     #每一秒查看一次共执行两次

uptime   #查看系统运行时间和负载情况的命令行工具(输出第一行信息)

tail -f    # 会先显示指定文件末尾的内容,接着持续监听该文件

### 上半部分为cpu总利用率    下半部分为单个进程对单个cpu的利用率


        load average 平均负载(负载指的是几个活跃的活要干):在一段时间内,处于R状态的进程数+不可中断D睡眠的进程数

            为何不可中断睡眠也属于活跃的进程

             一个进程内要做的事可以分为两大类 1、计算任务---》cpu负责运行

                                                                        2、io任务-----》磁盘、网卡负责处理
        
            平均负载是用来要衡量系统的繁忙程度(流畅程度
                        
            4个cpu为前提:
                平均负载为3,代有个3个活跃进程,---》低负载
                平均负载为4,代有个4个活跃进程,---》满负载
                平均负载>4,                    ---》超负载
                                               
        cpu的利用率:反应的是cpu的使用情况

          eg : 有可能出现工作量很大但是利用率很低的情况----不可中断D进程数量异常

===>平均负载的三个数值我们该关注哪一个?个值相当于三个样本,我们应该统筹地看
如果1分钟,5分钟,15分钟的负载数值都相差不大,代表系统的负载从过去到现在都近乎一样

如果1分钟的值,远小于15分钟的值,那么证明系统的平均负载逐渐降低,即我们的系统刚刚经历过大风浪,但目前已逐渐趋于平均。

至于15分钟区间内,系统负载上升的原因,还需要我们认真查明3、如果15分钟的值,远小于1分钟的值,那么证明系统的平均负载逐渐升高,有可能是临时的也有可能持续上升,需要观察

一旦1分钟的平均负载接近或超过了CPU的个数,就意味着,系统正在发生过载的问题,这时候就得分析问题了, 并且要想办法优化。

第二部分

us User,用户态进程占用cpu时间的百分比,不包括低优先级进程的用户态时间(值1-19)
sys System,内核态进程占用cpu时间的百分比
ni Nice,nice值为1-19的进程,用户态占cpu时间的百分比
id ,系统空闲cpu的百分比
wa ,系统等待I/O的cpu时间占比,该时间不计入进程的CPU时间
hi ,处理硬件中断所占用CPU的时间,该时间同样不计入进程的CPU时间
si ,处理软件中断的时间,该时间不计入进程的CPU时间
st ,表示同一宿主机上的其他虚拟机抢走的CPU时间
 
nice 是 Linux 和 Unix 系统中的一个命令,它可以用来调整进程的优先级。
nice 值的范围在 -20 到 19,其中 -20 表示最高优先级,而 19 表示最低优先级。默认情况下,新创建的进程 nice 值是 0。
所以我们以0这个nice值为分水岭,1-19都属于比普通进程优先级要低的进程,这类低优先级的进程对cpu的使用率会计入top统计的ni状态中,-20~-1都属于比较高优先级的,会计入top统计的us状态中
 

第三部分        ==  free -h      内存状态显示

 

五、特殊进程

僵尸进程  孤儿进程  (详见进程状态)

守护进程 

 守护进程(Daemon process)是在Unix和类Unix(如Linux)操作系统中,一种在后台运行的特殊进程。这类进程通常并不通过交互式终端控制,而是在系统启动后自动运行,进行一些系统管理任务。
以下几点是守护进程的一些主要特征:
1、守护进程在后台运行,通常不需要与用户交互。
2、守护进程通常长时间运行,直到系统关闭。
3、守护进程没有控制终端,也不拥有标准输入设备,标准输出设备或标准错误设备
守护进程与普通进程的区别主要体现在:
1、生命周期:普通进程通常由用户启动,任务完成后结束;而守护进程在系统启动后自动运行,直到系统关闭

2、控制:普通进程通常有控制终端,可以直接与用户交互;而守护进程没有控制终端,通常通过系统日志、配置文件等方式进行管理和配置。

六、管理进程

优先级 

 PR-》内核态使用的值(nice+20)                NI-》用户态使用的值(nice)(-20到+19)

### 值越小优先级越高

nice -n -20  pid号       # 对新起的进程修改优先级为-20

renice -n -10  pid号        # 对已经运行的进程设置优先级为-10

给进程发信号 

 kill  -l    # 查看信号种类

kill -9 pid号   ==  kill -kill  pid号  ==  kill -SIGKILL  pid号

#KILL(9):杀死进程,不可以被捕获、忽略和阻塞,如果管理员发现某个进程终止不了,可尝试发送这个信号。(强制杀死)
#TERM(15):杀死进程,可以被捕获、忽略和阻塞,通常用TERM信号来要求程序自己正常退出,如果进程终止不了(被定制化捕获忽略),我们才会尝试SIGKILL。

#INT(2): 中断,通常因为按下ctr1+c而产生的信号,用于通知前台进程组终止进程。

#QUIT(3):退出,和SIGINT类似,但由QUIT字符(通常是ctr1-\)来控制。进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。
#CONT(18)被暂停的进程将继续恢复运行

#SIGSTOP(19)暂停进程,该信号不能被捕获、忽略和阻塞

#TSTP(28):也是暂停进程,也可以用键盘按下ctr1+z产生该信号。与SIGSTOP不同的是,该信号可以被捕获、忽略和阻塞

#SIGCHLD(17):使父进程回收处理子进程

pkill -9 进程名        # 杀死所有进程名带sleep的进程

pgrep -l -u 用户名      # 查看某个用户的进程       

管理后台进程 

后台进程(自己加 & 定义的)---->前台 

jobs            # 查询编号

fg %编号       #放于前台

前台进程---->后台

crtl+z    # 停止

jobs      #查看编号

bg %编号    #放于后台

HUP信号

1、终端关闭时,系统会向与该终端相连的所有进程发送HUP信号,这会导致这些进程被关闭(所以才有了终端关闭时,系统会向与该终端相连的所有进程发送SIGHU脱离终端运行的需求)

2、用kill命令给进程发送SIGHUP信号实现该进程的平滑重启
需要注意的是,并非所有的进程或应用都能处理SIGHUP信号,只有程序内写过专门的捕获并处理该信号的代码才行
      nginx的源代码里就写了,并且会响应该信号来实现平滑重启------在不中断服务的情况下对正在运行的程序或服务进行重启的手段,让新的进程逐步接管旧进程的工作

kill -1 nginx         ## nginx的平滑重启

进程脱离终端运行 

## nohup  指令            

## setsid   指令

## (指令 & )

七、查看网络状态(netstat)

yum install net-tools  -y  

netstat  -tnlp          # 查看正在监听的,且使用tcp协议的进程
-t           # tcp协议
-u         # udp协议
-l           # listen
-p          #  PID/Program name
-n         # 不反解,不将IP地址解析为主机名,不将端口号解析成协议名(80---> http) 

- a        #  所有

netstate  -an | grep 80    # 监听80端口

lsof -i:80       # 展示80的所有进程

### 高并发状态下,一般服务端主动先断开链接(尽快对下一个请求进行服务),并出现大量time_wait状态

补充:

watch指令用于周期性地执行给定的命令,并将输出结果显示在终端上。它可以实时监控命令的输出变化,非常适合用于观察系统状态、日志文件或其他动态变化的信息。

例如,watch -n 5 netstat -an表示每 5 秒执行一次netstat -an命令,以便实时查看网络连接状态的变化。

服务端:

local address :   0.0.0.0  对所有客户端放开,能ping通服务端就能访问

                         192.168.71.10        只有192.168.71. 0/24段的ip能访问通(同局域网)

foreign address:  外部访问的ip

高并发下的服务器状态分析---->*****

(详见网络进阶)

监听并查看访问服务的pid从而查询该服务具体信息,访问服务器,服务器上服务的进程进行运行从而产生数据,数据进入内存(消耗内存空间),进程从S状态转变为R状态消耗CPU利用率,打开读取硬盘上的文件(占用文件描述符)返回给浏览器(/usr/share/nginx/html/),进程在本机上运行也会占用服务器的资源,所以访问量增大,服务器性能会逐渐降低。

八、proc文件系统 

系统所有进程的运行状态都在/proc下

打开进程的文件描述符

ll  /proc/pid号/fd

cpu: /proc/cpuinfo/

- processor        # 逻辑cpu     核数*线程数

- physical id       # 物理cpu 

内存:/proc/meminfo

proc 包含各种系统信息

九、进程间的通信 管道 | 

进程彼此的内存空间是隔离的,通过管道符 | 进行通信 ,通过内核中的管道缓冲区(共享空间)实现了进程间的数据传递

eg : 

打印当前所有ip

统计网站访问情况

| tee test.txt        # 将内容打印并写入指定文件

| tee -a test.txt     # -a 表示追加 

xargs          # 让不支持管道的命令支持管道技术

13   网络管理 

网络问题排查

 浏览器查询本地dns-->本地hosts文件记录 /网卡配置的dns地址---->(访问别的网站验证dns是否正常)---->客户端ping对方ip是否能通(网络链路是否有问题)---->服务端的端口是否正常---->客户端telnet ip+端口192.168.71.10 80 ----->ping 能通但是ip + 端口不通有可能是防火墙的问题---->通了后在服务端找端口相对应值看看是哪个程序在监听--->查到pid号,将请求交给该服务--->主进程接受交给子进程进行处理---->子进程层层拆包找到具体访问路径在(/usrr/share/nginx/html/.....路径中寻找1对应文件,获取后原路返回---->如果没有找到对应文件 404not found) 

防止恶意ping包造成压力,将配置文件0—->1

 # 查看当前系统所连接的所有以太网卡
 lspci |grep -i ethernet

ifconfig

 
1、ifconfig -a 查看所有网卡信息(包括未激活的网卡)
2、ifconfig eth0 查看单个网卡信息
3、ifconfig eth0 192.168.1.122 netmask 255.255.255.0 临时设定IP和掩码(重启服务或者系统都失效)
4、ifconfig eth0 192.168.1.122/24 
 
5、ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0 配置子接口
# 删除:下述两种方式都可以
ifconfig eth0:0 down
ifconfig eth0:1 del 192.168.0.2  # 删除,不必加掩码
 
6、开启与关闭
ifconfig eth0 down|up  # 不加载网卡配置文件
ifdown eth0 |ifup eth0  # 加载网卡配置文件-centos7.9带
 
7、设置网卡最大传输单元
ifconfig eth0 mtu 1500
 [root@egon ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         # 从flags可知该接口已启用,支持广播、组播,MTU:1500(最大传输单元):1500字节
         # 其他了解知识:
         // UP:表示“接口已启用”。
         // BROADCAST :表示“主机支持广播”。
         // RUNNING:表示“接口在工作中”。
         // MULTICAST:表示“主机支持多播”。
         // 可以了解一下繁杂模式:https://www.cnblogs.com/linhaifeng/articles/13949611.html
 
        inet 192.168.12.42  netmask 255.255.255.0  broadcast 192.168.12.255
        # IPv4地址           子网掩码               广播地址
 
        inet6 fe80::499e:c2c1:f5ed:3900  prefixlen 64  scopeid 0x20<link>
        # IPv6地址                        掩码长度       作用域,link表示仅该接口有效
 
        ether 00:0c:29:86:f8:59  txqueuelen 1000  (Ethernet)
        #网卡接口的MAC地址         传输队列长度       接口类型为Ethernet
 
        RX packets 5708  bytes 1061424 (1.0 MiB)
        # 表示开机后此接口累积接收的报文个数,总字节数
 
        RX errors 0  dropped 833  overruns 0  frame 0
        # 表示开机后此接口累积接收报文错误数,丢弃数,溢出数(由于速度过快而丢失的数据包数),冲突的帧数
 
        TX packets 102  bytes 16768 (16.3 KiB)
        # 表示开机后此接口累积发送的报文个数,总字节数
 
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        # 表示开机后此接口累积发送报文错误数,丢弃数,溢出数(由于速度过快而丢失的数据包数),
        # carrier 载荷数(发生carrier错误而丢失的数据包数)
        # collisions 冲突数

了解

 # 1、储备知识1: linux软硬件中断
中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的终端处理程序来影响设备的请求。中断是一个异步的事件处理机制,可以提高操作系统处理并发的能力。

# 2、储备知识2:全双工与半双工,目前网卡一般都应该采用全双工模式

是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。
 

 
# 3、储备知识3:CRC   
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性
 
 
 
# 4、储备知识4:网卡工作流程
网卡发包:
    1、ip包+14个字节的mac头变成数据帧frame
    2、frame拷贝到网卡芯片内部的缓冲区,由网卡处理
    3、网卡芯片为frame添加头部同步信息和CRC校验,此时才是真正可以发送的packet,然后发送该packet
网卡收包:
    1、网络包packet到达网卡,网卡先检查包packet的CRC校验,保证其完整性和正确性,然后去掉它的头得到frame
    2、网卡将frame拷贝到网卡内部的FIFO缓冲区
    3、网卡驱动程序产生硬件中断,把frame从网卡拷贝到内存中,接下来就交给内核处理


 
网卡丢包

 
    内核通常需要快速的拷贝网络数据包到系统内存
    因为网卡上接收网络数据包的缓存大小固定,而且相比系统内存也要小得多。
    所以上述拷贝动作一旦被延迟,必然造成网卡FIFO缓存溢出 - 进入的数据包占满了网卡的缓存,后续的包只能被丢弃,这也应该就是ifconfig里的overrun的来源。
 

# 丢包排查
网卡工作在数据链路层,数据量链路层,会做一些校验,封装成帧。我们可以查看校验是否出错,确定传输是否存在问题。然后从软件层面,是否因为缓冲区太小丢包。
 
# 1 先查看硬件情况

# 1.1 查看工作模式是否正常
 ethtool ens33 | egrep 'Speed|Duplex'
    Speed: 1000Mb/s
    Duplex: Full # 全双工
 
# 1.2 查看CRC校验是否正常     
[root@egon ~]# ethtool -S ens33 | grep crc         # crc错误值大通常是因为服务器外部的网络环境有问题导致的
     rx_crc_errors: 0
 
 
# 2 通过 ifconfig 可以看到 overruns 是否一直增大,如果查看结果是一直增大
for i in `seq 1 100`; do ifconfig ens33 | grep RX | grep overruns; sleep 1; done
 
# 3 调整网卡缓冲区

centos7.9

nmcli connection reload          nmcli connection up ...    #对单一的网卡进行重载与激活

systemctl restart NetworkManager                                 # 重启所有网络服务,影响其他业务


# 打开网卡配置文件,完成静态ip配置,修改完毕后重启网络服务即可:systemctl restart network
DEVICE=eth0         <-- 网卡名字
BOOTPROTO=static       <---- dhcp 动态获取IP
                      <---- none 根据其他选项决定动态还是静态
                      <---- static肯定是手工指定IP
NM_CONTROLLED=no          <---如果NetworkManager服务启用,该网卡配置文件也不受该服务管理
ONBOOT=yes          <---- 网络服务启动的时候,yes代表激活状态 , no 代表禁用
TYPE=Ethernet
IPADDR=10.1.1.11        <-- IP 地址
NETMASK=255.255.255.0     <-- 子网掩码
GATEWAY=10.1.1.1          <-- 默认网关
DNS1=10.1.1.1             <-- DNS1 服务器
DNS2=8.8.8.8              <-- DNS2 服务器
HWADDR=14:da:e9:eb:a9:61  <---MAC地址
USERCTL=no           <---是否允许普通用户启动或者停止该网卡
IPV6INIT=no          <---是否在该网卡上启动IPV6的功能
PEERDNS=yes          <---是否允许网卡在启动时向DHCP服务器查询DNS信息,
                      # 设置为yes时,此文件设置的DNS将覆盖/etc/resolv.conf,
                      # 若开启了DHCP,则默认为yes,所以dhcp的dns也会覆盖/etc/resolv.conf

centos9 

nmcli device show 

nmcli connection up/down ....

nmcli connection 

systemctl   restart / status   NetworkManager

hostnamectl set-hostname ...
hostname
grep '^ftp\|^ssh' /etc/services           #端口与服务的对应关系

Linux 处理数据包过程
 

 

用户态-----------内核态
 

临时:

# 方式1:
echo 1 > /proc/sys/net/ipv4/ip_forward 
# 方式2:
sysctl -w net.ipv4.ip_forward=1

永久:
#在CentOS 7中:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf

查看:

sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
sysctl -a | grep ip_forward

只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发

 

网关/路由

 主机路由:掩码32位,destination到精确到某一台主机  ==静态路由

网络路由: 掩码小于32位,destination精确到某一网段主机

默认路由: 掩码通常为0

路由优先级:

大前提:
主机范围越小、越精确、优先级越高,而缩小主机范围的恰恰就是子网掩码,掩码越长范围越小、越精确、优先级越高
 
优先级区分:
# 1、在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,掩码越长的优先级高
也就是说,掩码位长的路由条目优先级一定比掩码位短的优先级高,所以主机路由的优先级最高,
然后是直连网络(即同网段)的路由(也算是网络路由)次之,
再是网络路由,
最后才是默认路由即网关。 
# 2、若路由条目的掩码长度相同,则比较节点之间的管理距离(比如metric),管理距离短的生效。

yum install net-tools  -y

route -n       # 查路由表

route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev]
 
选项说明:
add/del:增加或删除路由条目
-net:增加或删除的是一条网络路由
-host:增加或删除的是一条主机路由
default:增加或删除的是一条默认路由
netmask:明确使用netmask关键字指定掩码,要可以不使用该选项直接在地址上使用cidr格式的掩码,即IP/MASK。
gw:指定下一跳的地址。要求下一跳地址必须是能到达的,且一般是和本网段直连的接口。
dev:强制将路由条目关联到指定的接口上。一般内核会自动判断路由条目应该关联到哪个网络接口。 
# route命令添加的多少临时生效

永久配置

centos7.9

 配置永久路由时,需要注意几点:
(1).route-ethX的对应网卡配置文件ifcfg-ethX必须存在,否则路由无效。(注意:对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifconfig却能找到该网卡)
(2).如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfgethX中的DEFROUTE指令设置为"no”,表示DHCP不设置默认路由。
(3).如果在route-ethX文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-ethX文件中的PEERROUTES指令设置为"no”,表示DHCP设置的路由允许被覆盖。

centos 9
“nmcli connection up 网卡“后可以在route -n中看到
强调:+号代表增加路由条目,-号代表删除,如果不带任何符号代表覆盖
# 1、添加默认路由:“0.0.0.0/0”代表所有IP地址,“192.168.1.1”代表路由的网关。
   nmcli connection modify eth0 +ipv4.routes "0.0.0.0/0 192.168.1.1" # 注意在centos7中该命令的掩码不允许设置为0
   nmcli connection up eth0  # 使更改生效
 
# 2、添加网络路由:“192.0.2.0/24”是目标网络,“192.168.1.1”是网关。
   nmcli connection modify eth0 +ipv4.routes "192.0.2.0/24 192.168.1.1"
   nmcli connection up eth0
 
# 3、添加主机路由:“192.0.2.2/32”是目标主机的网络地址, “192.168.1.1”是网关。
   nmcli connection modify eth0 +ipv4.routes "192.0.2.2/32 192.168.1.1"
   nmcli connection up eth0
 

arp  arping

虽然arping和ping都可以用来测试网络连通性,但它们的工作原理和用途有所不同。如果你需要检测网络延迟、丢包情况或者跨网络(子网)的连通性,ping是更好的选择;而如果你想检测和解析IP和MAC的映射关系,或者测试本地网络的IP冲突,arping更适合。

 arp -n -v -i           # 查看arp缓存
 
选项说明:
-n:不解析ip地址为名称
-v:详细信息
-i:指定操作的接口
-d:删除一个arp条目

14   linux系统优化 

1、配置yum仓库与包更新 

 默认国外的yum源(软件仓库)比较慢,所以换成国内的。
# 1.1、备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
# 1.2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
# 1.3.添加epel源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum update -y  # 刚装完系统后就立即执行,日后就不要轻易更新了

制作自己的yum源

2、规范主机名并添加hosts文件实现集群之间相互用主机名解析 

 hostnamectl set-hostname 主机名  # 主机名能够反映出主机的作用即可

vim /etc/hosts  # 编辑好之后,每台机器都发一份
 
172.16.10.11 nc1 ceph-deploy
 
172.16.10.12 nc2
 
172.16.10.13 nc3
 
172.16.10.14 cs1
 
172.16.10.15 cs2

3、关闭selinux与防火墙

#临时关闭
setenforce  0
#永久关闭,修改完配置后重启主机
sed 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 
#检查结果
grep "disabled" /etc/selinux/config

    
# 临时关闭
systemctl  stop firewalld 
# 设置开机不启动
systemctl  disable  firewalld
 
iptables -t raw -F # 清空规则
iptables -t mangle -F # 清空规则
iptables -t nat -F # 清空规则
iptables -t filter -F # 清空规则

4、配置自动时间同步(NTP-----chronyd)

常见的 NTP 软件有 ntpd 和 chronyd 等

云服务器----直接对接公网的时间服务器

集群内主机---->时间服务器------>公网时间服务器

# 1、安装
yum -y install chrony​
# 2、修改配置文件
mv /etc/chrony.conf /etc/chrony.conf.bak

cat > /etc/chrony.conf << EOF
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10          #向上:向公网时间服务器同步
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10
server ntp5.aliyun.com iburst minpoll 4 maxpoll 10
server ntp6.aliyun.com iburst minpoll 4 maxpoll 10
server ntp7.aliyun.com iburst minpoll 4 maxpoll 10
driftfile /var/lib/chrony/drift                                             # 向下:作为集群的时间服务器
makestep 10 3
rtcsync
allow 0.0.0.0/0
local stratum 10
keyfile /etc/chrony.keys
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF

# 4、启动chronyd服务
systemctl restart chronyd.service # 最好重启,这样无论原来是否启动都可以重新加载配置
systemctl enable chronyd.service
systemctl status chronyd.service

对于客户端

# 下述步骤一次性粘贴到每个客户端执行即可
# 1、安装chrony
yum -y install chrony
# 2、需改客户端配置文件
mv /etc/chrony.conf /etc/chrony.conf.bak
cat > /etc/chrony.conf << EOF
server 服务端的ip地址或可解析的主机名 iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync
local stratum 10
keyfile /etc/chrony.key
logdir /var/log/chrony
stratumweight 0.05
noclientlog
logchange 0.5
 
EOF
# 3、启动chronyd
systemctl restart chronyd.service
systemctl enable chronyd.service
systemctl status chronyd.service
 
# 4、验证
chronyc sources 

5、系统内核优化

ulimit  -u  3               #限制用户打开最大进程数 

ulimit  -n  12              #限制用户可用文件描述符数(内核程序最大可以打开的文件数)

                                  #装完系统必调项目

文件描述符-----ulimit -Sn   查看软限制      ulimit  -Hn   查看硬限制

*  代表所有用户        

## 相关内核优化

内存管理优化

物理内存不够用--->释放buff/cache  /  swap空间(/proc/sys/vm/swappiness进行调配---控制匿名内存释放量和page cache释放量的比值)---->内存依然不够用----->OOM机制  杀死部分进程

匿名内存(内存中还没来得及写入硬盘的数据---没有获得对应的文件名)写入swap分区

15   iptables与firewalld 

### 防火墙组件是应用层的东西,底层都基于linux内核的netfilter,对内核进行封装形成了上层的应用,本质上都是在配置netfilter

数据包----》网卡-----》操作系统(防火墙内核)----》硬件

应用层工具----》管理内核

表---》对规则的分类

链---》数据包路上的关卡,在关卡上添加规则

五链四表

iptables命令---临时添加,直接生效,直接作用于内核

iptables服务----永久性,后台服务,它在系统启动时从/etc/sysconfig/iptables 文件加载防火墙规则,而在系统关闭时保存当前的防火墙规则到该文件。

firewall-cmd  命令行工具即,netfilter表是二者共享的,所以firewalld新增东西,你用iptables当然能查出来    -permanent  -reload    #重载后可以永久保存配置

firewalld服务---增加了额外的链和规则来支持区域(对网络划分)的概念

16   systemctl 命令行工具

systemctl 是 Systemd 系统和服务管理器的主要命令行工具,在现代 Linux 系统中广泛用于管理系统服务、系统资源和系统状态。

journalctl -xeu nginx   

  • journalctl:这是 systemd 日志管理工具,用于查看系统和服务的日志信息。它会从 systemd 的日志系统中读取和过滤日志,为用户提供特定的日志记录。
  • -x:此选项会在日志中添加解释性的文本。当出现错误或特定事件时,journalctl 会给出额外的描述,帮助你更好地理解日志中记录的事件。
  • -e:该选项会让 journalctl 直接跳转到日志的末尾,这样你可以立即看到最新的日志记录,对于实时查看新产生的日志非常有用。
  • -u nginx-u 是用于指定服务单元的选项,nginx 是服务名。这一选项的作用是只显示 nginx 服务的日志信息,过滤掉其他服务的日志,方便你专注于 nginx 服务的相关情况。
服务管理
  • 启动服务:使用 systemctl start <服务名> 命令来启动指定的服务。
  • 停止服务systemctl stop <服务名> 用于停止正在运行的服务。
  • 重启服务systemctl restart <服务名> 能重启指定的服务。
  • 重新加载配置systemctl reload <服务名> 可在不中断服务运行的情况下重新加载服务配置。像重新加载 Apache 的配置,执行 systemctl reload apache2。不过,并非所有服务都支持 reload,若不支持则会报错。
  • 查看服务状态systemctl status <服务名> 能查看指定服务的当前状态,包括是否正在运行、最近一次启动时间、服务日志输出等信息。如查看 Docker 服务状态,输入 systemctl status docker
服务开机自启管理
  • 设置开机自启systemctl enable <服务名>  --now  <服务名>       可让指定服务在系统启动时自动启动并立即启动。例如设置 Redis 服务开机自启,执行 systemctl enable redis。  
  • 禁止开机自启systemctl disable <服务名> --now<服务名>         用于禁止指定服务在系统启动时自动启动并立即禁止。比如禁止 Postfix 服务开机自启,输入 systemctl disable postfix
查看服务列表
  • 列出已加载服务systemctl list-units --type=service 可列出所有已加载到 Systemd 中的服务,涵盖正在运行和已停止的服务。
  • 列出所有可用服务systemctl list-unit-files --type=service 能列出所有可用的服务单元文件,包括已启用和未启用的服务。
系统状态管理
  • 关机systemctl poweroff 用于关闭系统。
  • 重启systemctl reboot 可重启系统。
  • 挂起systemctl suspend 会将系统挂起,进入低功耗状态。
  • 休眠systemctl hibernate 会将系统休眠,把内存中的数据保存到磁盘后关机。
依赖关系查看

systemctl list-dependencies <服务名> 可查看指定服务的依赖关系,包括哪些服务依赖该服务,以及该服务依赖哪些其他服务。

查看服务是否开机自启

systemctl is-enabled <服务名> 可查看指定服务是否被设置为开机自启,返回 enabled 表示已设置,disabled 表示未设置。

简单检查服务是否活跃 

systemctl is-active <服务名>,返回 active 表示服务正在运行,inactive 表示未运行。

临时启用 / 禁用服务

systemctl isolate <目标名> 可临时将系统切换到指定的目标状态,同时禁用其他无关服务。例如 systemctl isolate multi-user.target 会将系统切换到多用户模式。

          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值