目录

第0章 计算机概论

基本知识

操作系统:

内核功能:

  应用程序:

第一章 什么是LINUX


第0章 计算机概论

基本知识

电脑主要由五大单元组成: 输入单元,输出单元,cpu内部的控制单元,算数逻辑单元与内存

cpu 为一个具有特定功能的芯片·主要由两个单元组成: 算数逻辑单元与控制单元

两种最常见的CPU架构: 精简指令集(RISC) 和 复杂指令集(CISC)

CPU所使用的数据都来自内存

频率:CPU每秒可以进行工作的次数

位宽:每个时钟周期能够传输的数据量

字长:CPU每次能够处理的数据量,字长根据cpu的设计有 32位和64位 ,也是电脑64位的由来 

硬盘:硬盘基本术语(磁道、扇区、柱面、磁头数、簇)_大漠雁-CSDN博客_磁道的编号

CMOS与BIOS

 常用的英文编码表为ASCII , 后有Unicode编码系统,俗称 UTF-8或万国码

操作系统:

(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。

 0. 操作系统提供一套API供开发使用

 1. 操作系统的内核层直接参考硬件规则写成,所以同一个操作系统程序不能购在不一样的硬件架构下运行

2.操作系统只管理整个硬件资源,包括CPU,内存,输入输出设备以及文件系统等,如果没有其他应用程序辅助,只能让主机准备妥当而已

3.应用程序的开发都是参考操作系统提供的API,所以该应用程序只能在该操作系统上面运行而已,不能在其他操作系统上运行

内核功能:

 系统调用接口

 进程管理

 内存管理

 文件系统管理

 设备驱动:

  应用程序:

     参考操作系统提供的API所开发出来的软件

第一章 什么是Linux

每种操作系统都是在它专门的硬件架构上面运行的

GNU计划:

开源协议专题(二):开源之父和 GUN 计划 - 知乎 (zhihu)

建议学习知识:

1 计算机概论与硬件相关知识

2 Linux 安装与命令

3 linux操作系统的基础技能

4 vi文本编辑器

5 shell与shell脚本的学习

6软件管理

7 网络基础的建立

第二章 主机规划与磁盘分区

各设备在Linux中的文件名:

 每个设备都被当做一个文件来对待

虚拟机选择: VMware

VMware16的安装及VMware配置Linux虚拟机(详解版)_何故M的博客-CSDN博客_vmware16安装linux

一台主机安装两个以上操作系统:需要懂 启动流程与多重引导

磁盘划分

  MBR( MS-DOS) :

master boot record 的方式来处理启动引导程序与分区表。放在磁盘的第一个扇区,共512个字节:

    主导引导记录(MBR):可以安装启动引导程序的地方,446字节

    分区表(partition table):记录整块硬盘的分区状态,64字节

  因为每组分区表的地址记录要占用16个字节,所以一共能有4组记录区,每组记录区记录了该段的  起始与结束的柱面号码

   扇区->磁道(圆圈)->柱面(立体)

可以得到几个重要信息:

  1 所谓的分区只是针对那64字节的分区表进行设置而已

  2 硬盘默认的分区表仅能写人四组分区信息

  3 分为主要 或 扩展分区

  4 分区的最小单位为柱面

  5 当系统写人磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据处理

 可以用扩展分区来划分额外的扇区,其内部称为逻辑分区

  定义: 

    1 主要分区和扩展分区一共最多有4个(硬盘64kb限制)

    2 扩展分区至多有一个,可以没有(操作系统限制)

    3 逻辑分区是由扩展分区持续划分出来分区

    4 能被格式化后储存数据的分区是主分区和逻辑分区,扩展分区无法格式化

    5 逻辑分区的数量依据操作系统而定

    6 逻辑分区一定从p5 开始

 GPT(GUID partition table)磁盘分区表 

  将所有区块以LBA(logical block address)来划分 :从 0开始

  无主分区,扩展,逻辑分区的概念,都是独立存在可以当做主分区

  除了前面34个LBA之外,整个磁盘的最后34个拿来做另一个备份

   LBA0: MBR兼容区块 

   LBA1: GPT表头记录 - 记录了分区表本身位置与大小 + 备用分区位置+ 分区表校验码

   LBA 2 -33: 实际存放数据处 

         每个LBA都可以记录4组分区记录 ,总共 4*32 1=128 组分组记录

BIOS与 UEFI 启动检测程序

BIOS:

 启动时执行的第一个程序 ->读取引导程序(如MBR的引导程序)->引导程序->加载内核->启动操作系统

 boot loader:

   

 

要点:

1  启动引导程序只会认识自己的系统分区内的可启动的内核程序, 以及其他启动引导程序

2  启动引导程序可以直接指向或间接将管理权交给另一个管理程序

UEFI :统一可扩展固件接口

 因为BIOS是16位程序,无法很好解读GPT ,因此有了uefi

 与BIOS主要区别 

Linux的磁盘分区选择 

  / 代表根目录,由此衍生出目录树

  挂载:利用一个目录当成进入点,将磁盘分区的数据放在该目录下;即 进入该目录就可以读取该分区

第三章  安装Cent OS 7.x

VMware16的安装及VMware配置Linux虚拟机(详解版)_何故M的博客-CSDN博客_vmware16安装linux

要点: 1   不要安装在机械硬盘上,会报错 

            2   要进入BIOS 将 AMD-V 打开 重启:此主机支持 AMD-V,但 AMD-V 处于禁用状态的解决办法_多看书少睡觉的博客-CSDN博客_此主机支持amd-v但处于禁用状态

            3 选择安装源url 

Centos7安装源_老糊涂Lion的博客-CSDN博客_centos7安装源

            4 选择手动 如图:要留空间给以后练习用

  

第四章:帮助指令 与 终端

X window:

X Window即X Window图形用户接口,是一种计算机软件系统和网络协议,提供了一个基础的图形用户界面(GUI)和丰富的输入设备能力联网计算机。其中软件编写使用广义的命令集,它创建了一个硬件抽象层,允许设备独立性和重用方案的任何计算机上实现。

GUI 与 命令行终端 切换: 

         Ctrl+Alt+F2-F6 :登录终端

         Ctrl+Alt+F1:      图形用户界面模式

注销登录: exit 命令(注意不是关机)

终端执行命令方式:

  $ 命令 -选项 参数1 参数2 ...

注意点: 

  1 命令包括 绝对命令 与 可执行文件

  2 linux区分大小写

  3 选项代表可选,可以省略。有很多选项,分别不同字母表示,多个选项时中间不用空开

    Linux 命令大全 | 菜鸟教程 (runoob)

  4 多个空格shell都视为一个空格

  基础命令:

      显示时间:date

      显示日历的命令:cal

      计算器:bc

    详细用法自行查询·

执行命令时会出现的情况:

  1 一种是该命令直接显示出结果,然后回到命令提示符等待下一个命令输入

  2 进入该命令的环境,指导该命令结束才回到命令提示符环境(例如bc环境中输入quit)

重要热键 :

  Tab:

         接在一串命令的第一个字段后面,则为命令补全

         接在一串命令的第二个字段后面,则为文件补全

  ----可以避免出错

  Ctrl+c:

        强制中断目前程序

   

  Ctrl+d:

       键盘输入结束,可以取代exit的输入

  shift+ pgup/pgdn:

       上下翻页

在线求助命令:

   $  命令  --help 

   $  man 命令               

          (按q离开man环境)

            第一行的数字代号:

      

             /+字符串 :搜索指定字符

  $ info 命令

      与man 一口气输出一堆信息不同,info - 则是将文件数据拆成一个一个段落,每个段落用自己的页面来编写,并且在各个页面中还有类似网页的超链接来跳转到各个不同的页面中,每个独立的页面也被称为一个节点(node)

               

文本编辑器:nano

      $ nano 文件名

          如果有就打开,没有就新建文件

      组合键:

           M代表ALT

           ^代表ctrl

         

关机命令

   sync:将数据写入硬盘,防止缓冲区的数据丢失 

    

   shutdown:需root权限

  Linux shutdown 命令 | 菜鸟教程 (runoob)

  

  reboot,halt,poweroff:都是重新启动

注意:以上其实都是调用 systemctl 命令

           $ su - :切换到root权限,可退回到原本用户(exit离开su的命令环境)

第五章  文件权限与目录配置

   权限划分:

         拥有者:

         用户组:小组,可以有多名用户

         其他人:除了以上其他人 

         root:天神组,无视任何,拥有绝对权限

    文件属性:

         通过 :ls -al查看

       Linux ls命令 | 菜鸟教程 (runoob)

     

     第一项:分为10个字符位 

            1+3*3 

                 1:文件类型

                

                3*3:不同权限划分可对应的操作(可读,可写,可执行) * 拥有者/用户组/其他人

                

修改文件属性:

     chgrp:change group 修改文件 用户组

     chown:change owner 修改文件 拥有者

     chmod:修改文件的权限 - 3*3对应的权限 

     cp:复制文件 会复制文件的内容包括属性

 chmod      :

  第一种方式:

      可读可写可执行代表不同位权:

         r:4

        w:2

         x:1

     ---> 3*3当中:数字范围0-7

    $chmod -R 值*3 +文件名或目录名

          -R:递归,子目录所有都会修改

           值:rwx加起来的总值 ,如可读可写可执行 则为

           *3:代表三种权限划分(拥有者,用户组拥有者,其他人)

      如所有权限都开放:chmod 777 文件名

    第二种方式:

   用 u,g,o 来代表 三种身份的权限

   :这种方法可以单独增加或减去某一权限

目录与文件权限的意义

 1:我们的文件能否被执行,是有 X 来决定的,跟后缀无关 

      注意:具有可执行权限与具有可执行代码是两回事

 2:w不包含删除改文件 

 3:

       针对目录而言

           r:可以查询该目录下的文件名数据 

          w:建立新的文件与目录 

              删除已经存在的文件与目录(不管该文件与目录的权限是什么)

              更名,移动等 

          x能不能进入某一目录,只与该目录的x(可执行)权限有关

                要操作(也就是要进入)一个文件时,要具有此文件的上一级目录x权限

Linux文件种类与扩展名:

   任何设备在linux下都是文件

Linux文件类型详解 - Surpassme - 博客园 (cnblogs)

   常用扩展名:

          *.sh:脚本或批处理文件,因为用shell写成

          *Z,*tar:压缩文件

          *.html,*.php:网页相关文件

   

   单一文件名或目录名最大为255字节,应避免用特殊符号

Linux目录配置

     FHS标准 :

      1定义的四种交互作用状态 

       2 定义的三个目录:

 

   3

       / 根目录是最重要的一个目录 ,不但所有的目录都是根目录的子目录同时根目录也与启动,还原,系统修复等操作有关

  目录树与绝对路径,相对路径

  1    目录树的起始点为根目录(/)

   

     绝对路径:从根目录开始由 / 左斜杠来访问 

     相对路径:对于目前文件来说的路径

     要点:

              不是/开头的都是相对路径 

              .代表当前路径(一点)

              ..代表上一层目录 (两点)

第六章  Linux 文件与目录管理 

目录的相关操作:

. 代表当前目录

.. 代表上一层目录

- 上一个工作目录 (返回跳转前的目录)

~ 当前用户的家目录

~用户名 : 该用户的家目录

cd:切换目录 change directory + 具体 或 上述的代表符号

pwd:显示当前目录 

mkdir:创建一个新目录 

            可以-p 递归创建 。 否则得现有上一层目录存在

rmdir:删除一个空目录

            可以-p递归删除。

      注意:只能删除当前目录下的目录 不包括当前目录本身 且只能删除空目录

执行文件路径的变量: $PATH

  比如执行命令ls时,无论在哪个目录都能执行呢? (其实要找到该可执行文件)

当我们在执行一个命令时,系统会依照PATH定义的目录中去寻找该名字的可执行文件

Linux PATH环境变量及作用(初学者必读) (biancheng)

1   echo $PATH  显示定义的目录 ,每个中间用:冒号来隔开

2   PATH="${path}:+目录   来添加

3   当重名时,先找到的先执行

4   最好不要加入.当前目录,会有危险

文件与目录管理(命令)

ls:查看

 Linux ls命令 | 菜鸟教程 (runoob)

cp:复制

Linux cp 命令 | 菜鸟教程 (runoob)

  要点: 1 是否需要完整的保留原文件的信息? -a

              2 源文件是否为链接文件 -d

              3 是否为特殊文件

              4 源文件是否为目录? 若为 则得加上 -a 或 -r(递归复制)

              5 复制多个文件到一个文件夹时 ,最后一个必须是目录

rm:删除 

Linux rm 命令 | 菜鸟教程 (runoob)

 要点:

          1.  rm -r 非常危险

          2 可以通过加上反斜杠来规避询问 \rm -r

    

mv:移动

Linux mv 命令 | 菜鸟教程 (runoob)

   1 可以通过原地移动来修改名称

辨别文件名或者目录

  basename :获取最后的文件名

  dirname     :获取目录名(取最大)

文件内容查看

  cat :由第一行开始显示文件内容 

Linux cat 命令 | 菜鸟教程 (runoob)

  tac:最后一行开始

  nl:显示的时候,同时输出行号

  more:一页一页的显示内容  (enter 向前翻页 b 向后翻页 可查找)

  less:与more类似 ,但能向前翻页 

 head:只看前几页 (-n +数字 表示显示开头几行 若是负数 则不显示倒数几行)

 tail:只看后几页     (-n +数字 表示显示末尾几行 若是+号 则不显示开头几行)

 od:以二进制的方式显示

  管道: | 来隔开  前面的命令所输出的信息,通过 管道交由后面的命令进行使用,不会直接打印出结果

 echo:输出字符串?Linux中如何使用echo命令?(用法详解)-linux运维-PHP中文网

 ;分号用来一次执行多条命令

修改文件时间或创建新文件touch

 status time ,cttime:状态数据修改时间(权限与属性)

modification time,mtime:内容数据修改时间  : 默认时显示 mtime

access time ,atime:改文件内容被读取时,就会更新

 使用touch 来改变时间: 

   Linux touch命令 | 菜鸟教程 (runoob)

注意: 

   1 复制文件时 无法复制ctime

   2  若不存在则创建新的文件 

默认权限(umask)与隐藏权限(-attr)

umask: 显示 默认减去的权限 

  注意:默认的权限 与 默认减去的权限 不同 

     如 默认没有 x权限 则最大值为666  ,umask 为022  ,也就是rw-r--r-- 

Linux umask命令 | 菜鸟教程 (runoob)

chattr:change attribu 

Linux chattr命令 | 菜鸟教程 (runoob)

  xfs文件系统仅支持部分 

lsattr:显示隐藏属性

文件特殊权限(S ugb ID)

   若出现在拥有者x上的为S ,则为拥有SUID特权:

             1 仅对二进制程序有效(文件) 

             2 执行者需要对此文件有x权限 

             3 本权限仅在执行程序中有效

             4 执行者将拥有该程序拥有者的权限,相当于暂时获取对应权限 

   若出现在用户组x上的为S ,则为拥有SGID特权:

             1  可以对文件或目录来设置  

             2  需要拥有x权限

             3 若对文件: 获得改文件的用户组支持 

                       目录:有r与x权限,才能进入 --- 所做操作相当于该用户组权限所做操作 

  

Sticky Bit :SBIT

           1 仅针对目录有效 

           2 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除 

          --相当与只有目录的的建立者或root才能删除,别人不行

特殊权限S的添加 :

  chmod时:在前面再加一位 变为4位 ,最高为7777  

                    1 sbit 2 sgid 4 suid 

           注意: 若没有x权限而空有特殊权限 则标志为大写S或T ,换句话说 特殊权限建立在有x的权限之上;不互相冲突

  观察文件类型 :file 

命令与文件查找

  命令

    which:根据path环境变量来查找 命令

     Linux which命令 | 菜鸟教程 (runoob)

  文件:

     whereis:从一些特定的目录中查找

     Linux whereis命令 | 菜鸟教程 (runoob)

     locate:从已建立的数据库查找

      updatedb:更新数据库

   Linux locate命令 | 菜鸟教程 (runoob)

   find

Linux find 命令 | 菜鸟教程 (runoob)

     

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

  1 可以增加时间选项 :

                 如:      -mtime n/+n/-n 

                           n:查找n天至n+1天的文件 

                         +n:查找n+1天前的文件 

                         -n:查找n-1天前的文件

  

  2  -uid -gid 等,可以限定用户来查找

  3 可以限定大小 -size   ,名字(用正则),类型-type,权限 -perm等 

  4 可以能进行额外操作  -exec +其它命令  到 \;转义结束 

  5 多个条件 就要多个前缀 

      如 查找/etc下 容量大于1500k 以及容量等于 0的文件 ,并显示出来 

     

find /etc -size 0 -size +1500c -exec ls -l \;

 6 +表示大于 -表示小于 没加表示等于

附:mv 修改目录名 linux怎么修改目录名-linux运维-PHP中文网

第七章  linux磁盘与文件管理系统 

为什么磁盘使用前需要格式化: 每个操作系统所设置的文件属性/权限并不一样,要让其成为能够                                                      利用的文件系统格式

通常称 一个可被挂载的数据为一个文件系统而不是一个分区 

 怎么理解`通常我们可以称呼一个可被挂载的数据为一个文件系统而不是一个分区槽喔!`? - SegmentFault 思否

 技术|LFCS 系列第五讲:如何在 Linux 中挂载/卸载本地文件系统和网络文件系统(Samba 和 NF

索引式文件系统: 通过一个索引(区块),来指出全部数据块 

fat文件系统:        没有索引区块,一个数据块后指向后一个数据块(不能随机访问)

ext2  

       linux second extended dile system 

 区块群组:分为多个组 每组都有独立的数据块,inode,超级区块 

  数据区块

       每个block都有固定最小容量(可选择),当一个文件大于时 用多个区块 ,小于时 则浪费

 inode table

        1 每个文件只会占用一个inode ,因此文件系统能建立的文件数量与inode有关 

        2 至少记录着: 文件的真正指向(数据块),权限属性,大小,各种时间

        3 每个inode大小固定为128B(新的xfs与ext4已经到256B)

             具体为:  a 文件信息记录区

                             b  记录区块号码的区域:12个直接 ,间接 双间接 三间接 各一个 

                             c   通过索引的索引(间接,以block延伸作为记录)--能记录更多区块(大文                                            件)  ,每个区块号码记录会用上4B

                             d        如双间接 :假设一个block延伸记录区块有1KB,能记录256条记录

                                                           双间接就能记录 256*256个区块

                 

superblock

   1 主要记录 数据块与inode的总量 ,已使用和未使用的数目,大小

   2 文件系统的挂载信息,最近一次写入,检验的时间 

   3 一个有效位数值

文件系统描述说明:

   每个区块群组的开始与结束区块,以及说明每个区段(上文)的开始与结束 

区块对照表 与 inode 对照表 :

  使用或未使用的区块号码/inode,方便使用与释放

可以使用 dumpe2fs + 磁盘文件名 命令来查看超级区块信息

   

与目录树的关系:

  建立时:

    对照表(查询空的inode与block)->分配  inode -> 区块 :

         若是目录:inode记录着目录的相关权限与属性 ,指向的区块内记录着 目录下的文件名及其                             inode号(须有x和w权限)

                           

         若是文件:分配一个inode和 多个区块 

 日志功能

    若步骤发生错误,导致inode记录的区块不必配等,会进行一致性检查,耗费很多时间,因此引入日志记录区块;

    

异步处理:

   当一个文件加载到内存后,分为两种状态 

          修改过: dirty , 会不定时的自动写会磁盘中 ,以保证磁盘与内存数据的一致性

          没修改:clean

 挂载点的意义 

     每个文件系统(如ext2)都有独立的 inode,区块,超级区块等信息,每个文件系统要能连接到

 目录树底下才能使用,挂载点一定是目录,该目录为进入该文件系统的入口

   什么是挂载,Linux挂载详解 (biancheng)

       将设备文件连接到某一目录,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文 件进行挂载

  linux其他支持的文件系统:

     vfs:virtual filesystem switch  通过此内核功能自动识别文件系统,不需要知道每个硬盘分区上的文件系统是什么

          

  xfs:

      centos 7.x 的默认文件系统 ,日志式文件系统

分为

    数据区: 也分为多个存储区群组,与ext的主要区别是 inode与区块是动态产生的,并非一开始与格式化就完成了配置的

    文件系统活动登录区: 记录文件系统的变化,类似于日志区 

    实时运行区:当要建立新的时,会在这个区段内找到数个extent区块,写入到 数据区中(inode +区块)

  ----------------------------------------

可以用 xfs_info 挂载点|设备名称  命令 来查看

磁盘与目录容量

   df:列出文件系统整体磁盘容量(从超级区块内读取)

  Linux df 命令 | 菜鸟教程 (runoob) 

  du:命令用于显示目录或文件的大小(具体一个个去查看)

 Linux du 命令 | 菜鸟教程 (runoob)

 区别:linux中du, df两个命令的区别 - 简书 (jianshu)

 通过 df 命令找到根目录硬盘的文件名,然后使用 dump2fs 命令观察文件系统的详细信息,执行命令如下:

 Linux dumpe2fs命令:查看文件系统信息 (biancheng)

  

链接:

  创建链接指令:ln

Linux ln 命令 | 菜鸟教程 (runoob)

ln 【-sf】 源文件 目标文件

   注意 :默认进行硬链接 

 ls  -l 第二个字段: 有多少个文件名链接到这个inode号码

 硬链接

    在某个目录下新增一条文件名 链接到某个inode号码的关联记录,第二个字段会+1

    不会增加inode个数

    不能跨文件系统 

    不能链接目录

软连接

    新创了一个独立的文件,文件的block区指向源文件的文件名,源文件inode第二个字段不会+1

    相当于增加了一个独特的文件,会增加inode数

    可以跨文件 可以连接目录

当新建目录时:新的目录的链接数为2(本身和 .) 上层目录的链接数+1(..)

磁盘划分

  流程: lsblk 查看所属磁盘(类型disk,注意不是分区) -> gdisk/fdisk/parted来划分-> mkfs来格               式化分区系统->挂载(mount)/自动挂载(/etc/fstab)

 分区

  1  先用lsblk命令查看系统上可用的磁盘

  2 用 gdisk 来处理 GPT  |    fdisk来处理 MBR(虚拟机一般这种格式)

     用 gdisk/fdisk + 第一步查到的磁盘  来查看磁盘类型(磁盘分区表)并处理(注意不是分区,是磁盘

     n新增 d删除 q直接不保存退出 w保存退出

 Linux fdisk 命令 | 菜鸟教程 (runoob)

 gdisk分区命令 - pipci - 博客园 (cnblogs)

  3 也可以用 parted +磁盘名+ print 来输出相关信息

  4 利用partprobe来刷新状态

 格式化

     也即就是创建文件系统

     mkfs(make filesystem) 命令 ,也可以用 mkfs.xxx 来直接指定格式

mkfs.xfs 设备名称 
如果已经有文件系统,要用-f 来强制格式化

     Linux mkfs 命令 | 菜鸟教程 (runoob)

文件系统校验

  xfs_repair 处理xfs系统

  fsck.ext4  处理fsck 

  注意:很危险的命令,通常只有root有权限,且检查的分区必须在卸载的状态

挂载 

   要点

         1 单一文件系统不应该被重复挂载在不同的目录中 

         2 单一目录不应该重复挂载多个文件系统(必须

         3 要作为挂载点的目录,理论上都应该是空目录才行 (如果不是空的,原内容会暂时隐藏)

    mount:

            共三种方式,还有很多参数

mount  LABEL=' ' 挂载点
mount  UUID= ' ' 挂载点 (推荐使用这种)
mount  设备文件名 挂载点  

Linux mount命令 | 菜鸟教程 (runoob)

      一般流程为: 

                          

blkid 设备 (查询uuid)
mkdir -p 目录 (创建空挂载目录)
mount 三种方式选一  要挂载的目录

    重新挂载

         -o remount,xx 

   

   目录挂载目录:  达到链接功能

    

mount --bind 目录 目录

  特殊设备 loop 挂载 

    Linux中的loop设备 - 简书 (jianshu)

mount -o loop 解释_acmilanvanbasten的博客-CSDN博客

     通过 mount -o loop ~ 命令进行特殊挂载 

            如 镜像文件  或

                大文件当做一个分区 :dd命令创建一个大文件

                    Linux dd 命令 | 菜鸟教程 (runoob)

                    

   卸载

     

umount [-fn] 设备名或挂载点

-f:强制卸载
-l:立即卸载
-n:不更新 /etc/mtab 的情况下卸载

       注意:不能卸载正在使用的挂载点,退出就行了

自动挂载(启动挂载)

  /etc/fstab这个文件内:有自动挂载的信息 

   分为6栏:

[设备/UUID/LABEL] [挂载点] [文件系统] [文件系统参数] [dump] [fsck]

      第四栏:p249  默认为defaults 同时具有很多参数 

      第五栏:dump 是一个用来作为备份的命令,通常设置为0

      第六栏:是否以fsck检验扇区,通常为0

-----------------------------------------------

     通过nano 命令 将6栏信息写入 就可以实现自动挂载了

     fstab是启动时的配置文件,不过实际文件系统的挂载是记录到/etc/mtab  /proc/mounts

  磁盘/文件 参数自定义

      所有设备都是以文件来表示,怎么用文件来识别设备呢? 通过文件的 major 与 minor 数值来代替 

      245就是major  ,逗号后面的就是 minor

---------------------------------------

    mknod :修改major 和 minor

mknod 设备文件名 [bcp] major值 minor值

   xfs_admin : 修改xfs文件系统的uuid 和 Label

  tune2fs :修改ext4的~

swap分区创建

   1 设置一个内存交换分区 (设置一个新分区),用mkswap格式化系统

   2 建立一个虚拟内存文件  dd创建大文件 用上文的loop设备

---------------------------

    swapon 来 启动交换分区 

Linux swapon命令 | 菜鸟教程 (runoob)

    swapoff 来关闭

Linux swapoff命令 | 菜鸟教程 (runoob)

    自动挂载也写在/etc/fstab中

附:  

     ll -sh 来查看 数据总量

      第一个数据就是block大小4Kb  实际只用了2K  可以看到浪费了很多 

----------------------------------------------------------------

   parted 

parted 磁盘 print //可以查看此磁盘下的所有分区 和划分信息(格式等) 注意是磁盘名

   还 可以用来创建删除分区(无视分区格式)

parted命令详解_Linux运维的博客-CSDN博客_parted

   

----------------------------------

ulimit 

与文件系统及程序的限制关系 ,限制用户使用某些系统资源

-可以用来限制用户创建的文件大小(虽说默认系统限制与block有关)

Linux ulimit命令 | 菜鸟教程 (runoob)

----------------------------------

   注意点: 磁盘分区 (gdisk/fdisk/parted)的命令 ,后面的参数都是磁盘设备名,而不是分区设备名

   各命令查看的类型

                     :parted+磁盘名:查看各分区的格式化类型(如xfs)

                        lsblk:查看是整个磁盘还是其磁盘下的分区 和 分区挂载点

                        fdisk+磁盘名:查看磁盘引导的格式(是dos 还是 GPT)

                        

第八章 文件与文件系统的压缩

压缩(gzip...)

 

 gzip与zcat/zmore/zless/zgrep:

  Linux gzip命令 | 菜鸟教程 (runoob)

gzip [-cdtv#] 文件名 //注意会 替换掉源文件 
// 可以-c 重定向到新文件

  zcat等是将查看文件内容命令与zip格式结合 -->不解压也能对压缩文件操作 

  如:zcat能不解压查看压缩文件内容

  bzip2与 bzcat... Linux bzip2命令 | 菜鸟教程 (runoob)

  xz与 xzcat...

  格式都差不多,只是压缩算法不一样 :压缩效率越好,时间就越高,xz压缩效率最好但慢

打包:tar 可一并压缩

tape archive

tar -zjJ ctx v f+目标文件名 待打包文件名

  zjJ: 表示打包的同时一并压缩或 解压 

         z:gzip

         j:bzip2

        J:xz格式

    注意: 不能同时存在 

ctx

 c:建立新的打包文件

 t:查看打包的文件内含有的文件名(单纯查看

 x:解压缩功能   -C:解压时 在特定的目录解压(不加则解压在工作目录)

 不会同时存在

--------------------------------

其他

 v:在压缩,解压过程中,将正在处理的文件显示出来

 f:后面跟着 要建立的文件名或既有的tar文件名

-p:保留备份数据的原本属性和权限

-P:保留绝对路径,含有根目录(不过不安全 ,解压后可能覆盖绝对路径的内容,不加则 解压目的 目录+文件名)

小技巧:

1  可以通过管道+命令 来指定文件

tar -jtv -f /root/etc.tar.bz2 | grep 'shadow'
//通过 -t 加 管道 加 grep 来查看 压缩文件内的指定文件
//然后 可以解压 特定文件

2  --exclude==' ....'   表示不包括此文件 (\+空格 :字符串连接到下一行)

3 时间参数

  -newer:后续时间包括 mtime与 ctime

   --newer-mtime:仅是 mtime时间

4 称呼 

   tarfile:只是tar打包之后的文件

   tarball:打包并且压缩

5 特殊应用

   a 打包到特殊设备之中(如磁带)

   b  利用管道命令与数据流--》cp效果

     

tar -c vf - /etc | tar -x vf -
//一边打包 一边在工作目录解开 
 -相当于缓存区 standard output/input
    

6 SElinux 权限问题可能会导致系统无法读写某些配置内容,导致影响正常使用 

Linux tar 命令 | 菜鸟教程 (runoob)

xfs 文件系统备份与还原:

  lsblk+fdisk查看磁盘各分区的格式(xfs)

备份 xfsdump:

   增量备份 -l +数字 :第一次备份一定是完整备份 level为0,level n 会跟level n-1 进行对比更新

  -L -M:都是记录自定义的信息

 -f :是目的地文件名 .dump

 -I(大写的i):查看已备份的信息 记录在 /var/lib/xfsdump/inventory/里

还原:xfsrestore

  结合查看的信息来 选择恢复目录或特点文件或增量备份等级(注意:也只能从0往上恢复)

光盘写入工具 

  iso:一般为iso9660,这种格式一般仅支持旧版的DOS文件名。

mkisofs:

    制作光盘镜像文件:.img

mkisofs [-o 目的文件] [-Jrv] [-V vol] [-m file]  +待备份文件 -graft-point 镜像目录=实际目录

  

要点: 

   一般所有文件都无次序的放置到镜像文件的根目录,不好分类,可以用-graft-point来有层次的备份

   可以利用kickstart技术和rsync+此命令可制作 启动光盘镜像文件

cdrecord(wodim):光盘刻录工具

  常用:

 

检测刻录机所在位置:

  配合着SCSI(小型计算机系统接口)的标识来处理:用上面第一个命令来查询

其他常见的压缩与备份工具

dd:

dd if='input fileName' of='out ' bs='block size' count='numer'

  if: input file 输入文件

 of:输出文件

 bl:默认512B

count:多少个block 

 注意: 默认一个扇区一个扇区去读,不会理会文件系统 单纯记录,会变得跟原本磁盘一样大

cpio:

Linux cpio命令 | 菜鸟教程 (runoob)

要点:

> <是重定向的意思

通常配合  find命令 和管道命令  来重定向备份数据 

 可以备份任何文件 

 尽量不要绝对路径,不然解开会直接覆盖

第九章 shell/vim

为什么要选择vim(vi):

模式: 

  一般命令模式:command mode  移动光标

 编辑模式:insert mode  分为六种 【iIoOAarR】

 命令行模式:command -line mode :/ ? +命令执行操作

注意: 编辑模式与命令行模式不能切换 

按键说明p293

Linux vi/vim | 菜鸟教程 (runoob)

hjkl:分别代表左下上又 移动一个光标

$:一般表示最后末尾的意思

0:表示最前面的意思

!:表示强制的意思

常用功能:

  

恢复功能:

   在编辑时,会产生一个filename.swp 的文件,当意外退出没保存时 / 或有其他人或程序在使用此文件,由于vim的工作不被正常点中断,导致缓存无法借由正常流程来结束,所以此缓存文件不会消失

   打开意外退出的文件时,根据此缓存文件会有几个选项:

O:只读文件

E:正常打开文件,不加载缓存的内容

R:加载缓存的内容,但swp文件不会删除,每次打开还是会有警告

D:加载并删除

Q/A:直接返回命令行

     

vim的额外功能:

 能有高亮和自动语法识别(c/shell等) 并且最后一行会有当前光标位置显示

可视区块(visual block)

  vi中基本都以行为单位进行操作,但vim能以区块(比如列)来进行操作

   反白就是选中的意思

多文件编辑+多窗口化:

  可以同时打开多个文件,同时进行操作(比如复制到另一个文件中)

vim fileName1 fileName2

多窗口化:

  可以同时显示多个文件或者一个文件的不同位置-- 光标互不影响(同时只能有一个光标存在)

:sp // --新增一个当前文件窗口
:sp filename // -- 新增一个指定文件的窗口

  ctrl+w+j/k :移动到下一个或上一个窗口

  ctrl+w+q: 关闭当前窗口

要点: 

   可以有多个窗口,不止一个

vim 关键字自动补全

  ctrl+n?

Vim自带自动补齐功能-Vim入门教程(11) | vim教程网 (vimjc)

vim环境设置:

~/.vimrc :写着 set 的配置命令 如set su ,不用每次开启vim都手动设置了

~/.viminfo :记录着你的操作记录,下次更好的作业

注意事项:

1) DOS与Linux的换行符:

       DOS使用^M$  -------linux 使用 $ 符号 所以很可能造成错误

       可以用 unix2dos或 dos2unix程序来转换

2) 语系编码转换 

  iconv 程序来转换 ,要注意文本的原来编码格式和终端的语系

  file +文件名 :来查看是什么文本

第十章 认识与学习 BASH

什么是shell?

  shell是用户与linux内核之间的接口,使我们的命令传输给内核更好的控制硬件来工作

 广义的:能够操作应用程序的软件都能够称为壳程序

 狭义的:命令行模式(bash) 或 DOS下的 cmd.exe

什么是shell? bash和shell有什么关系? - 代码ok - 博客园 (cnblogs)

shell的不同版本

为纪念 Steven bourne 取名为 bourne again shell---->BASH

类似c语言的版本: C shell -- > csh

支持的shell都写在  /etc/shells 这个文件里

登录的时候使用的哪个shell 记录在 /etc/passwd 这个文件里

Bash shell

 由于 bash 是默认的shell ,所以我们学习她;

 bash主要有以下优点{

  1  按 上下键 可以找到以前输入过的命令 ,最多可达1000多个

  2 命令行补全 TAB

  3 别名功能 (很常用)

alias //查看已有的别名
alias 自定义别名='原命令'  //就可以自定义别名
如:
alias la='ls -al'//以后输入 la就行了

  4  任务管理,前后台控制

  5 程序化脚本:shell scripts ----类似于批处理文件,相当于一种语言

  6 通配符:如*表示任意 ----正则表达式?

}

查询是否内部命令:type

type [-tpa] name

 如:type就是bash内置命令

 可以 通过 type -a name 来达到 which命令的效果: 找命令用(绝对路径)

命令的快捷键 

---

\+enter 来转义字符:命令太长换到下一行继续输入 

下一行会出现>标志,代表换行成功可以继续输入

--------------- 

组合键:

shell的变量功能

shell环境下的变量 ,跟编程语言里的变量一样

以一组文字或符号等,来替换一些设置或一串保留的数据

可以对复杂的访问路径设置为一个变量 ,就不用繁琐的输入路径了

变量的设置与取消

读取变量内容:

echo $变量名 或 echo ${变量名}

取消:

unset 变量名

设置:用等号来赋值

name=...

变量的规范与注意点

1)如果变量数据有空格,要用单引号或双引号括起来

      单引号:原数据,不进行转换

      双引号:专换的数据,进行了转换

2)不能以数字开头

3)若想借由额外的命令所提供的的信息:可以采用

$(其他命令)
`...` //这里是键盘1左边的那个按键

 相当于 先执行这里面的命令得出结果带入原命令

4)若想变量新加信息

原变量名=${原变量名}添加的信息

5)若变量要在其他子程序执行,需要设置为环境变量

export 变量名

6)通常大写为系统默认变量

变量的删除,替换,与测试

1)删除部分内容:

变量#+正则 代表从左到右删除,且惰性 
变量##+正则 代表从左到右删除,选取最大的
% 表示从右到左 :与#规则一样,也有%%

2)替换部分内容:

变量名/旧字符串/新字符串:第一个匹配的旧字符串会替换为新字符串
变量名//旧字符串/新字符串:全部符合的都会替换

3)测试变量是否存在:

比较复杂,没搞懂意思 ,通过+ = - 号来完成

环境变量的功能

使用纯大写字母来设置的变量一般为系统内定需要的变量

set:观察所有变量-环境+自定义

env:观察环境变量

export:观察环境变量 并且 可以把自定义变量转换为环境变量

export 变量名 #转换为环境变量

注意:这样能让子进程使用-------子进程仅会继承父进程的环境变量

 locale:查看支持的语系,其中LANG,LC_ALL为主要的设置变量

Linux下的Locale详解 - idlo - 博客园 (cnblogs)

重要环境变量

PATH:执行文件查找路径

LANG:语系数据 ,必要时可以手动设置

RANDOM:返回一个随机数

PS1:提示符的显示设置,可以自行设置 

$  :代表shell进程号

?:上一个命令的返回结果 0为成功执行

变量键盘读取

1)read

read [-pt] 变量名
等待键盘输入 
//将键盘输入赋值给变量 ,无则创建并赋值 
-p:接提示字符 -让输入行有提示字符
-t:接秒数-- 等待时间 -防止无限等待 

2) declar/typeset

declare [-aixr] 变量名=...
//定义类型并赋值
-a :定义为数组(array)
-i:定义为整型
-x: 定义为环境变量 == export +变量名
-r:设为只读变量

注意:bash数组跟c语言的数组差不多

          变量类型默认为字符串 

          bash数值运算默认整数

命名别名与历史命令

alias

alias 新命令(别名)= 原命令(可以拼接多个命令)

1)直接输入 会显示所有的命令别名、

2)变量 和命令别名的不同: 变量是echo才能查看内容 ,而命令别名也是命令 --执行

历史命令:history

history n //显示最近的n条命令
history [-c]// 清除全部内容
history [-raw] histfiles
-a:新增的添加到histfiles
-r:读取histfiles 到当前shell history记录中
-w:记录内容写入 histfiles

1) 每次登录bash时,会到目录 ~/.bash_history  读取曾经命令

      注销时,会讲新增的命令更新到~/.bash_history中

2)执行特定历史命令操作 

!number :执行第number条命令
!!:执行上一条命令
!ls:执行最近以ls开头的命令

3)如果同时登录好几个bash界面,且用户相同,那么记录会互相覆盖

     -- 可以登录单一bash 用任务管理器切换任务,可以记录全部内容。

4)无法记录时间,但能通过~/.bash_history  设置

Bash shell 操作环境

命令的查找顺序*

当我们执行一个命令时,执行的是哪个具体命令呢,按照以下顺序查找并执行

1)以绝对命令执行(如/bin/ls)

2)由alias找到的别名来执行

3)由bash内置的(built in)命令来执行

4)通过$PATH变量的顺序查找来执行

这个顺序可以通过 type -a 命令名 来查询

bash的欢迎与登录信息

/etc/issue :终端界面登录信息,通过修改此文件 自定义欢迎信息

/etc/issue: telnet连接到主机时显示的信息

内含\ 转义:

环境配置文件

login shell:登录时需要输入账号密码的界面

1)调用系统整体设置 :/etc/profile 

     而/etc/profile 又会调用其他文件

2)调用 用户个人设置:~/.bash_profile 或 ~/.bash_login 或 ~/.bash_profile

      而又会调用  ~/.bashrc -->

      再调用 /etc/bashrc : 整体环境设置 如 根据UID设置umask值,提示字符等,调用*sh等设置

non-login shell:不需要再重新登录操作 的界面(如 su-)

login shell和non-login shell_肖邦_莫扎特的博客-CSDN博客_non-login shell

1)仅调用~/.bashrc    .

各文件内容

/etc/profile :调用系统整体设置 

~/.bash_profile 或 ~/.bash_login 或 ~/.bash_profile :调用 用户个人设置

/etc/profile.d/*.sh :众多文件,规定了操作界面的颜色,别名等

/etc/locale.conf: 决定了bash默认使用何种语系

/etc/bashrc : 整体环境设置 如 根据UID设置umask值,提示字符等,调用*sh等设置

/etc/man_db.conf :使用man时候, man page的路径到哪去寻找

~/.bash_history: 记录的历史命令

~/.bash_logour:注销bash后 ,系统帮我做完的操作

读入配置文件命令

立即读入到目前的shell环境中来(更新?)

source 或 . 

source 配置文件名
. 配置文件名

终端环境设置(stty/set)

tty1-tty6的终端界面中

stty

stty -a  //列出所有参数快捷键
stty erase ^h //把erase快捷键换成 ctrl+h
^表示 ctrl键
intr:中断当前程序
quit:退出当前程序
erase:向后删除字符
kill:删除当前一行所有文字
eof:代表输入结束
stop:停止屏幕输出
start:重启停止的程序
susp:送出一个terminal stop信号给正在运行的程序

set

Linux set命令 | 菜鸟教程 (runoob)

set -u //设置这个参数
set +u// 取消 设置这个参数

通配符与特殊符号:

通配符:

通配符不是正则表达式,通配符(wildcard)代表的是bash操作接口的一个功能

而正则表达式是一个字符串的处理方式

特殊符号:

数据重定向

三个标准流:

标准输入(stdin): 代码0    < 或 <<  默认键盘
标准输出(stdout):代码1  > 或 >>  默认屏幕
标准错误输出(stderr):代码2 2> 或 2>>  默认屏幕

1)stdout,stderr 默认输出是屏幕  可以利用 >等重定向(输出到指定的位置)

2)标准输出指的是命令执行返回的正确信息,stderr是命令执行失败所返回的信息

3)重定向输出时 指定文件,若不存在则会自动建立一个新文件

4)>  2> 会覆盖文件内容 ,>> 2>> 则是累加

5)<指定输入流的来源 <<表示边界符号,代表结束的输入字符 

6)当stdout,stderr 要输出到同一个文件夹时,必须使用特殊语法,而不能连续指定文件

---- 2>&1 :将2重定向为  1的流设备 -stderr重定向到 stdout的定向文件

find /home -name .bashrc > list  2> list //错误 会导致乱序
find /home -name .bashrc > list  2>&1 //特殊语法 

命令执行判断符号

0):利用 分号 来一行执行多条命令语句 

利用命令执行的返回变量 &?(成功返回0) 来条件执行 相关命令 

&& :前句执行成功,后句才执行

||:前失败后面才执行

cmd1 && cmd2  //cmd1 执行成功(返回0) 后面才执行
cmd1 || cmd2  //cmd1 执行失败 后面才执行

1) 是从左到右顺序执行的,多个条件判断符号组合时,应该注意顺序 

2) 可以  && + || 组合达到三段式的效果

cmd1 && cmd2 || cmd3

等效于 : if(cmd1执行成功) 执行cmd2 else 执行 cmd3

注意 : && || 顺序不能变,因为返回值不一样

管道 pipe |

通过管道  |  + 命令来处理数据 

每个管道 |  :只能处理stdout-标准输出的数据 ,也就是后一个命令能处理stdout的数据

选取命令 cut ,grep(重点*)

两个命令都只能一行一行的处理信息

1) cut 

  输出特定的字符

cut -d '分隔字符' -f n // 输出 第n个被分开的字符串
1) -d 必须 搭配 -f 使用
2) 分隔符不会输出
cut -c [字符个数区间]  //显示区间内的字符

2)grep-Globally search a Regular Expression and Print   

输出特定的字符的一行

grep -acinv  '查找字符' filename
// 查找到一行中的匹配字符 若有 则输出此行
   若没有 则检索总文本中的下一行

Linux grep 命令 | 菜鸟教程 (runoob)

-A+n:after,除了选定的行,后面的n行也列出来

-B+n:befer 除了选定的行,前面的n行也列出来



排序命令 sort uniq 

根据行进行排序

1) sort   

默认文本+升序 进行排序,根据语系编码进行排序 

sort -fbMnrtuk fileNmae / stdin

Linux sort命令 | 菜鸟教程 (runoob)

2) uniq 

合并相同的数据行

uniq -ic
-i:忽略大小写
-c:进行计数

统计行数等 wc

 wc- word count

  对文本进行计数 --默认全部列出

wc -lwm
-l:列出行
-w:列出有多少英文字符
-m:多少字符

列:查看有多少个用户名

双重定向 tee

既输出到文件,又输出到stdout

tee -a file
-a:以累加的的方式保存至file

字符转换命令:tr,col,jion,paste,expand

1) tr

删除或替换一段信息当中的文字 

tr -ds str1 str2
-d 删除str1,此时无需str2
-s 将str1 替换为 str2

2) col : 讲tab键转换为空格

3)join 

指定分隔符,对比栏位,若相同:  将对比栏位复制到最前方 并且 合并两条数据

默认:空格符分割-对比第一个栏位的数据

jion -ti12 file1 file2

-t:指定分隔符,配合 -1 -2 使用
-i 无视大小写
-1 n :以file1 的第n个分割栏位来分析
-2 n :以file2 的第n个分割栏位来分析

3) paste

合并两个文件的数据,中间用tab来隔开

4) expand :将tab 转换为空格键

划分文件命令:split

将文件按行或者按大小划分为小文件 ,默认 前缀+a,前缀+b。。。

split -bl file 源文件 前缀
-b:接要划分成的子文件大小
-l:按行来划分

Linux split命令 | 菜鸟教程 (runoob)

分割参数: xargs

可配合非管道命令使用,将数据分割为指定的参数供命令使用

xargs -0epn command
-0:将特殊字符还原为一般字符
-e +EOF:指定用于结束的字符
-p:每次执行command时,都会询问
-n 次数:表示一次提供给command几个参数

列:id这个命令只能接受一个参数 而 stdout输出的数据有很多组 -通过xargs分为一个个参数提供给id命令

-->通过cut+head 取出3个GID 提供给xargs,通过xargs 执行三次 id命令

cut -d ':' -f1 /etc/passwd | head -n3 | xargs -p -n1 id

关于减号 - 的用途 

代表前一个命令的 stdout 或者 stdin 

第十一章 正则表达式与文件格式化处理

正则表达式是一种字符串表达方式,用于搜寻检索字符串--与通配符不是一个东西 

除基础正则表达式还有扩展正则表达式(群组等),本章介绍基础正则表达式 -在LANG=C的情况下

注意点:

1)语系的编码顺序对正则表达式有影响 

如 LANG=C 时 :0123。。ABC。。abc..

而 LANG=zh_CN:01234.。。aAbB。。。

如果我们使用 [A-Z]时 ,选定的字符范围并不一样 

2)符号意义 :

基础正则表达式集合

注意点:

1)与bash通配符不一样, 如bash下 *表示任意多个字符 ,而正则表达式* 表示重复前一个字符0+次

2) {} 和 . 都要通过\转义 

3) *和 {} 是限定前一个字符个数的意思 -前面必须有一个任意字符,而.则表示任意一个字符 

->.* 表示 多个(0-n个)任意字符

扩展正则表达式

grep时 要加 -E 参数 或直接使用egrep命令 表示使用的是扩展正则表达式 

3)+?是是限定前一个字符个数的意思

 

sed管道命令 

stream edit :流式编辑器

可以对数据进行很多操作

sed -nefr  'n1,n2操作代码'
-n:使用安静模式,只有经过处理的行才会显示。默认全部显示
-e:命令行模式上进行sed操作,可以省略;但有多个操作时不能省略
-f filename:此文件内内容是 sed操作
-r:使用扩展正则表达式
-i:直接按操作修改源文件,不会输出到屏幕

操作代码:
a +字符:在目前的下一行新增这些字符
i +字符:在目前的上一行新增这些字符
c +字符:替换 n1-n2 之间的行
s:搜索+替换功能 以 s/1/2/g 形式出现--1替换为2
d :删除
p:打印 一般使用-n 安静模式--否则会重复输出

1)n1,n2 不是一定要出现,一般代表行数

2)a i 新增行时,若需要新增多行 :应 \ + -> 表示字符

/etc/passwd | sed '2a 第一行\
> 第二行 ' 

 在第二行下一行添加 两行数据 

3)sed 后面一定要用 ' ' 括起来

4)替换功能*常用 :' s/指定字符/要替换成的字符/g' 支持正则表达式

5)-i 非常危险,可以直接不通过编辑器等修改内容

文件格式化 printf

不是管道命令,需要人为的将数据送给此命令

1)与c语言当中模式几乎一样

2)也是对一行做处理 ,格式(如%s)个数 需要与一行当中数据个数 一致

数据处理工具 awk

 awk命令英文单词缩写:Aho、(Peter)Weinberg和(Brain)Kernighan,没错,awk是三个人名的缩写,正式这三个人创造了amk——一个优秀的样式扫描与处理工具。

行处理工具

适合处理一行中分段数据(以分隔符分为的栏)

awk '条件{操作}...' filename

1)可以有多个条件+操作 ;条件可以省略-表示直接执行操作;

     多个条件-操作之间分隔:a 用; 间隔  b 用enter分隔

2)条件符号是><==!=等c语言逻辑符号 ;可以用if(条件) 使条件放在操作{}内

3)自动以 空白符为分割 ; &0代表一整行 &1 第一栏 &2代表第二栏 ,以此类推

4)变量可以不带&直接使用 ; awk自带变量:

 5)流程:

-->因此我们修改FS分隔变量时,第一行并不准确(第二行才开始生效)

>此时用BEGIN关键字来先修改变量内容

awk 'BEGIN{FS=" " }...'

 6)由于awk后面自动接' ' ,则操作中都要用双引号'' '' 来表示原单引号操作 

列子:无条件列出 regular.txt 的第一栏

文件对比工具diff cmp

diff

1)通常比较纯ASCII ,文件差异不大-通常新旧版本之间

2)按行比较 

3)以第二个参数为基准比较(新文件)

diff - oldFile newFile
//有很多参数 看下面连接

Linux diff 命令 | 菜鸟教程 (runoob)

4)也可以比较不同目录下 相同文件名里的内容

cmp

主要用字节单位去比较,当然可以用于对比二进制文件、

cmp -l file1 file2

Linux cmp 命令 | 菜鸟教程 (runoob)

补丁文件 patch

1)用diff命令+重定向 生成.patch补丁文件 

$ diff passwd.old passwd.new > passwd.patch

--------------------

$ patch -p0 testfile1 testfile.patch    #使用补丁程序升级文件 

Linux patch命令 | 菜鸟教程 (runoob)

-p0:数字代表目录层数 p0代表都在当前目录内 

文件打印设置 pr

自行查看 ,可以设置页码,标头等 

注意:

1)正则表达式自带的符号需要表示原本含义时:利用 \ 转义

2)最后一题答案-除去#,空白,显示英文开头行 

利用 sed s/ / / g 来替换 +grep 选定一行 

第十二章 shell脚本

基本

概念

shell脚本是利用shell功能写的一个程序,是纯文本文件;将命令写在里面达到集合操作的目的;

早期的dos时代的.BAT批处理类似;

是利用shell与相关工具命令,所以不需要编译即可执行

功能:最简单的就是简化一系列命令,封装效果;

建议用vim编写,能自动纠错;

跟标准意义上的语言不一样,速度比不上传统语言;大量计算上速度较慢,cpu使用多

如何执行

假设 脚本名为 shell.sh

1)一定要设定wr权限,才能正常执行----chmod 7777  shell.sh

2)  绝对路径或者 ./shell  :这个./就代表当前目录(不能不加入PATH又直接执行shell.sh--查找不到

3)将目录放到PATH变量内(加入了就可以直接 shell.sh    来执行了)

4)bash shell.sh 或者 sh shell.sh  来执行

                由于是调用bash功能,所以只需要有r权限

                sh其实是bash 的链接文件 

sh命令调试脚本

sh [-nv] shell.sh
// -n    不执行脚本,只检查语法
   -v    执行脚本前,先输出脚本内容
   -x    一步一步显示执行过程+结果 (调试很常用--单步调试

注意点

环境

1)#!bash名:表示要使用的bash 如---- #!/bin/bash -->使用bin下的bash

2)#为注释

3)exit 0 表示返回系统的值,0为正常

4)要养成良好的习惯

                脚本功能;版本信息;特殊命令解释;预先设置声明;--跟编写其他语言程序一样

变量内容

1)可以使用read -p +提醒字符串 +变量 来交互

 变量的检查 

num=${a:-表达式}
# 若变量a(配合上一行read 交换输入变量)为空或不存在 则用指定表达式代替

2)bash默认只能支持整数运算,有小数点会报错

3)通过这种来赋值或者输出

赋值:3种

等号两边不能空格

表示变量的符号$后不能空格

Linux let 命令 | 菜鸟教程

shell脚本的作用,shell脚本变量的定义和三种赋值方式【shell脚本的学习笔记一】_oba没有马的博客-CSDN博客_linux shell脚本学习

i=0
   let i=i+1
   i=$[$i+1]
   i=$(($i+1))
   i=${i}+1       这种不行 会变成字符串 3+1
var= $( (变量内容 -->${变量名}操作码${变量名} ) )

输出:

echo  $( (变量内容 -->${变量名}操作码${变量名} ) )

        一定要两个括号

        ${变量名}来表示变量内容,字符串里也可以

4)通过 “表达式” | bc  管道命令来浮点数运算

"${变量名}操作码${变量名}" |bc

        必须要在引号里面

总实例 

->

当a或b是小数时 低四行会报错

执行方式差异

sh 或 直接执行方式执行:会在子进程bash环境执行--创建的变量等都会消失

source : 会在当前bash环境下执行,共享变量 

--⚠️:mac 终端下  source命令执行完shell脚本 终端会自动结束(exit 0 了当前进程shell)

判断命令/符号

test(返回值

        可以判断数字比较,字符串比较,文件是否存在等;配合 && || 等来进行操作

Shell test 命令 | 菜鸟教程

[ ] 

1 括号两边 以及 每一个组件(符号,变量等)之间必须空格

2 变量以及常量 要用引号扩起来

3 -参数 跟test一样 

shell脚本默认变量

        在执行文件里面可以使用的默认变量---带命令行参数的脚本

默认:

         在脚本内使用

shift n 指令:位移参数

        相当于删除前n几个参数(不包括文件名)  n没有默认右移1

 

---------- 

常用语法

注意 : 不再像c语言一样是 ()  ,[ ] 来判断----所以要记得空格

               变量的赋值两边不能有空格

1 if

if [ ] ;then

elif [ ] ;then

else 

fi

2 case ${} in 

            一个变量多次判断 ;

             每一个小判断用 ) +程序段+;; 来隔开

 1 read -p "请输入一个变量:  " a
  2 case ${a} in
  3         "hello")
  4                 echo "hello!"
  5 ;;
  6         "")
  7                 echo "不能为空"
  8 ;;
  9         *)#表示其他情况
 10                 echo "不知到你输入的是什么"
 11 esac
 12 exit 1;

3 while / until  + do..done

        until     [ 条件 ] :表示条件满足才退出,与while相反 

  1 i=0
  2 s=0
  3 while [ $i != 100 ]# 每一个部件要空格
  4 do  #do--done 规定循环段        
  5         let i++; #let命令自增
  6         let s=s+i;
  7 done
  8 echo $s #可以不加{}表示变量,加了规范且不会误认为为字符串
  9 exit 1

4 for 

 分为范围for 和 标准for

 范围for:for 变量 in ....

  1 users=$(cut -d ':' -f1 /etc/passwd)
  2 for unername in $users
  3 do
  4         id $unername
  5 done
  6 exit 1          

普通for :一定要两层括号

for (( ; ; ))
do 
..
done

-->

  1 read -p  "请输入一个累加数字: " s
  2 count=0
  3 for (( i=1; i<=$s ; i++ ))
  4 do
  5         echo $i
  6         let count=count+$i
  7 
  8 done
  9 echo "1+2+...${s}的结果为:$count"
 10 exit 1
~                

5 函数 function

        定义函数名时要加上 function 前缀

        调用函数时不用括号,调用时输入的形参 会在函数内覆盖脚本默认变量

        定义的函数一定要写在调用前面 ---不然无法识别是函数

  1 function print(){
  2 echo  "hello! $1\n" #覆盖默认变量 
  3 }
  4 print 小明 #调用时不用括号 且后面的小明在函数内就是 $1 --起到了传递参数的作>    用
  5 exit 1

        

        

第十三章  Linux账号管理与ACL权限设置

        

账号与用户组

UID / GID

        操作系统只认识具体的ID(一组号码)--也就是UID(拥有人ID)与GID(用户组ID)

        ls 显示的明文id 其实是读取ID之后转换而来的

/etc/passwd      与 /etc/shadow

终端登录过程

/etc/passwd内容

root:*:0:0:System Administrator:/var/root:/bin/sh
--->
账号名称:密码:UID:GID:用户信息说明栏:家目录:shell
密码是加密过的--单向密码

        对于UID范围:

0:系统管理员,不一定是root
1~999:系统账号
1000-60000:给一般用户使用

/etc/shadow内容

        将密码的一些属性单独拿出来放在此文件中

账号名称:加密密码:最近修改密码日期:不可修改的天数:需要重新修改的天数:需要修改前的警告天数:密码过期后宽限时间:账号失效日期:保留

用户组---etc/group 与 /etc/gshadow 

初始用户组与有效用户组

         一个用户(UID)可以拥有多个用户组--但只有一个初始用户组-->passwd第四栏目

        当创建文件时文件属性:拥有者为本UID 和 本UID初始用户组

        groups命令查看当前用户所支持的用户组---第一个为初始用户组

        /etc/group内第四栏目表示此用户组 有效的用户(UID)---不包括初始用户组

        newgrp切换用户组--但只能切换已有当用户组---且时新shell环境下获得,跟su一样exit退出

/etc/group内容:

组名/用户组密码/GID/此用户组支持的 用户名
用户组密码通常给用户组管理员使用,不常见 若为!表示无组管理员账户;

/etc/gshadown内容:

组名/密码栏/用户组管理员账号/组支持的用户名(与group当内容一样

用户加入一个用户组两种方式:

        1  通过root利用usermod帮忙加入

        2 通过用户组管理员以gpasswd帮忙加入 

账号管理

        通过useradd+passwd命令来创建新用户

useradd相关

        创建新用户Linux useradd命令 | 菜鸟教程

useradd [-mMnr][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-s <shell>][-u <uid>][用户帐号]
注意: g表示初始用户组 G额外用户组

        使用默认值时,会帮我们默认处理

                1 在/etc/passwd里面建立一行用户数据(gid,uid等)

                2 在/etc/shadow里面将此账号的密码相关参数写入,但尚未有密码(需通过passwd创建

                3 在/etc/group 里面加入一个同名用户组(如果指定了存在用户组,则不会新增

                4 在/home下建立一个与用户同名的家目录,权限为700 (系统用户不会默认增添家目录

        useradd默认值:useradd -D 查看 (是/etc/default/useradd调出来的)

                包括默认GID

                私有用户组机制(某些版本如Centos--创建一个相同用户组)

                共有用户组机制(共拥有一个用户组,方便共享)

                家目录内容参考:/etc/skel/*        ,也就是复制过去的

                UID/GID参数 参考:/etc/login.defs        

passwd 

Linux passwd命令 | 菜鸟教程

passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]

                如果没有填username默认修改自身账户密码

                root可以不用输入旧密码更改他人密码 ,且密码几乎都会被接受

                新密码的设定受到到PAM模块(/etc/pam.d/passwd 文件描述机制 )     的管理                

                可以用stdin的内容来指定内容---- >

stdin内容 | passed --stdin username

chage 显示密码相关参数

chage -[ldEImMW] username
通常使用-l来显示全部具体参数

usermod 微调账号设置

usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s <shell>][-u <uid>][用户帐号]

Linux usermod命令 | 菜鸟教程

userdel 删除用户相关数据

userdel -r username

-r:连同家目录一起删除

(可能保留有其他文件,如mailbox,crontab等

        通常不再使用此用户的情况下使用

        ----如果只是想暂时不使用,/etc/shadow第八个字段设置为0

id/finger/chfn/chsh--用户功能

id 查看用户gid/uid等消息

finger 查看用户相关信息:基本都是 passwd文件里的内容

chfn 改变finger信息,需要密码

chsh 改变用户shell

用户组管理

基本 groupadd等

groupadd 

groupadd [-g gid [-o]] [-r] [-f] 用户组名称
-g:指定新建工作组的 id;
-r:创建系统工作组,系统工作组的组 ID 小于 500;

groupmod :与usermod类似

groupdel +用户组名:删除(必须要确定不是某账号的初始用户组 

设置用户组管理员 gpasswd

        分为root操作部分(添加管理员) 和 用户组管理员操作部分

外部身份验证系统(暂略

        可能会使用到其他外部的身份验证服务器所提供的验证身份功能

        centOS提供了 authconfig-tui 命令供我们参考 

ACL

        以单独 文件为对象,添加 用户/用户组的特殊权限;并提供默认权限设置(mask)

        UNIX-like操作系统额外附加选项,几乎自动支持ALC(dmesg | -i aci 命令查看)

getfacl

        filesystem ACL:查看该文件的ACL特殊权限

getfacl 文件名(目录)

        1  ls时 第一栏会多出来一行'+'

        2 #的内容为默认内容(拥有者,默认用户组等

        3  :::特定的ALC权限 用:隔开 表示  用户/组:用户名/组名:特权限;-第二栏为空表示拥有者

setfacl

        设置特殊权限:一般都要加上-m选项

setfacl -bkRd [-m或-x 表达式】 目标文件名
  -m:设置后续acl参数 
  -x:删除后续acl参数  (删除指定的alc权限 --权限字段不能留白用'-'表示
  -b:删除全部的acl参数
  -k:删除默认的acl参数
  -R:递归设置acl,包括子目录
  -d:设置默认acl 只对目录有效--mask-在该目录新建的数据会默认设置此特殊权限

      表达式

    [u|g:userlist | groupList :权限]   
---- |表示或  u表示user对应用户列表userlist


    d:u|g:userlist | groupList :权限
----多一个d表示 -d
    

 

        关于mask:还表示所能设置ALC权限的最大值;

用户身份切换

        有su 和 sudo 最重要区别是sudo只需要输入调用用户的密码

su 切换用户

  除root外 需要知道切换到的用户的密码才能成功(如 su- 需要输入root密码

su - 
---    表示登陆shell方式切换到root
su 
---    表示非登陆方式切换到shell 很多原本变量内容不会被修改

sudo 允许的用户执行允许的命令

        需要通过/etc/sudoers    文件(==visudo命令)来修改访问许可

        1 sudo后面直接接命令 表示默认切换到root用户执行此命令

        2 只有被运行的用户才能使用sudo

        3 /etc/sudoers文件只能root或whell用户组能查看

-r--r-----  1 root  wheel  1594 Jul 20 20:03 /etc/sudoers

        4 使用sudo时 只需要输入自己的密码即可(如并不需要知道root的密码)

/etc/sudoers

       实际内容

                四栏:

用户账号    登陆者的来源主机名 = 可切换到的身份 可执行的命令
1 %开头表示允许的用户组 (如admin
2 可执行的命令务必用绝对路径

        添加允许使用sudo用户方法

        1 自己修改 /etc/sudoers 内容(格式必须一致

        2 使用 visudo命令(== vi /etc/sudoers)

        3 将用户加入到wheel用户组(如上图到admin用户组)

        第四栏(可使用命令)规范

        1 务必使用绝对命令

        2 要严格规范命令  ALL很危险(如可以使用 su - 切换到root为所欲为

        3 可以规定具体命令+具体参数;最前面加 表示不允许执行的意思

        4 可以使用自带的宏功能?通过别名来管理权限

sudo 的配置详解_besidemyself的博客-CSDN博客_sudo 配置

PAM 模块

/sbin/nologin 无登陆的shell

        无法登陆主机获取交互的shell,但能使用系统资源(系统账号默认此shell)

        如果有/etc/nologin.txt这个文件,则被拒绝时会显示此文件内容;

简介:

        Pluggable Authentication Modules :插入式验证程序,可以看作API ,可以根据需求调用后返回结果(0/1);模块一般为 .so文件 (动态链接库?)

配置文件 /etc/pam.d/*

        调用时,PAM查看会目录内的配置文件,并根据配置文件有序调用模块(.so)

/etc/pam.d/passwd:

内容

验证类别 控制标准 PAM模块与该模块参数

        

    5   include表示继续调用第三栏的配置文件

        

相关文件:p455

      

/etc/pam.d/*:每个程序的PAM配置文件
/lib65/security/*:存放具体模块
/etc/security/*:其他PAM环境的配置文件
/usr/share/doc/pam-*/ :PAM说明文件
/etc/securetty/:会影响到root可登陆的安全终端
/etc/nologin :如果系统中存在 那么普通用户登陆就会失败
/var/log/secure:记录登陆时PAM产生的错误信息
/var/log/messages:记录login消息

        

login的PAM验证流程

        auth->account->password->session 

        通过类别+标记+具体模块 来实现验证过程

注意点:PAM在调用时才给予设置(修改了无法立即生效)

主机上的消息传递

查询用户 w/who/last/lastlog

        tty==teletypewriter

w和who 用来查询目前已经登陆的用户

last/lastlog用来查询最后登陆的时间

用户之间发送消息 write/mesg/wall

        writ

write 用户名 用户使用的tty +回车
....内容
EOF(control+D)

        mesg:对于是否接收消息

mesg n
表示关闭接受消息,但root传来的消息还是会接受

        wall

wall "内容"
对于所有在线用户发送消息,包括自己

        

接受发送邮件mail

        发

mail -s "标题" 用户 +回车
...内容

.或者EOF结束内容

        可以利用重定向进行发送:

mail -s "标题" + 用户 <fileName

        接受

mail
就会弹出几个未读邮件
mail里 &表示提示字符 :输入? 查看邮件

        常用命令:

创建大量账号方法

 账号检查工具 pwck/pwconv/pwunconv/chpasswd

鳥哥私房菜 - 第十三章、Linux 帳號管理與 ACL 權限設定

shell脚本创建样本

[root@study ~]# vim accountadd.sh
#!/bin/bash
# This shell script will create amount of linux login accounts for you.
# 1. check the "accountadd.txt" file exist? you must create that file manually.
#    one account name one line in the "accountadd.txt" file.
# 2. use openssl to create users password.
# 3. User must change his password in his first login.
# 4. more options check the following url:
# http://linux.vbird/linux_basic/0410accountmanager.php#manual_amount
# 2015/07/22    VBird
export PATH=/bin:/sbin:/usr/bin:/usr/sbin

# 0. userinput
usergroup=""                   # if your account need secondary group, add here.
pwmech="openssl"               # "openssl" or "account" is needed.
homeperm="no"                  # if "yes" then I will modify home dir permission to 711

# 1. check the accountadd.txt file
action="${1}"                  # "create" is useradd and "delete" is userdel.
if [ ! -f accountadd.txt ]; then
	echo "There is no accountadd.txt file, stop here."
        exit 1
fi

[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)

for username in ${usernames} #迭代文件内名字 重点
do
    case ${action} in
        "create")
            [ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""
            useradd ${usegrp} ${username}               # 新增帳號
            [ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username}
            echo ${usepw} | passwd --stdin ${username}  # 建立密碼
            chage -d 0 ${username}                      # 強制登入修改密碼
            [ "${homeperm}" == "yes" ] && chmod 711 /home/${username}
	    echo "username=${username}, password=${usepw}" >> outputpw.txt
            ;;
        "delete")
            echo "deleting ${username}"
            userdel -r ${username}
            ;;
        *)
            echo "Usage: $0 [create|delete]"
            ;;
    esac
done

第十四章 磁盘配额 与 高级文件系统

quota配额

       适用情况:

quota 比較常使用的幾個情況是:

  • 針對 WWW server ,例如:每個人的網頁空間的容量限制!
  • 針對 mail server,例如:每個人的郵件空間限制。
  • 針對 file server,例如:每個人最大的可用網路硬碟空間 (教學環境中最常見!)

上頭講的是針對網路服務的設計,如果是針對 Linux 系統主機上面的設定那麼使用的方向有底下這一些:主机上三种本篇主要讲这个

  • 限制某一群組所能使用的最大磁碟配額 (使用群組限制):
    你可以將你的主機上的使用者分門別類,有點像是目前很流行的付費與免付費會員制的情況, 你比較喜好的那一群的使用配額就可以給高一些!呵呵! ^_^...
     
  • 限制某一使用者的最大磁碟配額 (使用使用者限制):
    在限制了群組之後,你也可以再繼續針對個人來進行限制,使得同一群組之下還可以有更公平的分配!
     
  • 限制某一目錄 (directory, project---xfs新功能) 的最大磁碟配額:
    在舊版的 CentOS 當中,使用的預設檔案系統為 EXT 家族,這種檔案系統的磁碟配額主要是針對整個檔案系統來處理,所以大多針對『掛載點』進行設計。 新的 xfs 可以使用 project 這種模式,就能夠針對個別的目錄 (非檔案系統喔) 來設計磁碟配額耶!超棒的!

-----xfs_quota命令是整合在文件系统内的,比UNIX工具快速,本章用这个命令做为列子

        需要注意:

        ext仅能支持整个文件系统

        内核必须支持磁盘配额 且 只对一般用户有效(无法限制root

        若启用SELinux,则不是所有目录都可以设置配额

        需要先确定文件系统,不同文件系统处理格式不太一样(本章用xfs

xfs--- > 

        1 可以针对用户,用户组,目录(用户组与目录不能同时设置

        2  限制inode数量(限制文件数量) /  限制block数量(磁盘容量-常见)

        3 软限制soft 与 硬限制hard :当达到软限制时会警告,若警告时间内(宽限时间内)还超过soft则 soft==hard 即被锁定

        4 对于不同文件系统目录想要统一限额,可以将另一个目录完整的移到xfs文件系统目录如(/home)-->

將 /var/spool/mail 這個目錄完整的移動到 /home 底下;
利用 ln -s /home/mail /var/spool/mail 來建立連結資料;
將 /home 進行 quota 限額設定

Linux ln 命令 | 菜鸟教程

xfs_quota

        流程: 假如xfs文件系统挂载在 /home这个目录下  

        下文 【】表示可加可不加

                1 通过重新挂载来启动quota功能-->通过/etc/fstab 文件,修改默认挂载内容(第四栏--文件挂载参数)

[root@study ~]# vim /etc/fstab
/dev/mapper/centos-home  /home  xfs  defaults,usrquota,grpquota   0 0
# 第四栏加上usrquota/grpquota/prjquota(注意目录与用户组不能同时加

[root@study ~]# umount /home
[root@study ~]# mount -a

                2 利用命令查看

[root@study ~]# xfs_quota -x -c "指令" [掛載點]
選項與參數:
-x  :專家模式,後續才能夠加入 -c 的指令參數喔!
-c  :後面加的就是指令,這個小節我們先來談談數據回報的指令
指令:
      print :單純的列出目前主機內的檔案系統參數等資料
      df    :與原本的 df 一樣的功能,可以加上 -b (block) -i (inode) -h (加上單位) 等
      report:列出目前的 quota 項目,有 -ugr (user/group/project) 及 -bi 等資料
      state :說明目前支援 quota 的檔案系統的資訊,有沒有起動相關項目等

               3  设置方式

针对用户/用户组配置设置方式     :

[root@study ~]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
# name可以是用户名,用户组名,创建的project名
[root@study ~]# xfs_quota -x -c "timer [-ug] [-bir] Ndays"
選項與參數:
limit :實際限制的項目,可以針對 user/group 來限制,限制的項目有
        bsoft/bhard : block 的 soft/hard 限制值,可以加單位
        isoft/ihard : inode 的 soft/hard 限制值
        name        : 就是用戶/群組的名稱啊!
timer :用來設定 宽限时间,也是可以針對 user/group 以及 block/inode 設定

        

针对目录设置方式

         1 先指定好 目录名称(--写入/etc/projects)和 目录标识符号(随便标识符--写入/etc/projid)写进对应文件内

# 2.1 指定專案識別碼與目錄的對應在 /etc/projects
[root@study ~]# echo "11:/home/myquota" >> /etc/projects

# 2.2 規範專案名稱與識別碼的對應在 /etc/projid
[root@study ~]# echo "myquotaproject:11" >> /etc/projid

        2  初始化名称

 xfs_quota -x -c "project -s myquotaproject"

        3 设置

[root@study ~]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /home
[root@study ~]# xfs_quota -x -c "report -pbih " /home
Project quota on /home (/dev/mapper/centos-home)
                            Blocks                            Inodes
Project ID       Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myquotaproject      0   450M   500M  00 [------]      1      0      0  00 [------]

xfs额外管理 与一览表 

  • disable:暫時取消 quota 的限制,但其實系統還是在計算 quota 中,只是沒有管制而已!應該算最有用的功能囉!
  • enable:就是回復到正常管制的狀態中,與 disable 可以互相取消、啟用!
  • off:完全關閉 quota 的限制,使用了這個狀態後,你只有卸載再重新掛載才能夠再次的啟動 quota 喔!也就是說, 用了 off 狀態後,你無法使用 enable 再次復原 quota 的管制喔!注意不要亂用這個狀態!一般建議用 disable 即可,除非你需要執行 remove 的動作!
  • remove:必須要在 off 的狀態下才能夠執行的指令~這個 remove 可以『移除』quota 的限制設定,例如要取消 project 的設定, 無須重新設定為 0 喔!只要 remove -p 就可以了!

软件磁盘阵列RAID

RAID种类

RAID0:

        一个数据同时写入n快磁盘(等量分配),读取写入速度都是N倍; 无备份

RAID1:

        一个数据同时写入N份磁盘中,真实有效的数据只有一份,其他N-1全是备份

RAID10==1+0

        先组成RAID1,再组成RAID0

RAID5/6

        5可以通过逻辑校验支持一个磁盘的损坏修复,6可以支持两个

硬件/软件RAID

        硬件有专门的磁盘阵列卡,能负责运算,速度快但价钱较高;

        所以一般用软件模拟,可以以分区或磁盘为单位,很方便;

RAID设置mdadm

        multiple devices ADM(administration)

流程:下文的/dev/md0 就代表一个RAID整体,而内部由具体分区/磁盘组合而成

 1 设置RAID:默认软件模拟RAID设备名为 /dev/md0(下文create第二栏定义的名字)

           mdadm --create


[root@study ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
選項與參數:
--create          :為建立 RAID 的選項;
--auto=yes        :決定建立後面接的軟體磁碟陣列裝置,亦即 /dev/md0, /dev/md1...
--chunk=Nk        :決定這個裝置的 chunk 大小,也可以當成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N  :使用幾個磁碟 (partition) 作為磁碟陣列的裝置
--spare-devices=N :使用幾個磁碟作為備用 (spare) 裝置
--level=[015]     :設定這組磁碟陣列的等級。支援很多,不過建議只要用 0, 1, 5 即可
--detail          :後面所接的那個磁碟陣列裝置的詳細資訊

2  查看RAID详细情况 两种方法

[root@study ~]# mdadm --detail /dev/md0 
#第一种
cat /proc/mdstat
##第二种 查看文件
显示出以下内容
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 vda8[5] vda9[4](S) vda7[2] vda6[1] vda5[0]          <==第一行
      3142656 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] <==第二

---文件内容
第一行部分:指出 md0 為 raid5 ,且使用了 vda8, vda7, vda6, vda5 等四顆磁碟裝置。每個裝置後面的中括號 [] 內的數字為此磁碟在 RAID 中的順序 (RaidDevice);至於 vda9 後面的 [S] 則代表 vda9 為 spare 之意。

第二行:此磁碟陣列擁有 3142656 個block(每個 block 單位為 1K),所以總容量約為 3GB, 使用 RAID 5 等級,寫入磁碟的小區塊 (chunk) 大小為 256K,使用 algorithm 2 磁碟陣列演算法。 [m/n] 代表此陣列需要 m 個裝置,且 n 個裝置正常運作。因此本 md0 需要 4 個裝置且這 4 個裝置均正常運作。 後面的 [UUUU] 代表的是四個所需的裝置 (就是 [m/n] 裡面的 m) 的啟動情況,U 代表正常運作,若為 _ 則代表不正常。

3  开机自动启动RAID并自动挂载

         /etc/mdadm.conf配置文件

[root@study ~]# mdadm --detail /dev/md0 | grep -i uuid
           UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
# 查到本身的uuid识别码(与系统的不同

# 设置 mdadm.conf 文件 ----- 写入上述的uuid
[root@study ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6


# 查询RAID设备UUID
[root@study ~]# blkid /dev/md0 
/dev/md0: UUID="494cb3e1-5659-4efc-873d-d0758baec523" TYPE="xfs"

#将blkid查到的UUID 写入自动挂载文件
[root@study ~]# vim /etc/fstab 
UUID=494cb3e1-5659-4efc-873d-d0758baec523  /srv/raid xfs defaults 0 0


[root@study ~]# umount /dev/md0; mount -a
[root@study ~]# df -Th /srv/raid
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/md0       xfs   3.0G  111M  2.9G   4% /srv/raid
# 你得確定可以順利掛載,並且沒有發生任何錯誤!

4  关闭RAID功能 

        由于模拟RAID功能,实际上还是用到了具体的分区或磁盘,可能发生混乱;

# 1. 先卸載且刪除設定檔內與這個 /dev/md0 有關的設定:
[root@study ~]# umount /srv/raid
[root@study ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523  /srv/raid xfs defaults 0 0
# 將這一行刪除掉!或者是註解掉也可以!

# 2. 先覆蓋掉 RAID 的 metadata 以及 XFS 的 superblock,才關閉 /dev/md0 的方法
[root@study ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
[root@study ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0  <==关闭整个RAID
#填充具体分区/磁盘
[root@study ~]# dd if=/dev/zero of=/dev/vda5 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda6 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda7 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda8 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda9 bs=1M count=10

[root@study ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none>  <==看吧!確實不存在任何陣列裝置!

[root@study ~]# vim /etc/mdadm.conf
#ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# 一樣啦!刪除他或是註解他!

    注意:要卸载设备+删除fstab内容(取消自动挂载)

                 DD命令  覆盖 实际分区或磁盘内容:相当于重新规划内容,不然会自动建立

Linux dd 命令 | 菜鸟教程

               mdadm --stop

              删除/etc/mdadm.conf内容

5  模拟出错磁盘与 加入新磁盘 

        因为有一个热备份磁盘,我们可以让一个磁盘无效以达到自动启动热备份磁盘的场景

        mdadm --manage 

[root@study ~]# mdadm --manage /dev/md[0-9] [--add 裝置] [--remove 裝置] [--fail 裝置] 
選項與參數:

--add    :會將後面的裝置加入到這個 md 中!
--remove :會將後面的裝置由這個 md 中移除
--fail   :會將後面的裝置設定成為出錯的狀態--人为设置为出错

        出错磁盘删除并加入:

     ⚠️ 装置代表的是md0(我们软件模拟的整个RIAD)内部的具体分区/磁盘组成

  1. 先從 /dev/md0 陣列中移除 /dev/vda7(--fail 的磁盘/分区) 這顆『磁碟』
  2. 整個 Linux 系統關機,拔出 /dev/vda7 這顆『磁碟』,並安裝上新的 /dev/vda7 『磁碟』,之後開機
  3. 將新的 /dev/vda7 放入 /dev/md0 陣列當中!(add命令)

LVM

        Logical Volume Manager 重点在于可以弹性调整容量

流程:

物理分区-->pv(组成LVM底层物理卷)--->vg(组成逻辑卷组,规定pe大小)-->lv(vg内分区)-->格式化文件系统

物理分区阶段:

        利用gdisk等第七章工具分出物理区

pv:

LVM最基本组成部分

  • pvcreate :將實體 partition 建立成為 PV ;
  • pvscan :搜尋目前系統裡面任何具有 PV 的磁碟;
  • pvdisplay :顯示出目前系統上面的 PV 狀態;
  • pvremove :將 PV 屬性移除,讓該 partition 不具有 PV 屬性。
pvcreate /dev/vda{5,6,7,8}
 pvscan
  PV /dev/vda3   VG centos   lvm2 [30.00 GiB / 14.00 GiB free]
  PV /dev/vda8               lvm2 [1.00 GiB]
  PV /dev/vda5               lvm2 [1.00 GiB]
  PV /dev/vda7               lvm2 [1.00 GiB]
  PV /dev/vda6               lvm2 [1.00 GiB]
  Total: 5 [34.00 GiB] / in use: 1 [30.00 GiB] / in no VG: 4 [4.00 GiB]
---->
    总/使用/未使用容量

VG:

此阶段指定LVM最小单位PE的大小(类似于物理块)

逻辑卷组VG可以自己取名字

  • vgcreate :就是主要建立 VG 的指令啦!他的參數比較多,等一下介紹。
  • vgscan :搜尋系統上面是否有 VG 存在?
  • vgdisplay :顯示目前系統上面的 VG 狀態;
  • vgextend :在 VG 內增加額外的 PV ;
  • vgreduce :在 VG 內移除 PV;
  • vgchange :設定 VG 是否啟動 (active);
  • vgremove :刪除一個 VG 

vgcreate [-s N[mgt]] VG名稱 PV名稱
選項與參數:
-s :後面接 PE 的大小 (size) ,單位可以是 m, g, t (大小寫均可)

LV 

        类似于磁盘的分区,LV里包含很多PE,总容量得是PE的整数倍

  • lvcreate :建立 LV 啦!
  • lvscan :查詢系統上面的 LV ;
  • lvdisplay :顯示系統上面的 LV 狀態啊!
  • lvextend :在 LV 裡面增加容量!
  • lvreduce :在 LV 裡面減少容量;
  • lvremove :刪除一個 LV !
  • lvresize :對 LV 進行容量大小的調整!
[root@study ~]# lvcreate [-L N[mgt]] [-n LV名稱] VG名稱
[root@study ~]# lvcreate [-l N] [-n LV名稱] VG名稱
選項與參數:
-L  :後面接容量,容量的單位可以是 M,G,T 等,要注意的是,最小單位為 PE,
      因此這個數量必須要是 PE 的倍數,若不相符,系統會自行計算最相近的容量。
-l  :後面可以接 PE 的『個數』,而不是數量。若要這麼做,得要自行計算 PE 數。
-n  :後面接的就是 LV 的名稱啦!
更多的說明應該可以自行查閱吧! man lvcreate 

格式化磁盘阶段

        用mkfs等命令格式化这个分区就行啦

# 1. 格式化、掛載與觀察我們的 LV 吧!
[root@study ~]# mkfs.xfs /dev/vbirdvg/vbirdlv <==注意 LV 全名!
[root@study ~]# mkdir /srv/lvm
[root@study ~]# mount /dev/vbirdvg/vbirdlv /srv/lvm
[root@study ~]# df -Th /srv/lvm
Filesystem                  Type  Size  Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs   2.0G   33M  2.0G   2% /srv/lvm

[root@study ~]# cp -a /etc /var/log /srv/lvm
[root@study ~]# df -Th /srv/lvm
Filesystem                  Type  Size  Used Avail Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv xfs   2.0G  152M  1.9G   8% /srv/lvm  <==確定是可用的啊!

放大LVM容量:

        其实就是扩充LV,所以VG要有剩余空间(也就是--scan时 in no VG: 的内容)

        LVM只是提供一种可扩展机制,实际还是要根据此LV的文件操作系统

-> xfs只能扩大,ext4可以扩大缩小;

过程:扩大完会自动调整超级快信息等,无需重新mount

vgdisplay vbirdvg #查看有多少剩余VG空间
lvresize -L +500M /dev/vbirdvg/vbirdlv #LV分区增加500M

LVM池-- LVM thin Volume:

           实际也就是划分一个LV区,但是此区又可以划分给其他LV;

LV与此LV池子关联后;LV用多少才到此池子里取多少容量---可以模拟很大容量的LV,但不能超过池子总容量;

建立:-T

[root@study ~]# lvcreate -L 1G -T vbirdvg/vbirdtpool  # 最重要的建置指令

     

关联(分配给新LV):

 -T很重要:关联

-v 10G:可以远超VG总容量,但只是虚拟的;不要越界关联的LV池的容量,很危险

 lvcreate -V 10G -T vbirdvg/vbirdtpool -n vbirdthin1

        

磁盘快照功能

        用pe创建一个快照区(也是一个分区,可以挂载);当公用区域被修改时,修改前的内容会保存(备份)到快照区内--起到备份的作用

        快照区与被快照区必须要在同一个VG上;

制作:

lvcreate -s -l 26 -n vbirdsnap1 /dev/vbirdvg/vbirdlv
  Logical volume "vbirdsnap1" created
# 上述的指令中最重要的是那個 -s 的選項!代表是 snapshot 快照功能之意!
# -n 後面接快照區的裝置名稱, /dev/.... 則是要被快照的 LV 完整檔名。
# -l 後面則是接使用多少個 PE 來作為這個快照區使用。
--->
-n 快照区名字 被快照区名字

        但此区与被快照区UUID是相同的因此要使用 -o nouuid 命令

[root@study ~]# mkdir /srv/snapshot1
[root@study ~]# mount -o nouuid /dev/vbirdvg/vbirdsnap1 /srv/snapshot1
[root@study ~]# df -Th /srv/lvm /srv/snapshot1

恢复:

# xfsdump -l 0 -L lvm1 -M lvm1 -f /home/lvm.dump /srv/snapshot1

LVM命令总览与删除:

删除LVM

  1. 先卸載系統上面的 LVM 檔案系統 (包括快照與所有 LV);
  2. 使用 lvremove 移除 LV ;
  3. 使用 vgchange -a n VGname 讓 VGname 這個 VG 不具有 Active 的標誌;
  4. 使用 vgremove 移除 VG:
  5. 使用 pvremove 移除 PV;
  6. 最後,使用 fdisk 修改 ID 回來
[root@study ~]# umount /srv/lvm /srv/thin /srv/snapshot1
[root@study ~]# lvs vbirdvg
  LV         VG      Attr       LSize  Pool       Origin Data%  Meta%  Move Log Cpy%Sync 
  vbirdlv    vbirdvg -wi-a-----  2.50g
  vbirdthin1 vbirdvg Vwi-a-tz-- 10.00g vbirdtpool        4.99
  vbirdtpool vbirdvg twi-aotz--  1.00g                   49.93  1.81
# 要注意!先刪除 vbirdthin1 --> vbirdtpool --> vbirdlv 比較好!

[root@study ~]# lvremove /dev/vbirdvg/vbirdthin1 /dev/vbirdvg/vbirdtpool
[root@study ~]# lvremove /dev/vbirdvg/vbirdlv
[root@study ~]# vgchange -a n vbirdvg
  0 logical volume(s) in volume group "vbirdvg" now active

[root@study ~]# vgremove vbirdvg
  Volume group "vbirdvg" successfully removed

[root@study ~]# pvremove /dev/vda{5,6,7,8}

第十五章   计划任务

        分为只执行一次的任务at 和定时(循环)执行的任务cron

单次任务at

 只执行一次任务 

启动atd服务与相关文件

        必须要启动atd服务 来支持at命令的允许

[root@study ~]# systemctl restart atd  # 重新啟動 atd 這個服務
[root@study ~]# systemctl enable atd   # 讓這個服務開機就自動啟動
[root@study ~]# systemctl status atd   # 查閱一下 atd 目前的狀態
atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)       # 是否開機啟動
   Active: active (running) since Thu 2015-07-30 19:21:21 CST; 23s ago # 是否正在運作中
 Main PID: 26503 (atd)
   CGroup: /system.slice/atd.service
           └─26503 /usr/sbin/atd -f

        /var/spool/at/:at执行时,写入目录内

        /etc/at.allwo :允许执行的用户名单(没有的用户则不能使用

        /etc/at.deny :at.allwo不存在时查看此文件,禁止使用的用户名单(存在的用户不能使用;

                               若都不存在只有root才能使用at

at

        输入完时限后按回车输入任务内容,EOF结束

[root@study ~]# at [-mldv] TIME
[root@study ~]# at -c 工作號碼
選項與參數:
-m  :當 at 的工作完成後,即使沒有輸出訊息,亦以 email 通知使用者該工作已完成。
-l  :at -l 相當於 atq,列出目前系統上面的所有該使用者的 at 排程;
-d  :at -d 相當於 atrm ,可以取消一個在 at 排程中的工作;
-v  :可以使用較明顯的時間格式列出 at 排程中的工作列表;
-c  :可以列出後面接的該項工作的實際指令內容。

TIME:時間格式,這裡可以定義出『什麼時候要進行 at 這項工作』的時間,格式有:
  HH:MM				ex> 04:00
	在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此工作。
  HH:MM YYYY-MM-DD		ex> 04:00 2015-07-30
	強制規定在某年某月的某一天的特殊時刻進行該工作!
  HH:MM[am|pm] [Month] [Date]	ex> 04pm July 30
	也是一樣,強制在某年某月某日的某時刻進行!
  HH:MM[am|pm] + number [minutes|hours|days|weeks]
	ex> now + 5 minutes	ex> 04pm + 3 days
	就是說,在某個時間點『再加幾個時間後』才進行。

注意点:

        1 会使用at shell(新shell)来执行任务-->标准输出or标准错误输出都会发送到执行者的mailbox中;

echo "hallo" > /dev/tty1
显示到自己的终端

        2 最好使用绝对命令

        3 可以脱机来执行,不依赖于当前bash环境

                        

atq/atrm查看与删除

[root@study ~]# atq
[root@study ~]# atrm (jobnumber)

範例一:查詢目前主機上面有多少的 at 工作排程?
[root@study ~]# atq
3       Tue Aug  4 23:00:00 2015 a root
# 上面說的是:『在 2015/08/04 的 23:00 有一項工作,該項工作指令下達者為 
# root』而且,該項工作的工作號碼 (jobnumber) 為 3 號喔!

範例二:將上述的第 3 個工作移除!
[root@study ~]# atrm 3
[root@study ~]# atq
# 沒有任何資訊,表示該工作被移除了!

batch与uptime任务负载

        任务负载指同时执行的任务数

uptime查看平均负载

uptime
20:21  up 2 days,  2:13, 2 users, load averages: 2.70 2.80 2.63
最后三组数字分别代表:1分钟/5分钟/15分钟 的平均负载

batch:当任务负载小于0.8时才执行 与at一样,但不支持时间参数了

jobs/kill

 找出后台任务/终止后台任务 

 暂略

循环任务cron

        利用cron服务提供的crontab命令来周期性的执行任务

cron相关文件

       /var/spool/cron/用户名:crontab命令编辑个人任务时会写入这个文件内

        /etc/crontab:编辑关于系统任务时,可以直接写入此文件;  cron服务每隔一分钟会读取  /etc/crontab和 /var/spool/cron/用户名 这两个文件

*  *  *  *  * user-name  command to be executed
与crontab内容不同,多了username,指定执行的用户

      

        /etc/cron.d/*: 在此目錄下的檔案是『crontab 的設定檔腳本』。

[root@study ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
---->
run——parts脚本 去执行后面文件里面的命令

     

       /etc/cron.hourly:存放着每小时内随机执行的脚本命令,必須是能被直接執行的指令腳本,而不是分、時、日、月、周的設定值;也有/etc/cron.daily/等;

crontab 命令

[root@study ~]# crontab [-u username] [-l|-e|-r]
選項與參數:
-u  :只有 root 才能進行這個任務,亦即幫其他使用者建立/移除 crontab 工作排程;
-e  :編輯 crontab 的工作內容
-l  :查閱 crontab 的工作內容
-r  :移除所有的 crontab 的工作內容,若僅要移除一項,請用 -e 去編輯。

範例一:用 dmtsai 的身份在每天的 12:00 發信給自己
[dmtsai@study ~]$ crontab -e
# 此時會進入 vi 的編輯畫面讓您編輯工作!注意到,每項工作都是一行。
0   12  *  *  * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
#分 時 日 月 週 |<==============指令串========================>|

     

  ⚠️:       时间是反过来的

                日月和星期不能同时使用

                想删除一条任务只能 -e手动编辑删除 -r是删除所有

                */5 是一个整体

anacron 执行过期的cron

        通过对比 读取配置文件获得宽限逾期时间  再将 时间戳(上次一次执行ana的时间) 与当前时间进行做差 ,若差值超过宽限时间 ,则执行配置文件的命令串内容

        配置文件:/etc/anacrontab

7        25        cron.weekly        nice run-parts /etc/cron.weekly
@monthly 45        cron.monthly       nice run-parts /etc/cron.monthly
宽限天数     延遲時間  工作名稱定義       實際要進行的指令串
# 天數單位為天;延遲時間單位為分鐘;工作名稱定義可自訂,指令串則通常與 crontab 的設定相同
#延迟时间:指 执行命令串时为防止繁忙,规定的最大延迟执行时间
#最后一栏就是执行的命令串

        也就是说如果将任务放在 /etc/cron.weekly等目录下 逾期了也会执行

        时间戳:/var/spool/anacron/*

::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20150731

        anacrontab命令:

[root@study ~]# anacron [-sfn] [job]..
[root@study ~]# anacron -u [job]..
選項與參數:
-s  :開始一連續的執行各項工作 (job),會依據時間記錄檔的資料判斷是否進行;
-f  :強制進行,而不去判斷時間記錄檔的時間戳記;
-n  :立刻進行未進行的任務,而不延遲 (delay) 等待時間;
-u  :僅更新時間記錄檔的時間戳記,不進行任何工作。
job :由 /etc/anacrontab 定義的各項工作名稱。

第十六章 进程管理与 SELinux

进程PID/PPID 

        进程是动态的程序 不在赘述;当触发一个事件时(如执行一个命令) ,系统会将他定义为一个进程,并赋予一个PID(process ID),并设置PID相关权限;

        每个用户触发事件时,获得的PID和对应的权限也不同;

ps  

ps -l 
查看进程相关信息

父进程与子进程

        子进程继承父进程的一些属性(fork-and-exec),子进程的PPID为父进程的PID

        父进程PID14384  调用su - 命令 

        产生的子环境再查看,CMD :su - 那一行 PPID赫然是14384;

服务:

        常駐在記憶體當中的程序通常都是負責一些系統所提供的功能以服務使用者各項任務,因此這些常駐程式就會被我們稱為:服務 (daemon)。有些服务会启动监听端口

Linux多人任务相关

        由于cpu的频率很高,当多个用户使用时,就好像专门为自己服务一样;

        每个人登陆bash时,获取的shell PID是不同的;

        linux会默认启动六个终端登录环境进程,也即就是(tty1-tty6)

        需要考虑资源管理,毕竟cpu总资源是有限的

任务管理jobs

        每个任务都是当前bash的子进程 ,父进程无法管理别人的子进程;所以tty1的环境无法管理tty2的bash;(root 也不行,不是权限的问题);

        

jobs任务管理及相关命令

        由于bash前台(有命令提示符可供输入的环境)只能显示一个任务,但可以通过操& 放到后台去暂停s或执行r

        后台中的程序分为执行状态(必须是脱机的,比如vim就不行) 和  暂停状态

        一个任务会配置一个PID;

放到后台去执行:&

命令串 &

 列子

        显示完成会提醒的         

         ⚠️但输出的消息stdout或stderr还是会输出到前台,最好通过重定向流避免影响前台;

放到后台中去暂停:control+z

        会暂停到后台去,只能暂停前台的任务,无法影响后台中的任务

将后台中暂停的任务启动:bg

bg %任务号

查看后台任务jobs

[root@study ~]# jobs [-lrs]
選項與參數:
-l  :除了列出 job number 與指令串之外,同時列出 PID 的號碼;
-r  :僅列出正在背景 run 的工作;
-s  :僅列出正在背景當中暫停 (stop) 的工作。

⚠️: 

+号表示最近的任务 - 表示第二近的任务 

 j结尾有&的表示在运行中国

将任务拿到前台来处理:fg--foreground

[root@study ~]# fg %jobnumber
選項與參數:
%jobnumber :jobnumber 為工作號碼(數字)。注意,那個 % 是可有可無的!
MACOS 需要加数字
不加数字 默认最近的任务(jobs 中 +号的任务)

kill

        默认接进程PID ,%才表示任务号;

        可以配合signal有很多作用,sig和数字是对应的 相当于简化就;可以 man signal查看

[root@study ~]# kill -signal %jobnumber
[root@study ~]# kill -l
選項與參數:
-l  :這個是 L 的小寫,列出目前 kill 能夠使用的訊號 (signal) 有哪些?
signal :代表給予後面接的那個工作什麼樣的指示囉!用 man 7 signal 可知:
  -1 :重新讀取一次參數的設定檔 (類似 reload);
  -2 :代表與由鍵盤輸入 [ctrl]-c 同樣的動作;
  -9 :立刻強制刪除一個工作;
  -15:以正常的程序方式終止一項工作。與 -9 是不一樣的。

脱机管理问题

        at ,crontab 都是交给系统后台管理的 ,就算退出终端bash也能正常运行

        而 jobs查看的都是依托于bash的后台(父进程bash没了就都没了)

让任务可以脱机运行的两种情况

        1 利用at

        2 利用命令 nohup--no hang up

[root@study ~]# nohup [指令與參數]   <==在終端機前景中工作
[root@study ~]# nohup [指令與參數] & <==在終端機背景中工作

  在默认情况下(非重定向时),信息(如完成通知的信息)会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

进程管理 ps

ps命令详解

        有很多选项,我们主要用到两个:aux 与 -al

[root@study ~]# ps aux  <==觀察系統所有的程序資料
[root@study ~]# ps -lA  <==也是能夠觀察所有系統的資料
[root@study ~]# ps axjf <==連同部分程序樹狀態
選項與參數:
-A  :所有的 process 均顯示出來,與 -e 具有同樣的效用;
-a  :不與 terminal 有關的所有 process ;
-u  :有效使用者 (effective user) 相關的 process ;
x   :通常與 a 這個參數一起使用,可列出較完整資訊。
輸出格式規劃:
l   :較長、較詳細的將該 PID 的的資訊列出;
j   :工作的格式 (jobs format)
-f  :做一個更為完整的輸出。

ps -l:只显示与自己bash有关的进程

範例一:將目前屬於您自己這次登入的 PID 與相關資訊列示出來(只與自己的 bash 有關)
[root@study ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0 14830 13970  0  80   0 - 52686 poll_s pts/0    00:00:00 sudo
4 S     0 14835 14830  0  80   0 - 50511 wait   pts/0    00:00:00 su
4 S     0 14836 14835  0  80   0 - 29035 wait   pts/0    00:00:00 bash
0 R     0 15011 14836  0  80   0 - 30319 -      pts/0    00:00:00 ps

-- >

  • F:代表這個程序旗標 (process flags),說明這個程序的總結權限,常見號碼有:
    • 若為 4 表示此程序的權限為 root ;
    • 若為 1 則表示此子程序僅進行複製(fork)而沒有實際執行(exec)。
  • S:代表這個程序的狀態 (STAT),主要的狀態有:
    • R (Running):該程式正在運作中;
    • S (Sleep):該程式目前正在睡眠狀態(idle),但可以被喚醒(signal)。
    • D :不可被喚醒的睡眠狀態,通常這支程式可能在等待 I/O 的情況(ex>列印)
    • T :停止狀態(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態;
    • Z (Zombie):僵尸进程,程序已經終止但卻無法被移除至記憶體外。【命令后面接上<defunct> 時就代表是僵尸进程】不要盲目的kill,可以通过rboot命令
  • UID/PID/PPID:代表『此程序被該 UID 所擁有/程序的 PID 號碼/此程序的父程序 PID 號碼』
     
  • C:代表 CPU 使用率,單位為百分比;
     
  • PRI/NI:Priority/Nice 的縮寫,代表此程序被 CPU 所執行的優先順序,數值越小代表該程序越快被 CPU 執行。詳細的 PRI 與 NI 將在下一小節說明。
     
  • ADDR/SZ/WCHAN:都與記憶體有關,ADDR 是 kernel function,指出該程序在記憶體的哪個部分,如果是個 running 的程序,一般就會顯示『 - 』 / SZ 代表此程序用掉多少記憶體 / WCHAN 表示目前程序是否運作中,同樣的, 若為 - 表示正在運作中。
     
  • TTY:登入者的終端機位置,若為遠端登入則使用動態終端介面 (pts/n);
     
  • TIME:使用掉的 CPU 時間,注意,是此程序實際花費 CPU 運作的時間,而不是系統時間;
     
  • CMD:就是 command 的縮寫,造成此程序的觸發程式之指令為何。

ps aux:显示所有进程

範例二:列出目前所有的正在記憶體當中的程序:
[root@study ~]# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  60636  7948 ?        Ss   Aug04   0:01 /usr/lib/systemd/systemd ...
root         2  0.0  0.0      0     0 ?        S    Aug04   0:00 [kthreadd]
.....(中間省略).....
root     14830  0.0  0.1 210744  3988 pts/0    S    Aug04   0:00 sudo su -
root     14835  0.0  0.1 202044  2996 pts/0    S    Aug04   0:00 su -
root     14836  0.0  0.1 116140  2960 pts/0    S    Aug04   0:00 -bash
.....(中間省略).....

--->

  • USER:該 process 屬於那個使用者帳號的?
  • PID :該 process 的程序識別碼。
  • %CPU:該 process 使用掉的 CPU 資源百分比;
  • %MEM:該 process 所佔用的實體記憶體百分比;
  • VSZ :該 process 使用掉的虛擬記憶體量 (Kbytes)
  • RSS :該 process 佔用的固定的記憶體量 (Kbytes)
  • TTY :該 process 是在那個終端機上面運作,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網路連接進主機的程序。
  • STAT:該程序目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
  • START:該 process 被觸發啟動的時間;
  • TIME :該 process 實際使用 CPU 運作的時間。
  • COMMAND:該程序的實際指令為何?

ps -al: 列出所有进程 但格式与ps -l 一样

ps -axjf/ pstree : 列出进程树相关

top实时查看进程

[root@study ~]# top [-d 數字] | top [-bnp]
選項與參數:
-d  :後面可以接秒數,就是整個程序畫面更新的秒數。預設是 5 秒;
-b  :以批次的方式執行 top ,還有更多的參數可以使用喔!
      通常會搭配資料流重導向來將批次的結果輸出成為檔案。
-n  :與 -b 搭配,意義是,需要進行幾次 top 的輸出結果。
-p  :指定某些個 PID 來進行觀察監測而已。
在 top 執行過程當中可以使用的按鍵指令:
	? :顯示在 top 當中可以輸入的按鍵指令;
	P :以 CPU 的使用資源排序顯示;
	M :以 Memory 的使用資源排序顯示;
	N :以 PID 來排序喔!
	T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序。
	k :給予某個 PID 一個訊號  (signal)
	r :給予某個 PID 重新制訂一個 nice 值。
	q :離開 top 軟體的按鍵。

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    
--->
PID :每個 process 的 ID 啦!
USER:該 process 所屬的使用者;
PR :Priority 的簡寫,程序的優先執行順序,越小越早被執行;
NI :Nice 的簡寫,與 Priority 有關,也是越小越早被執行;
%CPU:CPU 的使用率;
%MEM:記憶體的使用率;
TIME+:CPU 使用時間的累加;

pstree :

        查看进程树 macOS用下面命令来安装

brew install pstree

pstree 命令解释以及安装 - 码农教程

-------------------

[root@study ~]# pstree [-A|U] [-up]
選項與參數:
-A  :各程序樹之間的連接以 ASCII 字元來連接;
-U  :各程序樹之間的連接以萬國碼的字元來連接。在某些終端介面下可能會有錯誤;
-p  :並同時列出每個 process 的 PID;
-u  :並同時列出每個 process 的所屬帳號名稱。

killall 

kill -SIGnumber $(ps aux | grep '进程名' | grep -v 'grep'| awk '{print $2}')
---找出具体进程的PID
--例如关闭qq这个进程
kill -9 $(ps aux | grep 'QQ' | grep -v 'grep'| awk '{print $2}')

        直接接服务的名称,而不用具体的PID,会对应此服务的所有进程;

 ------>

[root@study ~]# killall [-iIe] [command name]
選項與參數:
-i  :interactive 的意思,互動式的,若需要刪除時,會出現提示字元給使用者;
-e  :exact 的意思,表示『後面接的 command name 要一致』,但整個完整的指令
      不能超過 15 個字元。
-I  :指令名稱(可能含參數)忽略大小寫。

列:关闭QQ

killall -9 QQ

Priority / Nice 值

        对应PRI,NI值 ; PRI值用户无法手动调节,只能调节NI值

PRI(new) = PRI(old) + nice

⚠️:

  • nice 值可調整的範圍為 -20 ~ 19 ;
  • root 可隨意調整自己或他人程序的 Nice 值,且範圍為 -20 ~ 19 ;
  • 一般使用者僅可調整自己程序的 Nice 值,且範圍僅為 0 ~ 19 (避免一般用戶搶佔系統資源);
  • 一般使用者僅可將 nice 值越調越高,例如本來 nice 為 5 ,則未來僅能調整到大於 5;

--------分为nice指令 和 renice指令

nice:进程启动时就指定

[root@study ~]# nice [-n 數字] command
選項與參數:
-n  :後面接一個數值,讓原本的 nice 加上這個新的數值之意。修改後的最終數值的範圍則為 -20 ~ 19。

renice:更改已经启动的进程nice值(top命令也能改)

[root@study ~]# renice [number] PID
選項與參數:
PID :某個程序的 ID 啊!

系统资源信息命令free/uname/netstat/dmesg/vmstat

free:查看内存使用情况

[root@study ~]# free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
選項與參數:
-b  :直接輸入 free 時,顯示的單位是 Kbytes,我們可以使用 b(bytes), m(Mbytes)
      k(Kbytes), 及 g(Gbytes) 來顯示單位喔!也可以直接讓系統自己指定單位 (-h)
-t  :在輸出的最終結果,顯示實體記憶體與 swap 的總量。
-s  :可以讓系統每幾秒鐘輸出一次,不間斷的一直輸出的意思!對於系統觀察挺有效!
-c  :與 -s 同時處理~讓 free 列出幾次的意思~

uname:查看系统与内核有关信息

[root@study ~]# uname [-asrmpi]
選項與參數:
-a  :所有系統相關的資訊,包括底下的資料都會被列出來;
-s  :系統核心名稱
-r  :核心的版本
-m  :本系統的硬體名稱,例如 i686 或 x86_64 等;
-p  :CPU 的類型,與 -m 類似,只是顯示的是 CPU 的類型!
-i  :硬體的平台 (ix86)

netstat:追踪网络或socket文件

[root@study ~]# netstat -[atunlp]
選項與參數:
-a  :將目前系統上所有的連線、監聽、Socket 資料都列出來
-t  :列出 tcp 網路封包的資料
-u  :列出 udp 網路封包的資料
-n  :不以程序的服務名稱,以埠號 (port number) 來顯示;
-l  :列出目前正在網路監聽 (listen) 的服務;
-p  :列出該網路服務的程序 PID 

        分为两大部分 网络 与 系统本地进程相关 

网络

  • Proto :網路的封包協定,主要分為 TCP 與 UDP 封包,相關資料請參考伺服器篇;
  • Recv-Q:非由使用者程式連結到此 socket 的複製的總 bytes 數;
  • Send-Q:非由遠端主機傳送過來的 acknowledged 總 bytes 數;
  • Local Address :本地端的 IP:port 情況
  • Foreign Address:遠端主機的 IP:port 情況
  • State :連線狀態,主要有建立(ESTABLISED)及監聽(LISTEN);

本地:接受不同进程发过来的socket文件,以此来沟通;

  • Proto :一般就是 unix 啦;
  • RefCnt:連接到此 socket 的程序數量;
  • Flags :連線的旗標;
  • Type :socket 存取的類型。主要有確認連線的 STREAM 與不需確認的 DGRAM 兩種;
  • State :若為 CONNECTED 表示多個程序之間已經連線建立。
  • Path :連接到此 socket 的相關程式的路徑!或者是相關資料輸出的路徑。

-------

dmesg:分析内核产生的信息

vmstatmacOS下是vm_stat):检查系统资源变化

[root@study ~]# vmstat [-a] [延遲 [總計偵測次數]] <==CPU/記憶體等資訊
[root@study ~]# vmstat [-fs]                      <==記憶體相關
[root@study ~]# vmstat [-S 單位]                  <==設定顯示數據的單位
[root@study ~]# vmstat [-d]                       <==與磁碟有關
[root@study ~]# vmstat [-p 分割槽]                <==與磁碟有關
選項與參數:
-a  :使用 inactive/active(活躍與否) 取代 buffer/cache 的記憶體輸出資訊;
-f  :開機到目前為止,系統複製 (fork) 的程序數;
-s  :將一些事件 (開機至目前為止) 導致的記憶體變化情況列表說明;
-S  :後面可以接單位,讓顯示的資料有單位。例如 K/M 取代 bytes 的容量;
-d  :列出磁碟的讀寫總量統計表
-p  :後面列出分割槽,可顯示該分割槽的讀寫總量統計表
  • 程序欄位 (procs) 的項目分別為:
    r :等待運作中的程序數量;b:不可被喚醒的程序數量。這兩個項目越多,代表系統越忙碌 (因為系統太忙,所以很多程序就無法被執行或一直在等待而無法被喚醒之故)。
     
  • 記憶體欄位 (memory) 項目分別為:
    swpd:虛擬記憶體被使用的容量; free:未被使用的記憶體容量; buff:用於緩衝記憶體; cache:用於快取記憶體。 這部份則與 free 是相同的。
     
  • 記憶體置換空間 (swap) 的項目分別為:
    si:由磁碟中將程序取出的量; so:由於記憶體不足而將沒用到的程序寫入到磁碟的 swap 的容量。 如果 si/so 的數值太大,表示記憶體內的資料常常得在磁碟與主記憶體之間傳來傳去,系統效能會很差!
     
  • 磁碟讀寫 (io) 的項目分別為:
    bi:由磁碟讀入的區塊數量; bo:寫入到磁碟去的區塊數量。如果這部份的值越高,代表系統的 I/O 非常忙碌!
     
  • 系統 (system) 的項目分別為:
    in:每秒被中斷的程序次數; cs:每秒鐘進行的事件切換次數;這兩個數值越大,代表系統與周邊設備的溝通非常頻繁! 這些周邊設備當然包括磁碟、網路卡、時間鐘等。
     
  • CPU 的項目分別為:
    us:非核心層的 CPU 使用狀態; sy:核心層所使用的 CPU 狀態; id:閒置的狀態; wa:等待 I/O 所耗費的 CPU 狀態; st:被虛擬機器 (virtual machine) 所盜用的 CPU 使用狀態 (2.6.11 以後才支援)。

------

特殊文件与进程

SUID/SGID

        其实就是触发进程时,通过此特殊权限赋予此PID特殊权限

/proc/*

        各个进程都是以 /proc/进程PID  的形式写入/proc中的 ,里面有相关信息 如:

用文件(系统)查找进程 fuser

[root@study ~]# fuser [-umv] [-k [i] [-signal]] file/dir
選項與參數:
-u  :除了程序的 PID 之外,同時列出該程序的擁有者;
-m  :代表次文件的整个文件系统,對 umount 不成功很有效!
-v  :可以列出每個檔案與程序還有指令的完整相關性!
-k  :找出使用該檔案/目錄的 PID ,並試圖以 SIGKILL 這個訊號給予該 PID;
-i  :必須與 -k 配合,在刪除 PID 之前會先詢問使用者意願!
-signal:例如 -1 -15 等等,若不加的話,預設是 SIGKILL (-9) 囉!


ACCESS表示:
c :此程序在當前的目錄下(非次目錄);
e :可被觸發為執行狀態;
f :是一個被開啟的檔案;
r :代表頂層目錄 (root directory);
F :該檔案被開啟了,不過在等待回應中;
m :可能為分享的動態函式庫;

通过进程找出所使用的文件lsof

[root@study ~]# lsof [-aUu] [+d]
選項與參數:
-a  :多項資料需要『同時成立』才顯示出結果時!
-U  :僅列出 Unix like 系統的 socket 檔案類型;
-u  :後面接 username,列出該使用者相關程序所開啟的檔案;
+d  :後面接目錄,亦即找出某個目錄底下已經被開啟的檔案!

pidof:找出正在执行的进程的PID

        macOS通过brew install 下载

[root@study ~]# pidof [-sx] program_name
選項與參數:
-s  :僅列出一個 PID 而不列出所有的 PID
-x  :同時列出該 program name 可能的 PPID 那個程序的 PID

SELinux 初试探

        Security Enhanced Linux:安全强化的linux;是整合到内核的一个模块---再进行进程,文件等详细权限配置时依据的一个模块;

DAC与MAC

DAC:只通过对比rwx权限和用户来实施控制;但不安全

MAC:Mandatory Access Control 强制访问控制

                在对比基本rwx权限之前增加的限制

                针对控制的主体为进程而不是用户

SElinux相关名词

        SElinux通过MAC方式来管理进程的;

      1  主体==进程

      2  目标==文件系统

      3  策略:如果一条条控制很繁琐提供了一些默认策略

-->

  • targeted:針對網路服務限制較多,針對本機限制較少,是預設的政策;
  • minimum:由 target 修訂而來,僅針對選擇的程序來保護!
  • mls:完整的 SELinux 限制,限制方面較為嚴格。

-        我们采用targeted策略

       4 安全上下文:相当于SElinux模块内的rwx权限设置{

                是放在文件的inode内的;

                ls -Z      查看

                字段:主要用到前三个

system_u:object_r:admin_home_t
Identify:role:type
身份識別:角色:類型

}

安全上下文字段及匹配过程

  • 身份識別 (Identify):
  • unconfined_u:不受限的用戶,也就是說,該檔案來自於不受限的程序所產生的!一般來說,我們使用可登入帳號來取得 bash 之後, 預設的 bash 環境是不受 SELinux 管制的~因為 bash 並不是什麼特別的網路服務!因此,在這個不受 SELinux 所限制的 bash 程序所產生的檔案, 其身份識別大多就是 unconfined_u 這個『不受限』用戶囉!
  • system_u:系統用戶,大部分就是系統自己產生的檔案囉!

  • 角色 (Role):

透過角色欄位,我們可以知道這個資料是屬於程序、檔案資源還是代表使用者。一般的角色有:

  • object_r:代表文件
  • system_r:代表进程

  • 類型 (Type) (最重要!)

        SELlinux能不能匹配通过主要看类型;

  • type:在檔案資源 (Object) 上面稱為類型 (Type);
  • domain:在主體程序 (Subject) 則稱為領域 (domain) 了!

匹配过程:

        触发进程时,会根据文件的type赋予进程相对的域;而域又包括了此域可以访问的文件Type

  1. 首先,我們觸發一個可執行的目標檔案,那就是具有 crond_exec_t 這個類型的 /usr/sbin/crond 檔案;
  2. 該檔案的類型會讓這個檔案所造成的主體程序 (Subject) 具有 crond 這個領域 (domain), 我們的政策針對這個領域已經制定了許多規則,其中包括這個領域可以讀取的目標資源類型;
  3. 由於 crond domain 被設定為可以讀取 system_cron_spool_t 這個類型的目標檔案 (Object), 因此你的設定檔放到 /etc/cron.d/ 目錄下,就能夠被 crond 那支程序所讀取了;
  4. 但最終能不能讀到正確的資料,還得要看 rwx 是否符合 Linux 權限的規範!

-上面 【1-3 步相当于SElinux提供的额外控制过程】

SElinux的三种启动模式与开启

模式:

  • enforcing:強制模式,代表 SELinux 運作中,且已經正確的開始限制 domain/type 了;
  • permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息並不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用;
  • disabled:關閉,SELinux 並沒有實際運作。

---

查看模式

getenforce

查看策略:

[root@study ~]# sestatus [-vb]
選項與參數:
-v  :檢查列於 /etc/sestatus.conf 內的檔案與程序的安全性本文內容;
-b  :將目前政策的規則布林值列出,亦即某些規則 (rule) 是否要啟動 (0/1) 之意;

SElinux配置文件--利用这个开启SElinux:/etc/selinux/config

[root@study ~]# vim /etc/selinux/config
SELINUX=enforcing     <==調整 enforcing|disabled|permissive
SELINUXTYPE=targeted  <==目前僅有 targeted, mls, minimum 三種政策

  ⚠️: 只要关系到 disabled 启动模式或 策略  就需要重新启动,可能要花费时间等待重新读写安全上下文

          而从强制模式到宽限模式之间无需重新启动

-->之间的转换命令:

[root@study ~]# setenforce [0|1]
選項與參數:
0 :轉成 permissive 寬容模式;
1 :轉成 Enforcing 強制模式

 策略内规则管理

getsebool 规则bool值查询

[root@study ~]# getsebool [-a] [規則的名稱]
選項與參數:
-a  :列出目前系統上面的所有 SELinux 規則的布林值為開啟或關閉值

seinfo 查询所有具体规则限制

[root@study ~]# seinfo [-trub]
選項與參數:
--all :列出 SELinux 的狀態、規則布林值、身份識別、角色、類別等所有資訊
-u    :列出 SELinux 的所有身份識別 (user) 種類
-r    :列出 SELinux 的所有角色 (role) 種類
-t    :列出 SELinux 的所有類別 (type) 種類
-b    :列出所有規則的種類 (布林值)

sesearch  以进程或文件为目标查看相关信息

[root@study ~]# sesearch [-A] [-s 主體類別] [-t 目標類別] [-b 布林值]
選項與參數:
-A  :列出後面資料中,允許『讀取或放行』的相關資料
-t  :後面還要接類別,例如 -t httpd_t
-b  :後面還要接SELinux的規則,例如 -b httpd_enable_ftp_server

setsebool 修改规则bool值:

[root@study ~]# setsebool  [-P]  『規則名稱』 [0|1]
選項與參數:
-P  :直接將設定值寫入設定檔,該設定資料未來會生效的!

修改安全上下文

ll -z :查看文件类型;

chcon 手动修改文件的上下文

[root@study ~]# chcon [-R] [-t type] [-u user] [-r role] 文件
[root@study ~]# chcon [-R] --reference=类型 文件
選項與參數:
-R  :連同該目錄下的次目錄也同時修改;
-t  :後面接安全性本文的類型欄位!例如 httpd_sys_content_t ;
-u  :後面接身份識別,例如 system_u; (不重要)
-r  :後面接角色,例如 system_r;     (不重要)
-v  :若有變化成功,請將變動的結果列出來
--reference=範例檔:拿某個檔案當範例來修改後續接的檔案的類型!

restorecon 恢复为默认上下文值

[root@study ~]# restorecon [-Rv] 檔案或目錄
選項與參數:
-R  :連同次目錄一起修改;
-v  :將過程顯示到螢幕上

semanage 管理默认上下文值

[root@study ~]# semanage {login|user|port|interface|fcontext|translation} -l
[root@study ~]# semanage fcontext -{a|d|m} [-frst] file_spec
選項與參數:
fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思;
-a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定;
-m :修改的意思;
-d :刪除的意思。

SElinux网络服务🌰

        主要用auditd 与 setroubleshootd 服务,基本都整合到auditd服务当中;

        setroubleshootd错误信息都写到了 /var/log/messages        

curl命令登陆网络服务器;?

sealert服务查看解决问题方案;

--------------不懂 应该是后面的内容;

第十七章 认识系统服务

service 与 daemon

        服务是常驻于内存中的进程且可以提供一些系统或网络功能;

        完成这个服务的进程称为daemon,一般都用d结尾表示“deamon”---如cron这个周期服务的进程叫crond;

早期init服务

        是早期unix版本的启动系统服务--内核第一个调用的程序,然后用init服务去启动其他服务

服务启动的分类

      1  独立启动模式:常驻于内存中,反应迅速

      2  超级守护进程:由xinetd与inetd这两个总管程序提供socket对应或端口对应管理;

服务的依赖性问题

        init在管理员自己手动处理这些服务的时候,是没办法协助唤醒所需的依赖服务

systemd 启动服务管理机制

         放弃system v 开机启动(init方法),而用systemd

特点:

        并行处理开机服务,而init是顺序执行的

        仅有一个systemctl命令来管理此服务,且反应迅速

        依赖的服务可以自动开启

        定义服务为一个unit,根据功能种类分为不同的类型

        target项目里包含很多服务,启动了target相当于启动了很多服务

        向下兼容部分init服务

配置文件

/usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的 /etc/init.d 底下的档案;
/run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高!
/etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前 /etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比 /run/systemd/system/ 高

---->

到底系统开机会不会执行某些服务其实是看 /etc/systemd/system/ 底下的设定,所以该目录底下就是一大堆连结档。而实际执行的 systemd 启动脚本设定档, 其实都是放置在 /usr/lib/systemd/system/ 底下的喔!因此如果你想要修改某个服务启动的设定,应该要去 /usr/lib/systemd/system/ 底下修改才对! 

uint类型

systemctl管理命令

[root@study ~]# systemctl [command] [unit]
command 主要有:
start     :立刻启动后面接的 unit
stop      :立刻关闭后面接的 unit
restart   :立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思
reload    :不关闭后面接的 unit 的情况下,重新载入设定档,让设定生效
enable    :设定下次开机时,后面接的 unit 会被启动
disable   :设定下次开机时,后面接的 unit 不会被启动
status    :目前后面接的这个 unit 的状态,会列出有没有正在执行、开机预设执行否、登录等资讯等!
is-active :目前有没有正在运作中
is-enabled:开机时有没有预设要启用这个 unit

注意: 不应该使用kill直接杀死一个服务 ,会无法继续监听该服务

            开机启动和现在启动不同;

            

status详细

[root@study ~]# systemctl status atd.service
atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)
   Active: active (running) since Mon 2015-08-10 19:17:09 CST; 5h 42min ago
 Main PID: 1350 (atd)
   CGroup: /system.slice/atd.service
           └─1350 /usr/sbin/atd -f

Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools.
# 重点在第二、三行喔~
# Loaded:这行在说明,开机的时候这个 unit 会不会启动,enabled 为开机启动,disabled 开机不会启动
# Active:现在这个 unit 的状态是正在执行 (running) 或没有执行 (dead)
# 后面几行则是说明这个 unit 程序的 PID 状态以及最后一行显示这个服务的登录档资讯!
# 登录档资讯格式为:‘时间’ ‘讯息发送主机’ ‘哪一个服务的讯息’ ‘实际讯息内容’
# 所以上面的显示讯息是:这个 atd 预设开机就启动,而且现在正在运作的意思!

Active状态:

        running :正在执行  dead:没有执行;

        active (running):正有一隻或多隻程序正在系统中执行的意思
        active (exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者是挂载时才会进行一次的 quotaon 功能,就是这种模式! quotaon 不须一直执行~只须执行一次之后,就交给档案系统去自行处理囉!通常用 bash shell 写的小型服务,大多是属于这种类型 (无须常驻记忆体)。
        active (waiting):正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,列印的伫列相关服务就是这种状态! 虽然正在启动中,不过,也需要真的有伫列进来 (列印工作) 这样他才会继续唤醒印表机服务来进行下一步列印的功能。
        inactive:这个服务目前没有运作的意思。

开机自启状态:

enabled:这个 daemon 将在开机时被执行
disabled:这个 daemon 在开机时不会被执行
static:这个 daemon 不可以自己启动 (enable 不可),不过可能会被其他的 enabled 的服务来唤醒 (相依属性的服务)
mask:这个 daemon 无论如何都无法被启动!因为已经被强制注销 (非删除)。可透过 systemctl unmask 方式改回原本状态

mask/ unmask 注销此服务

        就算关闭了某些服务,但因为依赖性会被自动启动,不正规的方法-用mask来强制注销

# 1. 保持刚刚的状态,关闭 cups.service,启动 cups.socket,然后注销 cups.servcie
[root@study ~]# systemctl stop cups.service
[root@study ~]# systemctl mask cups.service
ln -s '/dev/null' '/etc/systemd/system/cups.service'
# 喔耶~其实这个 mask 注销的动作,只是让启动的脚本变成空的装置而已!

        会将启动的脚本变成空;

 Loaded: masked (/dev/null)

查看所有服务 list

[root@study ~]# systemctl [command] [--type=TYPE] [--all]
command:
    list-units      :依据 unit 列出目前有启动的 unit。若加上 --all 才会列出没启动的。
    list-unit-files :依据 /usr/lib/systemd/system/ 内的档案,将所有档案列表说明。
--type=TYPE:就是之前提到的 unit type,主要有 service, socket, target 等

管理不同的操作环境 target

systemctl list-units --type=target --all

而跟操作界面相关性比较高的 target 主要有底下几个:

        graphical.target:就是文字加上图形界面,这个项目已经包含了底下的 multi-user.target 项目!
        multi-user.target:纯文字模式!
        rescue.target:在无法使用 root 登入的情况下,systemd 在开机时会多加一个额外的暂时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。 但是这是额外系统,因此可能需要动到 chroot 的方式来取得你原有的系统喔!再后续的章节我们再来谈!
        emergency.target:紧急处理系统的错误,还是需要使用 root 登入的情况,在无法使用         rescue.target 时,可以尝试使用这种模式!
        shutdown.target:就是关机的流程。
        getty.target:可以设定你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个东西的设定档!

查看以及切换模式

[root@study ~]# systemctl [command] [unit.target]
選項與參數:
command:
    get-default :取得目前的 target 
    set-default :設定後面接的 target 成為預設的操作模式
    isolate     :切換到後面接的模式

改变 graphical.target 以及 multi-user.target 是通过 isolate 来处理的

service 部份用 start/stop/restart 才对,在 target 项目则请使用 isolate (隔离不同的操作模式) 才对!

分析各服务之间的依赖性

[root@study ~]# systemctl list-dependencies [unit] [--reverse]
選項與參數:
--reverse :反向追蹤誰使用這個 unit 的意思!

systemd与 daemon 运行过程相关目录的简介

systemd  启动脚本设定档在 /usr/lib/systemd/system/
/usr/lib/systemd/system/:
预设的启动脚本设定档都放在这裡,这裡的资料尽量不要修改~ 要修改时,请到 /etc/systemd/system 底下修改较佳
/run/systemd/system/:
系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高!
/etc/systemd/system/:
管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前 /etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比 /run/systemd/system/ 高喔!
/etc/sysconfig/*:
几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb 所要更新的 man page 索引中,需要加入的参数就写入到此目录下的 man-db 当中喔!而网路的设定则写在 /etc/sysconfig/network-scripts/ 这个目录内。所以,这个目录内的档案也是挺重要的;
/var/lib/:
一些会产生资料的服务都会将他的资料写入到 /var/lib/ 目录中。举例来说,资料库管理系统 Mariadb 的资料库预设就是写入 /var/lib/mysql/ 这个目录下啦!
/run/:
放置了好多 daemon 的暂存档,包括 lock file 以及 PID file 等等。

网络服务与端口

IP是唯一的,端口相当于同一IP的不同的服务;

有些约定俗成的服务都放在同一个端口上;

查看端口与服务的文件:

[root@study ~]# cat /etc/services
....(前面省略)....
ftp             21/tcp
ftp             21/udp          fsp fspd
ssh             22/tcp                          # The Secure Shell (SSH) Protocol
ssh             22/udp                          # The Secure Shell (SSH) Protocol
....(中間省略)....
http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
....(底下省略)....
# 這個檔案的內容是以底下的方式來編排的:
# <daemon name>   <port/封包協定>   <該服務的說明>

关闭网络服务

        网络服务会产生一个网络监听端口(port)的进程;

netstat -tlunp
----用此来查看端口

  

[root@study ~]# systemctl list-units --all | grep 端口服务名
--  查看以此开头的服务

[root@study ~]# systemctl stop avahi-daemon.service
[root@study ~]# systemctl stop avahi-daemon.socket
[root@study ~]# systemctl disable avahi-daemon.service avahi-daemon.socket
[root@study ~]# netstat -tlunp

service类型配置文件详解

        /usr/lib/systemd/system/vsftpd.service:官方释出的预设设定档;
        

/etc/systemd/system/vsftpd.service.d/custom.conf:在 /etc/systemd/system 底下建立与设定档相同档名的目录,但是要加上 .d 的副档名。然后在该目录下建立设定档即可。另外,设定档最好附档名取名为 .conf 较佳!

在这个目录下的档案会累加其他设定’加入/usr/lib/systemd/system/vsftpd.service 内喔!
       

 /etc/systemd/system/vsftpd.service.wants/*:此目录内的档案为连结档,设定相依服务的连结。意思是启动了 vsftpd.service 之后,最好再加上这目录底下建议的服务。
      

  /etc/systemd/system/vsftpd.service.requires/*:此目录内的档案为连结档,设定相依服务的连结。意思是在启动 vsftpd.service 之前,需要事先启动哪些服务的意思。

service参数说明

 cat /usr/lib/systemd/system/sshd.service

[Unit] unit 本身的说明,以及与其他相依 daemon 的设定,包括在什么服务之后才启动此 unit 之类的设定值;

[Service], [Socket], [Timer], [Mount], [Path]..不同的 unit type 就得要使用相对应的设定项目。我们拿的是 sshd.service 来当范本,所以这边就使用 [Service] 来设定。 这个项目内主要在规范服务启动的脚本、环境设定档档名、重新启动的方式等等。

[Install]:这个项目就是将此 unit 安装到哪个 target 裡面去的意思!

多重设置方式:@---%I

*@.service

         /usr/lib/systemd/system/下有*@.service的服务,就是通过此文件多重启动服务的;

  我们拿 getty@tty1.service 来说明一下好了!当我们执行完 getty.target 之后, 他会持续要求 getty@tty1.service 等六个服务继续启动。那我们的 systemd 就会这麽作:

       1 先看 /usr/lib/systemd/system/, /etc/systemd/system/ 有没有 getty@tty1.service 的设定,若有就执行,若没有则执行下一步;(先看配置文件
       2  找 getty@.service 的设定,若有则将 @ 后面的资料带入成 %I 的变数,进入 getty@.service 执行!

将tty数量减少

# 1. 修改預設的 logind.conf 內容,將原本 6 個虛擬終端機改成 4 個
[root@study ~]# vim /etc/systemd/logind.conf
[Login]
NAutoVTs=4
ReserveVT=0
# 原本是 6 個而且還註解,請取消註解,然後改成 4 吧!

# 2. 關閉不小心啟動的 tty5, tty6 並重新啟動 getty.target 囉!
[root@study ~]# systemctl stop getty@tty5.service
[root@study ~]# systemctl stop getty@tty6.service
[root@study ~]# systemctl restart systemd-logind.service

-

systemctl 针对 timer 的配置文件

        类似于cron服务,内置于systemd

条件

·系统的 timer.target 一定要启动(timer项目一定要启动
·要有个 sname.service 的服务存在 (sname 是你自己指定的名称--不一定要启动此服务)
·要有个 sname.timer 的时间启动服务存在(一定要启动此服务-systemctl enable *.timer)

参数详细:

/etc/systemd/system/ 底下去建立这个 *.timer文件

默认启动服务概要(主要网络服务)

第十八章 认识与分析日志文件   

        记录系统在什么时候由哪个进程做了什么样的操作,发生了什么事情;

        是非常重要的一环; 

        通常只有root能查看;

主要日志文件:

日志文件主要服务与程序

  • systemd-journald.service:最主要的讯息收受者,由 systemd 提供的;
  • rsyslog.service:主要登录系统与网络等服务的讯息;
  • logrotate:主要在进行登录文件的轮替功能。

日志文件格式

|--日期/時間---|--主机名--|-服务或相关函数-|-----------具体说明------>

rsyslog.service:记录日志文件的服务

syslog相关规范

        rsyslog主要通过内核的syslog相关规范来设置数据分类;

syslog支持的相关服务:

syslog支持的相关等级

备注: none (不需要等级) ---想忽略时用此等级(或debug)

/etc/rsyslog.conf 配置文件

     参数:(1)什么服务 (2)的什么等级消息 (3)需要被记录在哪里(装置或档案)』

服务名列表.()等级  写入的目标文件
------------------------
服务名列表.服务名 代表'比后面还要严重的等级 (含该等级) 都被记录下来'的意思,例如: mail.info 代表只要是 mail 的信息,而且该信息技术严重于 info (含 info 本身)时,就会被记录下来的意思。

服务名列表.=服务名       代表等级就是此服务的等级
服务名列表.!服务名       低于此服务等级才记录
服务名列表.none          忽略,不记录
服务名列表.*              此服务的所有信息都记录(不管等级)
*.() 表示所有服务的信息都。。。
服务名列表可以用,隔开 
;表示一个新的语句

日志安全性问题

修改成只能增加状态

注意:如果用vim去查看日志文件,:wq退出,由于你以 vi m储存了此文件,则 rsyslogd 会误判 为该档案已被更动过, 将导致 rsyslogd 不再写入该档案新的内容

日志服务器设置

        让一台主机成为日志服务器,记录其他客户端的信息,就不用一台一台的去查看了;

        rsyslogd已经提供了此功能,但需要手动开启;

        默认启动UDP/TCP的514端口

启动:

[root@study ~]# vim /etc/rsyslog.conf

#$ModLoad imtcp
#$InputTCPServerRun 514
# 上面的是 UDP 埠口,底下的是 TCP 埠口!如果你的网路状态很稳定,就用 UDP 即可。
# 不过,如果你想要让资料比较稳定传输,那麽建议使用 TCP 囉!所以修改底下两行即可!
$ModLoad imtcp
$InputTCPServerRun 514 

重启服务并观察新端口

[root@study ~]# systemctl restart rsyslog.service
[root@study ~]# netstat -ltnp | grep syslog

设置客户主机:

        填的是服务器的ip

[root@study ~]# vim /etc/rsyslog.conf
*.*       @@192.168.1.100
#*.*       @192.168.1.100  # 若用 UDP 傳輸,設定要變這樣!

[root@study ~]# systemctl restart rsyslog.service

------需要有一定的网络基础

日志文件循环logrotate

        利用cron服务来实现的

配置文件                

/etc/logrotate.conf
/etc/logrotate.d/

/etc/logrotate.conf: 最主要的文件,/etc/logrotate.d/* 目录下的文件会自动包含到此文件中;

                                还包含默认配置参数--没另外定义的参数设置,就用此默认参数设置

#默认的参数设置
weekly    <==預設每個禮拜對登錄檔進行一次 rotate 的工作
rotate 4  <==保留幾個登錄檔呢?預設是保留四個!
create    <==由於登錄檔被更名,因此建立一個新的來繼續儲存之意!
dateext   <==就是這個設定值!可以讓被輪替的檔案名稱加上日期作為檔名喔!
#compress <==被更動的登錄檔是否需要壓縮?如果登錄檔太大則可考慮此參數啟動

include /etc/logrotate.d
# 將 /etc/logrotate.d/ 這個目錄中的所有檔案都讀進來執行 rotate 的工作!


/etc/logrotate.d/*:次目录下的文件相当于以包的方式被引入到/etc/logrotate.conf中

日志文件的绝对路径列表 {       <==僅針對 /var/log/wtmp 所設定的參數
    此服务(如wtmp)单独的参数设置 
  
    sharedscripts
    #环境
     prerotate:在启动logrotate 之前进行的指令,例如修改登录档的属性等动作;
     postrotate:在做完logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
     Prerotate 与postrotate 对于已加上特殊属性的档案处理上面,是相当重要的执行程序!
    #+这里填次环境下要执行的外部命令或脚本
    endscript

}

systemd-journald.service

        systemd第一个启动后,能主动唤醒此服务,所以只能记录开机后的情况;即 systemd-journald 用来管理与查询这次开机后的登录资讯,而 rsyslogd 可以用来记录以前及现在的所以资料到磁碟档案中;

journalctl命令

[root@study ~]# journalctl [-nrpf] [--since TIME] [--until TIME] _optional
选项与参数:
预设会秀出全部的log 内容,从旧的输出到最新的讯息
-n :秀出最近的几行的意思~找最新的资讯相当有用
-r :反向输出,从最新的输出到最旧的资料
-p :秀出后面所接的讯息重要性排序!请参考前一小节的rsyslogd 资讯
-f :类似tail -f 的功能,持续显示journal 日志的内容(即时监测时相当有帮助!)
--since --until:设定开始与结束的时间,让在该期间的资料输出而已
_SYSTEMD_UNIT=unit.service :只输出unit.service 的资讯而已
_COMM=bash :只输出与bash 有关的资讯
_PID=pid :只输出PID 号码的资讯
_UID=uid :只输出UID 为uid 的资讯
SYSLOG_FACILITY=[0-23] :使用syslog.h 规范的服务相对序号来呼叫出正确的资料!

logger让数据储存到日志文件中

[root@study ~]# logger [-p 服务名称.等级] "信息"
#-p 就是前文的 /etc/rsyslog.conf中的参数内容

保存journal方式

        无法储存上一次开机的信息;

那么就得要建立一个/var/log/journal 的目录,并且处理一下该目录的权限,那么未来重新启动systemd-journald.service 之后, 日志登录档就会主动的复制一份到/var/log/journal 目录下啰!

# 1. 先处理所需要的目录与相关权限设定
[root@study ~]# mkdir /var/log/journal 
[root@study ~]# chown root:systemd-journal /var/log/journal 
[root@study ~]# chmod 2775 /var/log/journal

# 2. 重新启动systemd-journald 并且观察备份的日志资料!
[root@study ~]# systemctl restart systemd-journald.service 
[root@study ~]# ll /var/log/journal/
drwxr-sr-x. 2 root systemd-journal 27 Aug 20 02:37 309eb890d09f440681f596543d95ec7a

分析日志文件

分析也很重要,以为日志里面有很多信息

系统自带的logwatch

第十九章 启动流程,模块管理,Loader

第十九章 启动流程,模块管理,Loader_幸存者^的博客-CSDN博客

第二十章 基础系统设置与备份策略

第二十章 基础系统设置与备份策略_幸存者^的博客-CSDN博客

第21章 软件的安装:源代码与Tarball

21章 软件的安装:源代码与Tarball_幸存者^的博客-CSDN博客

第22章 软件安装 RPM/ YUM

第22章 软件安装 RPM/ YUM_幸存者^的博客-CSDN博客

第23章 X window

第23章 X window_幸存者^的博客-CSDN博客

第二十四章 Linux内核编译与管理

第二十四章 Linux内核编译与管理_幸存者^的博客-CSDN博客

更多推荐

Linux 私房菜 笔记(完结)