Linux技术


1 Linux简介

1.1 Linux是什么

  Linux是一个操作系统(os),就像Windows 或者MacOS一样,主要应用在企业服务器领域。

  Linux内核,最初只是由芬兰人 李纳斯·托瓦兹(Linus Torvalds),在赫尔辛基大学上学时,出于个人爱好而编写的。

  Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。

  Linux能运行主要的UNIX工具软件、应用程序和网络协议,支持32位和64位硬件。

  Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

1.2 发行版

  Linux的发行版就是将Linux内核与应用软件做一个打包。

  目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、TurboLinux等。

1.3 应用领域与特点

应用领域 特点 应用领域 特点
嵌入式系统 免费开源 个人办公 安全病毒少
手机操作系统内核 多用户,多任务 性能稳定
服务器 支持多种平台,例如:ARM架构和X86架构

2 Linux系统结构

  操作系统是软件的集合,每个软件都是为特定功能而设计的。

  Linux OS具有以下组件:

2.1 内核

  Linux内核是操作系统的核心部分,在设备和软件之间建立通信。并且它管理系统资源。有四个职责:

  1.设备管理: 系统上连接了许多设备,例如CPU,存储设备,声卡,显卡等。内核将所有与所有设备相关的数据存储在设备驱动程序中(如果没有该内核,将无法以控制设备)。因此内核知道设备可以做什么以及如何操纵设备以发挥最佳性能。它还管理所有设备之间的通信。内核具有所有设备必须遵循的某些规则。

  2.内存管理: 内核必须管理的另一个功能是内存管理。内核跟踪已使用和未使用的内存,并确保进程不应使用虚拟内存地址来操纵彼此的数据。

  3.进程管理: 在进程中,管理内核会分配足够的时间并为进程分配优先级,然后再将CPU处理给其他进程。它还处理安全性和所有权信息。

  4.处理系统调用: 处理系统调用意味着程序员可以编写查询或要求内核执行任务。

2.2 系统库

  系统库是帮助访问内核功能的特殊程序。必须触发内核才能执行任务,并且该触发操作由应用程序完成。但是应用程序必须知道如何进行系统调用,因为每个内核都有一组不同的系统调用。程序员已经开发了一个标准的程序库来与内核进行通信。每个操作系统都支持这些标准,然后将这些标准转移到该操作系统的系统调用中。

  Linux最著名的系统库是Glibc(GNU C库)。

2.3 系统工具

  Linux OS具有一组实用程序工具,通常是简单的命令。它是GNU项目在其开放源代码许可下编写和发布的软件,因此每个人都可以免费使用该软件。

  借助命令,可以访问文件,编辑和操作目录或文件中的数据,更改文件的位置或任何其他内容。

2.4 开发工具

  通过以上三个组件,操作系统正在运行并正常工作。但是要更新系统,需要其他工具和库。这些额外的工具和库由程序员编写,称为工具链。工具链是开发人员用来生成有效应用程序的重要开发工具。

2.5 最终用户工具

  这些最终工具使系统对于用户而言是唯一的。终端工具对于操作系统不是必需的,但对于用户而言则是必需的。

  最终工具的一些示例是图形设计工具,办公套件,浏览器,多媒体播放器等。

3 下载安装Linux虚拟机

3.1 什么是虚拟机

  虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。

3.2 虚拟系统

  1. Parallels Desktop
  2. Vmware
  3. VirtualBox

3.3 安装VMware与Rocky

  VMware下载地址:https://www.vmware.com/cn/products/workstation-pro.html

  centos7下载地址:https://www.centos.org

4 配置Rocky Linux

4.1 配置静态ip与DNS

  1.配置静态ip

# 查看当前ip
[root@vm1 ~]# ifconfig
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.65.129  netmask 255.255.255.0  broadcast 192.168.65.255
        inet6 fe80::20c:29ff:fe10:22e5  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:10:22:e5  txqueuelen 1000  (Ethernet)
        RX packets 484  bytes 41020 (40.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 218  bytes 23052 (22.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...

修改为和动态ip为同一个网段,例如:192.168.65.128

# Rocky Linux 9的网卡配置文件在/etc/MetworkManager/system-connections/目录下,文件名一般为接口名.nmconnection,比如ens160.nmconnection

vim /etc/NetworkManager/system-connections/ens160.nmconnection
1.找到[ipv4]部分,把method=auto改为method=manual,并添加地址和DNS
2.重启网络使配置生效:
  sudo nmcli connection reload && sudo nmcli c up ens160

[connection]
id=ens160
uuid=51159305-436d-3497-b073-c2891d9db518
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1785512835

[ethernet]

[ipv4]
method=manual
address1=192.168.65.128/24,192.168.65.2
dns=8.8.8.

[ipv6]
addr-gen-mode=eui64
method=auto

[proxy]

  2.配置DNS

1.临时修改DNS
  编辑DNS配置文件:vim /etc/resolv.conf
  写入两行公共DNS:
  nameserver 114.114.114.114
  nameserver 8.8.8.8
  
2.永久设置DNS
  查看网卡名:nmcli connection show
  执行下面的命令设置DNS:
  nmcli connection modify ens160 ipv4.dns "114.114.114,8.8.8.8"  # ens160换成具体的网卡名称
  nmcli connection up ens160

4.2 修改主机名称

vim /etc/hostname
systemctl restart network

4.3 关闭firewalld和selinux

# 关闭firewalld
systemctl stop firewalld
systemctl disable firewalld

# 关闭selinux
vim /etc/selinux/config
SELINUX=disabled

4.4 配置远程登录

# 查看ssh服务器
[root@vm1 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)
     Active: active (running) since Fri 2026-07-31 16:27:07 CST; 24min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
   Main PID: 1522 (sshd)
      Tasks: 1 (limit: 24536)
     Memory: 6.5M
        CPU: 223ms
     CGroup: /system.slice/sshd.service
             └─1522 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
...

如果提示没有找到服务,需要安装

yum install -y openssl openssh-server
systemctl start sshd & systemctl enable sshd

4.5 上传和下载文件

# 安装
yum install vsftpd 

# 启动
systemctl start vsftpd

# 查看状态
systemctl status vsftpd

# 设置开机启动
systemctl enable vsftpd

5 vim编辑器

5.1 基本使用

  在终端键入vim命令和要编辑的文件的名字就可以启动vim编辑器(如在启动vim时未指定文件名或这个文件不存在,vim会开辟一段新的缓冲区域来编辑)。

  vim编辑器有三种操作模式:普通模式、插入模式、命令模式

  1.刚启动vim编辑器,默认进入普通模式,在这个模式下,vim编辑器会将按键解释成命令。

  2.在普通模式下键入i可进入插入模式(insert,键入a或者s也可进入插入模式),在插入模式下,vim会将光标位置输入的每个键都插入到缓冲区(即直接输入到文本中,并在屏幕上打印出来)。

  3.要退出插入模式返回普通模式话,就要键入退出键(ESC键,也就是Escape键)。 在普通模式下,若是vim能正确识别终端类型,就可以直接使用方向键在文本区域移动光标。

1.vim有独有的用来移动光标的命令
  h:左移一个字符
  j:下移一个字符
  k:上移一个字符
  l:右移一个字符
  Ctrl+F(PageDown):下翻一屏
  Ctrl+B(PageUp):上翻一屏
  gg:移到缓冲区第一行
  G:移到缓冲区最后一行
  num G:移到缓冲区第num行
  
2.vim编辑器在普通模式下可按冒号键``进入命令行模式,可以输入额外的命令来控制vim的行为
  q:如果未修改缓冲区数据,退出
  q!:取消所有对缓冲区数据的修改并退出
  w filename:将文件保存到另一个文件中
  wq:将缓冲区数据保存到文件中并退出

5.2 模式

模式 功能
命令模式 光标移动、复制、删除
输入模式 输入文本内容
末行模式 保存退出、设置环境

  1.命令模式

命令 解释 命令 解释
h j k l 左下上右 dd,ndd 删除1行,n是一个数字,n行
例如:dgg、dG、d$、d0 D
方向键 上下左右 yy,nyy 复制1行,复制n行
1G、nG n代表一个数字,去第1行或n行 p,P 粘贴到下一行,粘贴到上一行
gg 将光标定位到文章的顶端 u 撤销
G 将光标定位到文章的底端($定位光标到行尾,0和^定位光标到行首) ZZ 保存退出
x,X 向后删除一个字符、向前删除一个字符

  2.插入模式

命令 解释 命令 解释
a 字符后进入插入模式 I 在行首进入插入模式
i 当前字符位置进入插入模式 O 在上一行新创建一行进入插入模式
o 在下一行新创建一行进入插入模式 s 删除光标位置字符并进入插入模式
A 在行尾进入插入模式 S 删除光标所在行并进入插入模式

  3.末行模式

命令 说明 命令 说明
w 保存 set nonu 取消行号
:w /newfileq 另存为其他文件 例子:”:w /man.txt”退出 :w /newfile 另存为其他文件 例子:”:w /man.txt”
:r /newfilewq 读取/newfile到本文件中
“:r /etc/passwd”退出并保存
:r /newfile 读取/newfile到本文件中 例子: “:r /etc/passwd”
:! commandq! vim编辑过程中,查询linux “:! ls /“强制退出 :! command vim编辑过程中,查询linux “:! ls /“
: e!x 重新读取文件保存退出 : e! 重新读取文件
set nu 设置行号

  4.其他模式

v、V或Ctrl+V    # 可视模式
R              # 替换模式
/word,?word  # /向下查找,?向上查找
n,N          # 定位到下一个匹配字符,定位到上一个匹配字符

# 视图模式
# 视图模式修改方法:
ctrl+v , jjj,I,  写入#号,esc

5.3 缩进与保存

:set all         # 查看末行模式的帮助
:set autoindent  # 保存上下缩进
:set tabstop=2   # 调整tab键缩进
:set nu          # 设置行号

[root@foundation0 ~]# vim ~/.vimrc    仅对当前用户生效
set nu
set tabstop=2

[root@foundation0 ~]# vim /etc/vimrc  全局设置,每个用户使用vim工具都有行号
set nu

5.4 普通模式下编辑数据

  有些编辑命令允许使用数字修饰符来指定重复该命令多少次,如:命令2x会删除从光标当前位置开始的两个字符,命令5dd会删除从光标当前所在行开始的5行。 另外,vim编辑器在普通模式下通常会把删除键(Delete键)识别成x命令的功能,通常不识别退格键(Backspace键)。

x:删除当前光标所在位置的字符
dd:删除当前光标所在行
dw:删除当前光标所在位置的单词
d$:删除当前光标所在位置至行尾的内容
J:删除当前光标所在行行尾的换行符(拼接行)
u:撤销前一编辑命令
a:在当前光标后追加数据
A:在当前光标所在行行尾追加数据
r char:用char替换当前光标所在位置的单个字符
R text:用text覆盖当前光标所在位置的数据,直到按下ESC键

5.5 复制和粘贴

  vim编辑器在删除数据时,实际上会将数据保存在单独的一个寄存器中,可以用p命令取回。例如,可以用dd命令删除一行文本,然后把光标移动到缓冲区的某个要放置该文本的地方,然后用p命令,该命令会将文本插入到当前光标所在行之后。

  vim编辑器中复制命令是y(代表yank),可以在y命令后面使用和d命令相同的第二字符(如:yw代表复制一个单词,y$代表复制到行尾)。在复制文本后,把光标移动到想放置文本的地方,键入p命令,复制的文本就会出现在该位置。 复制命令一般在可视模式下使用。可视模式会在移动光标的同时高亮显示文本,键入v键可进入可视模式。

  可先在可视模式下覆盖要复制的文本,然后键入y命令来激活复制命令,之后移动光标到要放置文本的位置,使用p命令将寄存器中的文本粘贴下来。

5.6 查找和替换

  vim编辑器在普通模式下,可使用/(斜线键)来查找文本。按下/后,光标会跑到消息行,然后vim会显示出斜线。输入要查找的文本,按下回车键便可完成查找。

  vim编辑器会采用以下三种回应中的一种

  1.如果要查找的文本出现在光标位置之后,则光标会跳到该文本出现的第一个位置。

  2.如果要查找的文本未在光标当前位置之后出现,则光标会绕过文件末尾,出现在该文本所在的第一个位置(并用一条消息指明)。 输出一条错误消息,说明在文件中没有找到要查找的文本。 要继续查找同一个文本,可键入/(斜线键),然后键入回车键。或者键入n命令,表示下一个(next)。

  3.vim编辑器在命令行模式下可使用替换命令。替换命令的格式是::s/old/new/。vim编辑器会跳到old第一次出现的地方,并用new来替换。

  用以下命令来替换多处文本

:s/old/new/g       替换一行中的所有old
:n,ms:/old/new/g   替换行号n和m之间的所有old
:%s/old/new/g      替换整个文件中的所有old
:%s/old/new/gc     替换整个文件中的所有old,但在每次出现时提示,询问是否要替换

:s///   @@@  AAA  ; ;;
:s/old/new/
:s/old/new/g
:#,#s/old/new/g     #井号代表一个数字比如:1,5s/old/new/g
:%s/old/new/g
:#,$s/old/new/g    #井号代表数字,比如1,$s ,$代表末行,该命令为1行至末行

# 修改某一段ip地址: %s/192.168.1/172.25.250/g

# 取消文本中某个字段::%s/10.10.10.10//g

6 访问命令行

6.1 GNOME Shell

ALT+F2  输入 gnome-terminal    # 启动终端
win+l  # 锁定
#  关闭                 重启
  init 0               init 6
  poweroff             reboot
  systemctl poweroff   systemctl reboot
  shutdown -h 20:00   shutdown -r 0

ctrl+alt 上\|下 箭头   # 工作区切换

6.2 linux命令语法

  完成具体功能的命令、扩展该命令功能的选项、命令要操作的对象

  cmd 【-option】 【arg1】 【arg2】

简单的命令示例:
whoami
date
touch file1;mkdir dir1

完成某些工作的指令
扩展命令功能的选项
参数

ls
ls -a    
ls -a    ~/.bashrc
ls -a  -l  ~/.bashrc
ls -al  ~/.bashrc

6.3 命令的基础分类

# 回显式命令
  date +%Y%m%d  、 date +%Y-%m-%d

# 交互式命令
  passwd

# tab补全
按一下是补全、按两下列出可用命令
tab键  输入单词或命令前面几个首字母后,保证唯一可补全,不唯一可列出能选择的命令

# 历史命令-history
env--能容纳1000条
[root@servera ~]# env | grep SIZE
HISTSIZE=1000

[root@servera ~]# history -w 
[root@servera ~]# vim ~/.bash_history     记录历史命令文件,vim是一个文本工具,可以打开后面的文件,进入后:q退出
[root@servera ~]# history -c   清除
history的其他方法:
!!
!23    历史命令的编号
!h      命令首字母

当前历史命令支持的最大条数
[root@foundation0 /]# grep ^HISTSIZE /etc/profile
HISTSIZE=1000

历史命令存放文件路径
[root@foundation0 /]# set | grep HISTFILE
HISTFILE=/root/.bash_history
vim /etc/profile
export HISTFILE=/root/.newfile
source /etc/profile
history -w
cat /root/.newfile

ctrl+R 搜索历史命令

6.4 命令行快捷键

快捷键 说明 快捷键 说明
ctrl + shift + t 当前画面添加一个标签 ctrl + shift + =,ctrl + - 扩大与缩小终端字体
ctrl + shift + n 打开一个新的标签 ctrl + shift + w 关闭标签
alt + 1,alt + 2 切换标签

6.4 Shell常用快捷键

快捷键 说明 快捷键 说明
ctrl + a 光标跳至行首 ctrl + 右箭头 光标向右跳一个单词
ctrl + e 光标跳至行尾 ctrl + w 回删一个单词
ctrl + u 从光标所在位置清空至行首 alt + d 删除光标后一个单词
ctrl + k 从光标所在位置清空至行末 esc + . 或 alt + . 调用之前使用过的路径,alt+.一直点可以向上翻阅路径
ctrl + 左箭头 光标向左跳一个单词

7 从命令行管理文件

7.1 Linux目录结构

  当使用 ls /查看linux根目录时,结构如下图所示:

7.2 根目录

  一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中

目录名 作用
/bin:/usr/bin 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等
/boot linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文件,以及/boot/gurb
/dev linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备。
/etc 系统配置文件存放的目录,/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d
不建议在此目录下存放可执行文件
/home 系统默认的用户home家目录,新增用户账号时,用户的家目录都存放在此目录下
~:当前用户的家目录,~test:用户test的家目录。
/lib: /usr/lib: /usr/local/lib: 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助
比较重要的目录为/lib/modules
/lost+fount 系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下
如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found
/mnt:/media: 光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。
/opt: 给主机额外安装软件所摆放的目录。以前的 Linux 系统中,习惯放置在 /usr/local 目录下
/proc: 此目录的数据都在内存中,如系统核心、外部设备、网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo/proc/interrupts/proc/dma/proc/ioports/proc/net/
/root: 系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。
/sbin: /usr/sbin: /usr/local/sbin: 系统管理员使用的可执行命令,如fdiskshutdownmount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能查看而不能设置和使用。
/tmp: 用户或正在执行的程序临时存放文件的目录,任何人都可以访问
/srv: 服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www
/usr: 应用程序存放目录/usr/bin :应用程序 、/usr/share:存放共享数据、/usr/lib:存放不能直接运行的,却是许多程序运行所必需的一些函数库文件、/usr/local:软件升级包。 /usr/share/doc:系统说明文件存放目录、/usr/share/man :程序说明文件存放目录。
/var: 系统执行过程中经常变化的文件,如日志文件:/var/log/var/log/message:所有的登录文件存放目录, /var/spool/mail:邮件存放的目录, /var/run: 程序或服务启动后,其PID存放在该目录下。

7.2 FHS

  由于linux是开放源代码,各大公司和团体根据linux的核心代码做各自的操作、编程。这样就造成在根下的目录的不同以及个人不能使用他人的linux系统PC的情况。因为不知道一些基本的配置,文件在哪里。这就是FHS(Filesystem Hierarchy Standard )机构诞生的原因。该机构是linux爱好者自发的组成的一个团体,主要是是对linux做一些基本的要求(约定),不至于是操作者换一台主机就成了linux的文盲

  根据FHS(http://www.pathname.com/fhs/)的官方文件,主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

  事实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:

可分享的(shareable) 不可分享的(unshareable)
不变的(static) /usr(软件放置处)
/opt(第三方协力软件)
/etc(配置文件)
/boot(开机与核心档)
可变动的(variable) /var/mail(使用者邮件信箱)
/var/spool/news(新闻组)
/var/run(程序相关)
/var/lock(程序相关)

7.3 文件类型

文件类型 说明 全称
- 普通文件 file
d 目录文件 directory
c 字符设备文件 character
b 块设备文件 block
s 套接字文件 socket
p 管道文件 pipe
l 符号链接文件(软链接) symbolic

7.4 路径

# 路径的表示:
1.绝对路径(通常以/开头)
  例如:根开头    cd /etc/sysconfig
2.相对路径:
  非根开头 cd  ..
  
# 导航路径
# pwd
[root@foundation0 yum.repos.d]# pwd
/etc/yum.repos.d

# cd
cd -   返回之前的目录
cd or cd ~  家目录
cd .    当前目录
cd ..    上一级目录

7.5 通配符规则

通配符 规则
* 匹配0个或多个任意字符
匹配1个任意字符
[ ] 匹配中括号内一个字符
[ - ] 匹配中括号内连续范围的一个字符
[ ^ ] 取反,匹配非中括号内的字符,表示一定有一个字符,但不是中括号内出现的。【^ab】
{a,b}或{a..c} 匹配括号中的字符或连续的字符

8 从Linux获得帮助

8.1 内部命令与外部命令

  在linux系统中有存储位置的命令为外部命令;

  没有存储位置的为内部命令,内部命令嵌入在linux的shell中,所以看不到。

  type来判断到底为内部命令还是内部命令

[root@master ~]# type help
help is a shell builtin
[root@master ~]# type cd
cd is a shell builtin
[root@master ~]# type useradd
useradd is /usr/sbin/useradd
[root@master ~]# type passwd
passwd is /usr/bin/passwd

8.2 help

1.help命令

  内部命令的帮助文档 ,使用help的格式为:

help  命令
help cd
help ls

2.--help选项

  大多数外部命令都可以使用--help来获取帮助,格式为:

命令 --help
ls --help

8.3 man命令

  以全屏显示在线帮助,按q退出,上下键移动,格式为:

man 命令
man ls

1.输入 `?` 键,向前查找,如 `?-h` ,将会搜索含有`-h`的行
2.输入 `/` 键,向后查找,如 `/-k` ,将会向后搜索`-k`的行
3.按 `N`或者`n`(下一个)来进行上一个下一个相关匹配项查看。
4.man手册存放的位置 可以通过`manpath`命令来查看manpage的位置

  man手册说明:

命令 含义 命令 含义
man 1 可执行文件或者shell命令 man 6 游戏
man 2 系统调用(内核提供的函数) man 7 杂项(包括宏包)
man 3 库函数 man 8 系统管理员命令(通常给root用户使用)
man 4 特别的文件(通常在/dev man 9 内核例程(非标准例程)
man 5 文件格式,如/etc/passwd

  使用下面命令可以查看,就是man自己:

man man
man 1 passwd
man 5 passwd

  如果没有指定man在哪个板块中寻找,将会按照默认的顺序查找这些板块中的命令,只返回含有该命令的第一个文档,如果指定板块,则只会在指定板块中寻找该命令,所以有时候直接man而不指定板块则可能不会找到自己想要的文档。

  通过whatis查看一下该命令在man帮助文档中的入口

whatis passwd

8.4 info命令

  另一种在线帮助,和man功能类似,更加详细,格式:

info ls
info cd

一般用help ,--help足够,man来补充,info用的很少

8.5 获取帮助的总结

# man命令
mandb
man passwd
man -k passwd 
man 5 passwd
man setfacl | grep -B 1 lisa

# --help
setfacl --help | grep \\-a
setfacl --help | grep -w \\-a  

# pinfo
pinfo   回车  u
pinfo  ls

# rpm包中提供帮助
rpm -qa | grep httpd
rpm -ql 软件包名称
rpm -qc

9 Linux文件和目录管理

9.1 ls–列出目标目录

  ls命令用来列出目标目录(缺省为当前目录)中所有的子目录和文件。指令英文原义:list

  指令所在路径:/bin/ls

  执行权限:All User

1.语法
  ls [OPTION]... [FILE]...
  ls 选项[-alFR...]..... [目录]
  
2.基本用法
  默认显示当前目录下内容:ls
  显示指定目录下面的内容:ls /root
  逆序输出:ls -r
3.显示隐藏文件
  在 Linux 中以 `.`(dot)开头的目录和文件被理解为隐藏文件。`ls` 命令默认不会列出这些文件,除非你指定了 -a 选项。`-a` 选项其实是显示所有的文件,包含隐藏的文件和目录。
  ls -a
  
4.使用长格式显示更多信息
  长格式能够提供更多的信息,比如文件和目录的大小,最后更新的时间,所有者及其权限。使用 -l (小写的字母L) 选项可以输出长格式的信息
[root@master /]# ls -l
total 28
lrwxrwxrwx.   1 root root    7 Apr 26 22:43 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Apr 26 22:59 boot
...

5.排序
  ls 命令的输出默认是以字母序排列的,只是隐藏文件的 . 号没有参与排序规则。除了字母序,我们还能以文件的大小或最后修改时间为排序条件.
  以文件的大小排序:ls -lS
  最后修改时间排序:ls -lt

第1字段: 文件属性字段

  文件属性字段总共有10个字母组成,第一个字符表示文件类型

文件类型 含义 文件类型 含义
- 普通文件 c 字符设备文件(character)
d 目录 p 命令管道文件,与shell编程有关的文件
l 链接文件 s sock文件,与shell编程有关的文件
b 块设备文件(block),一般置于/dev目录下
设备文件是普通文件和程序访问硬件设备的入口,一类特殊文件。

  第1字符的后面9个字母表示该文件或目录的权限位。其中前三个表示文件拥有者的权限,中间三个表示文件所属组拥有的权限,最后三个表示其他用户拥有的权限

  r表是读 (Read) 、w表示写 (Write) 、x表示执行 (eXecute)

第2字段:文件硬链接数

  如果一个文件不是目录,此时这一字段表示这个文件所具有的硬链接数

第3字段:文件(目录)拥有者

第4字段:文件(目录)拥有者所在的组

第5字段: 文件所占用的空间(以字节为单位)

第6字段:文件(目录)最近访问(修改)时间

第7字段:文件名

9.2 cd pwd 切换显示目录

1.显示当前目录
  pwd
  
2.切换当前目录:cd命令
  命令语法:cd [-L|-P] [dir]
  基本用法:cd / 、  cd /etc
  特殊用法:1.切换到父目录 cd ..  cd ../..   点(`.`)代表当前目录,两个点(`..`)代表父目录
          2.切换到home目录   cd    cd ~    `~`表示home目录
          3.返回之前的目录    cd -

9.3 创建与删除目录

  1.创建目录mkdir

  mkdir 命令用来创建指定名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录

1.命令格式
  mkdir [选项] 目录...
2.命令参数
  `-m`, --mode=模式,设定权限模式 (类似 `chmod`)
  `-p`, --parents 可以创建一个多级目录
3.实例
  mkdir test           #创建test目录
  mkdir -p test1/test2 #创建多级目录
  mkdir -m 777 test3   #创建权限为777的目录

  2.删除目录rmdir

  rmdir命令是删除空目录,一个目录被删除之前必须是空的。删除某目录时也必须具有对父目录的写权限。

rm - r dir命令可代替rmdir,但是有很大危险性。

rmdir test

9.4 创建文件

  touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件。

1.命令格式
  touch [选项]... 文件...
  
2.命令参数
  `-a` 或--time=atime或--time=access或--time=use 只更改存取时间。
  `-c` 或--no-create 不建立任何文档。
  `-d` 使用指定的日期时间,而非现在的时间。
  `-f` 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
  `-m` 或--time=mtime或--time=modify 只更改变动时间。
  `-r` 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
  `-t` 使用指定的日期时间,而非现在的时间。

3.实例
  touch test1.log test2.log          # 创建不存在的文件
  touch -r test1.log test2.log       # 更新test1.log的时间和test2.log时间戳相同
  touch -t 202211142234.50 test1.log #设定文件的时间戳
  
注明:使用vim也可以创建一个文件

9.5 删除文件和目录

  rm命令的功能是删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。

1.命令格式
  rm [选项] 文件… 

2.命令参数
  `-f`  --force 忽略不存在的文件,从不给出提示。
  `-i`  --interactive 进行交互式删除
  `-r`  -R, --recursive 指示`rm`将参数中列出的全部目录和子目录均递归地删除。
  
3.实例
  rm test.txt     # 删除文件,系统会询问
  rm -f test.txt  # 强制删除,不询问
  rm test/        # 删除目录,系统会询问
  rm -f test/     # 删除目录,不询问
  rm -rf test/    # 递归删除目录及下面文件,不询问
  rm -rf test*    # 删除以test开头的文件,不询问
  rm -rf *.txt *.log

9.6 移动文件和目录

  mv用来移动文件或者将文件改名(move (rename) files),经常用来备份文件或者目录。

1.命令格式
  mv [选项] 源文件或目录 目标文件或目录
  
2.命令参数
  `-b`  若需覆盖文件,则覆盖前先行备份。
  `-f`  force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
  `-i`  若目标文件 (destination) 已经存在时,就会询问是否覆盖!
  `-u`  若目标文件已经存在,且 source 比较新,才会更新(update)
  `-t`  即指定`mv`的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。
  
3.实例
  mv test1.txt test2.txt # 重命名
  mv test1.txt test2.txt test      # 移动文件
  mv -t test test1.txt test2.txt   # 移动文件
  mv test* test                    # 使用通配符
  mv -i test1.txt test2.txt        # 将文件file1改名为file2,如果file2已经存在,则询问是否覆盖
  mv -f test1.txt test2.txt        # 将文件file1改名为file2,即使file2存在,也是直接覆盖掉。
  mv test1 test2                   # 移动目录
  mv * ../                         # 移动当前文件夹下的所有文件到上一级目录
  mv test3/*.txt test5             # 把当前目录的一个子目录里的文件移动到另一个子目录里

9.7 拷贝文件和目录

  cp命令用来复制文件或者目录

1.命令格式
  cp [选项]... [-T] 源 目的
  或:cp [选项]... 源... 目录
  或:cp [选项]... -t 目录 源...

  2.命令参数

参数 描述 参数 描述
-a 等同于-dR -i 交互式模式
覆盖目标文件之前先要进行询问
-b 若删除或者覆盖目标文件,将对目标文件进行备份,备份文件以备份的字符串结尾 .bak -l 建立硬链接,而非复制
-d 复制符号链接 -p 源目录或者文件的属性保留
修改日期、时间和访问控制列表等
-f 强制复制 -P 源目录或者文件的路劲保留
-h 强制cp命令复制符号链接。缺省值是跟随符号链接,也就是将文件复制到符号链接指向处。 -r/R 处理指定目录以及子目录

  3.实例

cp t1.txt test 		# 复制单个文件到目标目录,目标文件存在时,会询问是否覆盖
cp -r test1 test2 		# 复制目录需要加-r参数
cp -rf test1/* test2 	# 强制递归复制test1下面的所有内容到test2,不提示
cp * ../   			# 复制当前目录下面的文件到父母录
cp -rf * ../ 			# 复制文件和目录到父目录

9.8 显示合并文件

  cat命令是连接文件或标准输入并打印。常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,常与重定向符号配合使用。

1.命令格式
  cat [选项] [文件]...
  
2.三大功能
  一次显示整个文件:`cat filename`
  从键盘创建一个文件:`cat > filename` 只能创建新文件,不能编辑已有文件.
  将几个文件合并为一个文件:`cat file1 file2 > file

  3.命令参数

  -A, –show-all 等价于 -vET

  -b, –number-nonblank 对非空输出行编号

  -e 等价于 -vE

  -E, –show-ends 在每行结束处显示 $

  -n, –number 对输出的所有行编号,由1开始对所有输出的行数编号

  -s, –squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行

  -t 与 -vT 等价

  -T, –show-tabs 将跳格字符显示为 ^I

  -u (被忽略)

  -v, –show-nonprinting 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外

  4.实例

 cat test.txt  				# 显示test.txt文件内容
 cat test1.txt test2.txt 	# 同时显示这两个文件内容
 cat > t1.txt               # 从键盘输入内容到t1.txt ctrl+d 结束
 cat > test2.txt << EOF     # 从键盘输入内容到t1.txt使用EOF作为文件结束
 > test1
 > test2
 > EOF
 cat << EOF > test2.txt      # 从键盘输入内容到t1.txt使用EOF作为文件结束(也可以放在前面)
 cat t1.txt t2.txt > t3.txt  # 将t1 t2合并到t3 覆盖
 cat t1.txt t2.txt >> t3.txt  # 将t1 t2合并到t3 追加不是覆盖
 
# 快速编辑一个文件
cat >> hosts << EOF
192.168.18.128 node01
192.168.18.138 node02
192.168.18.148 node03
EOF

9.9 输入输出重定向

  所谓重定向,就是重新定义输入和输出的方向,例如:本来要讲一个命令输出在标准输出(终端显示),但是把它重定向到了一个文件里面(写入文件里)这就是重定向。

  1.文件描述符

  文件描述符可以理解为 Linux 系统为文件分配的一个数字,范围是 0-3 。

名称 类型 文件描述符 操作
标准输入 standard input 0 <,<<
标准输出 standard output 1 >,>>
标准错误输出 standard error output 2 2>,2>>

< >覆盖

>> << 追加

  2.Linux 命令执行过程

  1.用户开始从键盘(键盘在 Linux 上属于文件)输入数据,也就是系统从文件中读取数据的时候

  2.shell 将接受到的数据(标准输入)传递给相应的命令开始执行

  3.执行成功后,即可获得标准正确输出。(no)执行失败后,获得标准错误输出

  4.在默认情况下,标准正确输出的结果与标准错误输出的缺省输出都为当前用户执行的终端

  命令执行前会准备好所有的输入输出,默认分别绑定 stdin(0),stdout(1),stderr(2)。如果在准备命令的时候出现错误,那么这个命令将不会执行

  3.使用Linux重定向的命令

  重定向能够实现Linux命令的输入输出与文件之间重定向,以及实现将多个命令组合起来实现更加强大的命令。这部分涉及到的比较多的命令主要有:

命令 说明 命令 说明
cat 连接文件 head 输出文件的头部
sort 排序文本行 grep 打印匹配制定模式的行
uniq 忽略或者报告重复行 tail 输出文件的尾部
wc 统计文件的行数、词数、字节数 tee 从标准输入读,并往标准输出或者文件写

  4.输出重定向

command-line1 [1-n] > file或文件操作符或设备
命令说明:
    将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的) 重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。

ls > test.txt    #标准输出重定向到test.txt,文件不存在就创建,覆盖
ls >> test.txt   #追加
ls test.txt test1.txt 1>suc.txt 2>err.txt # 正确输出到suc.txt 错误输出到err.txt(text1.txt不存在)

  5.输入重定向

command-line [n] <file或文件描述符&设备
命令说明:
    命令默认从键盘获得的输入,改成从文件,或者其它打开文件以及设备输入。执行这个命令,将标准输入0,与文件或设备绑定。将由它进行输入。
    
[root@master ~]# cat >  test.txt
test
test
#按下 [ctrl]+d 离开 在linux按ctrl-d就代表EOF。
#从标准输入【键盘】获得数据,然后输出给test.txt文件

[root@master ~]# cat > test1.txt < test.txt
#cat 从test.txt 获得输入数据,然后输出给文件test1.txt

  执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得很低效了!

  这个时候,就可以使用EOF结合cat命令进行行内容的追加了。 EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF. EOF一般会配合cat能够多行文本输出. 其用法如下:

<<EOF     //开始
....
EOF      //结束

还可以自定义,比如自定义:
<<BBB     //开始
....
BBB       //结束

cat >> hosts << EOF
192.168.18.128 node01
192.168.18.138 node02
192.168.18.148 node03
EOF

9.10 more less查看文件

  more功能类似 catcat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。

1.命令格式
  more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 
  
2.命令参数
  +n   从笫n行开始显示
  -n    定义屏幕大小为n行
  +/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示 
  -c    从顶部清屏,然后显示
  -d    提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
  -l    忽略Ctrl+l(换页)字符
  -p    通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
  -s    把连续的多个空行显示为一行
  -u    把文件内容中的下画线去掉
  
3.常用操作命令
  Enter  向下n行,需要定义。默认为1行
  Ctrl+F  向下滚动一屏
  空格键 向下滚动一屏
  Ctrl+B 返回上一屏
  =    输出当前行的行号
  :f   输出文件名和当前行的行号
  V   调用vi编辑器
  !命令  调用Shell,并执行命令 
  q    退出more
    
4.实例
  more /etc/passwd
  more +5 /etc/passwd #从第五行开始显示
  more -5 /etc/passwd #每屏显示5行
  more +/sbin /etc/passwd # 从文件中查找第一个出现"sbin"字符串的行,并从该处前两行开始显示输出

  less 工具也是对文件或其它输出进行分页显示的工具,功能很强大。less 的用法比起 more 更加的有弹性。 在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按 键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。

1.命令格式
  less [参数] 文件 

2.命令参数
  -b <缓冲区大小> 设置缓冲区的大小    -e 当文件显示结束后,自动离开
  -f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件   -g 只标志最后搜索的关键词
  -i 忽略搜索时的大小写    -m 显示类似more命令的百分比
  -N 显示每行的行号        -o <文件名> 将less 输出的内容在指定文件中保存起来
  -Q 不使用警告音          -s 显示连续空行为一行
  -S 行过长时间将超出部分舍弃    -x <数字> 将“tab”键显示为规定的数字空格
  / 字符串:向下搜索“字符串”的功能
  ? 字符串:向上搜索“字符串”的功能
  n:重复前一个搜索(与 / 或 ? 有关)
  N:反向重复前一个搜索(与 / 或 ? 有关)
  b 向后翻一页
  d 向后翻半页
  h 显示帮助界面
  Q 退出less 命令
  u 向前滚动半页
  y 向前滚动一行
  空格键 滚动一行
  回车键 滚动一页
  [pagedown]: 向下翻动一页
  [pageup]:  向上翻动一页
  
3.实例
  less /etc/passwd    # 显示结束按q退出
  less -e /etc/passwd # 当文件显示结束后,自动离开
  less -m /etc/passwd # 显示百分比
  less /etc/passwd    # 输入 /root 和 ?root 查找

9.11 命令head和tail

  headtail 用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 就是看档案的结尾。

head
1.命令格式
  head [参数]... [文件]... 

2.命令参数
  -q 隐藏文件名
  -v 显示文件名
  -c<字节> 显示字节数
  -n<行数> 显示的行数

3.实例
  head /etc/passwd 		# 默认显示前10行
  head -n 3 /etc/passwd 	# 显示前三行
  head -c 20 /etc/passwd 	# 显示前20个字节
  head -c -20 /etc/passwd # 显示后20个字节
  
tail
1.命令格式
  tail[必要参数][选择参数][文件] 
  
2.命令参数
  -f 循环读取
  -q 不显示处理信息
  -v 显示详细的处理信息
  -c<数目> 显示的字节数
  -n<行数> 显示行数
  --pid=PID 与-f合用,表示在进程ID,PID死掉之后结束. 
  -q, --quiet, --silent 从不输出给出文件名的首部 
  -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒 

3.实例
  tail /etc/passwd  # 默认显示末尾10行
  tail -n 5 /etc/passwd # 显示最后5行
  top > test.txt # 将top输出到test.txt 用于测试
  tail -f test.txt # 监控文件变化

10 用户和用户组管理

10.1 用户和组的基本概念

  用户和组是操作系统中一种身份认证资源。

  每个用户都有用户名、用户的唯一编号uid(user id)、所属组及其默认的shell,可能还有密码、家目录、附属组、注释信息等。

  每个组也有自己的名称、组唯一编号gid(group id)。一般来说,gid和uid是可以不相同的,但绝大多数都会让它们保持一致,大致属于约定俗成类的概念吧。

  组分为主组(primary group)和辅助组(secondary group)两种,用户一定会属于某个主组,也可以同时加入多个辅助组。

10.2 用户分类

  在Linux中,用户分为3类

  1.超级管理员

  超级管理员是最高权限者,它的uid=0,默认超级管理员用户名为root。因为uid默认具有唯一性,所以超级管理员默认只能有一个(如何添加额外的超级管理员,见useradd命令),但这一个超级管理员的名称并非一定要是root。但是没人会去改root的名称,在后续非常非常多的程序中,都认为超级管理员名称为root,这里要是一改,牵一发而动全身。

  2.系统用户

  有时候需要一类具有某些特权但又不需要登录操作系统的用户,这类用户称为系统用户。它们的uid范围从201到999(不包括1000),有些老版本范围是1到499(centos 6),出于安全考虑,它们一般不用来登录,所以它们的shell一般是/sbin/nologin,而且大多数时候它们是没有家目录的。

  3.普通用户

  普通用户是权限受到限制的用户,默认只能执行/bin/usr/bin/usr/local/bin和自身家目录下的命令。它们的uid从500开始。尽管普通用户权限收到限制,但是它对自身家目录下的文件是有所有权限的。

  超级管理员和其他类型的用户,它们的命令提示符是不一样的。uid=0的超级管理员,命令提示符是”#“,其他的为”$“。

  默认root用户的家目录为/root,其他用户的家目录一般在/home下以用户名命名的目录中,如ghz这个用户的家目录为/home/ghz。当然,家目录是可以自定义位置和名称的。

10.3 用户管理

  Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。

  用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

  每个用户账号都拥有一个唯一的用户名和各自的口令。

  用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

  1.添加用户

useradd 选项 用户名
# 用户名:指定新账号的登录名

  参数说明:

参数 说明
-c comment 指定一段注释性描述
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
-g 用户组 指定用户所属的用户组
-G 用户组 指定用户所属的附加组
-s Shell文件 指定用户的登录Shell
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
useradd tom
id tom

使用id tom查看用户信息,在home下查看tom 主目录 ,使用 ls -al 查看 /home/tom

  2.为用户设置密码

  用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

  指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

passwd 选项 用户名
1.可使用的选项:
  -l 锁定口令,即禁用账号。lock
  -u 口令解锁。unlock
  -d 使账号无口令。
  -f 强迫用户下次登录时修改口令。

2.如果默认用户名,则修改当前用户的口令。
3.实例
  passwd # 默认修改当前登录用户密码
  passwd tom # 修改tom密码
  passwd -l tom #禁用tom账号
  passwd -u tom #解锁tom账号
  passwd -d tom #tom无口令
  passwd -f tom # 强迫tom下次登录时修改口令

  4.删除用户

  删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

1.删除用户的格式
  userdel 选项 用户名

2.常用的选项是 `-r`,作用是把用户的主目录一起删除
  userdel -r tom
  备注:此命令删除用户tom在系统文件中(主要是`/etc/passwd`, `/etc/shadow`, `/etc/group`等)的记录,同时删除用户的主目录。

  5.修改用户

  usermod修改用户基本信息。

usermod [选项] 登录名

常用选项:
  `-d`,--home HOME_DIR 用户的新主目录
  `-g`,--gid GROUP 强制GROUP为新主组
  `-G`,--group GROUPS 新的附加组列表GROUPS(去除原有附加组)
  `-L`,--lock 锁定用户账户
  `-m`,--move-home  将主目录位置移至新位置(仅与-d一起使用)
  `-m`,--move-home 将主目录内用移至新位置(仅与-d选项一起使用)
  `-s`,--shell SHELL 该用户账户的新登录shell
  `-u`,uid UID  用户账户的新UID
  `-U`,--unlock 解锁用户账户

实例:
   [root@master ~]# useradd kite
   [root@master ~]# id kite
   uid=1002(kite) gid=1002(kite) groups=1002(kite)
   [root@master ~]# usermod -u 1111 kite  # 修改kite uid
   [root@master ~]# id kite
   uid=1111(kite) gid=1002(kite) groups=1002(kite)

   [root@master home]# ls
   ghz  kite_home  tom
   [root@master home]# usermod -m -d /home/kite kite  # 修改kite主目录
   [root@master home]# ls
   ghz  kite  tom

10.4 切换用户

  1.su:用于切换用户用。

su [选项]... [-] [用户 [参数]... ]

从普通用户切换到root需要密码,root切换到普通用户不需要密码

  2.susu -的区别

  单纯使用su切换到root,读取变量的方式是non-login shell,这样的方式下非常多的变量都不会改变。尤其是PATH。所以root用的非常多的命令都仅仅能用绝对路径来运行。这样的方式仅仅是切换到root的身份。用su -这样的方式的话,是login shell方式,它是先以root身份登录然后再运行别的操作。

[root@master /]# su tom
[tom@master /]$ pwd
/
[tom@master /]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[tom@master /]$ exit
exit
[root@master /]# su - tom
Last login: Thu May  5 18:04:44 PDT 2022 on pts/0
[tom@master ~]$ pwd
/home/tom
[tom@master ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/tom/.local/bin:/home/tom/bin
[tom@master ~]$

  3.sudo

  相比于su切换身份须要用户的password,sudo仅仅是须要自己的password,就能够以其它用户的身份来运行命令。常常是以root的身份运行命令,并不是全部人都能够用sudo。

  sudo是依赖于/etc/sudoers这个配置文件的。例如:我们以普通用户身份运行下面命令:

[root@master /]# su tom
[tom@master /]$ sudo cat /etc/shadow

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for tom:
tom is not in the sudoers file.  This incident will be reported.

  sudo的运行有这样一个流程:

  1.当用户运行sudo时,系统于/etc/sudoers文件里查找该用户是否有运行sudo的权限;

  2.若用户具有可运行sudo的权限,那么让用户输入用户自己的password。

  3.假设password正确。便开始进行sudo后面的命令,root运行sudo是不须要输入password的,切换到的身份与运行者身份同样的时候,也不需要输入password。

  4.sudoers内容

...
Defaults   !visiblepw

Defaults    always_set_home
Defaults    match_group_by_gid

Defaults    always_query_group_plugin

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
...
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
...
root    ALL=(ALL)       ALL
...
%wheel  ALL=(ALL)       ALL
...

编辑该文件必须使用 visudo命令

  使用visudo -f sudoers命令,在该文件中添加如下内容:

tom    ALL=(ALL)       ALL

  再次运行下面命令,输入密码后就可以查看了。

[root@master /]# su tom
[tom@master /]$ sudo cat /etc/shadow

  sudo能够更好分工,仅仅要配置好/etc/sudoers,这样sudo能够保护系统更安全,并且分工明白,有条不紊。

10.5 Linux组管理

  每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。

  不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

  用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

  1.增加用户组

groupadd 选项 用户组
   可以使用的选项有:
   -g GID 指定新用户组的组标识号(GID)
   -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同
   
实例:
# groupadd group1
  此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1
  
# groupadd -g 101 group2
  此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101

  2.删除用户组

groupdel 用户组

# groupdel group1 
  此命令从系统中删除组group1

  3.修改用户组

groupmod 选项 用户组

常用的选项有:
   -g GID 为用户组指定新的组标识号
   -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同
   -n 新用户组 将用户组的名字改为新名字

实例:
# groupmod -g 102 group2
  此命令将组group2的组标识号修改为102

# groupmod –g 10000 -n group3 group2
  此命令将组group2的标识号改为10000,组名修改为group3

  4.切换用户组

  用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

$ newgrp root

  这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。

10.6 与用户和组相关的配置文件

  1.用户的配置文件/etc/passwd

  /etc/passwd文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中可以清晰的看出,各内容之间又通过”:”号划分了7个字段,这7个字段分别定义了账号的不同属性,passwd文件实际内容如下:

[root@node01 tom]# head -10 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

  在passwd文件中,第一行内容就是超级用户root行,可以看到它的uid和gid都为0.为了方便理解,下面是各字段的描述:

字段1:帐号名,这是用户登陆时使用的账户名称,在系统中是唯一的,不能重名
字段2:密码占位符x;早期的unix系统中,该字段是存放账户和密码的,由于安全原因,后来把这个密码字段内容移到/etc/shadow中了。      这里可以看到一个字母x,表示该用户的密码是/etc/shadow文件中保护的。
字段3:UID;范围是0-65535
字段4:GID;范围是0-65535;当添加用户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组。
字段5:用户说明;这个字段是对这个账户的说明
字段6:宿主目录;用户登陆后首先进入的目录,一般与"/home/用户名"这样的目录
字段7:登录Shell   当前用户登陆后所使用的shell,在centos/rhel系统中,默认的shell是bash;如果不希望用户登陆系统,可以通过usermod      或者手动修改passwd设置,将该字段设置为/sbin/nologin 即可。大多数内置系统账户都是/sbin/nologin,这表示禁止登陆系统。      这是出于安全考虑的。

  2.passwd中UID的限制说明

0:当用户的UID为0时,表示这个账户为超级用户;如果要增加一个系统管理员账户的话,只需将该账户的UID改为0即可
1~999:这个范围是保留给系统用户使用的UID
1000~65535:普通账户UID

[root@Web ~]# ls -l /etc/passwd
-rw-r--r--. 1 root root 1665 411 14:13 /etc/passw

  每个用户登录时都需要取得UID和GID来判断权限问题,所以/etc/passwd的权限为644,即所有的用户都可以读/etc/passwd文件,即使文件内的密码是加密的,但还是存在一定的被攻击破解的安全隐患。因此,就有了/etc/shadow文件。

  3.用户的影子口令文件/etc/shadow

root@Web ~]# ls -l /etc/shadow
----------. 1 root root 1059 411 14:13 /etc/shadow

[root@Web ~]# head -5 /etc/shadow
root:$6$jmM2rFzPCFbmqBkf$oz3AUooR3qaV5uXU67HcXlYiE3hNf0sSsunk1eBTDPrGUOM1xYCyesGoj.ZLTIzdiXEdrnnqNyC5g8SsRnxQm.:16338:0:99999:7:::
bin:*:15615:0:99999:7:::
daemon:*:15615:0:99999:7:::
adm:*:15615:0:99999:7:::
lp:*:15615:0:99999:7:::

  shadow文件的每一行内容,也是以冒号(:)作为分隔符,共9个字段,其各个字段的意义如下表:

字段1:帐号名称
字段2:加密的密码
字段3:最近更改密码的时间;从1970/1/1到上次修改密码的天数
字段4:禁止修改密码的天数;从1970/1/1开始,多少天之内不能修改密码,默认值为0
字段5:用户必须更改口令的天数;密码的最长有效天数,默认值为99999
字段6:警告更改密码的期限;密码过期之前警告天数,默认值为7;在用户密码过期前多少天提醒用户更改密码
字段7:不活动时间;密码过期之后账户宽限时间 3+5;在用户密码过期之后到禁用账户的天数
字段8:帐号失效时间,默认值为空;从1970/1/1日起,到用户被禁用的天数
字段9:保留字段(未使用),标志
  • 密码过期:一旦超过密码过期日期,用户成功登陆,Linux会强迫用户设置一个新密码,设置完成后才开启Shell程序
  • 账户过期:若超过账户过期日期,Linux会禁止用户登陆系统,即使输入正确密码,也无法登陆

  4.用户组配置文件/etc/group

  /etc/group 文件是用户组的配置文件,内容包括用户与用户组,并且能显示用户归属哪个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特性。如果某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进入。

  /etc/group文件就是记录GID与用户组的文件。/etc/group文件同/etc/passwd类似,其文件权限也是644:

[root@Web ~]# ls -l /etc/group
-rw-r--r--. 1 root root 832 411 14:13 /etc/group

[root@Web ~]# head -5 /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon

  group文件各个字段的详细说明:

字段1:组账户名称
字段2:密码占位符x;通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为'x'。这类似/etc/shadow
字段3:组账户GID号,用户组ID
字段4:本组的成员用户列表;加入这个组的所有用户账号

  5.用户组的影子文件/etc/gshadow

  /etc/gshaow是/etc/group的加密文件,比如用户组的管理密码就是存放在这个文件。/etc/group和/etc/gshadow是互补的两个文件;比如大型服务器,针对很多用户和用户组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。比如不想让一些非用户组成员永久拥有用户组的权限和特性,这时就可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码;/etc/gshadow格式如下,每个用户组独占一行;

[root@Web ~]# ls -l /etc/gshadow
----------. 1 root root 682 411 14:13 /etc/gshadow

[root@Web ~]# head -5 /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon

  gshadow文件中各个字段详细说明:

字段1:组账号的名称
字段2:加密后的密码字符串,这个字段可以空的或者!;如果是空的或有!,表示没有密码
字段3:本组的管理员列表;这个字段也可为空;如果有多个用户组管理员,用,号分隔
字段4:本组的成员列表;加入这个组的所有用户账户;列表中多个用户通过","分隔

11 Linux权限和角色

  Linux权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户或用户组可以对特定文件进行相应的操作。

11.1 三种权限

权限 对文件的影响 对目录的影响
r(读取) 可读取文件内容 可列出目录内容
w(写入) 可修改文件内容 可在目录中创建删除内容
x(执行) 可作为命令执行 可访问目录内容

目录必须拥有 x 权限,否则无法查看其内容

11.2 三种角色

  Linux权限授权,默认是授权给三种角色,分别是user、group、other,Linux权限与用户之间的关联是:U代表User、G代表Group、O代表Other

  每个文件的权限基于UGO进行设置,权限三位一组(rwx),同时需授权给三种角色,UGO。每个文件拥有一个所属用户和所属组,对应UGO,不属于该文件所属用户或所属组使用O来表示。

  使用ls -l命令查看文件列表:

[root@master ~]# ls -l
total 28
drwxr-xr-x. 2 root root     6 Apr 27 00:05 Desktop
...

第1字段: 文件属性字段

  文件属性字段总共有10个字母组成,第一个字符表示文件类型

  字母-表示该文件是一个普通文件

  字母d表示该文件是一个目录

  字母l表示该文件是一个链接文件

  字母b表示该文件是块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,一类特殊文件。

  字母c表示该文件是一个字符设备文件(character)

  字母p表示该文件为命令管道文件。与shell编程有关的文件。

  字母s表示该文件为sock文件。与shell编程有关的文件。

  第1字符的后面9个字母表示该文件或目录的权限位。其中前三个表示文件拥有者的权限,中间三个表示文件所属组拥有的权限,最后三个表示其他用户拥有的权限

  r表是读 (Read) 、w表示写 (Write) 、x表示执行 (eXecute)

第2字段:文件硬链接数

  如果一个文件不是目录,此时这一字段表示这个文件所具有的硬链接数

第3字段:文件(目录)拥有者

第4字段:文件(目录)拥有者所在的组

第5字段: 文件所占用的空间(以字节为单位)

第6字段:文件(目录)最近访问(修改)时间

第7字段:文件名

11.3 使用chmod命令修改权限

  修改某个用户、组对文件夹的权限,用命令chmod实现,其中以代指ugo,+-=代表加入、删除和等于对应权限.

1.命令格式
  chmod [-cfvR] [--help] [--version] mode file  

2.命令参数
  `-c` 当发生改变时,报告处理信息 
  `-f` 错误信息不输出 
  `-R` 处理指定目录以及其子目录下的所有文件 
  `-v` 运行时显示详细处理信息
  
3.权限范围
  `u` :目录或者文件的当前的用户 
  `g` :目录或者文件的当前的群组 
  `o` :除了目录或者文件的当前用户或群组之外的用户或者群组 
  `a` :所有的用户及群组
  
4.权限代号
  `r` :读权限,用数字`4`表示 
  `w` :写权限,用数字`2`表示 
  `x` :执行权限,用数字`1`表示 
  `-` :删除权限,用数字`0`表示 
  `s` :特殊权限
  
<权限范围>+<权限设置> 使权限范围内的目录或者文件具有指定的权限
<权限范围>-<权限设置> 删除权限范围的目录或者文件的指定权限
<权限范围>=<权限设置> 设置权限范围内的目录或者文件的权限为指定的值

chmod  –R  u+rwx  test # 授予用户对test目录拥有rwx权限

rwx看成二进制数,如果有则用1表示,没有则有0表示,那么rwx则可以表示成为:111

  1.权限与数值

权限 数值 权限 数值
rwx rwx rwx 777 rw- r– r– 644
rwx rw- r– 764 rw- rw- r– 664

  2.文字设定法

chmod [who] [+ || =] [mode] 文件名
命令中各选项的含义为:
  1.操作对象who可是下述字母中的任一个或者它们的组合:
    - u 表示“用户(user)”,即文件或目录的所有者
    - g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户
    - o 表示“其他(others)用户”
    - a 表示“所有(all)用户”,是系统默认值
  
  2.操作符号可以是:
    - \+ 添加某个权限。
    - – 取消某个权限。
    - = 赋予给定权限并取消其他所有权限(如果有的话)。
    - 设置mode所表示的权限可用下述字母的任意组合:
    - r 可读。
    - w 可写。
    - x 可执行。
    - X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
    - s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
    - t 保存程序的文本到交换设备上。
    - u 与文件属主拥有一样的权限。
    - g 与和文件属主同组的用户拥有一样的权限。
    - o 与其他用户拥有一样的权限。
    - -c : 若该档案权限确实已经更改,才显示其更改动作
    - -f : 若该档案权限无法被更改也不要显示错误讯息
    - -v : 显示权限变更的详细资料
    - -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
    - –help : 显示辅助说明
    - –version : 显示版本
    
  3.文件名:以空格分开的要改变权限的文件列表,支持通配符。在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:
    chmod g+r,o+r example # 使同组和其他用户对文件example 有读权限
    
  4.实例
    chmod  –R  u+rwx  test # 授予用户对test目录拥有rwx权限
    chmod  –R  g+rwx  test # 授予组对test目录拥有rwx权限
    chmod  –R  u+rwx,g+rwx,o+rwx  test # 授予用户、组、其他人对test目录拥有rwx权限
    chmod  –R  u-w  test # 撤销用户对test目录拥有w权限
    chmod  –R  u-x,g-x,o-x test # 撤销用户、组、其他人对peter.net目录拥有x权限
    chmod  –R  u=rx,g=rx,o=rx  peter.net # 授予用户、组、其他人对test目录只有rx权限

  3.数字设定法

  首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。

  如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。

1.数字设定法的一般形式为:
  chmod [mode] 文件名
  
2.实例
  chmod 644 test.txt
  - 文件属主(u)拥有读、写权限
  - 与文件属主同组人用户(g) 拥有读权限
  - 其他人(o) 拥有读权限
  
  chmod 750 test.txt
  - 文件主本人(u)可读/可写/可执行权
  - 与文件主同组人(g) 可读/可执行权
  - 其他人(o) 没有任何权限

11.4 修改所属组

  文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以。chgrp命令就是change group的缩写!要被改变的组名必须要在/etc/group文件内存在才行。

1.命令格式
  chgrp [选项] [] [文件]
  
2.命令参数
  `-c` 当发生改变时输出调试信息
  `-f` 不显示错误信息
  `-R` 处理指定目录以及其子目录下的所有文件
  `-v` 运行时显示详细的处理信息
3.实例
  groupadd testgrp
  chgrp test testgrp # 修改test属于testgrp组
  [root@master ~]# ll test 
  total 0
  -rw-r--r-- 1 root testgrp 0 May  5 23:46 t1.txt
  chgrp root t1.txt # 修改t1.txt属于root组

11.5 修改文件或者目录的拥有者

  chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。

  系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。

1.命令格式
  chown [选项]... [所有者][:[]] 文件...
  
2.命令参数
  `-c` 显示更改的部分的信息
  `-f` 忽略错误信息
  `-h` 修复符号链接
  `-R` 处理指定目录以及其子目录下的所有文件
  `-v` 显示详细的处理信息
  
3.实例
  chown mail:mail test.log # 改变拥有者和群组
  [root@master ~]# ll
  drwxr-xr-x  2 mail mail        6 May  6 00:02 test.log
  
  chown tom: t1.txt        # 改变拥有者和群组
  [root@master test]# ll
  total 0
  -rw-r--r-- 1 tom tom 0 May  5 23:46 t1.txt
  
  chown :root t1.txt       #  只改变群组
  [root@master test]# ll
  total 0
  -rw-r--r-- 1 tom root 0 May  5 23:46 t1.txt
  
  chown -R root:root test  # 改变指定目录以及其子目录下的所有文件的拥有者和群组 

11.6 文件默认权限

#系统默认定义权限对于文件是666、对于目录是777

#查看umask值
[root@servera /]# umask
0022

#修改方法umask
[root@servera /]# umask 0002
修改完后,可以去文件和目录查看权限,看是否和之前不一样,看完改回来

#永久生效
[root@servera /]# echo 'umask 0002' >> ~/.bash_profile

#将后面文件中的值加载到当前shell中。系统登录会读取~/.bash_profile文件自动加载
[root@servera /]# source ~/.bash_profile  #source 

  1.umask的计算

# 示例:
文件默认权限666
umask后三位022
快捷方法:变成权限后相减
rw-rw-rw-  =  666  文件系统默认权限
----w--w-  =  022  umask值
------------------------------
rw-r--r--  =  644  创建文件时的默认权限

目录默认权限777
rwxrwxrwx  =  777  目录系统默认权限
----w--w-  =  022  umask值
------------------------------
rwxr-xr-x  =  755  创建目录时的默认权限
故系统中应设置为:0022

参考umask计算方法:https://www.cnblogs.com/wyllearning/p/16482006.html
如果减法时目录和文件权限不一致时,以目录的为准计算umask值

11.7 特殊权限

  文件系统权限可以完成一些基本权限功能设置,但有些特殊要求是达不到的,可能需要特殊权限来完成

  Linux系统中特殊权限有三个:SUID 4 、SGID 2 、SBIT 1

  1.SUID 4

# 通常设置在二进制可执行文件(命令)上,并具有执行权限的情况下
# 作用:设置了该权限的命令,被其他用户执行时,会临时获取文件所有者权限
[student@clear ~]$ cat /etc/shadow   #普通用户无法查看/etc/shadow
[student@clear ~]$ su - root         #切换root身份
[root@clear ~]# chmod u+s /usr/bin/cat   #数字修改方式:chmod 4755 /usr/bin/cart
[root@clear ~]# ll /usr/bin/cat
-rwsr-xr-x. 1 root root 34512 Aug 13  2018 /usr/bin/cat
[student@clear ~]$ su - studnet
[student@clear ~]$ cat /etc/shadow #能够看见内容,临时获取拥有者权限

#数字修改法:chmod 4755 /usr/bin/cat

# check:创建两个不同用户登录操作系统,进入dirt目录分别创建文件,尝试互相删除对方文件,结果应不能互相删除文件

# 大S和小s区别,
  1.执行权限位大S是,没有x
  2.执行权限位小s是该位,有x

  2.SGID 2

#该权限通常设置在`目录`上,设置了该权限的目录,在该目录中创建`子文件及目录`时会`继承`父目录所属组
[root@clear opt]# chmod g+s dir1
[root@clear opt]# ll -d dir1
drwxr-sr-x. 2 student student 22 Nov 19 04:51 dir1
[root@clear opt]# touch dir1/root1.txt
[root@clear opt]# ll dir1/root1.txt
-rw-r--r--. 1 root student 0 Nov 19 04:52 dir1/root1.txt

#数字修改法: chmod 2755 dir1

  3.SBIT 1

#该权限通常设置在目录上,设置了该权限的目录,其他用户在该目录中只能删除所有者是自己的文件
[root@clear opt]# chmod 1777 /opt/share/
[root@clear opt]# ll -d /opt/share/
drwxrwxrwt. 2 root root 6 Nov 19 04:56 /opt/share/
[root@clear opt]# su - student
Last login: Sat Nov 19 04:55:24 EST 2022 on pts/0
[student@clear ~]$ touch /opt/share/student.txt.haha
[student@clear ~]$ logout
[root@clear opt]# su - tom
Last login: Sat Nov 19 04:55:38 EST 2022 on pts/0
[tom@clear ~]$ rm -f /opt/share/student.txt.haha
rm: cannot remove '/opt/share/student.txt.haha': Operation not permitted

12 Linux磁盘管理

12.1 Linux磁盘分区简介

  Linux 系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,硬盘对应的设备文件一般被称为块设备文件

  1.磁盘分类

  常见的磁盘类型SATA 硬盘、SCSI 硬盘、SAS 硬盘,还有当下大热的各种固态硬盘。

  SATA 硬盘:SATA(Serial ATA)口的硬盘又叫串口硬盘,Serial ATA 采用串行连接方式,串行 ATA 总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。串行接口还具有结构简单、支持热插拔的优点。SATA 硬盘主要用于消费类市场和一些低端服务器.

  SCSI 硬盘:SCSI 硬盘即采用 SCSI 接口的硬盘。它由于性能好、稳定性高,因此在服务器上得到广泛应用。同时其价格也不菲,正因它的价格昂贵,所以在普通PC上很少见到它的踪迹。SCSI 硬盘使用 50 针接口,外观和普通硬盘接口有些相似.

  SAS 硬盘:SAS 是 Serial Attached SCSI 的缩写,即串行连接的 SCSI,其目标是定义一个新的串行点对点的企业级存储设备接口。串行接口减少了线缆的尺寸,允许更快的传输速度。SAS 硬盘与相同转速的 SCSI 硬盘相比有相同或者更好的性能。SAS 硬盘一般用于比较高端的服务器。

  固态硬盘:固态硬盘(Solid State Disk),一般称之为 SSD 硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。其主要特点是没有传统硬盘的机械结构,读写速度非常快

  2.磁盘设备的表示方法

  在 Linux 系统中磁盘设备文件的命名规则为: 主设备号 + 次设备号 + 磁盘分区号 对于目前常见的磁盘,一般表示为: sd[a-z]x 主设备号代表设备的类型,相同的主设备号表示同类型的设备。当前常见磁盘的主设备号为 sd。 次设备号代表同类设备中的序号,用 a-z“表示。比如 /dev/sda 表示第一块磁盘,/dev/sdb 表示第二块磁盘。 x 表示磁盘分区编号。在每块磁盘上可能会划分多个分区,针对每个分区,Linux 用 /dev/sdbx 表示,这里的 x 表示第二块磁盘的第 x 个分区。

[root@master home]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3

该系统中一共有1块磁盘 `/dev/sda``/dev/sda` 上创建了三个分区,分别是 `/dev/sda1``/dev/sda2``/dev/sda3`

  3.磁盘分区的目的

  提升数据的安全性(一个分区的数据损坏不会影响其他分区的数据)

  支持安装多个操作系统

  多个小分区对比一个大分区会有性能提升

  更好的组织数据

12.2 增加磁盘分区

# 分区--格式化--挂载--使用
# mount命令挂载是临时的,意味着重启系统后将取消挂载。需要手动重新挂载
# 永久挂载需要将挂载项记入/etc/fstab中

1 分区,gpt方案 ,分2个区,每个1G
[root@servera ~]# fdisk /dev/vdb
Command (m for help): m
   d   delete a partition    #删除分区
   n   add a new partition   #创建分区
   p   print the partition table  #打印分区表
   w   write table to disk and exit   #保存并退出
  Create a new label
   g   create a new empty GPT partition table  #指定分区方案gpt
   o   create a new empty DOS partition table  #指定分区方位mbr

Command (m for help): g   #指定分区方案gpt
Created a new GPT disklabel (GUID: D29B3E19-BA51-1042-BFE6-0FD975D1B7DB).
Command (m for help): n
Partition number (1-128, default 1): #回车
First sector (2048-10485726, default 2048):  #回车
Last sector, +sectors or +size{K,M,G,T,P} (2048-10485726, default 10485726): +1G  #指定分区大小1G

Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB.

Command (m for help): p
Disklabel type: gpt  #查看分区方案

Device     Start     End Sectors Size Type  #分区表
/dev/vdb1   2048 2099199 2097152   1G Linux filesystem  #/dev/vdb 分区为1G

Command (m for help): n   #创建第二个分区
Partition number (2-128, default 2): 
First sector (2099200-10485726, default 2099200): 
Last sector, +sectors or +size{K,M,G,T,P} (2099200-10485726, default 10485726): +1G

Command (m for help): p
Device       Start     End Sectors Size Type
/dev/vdb1     2048 2099199 2097152   1G Linux filesystem
/dev/vdb2  2099200 4196351 2097152   1G Linux filesystem

Command (m for help): w  #保存退出
[root@servera ~]# fdisk -l /dev/vdb  #查看/dev/vdb分区表
Device       Start     End Sectors Size Type
/dev/vdb1     2048 2099199 2097152   1G Linux filesystem
/dev/vdb2  2099200 4196351 2097152   1G Linux filesystem

[root@servera ~]# lsblk /dev/vdb   #lsblk查看块设备
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb    252:16   0   5G  0 disk 
├─vdb1 252:17   0   1G  0 part 
└─vdb2 252:18   0   1G  0 part 

2 格式化,将两个分区分别格式化为ext4和xfs文件系统
  # mkfs 选项 设备名     -t 指定文件系统类型
mkfs -t ext4 /dev/vdb1     mkfs.ext4 /dev/vdb1    

[root@servera /]# mkfs -t ext4 /dev/vdb1   #mkfs格式化 ext4是文件系统类型 /dev/vdb1是要格式化的磁盘分区
[root@servera /]# echo $?     $?是看上一条命令返回值,0为正确,非0为错误
0
[root@servera /]# mkfs.xfs /dev/vdb2
[root@servera /]# echo $?
0
[root@servera ~]# lsblk -f
[root@servera ~]# lsblk -f /dev/vdb  #查看文件系统类型,
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
vdb                                                      
├─vdb1 ext4         ecb332da-5bf4-4b86-b92e-d9da25f22a07 
└─vdb2 xfs          b538bf38-2b33-4d53-a785-372627587c52 


3 挂载
  创建挂载点  mkdir /mnt/disk1
  文件系统:格式化后的设备或分区   挂载点:linux中的空目录
挂载:
mount  文件系统  挂载点    mount  /dev/vdb1  /mnt/disk1

卸载:
umount 文件系统/挂载点     umount /dev/vdb1 or umount /mnt/disk1


#挂载
[root@servera ~]# lsblk -f /dev/vdb
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
vdb                                                      
├─vdb1 ext4         ecb332da-5bf4-4b86-b92e-d9da25f22a07 
└─vdb2 xfs          b538bf38-2b33-4d53-a785-372627587c52 
[root@servera ~]# mkdir /mnt/{disk1,disk2}  # 创建挂载点
[root@servera ~]# ls /mnt
disk1  disk2
[root@servera ~]# mount /dev/vdb1 /mnt/disk1  #将/dev/vdb1 挂载到/mnt/disk1目录上
[root@servera ~]# df 
[root@servera ~]# df -Th  #-T 显示文件系统,-h以易读单位显示
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vdb1      ext4      976M  2.6M  907M   1% /mnt/disk1
/dev/vdb2      xfs      1014M   40M  975M   4% /mnt/disk2
[root@servera ~]# tree /mnt/
/mnt/
├── disk1
│   ├── haha.txt
│   └── lost+found
└── disk2
    └── heihei.txt
 卸载   
[root@servera ~]# cd /mnt/disk2
[root@servera disk2]# umount /dev/vdb2      #使用时不能卸载
umount: /mnt/disk2: target is busy.
[root@servera disk2]# cd /    #需要退出挂载点
[root@servera /]# umount /dev/vdb2   #卸载
[root@servera /]# df -h | tail -2
tmpfs           183M     0  183M   0% /run/user/0
/dev/vdb1       976M  2.6M  907M   1% /mnt/disk1

注意:1.要保存分区输入w,要取消分区输入q

​ 2.命令行挂载重启后失效,要想重启也生效要修改fstab配置文件。

12.3 磁盘状况查询

  df 以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

df -h

# 默认查询当前目录,也可以带一个目录参数,例如:
df -h /root

  du 的英文原义为 disk usage,含义为显示磁盘空间的使用情况,用于查看当前目录的总大小。

1.例如查看当前目录的大小
  du -sh

2.显示指定文件所占空间
  du test.txt 
  
命令相关参数:
  -s:对每个Names参数只给出占用的数据块总数。
  -a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
  -b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。
  -k:以1024字节为单位列出磁盘空间使用情况。
  -c:最后再加上一个总计(系统默认设置)。
  -l:计算所有的文件大小,对硬链接文件,则计算多次。
  -x:跳过在不同文件系统上的目录不予统计。
  -h:以K,M,G为单位,提高信息的可读性。

12.4 磁盘命令实例

1.统计某文件夹下面的文件个数
  ls -l | grep "^-" | wc -l
  说明:
     ls -l 查看目录下文件信息。
     grep ^- 过滤列表输出信息,只保留一般文件,如果要保留目录则为 ^d。
     wc -l 统计输出信息的行数。

2.统计某文件夹下面的目录个数
  ls -l | grep "^d" | wc -l

3.统计某文件夹下面的文件个数,包含子目录中的
  ls -lR | grep "^-" | wc -l

4.统计某文件夹下面的目录的个数,包含子目录
  ls -lR | grep "^d" | wc -l

5.tree 命令
  yum install tree
  tree /

13 进程监控及管理

yum install -y psmisc
pstree -p
# 程序被开启会产生一个或多个进程,他们都有对应父进程与子进程,每个进程都有进程号PID
# systemd 1 不能被杀死,除非重启,关机

13.1 查看进程

# ps以静态的方式查看系统进程
ps -l
ps  aux  
ps aux | grep http

# top以同态的形式查看进程
top

13.2 终止进程

1.kill
  语法 kill -s 信号名称 或-n 信号编号
  -s sig  SIG is a signal name
  -n sig  SIG is a signal number

2.killall
  语法:killall 守护进程名称
  killall httpd

13.3 作业控制jobs

[root@servera ~]# dd if=/dev/zero of=./bigfile bs=1M count=1000
ctrl + z 
[root@servera ~]# jobs
[1]+  Stopped                 dd if=/dev/zero of=./bigfile bs=1M count=1000
[root@servera ~]# bg %1
[1]+ dd if=/dev/zero of=./bigfile bs=1M count=1000 &
[root@servera ~]# jobs
[1]+  Running                 dd if=/dev/zero of=./bigfile bs=1M count=1000 &
[root@servera ~]# fg %1

[root@servera ~]# kill -9 %2
[2]-  Stopped                 vim file2
[root@servera ~]# jobs
[2]-  Killed                  vim file2
[3]+  Stopped                 nice -n -10 vim file4

13.4 进程优先级调整

# nice值
# 超级用户root 可以修改nice值范围 -20~19
# 普通用户user 可以修改nice值范围  0-19

1.进程优先级数字越小,优先级越高
2.优先级不能直接改,可以通过nice值来影响优先级
3.旧优先级 + nice值 = 新优先级
  80       -10   = 70

# 两种方法:
1.产生新进程时,设置nice值
  nice  -n -5  vim file2 &
  
2.修改现有进程nice值
  renice -n  10  PID
  
# ps -l 查看需要更改的进程号
  renice -n 10 28183

14 控制服务与守护进程

14.1 服务状态关键字段

字段 描述 字段 描述
Loaded 服务单元是否加载到内存 Main PID 服务的主进程ID,包括命令名称
Active 服务单元是否在运行,运行了多久 Status 有关该服务的其他信息

14.2 systemctl管理服务

systemctl -t help

# 列入.service扩展名,代表服务,如web服务
systemctl list-units --type service  列出当前服务器加载的服务单元
systemctl  status  httpd.service     查看某个服务
    
# 查看服务是否启动
[root@servera system]# systemctl  is-active httpd

# 查看服务是否开机启动
[root@servera system]# systemctl enable httpd
[root@servera system]# systemctl is-enabled httpd
enabled
[root@servera system]# systemctl disable httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@servera system]# systemctl is-enabled httpd
disabled

# 常见特征:
1、安装   yum install -y httpd
2、启动   systemctl  start  httpd.service (单元文件)/usr/lib/systemd/system/
3、查进程 ps aux | grep httpd , 每个服务有自己的守护进程/usr/sbin/httpd
4、查端口 netstat -ntlp ,找到80端口,对应Listen监听状态 对应httpd服务

# vim /etc/service  该文件记录了系统服务的端口和协议的对应关系

14.3 服务状态分类

关键字 描述 关键字 描述
loaded 单元配置文件已处理 inactive 不在运行
active(running) 正在通过一个或多个持续进程与运行 enabled 在系统引导时启动
active(exited) 已成功完成一次性配置 disabled 未设为在系统引导时启动
active(waiting) 运行中,但正在等待事件 static 无法启动,但可以由某一启动的单元自动启动

14.4 管理系统服务

  语法:systemctl 管理命令 unitname

管理命令 描述 管理命令 描述
status 查看状态 disable 关闭开机启动
start 开启 is-active 查看服务状态是否启动
stop 关闭 is-enabled 查看服务是否开机自启动
restart 重启 list-dependencies 【unitname】 查看单元依赖
reload 加载配置文件 mask 禁止服务,无法启动或开机启动
enable 开机启动 unmask 解除码

15 日志分析与存储

15.1 系统中的日志文件

日志文件 存储的消息类型
/var/log/messages 大多数系统日志消息处存放处
/var/log/secure 与安全性和身份验证时间相关的syslog消息
/var/log/maillog 与邮件服务器相关的syslog消息
/var/log/cron 与计划任务执行相关的syslog消息
/var/log/boot.log 与系统启动相关的消息

15.2 rsyslog服务管理日志

[root@haha log]# yum provides /etc/rsyslog.conf  # 查看文件是哪个软件包提供的
[root@clear log]# rpm -qc rsyslog-8.1911.0-3.el8.x86_64 
/etc/logrotate.d/syslog
/etc/rsyslog.conf       #一般服务文件以.conf结尾,改文件是日志服务的配置文件
/etc/sysconfig/rsyslog
[root@clear log]# vim /etc/rsyslog.conf

15.3 记录日志的规则

# 日志文件配置格式:
  mail.info  /var/log/vsftpd.log  #.点代表包含后面级别及以上级别

AAAA.BBBB CCCC

AAAA 产生日志的设备(类别)    # 如何产生的日志
BBBB 日志的级别              # 日志有不同安全级别,类似轻重缓急的严重程度,发出警告
CCCC 保存日志的位置          # 在系统中保存日志文件的路径

15.4 rsyslog配置文件类别

类别 说明 类别 说明
Kern 内核 user 普通用户级别的
authpriv 授权和安全 syslog 由rsyslog生成的信息
cron 计划任务 loca10~loca17 自定义本地策略
mail 邮件 * 所有类别
daemon 系统守护进程

15.5 日志级别

等级 解释 等级 解释
EMERG(紧急) 会导致主机系统不可用的情况 NOTICE(注意) 不会影响系统但值得注意
ALERT(警告) 必须马上采取措施解决的问题 INFO(信息) 一般信息
CRIT(严重) 比较严重的情况 DEBUG(调试) 程序或系统调试信息等
ERR(错误) 运行出现错误 * 所有等级
WARNING(提醒) 可能会影响系统功能的事件 none 不记录日志
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
*.info    # *代表所有级别    .点代表后面的等级及以上等级,也就是info以上的等级全记录
;分号是不同设备等级的分隔符号
-/var/log/maillog   # - 代表先记录缓存,再记录硬盘,减轻硬盘i/o读写压力

15.6 journalctl

  新的日志服务是systemd-journal,它也是一个日志管理服务,可以收集来自内核、系统早期启动阶段的日志,以及系统进程在启动和运行中的一些标准输出与错误输出。

  systemd-journal一旦重启既消失,因为保存在了/run/log/journal//.journal结尾,该文件是一个二进制日志文件,需要用journalctl命令查看。

journalctl       # 查看系统日志
journalctl -n    # 通过q或ctrl接触观看  ,此命令显示方式类似与tail -n
journalctl -n 5 

journalctl -p err  日志等级
journalctl -f 
journalctl -p err 
journalctl -p info
  (deubg、info、notice、warning、err、crit、alert、emerg)

journalctl --since "2020-02-28 22:53:35" --until "2020-02-28 22:53:40"

15.6.1 常用字段

常用字段 含义 常用字段 含义
_COMM 命令名称 _UID UID
_EXE 进程的可执行文件的路径 _SYSTEM_UNIT 启动该进程的systemd单元
_PID 进程的PID
journalctl -o verbose 
journalctl _HOSTNAME=localhost
journalctl _HOSTNAME=localhost _PID=1

15.6.2 保存journal服务文件

mandb
man -k journal
man 5 journald.conf  , Storage=

[root@clear journal]# ll -d /run/log/journal
[root@clear journal]# cp -a /run/log/journal/ /var/log/journal
[root@clear journal]# ll -d /var/log/journal
drwxr-sr-x. 4 root systemd-journal 86 Nov 19 04:30 /var/log/journal
[root@clear journal]# systemctl restart systemd-journald
[root@clear journal]# ll /var/log/journal/3a2b4da8dabb4729935c193e58ad052d/  #字符串目录名字每个人的可能不一样。不要复制我的笔记。
total 8192
-rw-r-----. 1 root root 8388608 Nov 19 04:30 system.journal
[root@clear journal]# journalctl

16 系统时间

# RHEL6 ntp服务
# RHEL8 chrony服务
# 还是使用同样的协议标准ntp(network time protocol)

UTC:通用协调时
   (UTC时间0点是北京时间8点,因为中国、新加坡、马来西亚、菲律宾等国的时间与UTC的时差均为+8,也就是UTC+8,所以当UTC时间0点,北京时间即为0+8=8点)
GMT:格林威治标准时间
CST:中国标准时间 (China Standard Time)
    (中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8)
RTC:(Real-Time Clock)也称为硬件时间:RTC是芯片内置的硬件时钟,只要芯片不断电,即使操作系统关机的时候,RTC时钟也是正常在      走的,所以当操作系统关机重启后,可通过读取RTC时间来更新系统时间
    (可通过hwclock命令来获取具体的时间 
      -r 查看硬件时间
      -s 硬件时间设置到系统
      -w 系统设置到硬件)

16.1 timedatectl

[root@servera log]# timedatectl 
               Local time: Sat 2020-02-29 08:51:49 CST
           Universal time: Sat 2020-02-29 00:51:49 UTC
                 RTC time: Sat 2020-02-29 08:11:07
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
          
[root@servera log]# timedatectl list-timezones     
[root@servera log]# timedatectl set-timezone Asia/Hong_Kong 
[root@servera log]# timedatectl 
               Local time: Sat 2020-02-29 08:55:48 HKT
           Universal time: Sat 2020-02-29 00:55:48 UTC
                 RTC time: Sat 2020-02-29 08:15:06
                Time zone: Asia/Hong_Kong (HKT, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

# 修改时间方法
timedatectl set-time "2020-02-30 10:00:00"
Failed to set time: NTP unit is active
timedatectl set-ntp false 
timedatectl set-time "2020-02-30 10:00:00"
timedatectl set-ntp true 

16.2 chrony

server
===server选项格式===
server host  [ key n ] [ version n ] [ prefer ] [ mode n ] [ minpoll n ] [ maxpoll n ] [ iburst ]
其中host是上层NTP服务器的IP地址或域名,随后所跟的参数解释如下所示:
  1.key: 表示所有发往服务器的报文包含有秘钥加密的认证信息,n是32位的整数,表示秘钥号。
  2.version: 表示发往上层服务器的报文使用的版本号,n默认是3,可以是1或者2。
  3.prefer: 如果有多个server选项,具有该参数的服务器有限使用。
  4.mode: 指定数据报文mode字段的值。
  5.minpoll: 指定与查询该服务器的最小时间间隔为2的n次方秒,n默认为6,范围为4-14。
  6.maxpoll:  指定与查询该服务器的最大时间间隔为2的n次方秒,n默认为10,范围为4-14。
  7.iburst: 当初始同步请求时,采用突发方式接连发送8个报文,时间间隔为2秒。
[root@servera ~]# systemctl enable --now chronyd    #--now启动服务 enable 开机自动
[root@servera ~]# systemctl status chronyd
[root@servera ~]# vim /etc/chrony.conf   #大概第7行 server 后面添加服务器'地址'或'域名'。
server classroom.exmaple.com iburst
[root@servera ~]# systemctl  restart chronyd.service
[root@servera ~]# chronyc sources -v

17 RHEL网络管理

17.1 查看ipv4与ipv6

1.查看ip地址方法1:
  [root@servera ~]#ifconfig 
  [root@servera ~]#ifconfig  eth0

2.查看ip地址方法2:
  [root@servera ~]# ip addr show eth0
  [root@servera ~]# ip a  s eth0
  [root@servera ~]# ip -s link show enp1s0 

17.2 端口与服务

# 查看服务端口是否被占用
lsof -i:80netstat
   -n:显示接口和端口编号
   -t:tcp信息
   -u:udp信息
   -l:监听状态信息
   -a:显示所有信息
   -p:显示协议名称而不是端口

netstat -ntlp | grep 80

# 参考ss和netstat区别:https://blog.csdn.net/qq_37863891/article/details/107283415
# 标准服务端口 /etc/services

17.3 网络管理工具

17.3.1 nmcli的概念

1.使用nmcli管理网络服务NetworkManager
2.nmcli工具的功能:查看网络设备、创建网络连接、修改网络配置
3.nmcli的特点及概念:
  nmcli工具可以对网卡或网卡配置文件操作
  device ---- 网卡设备
  connection --- 连接  指的就是网卡配置文件
  一个device可以拥有多个connection,同一时间只能启用一个connection,且一个connection只能属于一个device

4.举例:
  device-----eth0
  connection1  ----  dhcp    自动获取IP  
  connection2  ----  static  静态IP  

17.3.2 nmcli管理网络

mandb
man -k nmcli
nmcli (1) 
man nmcli | grep -A 2 'nmcli connection add'

-basic
[root@servera ~]# nmcli connection show 
[root@servera ~]# nmcli connection show --active 
[root@servera ~]# nmcli device status 

-add---添加
   dhcp方式: #创建一个名为default的手动链接,绑定至eth0网卡
[root@servera ~]# nmcli connection add  con-name 'default' type ethernet ifname eth0  autoconnect yes    
[root@servera ~]# nmcli con show 

   static方式:#创建一个名为static的静态链接,绑定至eth1网卡
[root@servera ~]# nmcli connection add con-name static type ethernet ifname eth0 autoconnect yes ipv4.addresses 192.168.0.1/24 ipv4.gateway 192.168.0.254 ipv4.dns 8.8.8.8 ipv4.method manual  
[root@servera ~]# nmcli connection show   
[root@servera /]# nmcli connection up static   启动static网卡
[root@servera /]# ip a s eth1 | grep -w inet

-modify---修改
#将链接static网络信息更改: IP:192.168.0.2  mask:/24  gw:192.168.0.200 dns:114.114.114.114
[root@servera ~]# nmcli connection modify static ipv4.addresses 192.168.0.2/24 ipv4.gateway 192.168.0.200 ipv4.dns 114.114.114.114 autoconnect yes ipv4.method manual
[root@servera ~]# nmcli connection up  static
[root@servera ~]# ip a s eth0
   
[root@servera ~]# route -n

[root@servera ~]# cat /etc/resolv.conf 
 
[root@serverb ~]# nmcli connection delete static  #删除一个链接

-up_down---启动与关闭网卡
[root@servera /]# nmcli connection down static   关闭static网卡

-off---关闭网络服务
[root@servera /]# nmcli networking off       关闭网络服务,慎重使

17.3.4 网卡配置文件

-RHEL8 版本
# grep -r IPADDR /usr/share/ #找到下面手册的指令
vim /usr/share/doc/initscripts/sysconfig.txt 帮助手册

修改配置文件方式修改IP
[root@servera ~]# vim /etc/sysconfig/network-scripts/ifcfg-Wired_connection_1

BOOTPROTO=none          # 获取IP的方式  static--静态 none--不设置 dhcp--自动获取 ,手动配IP选前两个中任意一个
ONBOOT=yes              # 开机自动连接
IPADDR=172.25.250.100   # ip地址
PREFIX=24               # 子网掩码  PREFIX=24(等效于255.255.255.0),mask=255.255.255.0 netmask=255.255.255.0
GATEWAY=172.25.250.254  # 网关
DNS1=xxxx               # dns,dns可以有三个 DNS1= DNS2= DNS3=

加载网卡配置文件方法一:
[root@serverb network-scripts]# nmcli connection reload ifcfg-Wired_connection_1 或 nmcli connection reload
[root@serverb network-scripts]# nmcli connection up static

systemctl restart NetworkManager

-RHEL9版本 网卡配置文件位置
[root@node1 system-connections]# vim /etc/NetworkManager/system-connections/System\ eth0.nmconnection

17.4 更改网络信息

17.4.1 主机名

[root@servera ~]# hostname
servera.lab.example.com
[root@servera ~]# hostnmae  www.example.com 临时
[root@servera ~]# vim /etc/hostname  永久(重启系统:reboot、init 6)
[root@servera ~]# hostnamectl set-hostname hostname 永久

17.4.2 网关

# 使用nmcli
nmcli con add con-name xxx ipv4.gateway xxx.xxx.xxx.xxx  配置网关
nmcli con mod xxx ipv4.gateway xxx.xxx.xxx.xxx           修改网关
以上两种改完之后,需要nmcli con up xxx

# 修改配置文件
vim /etc/sysconfig/network-scripts/ifcfg-xxxx
GATEWAY=xxx.xxx.xxx.xxx  
修改完后要nmcli con reload ,再nmcli con up xxxx

17.4.3 查看路由及网关

[root@servera ~]# ip route 

[root@servera ~]# route -n

[root@servera ~]# nmcli connection show Wired\ connection\ 1 | grep ipv4.ga
ipv4.gateway:                           172.25.250.254

[root@servera ~]# netstat -nr

17.4.4 指定DNS

vim /etc/resolv.conf   # 该文件指定dns和域名的/etc/sysconfig/network-scripts/ifcfg-xxx中的DNS字段会同步到/etc/resolv.conf,后者优先。
nameserver 172.25.250.254

# 测DNS域名解析是否正常
[root@servera ~]# host classroom.example.com 
classroom.example.com has address 172.25.254.254
[root@servera ~]# nslookup classroom.example.com

[root@servera ~]# dig classroom.example.com

18 归档与系统间复制文件

18.1 zip和unzip

  这种压缩文件一般是在windows环境下面,压缩好了,上传到linux下面进行解压缩。

  1.zip命令

  将文件或目录压缩为.zip格式,命令所在路径:/usr/bin/zip,执行权限,所有用户。

1.命令格式
  zip 选项[-r][压缩后文件名][文件或目录]
  
2.实例
  zip -r test.zip test # 将test目录压缩为test.zip文件

-r 压缩目录

  2.unzip命令

  将格式为.zip的压缩文件解压,命令所在路径:/usr/bin/unzip,执行权限:所有用户。

1.命令格式
  uzip[.zip的压缩文件名]

2.实例
  unzip test.zip # 解压缩,如果test文件夹存在提示

18.2 压缩和解压缩tar

1.命令格式
  tar [选项] [归档文件] [文件/目录...]
  其中,选项用于指定不同的操作和参数,归档文件是要处理的归档文件的名称,文件/目录是要添加到归档文件中或从归档文件中提取的文件或目录。
  常用选项包括:
     `-c`:创建归档文件
     `-x`:提取归档文件
     `-t`:查看归档文件的内容列表
     `-f`:指定归档文件的名称
     `-v`:显示详细信息
     `-z`:使用 gzip 压缩算法
     `-j`:使用 bzip2 压缩算法
     `-C`:切换到指定目录
     
     
2.实例
  当使用 `tar` 命令时,你可以根据需要执行不同的操作,包括创建归档文件、解压缩归档文件、查看归档文件的内容列表等。
  1、创建归档文件
     tar -cvf archive.tar file1.txt file2.txt directory/
     此命令将会创建一个名为 `archive.tar` 的归档文件,其中包含了 `file1.txt``file2.txt` 文件和 `directory/` 目录。
     
  2、解压缩归档文件
     tar -xvf archive.tar
     这个命令将会解压缩并提取出 `archive.tar` 中的所有文件和目录。
     
  3、查看归档文件的内容列表
    tar -tvf archive.tar
    该命令将会显示出 `archive.tar` 中包含的所有文件和目录的列表。

  4、压缩并创建归档文件
    tar -czvf archive.tar.gz directory/
    这个命令将会将 `directory/` 目录压缩并打包为 `archive.tar.gz` 归档文件。

18.3 压缩和解压缩gzip

1.gzip 命令的基本格式如下:
  压缩文件:gzip [选项] 文件名
  解压缩文件:gzip -d 文件名.gz  gunzip 文件名.gz
  
2.选项说明:
  `-c`:将压缩或解压缩的结果输出到标准输出,而不修改原始文件。
  `-d`:执行解压缩操作。这是一个简写,相当于使用 `--decompress` 选项。
  `-f`:强制执行操作,不询问用户确认。
  `-k`:保留原始文件,不删除源文件。
  `-l`:显示压缩文件的压缩率等信息。
  `-r`:递归处理指定目录下的所有文件。
  `-t`:测试压缩文件的完整性。
  
3.实例
  gzip -c file.txt > file.txt.gz  # 将 file.txt 压缩为 file.txt.gz,但保留原始文件
  gzip -d file.txt.gz  # 解压缩 file.txt.gz,生成 file.txt,并删除 file.txt.gz
  gunzip file.txt.gz  # 解压缩 file.txt.gz,生成 file.txt,并删除 file.txt.gz

  使用 gzip 命令进行压缩时,原始文件会被替换为压缩后的文件,如果需要保留原始文件,可以使用 -k 选项。解压缩后,原始的 .gz 文件会被删除,如果需要保留 .gz 文件,可以使用 gunzip 命令。

18.4 压缩和解压缩bzip2

  bzip2 命令用于压缩和解压缩文件,它使用 bzip2 压缩算法。下面是 bzip2 命令的格式和示例:

1、压缩文件:

1.压缩文件
  bzip2 [选项] 文件名
  bzip2 file.txt  # 压缩 file.txt 文件,生成 file.txt.bz2 文件
  
2.解压缩文件
  bzip2 -d 文件名.bz2  等同于   bunzip2 文件名.bz2
  bzip2 -d file.txt.bz2  # 解压缩 file.txt.bz2 文件,生成 file.txt 文件
  
3.选项说明
  `-c`:将压缩或解压缩的结果输出到标准输出,而不修改原始文件。
  `-d`:执行解压缩操作。这是一个简写,相当于使用 `--decompress` 选项。
  `-f`:强制执行操作,不询问用户确认。
  `-k`:保留原始文件,不删除源文件。
  `-s`:显示压缩文件的压缩率等信息。
  
4.实例
  bzip2 -c file.txt > file.txt.bz2  # 将 file.txt 压缩为 file.txt.bz2,但保留原始文件
  bzip2 -d file.txt.bz2  # 解压缩 file.txt.bz2,生成 file.txt,并删除 file.txt.bz2
  bunzip2 file.txt.bz2  # 解压缩 file.txt.bz2,生成 file.txt,并删除 file.txt.bz2

  使用 bzip2 命令进行压缩时,原始文件会被替换为压缩后的文件,如果需要保留原始文件,可以使用 -k 选项。解压缩后,原始的 .bz2 文件会被删除,如果需要保留 .bz2 文件,可以使用 bunzip2 命令。

18.5 远程文件传输

# scp实现远程文件传输
scp servra.txt root@bastion:/opt/
scp root@bastion:/opt/bastion.txt .

# sftp实现远程文件传输
ID    app   roles
---- ------- ----------------
1     ftp    client
2     sftp   ssh SubService
3     vsftp  service

[root@servera opt]# touch put.txt
[root@servera opt]# sftp instructor@classroom.example.com
instructor@classroom.example.com's password: 
Connected to instructor@classroom.example.com.
sftp> cd /tmp/
sftp> put /opt/put.txt 
Uploading /opt/put.txt to /tmp/put.txt
/opt/put.txt                                    100%    0     0.0KB/s   00:00    
sftp> ls

18.6 同步文件内容

# rsync  -v  显示详细信息     -a  相当于存档模式
  
# 本地同步
[root@servera tmp]# rsync -av /var/log/* /tmp

# 远程同步
[root@servera tmp]# rsync -av /var/log/* serverb:/tmp

# 将serverb上的/var/log/同步到,servera当前目录下
[root@servera tmp]# rsync -av serverb:/var/log/  .

19 Linux软件管理

19.1 Linux软件管理简介

  在 Linux 系统中,软件管理可以通过包管理器来进行。不同的 Linux 发行版使用不同的包管理器。

  以下是几种常见的包管理器和相应的命令:

  1.apt

  适用于 Debian、Ubuntu 和基于它们的发行版。

命令 作用 命令 作用
sudo apt install package_name 安装软件包 apt search package_name 搜索软件包
sudo apt update 更新软件包列表 sudo apt remove package_name 删除软件包
sudo apt upgrade 升级已安装的软件包

  2.yum

  适用于 CentOS、Fedora 和基于它们的发行版。

命令 作用 命令 作用
sudo yum install package_name 安装软件包 yum search package_name 搜索软件包
sudo yum update 更新软件包 sudo yum remove package_name 删除软件包

  3.dnf

  适用于最新版本的 Fedora 和其他一些发行版。

  dnf 命令与 yum 命令类似。

  4.pacman

  适用于 Arch Linux 和基于它的发行版。

命令 作用 命令 作用
sudo pacman -S package_name 安装软件包 pacman -Ss package_name 搜索软件包
sudo pacman -Sy 更新软件包列表 sudo pacman -R package_name 删除软件包
sudo pacman -Syu 升级已安装的软件包

19.2 Linux软件管理apt

  在 Linux 发行版中,apt(Advanced Packaging Tool)是一种常见的包管理器,主要用于 Debian、Ubuntu 及其衍生版本的软件管理。

1. 更新软件包列表
   sudo apt update
   这个命令将从软件源更新可用软件包的列表。

2. 搜索软件包:
   apt search package_name
   使用该命令可以搜索与指定名称相关的软件包。

3. 安装软件包
   sudo apt install package_name
   使用该命令可以安装指定的软件包。请将 `package_name` 替换为要安装的实际软件包名称。

4. 升级已安装的软件包
   sudo apt upgrade
   使用该命令可以升级已安装的软件包到最新版本。

5. 删除软件包
   sudo apt remove package_name
   使用该命令可以删除指定的软件包。请将 `package_name` 替换为要删除的实际软件包名称。

6. 清理过期的软件包
   sudo apt autoremove
   使用该命令可以删除不再需要的过期软件包。

7. 显示已安装的软件包:
   apt list --installed
   使用该命令可以列出当前系统上已安装的软件包。

8. 显示软件包详细信息
   apt show package_name
   使用该命令可以获取指定软件包的详细信息。

19.3 Linux软件管理yum

  在基于 Red Hat、CentOS 和 Fedora 等 Linux 发行版中,yum(Yellowdog Updater, Modified)是一种常用的包管理器。

1.更新软件包列表
  sudo yum update
  这个命令将从软件源更新可用软件包的列表。

2.搜索软件包
  yum search package_name
  使用该命令可以搜索与指定名称相关的软件包。

3.安装软件包:
  sudo yum install package_name
  使用该命令可以安装指定的软件包。请将 package_name 替换为要安装的实际软件包名称。

4.升级已安装的软件包:
  sudo yum upgrade
  使用该命令可以升级已安装的软件包到最新版本。

5.删除软件包:
  sudo yum remove package_name
  使用该命令可以删除指定的软件包。请将 package_name 替换为要删除的实际软件包名称。

6.清理缓存
  sudo yum clean all
  使用该命令可以清理 yum 的缓存,以释放磁盘空间。

7.显示已安装的软件包
  yum list installed
  使用该命令可以列出当前系统上已安装的软件包。

8.显示软件包详细信息
  yum info package_name
  使用该命令可以获取指定软件包的详细信息。

19.4 RPM包管理

19.4.1 rpm包语法

#软件的获取方式:
 1、互联网(下载光盘镜像.iso)、直接使用网络yum源
 2、光盘

#rpm包语法:rpm 选项 包名
-i  安装
-v  显示过程
-h  以易读方式显示进度条
-e  卸载

rpm -ivh xxx.rpm

#示例:
1. 在f0中进入软件包的存储位置
[root@foundation0 /]# cd /content/rhel8.0/x86_64/dvd/AppStream/Packages/
[root@foundation0 Packages]# pwd
/content/rhel8.0/x86_64/dvd/AppStream/Packages

2.安装软件
[root@foundation0 Packages]# rpm -ivh lftp-4.8.4-1.el8.x86_64.rpm

19.4.2 rpm包查询命令

#语法:rpm -q 软件包名称
-q: query      查询,和其他参数配合
-l:list       列出软件包安装后给系统带来的所有文件
-a:all        查看所有已安装的软件包
-c: configure  查看软件包提供的配置文件

rpm -qa | grep telnet
rpm -qc openssh-server-8.0p1-4.el8_1.x86_64

#卸载RPM包
[root@node1 /]# rpm -q telnet
telnet-0.17-73.el8.x86_64
[root@node1 /]# rpm -e telnet-0.17-73.el8.x86_64
[root@node1 /]# rpm -q telnet
package telnet is not installed

19.5 YUM工具

19.5.1 管理yum源文件

# yum源软件配置方式:
[root@servera /]# cd /etc/yum.repos.d/
[root@servera yum.repos.d]# mkdir old
[root@servera yum.repos.d]# mv * old     #将系统默认的yum源文件移动到old中,可以在该文件中查看原来的yum源路径
[root@servera yum.repos.d]# man 5 yum.conf
[root@servera yum.repos.d]# vim rhel.repo
[AppStream]      #i d名称自定义
name=AppStream   # 描述自定义,和id不必一样
baseurl=http://content.example.com/rhel8.4/x86_64/dvd/AppStream   #file:///中://是url格式,第三个/是根目录
gpgcheck=0   # gpgchek=1 要进行公钥验证,需要再添加选项gpgkey=http://content.example.com/rhel8.4/x86_64/dvd/RPM-GPG-KEY-redhat-release
enabled=1

[BaseOS]
name=BaseOS
baseurl=http://content.example.com/rhel8.4/x86_64/dvd/BaseOS
gpgcheck=0
enabled=1
[root@servera yum.repos.d]# yum clean all           #清除缓存,避免沿用之前缓存的软件
[root@servera yum.repos.d]# yum makecache           #和当前yum源建立缓存关联
[root@servera yum.repos.d]# yum repolist all        #查看当前yum源状态
[root@servera yum.repos.d]# yum install -y telnet   #测试安装软件telnet
[root@servera yum.repos.d]# rpm -q telnet           #使用rpm方式查询测试

19.5.2 yum源命令配置

1 找到提供yum-config-manager命令的软件包名称
[kiosk@foundation0 ~]$ yum provides yum-config-manager

2 安装yum-utils软件
 #打开浏览器输入yum源仓库地址,找到yum-utils的软件包,并且通过rpm命令安装网络上的yum-utils软件包,来提通yum-config-manager命令
[root@servera ]# rpm -ivh http://content.example.com/rhel8.4/x86_64/dvd/BaseOS/Packages/yum-utils-4.0.18-4.el8.noarch.rpm

3  通过yum-config-manager命令部署yum源
[root@servera ]# yum-config-manager --help
[root@servera ]# yum-config-manager --add-repo=http://content.example.com/rhel8.4/x86_64/dvd/AppStream
[root@servera ]# yum-config-manager --add-repo=http://content.example.com/rhel8.4/x86_64/dvd/BaseOS

4 命令制作的yum源中没有gpgcheck选项,如何配置?可以通过以下方法:
   1、此处可以在/etc/yum.repos.d/xx.repo文件里添加 gpgcheck=0
   2、rpm --import ‘公钥地址’   导入公钥` 
[root@servera yum.repos.d]# rpm --import http://content.example.com/rhel8.4/x86_64/dvd/RPM-GPG- KEY-redhat-release  
5.开启或关闭
[root@servera /]# yum-config-manager --disable rhel-8.0-for-x86_64-appstream-rpms(yum池ID)
[root@servera /]# yum repolist all
[root@servera /]# yum-config-manager --enable rhel-8.0-for-x86_64-appstream-rpms
[root@servera /]# yum repolist all

19.5.3 YUM常见的命令

yum list http*
yum search httpd
yum info httpd-manual
[root@servera /]# yum provides /var/www/html
# yum update
# yum install 包名      yum remove 包名

[root@servera /]# yum install  -y autofs
[root@servera /]# yum remove -y autofs
[root@servera /]# yum history

# yum clean all      yum repolist     yum repolist all
# yum group list     yum groupinfo 'Server with GUI'
# yum groupinstall -y 'Server with GUI'
# startx 切图形

19.6 第三方YUM源

1.虚拟机联网
  虚拟机设置里面NAT选择已连接   nmcli connection up ens192
  
2.百度搜索(阿里源、华为源...),将.repo文件下载到系统
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

3.验证
cd /etc/yum.repos.d/;ls
yum repolist all
yum install -y vsftpd

20 Linux文件系统

20.1 文件系统、存储和块设备

块设备 含义
/dev/sda、/dev/sdb STAT/SAS(新SCSI技术)/USB 附加存储
/dev/vda、/dev/vdb virtio-blk 超虚拟化存储(部分虚拟机)
/dev/nvme0,/dev/nvme1 附加存储 (SSD)
/dev/mmcblk0、/dev/mmcblk1 SD卡
# df查看系统挂载状态
-T 查看文件系统类型
-h 以易读方式列出容量单位

du查看文件大小
[root@servera /]# du /etc/
[root@servera /]# du -h /etc/
[root@servera /]# du -sh  /etc/
24M /etc/

[root@servera /]# du /etc/man_db.conf 
8   /etc/man_db.conf
[root@servera /]# du /etc/man_db.conf  -h  # 占用了的块大小,linux默认一个块4k
8.0K    /etc/man_db.conf
[root@servera /]# ll /etc/man_db.conf 
-rw-r--r--. 1 root root 5165 Nov  7  2018 /etc/man_db.conf

20.2 文件查找

# locate
updatedb      # 收集所有文件元数据
locate passwd
locate -i image
locate -n 5  image   # 显示前5行

# find
find  查找范围  查找条件   动作(可选)
find /  -name  passwd

-name: 以文件名的形式查找
-size: 根据文件大小 -size 1k :大小为1k的文件,+1k大于1k的文件,-1k小于1k的文件
-user /  -uid: 文件所有者   -user studnet  :student是用户名,查找student拥有的文件
-group / -gid
-perm: 权限查找     -perm 700 :搜索权限为700的文件
-type: 按文件类型   -type f : f表示文件,d表示目录
-exec: 选项后接Linux指令,操作查找到的文件  command {} ; 

find /etc -name sshd_config
find / -user student | xargs ls -l
find / -perm 700 -type d -user student | xargs ls -ld
find /etc -type f -size +3k  -and -size -10k  
find / -perm -4000 | xargs ls -ld

将系统中student用户的文件复制到/root/studentdir目录中,并且保留权限
[root@servera ~]# find / -user student -exec cp -a {} /root/studentdir/ \;

将系统中student用户的文件列表保存到/root/studentdir文件中
find / -user student > /root/studentdir

20.3 ln 软链接与硬链接

1.软链接(符号链接):使用范围广,方便访问源文件
  # 文件链接创建方式:ln -s 源文件   链接文件
  ln -s dir1 linkdir1

2.硬链接:节省系统空间    
  ln 源文件  链接文件
  ln /opt/sou_file.txt /opt/link_file.txt

3.取消链接
  [root@servera opt]# unlink /opt/link_file.txt

4.软链接和硬链接区别
  1.命令相同 参数不同
  2.硬链接的权限和源文件完全一致、软链接的链接文件权限永远是777,和源文件权限不同
  3.硬链接可以删除,移动源文件、软链接不可以删除,移动源文件
  4.软链接inode和源文件不同、硬链接的inode的源文件相同
  5.软链接可以对目录及文件生效、硬链接只可以对文件操作
  6.软链接可以跨文件系统、硬链接不可以跨文件系统

21 扩容Linux根分区

21.1 查询现有根分区

# 根分区有45G,已经用了32%
[root@vm ~]# df -h
...
/dev/mapper/rl-root   45G   15G   31G  32% /
...

21.2 添加新硬盘

  先将虚拟机正常关机,然后执行下面的添加硬盘操作

  在VMware workstation的顶栏菜单中,点击虚拟机—>设置—>添加—>硬盘

  在添加硬盘的过程中,除了硬盘大小,一切保持默认即可,大小处输入了50G

  将虚拟机开机

21.3 新硬盘加入vg

1.查询新加的硬盘  可看出新硬盘名称是sdb
[root@vm ~]# lsblk
...
sdb           8:16   0   50G  0 disk
sr0          11:0    1  2.1G  0 rom

2.扩容vg
# 查询-查询前
[root@vm ~]# vgs
  VG #PV #LV #SN Attr   VSize  VFree
  rl   1   2   0 wz--n- 48.41g    0
  
# 扩容
[root@vm ~]# vgextend rl /dev/sdb
  Volume group "rl" successfully extended

# 查询-扩容后
[root@vm ~]# vgs
  VG #PV #LV #SN Attr   VSize   VFree
  rl   2   2   0 wz--n- <98.41g <50.00g

3.扩容根分区所在的lv,注意不要遗漏最后-r参数,不然还得单独扩容文件系统
[root@vm ~]# lvextend /dev/rl/root -L +40G -r
  
[root@vm ~]# lvs

21.4 确认扩容效果

[root@vm ~]# df -h
...
/dev/mapper/rl-root   85G   15G   70G  18% /
...

22 计划任务

22.1 at

[root@servera /]# rpm -q at
at-3.1.20-11.el8.x86_64
[root@servera /]# systemctl status atd.service 
[root@servera /]# rpm -qc at

1.语法:
  at 选项 参数
  at 时间  #设置一个任务
  atq 查询
  atrm 删除任务

2.实例
  1.13:49分时候执行touch指令
    [root@servera /]# at 13:49
    warning: commands will be executed using /bin/sh
    at> touch /at.txt
    at> <EOT>          ctrl+d退出
    3分钟后执行
    echo `date` >> /home/student/myjob.txt | at now +3min

  2.明天17:20点执行echo
    at 17:20 tomorrow
    at> echo hello

  3.三天后下午5:10分执行/bin/ls
    at 5:20pm+3days
    at> /bin/ls
3.查看
  [root@servera /]# atq
  [root@servera /]# at -l

4.查看任务内容
  [root@servera /]# at -c 7

5.删除
  [root@servera /]# at -d 9
  [root@servera /]# atrm 8

6.监控任务
  [root@servera ~]# watch atq      ctrl+c 退出监控模式

7.黑白名单
  /etc/at.deny  哪个用户在黑名单里,哪个用户不能使用at,该文件默认存在
  /etc/at.allow 在白名单内的用户可以使用at,白名单以外的人不能使用
  白名单和黑名单同时存在时优先于黑名单,该文件默认不存在,如使用需自己创建。

22.2 crontab

[root@servera /]# systemctl status crond.service  #重要
[root@servera /]# systemctl  enable crond
[root@servera /]# systemctl is-enabled crond
[root@servera /]# systemctl enable --now crond

[root@servera ~]# rpm -q crontab
[root@servera ~]# rpm -qa | grep cron
[root@servera ~]# rpm -qc crontabs

[root@servera ~]# vim /etc/crontab

crontab 选项 
-e  编辑计划任务    crontab -e
-u  指定用户       crontab -u student -e
-r  删除所有任务    crontab -r              # 删除某个任务时利用-e选项进入编辑模式手动删除即可。
-l  列出           crontab -l

cron时间表示方法:
前五个字段使用相同的语法规则
规则          说明
*             表示“无关紧要”,始终
x-y           表示范围,x到y()
x,y           表示列表,也可以包含范围,如5,10-13,15
*/x           表示x的时间间隔

*       *       *       *       *       command
分       时     日      月       周       任务内容
0-59    0-23   1-31    1-12    0-7

# 配置cron任务,每隔2分钟运行logger “Ex200 in progress”,以harry用户身份运行
  [root@servera /]# id harry 
  [root@servera /]# crontab -u harry -e
  [root@servera /]# crontab -u harry -l  (也可以su - harry切换到任务用户,运行crontab -l)
  */2     *   *   *   *    /usr/bin/logger “Ex200 in progress” 

删除某条可以crontab -e 进去编辑
删除用户的所有任务 crontab -r    

黑名单:
vim /etc/cron.deny  限制用户使用crond服务

白名单:
mandb
man -k cron
man 1 crontab
echo harry >> /etc/cron.allow
白名单启用后,就不用黑名单了,谁在白名单里谁能用该功能
   
测试:
su - harry,crontab -e    #可以使用
exit
su - tom,crontab -e     #不可使用

23 系统性能调优

23.1 tuned

1.查看状态
  [root@servera tmp]# yum install -y tuned
  [root@servera tmp]# systemctl enable --now tuned
  [root@servera tmp]# systemctl status tuned
  
2.tuned-adm管理指令
  [root@servera tmp]# tuned-adm list        #列出优化方案
  [root@servera tmp]# tuned-adm recommend   #系统推荐的优化方案
  [root@servera tmp]# tuned-adm profile virtual-guest #修改优化方案为virtual-guest
  [root@servera tmp]# tuned-adm off #关闭优化,默认不关闭,考试时不要关闭
  
3.配置文件存储路径
  每个优化方案对应要给配置文件,其中描述了修改的内核参数
  路径:/usr/lib/tuned/

23.2 cockpit修改调优方式

【servera】
systemctl start cockpit
【foundation】
打开浏览器输入:https://servera:9090--点击右侧高级选项---添加访问---账号密码:root redhat ----左边Overview---找到configure--找到调优

23.3 调节nice值

1.进程有默认优先级,但是优先级默认不能更改,但是可以通过修改nice值来影响进程优先级。
  nice值+old优先级=new优先级
  Nice +  80   = 新优先级
  
  Nice值调节范围:
      root:修改范围-20~19    调节优先级的工作由root来执行
      user:   修改范围0~19        调节后无法降级
  优先级:数值越大优先度越低,数值越小优先级越高。
  
  nice 直接给一个新的指令设置优先级
  renice 给一个现有的进程调节优先

  nice值管理
  语法:nice 选项  command
  选项:-n : -n 后面添加优先级 
       nice -n 10 vim 1.txt 
  
  语法:renice 选项 进程号
  -n:  -n 后面添加优先级 
  renice -n 10 pid

24 SELinux

  SELinux全称是Security Enhanced Linux (安全强化 Linux),是MAC (Mandatory Access Control,强制访问控制系统)的一个实现,在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。

  强制访问控制系统的用途在于增强系统抵御0-Day攻击(利用尚未公开的漏洞实现的攻击行为)的能力。

  它不是网络防火墙或FACL的替代品,在用途上也不重复。在目前的大多数发行版中,已经默认在内核集成了SELinux。

24.1 实现原理

  普通权限和selinux权限对比:传统的Linux使用用户、文件权限的概念来限制资源的访问,通过对比进程的发起用户和文件权限以此来保证系统资源的安全,这是一种自由访问控制方式(DAC)。SELinux是Linux下的一种安全强化机制,为进程和文件加入了除权限之外更多的限制来增强访问条件,这种方式为强制访问控制(MAC)。

  进程和文件都有相应的标签,称为上下文,只有进程上下文和文件上下文对应上,该进程才可以访问文件。

  系统中大量的进程和文件上下文已经被定义,如http服务进程上下文为httpd_t域,/var/www/html/目录上下文为httpd_sys_content_t,后者归属于前者的匹配域内,即可匹配。

分类 目的
传统文件系统权限DAC 用户 文件系统权限
SELinux权限MAC 用户进程上下文 文件(或目录端口等)上下文

24.2 限制范围

  SElinux具有多种上下文类型,常见种类:

   安全上下文(限制文件的访问):该种类上下文存在于内存和文件中,进程访问文件inode时读取到上下文类型进行对比

   布尔值(限制软件功能的访问):该种类型上下文主要控制某些进程是否可以访问服务常用功能中出现的文件

   安全端口(限制服务的访问):selinux会限制服务启用的非标准端口号

 ID                                     SELinux
---- ------------ --------------------- ---------------------------------------------
 Filesystem   chmod, chown, setfacl semanage fcontext ... restorecon ... chcon
                                          ... touch /.autorelabel
 Service      vim /etc/\*.conf      setsebool -P ...
 Firewall     firewall-cmd ...      semanage port ...
 SELinux      vim          /etc/selinux/config             

24.3 查看上下文

1.查看进程上下文: ps auxZ  、 ps -eZ
  [root@servera ~]# ps auxZ | grep httpd
  system_u:system_r:httpd_t:s0    root      1971  0.0  1.2 273800 10496 ?        Ss   04:58   0:00 /usr/sbin/httpd -DFOREGROUND

2.查看文件上下文:ls -Z
  [root@servera ~]# ll -dZ /var/www/html/
  system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

注明:只要进程和文件的安全上下文匹配,该进程就可以访问该文件资源

24.4 security context

  content是常说的上下文,安全上下文有5个字段,以:冒号分割

unconfined_u   :object_r:   httpd_sys_content_t:      s0           [类别]   
身份            user -u    角色roles -r  类型 type  -t  灵敏度(级别)     类别  

  1.身份字段(user):用于标识该数据被哪个身份所拥有,相当于权限中的用户身份。常见的身份类型有以下 3 种

  root:表示安全上下文的身份是 root。

  system_u:表示系统用户身份,其中“u”代表 user。

  _user_u:表示与一般用户账号相关的身份,其中“_u”代表 user。

  2.角色(role):主要用来表示此数据是进程还是文件或目录。常见的角色有以下两种

  object_r:代表该数据是文件或目录,这里的“_r”代表 role。

  system_r:代表该数据是进程,这里的“_r”代表 role。

  3.类型(type):类型字段是安全上下文中最重要的字段,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配,如果匹配则可以访问

  类型字段在文件或目录的安全上下文中被称作类型(type),但是在进程的安全上下文中被称作域(domain)。也就是说,在主体(Subject)的安全上下文中,这个字段被称为域;在目标(Object)的安全上下文中,这个字段被称为类型。域和类型需要匹配(进程的类型要和文件的类型相匹配),才能正确访问。

seinfo -u    # 查询所有的user字段的种类
seinfo -r    # 查询所有的role字段的种类
seinfo -t    # 查询所有的type字段的种类 

sesearch -A      # 查询什么类型进程可以读取什么type类型的文件
sesearch -A -s   # 进程type    # 查询type类型的进程能够读取的文件type   
sesearch -A -b   # 规则(规则的boolean值,所以为-b选项,理解为bool规则)
    
[root@foundation0 ~]# sesearch -A -s httpd_t | grep '^allow httpd_t httpd_sys_content_t'

  4.灵敏度:灵敏度一般是用 s0、s1、s2 来命名的,数字代表灵敏度的分级。数值越大,代表灵敏度越高

  5.类别:类别字段不是必须有的,所以我们使用 ls 和 ps 命令查询的时候并没有看到类别字段,通过seinfo -u -x查看

-foundation0 
打开浏览器,网址位置输入 172.25.250.10/index.html   #访问servera的网页
发现可以访问到网页内容,证明上下文一致,不被限制,可以访问

-servera
chcon -t default_t /var/www/html/index.html   #更改了file3的上下文
ll -Z  #发现index.html上下文类型字段变成default_t

-foundation0 
打开浏览器,网址位置输入 172.25.250.10/index.html   #访问servera的网页
发现不可以访问到网页内容,证明上下文不一致,被限制,不可访问

-servera
ll -dZ /var/www/html/  #查看到httpd相关上下文
chcon -t httpd_sys_content_t /var/www/html/index.html #更改上下文改为httpd_sys_content_t

-foundation0 
打开浏览器,网址位置输入 172.25.250.10/index.html   #访问servera的网页
发现可以访问到网页内容,证明上下文一致,不被限制,可以访问

24.5 更改SElinux强制模式

1.临时开启或关闭selinux

[root@clear /]# getenforce 
Enforcing
[root@clear /]# setenforce 
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]    # 强制 1|宽容 0
[root@clear /]# setenforce 0
[root@clear /]# getenforce 
Permissive
[root@clear /]# setenforce Permissive
[root@clear /]# getenforce 
Permissive
[root@clear /]# setenforce 1
[root@clear /]# getenforce 
Enforcing

2.永久开启或关闭selinux
-RHEL<=9
[root@servera ~]# vim /etc/selinux/config
...
SELINUX=enforcing

24.6 继承特性

继承:
1、在父目录下创建文件会继承selinux上下文touch
2、cp时不继承,即cp时不保留原来的父目录上下文关系
   创建了文件并且移动(mv)会保留原来的父目录上下文关系
   cp -a(rp)复制时会保留之前的上下文关系
【servera】 
[root@servera /]# cd /var/www/html/
[root@servera html]# ll -dZ .
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 23 May 21 09:13 .
[root@servera html]# touch haha.txt
[root@servera html]# ll -Z haha.txt 
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 May 21 10:06 haha.txt

[root@servera ~]# cd /tmp/
[root@servera tmp]# touch file{1..3}
[root@servera tmp]# ls -Z /tmp/file*
unconfined_u:object_r:user_tmp_t:s0 /tmp/file1 
unconfined_u:object_r:user_tmp_t:s0 /tmp/file2 
unconfined_u:object_r:user_tmp_t:s0 /tmp/file3
[root@servera tmp]# cp /tmp/file1 /var/www/html/
[root@servera tmp]# cp -a /tmp/file2 /var/www/html/
[root@servera tmp]# mv /tmp/file3 /var/www/html/
[root@servera tmp]# cd /var/www/html/
[root@servera html]# ls -Z *
unconfined_u:object_r:httpd_sys_content_t:s0 file1           unconfined_u:object_r:user_tmp_t:s0 file3
         unconfined_u:object_r:user_tmp_t:s0 file2
[root@servera html]# touch /var/www/html/file0
[root@servera html]# ll -Z /var/www/html/file0
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Apr 10 05:08 /var/www/html/file0

24.7 selinux文件上下文规则

方法1:永久设置,但不记录至数据库
      chcon 设置上下文关系
方法2:永久设置,记录至数据库
      semanage fcontext  添加、修改、查看、删除默认上下文
      restorecon 恢复默认上下文 

24.7.1 chcon

chcon 选项 上下文类型  文件

[root@servera html]# ll -Z 
total 0
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Dec 11 05:36 file1
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Dec 11 05:38 file2
-rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0          0 Dec 11 05:37 file3
-rw-r--r--. 1 root root unconfined_u:object_r:user_tmp_t:s0          0 Dec 11 05:37 file4
[root@servera html]# man chcon
[root@servera html]# chcon -t httpd_sys_content_t file3
[root@servera html]# ll -Z 
total 0
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Dec 11 05:36 file1
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Dec 11 05:38 file2
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 0 Dec 11 05:37 file3
-rw-r--r--. 1 root root unconfined_u:object_r:usexr_tmp_t:s0         0 Dec 11 05:37 file4

24.7.2 semanage fcontext

帮助中查看示例:
man semanage
man semanage fcontext
选项:
semanage fcontext 
-a  添加   添加至数据库
-d  删除
-l  查看
-t  指定上下文
-m  修改

修改流程:
1、查看selinux上下文类型数据库是否有记录?有就恢复I(restorecon),没有就添加(semanage fcontext -a)
2、man semanage fcontext添加文件标签类型至数据库. 添加后,文件并不会更改标签类型
3、使用restorecon命令同步和数据库一致

【servera】
-l
[root@clear /]# man semanage fcontext | grep \#
root@servera ~]# yum provides sesearch
Last metadata expiration check: 2:54:21 ago on Sat Mar  1 00:44:02 2025.
setools-console-4.4.3-1.el9.x86_64 : Policy analysis command-line tools for SELinux
Repo        : rhel-9.3-for-x86_64-baseos-rpms
Matched from:
Filename    : /usr/bin/sesearch

[root@clear /]# semanage  fcontext -l | grep /var/www  看第一行即可
[root@clear /]# semanage  fcontext -l | grep /var/www/html/file3
/var/www/html/file3                                all files          system_u:object_r:default_t:s0 
[root@clear /]# semanage fcontext -a -t httpd_sys_content_t /var/www/html/file3 #数据库没有上下文记录,用-a添加,如已存在则用-m修改数据库中错误的上下文
[root@clear /]# semanage  fcontext -l | grep /var/www/html/file3
/var/www/html/file1                                all files          system_u:object_r:httpd_sys_content_t:s0 

restorecon  恢复文件上下文和数据库一致
-v  显示修改标签内容
-R  递归
[root@clear /]# restorecon -R -v /var/www/html/file3
Relabeled /var/www/html/file3 from system_u:object_r:default_t:s0 to system_u:object_r:httpd_sys_content_t:s0

[root@clear /]# ll -Z /var/www/html/file3
-chcon 
chcont -t httpd_sys_content_t /var/www/html/index.html
man semanage fcontext -l | grep \#

-semanage fcontext
man semanage fcontext -l | grep \#    
semanage fcontext -a -t httpd_sys_content_t /var/www/html/index.html 
semanage fcontext -m -t httpd_sys_content_t /var/www/html/index.html
semanage fcontext -d -t httpd_sys_content_t /var/www/html/index.html
semanage fcontext -l  /var/www/html/index.html
restorecon -R -v /var/www/html/index.html

25 管理基本存储

25.1 分区工具:fdisk&parted

  新磁盘流程规划:

  1.分区(可选)fdisk parted

  2.格式化 mkfs

  3.挂载 mount

  4.使用

fdisk是一个分区工具,既可以查看磁盘状况,也可以对磁盘进行分区:
1.语法:fdisk  选项  设备名
2.选项:-l 查看所有磁盘状态
  fdisk  -l            #查所有磁盘信息
  fdisk  -l /dev/vdb   #查某一个磁盘信息

25.1 分区方案-MBR

  MBR叫做主引导记录,存在于磁盘的0柱面0磁道0扇区中,是磁盘的第一个扇区内,大小为512字节,446字节初始化程序加载器,64字节分区表,2字节校验码,每个分区16字节,所以最多4个分区,最大磁盘空间支持2T。主分区和扩展分区编号用1-4,逻辑分区编号5以上。

1 MBR分区方案:
5G磁盘,每个分区1G
3P+1E , 1E(L5、L6)

[root@clear /]# fdisk -l
[root@clear /]# fdisk -l /dev/vdb
[root@clear /]# fdisk /dev/vdb
n   #创建分区
p   #选择p主  或  e扩展
1   #分区编号
回车,不通过扇区范围分配        
+1G:设置一个1G大小分区   p:查看分区状态    d:删除    w:保存退出

-删除分区
Command (m for help): d
Partition number (1-6, default 6): 6
Partition 6 has been deleted.

#partprobe    磁盘分区正常结束后,此命令可以正常执行,不返回任何信息,主要做刷新分表信息通知内核
[root@clear /]# fdisk -l /dev/vdb
[root@servera ~]# lsblk

25.2 分区方案-GPT

  GPT是GUID Partition Table,全局唯一标识磁盘分区表。它由UEFI启动硬盘,这样就有了UEFI取代传动BIOS,而GPT则取代传统的MBR,windows支持最多128个GPT分区

  MBR分区方案:分区表=64字节、1个分区=16字节、4x16=64 最多只能记录4个分区 主分区

  4个分区不够用?比如5个以上?

  1.主分区最多4个,占分区编号1-4,可以格式化(可使用存放数据)

  2.扩展分区最多可以有1个,牺牲一个主分区来做扩展分区,它不能格式化(不能使用,不能存放数据),它的作用是装载逻辑分区用的,也就是用扩展分区的空间再划分多个逻辑分区

  3.逻辑分区-由扩展分区的空间划分而来的,约可以分15个左右。可以格式化(可以使用,可以存放数据),逻辑分区必定从5号开始

  分区方案:4P、3P+1E

Command (m for help): g
Created a new GPT disklabel (GUID: 1BA96F11-6DA0-204D-82D6-0CD15E42851E).
The old dos signature will be removed by a write command.

Command (m for help): n
Partition number (1-128, default 1):  回车
First sector (2048-10485726, default 2048): 回车 
Last sector, +sectors or +size{K,M,G,T,P} (2048-10485726, default 10485726): +1G

Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB.

Command (m for help): n
Partition number (2-128, default 2): 
First sector (2099200-10485726, default 2099200): 
Last sector, +sectors or +size{K,M,G,T,P} (2099200-10485726, default 10485726): +2G

Created a new partition 2 of type 'Linux filesystem' and of size 2 GiB.

Command (m for help): l   #列出分区标识类型

Command (m for help): t   #改变分区标识类型
Partition number (1,2, default 2): 2
Partition type (type L to list all types): 19

Changed type of partition 'Linux filesystem' to 'Linux swap'.

Command (m for help): p
Disk /dev/vdb: 5 GiB, 5368709120 bytes, 10485760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 1BA96F11-6DA0-204D-82D6-0CD15E42851E

Device       Start     End Sectors Size Type
/dev/vdb1     2048 2099199 2097152   1G Linux filesystem
/dev/vdb2  2099200 6293503 4194304   2G Linux swap

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

# partprobe  同步数据至内核

25.3 parted使用MBR

1.mbr方式
定义分区方案
分区
分3个区 主、扩展 、逻辑。再用非交互式创建第二个逻辑
[root@servera /]# parted /dev/vdc     #直接指定设备,而不是分区
(parted) mklabel        #按回车键  定义分区方案                                                    
New disk label type? msdos     #两一下tab键,填写                                             
Number  Start  End  Size  Type  File system  Flags
(parted) mkpart #分区                                                          
Partition type?  primary/extended? p  #主/扩展/逻辑                                    
File system type?  [ext2]? ext4   #无用,不生效
Start? 2048s#第一个分区,一定从1M或2048s开始                                                          
End? 1000MB #分1G分区,1000M、1G、(10G磁盘,可以写10%,完全使用就是100%)                                                              
(parted) p          #查看                                                      

Number  Start   End     Size   Type     File system  Flags
 1      1049kB  1000MB  999MB  primary  ext4         lba
(parted) quit        #退出                                                    
Information: You may need to update /etc/fstab.
[root@servera ~]#udevadm  settle (更新通知内核,建议敲上,不是必要)

非交互式方式
命令:
[root@servera /]# parted /dev/vdc mkpart p ext4 1000MB 2000MB

25.4 parted使用GPT

[root@clear /]# parted  /dev/vdc  #使用了上一个实验的同样的分区,重复使用了vdc
(parted) mklabel                                                          
New disk label type? gpt  #再更改分区方案时会抹掉之前的分区数据
Warning: The existing disk label on /dev/vdc will be destroyed and all data on this disk will be lost. Do
you want to continue?
Yes/No? yes    #yes                                                            
(parted) p                                                                 B
Partition Table: gpt  #此处显示gpt分区方案
(parted) mkpart                                                           
Partition name?  []? part1   #分区名字                                               
File system type?  [ext2]?     #直接回车                                           
Start? 1M                                                                 
End? 10%                                                                  
(parted) p                                                                
Number  Start   End     Size    File system  Name   Flags
 1      1049kB  1074MB  1073MB  ext2         part1        #注意Number和Name
(parted) mkpart
Partition name?  []? part2                                                
File system type?  [ext2]?                                                
Start? 10%                                                                
End? 20%
(parted) p
Number  Start   End     Size    File system  Name   Flags
 1      1049kB  1074MB  1073MB  ext2         part1
 2      1074MB  2147MB  1074MB  ext2         part2   #第二个分区完成
(parted) rm                                                               
Partition number? 2               #选择第二个分区的Number                                      
(parted) p                                                                
Number  Start   End     Size    File system  Name   Flags
 1      1049kB  1074MB  1073MB  ext2         part1
(parted) q                                                                
#非交互式方式重新分第二个分区
[root@clear /]# parted /dev/vdc mkpart  part2 ext2 10% 20%                
[root@clear /]# parted /dev/vdc p
Number  Start   End     Size    File system  Name   Flags
 1      1049kB  1074MB  1073MB               part1
 2      1074MB  2147MB  1074MB               part2   #成功分配
lsblk 
lsblk /dev/vdc
blkid 

25.5 文件系统

1.分区后,会给分区定义文件系统类型
windos: fat32 ntfs exfat 
linux : exfat 有ext2 ext3 ext4 xfs vfat 
MacOS : exfat 
2.为什么定义文件系统?给磁盘定义一种存储数据的方法,这样块存储设备才可以记录文件数据。
3.每个分区都可以定义一个独立的文件系统,定义的方法就是格式化。设备有了文件系统后才可以存储数据。
4.操作系统里分区很多,每个分区可能会有相同或不同的文件系统类型,彼此独立
5.VFS  虚拟文件系统:作用,将用户发送的指令给任何文件系统做翻译,对于用户来说,我不必学习不同文件系统的操作方法,而是使用常用shell管理指令,就可以通过VFS传递给不同的文件系统了。

25.6 格式化

语法:
mkfs  选项  文件系统类型  设备名
mkfs  -t    ext4      /dev/vdb1
选项:
-t: 指定文件系统  -t ext4
例:
[root@servera /]# mkfs -t ext4 /dev/vdc1    
例2:使用.点代替-t
[root@servera /]# mkfs.ext4 /dev/vdc2

25.7 lsblk

[root@servera /]# lsblk --fs /dev/vdc   #-f  --fs
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
vdc                                                      
├─vdc1 ext4         af656cc6-80e3-4b05-abcf-a162907c2f0a 
└─vdc2 xfs          64237913-4937-48ff-8afa-28c6fc05124d 
[root@servera /]# parted /dev/vdc p
Model: Virtio Block Device (virtblk)
Disk /dev/vdc: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size   Type     File system  Flags
 1      1049kB  1000MB  999MB  primary  ext4
 2      1000MB  2000MB  999MB  primary  xfs
 
查看文件系统
lsblk  --fs /dev/vdc

blkid 超级管理员可用 也可查文件系统类型
[root@servera ~]# lsblk -f /dev/vdb1
NAME FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
vdb1 xfs                e36c91a4-83a0-4dba-a015-3f62bdc32b60                
[root@servera ~]# blkid /dev/vdb1
/dev/vdb1: UUID="e36c91a4-83a0-4dba-a015-3f62bdc32b60" TYPE="xfs" PARTUUID="bd4097dc-01"

25.8 挂载与永久挂载

25.8.1 mount

mount挂载也称为手动挂载,或临时挂载,重启失效
语法:
mount 文件系统 挂载点      #源设备需要格式化后,成为文件系统才可挂载   #挂载点需要是空目录
例1:mount /dev/vdb1 /mnt/disk_vdb1

选项:
-t 指定文件系统类型(默认自动识别) mount  -t ext4 /dev/vdb1    /mnt/disk_vdb1
-o 指定挂载权限卸载--》再指定权限  mount  -o ro /dev/vdb1    /mnt/disk_vdb1
例2:
remount 重新挂载 (不卸载的基础上重新挂载)
mount -o remount,ro /dev/vdc2

卸载:
umount 文件系统/挂载点
例:
umount /dev/vdb1  #或者 umount /mnt/disk_vdb1  #卸载时要退出/mnt/disk_vdb1目录
1.临时挂载 
[root@clear dev]# mkdir /mnt/disk1   #创建挂载点
[root@clear dev]# mount /dev/vdc1 /mnt/disk1   #挂载
[root@clear dev]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vdc1      ext4      991M  2.6M  922M   1% /mnt/disk1
[root@clear dev]# cd /mnt/disk1  #进入目录  
[root@clear disk1]# touch haha   #使用
[root@clear disk1]# ls
haha  lost+found
[root@clear disk1]# cd /
卸载
[root@clear /]# umount /dev/vdc1
[root@clear /]# df -Th  #查看发现已经没有/dev/vdc1的挂载信息,就算成功了 。

2.使用UUID方式挂载
[root@clear /]# lsblk -f #也可以查看UUID
[root@clear /]# blkid
[root@clear /]# blkid /dev/vdc1
/dev/vdc1: UUID="9bdeba87-5ad0-4c52-b577-0234115df2e1" TYPE="ext4" PARTLABEL="part1" PARTUUID="28f6e868-cd04-434c-9fd3-618f17382797"
[root@clear /]# mount UUID="9bdeba87-5ad0-4c52-b577-0234115df2e1" /mnt/disk1 #鼠标左键选定后按滑轮中间。
[root@clear /]# df -Th
/dev/vdc1      ext4      991M  2.6M  922M   1% /mnt/disk1

mount方式挂载,重启失效
[root@clear /]# df -Th
[root@clear /]# reboot  #重启后再查看挂载

25.8.2 /etc/fstab

mount临时挂载:
mount /dev/vdb1 /mnt/disk1
mount -t ext4 -o rw /dev/vdb1 /mnt/disk1    //指定参数以只读方式挂载

2.开机自动挂载   永久
[root@clear /]# df -h
/dev/vdc1       991M  2.6M  922M   1% /mnt/disk1
[root@clear /]# umount /dev/vdc1
[root@clear /]# df -h
[root@clear /]# vim /etc/fstab 
/dev/vdc1       /mnt/disk1      ext4    defaults    0     0
设备ID或设备名称    挂载点    文件系统类型   选项(权限,认证设定,其他)   内核日志检测机制0不检测,1、2检测,1比2优先级高  磁盘检测机制0不检测、1、2检测,1比2优先级高

[root@clear /]# mount -a #挂载/etc/fstab中所有未挂载的设备
[root@clear /]# df -Th
/dev/vdc1      ext4      991M  2.6M  922M   1% /mnt/disk1

#reboot   #模拟考试环境,没做完selinux安全端口别重启,会起不来

`注意`
如果/etc/fstab中配置错误导致不能启动系统,重启时会自动进入紧急模式.
解决方案流程:
1 此时输入管理员root密码
2 编辑挂载权限 #mount -o remount,rw / 
3 vi /etc/fstab更改正内容或将其用  #井号注释挂载内容后,
4 reboot即可

25.9 管理交换分区

25.9.1 创建swap

创建swap 
流程:
1. 分区---1G
[root@clear /]# parted  /dev/vdc mkpart part3 ext2 20% 30% 
Information: You may need to update /etc/fstab.
[root@clear /]# parted  /dev/vdc p
Number  Start   End     Size    File system  Name   Flags
 1      1049kB  1074MB  1073MB  ext4         part1
 2      1074MB  2147MB  1074MB  xfs          part2
 3      2147MB  3221MB  1074MB               part3

2. 查询系统中swap空间,使用free命令
[root@servera ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            1763         371        1398          13         144        1391
Swap:              0           0           0
[root@servera ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.7Gi       371Mi       1.4Gi        13Mi       144Mi       1.4Gi
Swap:             0B          0B          0B

3. 格式化为swap
[root@servera ~]# mkswap /dev/vdb2
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=2cc08ea9-26ea-4e28-9ff5-070c84366f91

4. 给系统加载swap空间
     4.1 临时加载与卸载,重启失效 
[root@servera ~]# swapon /dev/vdb2
[root@servera ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            1763         372        1398          13         144        1391
Swap:           1023           0        1023
[root@servera ~]# swapoff /dev/vdb2
[root@servera ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            1763         372        1396          13         148        1391
Swap:              0           0           0

     4.2 写入/etc/fstab文件永久生效
[root@servera ~]# vim /etc/fstab
/dev/vdb2       swap            swap    defaults  0   0
[root@servera ~]# swapon -a    #swap空间用swapon -a挂载
[root@servera ~]# free -m
               total        used        free      shared  buff/cache   available
Mem:            1763         377        1390          13         149        1385
Swap:           1023           0        1023

25.9.2 本地存储创建swap

swap-file
# df -h
# dd if=/dev/zero of=/pagefile.sys bs=512M count=1
# mkswap /pagefile.sys 
# chmod 0600 /pagefile.sys 
# vim /etc/fstab 
...
/pagefile.sys swap swap defaults 0 0 
# swapon -a
# free -h

26 逻辑卷管理LVM

  逻辑卷(LVM):基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小

  物理卷(PV):LVM的最底层概念,是LVM的逻辑存储块,物理卷与磁盘分区是逻辑的对应关系

  卷组(VG):LVM逻辑概念上的磁盘设备,通过将单个或多个物理卷组合后生成卷组。卷组的大小取决于物理卷的容量以及个数

  物理长度(PE):物理长度是将物理卷组合为卷组后,所划分的最小存储单位,即逻辑意义上磁盘的最小存储单元。LVM默认PE大小为4MB

  逻辑卷(LV):LVM逻辑意义上的分区,可以指定从卷组中提取多少容量来创建逻辑卷,最后对逻辑卷格式化并挂载使用

26.1 构建LVM存储

  1.分区或者添加物理硬盘 fdisk,parted (mbr,gpt)

  2.pv让物理磁盘或分区变成lvm可用的卷 pvcreate

  3.创建vg同时指定pe块大小 vgcreate -s

  4.在vg中划分lv空间 lvcreate -L | -l -n vgname

  5.格式化lv空间

  6.挂载或者永久挂载

PV语法:pvcreate  /dev/vdb1  /dev/vdb   #分区名称或磁盘名
VG语法:vgcreate -s 16M vgname pvname   #-s不写默认4M,扩大的话可以是2的次方,比如4、8、16、32...,vgname是vg名称自定义,pvname就是创建pv时的物理分区名,就是pv名称
LV语法:lvcreate -L 容量 -n lvname vgname #指定容量可以使用-L 容量 或 -l 块数
1.分区     至少分3个分区,模拟物理磁盘,作为pv的底层物理块设备
[root@clear ~]# fdisk -l /dev/vdb

2.PV阶段
[root@clear ~]# man pvcreate ,搜索/EXAMPLES
[root@servera ~]# pvcreate /dev/vdb{1,3,5}
  
[root@clear ~]# pvs 或者 pvscan 或者 pvdisplay进行查询
[r

3.VG阶段
[root@clear ~]# man vgcreate ,搜索/myvg
[root@clear ~]# man vgcreate | grep myvg
[root@clear ~]# vgcreate -s 16M vg100 /dev/vdb{1..3}    # -s指定物理扩展块16M一个
Physical volume "/dev/vdb2" successfully created.
  Volume group "vg100" successfully created

[root@clear ~]# vgs         #主要查看下vg的大小,拥有的pv和lv数量
VG    #PV #LV #SN Attr   VSize VFree
  vg100   3   0   0 wz--n- 2.95g 2.95g

[root@clear ~]# vgdisplay   #vg名,容量,块大小,块的使用量


pv vg  pe 65535 固定 16M  x 65535 = 270G  2^2  

4.LV阶段
[root@clear ~]# man lvcreate ,搜索/64m
[root@clear ~]# man lvcreate | grep 64m
lvcreate -L 64m -n mylv vg00 /dev/sda:0-7 /dev/sdb:0-7

[root@clear ~]# lvcreate -L 1G -n lv100 vg100    //(-L:指定具体容量、-n:指定逻辑卷名称)
Logical volume "lv100" created.

[root@clear ~]# lvs
LV    VG    Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv100 vg100 -wi-a----- 1.00g 

[root@clear ~]# lvdisplay 


5.格式化
[root@servera ~]# mkfs.xfs /dev/vg100/lv100

[root@servera ~]# lsblk -f /dev/vg100/lv100
NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
vg100-lv100 xfs                e665f339-9faf-4fc9-8cbd-d29468bed812


6.创建挂载点与临时挂载
# mkdir /mnt/lvm1
# mount /dev/vg100/lv100 /mnt/lvm1
# df -h
# cd /mnt/lvm/

7.永久挂载
[root@clear ~]# cd /
[root@clear /]# echo "/dev/vg100/lv100 /mnt/lvm1 xfs defaults 0 0" >> /etc/fstab    // ">>"表示追加
[root@clear /]# mount -a
[root@servera ~]# df -Th
/dev/mapper/vg100-lv100 xfs       960M   39M  922M   5% /mnt/lvm1

[root@servera ~]# ll /dev/mapper/vg100-lv100 /dev/vg100/lv100


8.reboot重启验证

9.删除逻辑卷思路:
  创建顺序---分区--lv(pv-vg-lv)--格式化---挂载
  卸载顺序---卸载--删lv--删vg--删pv--删分区
  vgremove vg100

26.2 扩展逻辑卷

扩展流程:
1、扩展lv大小增加容量
2、重新定义文件系统大小
1 扩展语法:
lvextend 【-L| -l】【size|PE】 lv_name

选项:
-L:指定容量   直接指定最终大小 -L 1500M ,或者在原有基础上增加多少容量 -L2
-l:指定块数   -l 60-l +30
[root@servera ~]# lvextend -L 1500M /dev/vg100/lv100
 
[root@servera ~]# lvdisplay 
 
2 重新定义文件系统大小
  ext 文件系统 ”resize2fs  设备名/挂载点“   resize2fs /dev/vg100/lv100
  xfs 文件系统 “xfs_growfs 设备名/挂载点”   xfs_growfs /dev/vg100/lv100 或 xfs_growfs 挂载点
    
如果是xfs文件系统使用:
  [root@servera /]# xfs_growfs /mnt/lvm (挂载点)
  [root@servera ~]# df -Th

如果是ext4文件系统使用:
  [root@servera /]# resize2fs /dev/myvg/mylv (lv设备名)
创建的lv名称为myly,属于myvg卷组,lv需要30个pe,每个pe16M,需要开机自动挂载到/mnt/mylvdir. 并且使用xfs文件系统

26.3 缩小逻辑卷

格式化:
[root@servera ~]# mkfs.ext4 /dev/vg200/lv200

永久挂载:
[root@servera ~]# mkdir /mnt/lvm2
[root@servera ~]# echo "/dev/vg200/lv200 /mnt/lvm2 ext4 defaults 0 0" >> /etc/fstab
[root@servera ~]# mount -a

[root@servera ~]# systemctl daemon-reload
[root@servera ~]# mount -a
[root@servera ~]# df -Th

ext文件系统可以缩小,xfs不支持:
1. 卸载
   [root@servera ~]# umount /mnt/lvm2

2. resize2fs 定义缩小后的大小
   [root@servera ~]# resize2fs /dev/vg200/lv200 1G

3. 磁盘检测
   [root@servera ~]# e2fsck -f /dev/vg200/lv200

4. 重新执行resize2fs命令
   [root@servera ~]# resize2fs /dev/vg200/lv200 1G

5.重新挂载并查看
  [root@servera ~]# mount -a
  [root@servera ~]# df -Th

5. lvresize -L 1G 逻辑卷名
[root@servera ~]# lvresize -L 1G /dev/vg200/lv200
[root@servera ~]# lvdisplay

26.4 管理分层存储

26.4.1 stratis

1.1 安装

$ yum install -y stratis-cli stratisd
$ systemctl enable --now stratisd
```
1.2 部署存储池

1.为磁盘分区(可选用磁盘或分区),模拟块设备(磁盘)         
[root@servera ~]# stratis pool create pool1 /dev/vdb    #创建池名为pool1
[root@servera ~]# stratis pool list    #列出池信息包括大小
[root@servera ~]# stratis blockdev list  #列出池有哪些物理块设备组成
[root@servera ~]# stratis pool add-data pool1 /dev/vdc #添加额外存储
[root@servera ~]# stratis pool list
[root@servera ~]# stratis blockdev list 
ool Name   Device Node   Physical Size   Tier
pool1       /dev/vdb              5 GiB   Data
pool1       /dev/vdc              5 GiB   Data

1.3 创建文件系统

[root@servera ~]# man stratis   #搜/example
[root@servera ~]# stratis filesystem create pool1 fs1   #在pool1中创建文件系统fs1
[root@servera ~]# stratis filesystem list  #列出文件系统信息
Pool Name   Name   Used      Created             Device                   UUID                                
pool1       fs1    546 MiB   Sep 16 2023 21:30   /dev/stratis/pool1/fs1   0e40b338-6178-4bee-87b3-6e13b8be5ad0
 6d1ed6e714a6428eb374549b4fdd8d2b  
[root@servera ~]# mkdir /mnt/stratisdisk   #创建挂载点
如何查看uuid
[root@servera ~]# lsblk --output=UUID  /dev/stratis/pool1/fs1
[root@servera ~]# mount /dev/stratis/pool1/fs1 /mnt/stratisdisk/   #临时挂载
```
1.4 备份
-创建测试文件
[root@servera ~]# touch /mnt/stratisdisk/haha.txt

-备份
[root@servera ~]# stratis filesystem snapshot pool1 fs1 fs1.bak
[root@servera ~]# rm -f /mnt/stratisdisk/haha.txt 
[root@servera ~]# umount /mnt/stratisdisk 

[root@servera ~]# mount /dev/stratis/pool1/fs1.bak /mnt/stratisdisk
[root@servera ~]# ls /mnt/stratisdisk
haha.txt

1.5 开机自动挂载

```bash
vim /etc/fstab
/dev/stratis/pool1/fs1.bak /mnt/stratisdisk xfs _netdev 0 0 #_netdev 延迟挂载,先连接网络再挂载文件系统
mount -a

[root@clear ~]# systemctl start stratis
[root@clear ~]# stratis pool create mypool /dev/vdb1
[root@clear ~]# stratis pool add-cache mypool /dev/vdb2
[root@clear ~]# stratis blockdev list mypool 
Pool Name  Device Node  Physical Size   Tier
mypool     /dev/vdb1            1 GiB   Data
mypool     /dev/vdb2            1 GiB  Cache

26.4.2 VDO

## 2 VDO

### 1.1安装

```bash
该实验需要在普通环境上做,恢复init快照,默认是294,要切换至rh134课程
切换方法:
【foundation】
[kiosk@foundation0 ~]$ rht-clearcourse 0
[kiosk@foundation0 ~]$ rht-setcourse rh134
[kiosk@foundation0 ~]$ cat /etc/rht | grep RHT_COURSE   
RHT_COURSE=rh134        #必须保证课程是rh134才可以
[kiosk@foundation0 ~]$ for i in classroom bastion workstation servera;do rht-vmctl start $i;done  #开这4台虚拟机,打开时稍等3分钟左右,让其保证都开启,然后ping一下测试连通性
[kiosk@foundation0 ~]$ for i in classroom bastion workstation servera;do ping -c 4  $i;done  
结果都是以下结果即可,应出现icmp_seq=1 ttl=64 time=1.13 ms字样:
PING bastion.lab.example.com (172.25.250.254) 56(84) bytes of data.
64 bytes from bastion.lab.example.com (172.25.250.254): icmp_seq=1 ttl=64 time=1.13 ms
64 bytes from bastion.lab.example.com (172.25.250.254): icmp_seq=2 ttl=64 time=0.180 ms
64 bytes from bastion.lab.example.com (172.25.250.254): icmp_seq=3 ttl=64 time=0.234 ms
64 bytes from bastion.lab.example.com (172.25.250.254): icmp_seq=4 ttl=64 time=0.265 m

【foundation】
ssh student@workstation
【workstation】
lab advstorage-vdo start   #运行脚本,运行前,保证servera已打开
ssh student@servera
【servera】
[root@servera ~]# sudo -i
[root@servera ~]# yum search vdo
[root@servera ~]# yum install -y vdo.x86_64 kmod-kvdo.x86_64
[root@servera ~]# systemctl enable --now vdo
```

### 1.2 部署vdo

```bash
[root@servera ~]# man vdo   #/EXAMPLE
*[root@servera ~]# vdo create --name=vdo1 --device=/dev/vdd --vdoLogicalSize=50G
[root@servera ~]# vdo list
[root@servera ~]# vdo status --name=vdo1
[root@servera ~]# vdo status --name=vdo1 | grep Dedu
[root@servera ~]# vdo status --name=vdo1 | grep Comp
```

### 1.3 格式化及临时挂载测试

```bash
格式化
*[root@servera ~]#  mkfs.xfs -K /dev/mapper/vdo1      #-K让命令可以快速返回,效果类似快速格式化 ,如果已有文件系统 可以使用 -f强制执行 

挂载
*[root@servera ~]# mkdir /mnt/vdo1
[root@servera ~]# mount /dev/mapper/vdo1 /mnt/vdo1
[root@servera ~]# df -Th
[root@servera ~]# vdostats --human-readable
[root@servera ~]# cp /root/install.img /mnt/vdo1/install.img.1
[root@servera ~]# vdostats --human-readable
[root@servera ~]# vdostats --human-readable
[root@servera ~]# cp /root/install.img /mnt/vdo1/install.img.2
[root@servera ~]# vdostats --human-readable vdostats --human-readable
ls /mnt/vdo1/
lab advstorage-vdo finish
```

### 1.4 开机自动挂载

```bash
开机自动挂载方法:教材推荐
*[root@servera ~]# man vdo- | grep x-systemd
/dev/mapper/vdo1 /mnt/vdo1 xfs defaults,x-systemd.requires=vdo.service 0 0

mount -a

方法二:
/dev/mapper/vdo1 /mnt/vdo1 xfs defaults,_netdev 0 0

27 访问网络存储

27.1 NFS挂载网络附加存储

27.1.1 查看NFS共享

普通环境
[root@servera ~]# showmount -e 172.25.254.250  #后面IP地址是NFS服务器的地址,环境默认已经部署好
Export list for 172.25.254.250:     #来自250的共享
/content 172.25.0.0/255.255.0.0     #服务器共享的目录

27.1.2 客户端挂载

语法:
mount -t nfs  ip/域名:共享目录  本地挂载点
练习:
[root@servera ~]# mkdir /mnt/nfs1
#mount -t nfs -o ro 172.25.254.250:/content  /mnt/nfs1  #-t nfs指定文件系统为nfs,-o ro指定挂载权限为只读,这两个选项是可选的。
[root@servera ~]# mount 172.25.254.250:/content  /mnt/nfs1
[root@servera ~]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
172.25.254.250:/content nfs4      244G  102G  142G  42% /mnt/nfs1

27.1.3 开机自动挂载

[root@servera ~]# umount /mnt/nfs1
[root@servera ~]# vim /etc/fstab
172.25.254.250:/content /mnt/nfs1 nfs defaults 0 0
[root@servera ~]# mount -a
[root@servera ~]# df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
172.25.254.250:/content nfs4      244G  102G  142G  42% /mnt/nfs1
[root@servera ~]# reboot  (重启后使用df -Th查看挂载状态)模拟考试环境没做selinux题,先别重启,起不来

27.2 自动挂载网络附加存储

27.2.1 自动挂载

servera上做该练习,挂载f0,172.25.254.250上的/content到servera上的/mnt/nfs10,读写权限
-mount
mkdir /mnt/nfs10
mount 172.25.254.250:/content /mnt/nfs10

-fstab
mkdir /mnt/nfs10
vim  /etc/fstab
172.25.254.250:/content /mnt/nfs10  nfs4  defaults 0 0

-autofs
1.[root@clear home]# yum search autofs
  [root@clear home]# yum install -y autofs

2.[root@servera ~]# rpm -qc autofs
  /etc/auto.master   # 主配置文件
  /etc/auto.misc     # 映射文件
  /etc/auto.net
  /etc/auto.smb
  /etc/autofs.conf
  /etc/autofs_ldap_auth.conf
  /etc/sysconfig/autofs
  /usr/lib/systemd/system/autofs.service

3.[root@servera ~]# vim /etc/auto.master
   基础挂载点     映射文件
   /data         /etc/auto.misc         # /data是基础挂载点,表示挂载是从这里开始的,系统自动创建/data

4.[root@servera ~]# vim /etc/auto.misc
   映射挂载点         文件系统类型 权限          共享目录
   nfs10             -fstype=nfs,rw         172.25.250.250:/content   # auto.misc是映射文件,内容为映射挂载点、挂载权限、共享目录路径等


5.[root@servera ~]# systemctl restart autofs   # 重启让以上配置生效

6.验证
[root@servera ~]# ls /data/nfs10   # ls是使用挂载点目录
boot  courses  ebook  ks  manifests  rhel7.0  rhel9.0  rhel9.3  rhtops  slides  ucf
[root@servera ~]# df -h | tail -1
172.25.254.250:/content  244G  102G  142G  42% /data/nfs10  # 才会出现挂载项

注明:autofs共享服务只有在访问时才会看到挂载信息

27.2.2 autofs 直接映射

[root@clear /]# umount /mnt/nfs10
1.主配置文件
[root@clear /]# vim /etc/auto.master.d/nfs.autofs  #nfs.autofs 名称规则和上个实验一样
/- /etc/auto.nfs     #所有直接映射条目使用/-作为基础目录
2.映射文件
[root@clear /]# vim /etc/auto.nfs   #固定文件名
/mnt/nfs10  -rw 172.25.254.250:/content
3.重启服务
[root@clear /]# systemctl restart autofs
4.测试
[root@clear /]# ll /mnt/nfs1   #cd或ll方式都可以访问共享目录内容,即可挂载
[root@servera /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
172.25.254.250:/content  491G   66G  426G  14% /mnt/nfs1  

27.2.3 autofs 间接映射

1.主配置文件
[root@clear /]# vim /etc/auto.master.d/nfs.autofs 
/mnt /etc/auto.nfs

2.映射文件
[root@clear /]# vim /etc/auto.nfs 
*   -rw  172.25.254.250:/&   #如果共享导出了多个子目录可以用&代替子目录的名称,而星*号会自动匹配共享的目录名称
*   -rw  172.25.254.250:/&  /content /public  /share      

3.重启服务
[root@clear /]# systemctl restart autofs
4.测试
[root@clear /]# cd /mnt/content;ls
[root@clear remoteuser1]# df -h  #应该能看到挂载信息

28 firewalld

28.1 防火墙架构

  现代计算机环境不仅需要流畅的网络连通,更需要具备安全性的网络,所以我们除了及时更新系统补丁以外事件,可以针对自己的计算机环境设置接收哪些数据和不接收哪些数据。我们可以使用软件来实现这一目的,这种软件就叫做防火墙。防火墙这种软件会制定一些规则,我们也叫做策略,管理数据包的通过。

  firewalld优点:在于可使用zone、service简化配置任务,易于管理。而且属于动态管理(修改规则后不必重启整个防火墙服务)。

  zone区域:firewalld预先提供了多个区域,不同区域拥有不同设置好的规则,类似不同的管理方案。系统默认区域为public。

  所有区域默认在系统中会同时开启但是 如何判断我们的数据包在哪个区域中实现了数据限制,通过以下三种方法来判断:

   source,源地址interface,接收请求的网卡( 一个网卡,只能绑定一个区域。多个网卡,可以绑定同一区域)

   firewalld.conf中配置的默认zone

   三个优先级按次序降低。匹配后不再向下匹配。

28.2 nftables增强了netfilter

  nftables—>替代—>netfilter

# firewalld简介
rhel7之前---iptables(静态)
rhel7之后---firewalld(动态)

# 预定义区域
[root@foundation0 ~]# firewall-cmd --get-zones
block dmz drop external home internal libvirt public trusted work

# 预定义服务
[root@foundation0 ~]# firewall-cmd --get-service

28.3 配置防火墙

防火墙命令 解释
–get-default-zone 查看默认区域
–set-default-zone=public 设置默认区域为public,永久设置
–get-zones 列出所有可用区域
–get-active-zones 列出当前正在使用所有区域
–add-source=CIDR [–zone=ZONE] 将IP或网络到指定区域,如果未提供–zone=选项,则使用默认区域
–remove-source=CIDR 删除IP或网络…..,如果未提供–zone=选项,…则删除默认区域
[–zone=ZONE]
–add-interface= 在某个区域中添加端口
–change-interface= 改变端口至某个区域
–list-all [–zone=ZONE] 查看区域所有策略
–add-service= [–zone=ZONE] 允许一个服务
–add-port= [–zone=ZONE] 允许一个端口
–remove-service= [–zone=ZONE] 移除一个服务
–remove-port= [–zone=ZONE] 移除一个端口
–permanent 永久生效
–reload 立即加载
1、管理防火墙服务状态
systemctl status firewalld 
systemctl start firewalld 
systemctl stop firewalld 
systemctl restart firewalld 
systemctl enable --now firewalld 
2、查看与设置默认区域
man firewall-cmd #/Ex
firewall-cmd --get-service
firewall-cmd --get-zones
firewall-cmd --get-default-zone 
firewall-cmd --set-default-zone=home     设置默认区域,了解就可以,不是必须要设置
firewall-cmd --list-all
man 5 firewalld.zones
3.配置防火墙(考)
允许服务
[root@servera ~]# firewall-cmd --list-all  #查看区域所有配置
[root@servera ~]# firewall-cmd --permanent --add-service=http #允许http服务永久生效,要结合reload
[root@servera ~]# firewall-cmd --reload
[root@servera ~]# firewall-cmd --list-all
移除服务
[root@servera ~]# firewall-cmd --permanent --remove-service=http
[root@servera ~]# firewall-cmd --reload
[root@servera ~]# firewall-cmd --list-all
允许端口
[root@servera ~]# firewall-cmd --permanent --add-port=8000/tcp
[root@servera ~]# firewall-cmd --reload
[root@servera ~]# firewall-cmd --list-all
移除端口
[root@servera ~]# firewall-cmd --permanent --remove-port=8000/tcp
[root@servera ~]# firewall-cmd --reload
[root@servera ~]# firewall-cmd --list-all
允许源地址到某个区域(了解)
firewall-cmd --add-source=172.25.250.100 --zone=trusted --permanent
firewall-cmd --reload
  
firewall-cmd --add-interface=enp2s0 --zone=trusted --permanent
firewall-cmd --reload

28.4 SElinux安全端口

【servera】
[root@servera ~]# setenforce 1
[root@servera ~]# vim /etc/httpd/conf/httpd.conf 
Listen 80 改成了Listen 82
[root@servera ~]# systemctl restart httpd   重启不了,因为selinux
[root@servera ~]# man semanage port    #/EX
[root@servera ~]# semanage port -a -t http_port_t -p tcp 82  #数据库没有标签内容则-a,有则-m
[root@servera ~]# semanage port -l | grep http
重启web服务
[root@servera ~]# systemctl restart httpd
[root@servera ~]# systemctl enable --now httpd
[root@servera ~]# firewall-cmd --permanent --add-port=82/tcp   #本地访问无须配置,远端主机访问需要配置
[root@servera ~]# firewall-cmd --reload
[root@servera ~]# firewall-cmd --list-all

测试
[serverb curl http://servea:82] 
富规则参考
[root@servera ~]# man 5 firewalld.richlanguage

29 kickstart

  安装方式    简介
----------- --------------------------------
  DVD 光盘    物理系统光盘
  ISO镜像     光盘制作成为的镜像.iso文件
  QCOW2镜像   云环境或虚拟环境中部署为虚拟机

29.1 KICKSTART自动安装系统

1.后面按照教材要求进行配置
[root@servera ks-config]# vim /var/www/html/ks-config/kickstart.cfg
bootloader --append="console=ttyS0 console=ttyS0,115200n8 no_timer_check net.ifnames=0  crashkernel=auto" --location=mbr --timeout=1 --boot-drive=vda
graphical
keyboard --vckeymap=us
lang en_US.UTF-8
repo --name="BaseOS" --baseurl="http://classroom.example.com/content/rhel9.0/x86_64/dvd/BaseOS/"
repo --name="Appstream" --baseurl="http://classroom.example.com/content/rhel9.0/x86_64/dvd/AppStream"
url --url="http://classroom.example.com/content/rhel9.0/x86_64/dvd/"
rootpw --plaintext redhat
authselect select sssd
selinux --enforcing
services --disabled="kdump,rhsmcertd" --enabled="sshd,rngd,chronyd"
timezone America/New_York --utc
ignoredisk --only-use=vda
autopart
%pre --erroronfail 
echo "Kickstarted on $(date)" >> /etc/issue
%end
%post --erroronfail
echo -n "Setting default runlevel to multiuser text mode"
rm -f /etc/systemd/system/default.target
ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
echo .
echo "Removing linux-firmware package."
dnf -C -y remove linux-firmware
echo "virtual-guest" > /etc/tuned/active_profile
cat > /etc/hosts << EOF
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
EOF
%end
%packages
@core 
chrony
dracut-config-generic
dracut-norescue
firewalld
grub2
kernel
rsync
tar 
httpd
-plymouth
%end

2.重启httpd服务,并开机自启动。
3.关闭防火墙,selinux。

29.2 dhcp设置

【root@servera】
[root@servera ~]# systemctl stop firewalld;setenforce 0

一、dhcp
1 安装
[root@servera ~]# yum install -y dhcp-server
2 建立配置文件
[root@servera ~]# cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
cp: overwrite '/etc/dhcp/dhcpd.conf'? y
[root@servera ~]# vim /etc/dhcp/dhcpd.conf   #man 5 dhcpd.conf   /next-server
3 配置服务
[root@servera ~]# vim /etc/dhcp/dhcpd.conf
allow bootp;
allow booting;
subnet 172.25.250.0 netmask 255.255.255.0 {
  range 172.25.250.100 172.25.250.200;
  option routers 172.25.250.254;
  default-lease-time 600;
  max-lease-time 7200;
  filename "/pxelinux.0";
  next-server 172.25.250.10;
}
4 启动并测试
[root@servera ~]# systemctl enable --now dhcpd

5 测试dhcp功能:设置serverb开机启动为网卡启动,当做客户端,测试能够获取ip即可

29.3 tftp and syslinux

1、安装tftp服务
[root@servera ~]# yum install -y tftp-server tftp
[root@servera ~]# rpm -ql tftp-server

2、安装syslinux-tftpboot该软件后提供了/tftpboot目录其中包含了一些引导文件、内核文件及pxelinux.0文件等,建立pxelinux.cfg目录,准备存放default文件。
[root@servera ~]# yum install -y syslinux-tftpboot.noarch
[root@servera ~]# rpm -ql syslinux-tftpboot
[root@servera ~]# mkdir /tftpboot/pxelinux.cfg/

3、将254.250上的光盘镜像相关文件挂载至本机
[root@servera ~]# mkdir /content
[root@servera ~]# mount 172.25.254.250:/content /content/
[root@servera ~]# df -h
[root@serveran ~]# cp /content/rhel9.0/x86_64/dvd/images/pxeboot/{initrd.img,vmlinuz} /tftpboot/
[root@servera ~]# cp /content/rhel9.0/x86_64/dvd/isolinux/boot.msg /tftpboot/
[root@servera ~]# cp /content/rhel9.0/x86_64/dvd/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default
[root@servera ~]# vim /tftpboot/pxelinux.cfg/default 


4、修改tftp发布目录,并启动服务及测试
[root@servera ~]# vim /usr/lib/systemd/system/tftp.service 

29.4 保证所有服务测试正常

1.dhcpd   分配IP,指导访问tftp
2.tftp    分配启动所需文件及pxelinux安装程序
3.vsftpd  共享光盘镜像
4.httpd   共享ks文件

其实vsftpd和httpd可以二选一,例如只用httpd服务共享光盘镜像、ks文件。

29.5 cockpit安装虚拟机

[root@servera ~]# yum install -y cockpit-machines

以服务的形式启动http,一旦启动就会长期运行,在内存中产生相应的进程systemct start httpd

容器以进程的方式运行http,一旦运行完毕容器就会自动关闭,自动退出,结束运行。当再想运行http的时候需要新开启一个容器

rhel8查看一个文件,
容器

容器:1个应用  -- 好管理    apache   php   mysql +linux= lamp -- 支持php网站
容器:多个应用 -- 不好管理   (apache   php   mysql)

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