RHRE redhat学习笔记,完善中----
- 第一章 Linux系统介绍及安装
- 第二章 Linux的基本使用
- 第三章 运行命令及获取帮助
- 第四章 文件系统组成和基本操作
- 第五章 用户、组及权限管理
- 第六章 标准IO和管道
- 第七章 vim高级文本编辑
- 第八章 文本处理
- 第九章 bash shell
- 第十章 进程管理
- 第十一章 网络配置
- 第十二章 shell脚本实战
- 第十三章 计划任务
- 第十四章 查找和处理文件
- 第十五章 网络客户端
- 第十六章 高级用户组和权限
- 第十七章 深入理解文件系统
- 第十八章 软件包的管理
- 第十九章 服务管理和系统启动流程
- 5 系统启动流程
- 6 系统内核
- 7 系统修复
- 第二十章 系统日志和时间设置
- 第二十一章 内核监控和配置
- 第二十二章 磁盘管理
- 第二十三章 逻辑卷管理
- 第二十四章 stratis和vdo高级存储
- 第二十五章 NFS和自动挂载
- 第二十六章 管理SELiux安全性
- 第二十七章 管理网络安全
- 第二十八章 Podman容器_密码
- 第二十九章 Ansible自动化运维
- 第三十章 考试相关
第一章 Linux系统介绍及安装
1、Linux 介绍
1.1 linux 发展史
上世纪六十年代贝尔实验室(Bell)、麻省理工学院(MIT)以及通用电气(GE)联 合开发裸露信息计算系统 Multics
- 1970 年 Ken Thompson 开发了 Unix
- 项目11974 年贝尔实验室公开 Unix,广泛流行于各大高校
- 1982 年 AT&T 分解后 Unix 开始商业收费
- 1984 年 Richard Stallman 发起 GNU 源代码开发计划并制定了 GPL 许可协议
- 1987 年 GNU 计划获得重大突破——gcc 编译器发布
- 1991 年 10 月,芬兰赫尔辛基大学的在校生 Linus Torvalds 编写出 Linux 内 核雏形,该系统基于 GNU GPL 开源许可协议,迅速得到 GNU 计划支持
- 1994 年 1 月,Bob Young 基于 linux 内核、GNU 工具发布红帽系统
1.2 开源许可证
- GUN GPL(GNU General Public License,GNU 通用公共许可证):只有软件中包 含了遵循 GPL 协议的代码,该软件就必须也遵循 GPL 许可协议且开源;GNU GPL 协议遵循自由、开源的原则。
- 以任何目的运行此程序的自由;
- 再发行复制件的自由;
- 改进此程序,并公开发布改进的自由
-
LGPL(GNU Lesser General Public License),LGPL 是 GPL 的一个为主要为类库 使用设计的开源协议。和 GPL 要求任何使用/修改/衍生之 GPL 类库的的软件必须 采用 GPL 协议不同。LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库 而不需要开源商业软件的代码。
-
BSD(Berkeley Software Distribution,伯克利软件),可以自由的使用,修改 源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD 协议的代码,或则以 BSD 协议代码为基础做二次开发自己的产品时,需要满 足三个条件:
- 如果再发布的产品中包含源代码,则在源代码中须带有原代码中的 BSD 协议
- 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明 中包含原来代码中的 BSD 协议。
- 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
-
Apache Licence 是著名的非盈利开源组织 Apache 采用的协议。该协议和 BSD 类 似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作 为开源或商业软件)。需要满足的条件也和 BSD 类似:
- 需要给代码的用户一份 Apache Licence
- 如果你修改了代码,需要再被修改的文件中说明。
- 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协 议,商标,专利声明和其他原来作者规定需要包含的说明。
- 如果再发布的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有 Apache Licence。你可以在 Notice 中增加自己的许可,但不可以表现为对 Apache Licence 构成更改。
-
MIT 是和 BSD 一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就 是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还 是以源代码发布的。
-
红帽软件发行顺序:
2019年之前:
最先发布 Fedore-----红帽的实验田
第二发布 RHEL------红帽的企业级操系统
最后发布 CentOS Linux----社区的企业级操作系统
2019年之后:
Fedore-----红帽实验田
CentOS Stream----第二次发行
RHEL------最后发行 -
linux运维岗位工作要求
负责服务器的维护,平台和集群的维护
参与新上线系统流程设定、系统需求。
负责所维护系统事件、问题处理、上线变更评审及操作。
根据系统运行情况、编写并根据实际情况进行维护。
1.3 关闭系统命令
- shutdown 安全地关闭计算机,使用权限是 root 用户
-h:关机后关闭电源
-r:关机后打开电源
-t:指定执行命令的时间
-k:发送警告信息给登录者
-F:在重启时强迫 fsck - halt 关闭系统,使用权限是 root 用户
-f:强制关机,不调用 shutdown 命令
-n:防止 sync 调用,关机前不将内存缓冲区数据写入硬盘
-d:关闭系统,不留下记录
-w:不关系统,留下/var/log/wtmp 记录
-i:关机前关闭所有网络接口 - reboot 重启计算机,使用权限是 root 用户
-n:防止 sync 调用,重启前不将内存缓冲区数据写入硬盘
-d:重启系统,不留下记录
-w:不重启系统,留下/var/log/wtmp 记录
-i:重启前关闭所有网络接口
2 系统安装
安装准备:
用VMware 安装redhat
vmware workstation 下载地址:https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html
安装操作系统: 需要有安装介质(ISO镜像文件) RHEL8.4
rhel-8.4-x86_64.iso (官网下载)
获取ISO的方式:
- 访问access.redhat.com 注册账号 (不要随便写 手机号、邮箱、地址)
- 访问https://developers.redhat.com/ 红帽的开发者中心 用你刚刚注册的账号登录一下 开发者中心 是为了激活红帽的开发者订阅 可以激活16个操作系统 可以无限次的下载红帽的ISO
物理机的安装方式: 下载ISO的文件以后,将这个文件刻录到光盘或者是USB设备(U盘),然后将启动设备连接到你的机器,设置物理机通过这个启动介质来启动
2.1 系统分区
/boot 系统引导分区、内核及启动文件,内核100+M 算上升级也就300+M 500M足够
/swap 内存交换分区、物理内存8G以下,建议与物理内存同等大小
/ 根分区
KDMP: 是Linux 内核崩溃的保护机制(类似于飞机上的黑匣子) KDUMP会在内核崩溃之前将内核挂载起来,收集崩溃前的系统运行数据将其保存到文件,通过分析这个文件得出这次故障的原因,KDUMP 运行在独立的内存中
2.2 安装选项
2.2.1 安装模式选项
1、 安装(学习使用建议该选项)
2、 测试安装介质并安装系统(生产环境建议使用该选项,安装前先会先检测iso是否完整(按esc按键可跳出检测),避免安装一半报错而浪费时间)
3、 救援模式
2.2.2 语言选项
安装过程中使用的语言,建议保持默认,中文可能会出现乱码报错而无法排查
2.2.3 安装选项
- Keyboard:键盘布局 建议默认
- Connect to RedHat:连接到红帽,使用开发者账号连接红帽后可订阅激活系统(正版)
- Authentication:连接类型,用户名密码/Key
- Purpose:标记服务器使用类型学
- Insights:连接到红帽先知平台
- installation Destination:硬盘分区,
- Automatic:自动分区
- Custom:手动分区
- Stadard Partition:标准分区(建议选项)
- boot:启动引导分区:内核引导文件 内核大小(1-200M左右)的2-3倍即可
- swap:内存交换分区:1-8g内存的2倍,16-32G建议8g以上即可,64G以上给32G即可
- / 根分区:所有文件的开始,分配所有剩余容量即可
- LVM:逻辑卷分区
- LVM Thin Provisioning 精简逻辑卷
- Language Support:安装后的操作系统语言,建议保持默认,中文可能会出现乱码报错而无法排查
- Installation Source:安装介质,一般保持默认(光盘)
- KDUMP: 内核崩溃日志收集,独立内存运行,类似飞机黑匣子,生产环境建议开启
- Time & Date:时区(默认纽约),建议更改为上海(即中国的时区)
- Software Selection:安装软件选项
- Server with GUI:带图形化的操作系统界面
- Server:服务版
- Minimal Install:最小化安装
- Workstation:工作站
- Custom Operating System:定制化操作系统
- Virtualization Host:虚拟化主机
- Netword & Hose:网络配置及主机名设置
- Secuity Policy:安全规则,选择规则后会按照规则策略自主配置防火墙/Selinux等(ANSSI(法国安全局))
- User settings:设置用户,设置root用户密码或者创建新普通用户
- Make this user administrator:当前用户提升为管理员
- Require a password to use this account :设置密码
- Licensing:许可协议
- System:注册到红帽
第二章 Linux的基本使用
1 系统初始化
语言:保持默认(English)
Typing:保持默认
Privacy:是否开启隐私位置:建议关闭
Online Accounts:绑定社交账号,跳过
Getting Starte:新手教程,Gnome桌面使用说明
2 登录方式
切换控制台:ctrl-alt+Fx(1-6)
切换图形界面:ctrl+alt+[1-2]
切换文本控制台:ctrl+alt+[3-6] 在文本控制执行startx可以切换到图形控制台(而是打开了GNOME的程序)
2.1 图像控制台
X Window System提供图形框架
KDE和GNOME提供桌面环境
gnome-terminal桌面工具
快捷键 | 功能 | 快捷键 | 功能 |
---|---|---|---|
ctrl+shift+t | 创建标签页 | ctrl+PgUp/PgDn | 在标签页之间切换 |
alt+[123…] | 在标签页之间切换 | ctrl+l | 清屏 |
ctrl+shift+c | 复制 | ctrl+shift+v | 粘贴 |
2.2 虚拟控制台(文本界面)
Welcome to Alibaba Cloud Elastic Compute Service !
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Thu May 25 18:29:11 2023 from
[root@ycf02 ~]#
2.3 cockpit控制台登录(web控制台)
CentOS8和redHat8后默认安装了cockpit
开启cockpit网页控制台:systemctl enable --now cockpit.socket
查看IP信息:ifconfig
访问网页控制台:https://ip地址:9090
3 系统激活与取消
1、激活
[root@hostneme ~]#subscription-manager register --username 红帽开发者账号 --password 红帽密码 --auto-attach
2、取消激活
[root@hostneme ~]# subscription-manager unregister
4 命令提示符/操作提示符
[root@hostneme ~]#
root:当前登录的用户
@:分隔符
hostneme :主机名缩写
~:当前目录(~表示用户家目录,),及当在用户的家目录
#:特权提示符,#表示超级用户,$表示普通用户
su - 切换用户 [root@hostneme ~]# su - admin su是仅切换用户,su - 登录到这个用户(完全登录到这个用户)
第三章 运行命令及获取帮助
Linux中存在无数个命令,当我们不知道这个命令有什么功能或者怎么用的时候可以查询帮助文档进行学习,linux中所有的命令语法遵循以下格式:
command options arguments
Command(命令) 某个功能,列如ls命令
Options(选项) 对命令的修饰和功能的补充
- 短格式:例如 ls 中的 -a
-- 长格式:例如 ls 命令中的--all
区别:
通常短格式是长格式的缩写,但并非所有的短格式都有对应的长格式
短格式可以缩写在一起,例如ls -a -s 等同于 ls -al 而 ls --all --szie 长格式不能缩写
Arguments(对象) 想要操作的对象,例如 ls -a /opt命令中的/opt
项与项之间用空格分隔,多个命令用‘;’分隔
[root@hostneme ~]# ls -a;df -h
. btmonitoragent.sh out.txt
.. .cache .pip
backup.tar.bz2 .config .pydistutils.cfg
.bash_history .cshrc .ssh
.bash_logout findfiles .tcshrc
.bash_profile .lesshst .viminfo
.bashrc .mozilla .wget-hsts
Filesystem Size Used Avail Use% Mounted on
devtmpfs 820M 0 820M 0% /dev
tmpfs 838M 200K 838M 1% /dev/shm
tmpfs 838M 476K 838M 1% /run
1 获取帮助
1.1 Whatis command
显示命令的简短描述,注意,新系统需要先执行mandb收集索引信息后才可用
[root@hostneme ~]# mandb
Purging old database entries in /usr/share/man/overrides...
Processing manual pages under /usr/share/man/overrides...
Purging old database entries in /usr/share/man...
Processing manual pages under /usr/share/man...
Purging old database entries in /usr/share/man/overrides.......
.......
[root@hostneme ~]# whatis ls
ls (1) - list directory contents
ls (1p) - list directory contents
1.2 Command –help
passwd [OPTION...] <accountName>
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
命令本身的帮助,通常由编写该命令的作者提供,列出命令常见语法和参数,支持大部分命令,特殊符号解读如下:
- 在[]中的参数是可选的,也可以省略。
- 大写字母必选
- <> 中表示变量的都是必选,但拥有默认值
- … 表示一个列表,(即可以接多个)
- + 表示 固定格式,如果在命令出现了 + ,那后续内容一定有一段解释说明,列如:date +%F
- a|b|c 表示a或b或c
- - abc 表示任意-a,-b或者-c 的任意组合
1.3 man
man:查询轻量级帮助
使用方法:
man [章节] 命令或者配置文件
[root@hostneme ~]# man date
DATE(1) User Commands DATE(1)
NAME
date - print or set the system date and time
SYNOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
DESCRIPTION
Display the current time in the given FORMAT, or set the system date.
Mandatory arguments to long options are mandatory for short options too.
-d, --date=STRING
display time described by STRING, not 'now'
--debug
annotate the parsed date, and warn about questionable usage to stderr
-f, --file=DATEFILE
like --date; once for each line of DATEFILE
-I[FMT], --iso-8601[=FMT]
output date/time in ISO 8601 format. FMT='date' for date only (the default),
'hours', 'minutes', 'seconds', or 'ns' for date and time to the indicated preci‐
sion. Example: 2006-08-14T02:34:56-06:00
···········
man -k 关键字 查询所有包含关键字的章节
[root@ycf01 ~]# man -k pass
jose-jwe-enc (1) - Encrypts plaintext using one or more JWK/password
chage (1) - change user password expiry information
chgpasswd (8) - update group passwords in batch mode
chpasswd (8) - update passwords in batch mode
clevis-luks-pass (1) - Extracts the passphrase used for binding a particular ...
cracklib-check (8) - Check passwords using libcrack2
create-cracklib-dict (8) - Check passwords using libcrack2
crypt (5) - storage format for hashed passphrases and available ha...
endpwent (3) - get password file entry
endspent (3) - get shadow password file entry
tpm2_policypassword (1) - Enables binding a policy to the authorization value...
fgetpwent (3) - get password file entry
fgetpwent_r (3) - get passwd file entry reentrantly
fgetspent (3) - get shadow password file entry
fgetspent_r (3) - get shadow password file en
手册结构
- 结构名称 描述
- name 名称及简要说明
- synopsys 格式使用方法说明
- description 详细说明
- options 可用选项及其介绍说明
- examples 示例,附带简单说明
- files 相关文件
- environment 环境变量
- seealso 其他帮助参考
- 产品文档位置:/usr/share/man/
章节 翻译 是否常用
1、user commands 用户命令:可执行的程式或是shell 指令 是
2、system calls 系统调用:核心所提供的函数
3、library functions 一般函数以及库
4、special files 系统设备。
5、fuke firmats 文件格式:档案格式与协定,如 /etc/passwd 是
6、games 游戏
7、conventions 各种软件包、杂项
8、maintenance commands 系统管理员命令:通常是管理者 root 专用的 是
9、linux kernel api 内核帮助信息
基本操作
操作 结果
- 空格键 向下翻页
- PagueUP/PagyeDown 向上/向下翻页
- 向上向下箭头/回车键 向下滚动
- g/G 回到开头/末尾
- /string 搜索string关键字
- n/N 在关键字之间向下向上查找
- q 退出帮助手册
1.4 pinfo/info
查询重量级帮助,使用方式类似man
操作 结果
- PagueUP/b 向上滚动一个屏幕
- PagyeDown/空格 向下滚动一个屏幕
- d 显示主题目录
- u 显示主题的父节点
- 向上向下箭头 向上向下滚动到下一个超链接
- enter 打开光标处的主题
- q 退出帮助手册
1.5 /usr/share/doc
安装软件包后在本地目录查找帮助文档
/usr/share/doc/[pachagename]
1.6 红帽官方产品文档
查询红帽解决方案知识库:/https://access.redhat.com
2 常见命令
2.1 cal 显示日历
2.2 passwd 修改密码
root密码执行passwd可以修改任意用户密码,不需要验证原来的密码且不受密码规约限制。普通用户只能修改自己的密码,需要验证旧密码且受密码规约限制
#passwd 修改当前用户密码
#passwd student 修改student的密码
#echo 12345|passwd --stdin bobo 明文修改bobo的密码为12345
2.3 id 查看用户信息
查看用户信息:id username
[root@ycf01 ~]# id root
uid=0(root) gid=0(root) groups=0(root)
2.4 su切换用户
su 仅切换到用户本身,无法获取到用户变量
su – 登录到这个用户,可以获取到用户变量
2.5 vim 文本编辑
语法:vim fileName
- 按【i】进入编辑模式,然后可以输入编辑文字
- 按【esc】退出编辑模式
- 按【:】进入末行模式
- 输入【wq】回车保存并退出(如果文件不存在会自动创建),【q!】不保存并强制退出
更多详情见【vim高级文本编辑器】
2.6 History 查看所有历史记录
- !n调用第n条历史记录
- !string调用最近一条以string开头的命令
- !$ 调用最后一条命令的参数
- ctrl+r 搜索历史记录
- alt+. 调用上一条命令的最后一个参数
- history -c 清除内存中的历史记录
2.7 Hostnamectl 修改主机名
hostnamectl set-hostname newname
2.8 tail 默认显示文件后 10 行
-n 指定显示文件后 n 行
-c 指定显示文件后 n 个字节
-q 隐藏文件名
-v 显示文件名
-f 循环读取,常用来查看动态日志 tail -50f filename 动态刷新显示文件最后50行
-n 3 显示文件后 3 行 tail -n -3 显示文件后 3 行
-n +3 显示文件除去前 3 行的所有内容
2.9 date
date +%s 1970-01-01 00:00:00到当前时间的秒速
2.10 bc
调用计算器
第四章 文件系统组成和基本操作
1 文件及目录权限
-rw-r–r–. 1 root root 29 Oct 31 17:55 ts.t
drwxr-xr-x. 4 root root 128 Feb 13 20:33 /opt
当系统中的进程去访问文件时会继承用户的UID和GID
如果用户的UID匹配了文件的UID则 适配UID权限
如果用户的GID匹配了文件的GID 则 适配GID权限
如果用户的UID和GID都不能匹配文件的UID和GID则适用其他人的权限
root用户可以修改所有人的文件,但是普通用户只能修改自己的文件(无视权限)
因此我们通常将文件得UID称为文件的拥有人 文件的GID称为文件的拥有组
-:文件类型,-表示普通文件,d表示目录,|表示连接文件
rw-:拥有人的权限
r--:拥有组的权限
r--:其他人拥有的权限
.:Selinux标签。.表示该文件/目录受到Selinux保护
1:表示文件的硬链接数
root:拥有人
root:拥有组
29:文件大小
Oct 31 17:55:文件最后一次被修改的时间戳
ts.t:文件名
2 创建/删除 文件/目录
mkdir 创目录:-p 递归创建目录(上级目录不存在会先创建上级目录)
[root@ycf02 ~]# mkdir -p /tmp/dir
touch filename 创建文件:当文件不存在时创建,存在时刷新文件时间挫
stat filename 查看文件时间挫
[root@ycf02 ~]# stat Desktop
File: Desktop
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fd03h/64771d Inode: 20239092 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-06-02 03:00:03.468115956 -0400
Modify: 2023-06-02 02:59:44.891116854 -0400
Change: 2023-06-02 02:59:44.891116854 -0400
Birth: -
rmdir 可以删除空目录,非空目录不会被删除(安全的删除目录)
rm 删除文件及目录
rm [options] <file>….
示例
[root@ycf02 ~]#rm -I file (交互模式)
[root@ycf02 ~]#rm -r dir (递归删除目录及目录内文件)
[root@ycf02 ~]#rm -f file (强制删除,不提示)
[root@ycf02 ~]# rm -rf /tmp/* #强制递归删除/tmp的所有文件和目录
3 目录
3.1 文件目录树
单根倒树形结构(有且只有一个根目录[/])
常见目录
目录 | 说明 |
---|---|
/ | 根目录 |
/root | 超级用户家目录 |
/home/username | 普通用户家目录 |
/usr | 安装的软件,共享库等目录重要的子目录 |
/usr/bin | 用户命令 普通用户可以执行的命令 |
/usr/sbin | 系统管理员命令 |
/usr/local | 本地自定义软件安装目录 |
/etc | 系统配置文件 |
/avr | 系统服务的数据文件,例如数据库文件,日志文件及网站内容等 |
/tmp | 系统临时文件 |
/boot | 系统启动所需文件,内核文件(建议:不要放任何文件) |
/dev | 设备文件,包含系统的硬件设备,(cpu、内存、键盘、硬盘等等)以文件的形式供内核调用 |
/proc和/sys | 易失性存储:系统当前运行状态,当前文件夹关机重启后会被清空,存放进程的目录,(请勿存放重要文件 |
说明:在Linux7或者更高版本中/bin和/usr/bin,/sbin和/usr/sbin,/lib和/usr/lib,lib64和/usr/lib64,中的目录是usr中对应的目录软连接
3.2 列出目录内容
Linux中文件和目录大小写敏感
文件名最长255字符
所有字符要求是有效的,但”/”除外
- 不要使用某些特殊符号在文件或者目录中
- 但文件名中存在特殊符号时要用单引号保护起来
ls [options] [files or dirs]
-a 包含隐藏文件
-l 显示详细信息
-R 递归所有目录
-ld 显示目录和符号链接信息
3.3 改变目录
文件的路径:
相对路径:
相对路径就是不以根开头的路径
相对路径是以当前目录作为基础路径
相对路径可以引用到文件,但是仅限在指定的位置使用
绝对路径:
绝对路径是以根开头的路径
绝对路径是文件的全路径
绝对路径在任意的位置都可以使用
pwd:显示当前目录
cd 绝对路径/相对路径:切换到对应位置
cd .. :切换到当前目录的上一级目录
cd - :回到上一个工作目录
cd ~ :回到当前用户家目录
cd ~student:回到student家目录
4 文件
4.1 文件类型查看
在windows中通过文件后缀名来识别文件类型,例如.mp3 音乐,.txt文本
Linux中文件后缀名没有意义,仅仅是文件名的一部分供人参考,实则用file命令查看文件类型
file filename
[root@ycf01 opt]# file passwd2
passwd2: ASCII tex
4.2 文件时间戳查看及更改
[root@ycf01 opt]# stat ts.t
File: ts.t
Size: 29 Blocks: 8 IO Block: 4096 regular file
Device: 10303h/66307d Inode: 26446815 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:usr_t:s0
Access: 2023-02-13 20:33:23.422223015 +0800
Modify: 2022-10-31 17:55:21.356281774 +0800
Change: 2022-10-31 17:55:21.357281761 +0800
Birth: -
access:文件最后一次被访问的时间
modify:文件最后一次被修改的时间(修改指的是内容改变)
chage:文件最后一次被改变(属性(权限/大小/位置/时间戳))的时间
birth:文件创建时间,8.6后增加内容
修改
-a: 更新访问时间 access
-m: 更新修改时间 modify
d: 指定更新时间的格式 touch -md ‘2022-10-22 10:12:14’ file
5 拷贝文件或目录
cp [option] file destination
如果目标是一个目录,这可以一次拷贝多个文件到这个目录,
例如cp option] file1 file2 destination
如果目标是一个文件,改拷贝覆盖目标文件
-a 复制文件或目录的内容、权限、属性信息
-p 复制文件或目录的内容、权限信息
-r 递归拷贝,复制目录下所有子目录及文件
-f 如果有已存在的目标文件且无法打开,则将其删除并重试
-i 覆盖前询问
-v 显示过程
6 移动或重命名文件
mv [option] file destination
如果目标是一个目录,这可以一次拷贝多个文件到这个目录,
例如mv [option] file1 file2 destination
如果目标是一个文件,改拷贝覆盖目标文件
如果目标与源文件在同一目录,则重命名
-f 强制覆盖
-b 覆盖前备份
-u 覆盖前先比较文件新旧,源文件新则覆盖
-i 覆盖前询问
-v 显示过程
7 打包/压缩
主流压缩工具bzip2、gzip、xz压缩的格式
压缩文件 解压命令
bzip2 file bunzip2 file
gzip file gunzip file
xz file unxz file 消耗时间更长,压缩效果更好
7.1 tar
tar 先打包后压缩,打包也叫归档
打包 tar -cf 生成的包存放目录及文件名 需要打包的路径
拆包 tar -xf 需要拆包的文件
-c 打包
-x 解压
-v 显示过程
-C 拆包到指定目录
-tf 浏览包内容
-z 使用gzip压缩
-j 使用bzip2压缩
-J 使用xz压缩
8 文件系统访问
在linux中访问文件系统都需要挂载才可以访问,
df -h查看磁盘挂载点
[root@hostneme ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 820M 0 820M 0% /dev
tmpfs 838M 204K 838M 1% /dev/shm
tmpfs 838M 476K 838M 1% /run
tmpfs 838M 0 838M 0% /sys/fs/cgroup
/dev/vda3 40G 4.5G 36G 12% /
/dev/vda2 100M 7.3M 93M 8% /boot/efi
tmpfs 168M 0 168M 0% /run/user/0
8.1 mount:挂在工具
示例:mount /dev/sr0 /mnt/cdrom/
8.2 umount:卸载工具
示例:umount /dev/sr0 或者umount /mnt/cdrom
/etc/fstab:开机挂在路径文件
[root@hostneme ~]#vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Apr 18 05:41:00 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
UUID=7d4c4a4b-ccfb-4dd1-bbc7-bbe7e2ebf41c / xfs defaults 0 0
/dev/sr0 /mnt/cdrom iso9960 defaults 0 0
[root@hostneme ~]#mount -a
第五章 用户、组及权限管理
1 用户
任何用户被分配一个独特的用户id号(UID)
UID为0的用户为root用户
系统用户与普通用户的区分,系统用户uid<1000 <普通用户(红帽6是500开始)
用户账号通常从UID1000开始
用户名和UID信息通常存储在/etc/passwd文件中
当用户登录时它被分配一个主目录并运行一个程序(通常是一个shell程序)
没有权限许可用户不能读取、写入或者执行其它用户的文件
1.1 用户账号文件 /etc/passwd
每个用户独立一行,即有多少行就有多少个用户
字段1:用户名称
字段2:密码占位符“x”
字段3:用户的UID号
字段4:用户的私有组
字段5:用户的描述信息
字段6:用户的主目录(用户家目录)
字段7:登录Shell信息(/sbin/nogoin表示不能登录)
1.2 密码文件 /etc/shadow
1.2.1 文件解析
用于保存用户密码信息,可以使用chage命令进行维护
root:$6$LoeGCYVJYQyodlQd$JTwWTG7cbZ1y14KTai20Et/3TemClATkl.8gGDjVw5eEZt8sO.jkZOkp21uPfFnqXv.95X9GhIGsv.SEybfx11::0:99999:7:::
bin:*:18367:0:99999:7:::
daemon:*:18367:0:99999:7:::
adm:*:18367:0:99999:7:::
lp:*:18367:0:99999:7:::
sync:*:18367:0:99999:7:::
shutdown:*:18367:0:99999:7:::
halt:*:18367:0:99999:7:::
mail:*:18367:0:99999:7:::
operator:*:18367:0:99999:7:::
games:*:18367:0:99999:7:::
ftp:*:18367:0:99999:7:::
nobody:*:18367:0:99999:7:::
dbus:!!:19471::::::
systemd-coredump:!!:19471::::::
systemd-resolve:!!:19471::::::
tss:!!:19471::::::
polkitd:!!:19471::::::
geoclue:!!:19471::::::
rtkit:!!:19471::::::
① 用户名
② 加密的密码,如果是!!/*/?表示没有设置过密码,
6
6
6:两个$符号之间的符号表示加密规则,机体查看openssl passwd –help 【openssl passwd -6 redhat 表示使用openssl passwd中的6类型加密 redhat字符串】
锁定密码原理:在密码加密规则前加!,使密码验证失败,
解锁用户原理:删除添加的感叹号
因此,锁定用户只能适用需要验证密码的场景
③ 最近一次修改密码的时间 从1970-01-01到改密码那天的天数
④ 密码最短适用天数 0表示无限制
⑤ 密码最大有效期,
⑥ 密码到期前的警告天数
⑦ 密码到期后账号保持活跃的天数,即过期后这几天内可以登录且强制修改密码,否则锁定
⑧ 账号/密码失效时间 从1970-01-01到失效那天的天数
⑨ 保留位置 未使用
1.2.2 配置密码期限:chage
语法:chage [选项] 用户
#chage -m 0 -M 90 -w7 -l14 user3 分别修改用户密码的最短期限,最长期限,警告周期和失效期限
#chage -d 0 user3强制要求用户在下一此登录时更新密码
#chage -l user3 显示用户密码的信息
#chage -E 2030-10-10 user3 用户将于2023-10-10到期(YYYY-MM-DD格式)
vim /etc/login.defs 修改用户密码默认策略文件
1.3 创建用户 useradd
useradd 创建用户会使用/etc/passwd中当前最大的uid,中途缺少的id或已删除的用户占用的id一定不会被分配给新用户,否则会出现新用户能访问之前id用户权限的文件
创建用户会自动到/etc/skel目录下复制用户默认文件到新用户的家目录中
语法:usage: useradd [options] LOGIN
useradd -D
useradd -D [options]
常见选项:
-p 指定加密后的密码(openss passwd -6 123123)
-u 指定 uid
-g 指定 gid
-c 指定描述信息
-d 指定家目录,如果不存在会自动创建
-s 指定登录shell /sbin/nologin:不能登录
-o 允许复用 uid
-e 修改账户过期日期
-f 设置宽限时间
-G 指定附加组
-m 创建家目录
-M 不创建家目录
-N 不创建同名的组
-D 显示/etc/default/useradd 信息
示例:
创建user6用户,指定的同时指定uid和主组,指定多个附加组并指定描述信息
#useradd -u 1017 -g user2 -G user,user2 -c mysql user6
创建user7用户并指定家目录
#useradd -d /user7 user7
通过指定登录shell来创建一个不能登录操作系统的用户
#useradd -s /sbin/nologin user8
1.4 修改用户信息 usermod
语法:usermod [option] username
常见选项:
-p 修改加密后的密码(openss passwd -6 123123)
-u 修改 uid
-g 修改 gid
-c 修改描述信息(登录时所显示的名称)
-d 修改家目录
-s 修改 shell
-o 允许复用 uid
-e 修改账户过期日期
-f 修改宽限时间
-G 修改附加组(带-a 追加添加至新组,不删除之前所在附加组)
-m 移动家目录(常与-d 一起使用)
-l 修改登录名
-L 锁定用户账号(可使用 passwd -U 解锁)
-U 解锁用户账号
示例:
移动user5的家目录到/opt/user5目录,该命令不会报错,但实际上会造成user5无家可归的情况(修改了家目录的配置,但实际上这个目录没有被创建),所以一般【d修改】会搭配【m移动】搭配使用
#usermod -d -m /opt/user5 user5
给用户追加附加组,将user5添加一个叫database的附加组
#usermod -aG database user5
1.5 配置密码期限:chage
语法:chage [option] username
常见选项:
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
示例:
#chage -l student 查看student用户密码信息
#chage -m 0 -M 90 -w 7 -I 7 student 分别设置student用户密码最短、最长、警告和失效时间
#chage -d 0 student 强制用户下一次登录时更新密码
#chage -E 2022-12-12 student 设置用户到期日期
1.6 删除用户 userdel
语法:userdel [options] LOGIN
常见选项:
-f 强制删除在线用户
-r 删除家目录与邮件目录/var/spool/mail/username
示例:
#userdel -r user5 删除user5并删除其邮件目录及家目录
1.7 修改用户密码 passwd
语法:passwd [OPTION...] <accountName>
常见选项:
root用户无视密码规则,修改其他用户密码不用验证密码
普通用户严格收到系统密码规则制约,只能修改自己的密码且需要验证原密码
-l 锁定用户密码
-u 解锁用户密码
-d 删除用户密码
-e 终止用户密码(修改密码后可登录)
-n 修改密码最短有效时间
-x 修改密码最长有效时间
-w 修改密码警告时间
-i 修改密码宽限时间
示例:
#passwd 修改当前用户密码
#passwd student 修改student的密码
#echo 12345|passwd --stdin bobo 明文修改bobo的密码为12345
2 用户组
用户组也可以登录系统,意义在于可以临时访问组内用户文件
2.1 用户组文件 /etc/group
每创建一个用户就会创建一个与之同名的组并将当前创建的用户加入组
用户组有两个属性:
- 私有组(属组)
- 附加组(公共组 )
2.2 创建组 groupadd
语法:groupadd [options] GROUP
常见选项:
-g 指定组id 该id必须唯一
-o 表示可以与gid共用 一般与-g一同使用
-r 创建系统工作组
示例:
# groupadd -g 10002 test 创建一个test组,并指定组id为10002
2.3 修改组信息 groupmod
语法:groupmod [options] GROUP
常见选项:
-g 修改组id
-n 修改组名称
示例:
#groupmod -g 10003 -n tests test 修改test组的组id和组名
2.4 管理组成员 groupmems
语法:groupmems [options] [action]
常见选项
-g 指定组
-a添加用户为组成员
-d 从组成员中删除
-l 列出组成员
-p 清空组(清除组内所有成员)
示例
#groupmems -g database -l 查看database组内成员
# groupmems -g database -a user6 将user6加入到database组
# groupmems -g database -p 清空database组内所有成员
2.5 删除组 groupdel
语法:groupdel [options] GROUP
常见选项:
-f 强制删除
示例:
#groupdel database
2.6 修改组密码 gpasswd
语法:gpasswd [option] GROUP
参数:
-a:添加用户到组;
-d:从组删除用户;
-A:指定管理员;
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
示例:
#gpasswd test 设置test组的密码
#gpasswd -a user5 database 将用户user5添加到database组
2.7 登录到组 newgrp
语法:newgrp [-] [group]
示例:
#newgrp test登录到组
3 权限管理
3.1 Linux文件安全
每一个文件都有一个uid(拥有人id)和gid(拥有组id)
任何进程运行时都带一个uid和一到多个gid标识(通常取决于用哪个用户来执行)
通常决定于哪一个用户执行这个进程
三种访问类型:
文件拥有者运行的进程,跟文件有着同样的uid
文件拥有组运行的进程,跟文件有着同样的gid
其他用户云的进程,与文件的uid和gid都不通,其他进程(other)
3.2 权限优先级
1. 如果文件的UID与当前用户UID匹配,则以用当前户权限[u]访问
2. 如果文件的GID与当前用户GID匹配,则以组权限[g]访问
3. 如果都不匹配,则以其他[o]权限访问
3.3 文件系统权限
文件权限样例如下,在系统中通过ls -l命令查看文件详细列表,通过ls -ld查看目录详细信息如下
#ls -l
#ls -ld
-rw-r–r–. 1 root root 29 Oct 31 17:55 ts.t
drwxr-xr-x. 4 root root 128 Feb 13 20:33 /opt
权限分配 | 文件所属人 | 文件所属组用户 | 其他用户 |
---|---|---|---|
字符表示 | r w x | r w x | r w x |
权限项 | 读写执行 | 读写执行 | 读写执行 |
数字表示 | 421 | 421 | 421 |
列表信息详解
文件项示例 目录项示例 解释
- d 文件类型,-:普通文件,d:目录,l:连接文件,
c:块设备,b:字符设备
rw- rwx 拥有人的权限
r-- r-x 拥有组的权限
r-- r-x 其他人拥有的权限
. . Selinux标签,表示该文件或目录受Selinux保护
1 4 文件硬连接数
root root 文件/目录的拥有人
root root 文件/目录的的属组
29 128 文件大小
Oct 31 17:55 Feb 13 20:33 最后修改时间
ts.t opt 文件名
权限解读
权限分配 文件所有人(uid) 文件所属组用户(gid) 其他用户(other)
权限项 r w x r w x r w x
字符表示 读 写 执行 读 写 执行 读 写 执行
数字表示 4 2 1 4 2 1 4 2 1
权限影响
权限 对文件影响 对目录影响
r(4)(读) 可以读取文件内容 可以列出文件内容(文件夹内的文件列表)
w(2)(写) 可以更改文件内容 可以
x(1)(执行) 可以作为命令执行文件 仅可以进入目录,但需要r权限才能读取内容
3.4 权限修改 chmod
用来变更文件或目录的权限
语法:chmod [OPTION]… MODE[,MODE]… FILE…
chmod [OPTION]… OCTAL-MODE FILE…
chmod [OPTION]… --reference=RFILE FILE…
常见选项:
-R 递归处理,将指定目录下的所有文件及子目录一并处理
示例:
#chmod u+x test.txt 针对属主(u),增加(+)对该文件的执行权限
# chmod g-r,o-r test.txt 针对数组及其他用户(o),删除(-)对该文件的读权限
#chmod a+x test.txt 针对所有用户(a),增加对该文件的执行权限
#chmod u=rwx test.txt 针对属主,精确赋权(=)对该文件赋予读写执行权限
#chmod 755 test.txt针对所有用户进行赋权,等同chmod u=rwx,g=rx,o=rx test.txt
#chmod -R 755 /opt针对所有用户对/opt目录进行递归(包括子目录及文件)授权为755
3.5 属主/属组修改chown
用来变更文件或目录的拥有者或所属群组
语法:chown [OPTION]… [OWNER][:[GROUP]] FILE…
常见选项:
-R 递归处理,将指定目录下的所有文件及子目录一并处理;
示例:
#chown user1 test.txt 修改test.txt文件的属主为user1用户
#chown :database test.txt 修改test.txt文件的属组为database组
#chown user1:database test.txt 修改test.txt文件的属主为user1,属组为database组
#chown -R user1:database /opt 递归修改/opt目录的属主为user1,属组为database组
3.6 属组修改 chgrp
用来变更文件或目录的所属群组
语法:chgrp [OPTION]… GROUP FILE…
chgrp [OPTION]… --reference=RFILE FILE…
常见选项:
-R 递归处理,将指定目录下的所有文件及子目录一并处理;
示例:
#chgrp database test.txt 修改test.txt文件的属组为database,等同chown :database test.txt
#chgrp -R database /opt 递归修改/opt目录的属组为database,等同chown -R :database /opt
第六章 标准IO和管道
IO和管道:
IO:input 和outuput 输入和输出
标准输入:键盘(在linux中所有从键盘输入的都是标准输入)
标准输出:显示器——————>标准输出设备
1 标准输入和输出
进程IO通道
系统内编号 通过名称 描述 默认设备 用法
0 stdin 标准输入 键盘 只读
1 stdout 标准输出 显示器 只写
2 stderr 标准错误输出 显示器 只写
3+ filename 其他文件 无 读或写
2 管道符
-
管道符号“|”能连接命令,顾名思义,其作用就像管道一样,能连接前后,即如下图所示,将命令1的标准输出作为命令2的标准输入而不显示到当前终端
command1 | command2 -
错误输出不能通过管道传输,但可以通过将错误输出当成正确输出(2>&1)进行处理
示例:
ps -ef | grep java 打印所有进程,然后在此基础上查询java的进程
echo redhat | passwd --stdin root 使用管道明文修改密码
find /etc -name passwd 2>&1 |wc -l 将错误输出当真正常输出,然后统计行数
- “|tee” 三通管道(正确输出才能通过三通管道)
如下图所示,三通管道是在普通管道上的加强,在不影响正常执行的情况下另外将内容输出到文件或显示器,常用于故障诊断
[root@ycf02 ~]# id user1 |tee /tmp/1.txt
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@ycf02 ~]# vim /tmp/1.txt
[root@ycf02 ~]# cat /tmp/1.txt
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@ycf02 ~]#
3 重定向
3.1 输出重定向操作符
> file:将标准输出(stdout)重定向覆盖到file文件
>> file:将标准输出(stdout)重定向追加到file文件
2> file:将错误输出(stderr)重定向覆盖到file文件
2>> file:将错误输出(stderr)重定向追加到file文件
&> file:将stdout和stderr重定向覆盖到file文件,等同> file 2 >&1 (全部输入重定向覆盖)
&>> file:将stdout和stderr重定向追加到file文件,等同>> file 2 >&1(全部输入重定向追加)
示例:若使用普通用户执行find /etc -name passwd命令会产生输出和报错(权限不足),
$find /etc -name passwd >find.out 将命令执行的标准输出重定向到find.out文件
$find /etc -name passwd 2> /dev/null 将命令执行的报错信息重定向到黑洞
$find /etc -name passwd >find.out 2>find.err 将命令执行的标准输出到find.out 错误输出到find.err
解释:
2>&1 并不是将错误输出到正确输出,而是将错误输出当成正确输出
/dev/null:空设备(系统:/垃圾桶) 所有指向这里的东西都将被销毁/丢弃
3.2 输入重定向
- <:从文件重定向输入
示例:
#tr ‘A-Z’ ‘a-z’ < /etc/bashrc 将文件/etc/bashrc的内容输入给tr ‘A-Z’ ‘a-z’命令,等效于
#cat /etc/bashrc | tr ‘A-Z’ ‘a-z’ - <<EOF:从键盘重定向多行输入(EOF关键字可随意指定为其他关键字,但首尾需一致)
示例:将多行输入到.bashrc文件中
[root@ycf02 ~]# cat >> /tmp/1.txt <<EOF
> 123
> hello
> chongqing
> EOF
[root@ycf02 ~]# cat /tmp/1.txt
uid=1001(user1) gid=1001(user1) groups=1001(user1)
123
hello
chongqing
也可以用于输入修改密码
第七章 vim高级文本编辑
语法:vim filename
如果文件存在则打开并显示内容,文件不存在这再编辑保存后创建当前文件
vim三中工作模式
命令模式:用于文件导航、剪切粘贴和简单命令
插入模式:用于正常文本编辑修改
退出模式:用于保存、退出、打开新文件、搜索和替换以及其他复杂操作...
系统最小化安装是不安装的vim
命令安装:yum install vim-enhanced
vim的版本:图形化(gvim)
1命令模式-
1.1 移动光标
操作类型 | 操作键 | 功能 |
---|---|---|
移动光标 | ↑↓←→ | 向上下左右方向移动光标 |
翻页 | PageUP或者Ctrl+B | 向上翻页 |
翻页 | PageDown或者Ctrl+F,PageDown或者Ctrl+F | 向下翻页,向下翻页 |
行内跳转 | Home或者“^”或者数字“0” | 跳转到行首 |
行内跳转 | End或者“$” | 跳转到文件行尾 |
行间跳转 | 1G或者gg | 跳转到文件首行 |
行间跳转 | G | 跳转到文件末尾 |
行间跳转 | #G | 跳转到第#行 |
行号显示 :set nu 显示行号
:set nonu 取消显示行号
1.2 复制剪切和粘贴
操作类型 操作键 功能
删除 del或者x 删除贯标处的单个字符
dd 剪切当前光标所在行(不粘贴则为删除)
Ndd 剪切光标所在行以及之后的N-1行,例如:5dd 删除光标所在行以及后面4行
cc 替换该行,并进入插入模式,即清空当前行内容并进入插入模式
d^ 删除当前行中光标之前的内容
d$ 删除当前行中光标行尾的内容
dw 针对单词,删除光标位置到词尾的内容,
复制 yy 复制光标所在的行
数字+yy 复制多行
m,n copy dest 复制指定行到指定位置 3,5 copy 11:复制3-5行并粘贴到11行之后
粘贴 p 粘贴缓冲区(剪切板)的内容到光标位置的下一行
数字+p 粘贴多行
P(大写) 粘贴缓冲区(剪切板)的内容到光标位置的前一行
1.3 文件内容查找
操作键 功能
/string 从上往下在文件中查找string字符串
?string 从下往上在文件中查找string字符串
n 定位下一个匹配到的位置
N 定位到上一个匹配到的位置
1.4 撤销
操作键 功能
u 撤销最近一次操作,类似word里面的ctrl+z
U 撤销光标所在行的更改
Ctrl+r 撤销上一次撤销
. 重复上一次操作
2 其他命令
2.1:nohlsearch 取消查找高亮
插入模式/编辑模式
编辑文件
操作键 功能
i 在光标左边插入
a 在光标右边插入
o 在光标下一行插入新行
O 在光标上一行插入新行(大写)
I 在首行参入文本(大写)
A 在一行的结尾处添加文本(大写)
2.2 退出模式/末行模式
按ESC键
2.3 保存退出
操作类型 命令 功能
保存文件 :w 保存当前文件
:w /root/newfile 另存为其他文件
:m,nw file :3,11w file:将3-11行另存为file
不保存退出 :q 退出且不保存
:q! 强制退出且不保存
保存并退出 :wq 保存并退出
:wq! 强制保存并退出
2.4 查找替换
3 可视化模式
可视化模式允许选择文本块
- v 开始字符高亮选定
- V 开始行高亮选定
- ctrl+v 列方向高亮选定
高亮显示的文本能被删除d、拷贝y、替换c、搜索替换s/old/new等
4 多行注释
- ctrl+v进入列编辑模式
- 方向键移动光标吧需要注释的开投行标记起来
- 然后按大写的I(行首插入模式)
- 输入注释符号“#”
- 再按esc就会将标记的列全部注释了
5 多窗口模式
- 在单个VIM屏幕中多个文档能被查看
- ctrl+w在按s 横线分隔屏幕
- ctr+w再按v 纵向分隔屏幕
- ctrl+w再按方向键 在窗口中切换
- 退出模式的指令只影响当前(光标所在)窗口
- :sp file在同一个窗口打开其他文件
- :help windows 显示更多窗口
第八章 文本处理
1 正则表达式
1.1 基本正则表达式
基本正则表达式(BasicRegularExpression BRE),又称为标准正则表达式,是最早死定的仅支持最基本的元字符集,基基本正则表达式是POSIX规范制定的两种正则表达式语法标准之一
1.2 扩展正则表达式
扩展正则表达式(ExtendedReqularExpression),支持比基本正则表达式更多的元字符,但是扩展正则表达式对有些基本正则表达式的元字符并不支持
egrep 支持扩展正则表达式,相当于grep -E
2 文本处理工具
- 文件内容查看:cat、more、less
- 文件摘选:head和tail
- 按关键字提取:grep
- 提取列或者字段:cut
2.1 内容查看cat、more、less
2.1.1 cat
功能
- 打印一个或多个文件到标准输出
- 合并多个文件 cat a.file b.file >new.file
-A 显示所有字符
-n 显示行号
缺点:会显示所有内容,
- 针对大文件会占据很长的打开时间
- 内容多的文件一个屏幕放不下,于是需使用more
2.1.2 more
分页查看文件内容,每次只看一页
2.1.3 less
浏览文件内容 每次只看一页
- 在查看时常用如下命令
- /text 搜索text
- n/N 跳转到 next/previous匹配的地方
- -v 用文本编辑器打开该文件
- man命令中是采用less来分页的
head tail文本摘选
提取文件的指定行,通用公式 head -n 取最大行|tail -n 最大值-最小值+1
例如提取a.txt的第15-20行:head -n 20 a.txt|tail -n 20-15+1
2.1.4 head显示文件前10行
-n 15显示前15行
-n -15去掉文件后15行
2.1.5 tail显示文件末尾10行
-n 15显示文件的最后15行
-n +15去掉文件起始的15行
-f 查看文件实时发生的改变(常用于监控打印日志)
2.2 grep 文本过滤
2.2.1 grep
打印匹配的文件行或者标准输入
$ grep ‘string’ file
-i 忽略关键字大小写
-o 只显示匹配内容
-n 显示文件行号
-c 如果匹配成功,显示匹配行行号
-v 取反,排除匹配行
-q 静默模式,不输出任何信息,靠$? 进行验证$?=0表示有匹配项,非0表示无匹配项目
-r 递归搜索目录,根据文本内容搜索文件
-l 与r联合使用,只显示文件名
-E、 --扩展正则表达式PATTERN是一个扩展正则表达式
-F、 --固定字符串PATTERN是一组换行的字符串
-G、 --basic regexp PATTERN是一个基本的正则表达式(默认值)
-P、 --perl regexp PATTERN是一个perl正则表达式
-e、 --regexp=PATTERN使用PATTERN进行匹配
-f、 --file=file从file获取图案
-B, --before-context=NUM print NUM lines of leading(最前的) context
-B2 显示匹配行以及前2行
[root@ycf02 opt]# grep '\<ftp\>' /opt/passwd2 -B2
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
-A, --after-context=NUM print NUM lines of trailing(后面的) context
-A2 显示匹配行以及后2行
[root@ycf02 opt]# grep '\<ftp\>' /opt/passwd2 -A2
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
-C2 显示匹配行以及前后2行
[root@ycf02 opt]# grep '\<ftp\>' /opt/passwd2 -C2
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
grep结合正则表达式:元字符
grep ^u /etc/passwd ;^ 以某某开头的行
grep bash$ /etc/passwd ;$以某某结尾
grep '\<root' /etc/passwd 在字(单词)开头匹配查找
grep 'root\>' /etc/passwd 在字(单词)结尾匹配查找
单词: 是由字母、数字、下划线组成,(不是英文单词)
\<单词\> 匹配一个完整的单词
. 表示匹配任意的单个字符
[abc] 表示匹配括号内的单个字符
[^abc] 表示除了括号内都需要(取反)
[a-z] 匹配括号范围内的单个字符
[a-Z] 匹配大写和小写字母(可以是任意的一位字母)
\ 去掉斜杠后单个字符的特殊意义,例如:.只表示小数点,还原原始的小数点的意义。
* 对前一项进行零次或者多次重复匹配
^$表示空行,不是空格
.*匹配所有字符。^.*任意多个字符开头
\<或\b:锚定词首(支持vi和grep),其后面的任意字符必须作为单词首部出现,如<love或 blove
\>或\b:锚定词尾(支持vi和grep),其前面的任意字符必须作为单词尾部出现,如 love\>或love\b
扩展的正则表达式:需要使用egrep或者grep -E 才能匹配
+对前一项一次或多次重复匹配
?对前一项0次或者1次重复匹配
{j}对前一项进行j次匹配
{n,}前一项进行至少n次,多了不限。
{,m}前一项进行至多m次,少了不限。
{n,m}对前一项至少n次,最多m次。
注意: grep要{转义},\{\},egrep不需要转义
a|b 对a或者b进行匹配,可以是a,也可以是b
()对()里单项进行匹配 ,把需要的字符串作为一个整体,如:grep -E ’(root){3,}‘ /etc/passwd
2.3 cut和awk 提取列或者字段
-d 指定分隔符
-f 指定打印的列
-c 指定按字符提取
示例:
cut -d: -f1,3 /etc/passwd :提取/etc/passwd文件中以:分隔后的第1列和第3列
cut -c2-5 /etc/passwd 提取指定文件每一列的2-5个字符
awk 按列进行提取 默认用空格作为分割符
awk '{print $ 4}' 取第四列的
awk '{print $ 4,$6}' 取第四列到第6列
-F 指定分隔符
3 文本分析工具
文本统计 wc
文本排序 sort
文本比较 diff
3.1 wc 文本统计
可以针对文件或者标准输入计算行数、单词数,字节数/字符数
[root@ycf02 ~]# wc /tmp/passwd
49 109 2671 /tmp/passwd
#49 表示多少行
#109 表示单词数
#2671 表示字节数
-l 只统计行数
-w 只统计单词
-c 只统计字节
3.2 sort 文本排序
对标准输出排序,不改变源文件
默认是第一个字符排序
-r 执行方向排序(降序)
-n 执行数字大小排序(正序)
-f 忽略字符串中的大小写
-u 在输出中删除重复行
-t: 使用:作为字段见的分隔符
-k 指定列
例:
sort -n -t :-k 2 /etc/passwd
3.3 sort和uniq消除重复行
sort -u删除重复行
uniq 从相邻的行中删除重复行
-c 统计发生重复的次数
更sort一起使用效果更好 sort userlist.txt|uniq -c
3.4 diff文件比较
比较两个文件的不同,可以使用vimdiff
diff a.file b.file
4c4
< user_dd
--
>user_cc
以上示例支出a文件与b文件在5行存在差异
4 文本转换工具
4.1 tr 更改转变字符
- 转换一种字符集合为另外一种字符集合
- 只能从stdin读取数据
- -d 删除单个字符
tr ‘a-z’ ‘A-Z’ <a.file #将a文件内容小写转大写
4.2 sed 更改字符串
流编辑器
执行查找替换操作在文本流上,通常不更改源文件
使用-i.bak 备份和修改源文件
常用选项
-n,-quiet 不输出模式空间的内容(即不输出未操作内容,等同于只输出被操作的内容)
-i 将内容保存到源文件
-e 执行多条命令 -e 命令1 -e 命令2
-r 使用扩展正则表达式(sed默认正则表达式)
4.2.1 地址定界
4.2.2 常用命令
4.2.3 注意事项
4.2.4 案列
第九章 bash shell
- history历史记录
-c 清空历史记录(清空内存中的记录 .bash_history需手动清空)
-w 把缓存中的历史记录写入文件 - 调用历史命令和tab补齐
- 输入输出重定向
1 快捷键
ctrl+a 把光标移到命令开头
ctrl+e 光标移动到命令结尾
ctrl+c 强制终止当前命令
ctrl+l 清屏
ctrl+u 删除光标之前的内容
ctrl+k 删除或剪切光标之后的内容
ctrl+y 粘贴之前剪切的内容
crtl+r 在历史记录中搜索
crtl+d 退出当前终端
ctrl+z 暂停、放入后台
ctrl+s 暂停屏幕输出
ctrl+q 恢复屏幕输出
2 通配符
文件通配符 其他常用通配符
“*” 匹配0或多个字符 [:alpha:] 匹配字母
? 匹配任意单个字符 [:lower:] 匹配小写字母
[0-9] 匹配0-9范围内的数字 [:upper:] 匹配大写字母
[abc] 匹配该列表内的任意字符 [:digit:] 匹配数字
[^abc] 匹配除列表内字符外的所有字符 [:space:] 匹配空格
[:alnum:] 匹配任意之母或者数字
[:punct:] 匹配除空格、数字、字母以外的可打印字符
3 命令扩展符号
- 命令扩展$()和``
输出一个命令作为另一个命令的参数,即被包含的部分将被以命令的方式执行并输出,而不是被当成字符串直接输出
示例:一下两条命令等效,都将查询本机主机名并进行输出
#echo “当前服务器主机名为:$(hostname)”
# echo “当前服务器主机名为:`hostname`”
- 大括号扩展{}
作为一个集合(数组),重复匹配括号内的字符串
示例:
#touch {0…9}.txt 创建1到10这10个txt文件
#touch {0…9…2}.txt 指定范围0到9步长为2创建文件,最后创建0、2、4、6、8这4个文件
#touch {1,3,5}.txt 创建1、3、5这3个txt文件
#touch {a…z}.txt 创建a到z的26个txt文件
注意,这里的{0…9}与正则表达式里的[0-9]虽然都表示0-9这个范围,但{0…9}是表示实际存在的0到9这10个数字的集合(数组),而正则的[0-9]仅仅表示0-9这个范围,并不实际存在
4 变量
程序设计中一个可以变化的量
4.1 本地变量
本地变量由用户自由定义变量名和值
定义变量:变量名=变量值 变量名必须以字母或者下划线开头,大小写敏感,不能以数字开头
引用变量:$ 变量名或者${变量名}
查看变量:单个查看:echo $变量名 查看所有变量:set
取消变量:unset 变量名
作用范围:仅在当前shell中有效
环境变量
主要保存和操作系统有关的数据,比如用户家目录,命令提示符等
定义环境变量:
export back_dir=/home/back 定义一个新的环境变量
export back_dir1 将本地变量back_dir1转换成环境变量
查看变量:env
作用范围:当前shell和子shell中生效
5 命令别名
定义别名:$ alias ll=’ls -l’
查看别名:$ alias ll
取消别名:$ unalias ll
6 特殊符号
6.1 反斜杠
转义字符,去掉后面字符的特殊含义
6.2 引号
单引号’’:去掉引号内所有字符的特殊含义
双引号””:去掉引号内所有特殊字符的含义,以下情况除外
- $:变量应用符号
- ``:命令替换符号
- \:转义字符
- !:历史记录引用
7 用户登录shell
登录shell - 用户登录,包括图形登录
- su – 切换用户
非登录shell - su 切换用户
- 打开图形化终端 ctrl+shift+t
- 执行脚本
- 其他
8 变量文件
登录shell:登录到用户(su - username)触发的文件/etc/profile ~/.bash_profile
非登录shell:切换到用户(su username)触发的文件/etc/bashrc ~/.bashrc
登出shell:退出用户触发的文件~/.bash_logout
第十章 进程管理
进程是加载到内存中的一段指令,即一个程序运行的实例
- 进程ID(PID)唯一标识进程
- UID,GID是selinux上下文觉得文件系统的存取权限
通常继承执行用户的权限
子进程继承父进程的属性信息
1 查看进程
1.1 ps查看进程信息
1.1.1 命令选项
a:查看所有终端的进程
u:打印进程所有者信息
x:查看不属于任何终端的进程
-e:查看系统所有进程
-f:查看额外的信息
-o:指定格式输出 :例如:ps -axo pid,user,%cpu,command
--sort:指定排序的参数,例:--sort%mem按内存大小降序排序,常用组合 ps aux或者ps -ef
1.1.2 结果解释
进程状态补充:
TTY详解
tty1-6 控制台登录
pts /1 虚拟终端,图形化控制台,ssh远程登录
? 内核进程
1.2 top查看进程信息
1.2.1 top命令选项
d:指定刷新频率,也可以使用s来改变
p:监控某个指定进程的id
St:CPU的等待时间百分比
1.2.2 top执行交付命令
1:监控每个逻辑cpu的状况
c:切换显示命令名称和完整命令行
M:可按内存情况进行排序
P:根据CPU百分比排序
T:根据时间/累积时间进行排序
f:选择可显示内容
1.2.3 选项解释
1.2.3.1 第一行:
- 20:22:53 时间:系统时间
- up 系统已运行时间(从开机开始算)
- users 当前在线用户
- load average:系统平均负载时间(分别代表每分钟,每五分钟,每十五分钟),服务器性能重要依据,以单颗cpu为例(长期观察每十五分钟这一参数):
<1:系统资源很充足
=1:系统在全力处理任务
>1:CPU已在全力工作,但队队列仍然很长,任务量还很多
1.2.3.2 第二行:Tasks(任务介绍)
- total 当前总进程
- runing 个正在运行进程
- sleeping 个睡眠进程
- stopped 个停止进程
- zombie 个僵尸进程
1.2.3.3 第三行:%CPU(s)(CPU信息)
- us 表示 CPU 在用户运行的时间百分比,通常用户 CPU 高表示有应用程序比较繁忙。典型的用户程序有:数据库、Web 服务器等
- sy 表示 CPU 在内核态运行的时间百分比(不包括中断),通常内核态 CPU 越低越好,否则表示系统存在某些瓶颈
- ni 表示用 nice 修正进程优先级的用户进程执行的 CPU 时间。nice 是一个进程优先级的修正值,如果进程通过它修改了优先级,则会单独统计 CPU 开销
- id 表示 CPU 处于空闲态的时间占比,此时,CPU 会执行一个特定的虚拟进程,名为 System Idle Process
- wa 表示 CPU 在等待 I/O 操作完成所花费的时间,通常该指标越低越好,否则表示 I/O 存在瓶颈,可以用 iostat 等命令做进一步分析
- hi 表示 CPU 处理硬中断所花费的时间。硬中断是由外设硬件(如键盘控制器、硬件传感器等)发出的,需要有中断控制器参与,特点是快速执行
- si 表示 CPU 处理软中断所花费的时间。软中断是由软件程序(如网络收发、定时调度等)发出的中断信号,特点是延迟执行
- st 表示CPU 被其他虚拟机占用的时间,仅出现在多虚拟机场景。如果该指标过高,可以检查下宿主机或其他虚拟机是否异常
注意:一般我们关注多的是us、sy、id、wa、hi、wi这个6个数值,在这里我们需要注意的指标如下:
统计空闲的CPU我们直接统计%id的计数即可,当id持续过低的时候,表示系统迫切需要解决CPU资源问题。
统计使用的是CPU需要用1-%id获取。或者us+sy+si.
-
wa:使用率过高的时候,我们需要考虑IO的性能是否有瓶颈,可以在使用iostat、sar等命令做进一步分析;
-
hi:使用率过高时,表示当前硬件中断占用很大的百分比。一般硬件中断我们可以分析文件/proc/interrupts、/proc/irq/pid/smp_affinity、服务irqbalance是否配置,以及CPU的频率设置,通过这些可以帮系统打散优化系统的硬件中断。
-
si:Linux kernel通过用一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断。常见的软件中断一般都是和网络有关。从网卡到IP层的数据报文收发都是si处理的,长时间写日志也可能产生软件中断。
-
当软中断出现瓶颈的时候,系统有个进行叫ksoftirqd,每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑ID),每个ksoftirqd的内核线程都会去运行对应的ksoftirqd(函数)来处理自己的中断队列上的软件中断。所以,当网络出现阻塞的时候,软件中断程序ksoftirqd肯定会出现瓶颈。此时我们可以通过ps aux|grep ksoftirqd查看ksoftirqd的瓶颈。
1.2.3.4 第四行:MiB Mem(内存信息)
total 物理内存总量
free 空闲物理内存
used 已经使用的物理内存
buff/cache 内核缓存内存量
1.2.3.5 第五行:MiB Swap(交换分区)
total 交换区总量
free 空闲交换区总量
used 使用的交换区总量
avail Mem 缓冲的交换区总量。
1.2.3.6 top进程信息
PID 进程id
USER 父进程id
PR 优先级
NI 谦让度值 nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SHR 共享内存大小,单位kb
S 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 命令名/命令行
2 其他工具
2.1 pgrep 模糊查找
-l也显示命令名
-f与整个命令行匹配
-n仅显示最新进程
-o仅显示最旧的进程
-v否定比赛
-x匹配整个名称(不是子字符串)
-s匹配会话ID(0表示当前)
-P匹配父进程ID
2.2 pidof 精确查找
3 信号
- 对进程的操作可以通过发送不同的信号来实现
- 直接给进程发送信号,不需要用户界面
- 通过名称或者数字来确定一个信号
- signal 15 终止(默认) 推荐使用
- signal 9 立即终止 可能会造成数据丢失
- signal 1 HUP 重新读取配置文件
- HUP 1 终端挂断
- INT 2 中断(同 Ctrl + C)
- QUIT 3 退出(同 Ctrl + \)
- KILL 9 强制终止
- TERM 15 终止
- CONT 18 继续(与STOP相反,fg/bg命令)
- STOP 19 暂停(同 Ctrl + Z)
- man 7 显示完整列表
3.1 给进程发送信号
在Linux中默认使用信号进行进程的通信
kill -信号 PID ----->结束指定进程
通过PID:kill [signal] pid…
killall -信号 进行名 ------>批量结束一类进程
通过名称:killall [signal] comm…
pkill -t 结束一个终端(终端通常是ssh的pts)的进程
通过模式:pkill [-signal] pattern
4 :调度优先级
调度优先级决定对cpu的访问
linx总只有root可以调整nice值(即静态优先级),该值影响优先级
值范围-20~19 缺省值为0,低nice值意味着高cpu优先级
通过ps -o comm,nice查看
4.1 更改调度优先级
- 当进程启动的时候指定优先级
$ nice -n 5 command - 在启动进程之后修改优先级
$ renice 5 pid
5 作业控制
- 在后台运行一个进程给命令
尾附加一个符号:firefox & - 临时停止一个正常运行的进程
使用ctrl+z或者发送signal 19(停止) - 管理后台挂起的作业
显示作业好和名字:jobs
bg %任务编号,在后台恢复:bg [%jobnum]
fg %任务编号,在前台恢复:fg [%jobnum]
发送一个信号:kill [-signal] [%jobnum]
第十一章 网络配置
1 网络组成
1.1 IP
用来在网络中标记设备,不同主机可以通过ip地址进行通信
IP地址是一个32位的二进制数,其地址分为网络和主机两个部分
1.2 子网掩码
用来确定整个网络的范围,子网掩码可以确定网络内可以容纳多少主机
1.3 网关
当需要和其他网段进行通讯时需要设置网关
网关通常指向本地路由接口的ip
DNS名称服务器,主要是将域名解析成IP地址来供系统访问
1.4 网络接口名称
传统上,linux的网络按照加载顺序接口依次为eth0、eth1、eth2…. 但系统新增网卡或更换网卡设备后,非常容易会导致网络异常
RHEL7以上版本的默认命名是基于固件基础上分配的固定名称(接口类型+适配器类型+随机id 列如:ens160)
- 接口类型
en 以太网有线接口
wl 无线局域网接口
ww 无线广域网接口 - 适配器类型
s 热插拔插槽
o 板载
p PCI类型的支持 - 数字N代表索引,ID或者端口
- 如果固定名称不能被确定,则传统的名称ethN将被使用(可以手动更改内核参数重新加载并重启服务器使其失效而恢复到ethN命名模式)
2 查看网络
-
ifconfig查看网络接口状态,mac地址、ipv4/6地址、广播地址等
-
lo 本地回环地址:IP:127.0.0.1 只能自己访问自己搭建的网站,供应其他程序内部访问
-
virbr0 提供KVM虚拟化
-
route -n查看网关路由等信息
[root@ycf02 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.72.2 0.0.0.0 UG 100 0 0 ens160
0.0.0.0 172.25.250.254 0.0.0.0 UG 101 0 0 ens224
172.25.250.0 0.0.0.0 255.255.255.0 U 101 0 0 ens224
192.168.72.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
- cat /etc/resolve.conf查看DNS信息
[root@ycf02 ~]# cat /etc/resolv.conf
#Generated by NetworkManager
search localdomain
nameserver 192.168.72.2
nameserver 8.8.8.8
还原eth0:
1、临时还原,在系统启动时传递 nat.ifnames=0 bisodevname=0
2、永久有效
1、[root@ycf02 ~]# vim /etc/default/grub
2、重新生成引导文件
[root@ycf02 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
3、reboot重启验证
3 网络管理工具
3.1 ifconfig
ifconfig查看激活网卡信息
ifconfig -a查看所有网卡(包括未激活)
ifconfig ens160 up/down 激活或者禁甩网卡
ifconfig ens160 ip/netmask 设置ip地址和子网掩码(临时有效,会覆盖原有配置信息,但重启后失效)
3.2 ip
3.2.1 ip link管理设备
- ip link [show]:查看设备信息
- ip link set ens160 up/down:激活/禁用网卡
3.2.2 ip addr管理地址
ip addr [show]:查看网络地址
ip addr add ip/netmask dev ens160 在该网卡添加当前指定地址(临时有效)
示例给ens160网卡添加一个ip:ip addr add 192.168.17.129/24 dev ens160
ip addr del ip/netmask dev ens160 删除该网卡上的指定地址
3.2.3 ip route管理路由表
ip route [show] 查看路由表信息
ip route add 目标地址ip[/netmask] via 网关地址 添加路由
示例:ip route add default via 172.168.1.254 dev ens160
ip route del 目标地址ip[netmask] 删除路由
3.3 networkManager服务
3.3.1 nmtui图形化工具
3.3.2 nmcli命令行工具
3.3.2.1 管理设备 nmcli device
- nmcli dev [status] 查看设备状态
DEVICE:设备名称
CONNECTION:连接的配置文件名(即/etc/sysconf/network-scripts/下的配置文件) - nmcli dev connect/disconnect ens160 链接或者断开设备
3.3.2.2 管理配置文件 nmcli con
- 查看|删除配置文件 nmcli con [show|delete]
NAME:配置文件名
DEVICE:设备名称(网卡名)
添加配置文件 nmcli con add
[root@yuncf01 ~]# nmcli connection add type ethernet ifname eth0 con-name ens160 ipv4.method manual ipv4.addresses 192.168.10.10/24 ipv4.gateway 192.168.10.254 ipv4.dns 144.144.144.144 autoconnect yes
type:添加的配置文件类型
ifname:设备名字(网卡名)
con-name:连接的配置文件名
ipv4.method:ipv4获取方式(dhcp或手动)
ipv4.addresses:指定ipv4地址
ipv4.gateway 网关地址
ipv4.dns DNS地址
autoconnect:是否开机激活
-修改网络配置nmcli con modify (配置文件名)
[root@yuncf01 ~]# nmcli connection modify System\ eth0 ipv4.method manual ipv4.addresses 192.168.10.100/24 ipv4.gateway 192.168.10.254 ipv4.dns 144.144.144.144 autoconnect yes
多IP添加
多IP删除
3.3.2.3 激活配置文件 nmcli con up
[root@yuncf01 ~]# nmcli connection up ens160
3.3.2.4 配置项与ifcfg-*配置文件关系
[root@yuncf01 ~]# ls /etc/sysconfig/network-scripts/
ifcfg-ens160
3.4 手动配置网卡
- 手动修改: vim ifcfg-ens160 配置文件
nmcli connection reload 让nmcli重新读取硬盘上的配置文件
nmcli connection up 配置文件名 让配置生效 - 删除配置文件:
nmcli connection del 配置文件名
nmcli的指令: 都支持 简写(缩写)
nmcli device status ——> nmcli d s
3.4.1 编辑文件
手动编辑文件/etc/sysconfig/network-scripts/ifcfg-ens160 ,将ip获取方式更改为手动BOOTPROTO=static,并在其后添加如下几行,最后内容如下
TYPE=Ethernet 网络类型 表示以太网
PROXY_METHOD=none 表示是否启用代理
BROWSER_ONLY=no 是否仅浏览
BOOTPROTO=static 获取ip的方式,dhcp表示自动获取
IPADDR=IP地址
NETMASK/PREFIX=子网掩码
NETMASK=255.255.255.0
PREFIX=24
GATEWAY=172.168.0.2
DNS1=202.103.44.150
DNS1=202.103.25.69
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes 是否启用ipv6
IPV6_AUTOCONF=yes ipv6是否自动配置ip地址
IPV6_DEFROUTE=yes 是否将当前的接口设置ipv6的默认网关
IPV6_FAILURE_FATAL=no ipv6配置失败的时候启用ipv4
NAME=ens160 配置文件的名字
UUID=74d133f7-fe91-4631-9ea9-15626060de12 配置文件标识符
DEVICE=ens160 网卡设备
ONBOOT=yes 开机自动激活网卡
3.4.2 让配置生效
$ nmcli connection reload #让networkManager重新读取硬盘上的配置文件
$ nmcli connection up ens160 #让配置生效
3.4.3 多IP配置
在网卡文件添加如下配置,然后重新读取配置文件并让其生效,使用ip addr show查看
IPADDR1=ip地址2
NETMASK1=255.255.255.0
或者
IPADDR1=ip地址2
PREFIX1=24
4 主机名查看及设置
- 查看主机名
[root@yuncf01 ~]# hostname
yuncf01
-
主机名配置文件
/etc/hostname -
设置主机名,修改完成后需要重新登录才会显示新主机名
hostnamectl 修改主机名或者查看系统信息
hostnamectl set-hostname rhce.example.com (永久有效) -
IP与主机名的映射(绑定):
在生产环境中,有很多自定义的域名,这些域名都不是公网来解析的
/etc/hosts 系统内部用来解析内部地址的文件
IP地址 完全限定的域名(完整的主机名) 别名
做了映射以后 ,文件中的条目优先级更高
hosts文件只在本机上有效
4.1 编辑/etc/hosts文件
ip 域名 别名
5 标准服务端口
标准服务端口配置文件/etc/service
5.1 端口和服务故障排查
- IP监听的端口信息:
ss 、 netstat(来自于net-tools) - SS 的效率更高 在系统 网络并发连接的场景下 ss 更快(ss是从内核读取网络信息)
- netstat 是从 用户空间读取网络信息
ss -n 查看端口的编号 -t tcp -u udp -a 显示监听的套接字和建立连接的套接字
-l 仅显示监听的套接字 –p 显示进程 –A 指定接口
6 双网卡绑定bond模式
6.1 bond级别
6.2 bond实现步骤
先决条件:
服务器必须有两张网卡,
也不需要有配置配置文件
- 删除需要操作的两张网卡的配置文件
- 添加虚拟接口
- 给虚拟接口配置地址
- 给虚拟接口添加两块物理网卡
- 激活bond
bond1 示例: 主备模式 也就是当一个网卡故障时,另一个网卡接替服务
1. 创建虚拟接口
nmcli connection add type bond ifname bond1 con-name bond1 mode active-backup miimon 1000
type: 类型是bond
mode:active-backup 主备
miimon: 链路的监测时间 1000
2. 给bond添加物理接口
nmcli connection add type bond-slave ifname ens224 con-name bond1-ens224 master bond1
nmcli connection add type bond-slave ifname ens160 con-name bond1-ens160 master bond1
3. 给bond配置IP地址
nmcli connection modify bond1 ipv4.method manual ipv4.addresses 172.16.0.80/24 autoconnect yes
4. 激活bond 并测试
nmcli connection up bond1
查看bond的信息: cat /proc/net/bonding/bond1(bond网卡名)
6.3网桥:
DHCP 动态主机配置协议 ,是专门用来在网络中为主机自动分配IP地址
在装了vmware的物理机上vmnet1 是仅主机模式网卡 vmnet8 是nat模式网卡
一般 vmware会将子网中.1的IP作为物理机上虚拟网卡的IP .2 的IP作为该子网的网关地址
- NAT模式:
vmware的NAT 模式 是可以上网的,将虚拟网络内部的地址转换成可以上网的物理接口地址 来访问外部网络
将物理网卡作为虚拟交换机的上行链路,由虚拟交换机完成地址转换
仅主机模式:
是为了进行内部的测试,而虚拟机不需要访问外部网络
缺少上行链路的虚拟交换机 - 桥接模式:
将物理网卡变成虚拟交换机,将物理机变成特殊的虚拟机(其实就是来扩充物理网卡的端口数量)
桥接模式是为了能够让外部的用户访问到内部的服务(也就是内部的虚拟机能够被外部访问,因此桥接模式用在虚拟化)
桥接模式的配置示例:
1. 创建虚拟网桥设备
nmcli connection add type bridge ifname br0 con-name br0
2. 给设备绑定物理接口(指定桥接的物理网卡)
nmcli connection add type bridge-slave ifname ens224 con-name br0-ens224 master br0
3. 给网桥配置IP地址进行测试(生产环境中一般不会配置地址)
nmcli connection modify br0 ipv4.method manual ipv4.addresses 192.168.10.100/24 autoconnect yes
nmcli connection up br0
7针对部分情况,网卡未加入托管导致
虚拟机开启时ifconfig没有ens160网卡,无法上网远程SSH连接,同时图形化模式没有有线连接选项:
手动启动网卡提示:
[root@ycf02 ~]# nmcli device connect ens160
Error: Failed to add/activate new connection: Connection 'ens160' is not available on device ens160 because device is strictly unmanaged
[root@ycf02 ~]# nmcli connection up ens160
Error: Connection activation failed: No suitable device found for this connection (device lo not available because device is strictly unmanaged).
原因是虚拟机启动时,NM托管未开启导致
7.1解决方案一(临时生效)
1、查看托管状态
[root@ycf02 ~]# nmcli networking
2、显示 disabled 则为遇到的问题,如果是 enabled 则可以不用往下看了
开启 托管
[root@ycf02 ~]# nmcli networking on
3、再启动网卡就行
[root@ycf02 ~]# nmcli device connect ens160
7.2解决方案二(永久生效)
[root@ycf02 ~]# vim /etc/NetworkManager/NetworkManager.conf
添加:managed=true,保存退出
重启网络服务器:
[root@ycf02 ~]# systemctl restart NetworkManager
这样就行了
第十二章 shell脚本实战
1 介绍
- shell 脚本:
shell 是简单易学——> 都是Linux的命令来组成的
shell 可以批量的解决重复性操作——> 减少重复的工作量
2 基础回顾
- vim文本编辑器
- I/O重定向和管道’|’
- 正则表达式
- 通配符
- 别名
- 命令扩展
- 变量
3 shell基本元素
对于一个shell脚本来说,应该具备以下元素
【解释器】第一行的声明:“#!/bin/bash”
【注释】:说明某些代码的功能
单行注释:#
多行注释: <<BLOCK(可以是任意字符串,但要注意前后一致并对其)
BLOCK
【可执行语句】:实现程序的功能
4 脚本执行方式
- 方式一:在当前目录以相对路径的方式执行 ./demo.sh
- 方式二:在任何位置以绝对路径的方式执行 /opt/demo.sh
- 方式三:直接使用bash来直接执行shell脚本 bash demo.sh
- 方式四:在当前的shell环境中执行bash shell脚本:source或者.(source demo.sh或. demo.sh)
unset 退出登录
区别:
方法三 可以在脚本中不指定解释器,脚本可以没有执行权限
方法一和方法二脚本需要有执行权限,
方法四:将脚本中内容放到当前shell执行,方法1-3开启子shell
5 shell脚本编写规范
shell编写中的注意点:
- 在开头要写解释器 可以是/bin/bash 或者是/bin/sh
- 要写注释,交代脚本的功能和描述信息以及作者的联系方式
- 脚本的注释尽量使用英文,因为中文在生产环境中可能出现乱码
- 命令要一步到位,避免重复(使用多条指令达到某一条命令即可达到的效果)
- 代码要缩进,缩进才能有层次感,排错才会容易
- 脚本的文件尽量以.sh结尾(Linux没有文件扩展名,但是.sh结尾可以让人看得更清楚)
1、 开头指定解释器
#/bin/sh 或者#!/bin/bash
2、 开头加版本版权等信息
#Date 创建日期
#Author:作者
#Mail:联系方式
#Function:功能
#version:版本
#Description:描述
3、 脚本中尽量不要使用中文
4、 没必要使用cat命令
eg:cat /etc/passwd|grep gnru
可以改成如下方式
eg:grep gnru /etc/passwd
5、 代码缩进
6、 脚本已.sh为扩展名,名称见名知意
例如:backMsql.sh back_mysql.sh
7、使用.vimrc文件,可快速生成脚本开头的头文件信息
6 变量
6.1 位置变量
这种变量主要用来向脚本中传递参数或者数据,变量名不能自定义,作用是固定的
$1 表示脚本后的第一个参数
$2 表示脚本后的第二个参数
$3 表示脚本后的第三个参数
$1~${10}
6.2 预定义变量
预定义变量是bash中一定定义好的变量,变量名不能自定义,变量的作用也是固定好的
$0:脚本名(即执行脚本的文件名)
$*:所有的参数,双引号应起来时候参数视为单个字符串
$@:所有的参数,双引号引起来时,每个传输作为个体
$#:参数的个数
$$: 当前脚本的PID
$?:上一个命令的返回值[0-255] 0表示成功,1-255表示执行失败
6.3 read从命令行读取变量值
read 变量名
-p 提示信息
-t 指定超时时间 单位:秒
-s 暂停屏幕输出,即输入的信息不回显示到屏幕,适用于指定密码
从命令行接收用户输入:
read –p “提示信息” –s “输入内容不可见” -t “超时时间单位秒” 变量名
如果没有指定变量名默认为REPLY 这个变量名
- 脚本的退出码:
类似于命令的返回值 0 – 255
其中0表示成功
非0 表示失败
在脚本中通过exit退出脚本并可以携带退出码 eg.exit 100
7 条件执行运算符
命令是否执行要根据前面命令的退出码
&&代表逻辑与:
command1 && command2
根据命令的返回值 来判断命令是否执行成功 返回值为0 则结果为真; 返回值为非0 结果为假
如果command1 结果为真则执行 command2
如果command1 结果为假则不执行 command2
逻辑与两条命令返回值为0,则结果为真
例如:如果系统存在dragon用户,则更改密码
id dragon && echo dragon|passwd –stdin dragon
|| 逻辑或:
command1 || command2
如果command1 结果为真不执行 command2
如果 command1 结果为假则执行 command2
一真为真 一条命令满足结果则为真
例如:如果系统不存在dragon用户,则创建
id dragon || useradd dragon
8 复合指令
即一串命令,()和{}都是对一串命令进行执行,但有所区别
pwd;cd /tmp;pwd)
{ pwd;cd /tmp;pwd;}
-
相同点:
()和{}都是把一串的命令放在括号里面,如果命令在一行命令之间用; 号隔开
()和{}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令 -
不同点:
格式不同:
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格
()最后一个命令可以不用分号,{}最后一个命令要用分号 -
shell的差异:
()是在子shell中执行,所以不能改变当前shell的路径
{}是在当前shell中执行,因此可以改变当前shell的路径
9 条件测试
在shell程序中,用户可以使用测试语句来测试指定的条件表达式的真或假,但指定条件为真时,整个测试返回值为0,反之未假,返回值非0
格式1 test条件表达式 例如判断/tmp/ts文件是否存在 test -d /tmp/ts
格式2 [ 条件表达式 ] 只能是单个条件,
格式3 [[ 条件表达式 ]] 多个条件表达式,即出现逻辑与或者逻辑或
9.1 文件表达式
测试文件的属性
9.2 数值表达式
“=~”表示后面跟的是一个正则表达式
9.3 布尔运算符
布尔 理解 在Linux 中布尔值 更多的时候 就是一个开关 true false
运算符 | 说明 | 类似 |
---|---|---|
-a | 两个结果同时为真则表达式为真 | 类似于 && |
-o | 一个结果为真则表达式为真 | 类似于|| |
! | 对表达式的结果取反 | 逻辑非 |
9.4 字符串比较
- 字符运算符
= 判断 两个字符串是否相等 相等则为真
!= 判断 两个字符串是否不等 不等则为真
10 条件语句
10.1 if语句
10.1.1 单分支结构
if判断语句
格式1(单分支结构):
if 条件表达式 (if 条件表达式;then 将if和then 写成一行)
then
执行语句
fi
条件表达式并非一定是test,可以是任何返回值为0的命令
条件表达式成立则执行 执行语句
10.1.2 双分支
格式2(双分支结构):
if 条件表达式
then
执行语句1
else
执行语句2
fi
当条件表达式成立 执行语句1 反之执行 执行语句2
10.1.3 多分支结构
格式3(多分支结构):
if 条件表达式1
then
执行语句1
elif 条件表达式2
then
执行语句2
elif 条件表达式3
then
执行语句3
elif 条件表达式N
then
执行语句n
else
执行语句else
fi
当表达1满足后不再执行2后面的循环
10.1.4 示例
在shell脚本中使用bash –x 可以看到shell语句的执行过程
10.2 case语句
case 条件判断语句:
case esa变量名 in
值1)
执行语句1
;;
值2)
执行语句2
;;
值n)
执行语句n
;;
*)
执行语句*
;;
esac
示例
case 适合于 已知的有序的判断,对结果有预知 if 适合 对结果做无序
11 循环语句
11.1 for循环
针对已知的列表进行循环
语法:
for 变量名 in 循环的对象
do
循环体
done
方法1:直接列出元素
for i in 1 2 3 4 5
do
echo $i
done
方法2:使用大括号
for i in {1..5}
do
echo $i
done
方法3:使用seq
for i in $(seq 1 5)
do
echo $i
done
方法4:使用命令的结果
for i in $(ls *.sh)
do
echo $i
done
方法5:类c风格
for ((i=0;i<=100;i++))
do
echo $i
done
案例:
1. 文件的批量改名 将/tmp/demo 下的文件全部用原来的文件名加上.bak进行备份
2. 批量检测 IP地址的存活情况,检测192.168.10.0/24 这个子网中的所有IP地址,如果IP存活将IP地址保存到ip.txt,且输出ip Ok 例如 192.168.10.1 Ok,反之IP如果不存活,则输出IP Error但不保存到文件
shell 没有多线程 操作的概念 shell 实现并发 利用后台进程实现
在循环体中使用 { }& 将进程丢到后台执行,通过wait刷新同步
#!/bin/bash
ip_addr=192.168.10.
for i in {1..254}
do
{
ping -c 1 -W 1 $ip_addr$i &> /dev/null
if [ $? -eq 0 ];then
echo $ip_addr$i Ok
echo $ip_addr$i is ok >> ip.txt
else
echo $ip_addr$i error
fi
}&
done
wait
11.2 while语句
while循环结构可以使得用户重复某一系列的操作,直到某一个条件的发生,语法如下
while 测试条件
do
语句块
done
11.2.1 while循环读取文件
方式1:采取exec读取文件,然后进入while循环处理
exec < file
while read line
do
echo $line
done
方式2:使用cat读取文件,通过管道进入while循环处理
cat fial | while read line
do
echo $line
done
方式3:通过while循环结尾,使用输入重定向
while read line
do
statement1
done < file
11.3 until循环
until循环语句将循环体重复执行,知道某个条件成立为止,基本语法如下
until expression
do
statement1
statement2
。。。。
done
11.4 跳出及退出循环
break:跳出整个循环体
continue:跳出当前这一次循环,然后继续下一次循环
12 exit退出码
程序执行后会携带一个退出码
0 成功,1-255代表失败
shell程序的退出码存储在系统的变量$?中
13 并发
{commd}&
wait
第十三章 计划任务
在linux系统中,计划任务分为两类
1. 一次性计划任务(在未来只执行一次的计划任务)
2. 周期性计划任务(在未来周期性重复执行的计划任务)
指定某用户是否可以设置计划任务可以在系统黑白名单中进行管理
/etc/at.deny:仅拒绝
/etc/at.allow:仅允许
一次性计划任务:
一次性计划任务使用at进行管理(atd.service),具体如下
因特殊情况没有执行的任务,会在过期后的下一次atd服务启动的时候被立即执行
1.1 查看计划任务: at -l
[root@ycf01 ~]# at -l
1 Sun Mar 5 21:34:00 2023 a root
2 Sun Mar 5 22:12:00 2023 a user1
第一列:计划任务编号
第二列:计划任务执行时间
第三列:计划任务被排入的队列(默认为a,-q指定队列,从a-z nice依次降低,a为2,z为19
第四列:任务的拥有人
1.2 任务添加
at timespec:交互式创建计划任务,ctrl+d结束 如:at 21:33 2023-03-11 回车开始创建任务
at timesec < myscrpt:从脚本输入 该脚本可以没有执行权限,甚至添加完任务后脚本都可以删除
at -c jobnum:查看计划任务的详细信息
at -d jobnum:删除计划任务
1.3 修改
at管理的计划任务对应的脚本文件在/var/spool/at中对应的文件
grep -r ping …/
2 周期性计划任务
在系统中我们使用crontab管理周期性任务
crontab -e:管理当前用户的计划任务
crontab -l:列出当前用户的计划任务
crontab -r:删除当前用户的所有计划任务
crontab -u:管理其他用户的计划任务
2.1 配置参数及取值范围说明
crontab配置文件在/etc/crontab,使用man 5 crontab可查看帮助
五位*参数分别对应分、时、日、月、周
分钟:取值为每个小时下分钟的参数,即0~59
小时:取值为每一天中小时的参数,即0~24
日期:取值为月份中的天数,即1-31
月份:取值为每一年中的月份,即1-12
星期:取值为每个星期的星期几,即0-7(0和7都代表星期日)
commad:代表呀执行的命令或者脚本
2.2 cron时间表示方法(以分钟栏位为例,其他栏位同理)
*:表示匹配改栏位的每一个时间点,
例:* * * * *表示每个月的每天的每小时的每一分钟执行一次
x-y:表示范围[x-y],例如分钟栏位为[1-5]表示第1到5分钟都执行一次
例:11-13 * * * *表示每一天的每个小时的第11,12,13分执行
x,y:表示列表,也可以包含范围,
例:5,10-13,16 * * * *表示每天每小时的第5、10、11、12、13、16分执行
*/x:表示每个x个时间点就执行一次
例:*/5 * * * *表示每天的每小时每隔5分钟执行一次
综合举例
0 15 * * 1-5 每周一到周五的下午3点整执行
30 8 * * * 6,0 每周六周日的早上8点30执行
0 8-19/2 * * * 每天的8到19点之间没两小时执行一次
0 10 */3 * *每隔3天的10点1分执行
2.3 cron任务的文件
- 系统范围内的定时任务:/etc/crontab和/etc/cron.d(建议存放到该目录)目录的文件中
- 所有用户的cron任务(使用crontab命令创建的任务)都被保存到/var/spool/cron目录中与用户名对应的文件中
- 定时任务执行日志/var/log/cron
2.4 系统中的定时任务
2.5 禁用用户计划任务
如果拒绝和运行都存在同一个用户,以允许为主
/etc/cron.deny:仅拒绝
/etc/cron.allow:仅允许
2.6 避坑指南
- 如果我们的脚本手动执行没问题,但丢定时任务执行会报错的时候,说明我们缺少环境变量,因为定时任务默认使用bin/bash解释器运行,如果我们的变量不在crontab的变量中,所以我们需要做如下操作,在脚本前source一下系统环境,如下
crontab -e进入任务编辑
* * * * * source /etc/profile;跟上我们的脚本
- 定时任务中的命令如果使用了%&等特殊符号需要转移
第十四章 查找和处理文件
1 locate 基于数据库查找文件
基于数据库查找 非常快,但只能查找文件名(文件名全名或者部分),完整的路径会被打印,而不是只有文件名
手动更新数据库执行 updatedb
locate存在排除目录,排除目录下的文件不会被查找到,具体查看/etc/update.conf中prunepaths
常用选项
-i 忽略大小写
-n 查找匹配到的前n条记录
2 find 遍历查找文件
实时搜索目录树
比locate慢但更精确
find是精确查询,必须接上完整文件名(但可以通过命令行通配符拓展)
如果不给定目录,就用当前目录
日过不给定criteria 所有文件都匹配
在找到的文件上可以执行命令
对于被搜索的目录,用户要拥有可读可执行的权限
2.1 根据层级目录查找(深度)
常用选项
-mindepth 最小搜索目录深度
-maxdepth 最大搜索目录深度
案例:
当前在/opt目录下,已知存在文件及目录如下:/opt/1/2/3/4/5/txt.txt
find /opt/ -name txt.tx 不指定目录深度则全部搜索
find /opt -maxdept 2 -name txt.txt 表示从/opt开始最多再向下搜索2层,即最多搜索到/opt/1/2/
find /opt -mindept2 -maxdept 5 -name txt 表示从/opt开始最少要搜索到2最多搜索到5这一级
2.2 根据文件名和inode查找
-name “文件名称” 支撑glob(7) * ? [] [^]
find /opt -name “ip*” 注意通配符需要用引号,否则如果当前目录下有一个ip开头的文件,这ip*会被识别成这个文件,而不是一个通配符
-iname “文件名称” 不区分大小写
-inum n 按文件inode查找
-links n 按连接数为n的文件
2.3 根据属主、属组查找
-user username 查找属主为指定用户的文件
-group groupname 查找属组为指定组的文件
-uid userID 查找属主为指定uid的文件
-gid 查找属组为指定gid的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
2.4 根据逻辑组合条件查找
常用选项
与 -a
或 -o
非 -not,!
非P或者
用括号对多个条件取反,
括号需要转移,
括号内开头和结尾需要有空格
括号内用或的关系 列如
\( 条件一 -o 条件二 \)
例:查找属主和属组都不能是root的文件 find -not \( -user root -o group root \)
2.5 根据文件类型查找
常用选项
-type f 查找文件类型为普通文件
b 块设备
c 字符文件
d 目录
i 连接文件
p 管道文件
s 套接字文件
2.6 根据文件大小查找文件
常用选项
-size [+|-]#UNIT
常用单位 k M G
例:
find -size 10M 查找大小是10M的文件
find -size -10M 查找小于10M的文件(不包含10M)
find -size +10M 查找大于10M的文件(不包含10M)
find -size +30k -size -50k 查找大于30k小于50k的文件
2.7 根据文件权限查找
常用选项
-perm [/] mode
MODE精确匹配权限
/MODE 任何一类(guo)对象权限中只要能满足一位即可,属于或关系
-MODE 每一类都必须同时满足 属于与关系
0 表示不关注
例
find -perm 644 表示严格匹配644权限文件
find -perm /222 表示uo任何一类用户有写入权限即匹配
find -perm -222 表示严格匹配权限,即所有用户都必须有写权限
find -perm -002 表示仅严格匹配other用户的写权限
find -perm -2000 表示查询必须拥有sgid权限的文件
2.8 根据文件时间戳查找
常用选项
已天为单位
-atime 访问时间
-mtime 修改时间
find -mtime 7 在前面第七天被修改过的文件
find -mtime -7 七天内修被改过的文件
find -mitme +7 七天前被修改过的文件
-ctime 文件时间戳
已分钟为单位
-amin 访问时间
-mmin 修改时间
find -mtime 7 在前面第七分钟被修改过的文件
find -mtime -7 七分钟内修被改过的文件
find -mitme +7 七分钟前被修改过的文件
-cmin 文件时间戳
2.9 在查找到文件后的操作
- -print 默认动作,显示到屏幕
- -ls 长格式显示,类似对查找到的文件执行 ls -l
- -delete 删除查找到的文件
- -fls 查找到的所有信息以长格式保存到指定文件中
- -ok command {} ; 对查询到的文件执行command指令的命令,且都会交互式要求确认
- -exec command {} \;对查询到的每个结果文件执行有command指定的命令
- {} 用于引用查询到的文件名称自身
- 由于很多命令不支持管道,而日常工作中有这个必要,所有就有了xargs命令,
xargs命令用于接收管道传递过来的数据,
|xargs用于接收无法直接通过管道传输的数据
示例:
将配置文件备份到指定目录下并添加.org扩展名
#find . -name “*.conf” -exec cp -r {} /dir/{}.org \;
提示删除存在时间超过3天以上的属组为young的临时文件
#find /tmp -ctime +3 -user young -exec rm -rf {} \;
在家目录中查找可以被其他用户写入的文件,将其w权限取消
#find ~ -perm -002 -exec chmod o-w {} \;
查找/var目录下属主为root且属组为mail的文件
#find /var -user root -group mail -ls
查找/var目录下不属于root lp gdm的所有文件
#find /var !-user root !-user lp !-user gdm
#find /var not \( -user root -o -user lp -o -user gdm \)
查找/var下最近一周内被修改过的文件且属主不能是root
#find /var -mtime -7 !-user root -ls
查找当前系统上没有属主或者属组且最近一周被访问过的文件
#find / -nouser -o -nogroup -a atime -7 -ls
查找/etc目录下大于1M且类型为普通文件的所有文件
#find /etc -size +1M -type f -ls
查找/etc目录下所有用户都没有写权限的文件
#find /etc !-perm /222
查找/etc目录下至少有一类用户没有执行权限的文件
#find /etc !-perm -111 至少有一类用户没有,反过来就是所有用户都有
找出/tmp目录下属组不是root,且文件名不以f开头
#find /tmp !-group root !-name “f*” -ls
#find /tmp not \( -group root -o -name “f*” \) -ls
第十五章 网络客户端
1 浏览网页
1.1 curl工具
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具。curl用法:
1、curl url(获取该网址的文本信息)
cur www.baidu.com
2、curl -i url(获取该网址的文本信息以及协议头部信息生产环境建议隐藏)
3、curl-x proxy url(使用代理获取网页文本信息)
curl-x 192.168.100.100:1080 http://www.linux.com
4、保存网页内容:-o
curl -o linux.html http://www.linux.com 将网页内容保存为本地的index.html
5、下载网页文件:-O
curl -O http://www.linux.com/hello.sh 下载文件到当前目录
curl-o /tmp/dodo1jpg http://www.linux.com/dodo1JPG 下载文件并另存为/tmp/dodo1jpg6、
6、通过ftp下载
curl-O -u 用户名:密码 tp://www.linux.com/dodo1.JPG
curl-O ftp://用户名:密码@wwwlinux.com/dodo1JPG
###1.2 wget工具
wget是一个下载文件的工具,支持HTTP,HTTPS和FTP协议,
wget http://link.lab0.cn:1000/test.zip
wget –O /tmp/hello.zip http://link.lab0.cn:1000/test.zip 下载并另存为
wget –b 放到后台下载
wget –P 放到指定的目录下
wget –spider 测试下载但不会真的下载
2 OpenSSH
-
Linux之间如何进行远程
在windows上 使用远程桌面来管理远程的windows操作系统
在Linux上 使用openssh套件来进行管理 安全加密的套接字通信方式
openssh 是一个C/S架构
openssh-client 客户端 openssh-server 服务端
就是使用client 端 来 连接server 端 -
ssh 对方机器的用户名@对方机器的IP地址或者是主机名(如果是主机名一定要可以解析为ip)
第一次连接需要接受对方的主机公钥,才可以进行正常的连接
ssh –X 转发X11的显示协议 (GNOME/KDE 图形化的软件都是基于X11的窗口开发)
DISPLAY=:0 显示器
ssh 用户名@ip ‘执行的命令’ 远程执行命令但是不登录到系统
ssh 使用非22 端口 使用 ssh –p 端口号 root@主机名 -
windows远程Linux
前提条件 windows上必须安装openssh-client 客户端
如果是win10 以下的系统需要使用第三方支持openssh的软件来进行远程
putty crt 免费 xshell 商业收费 ……
bash shell 在windows上安装bash的终端 可以支持 shell的指令
在Windows10 以上的操作系统中cmd和powershell 支持直接ssh
OpenSSH在任何linux的发行版都默认安装(红帽企业版上实施SecureShell或者SSH协议),SSH协议使系统能够以加密和安全的方式进行通行
ssh [user@]hostname|ip 远程登录
ssh root@192.168.195.100
ssh [user@]hostname|ip command 远程执行命令(多条命令用分号隔开,且最好用引号引起来)
ssh root@192.168.195.100 ‘who;cd /opt/;pwd’
ssh -X [user@]hostname|ip 远程调用图形
3 SCP 远程传输命令
scp(secure copy) 是一个基于ssh协议在网络之间进行安全传输的命令(在红帽9后将被取消)
用法:
scp 本地的文件/目录 用户名@远程主机:/路径
-
将本机的文件拷贝到远程
scp 本地文件 root@远程主机:/tmp 将本地的文件拷贝到远程主机的tmp目录 -
将远程文件的拷贝本机
scp root@192.168.10.70:/tmp/etc.tar.gz /opt 将远程的etc.tar.gz 拷贝到本机的opt
选项常用选项:
-r 拷贝目录
-p 拷贝文件的同时保留文件的权限和时间戳
-P 指定端口号 (ssh默认使用22作为标准端口,生产环境中不会使用22)
-C 数据量很大的情况下可以提升性能 压缩数据
在windows中使用第三方的传输工具或者ssh来客户端来实现文件传输
4 rsync远程同步命令
rsync是一个实现增量备份的工具
用法
本地用法:rsync [OPTION] src….[DEST]
rsync 选项 源路径 目标路径
rsync -a /etc /tmp
rsync -a /etc/ /tmp
通过ssh访问
Pull:rsync [OPTION…][USER@]HOST:SC….[DEST]
rsync 源路径 用户名@主机:/目标路径 push 将本地的文件上传到远程
Push:rsync [OPTION…] SRC…[USER@]HOST:DEST
rsync 用户名@主机:/源路径 目标路径 pull 将远程的文件下载到本地
rsync -a -e 'ssh -p 2222' root@192.168.10.70:/opt/ /tmp 使用非常规端口同步
PS: 源路径是否以斜杠结尾很重要,如果源路径以斜杠结尾表示同步目录下的文件,如果不以斜杠结尾表示同步目录本身
常用选项
-v:显示rsync过程中详细信息,可以使用-vvvv获取更详细的信息
-n:仅测试传输,而不实际传输,常和-vvvv配合使用查看工作流程
-a:归档模式,表示递归传输并保持稳健属性,等同于“-rtopgDI”
-r:递归到目录中去
-t:保持mtime属性
-o:保持owner属性
-g:保持group属性
-p:保持perms属性(权限,不包括特殊权限)
-D:是“—device --specials”选项的组合,即也拷贝设备文件和特殊文件
-I –links:如果文件是软连接文件,则拷贝软连接本身而非软连接所指向的对象
-z:传输时进行压缩,提高工作效率
--delete 以源为主,向目标同步;目标和源文件中的文件多则珊少则补
--existing 只同步目标端已经存在的文件,如果源文件不在目标端则不同步
--ignore-existing 只同步目标端不存在的文件
--remove-source-files 删除源端已经传输成功的文件(必须在源端执行)
--existing --ignore-existing 文件不会传输会比对文件
--ignore-existing --existing –delete 删除目标不存在的文件
示例
#rsync /etc/fstab /tmp 将/etc/fstab文件拷贝到/tmp
#rsync -r /etc/cron.d /tmp 将/etc/cron.d目录拷贝到/tmp下
#rsync -R -r /etc/cron.d /tmp 将/etc/cron.d目录拷贝到/tmp目录下,且在/tmp下生成etc子目录
#rsync -r -v –existing /tmp/a/ /tmp/b 只更新目标端已存在的文件
#rsync -r -v –ignore-existing /tmp/a/ /tmp/b 更新目标端不存在的文件
#rsync -nrv –existing –ignore-existing –delete 文件不会传输,但会删除接收端多处的文件
#rsync -r -v /etc/cron.d /tmp –delete 将目标多余的文件删除再同步
#rsync -r -v –remove-source-file /tmp/a/file1 /tmp/b/file3/tmp将源端已更新的文件都会被删除
5 基于ssh秘钥的身份验证
非对称加密的方式来进行认证
密码认证:
- 客户端发送连接请求
- 服务端发送主机公钥(主机指纹信息)给到客户端(默认发送的是ecdsa的公钥)
秘钥认证 - 客户端接收服务端的主机公钥后保存在当前用户的家目录下.ssh/know_hosts 文件中,每一行都是一个主机公钥
- 客户端使用服务端的公钥加密密码并发送给服务端
- 服务端收到客户端的密文后使用自己的私钥解密,并比对密码
- 如果密码比对一致则登录成功,反之登录失败
秘钥认证(免密登录/ssh互信,也就是登录时不需要验证密码):
- 客户端要生成一组公私钥 ssh-keygen 默认保存在当前用户的家目录.ssh目录中 id_rsa 私钥 id_rsa 公钥
- 客户端发送生成的公钥给到服务器端 (ssh-copy-id 发送公公钥给到服务器端的指定用户,切记公钥发给哪一个用户,就只有该用户无需密码登录,并非机器上所有的用户都可以免密登录) 默认保存在发送用户的家目录下.ssh/authorized_keys 文件中,每个公钥占一行
- 客户端发送连接请求
- 服务端收到连接请求后查找客户端是否有公钥存储,如果有公钥存储,服务使用客户端公钥加密随机字符串发送给客户端
- 客户端使用自己私钥解密后得到随机字符串明文,然后使用服务端公钥加密,发送给服务端验证
- 服务端收到客户端密文后,使用服务端私钥解密,解密后和生成的随机字符串对比,如果一致则登录成功,反之登录失败
PS: 秘钥的权限不能过大(私钥默认权限600,私钥谁生成谁保管),除了生成秘钥的用户,其他任何人包括该用户的拥有组都不能有查看权限
私钥进行加密
ssh 秘钥托管
秘钥托管 临时将 加密的私钥 导入到一个shell中,让其他用户临时使用这个shell,这个shell中的ssh将不会受到私钥密码的限制
ssh-agent bash 开启代理的shell程序
ssh-add 导入私钥的密码
exit 退出shell
ssh的安全配置
ssh的配置文件存在于/etc/ssh 目录中
其中 sshd_config 是服务端的配置文件 ssh_config 客户端配置文件
5.1 生成公私钥 ssh-keygen
生成公私钥,默认情况下,私钥和公钥分别保存在~/.ssh/id_rsa和id_rda.pub中
使用ssh-keygen生成
5.2 发送公钥到远程主机 ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip
使用ssh-copy-id -i ~/.ssh/id_rsa.pub root@远程主机将公钥会被保存到远程主机的~/.ssh/authorized_keys文件
5.3 设置私钥密码
1、生成私钥的时候避免私钥泄露,可以给私钥设置密码
2、在私钥有密码的情况下,将公钥发送给远程主机
3、访问远程主机,此时与远程主机已免密,但需要输入私钥的密码开启认真代理
6 sshd配置文件
sshd服务的配置信息保存在/etc/ssh/sshd_config文件中,部分配置解释如下
- 调整默认的远程端口 默认是22(绝对不能使用22) 等保2.0
a) vim /etc/ssh/sshd_config 将其中#Port 22 去掉#号 修改为其他不常用的端口
b) 关闭selinux和防火墙 setenforce 0(临时关闭selinux,下次开机继续启用) systemclt disable –now firewalld
c) 重启sshd服务 systemctl restart sshd - 调整ssh监听的IP地址,实现业务和管理分离
a) vim /etc/ssh/sshd_config 修改# ListenAddress 0.0.0.0 去掉#号将0.0.0.0 设置为 管理的IP地址
b) 重启sshd服务 systemctl restartsshd - 限制root用户远程登录
a) vim /etc/ssh/sshd_config 修改PermitRootLogin yes 将其中的yes改为no
b) 如果需要使用root ,则通过普通用户登录进来切换到root用户
c) 重启sshd生效 - 启用仅允许秘钥登录
a) vim /etc/ssh/sshd_config 修改 PasswordAuthentication yes 将yes改为no
b) 重启sshd - 允许空密码登录
a) vim /etc/ssh/sshd_config 修改 PermitEmptyPasswords yes 默认为no 如果为yes则用户没有密码可以直接登录
b) 重启sshd - 设置最大重试或失败次数以及最大的会话数
a) MaxAuthTries 6 默认最大重试次数或者失败的次数
b) MaxSessions 10 默认最大会话终端数
c) vim /etc/ssh/sshd_config 修改 MaxAuthTries 2 最大失败两次则断开连接 - 设置服务器上的所有用户使用同一把公钥来进行验证
a) vim /etc/ssh/sshd_config 修改 AuthorizedKeysFile 指向具体的公钥文件,则服务器上所有用户使用该秘钥验证
b) 重启sshd
重启sshd服务命令:systemctl restart sshd
第十六章 高级用户组和权限
学习目标:
1. 密码策略
2. 默认权限
3. 文件特殊的执行权限
4. 目录的特殊权限
5. acl权限
6. sudo提权
用户和组基础回顾
1. 用户名与uid映射
2 用户组和gid映射
3. 用户和组的信息存储在文本文件中
用户信息/etc/passwd
用户组信息/etc/group
用户密码文件/etc/shadow
用户组密码文件/etc/gshaow
1 监控登录
1.1 查看谁在登录:
监控在线的用户
w/who 查看在线的用户(当前正在使用的用户)
user:登录的用户名
tty:登录后系统分配的终端号(pts表示虚拟终端即远程登录)
from:远程主机名,即从哪儿登录的
login@:什么时候登录的
idle:用户空闲时间,一旦用户执行了任何操作,改计时器会重置
jcpu:和改终端(tty)连接的所有进程占用的时间,不包括过去的后台作业shijia你,但包括当前正在运行的后台作业占用时间
pcpu:当前进程(在what项目中显示的进程)所占用的时间
what:当前正在运行的进程的命令行
1.2 登录和重启的记录:last
last 查看历史登录成功和重启的记录 /var/log/wtmp
1.3 尝试登录失败:lastb
lastb 查看登录失败的记录 /var/log/btmp
1.4 最近的登录日志:lastlog
lastlog 最近登录的日志 (从当前系统启动开始)
1.5 密码策略文件:
/etc/login.defs 设置密码的有效期,用户的家目录,uid…
系统的默认权限(权限掩码)
2 默认权限
root的目录的最大权限是:777
root的文件的最大权限是:666
设置用户umask值用umask命令
普通用户的umask值是002
文件的权限664
目录的权限是775
root用户的umask值是022
配置文件/etc/bashrc
修改umask值,编辑~/.bashrc
添加:umask 值
文件 目录
root 644 755 权限严格
普通用户 664 775 权限宽松
Linux使用umask(权限掩码) 来管理系统的默认权限
Linux中文件最大的默认权限为666 是因为去掉x执行
Linux中目录最大的默认权限为777
在Linux中创建的任何一个文件 都不可能具有执行权限
最大权限 - umask = 默认权限
文件:
root 666 022 = 644
普通用户 666 002 = 664
目录:
root 777 022 = 755
普通用户 777 002 = 775
3 文件的特殊执行权限
3.1 suid:继承属主权限
- 只能作用在二进制程序上,不能用在脚本上
- 仅仅设置在文件上,设置在目录上没有意义
- 执行suid权限的程序时,此时用户将继承该程序文件的所有者权限
- SUID只能作用在二进制文件上,不能使用在shll脚本上
- 设置方法:chmod u+s file或者chmod 4755 file
样例:
1、普通用户不能在根目录创建文件夹
2、给mkdir程序添加suid权限
3、重新以user1的身份执行mkdir创建文件夹,可以发现此时可以在根目录创建文件,因为此时虽然看似是user1在执行mkdir,但实则是mkdir的拥有人(root)在执行,而root对根目录有权限,所以可以创建,且最终创建的文件的属主也继承了mkdir的属主
判断文件是否有SUID权限
ls –l 查看拥有人栏位的x栏位,如果x变成s 说明同时有x和s权限,如果是S则相应栏位没有x执行权限仅有suid权限
3.2 sgid:继承属组权限
设置在文件上
- 只能作用在二进制程序上,不能作用在脚本
- 设置在文件上,设置在目录上有其他含义
- 执行设置sgid权限的程序上时,此时用户将继承程序属组的权限
- 设置方法chmod g+x file 或者chmod 2755 fule
示例
1、将chmod命令复制一份并授权sgid
chmod g+s filename
2、利用拷贝的chmod命令已user1身份执行,可以看见新建的test文件夹的属主继承了拷贝命令mkdir的属主信息
判断目录或者文件是否有sgid权限
ls –l 如果拥有组栏位的s为小写 则说明有x和s权限,如果是大写仅有s权限
sbit:
公共目录,在该目录下任何人都可以创建文件,但是每个用户只能管理自己的文件
4 目录的特殊权限
4.1 sgid:继承属组权限
- 当一个目录拥有sgid权限时候,此文件下所有用户新建的目录和文件都将自动继承此目录的属组
- 设置方法:chmod g+s dir 或者chmod 2755 dir
示例
1、给文件filename赋予sgid权限
chmod o+t filename
已user1的身份在test2中创建目录或者文件,可以发现新文件的属组继承了test2
判断权限
ls –l 如果目录的其他人栏位,有小写的t表示同时有t和x权限,如果是大写T则仅有t权限
用数字来表示特殊权限: suid=4 sgid=2 sbit=1
4.2 stciky:每个用户仅能删除和重命名自己的文件和目录
- 对于一个多人可读写的目录,如果设置sticky,这每个用户仅能删除和重命名自己的文件和目录
- 设置在目录上,设置在文件上没有意义
- 用户在设置stick权限的目录下新建目录不会继承sticky权限
- 设置方法:chmod o-t dir 或者chmod 1777 dir;
样例:
1、给test3目录赋予stciky权限,并已user2创建文件
2、已user1身份创建文件,并测试删除user2文件失败
5 ACL权限:
- rhel8默认启用ACL权限
- 文件/目录的访问控制列表,可以针对任意指定用户和组进行rwx权限的精细化分配
- ACL 是为了弥补权限的不足通过ACL,可以再不改变基本权限的基础上(也就是不修改文件的拥有人、拥有组、其他人的权限)来给指定的用户或者是指定的组精确的分配权限
查看与设定
- ls -l查看权限
- 使用getfacl权限
- 使用setfacl设定
5.1 ACL权限查看与解释
- ls -l 查看少量的acl权限信息,
如下图所示,栏位表示该文件或者目录上有acl权限
[root@node1 tmp]# getfacl rhce.txt
#file: rhce.txt 文件名
#owner: root 拥有人
#group: root 拥有组
user::rw- 拥有人权限
user:lisi:rw- 额外用户(ACL用户)权限
user:zhangsan:r--
group::r-- 拥有组权限
mask::rw- 文件的权限掩码
other::--- 其他人权限
PS:如果一个文件或者目录设置acl后,该文件的拥有组权限将被mask(文件的权限掩码)接管(因此ls –l 看到的并不是文件拥有组的权限),权限掩码将决定acl的有效权限
- getfacl查看完整的权限设置信息
5.2 设置ACL权限
setfacl常用选项和语法
- setfacl -m 设置和修改acl权限,具体如下
- setfacl -m u:user:rwx file 设置指定用户的acl权限
- serfacl -m g🇮🇹rw- file 设置指定组的ACL权限
- serfacl -m u::rw- file 设置文件用户的ACL权限
- serfacl -m g::rw- file 设置文件用户组的ACL权限
- serfacl -m o::rw- file 设置其他用户的ACL权限
- serfacl -m m::rw- file 设置文件的mask的ACL权限
说明:
默认情况下,当修改或者删除acl权限时,系统会重新计算acl掩码,
为避免从新计算掩码,可以使用-n选项
或者在设置ACL权限时,时钟带上掩码设置(-m m::perms)
注意:
当文件设置了acl权限,chmod修改组权限时实际上是在修改掩码,而组的权限不会改变,需要使用setfacl -m g::rwx filename方式修改组权限
setfacl -x 删除指定用户和组的acl权限,具体如下
setfacl -x u:zhangsan file 删除指定用户的ACL权限
setfacl -x g:it file 删除指定用户组的ACL权限
setfacl -R 递归修改acl权限
setfacl -R -m u:zhangsan:rw- file
setfacl -b 清除所有的acl权限
setfacl -b file
5.3 ACL权限优先级
知识回顾:UGO权限优先级:UID==>GID==>Other
ACL权限优先级:UID==>指定用户权限==>GID==>指定组==>Other
- 如果以文件拥有者身份访问,这文件拥有者权限适用
- 如果访问用户身份证设置了acl权限,这用户的acl权限适用(最大不能超过掩码)
- 如果以文件属组的身份访问,或者访问用户的组设置了acl权限,则匹配响应的acl权限(最大不能超过掩码)
- 否则将使用其他人的权限
权限掩码说明:权限掩码可以指定[指定用户,组所有者、指定组]的最大权限,它不限制文件所有者或者其他用户的权限,所有设置了acl权限的文件和目录都有acl掩码
5.4 修改默认的ACL权限
acl的继承:
给一个目录设置默认的acl权限,则在该目录下创建的文件和子目录自动继承该acl
- 设置默认的acl
setfacl –m d:u:zhangsan:rwx redhat
给该目录设置一个默认的acl权限,让目录下的文件和子目录自动继承该目录的acl,但是文件不会继承x权限 - 删除默认的acl
setfacl –x d:u:zhangsan:rwx redhat 删除该目录的指定用户acl - 清空默认的acl
setfacl -k redhat 删除该目录的所有默认acl
6 sudo提权
6.1 sudo提权设置
- sudo是linux下常用的允许普通用户使用超级管理员用户权限的工具,可以减少root用户的登录和管理实践,提高安全性,
- sudo的配置文件:
- /etc/sudoers 在全局配置文件中定义
- /etc/sudoers.d/(新建文件)为某个用户创建一个单独的文件
- 编辑该文件最好使用visudo而不是vim,前者会检测语法,
/etc/sudoers 格式:
root ALL=(ALL) ALL
root: 表示配置提权的用户
ALL: 表示在哪一些主机上允许提权
(ALL): 表示提权到哪一个用户的身份
ALL:表示授权的命令/程序有哪些(命令或者是程序必须写绝对路径,如果是ALL表示授权所有的指令,也就是这个用户可以变成root)
语法规则:
user MACHINE = (RunAs) NOPASSWD:COMMANDS
用户名 被管理主机=(可以使用的身份) 授权名命令(必须绝对路径)
说明:NOPASSWD指执行sudo时不需要密码验证
- sudoers文件支持使用别名对同类对象进行分组,但组名必须全部大写,多个对象使用逗号隔开
- Host_Aias:主机别名:host_alias DBSERVERS= ser1,serer2
- User_Alias:用户别名:user_alias ADMINS= user1,user2
- Runas_Alias:在那些主机以谁的身份运行的别名:run_alias = root,ftp
- Cmnd_Alias:命令别名:cmnd_alias = /usr/sbin/useradd,/usr/sbin/userdel
PS: 别名需要大写
定义示例:
如下图所示,修改/etc/sudoers文件,并添加红色框内容,表示定义的USERS这个组(user1/user2/ftpuser)进行sudo提权时,可以使用任意主机提权到任意身份角色,然后执行useradd和whoami命令且不需要输入密码
6.2 sudo命令使用
sudo语法:sudo [选项] 命令
常用选项
-V显示版本号
-i 显示自己,(执行sudo的使用者)的权限
-k 将会强迫使用者在下一次执行sudo是询问密码,默认5分钟以内不需要密码
-b 将执行的命令放在后台
-u username/#uid 不加此参数代表要以root的身份执行指令,而加了此参数可以以指定的身份执行指令
示例
如下所示,切换到user1后,直接执行whoami时是当前user1用户,使用sudo进行提权后执行whoami返回的是root用户
第十七章 深入理解文件系统
1 文件系统设备
- 块设备
- 块设备:即块存储介质,常见块设备如下
- IDE设备:/dev/had,/dev/hdb…
- STAT/SAS/USB设备:/deb/sda,/dev/sdb…
- virto-blk:超虚拟化存储(部分虚拟机):/dev/vda,/dev/vdb…
- NVMe(SSD):/dev/nvme0,/dev/nvme1….
- 逻辑卷:/dev/mapper/*….
- 分区:指将硬盘的整体存储空间划分成的多个独立区域
- 文件系统:存储设备上组织文件的方法,文件系统是文件赖以生存的位置,文件只能存储在文件系统上
- 格式化文件系统:按照要求创建的一个文件系统结构
- 文件系统类型(可通过cat /proc/filesystems查看):
- 本地文件系统:ext2 ext3 ext4 xfs
- 网络文件系统:NFS CIFS
- 集群文件系统:GFS GFS2
- 分布式文件系统:CEPH
- 光盘:iso9660
2 查看文件系统的使用情况
- Disk Usage Analyzer(application-utilities)图形工具查看文件使用情况
-df查看已挂在的文件系统使用情况
-h:查看文件系统的使用情况,单位自动换算为M、G等,默认为K
-i:查看inode的使用情况
-T:查看文件系统类型
-du查看目录或者文件(多用于查看目录)的大小
-h:查看文件系统的使用情况,单位自动换算为合适的单位M或者G等,默认为K
-s:查看目录汇总大小
ll -h:查看文件大小,自适应单位
3 元数据(inode)
- inode表示文件系统上的所有文件的列表,系统通过inode号来找到文件实际的位置
- inode用来存储文件的元数据信息,包括如下:
- 文件类型,权限,uid和gid
- 文件的连接数
- 文件的大小和时间戳
- 文件的数据块(block)在磁盘上的块指针
- 文件的其他信息
3.1 目录和文件的关系
系统识别文件是通过inode,人识别文件通过文件名
文件名和inode的映射关系存放在目录中
3.2 cp和indoe的关系
执行cp过程中,系统过程如下
- 分配一个新的inode,并添加到inode表
- 在新的目标目录下,将该inode关联到新的文件名
- 将数据拷贝到新的文件
3.3 rm和inode的关系
- 连接数减去1后如果为0,那么回收该文件的inode
- 文件和inode的映射关系从目录中删除
- block会置为可用状态(但数据没有被抹掉,知道下次被其他数据覆盖)
- 连接数减去1后如果非0,那么保留改文件的inode
- 文件和inode的映射关系从目录中删除
- 数据保持不变(因为还有其他链接映射到这个数据)
3.4 mv和indoe的关系
- 在同一个文件系统内移动(即可以简单理解成在同一个分区内移动),该情况数据没有移动,保留部分元数据的属性信息(inode保持不变)
- 在新的目录下面创建一行记录,关联源文件的inode和新的文件名
- 删除旧目录下的改文件名和inode的映射关系
- 在不同文件系统内移动
相当于先执行cp然后执行rm(元数据属性发生改变)
4 硬链接
- 硬链接:即多个文件名指向同一个inode,(该特性限制硬链接不能跨文件系统)
- 语法:ln filename linkname
- rm 会减少文件的连接数,直到连接数变为0,文件才会被移除
5 软连接
- 软链接:一个文件指向另一个文件,是两个不同的文件(可以跨文件系统)
- 语法:ln -s filename linkname
- 跨文件系统、跨路径、使用绝对路径做软连接
6 文件类型
在linux中存在一下7种常见的文件类型
7 打包和压缩
常见压缩和解压缩工具:
gzip/gunzip 压缩速度快
bzip2/bunzip2 各项适中
xz/unxz 压缩率最高
7.1 ★ tar压缩和解压缩
tar -zcvf /root/etc.tar.gz /etc
-c:创建归档
-f:指定归档文件
-x:拆包(即解压)
-t:列出归档内容
-z:调用gzip压缩工具进行归档压缩,一般与czf搭配使用
-j:调用bzip2压缩工具归档压缩
-J:调用xz压缩工具归档压缩
-v:显示过程
-C:指定文件解压目录
8 ★ 文件系统的挂载与卸载
mount 挂载工具
语法:mount 设备 挂载点
示例:
挂载光盘:mount /dev/cdrom /media
挂载磁盘某分区 mount /dev/sdb1 /data
unmount 卸载工具
语法:umount 设备/挂载点
示例:
卸载光盘:umount /dev/cdrom或者unmount /dev/media
自动挂载
编辑/etc/fstab文件,按如下格式添加即可,
第十八章 软件包的管理
镜像站:
1、开源镜像站
2、ngbix.org
3、红帽官网
4、rpm搜索软件 https://rmpfind.net
5、在安装介质中找系统自带的rpm软件包
1 RPM和软件包
RPM软件包管理器最初由红帽开发,改程序提供了一种标准的方式来打包程序并发布,有关安装软件包的信息存储在各个系统的本地RPM数据库中,红帽为红帽企业Linux提供的所有软件都已RPM软件包的形式
RPM包的文件名由是个元素组成,再加上.rpm后缀名:name-version-release.architecture.rpm
Name:描述软件包的名字(coreutils)
Version:由原始包提供的版本号(8.30)
Release:基于改版本的软件包的发行版本号,有软件打包商提供(4.el8),其中4代表修订次数
Arch:编译软件包的处理器架构
1.1 rpm安装
语法: rpm [OPTION…] 必须跟完整的路劲
查看修订信息:rpm -q --changelog name.rpm
[root@ycf-rehhat-9 ~]# rpm -q --changelog vsftpd
* 三 10月 27 2021 Artem Egorenkov <aegorenk@redhat.com> - 3.0.3-49
- add option to disable TLSv1.3
- Resolves: rhbz#1954682
* 三 10月 13 2021 Artem Egorenkov <aegorenk@redhat.com> - 3.0.3-48
- ALPACA fix backported from upstram 3.0.5 version
- Resolves: rhbz#1975647
* 二 8月 10 2021 Mohan Boddu <mboddu@redhat.com> - 3.0.3-47
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
常用选项:
-i:安装
-v:verbose查看详细信息
-h:查看进度条
-e:erase移除软件包
-F:升级已经安装过的软件包
-U:升级和安装软件包
--replacepkgs:重新安装,相当于force
--oldpackage:安装旧版的软件包
--replacefiles:忽略冲突
--nodeps:负略依赖关系
1.2 rpm查询
-q:查询软件包是否安装
-qa:查询已安装的软件包
-qi:查询软件包的信息
-ql:查新安装改软件后会生成的文件
-qc:chaxu你软件包的配置文件
-qd:查询软件包的帮助文件
-qf:查询文件来自于那个软件包
-q --script查询安装或者和删除软件包时运行的脚本
-q --chagelog:查询软件巴伯的变更日志
-qp [-ilcdR –scripts --changelog] rpmfile:查询本地软件包的相关信息
rpm2cpio rpmfile | cpio -id:从rpm软件包中提取文件,而不安装此软件
rpm2cpio rpmfile |cpio -tv:列出rpm软件包中的文件
1.3 rpm软件包校验
对已安装的软件包进行文件校验
rpm -V package 检查某个已经安装软件包的文件
rpm -Vp rpmfile 检查某个rpmfile软件包的文件
rpm -Va 检查系统中所有软件包的文件
在安装包之前进行签名校验
rpm --import RPM-GPG-KEY-redhat-release 用户导入秘钥
rpm -qa gpg-pukey 查询已安装的秘钥
rpm -e gpg-pubkey 卸载已安装的秘钥
rpm -K rpmfile用rpm手动校验文件的完整性
2 yum
2.1 yum简介
Yum(Yellow dog Updater, Modified)是 RPM 的前端工具,Yum 可以从指定的 软件包仓库搜索、下载、安装软件包,并自动处理依赖关系,自动安装所有依赖 包。执行 yum 命令需要管理员权限(root)。
由于 Yum 中许多长期存在的问题仍未得到解决,因此 Yum 包管理器已被 DNF 包 管理器取代。DNF(Dandified Yum)是新一代 的 RPM 软件包管理器。DNF 使用 libsolv 进行依赖解析,由 SUSE 开发和维护,旨在提高性能。DNF 包管理器克服 了 YUM 包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行 速度等多方面的内容。
DNF 的命令行接口基本保持了与 Yum 相兼容,主要命令可以像使用 Yum 一样使 用 DNF;而且现在的诸多发行版中 yum 已经仅仅是 dnf 的一个链接文件了
2.2 yum配置
yum仓库配置文件位于/etc/yum.repos.d/*.repo中,
例如如下所示
[root@ycf-rehhat-9 ~]# ls -l /etc/yum.repos.d/redhat.repo
-rw-r--r--. 1 root root 88462 5月 27 16:27 /etc/yum.repos.d/redhat.repo
[root@ycf-rehhat-9 ~]# vim /etc/yum.repos.d/redhat.repo
[BaseOS]
name=BaseOS
baseurl=http://mirrors.cloud.aliyuncs.com/$contentdir/$stream/BaseOS/$basearch/os/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
注意:在红帽企业Linux8后提供了两个主要的软件存储库,分别为BaseOS和应用流AppStream,在配置yum时应注意两个都配上
完成以上配置后执行
[ycf@ycf01 ~]$ yum clean all 清空缓存
[ycf@ycf01 ~]$yum makecache 执行重新生成缓存
2.3 yum安装、升级以及移除软件包
安装
[root@hostneme ~]#yum insall package 安装软件包
[root@hostneme ~]#yum group install “packagegroup” 安装软件包组(大部分软件包组名带有空格,需用引号包含)
[root@hostneme ~]#yum reinstall package 重新安装软件包
[root@hostneme ~]#yum update [package] 升级
移除
[root@hostneme ~]#yum remove package 移除软件包
[root@hostneme ~]#yum group remove “packagegroup” 移除包组
2.4 yum查询
列出软件包的信息
[root@hostneme ~]#yum repolist all #列出所有的仓库信息
[root@hostneme ~]#yum list #列出仓库里的所有软件包
[root@hostneme ~]#yum install package #安装软件包
yum list available | updates | installed #分别列出未安装、待更新和已安装的软件包
[root@hostneme ~]#yum info package #查看软件包的信息
[root@hostneme ~]#yum group info "packagegroup" #查看包组的信息
[root@hostneme ~]#yum group list #列出所有的包组
搜索文件和软件包
[root@hostneme ~]#yum search httpd #查找与http相关的软件包
[root@hostneme ~]#yum provides filename #查找文件来自于哪个包
[root@hostneme ~]#yum cearch keyword #查找与keyward相关的软件包
所有安装和删除事务的日志记录在/var/log/dnf.rpm.log中
查询软件包的历史记录
[root@hostneme ~]#yum history #查看yum的执行记录
[root@hostneme ~]#yum history list 包名 #历史记录中搜索某个软件包
[root@hostneme ~]#yum history info 4 #查询第四个历史记录的信息
[root@hostneme ~]#yum history undo7 #撤销事务
2.5 创建私有yum源
- 下载rpm包或者将已有rpm包放在一个新目录,例如:/opt/httpd
- 执行yum install -y createrepo 安装该软件,用于生成软件包的索引信息
- 执行createrepo -v /opt/httpd 生成索引信息到repodata目录
此时当前目录及是一个合适的yum源目录可以在repo文件进行配置,或者将文件目录打包发给其他服务器使用
2.6 模块流概念
红帽企业Linux8引入了应用流的概念,可以实现同时提供发现版本的多个版本,他们可能比核心操作系统的包更新更频繁
系统提出了两个主要的软件存储库,分别为BaseOS和应用流AppStream
模块:是一组属于一个整体,协调一致的rpm软件包,电信的模块可以包含应用的软件包和依赖的软件包,应用文档的软件包等
每个模块可以具有一个或者多个模块流,其中把含不同版本的内容,每个流独立接收更新,对于每个模块只能启动一个流并提供他的软件包,版本可以同时存在但是不能同时使用
模块配置文件:每个模块可以有一个或多个配置文件,配置文件是要为特定的应用一起安装的某些软件包的列表,安装特定的模块配置文件只是从模块流安装一组特定的软件包,如果为指定配置文件,模块将安装他的默认配置文件
安装和移除模块流
[root@hostneme ~]#yum module list 查看 yum 源中有哪些模块流
[root@hostneme ~]#yum module info nginx:1.16 查看 nginx 模块流包含的软件包信息
[root@hostneme ~]#yum module info --profile nginx:1.16 查看 nginx 模块流的配置文件
[root@hostneme ~]#yum module install nginx:1.16 安装 nginx 模块流
[root@hostneme ~]#yum module remove nginx:1.16 卸载 nginx 模块流
开启和禁用模块流体
[root@hostneme ~]#yum module enable nginx 开启模块流(安装后默认开启)
[root@hostneme ~]#yum module disable nginx 关闭模块流(卸载后模块流仍然开启,需手动关)
切换模块流
[root@hostneme ~]#yum module remove nginx:1.16 ①删除模块流
[root@hostneme ~]#yum module reset nginx:1.16 ②重置模块流
[root@hostneme ~]#yum module install nginx:1.18 ③安装新的的模块流
注意:如果不删除模块流,直接产值模块流在安装其他模块流时,相对于的软件包会进行升级或者降级操作,建议不要直接安装,因为升级脚本在安装期间运行,从而破坏原始模块流,这可能会导致数据丢失或者损坏其他配置文件
3 源码安装
- 下载源码包并上传到服务器指定位置后解压
[root@hostneme ~]# wget https://nginx.org/en/download.html
- 配置编译环境
[root@hostneme ~]#yum install gcc gcc-c++ make unzip pcre pcre-devel zlib zlib-devel libxml2 libxml2-devel readlinereadline-devel ncurses ncurses-devel perl-devel perl-ExtUtils-Embed openssl-devel
- 配置及编译
[root@hostneme ~]#rpm -qa | grep make #查看下载文件
make-4.2.1-10.el8.x86_64
cmake-fiesystem-3.18.2-9.el8.x86_64
[root@hostneme ~]#tar -zxvf nginx-1.23.3.tar.gz . #解压出来当前目录
- [root@hostneme ~]#./configure --prefix=安装路径 --其他配置
- [root@hostneme ~]#make -j 4 #编译并指定参与编译的cpu核心数
- [root@hostneme ~]#make install #安装
- [root@hostneme ~]#/usr/安装路径 #启动服务(有些服务器需要关闭防火墙)
第十九章 服务管理和系统启动流程
1 systemd简介
systemd守护进程管理linux启动,一般包括服务的启动和管理,他可以在系统引导时以及在运行中的系统中激活系统资源,服务器守护进程和其他进程
守护进程是在执行各种任务的后台等待或者运行的进程,一般情况下在系统引导时自动启动并持续运行至关机或者手动停止,按照管理,许多守护进程的名称已d结尾
在红帽企业Linux中,第一个启动的进程(PID1)是systemd,如下是systemd提供的功能项
- 并行功能(同时启动多个服务),可以提高系统启动速度
- 按需启动激活进程
- 自动服务器依赖管理
2 systemd描述服务单元
system使用单元俩管理不同类型的对象,使用systemctl -t type来查看可用的单位类型,常用如下
3 systemd目标(target)
system目标是一组系统应用启动达到所需状态的systemd单元,即系统运行级别,以下是常见重要的target
查看默认启动的运行目标:
[root@hostneme ~]#systemctl get-default
3.1 切换当前的运行目标(临时):
systemctl isolate name.target,例如systemctl isolate multi-user.target(注意:切换到某个运行目标时,会停止对该目标不需要的服务单元,并且启动该目标需要的服务单元,虚拟机会卡很久)
在rhel7以前使用runlevel查看运行级别,init切换 5图形 3文本
3.2 设置下次开机的运行目标:
systemctl set-default name.target
例如:systemctl set-default multi-user.target
3.3 在系统启动时更改启动目标,具体步骤如下
重启系统
将光标移动到要启动的内核
按e编辑当前条目
将光标移动到linux开头的行,此为内核命令行
添加systemd.unit=name.target
按ctrl+x继续启动
4 systemctl管理服务
4.1 服务查看
[root@hostneme ~]# systemctl list-unit-files --type service #查看所有已安装的单元文件状态。
[root@hostneme ~]# systemctl list-units --type service
#systemctl list-units命令列出systemd服务解析并加载到内存中的单元,用--type筛选单元类型(--all输出所有单元包括未激活)
UNIT:服务单元名称
LOAD:systemd是否正确解析了单元的配置项,并将该单元加载到内存中
ACTIVE:单元的最高级别激活状态,此信息表明单元是否已经启动成功
SUB:单元的最低级别激活状态,信息视单元类型、状态和单元的执行方式而异
DESCRIPTION:单元的简单描述
systemctl list-unitfilesmingl 列出所有已安装的单元文件状态(包括已安装但未启用的服务)
STAT的类型
enabled:系统音高时启动
disabled:未设置为系统引导启动
static:无法启动,但可以通过其他的单元引导启动
masked:无法启动,也无法被其他单元引导启动
4.2 服务器启停及状态查看
启停及重启服务
systemctl {start | stop |reestart | reload} name.service
设置服务器开机自启动或者禁用开启自启
systemctl enable/disable name.service
查看服务当前状态
systemctl status name.service
查看服务器启动状态
systemctl isactive name.service
systemctl is-enabled name.service
[root@hostneme ~]# systemctl is-enabled dnf-system-upgrade.service
enabled
[root@hostneme ~]# systemctl is-active dnf-system-upgrade.service
inactive
- 重新加载服务
systemctl reload name.service 重新加载配置文件而不重启服务
systemctl reload-or-restart name.service 重新加载配置文件,如果不支持这重启服务 - 屏蔽服务、设置服务开机时启动或者不启动
systemctl mask name.service 为防止系统服务之间冲突,可以屏蔽某个服务,防止管理员意外启动与其他服务冲突(说明:禁用disabled的服务可以手动启动,或者通过其他单元文件启动,但不会在系统开机时自动启动,屏蔽的服务无法手动启动,也不会手动启动)
systemctl unmask name.service 取消屏蔽服务
说明:禁用disabled的服务可以手动启动,或者通过其他单元文件启动,但不会在系统开机时启动。屏蔽的服务无法手动启动,也不会自动启动。
4.3 查看服务依赖关系
systectl list-dependencies sshd.service 列出启动服务器时所需的依赖项的层次结构
[root@hostneme ~]# systemctl list-dependencies sshd.service
sshd.service
● ├─system.slice
● ├─sshd-keygen.target
● │ ├─sshd-keygen@ecdsa.service
● │ ├─sshd-keygen@ed25519.service
● │ └─sshd-keygen@rsa.service
● └─sysinit.target
● ├─dev-hugepages.mount
● ├─dev-mqueue.mount
● ├─dracut-shutdown.service
● ├─import-state.service
● ├─iscsi-onboot.service
● ├─kmod-static-nodes.service
● ├─ldconfig.service
● ├─loadmodules.service
● ├─lvm2-lvmpolld.socket
● ├─lvm2-monitor.service
● ├─multipathd.service
● ├─nis-domainname.service
● ├─plymouth-read-write.service
● ├─plymouth-start.service
.....
4.4 重新启动和关闭系统
systemctl poweroff 关闭系统,可以直接使用poweroff
systemctl reboot 重启系统,可以使用reboot代替
4.5 systemd 目标(target)
systemd 目标是一组系统应启动达到所需状态的systemd单元,即系统运行级别,下列表列出了
5 系统启动流程
开机上电→硬件自检(cpu,内存等)→读取BIOS(最小化的输入输出系统)上的启动项(硬盘/光盘/网络等)→在启动项上找到引导记录(引导记录存在硬盘上的0扇区的前446个字节,通常是MBR记录)→引导程序(446字节中存在硬盘上的可可执行代码,在linux中这个程序叫grub2)→引导程序加载启动分区的引导菜单(这个菜单在grub.fg文件中定义,boot作为根目,这个根和系统中的/没有任何关系)→选择指定的菜单启动→内核加载文件系统和initramfs→initramfs中的pid为1的进程(init或者systemd)将真正的根挂载到/sysroot→内核将initramfs的根切换到真正的根→内核执行真正根中的systemd→用户得到运行级别
6 系统内核
6.1 查看内核启动项信息
查看默认启动内核:grubby –default-kernel
查看系统内核启动信息
--info=all可以查看所有内核启动项
启动信息在/boot/loader/entries目录下
6.2 修改默认内核启动项
修改默认启动内核
方法一:根据菜单栏的索引号设置,从0开始
方法二:绑定特定版本内核
内核参数定义在/etc/default/grub
可以设置菜单的超时时间,内核参数在linux这一行
注意:使用vim修改该文件需要执行grub2-mkconfig -o /boot/grub2/grub.cfg更新才会生效
命令行修改内核参数
添加和修改参数--args,删除参--remove-args
7 系统修复
7.1 修复/boot/grub2/grub.cfg文件
在rhel8中,/boot/grub2/grub.cfg文件丢失或者损坏,系统无法正常启动(因为文件丢失而无法找到grub2上的引导菜单),修复步骤如下
- 重启系统会暂停在grub界面,需要手动指定./boot目录所在的分区(引导分区只会在硬盘的第一个分区,一般在第一块硬盘)
-
加载内核文件(支持tab键补齐),并以只读方式加载根分区,注意,root=/dev/nvme0n1p1设定的是系统真正的根分区,这个需要咨询之前的管理员或者根据经验由磁盘类型判断:注意:生产环境做了逻辑卷:/dev/mapper/centos-root或/dev/mapper/rhel-root
-
指定initramsf文件(支持tab键补齐)
-
启动:boot
-
进入系统头重新生成/boot/grub :
grub2-mkconfig -o /boot/grub2/grub.cfg
7.2 重置root密码
原理:在rhel8中,可以使用initramfs运行的脚本在某处暂停,并提供shell,然后在该shell下继续并执行,这主要是为了进行调试,也可以用该方法来重置丢失的root密码
-
重启系统,进入引导菜单后选择内核,按e边界但前条目
-
找到linux开头的行,删除ro后的内容并添加 rd.break,该参数代表在系统刚启动加载完initramfs后中断系统(此时系统文件已加载)
-
按ctrl+x继续启动,进入initramfs系统
-
但此时initramfs挂载的根/sysroot目录是只读,所以我们需要重新以读写的方式挂载根目录
-
切换至真正的操作系统的根(因为我们上一步还处于initramfs系统的根,也被成为是假根)
-
修改密码
-
重新打标签,因为上一步的操作会被系统认为是非法操作而禁止下一次开机,所以需要让selinux放行,也就是重新打标签 (touch /.autorelabel),.autorelabel记不得怎么写可以用man Selinux 搜索auto就会出来
-
连续两次exit退出根目录以及initramfs系统,以便继续启动系统,中途可能会因为重新打标签而等待一段时间(视机器性能而定,一般不超过5分钟)
7.3 修复文件系统
/etc/fstab中的错误和损坏的文件系统可能会组织系统的启动,系统会进入需要提供root密码的紧急修复模式,以下情况是常见的文件系统问题
- 文件系统损坏
- /etc/fstab中引用的设备不存在
- /etc/fstab中挂载点不存在(8.4后会自动修复)
- /etc/fstab中的文件类型书写错误(8.4后会自动修复)
- /etc/fstab中的挂载选项错误
修复步骤
1. 紧急模式:进入输入root密码,进入紧急模式
2. 执行mount -a将/etc/fstab中没有挂载的文件系统挂载一遍,来定位出错的条目
3. vim /etc/fstab 通过删除或者注释错误行
4. 重启系统进入到正常模式的系统,进行错误内容修正
7.4 Boot loader损坏修复
硬盘的前512字节中的前446存放的是引导记录,447-512字节存放分区表信息,如果前446丢失可以修复,但如果前512丢失且没有分区表备份则从软件层面无法修复
备份硬盘前512字节并另存为MBR文件:
dd if=/dev/nvme0n1 of=MBR bs=512 count=1
删除某个硬盘的前446字节:
dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1
修复步骤:
1. 删除引导程序,模拟破坏
dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1
2. 加入光盘,选择从光盘进入救援模式
3. 切换至真正的系统根文件
4. 修复引导程序 grub2-install /dev/nvme0n1 注意这个位置是原本系统真正的根目录
5. 连续两次exit退出救援模式并从本地启动系统,等待系统重新打标签即可
7.5 分区表被损坏修复(即硬盘前512字节损坏)
注意:该情况必须要有硬盘分区表备份才可以修复
备份前512字节,即分区表,并将文件上传到异地服务器
dd if=/dev/nvme0n1 of=128.MBR bs=512 count=1
修复步骤
1. 模拟分区表丢失:删除前512字节
dd if=MBR of=/dev/nvme0n1 bs=512 count=1
2. 通过光盘进入救援模式,按1继续,此时光盘并找到系统并挂载
3. 进入救援系统后发现硬盘分区也丢失
4. 配置网卡:nmcli de con ens160 激活网卡,使用scp将备份在远程的分区表拉取到本地
scp root@192.168.195.127:/opt/128.MBR ./
5. 恢复分区表数据到本地磁盘,即将分区表内数据拷贝到分区的前512字节
dd if=128.MBR of=/dev/nvme0n1 bs=512 count=1
6. exit并重启系统
7. /boot分区被删除的修复
修复步骤
8. 模拟删除/boot目录
9. 加入相同版本的光盘,选择从光盘进入救援模式
10. 切换至真正的系统根文件
11. 挂载光盘并配置本地yum源
12. 将所有内核的包安装一遍 yum reinstall kernel* -y
13. 修复引导程序 grub2-install /dev/nvme0n1 注意这个位置是原本系统真正的根目录
14. 修复grub.cfg文件:grub2-mkconfig -o /boot/grub2/grub.cfg
15. exit退出 reboot重启
第二十章 系统日志和时间设置
1 系统的日志服务
- systemd-journald服务(临时日志)
- 操作系统时间日志架构的核心
- 手机来自于包括内核,早期引导阶段,进程启动、运行时的标准输出和错误输出以及syslog时间等
- 保存在二进制的日志文件中(/run/log/journal/id/system.journal),但是重启后不保存
- rsyslog服务(永久保留)
rsyslog服务使用日志消息的类型和优先级来确定该如何处理,配置文件在/etc/rsyslog.conf和/etc/rsyslog.d/*.conf中,帮助信息可以查看rsyslog.conf和syslog(3)帮助章节 - rsyslog对syslog消息进行排序,并写入日志文件中(var/log/)
- rsyslog会根据每条消息的类型以及优先级,将日志消息写入到特定的日志文件
- 重启依然保存
2 系统日志文件
系统日志文件保存在/var/log/下面(在/etc/rsyslog.conf配置),一下是一些重要的日志文件
- /var/log/messages 大多数系统日志消息记录在此处,包括记录服务信息以及系统报错等
- /var/log/secure 与安全性和省份验相关的日志
- /var/log/cron 与定时任务相关的日志
- /var/log/mailog 与系统中邮件服务有关的日志
- /var/log/boot.log 与系统启动相关的日志
- /var/log/dnf.log 与yum/dnf有关的日志
3 日志消息的类型(facility)
facility:设施,从功能或者程序上对日志进行分类,并由专门的工具进行记录日志,常用的facility如下:
lpr:打印相关的日志
auth:认证相关日志
user:用户相关日志
cron:计划相关日志
kern:内核相关日志
mail:邮件相关日志
daemon:系统服务相关日志
authpri:授权相关日志
security:安全相关日志
local0-local7:自定义相关日志
4 日志消息的优先级
5 自定义日志规则
日志定义格式 facility.priority target,示例
6 阅读日志信息
日志消息在文件的末尾显示最新的消息,rsyslog服务在日志文件中采用一种标准的格式进行记录,以/var/log/secure日志中的日志消息为例
① :记录日志产生的时间戳
② :发送日志消息的主机名(主机部分)
③ 发送日志消息的程序或者进程名称以及pid
④ 日志消息内容
7 手动发送sysog日志
logger命令可以发送消息到rsyslog服务,默认情况下,它的优先级为notice,其常用选项如下下
-p 指定输入消息的类型和优先级,格式为”facility.level” 例如:-p mail.info
-t:指定类型,格式为facility 例如 -t mail
-i:在每一行都记录pid
示例:
8 日志服务器收集日志
rsyslog是一个cs架构,可以基于tcp和udp工作,默认的监听端口是514,其中服务端配置如下
服务端配置
1. 修改服务端配置,打开服务监听端口
2. 重启服务器
3. 关闭防火墙或者放行指定端口
客户端配置
1. 修改配置文件/etc/rsyslog.conf
如上图所示,新增红色标记内容,表示将所有类型的info级别及其以上级别日志转发给192.168.40.10服务器,其中@表示使用udp协议,@@表示使用tcp协议
2. 重启服务
3. 关闭防火墙或者放行指定端口
4. 测试
5. 在服务端查看日志
9 日志轮循
logrotate工具会轮循日志文件,防止日志文件占用过多的系统空间,
轮循日志文件时,会使用日期作为文件的扩展对其重命名
配置文件为:/etc/logrotate.com和/etc/logrotate.d/*
帮助信息参考logrotate(8)帮助章节
10 检索系统日志消息
system-journald服务将收集到的日志消息存储在/run/log下面,改内容在系统重启后将被清除
Jornalctl命令突出显示重要的日志消息,优先级为notice或者warning的消息显示为粗体文本,优先级为error或者以上的则显示为纯红色文本
常用选项:
-n:指定显示末尾几条消息,默认最后10条
-f:与tail -f命令相似,ctrl+c退出显示
-p:指定显示某个优先级以上的日志 例如:journalctl -p debug
--since,--until:限制特定的时间段,时间格式”YYYY-MM-DD hh:mm:ss”或者yesterday,today,tommorow这样的时间参数,例如:journalctl --since today
-o verbose:查看日志的详细信息
根据日志的关键字段查询
_PID:根据进程的id来查询,例如 journalctl _PID=1
_UID:运行该进程的用户ID
_SYSTEM_UNIT:启动该进程的systemd单元
_COMM:指定命令的名称
_EXE:进程的可执行文件的路径
11 ★永久保留系统日志(journal)
- 默认情况下,系统日志保存在/run/log/journal目录中,但重启后日志会被清除,可以在/etc/system/journald.conf中修改服务的配置
- /etc/system/journald.conf中的storage参数决定系统日志是易失性还是持久性,改参数可以设置为persistent/volatile/auto
- persistent:将日志保存找/var/log/journal目录中持久保存,若目录不存在则自动创建
- volatile:将日志存在易失目录/run/log/journal中,临时保存
- auto(默认):如果/var/log/journal目录存在则保存在该目录持久保存,否则易失存储
修改配置
-
修改配置文件
-
重启服务
-
验证
说明:/var/log/journal下面生成的日志虽然叫持久保存,但并非真正意义上的永久保存,该日志遵循systemd-journald轮循机制,每月/周/日触发,日志有大小和个数限制
12 设置系统时间
timedatectl命令简要显示当前的时间信息,
timedatectl list-timezones列出所有的时区
timedatectl list-timezone Asia/Shanghai 设置时区为伤害
timedatectl set-time “2023-04-08 21:12:23” 修改日期和时间
13 ★网络时间配置(NTP)
红帽7以前使用ntp作为时间同步,之后使用chrony作为时间同步工具,但都统称为NTP
13.1 本机作为客户端
示例:本机作为客户端,从上层时间服务器(ntp.aliyum.com)同步时间设置
在配置文件/etc/chrony.conf中添加ntp服务器
server 时间同步服务器地址 iburst
重启时间服务,并验证,*代表已经同步成功
13.2 本机作为服务端
编辑配置文件/etc/chrony.conf配置,开放以下下两个配置项
local stratum 10 表示不从任何时间服务器同步时间,本机作为事件源
allow 192.168.0.0/16 表示运行该范围内的服务器从本机同步时间
重启服务器即可
第二十一章 内核监控和配置
- Linux内核是操作系统的核心部分
- 内核的功能
- 系统初始化:检测硬件资源并启动系统
- 进程调度:决定进程什么时候运行以及运行多久
- 内存管理:给运行进程分配内存
- 安全:支持权限,selinux和防火墙规则firewalld
- 提供buggers和cache加速硬件访问
- 支持标准网络协议和文件系统(nfs、xfs、ntfs)
- 参考文档可以安装kernel-doc的RPM软件包
1 内核组成
多个内核版本可以共存
内核组成如下
/boot/vmlinuz-version 启动时候用到的内核
/boot/initramfs-version.img 启动时提供的必要的内核模块
/lib/modules/version/ 内核模块
2 虚拟文件系统/proc
显示信息
进程信息 /proc/PID
cpu信息 /proc/cpuinfo
内存资源 /proc/meminfo
磁盘信息 /proc/partition
3 sysctl配置内核参数
内核的参数就像内核的开关一样,通过设置内核的参数来达到开启开关的作用
- 当前生效的内核参数在/porc/sys下
- 内核参数配置文件/etc/syctl.conf和/etc/sysctl.d/*.conf系统启动时读取
- sysctl命令使用
- 列出当前生效的所有内核参数 sysctl -a
- 临时修改内核参数 sysctl -w net.ipv4.ip_forward=1
- 时配置文件生效 sysctl -p
4 性能调优的思路
架构升级——>硬件升级——>代码升级——>配置优化
成本高 ————————————————成本低
最有成效—————————————— 但是成效最低
4.1 ★tuned调优工具
-
查看所有的调优配置文件 tuned-adm list
-
配置文件位于/usr/lib/tuned目录下,修改配置文件后需要重启tuned服务,示例如下
1. 复制其他配置文件夹及配置文件:
[root@ycf01 tuned]# cp -r /usr/lib/tuned/virtual-host/ /usr/lib/tuned/ycf01
2. 修改配置文件描述及添加内核参数项
3. 重启tuned服务
[root@ycf01~]# systemctl restart tuned
4. 修改当前调优配置文件
[root@ycf01 ~]# system -a|greo migration
5. 验证内核参数
[root@ycf01 ~]# sysctl -a|grep migration
kernel.sched_migration_cost_ns = 5000
kernel.timer_migration = 1
常用命令
[root@ycf01 ~]# tuned-adm recommend 查看推荐调优配置文件
virtual-guest
[root@ycf01 ~]# tuned-adm profile virtual-guest 修改系统当前使用的调优配置文件
5 /dev/下面的设备
/dev目录中包含了所有linux系统中使用的外部设备,但这里并不是放的外部设备的确定程序,他实际上是一个访问这些外部设备的接口
设备文件类型
块设备(b):/dev/sda /dev/sdb /dev/nvme0n1 /dev/nvme1n1
字符设备(c):/dev/null /dev/zero
设备文件的版本
major:主版本号,表示设备类型
minor:此版本号,文件编号
创建设备文件
mknod name type major minor
6 内核模块
linux内核是模块化组成的,它允许内核在运行时间动态地向其中插入或者从中删除代码,这些代码被一并组合在一个单独的二进制镜像中,简称为木块,模块位于/lib/modules/version/
- 模块机制的优点
减小基本内核镜像大小,可选的功能和驱动程序利用模块形式再提供,增加系统灵活性
动态加载内存模块,扩展内核功能,不需要时间卸载模块
节省开发时间,修改内核,不必重新编译内核 - 模块机制的缺点
使用不当会导致系统崩溃
7 内核模块相关命令
查看系统已加载的内核模块:#lsmod
查看内核模块的信息:#modoinfo 模块名
加载内核模块:#modprobe 模块名
卸载内核模块:#modprobe -r 模块名
第二十二章 磁盘管理
1 磁盘分区
将磁盘划分为逻辑存储单元,这些单元成为分区,对不同的分区执行不同的功能
1.1 分区方案
注意:频繁分区时可能存在内核没有读取到分区信息的情况,执行以下命令可以刷新
partx 块设备 ,例如:partx /dev/sda 刷新内核读取sda磁盘分区信息
partprobe 刷新内核读取所有磁盘分区表
-
MBR分区方案
· 分区类型:主分区+扩展分区和逻辑分区
· 限制:最多4个主分区,磁盘最大支持2TB
· 只有首部有分区表信息, -
GPT分区方案
· 使用全局唯一表示符GUID来识别磁盘和分区
· 限制:最多支持129个分区,磁盘最大支持8ZiB
· 在首尾各有一份分区信息(尾部为备份)
1.2 分区工具
1.2.1 parted
- parted工具创建MBR分区
注意:parted命令更改会立即生效,错误使用parted命令会导致数据丢失,mklabel命令会擦除现有的分区表,修改后无法访问之前的数据
注意:parted工具并不能直接提供分区大小,分区大小size=end-start,分区的单位可以指定s(扇区)或者GB、TB,默认是MB
-
parted工具无交互创建MBR分区
-
parted工具无交互创建GPT分区
-
parted工具删除分区
1.2.2 fdisk
fdisk工具的使用(在rhel8中fdisk支持创GPT分区)
· fdisk -l查看磁盘分区信息
· fdisk -l 设备名称,查看指定设备的信息
· fdisk 设备名称 对设备进行分区
常见命令:
· n:创建新的分区
· d:删除分区
· p:打印分区
· t:修改分区id
· w:保存退出
· q:不保存退出
1.2.3 gdisk(GPT)
- gdisk -l 查看gpt分区信息
- gdisk 设备名称 对设备镜像分区
- 常用命令与fdisk类似
2 格式化文件系统
红帽企业Linux支持许多不同的文件系统类型,其中最常见的两种是xfs和ext4,rhel8默认xfs
格式化工具使用mkfs,语法:mkfs.文件系统类型 磁盘分区
示例:
mkfs.xfs /dev/sdb1
mkfs.ext4 /dev/sdb1
mkfs.ext3 /dev/sdb1
3 挂载文件系统
3.1 手动挂载
命令语法:mount device mount_point
mount:直接执行mount可以查看系统已经挂载的设备
device:需要挂载的设备,
· 设备文件,比如磁盘
· 卷标:-L label 类似磁盘分区的别名
· UUID:-U UUID
mount_point:指定挂载点,需要先创建
常用选项
-t:指定文件系统类型
-r:只读挂载
-w:读写挂载
-a:自动挂载所有支持自动挂载的设备(定义在/etc/fstab文件中且支持自动挂载功能)
-L:使用卷标指定挂载设备
-U:使用UUID指定挂载设备
-o:options:指定挂载选项
· async:异步模式
· sync:同步模式
· atime/noatime:是否更新atime包含目录和文件
· auto/noauto:是否支持自动挂载
· exec/noexec:是否支持文件系统上的可自行文件运行
· dev/nodev:是否支持在此文件系统上使用设备文件
· suid/nosuid:是否支持suid权限
· remount:从新挂载
· ro/rw:只读或者读写挂载
· user/nouser:是否允许普通用户挂载此设备
· defaults:默认挂载选项,包含(rw,suid,dev,exec,auto,nouser,add asybc)的组合
3.2 自动挂载(永久挂载)
- 文件系统自动挂载的配置文件在/etc/fstab
- 每一行定义一个要挂载的文件系统
解释:
-
要挂载的文件系统(设备):设备文件,设备的UUID或别名(LABEL)或设备路径(/dev/sdb1)
-
挂载点:即需要将设备挂载到系统的什么地方,改路径需提前创建(8.4后不存在会自动创建)
-
挂载选项:default, 认挂载选项,包含(rw,suid,dev,exec,auto,nouser,add asybc)的组合
-
存储频率:默认为0,不备份
-
自检顺序:用fsck按顺序检查文件系统,对于ext4文件系统该值为1,其他的ext4文件系统设置为2,对于xfs文件系统改值设置为0,因为xfs不用fsck检测
执行挂载
mount -a:挂载/etc/fstab中所有支持自动挂载但还未挂载的文件系统
mount /data :挂载/etc/fstab中挂载点为/data的记录
4 卸载文件系统
卸载命令:
#umount device
#umount mount_point
查看正在访问挂载点文件系统的进程
#fuser -v mount_point
终止所有正在访问指定文件系统的进程
#fuser -km mount_point
5 交换分区管理
5.1 配置交换分区
- 内核使用交换分区空间,保存内存中暂时不活动的数据,如果内核重新访问这部分数据,会将这部分数据重新写入内存
- 管理员应该根据系统工作负载来调整交换分区的大小,以下仅供参考
5.1.1 添加swap分区
swapon -s 查看sawp状态
方式一:从硬盘创建分区,并格式化为swap
1. fdisk 或者parted分区
2. mkfswap /dev/新分区 格式化为swap
3. swapon/swapoff /dev/新分区 手动挂载/卸载(临时生效)
方式二: 通过文件实现
先找到UUID
4. 编辑fstab实现自动挂载 /dev/分区 swap swap defaults 0 0
当没有多的硬盘分swap时,用已用的硬盘分区创建swap
1. 先通过dd命令创建指定大小的文件 dd if=/dev/zero of=/tmp/swap1 bs=1M count=2048
3. 给文件设置权限 :chmod 600 /tm/swap1
4. 将文件格式化为swap: mkswap /tmp/swap1
5. 挂载swap : swapon /tmp/swap1
dd命令可以创建指定大小的文件
命令: dd if=/dev/zero of=test bs=1M count=1000
会在当前目录下生成一个大小为1M*1000=1000M大小的test.img文件,它的内容都是0(因从/dev/zero中读取,/dev/zero为0源)
if 输入文件
of 输出文件
bs 字节为单位的块大小
count 被复制的块数
/dev/zero 是一个字符设备,不断的返回0值字节
5.1.2 swap管理工具
- swapon -a 挂载/etc/fstabb中所有未挂载的swap分区
- swapon -s 查看所有已挂在的swap分区
- swapon -p 指定优先级(手动时一般不指定,大多在自动挂载时使用)
- swapon /dev/新分区 手动激活swap分区 不会读取fstab文件
- swapoff /dev/新分区 手动禁用swap分区
5.1.3 调整swap优先级
默认情况下系统会按顺序使用交换分区,先试用第一个已激活的交换分区,空间使用满后在使用第二个交换空间,但每个交换分区可以手动定义优先级
设置优先级,可以在/etc/fstab文件中使用pri选项,系统会有限使用优先级高的交换分区,默认优先级为-2,数字越大优先级越高
编辑fstab: /dev/分区 swap swap defaults,pri=10 0 0
如果具有两个相同优先级的交换分区,系统会以轮循的fan格式写入
6 其他磁盘工具
-
blkid:打印文件系统属性信息
-
lsblk列出块设备信息,加上–fs 选项可以查看文件系统信息
7 文件系统检查修复工具
对于ext系列的文件系统
- fsck:文件系统检查
示例:fsck.ext3 /dev/sda1
-v:查看详细信息
-a:自动修复
-r:交互式修复错误 - e2fsck:文件系统检测修复工具
示例:e2fsck -y /dev/sda1
-y:自动修复
-f:强制修复 - 针对xfs文件系统
xfs_repair 设备名 自动检测和修复文件系统
第二十三章 逻辑卷管理
LVM是LogicalVolumeManager(逻辑卷管理)的简写,他是Linux环境下对磁盘分区进行管理的一中机制,
在实际环境中,随着时间推移导致磁盘空间不够用,必须挂载新磁盘进行扩容和数据迁移,这导致业务会终端,不符合实际要求,因此最好的方法是零停机扩容,可以在现有文件系统上跨越不同硬盘和分区进行扩容,Liunx提供的逻辑盘管理LVM机制就是一个完美的解决方案
1 LVM架构
- PP(物理分区): 用来存储数据的块设备,可以是分区,磁盘,RAID或SAN设备
- PV(物理卷):LVM的基本存逻辑块,但和基本的物理存储质(如分区、磁盘等)比较,却包含有
- 与LVM相关的管理参数。
- VG(卷组): 卷组是存储池,由一个或多个物理卷组成,一个PV只能分配给一个VG
- LV(逻辑卷):LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统,PE (physicalextent):每一个物理卷被划分为称为PE的基本单元,是LV的最小存储单元,具有唯一编号的PE是可以被LVM导址的最小单元。PE的大小是可配置的,默认为4MB
- LE(logical extent):逻辑卷也被划分为被称为LE的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。设置特定LV选项将会更改此映射,例如: 镜像会导致每个LE映射到两个PE
2 创建逻辑卷
2.1 ★逻辑卷创建
-
准备PP,也就是准备硬盘或者分区或者raid阵列等
-
创建物理卷PV:pvcreate /dev/sda /dev/sdb1 (分别给sda整个磁盘以及sdb第一个分区创建PV)
-
创建卷组VG:vgcreate vg0 /dev/sda /dev/sdb1(创建卷组vg0,并将上一步的两个PV加入卷组)
-s 指定pe的大小,默认ll是4M -
创建逻辑卷LV:lvcreate -L 10G -n lv01 vg0(从vg0山创建一个10G大小的逻辑卷lv01)
-L 指定容量 比如 15G
-r 扩容逻辑卷同时一并扩容文件系统
-l 指定pe的数量,例如50个pe 即50*4M=200M
-n 指定逻辑卷名称 -
格式化
#mkfs.xfs /dev/vg0/lv01 -
挂载
编辑/etc/fstab文件添加永久挂载即可
2.2 查看LVM状态
查看物理卷PV:pvdisplay 物理卷名称
查看卷组VG :vgdisplay 卷组名称
查看逻辑卷LVM:lvdisplay 逻辑卷名称
2.3 删除逻辑卷
- 卸载文件系统,并删除/etc/fstab中的记录(很重要,否则会导致下一次开机异常)
#umount /dev/vg0/lv0 - 删除逻辑卷
#lvremove /dev/vg0/lv0 - 删除卷组
#vgremove vg0 - 删除物理卷
#pvremove /dev/sa1
3 逻辑卷扩容和缩减
如果所需扩容的逻辑卷所在卷组空间足够则直接扩容逻辑卷,反之则先扩容卷组
3.1 扩容逻辑卷组
扩容逻辑卷组实际上是向卷组VG中添加物理卷PV来实现,
-
准备新磁盘或者新分区(本例已sda磁盘的sda2分区为例)
-
创建新物理卷PV
给sda2分区创建pv -
扩展卷组
将新pv添加到卷组VG中 -
验证卷组:vgdisplay vg0
3.2 缩减逻辑卷组
缩减逻辑卷组的原理实际上是通过迁移逻辑卷的数据后移除物理卷完成
- 将所要减小的物理卷的数据迁移到其他物理卷上:pvmove /dev/sda2 /dev/sda1
- 将物理卷从卷组中移除:vgreduce vg0 /dev/sda2
- 验证 vgdisplay pvdisplay或者vgs、pvs等
3.3 扩容逻辑卷
-
扩容逻辑卷:lvextend -L 1.5G /dev/vg0/lv0,
-L 1.5G是扩容到1.5G,
-L +1.5G是在原有基础上增加1.5G -
扩展文件系统
-
xfs文件系统使用:xfs_growfs 挂载点
-
ext文件系统使用:resize2fs 逻辑卷
3.4 缩小逻辑卷
- 生产环境不建议缩小逻辑卷,缩小逻辑卷的风险远大于扩容的风险,
- 不是所有的文件系统都支持缩容,例如xfs文件系统就不支持缩容
- 如果缩小的逻辑卷所在物理卷有坏道或者扇区,可能会导致数据丢失且不可找回
缩容步骤:
- 卸载文件系统(必须卸载)
- 文件系统检查(检查文件系统错误并强制修复):e2fsck -f /dev/vg0/lv0
- 缩小文件系统:resize2fs 逻辑卷 缩小后的大小:resize2fs /dev/vg0/lv0 1G
- 缩小逻辑卷:lvreduce -L 1G /dev/vg0/lv0
- 重新挂载
4 逻辑卷数据迁移
4.1 同一个组迁移
逻辑卷数据迁移发生在同一个卷组,将同一个卷组中不同pv上的数据迁移到另一个pv上,达到释放pv的目的,然后将该pv从vg中移除
pvmove /dev/sda2 /dev/sda1 将sda2这个pv的数据迁移到sda1
vgreduce vg0 /dev/sda2 将sda2对应的pv从vg0中移除
pvremove /dev/sda2 删除pv,彻底还给硬盘
4.2 迁移到其他主机
5 逻辑卷误操作
注意:并非所有的操作都可以还原,如果对卷组的pv进行了删除或者移动是无法还原的
- 查看vg的操作日志
#vgcfgrestore -l| vg0(卷组名字) - 恢复到指定日志:
#vfcfgrestoe -f /dec/lvm/archive/vg0 xxxxxx.vg.vgo
6 逻辑卷属性修改
- 修改PV属性
PV不可分配:#pvchange -x n /dev/sda1(pvName)
PV可以分配:#pvchange -x y /dev/sda1(pvName) - 修改VG属性
激活卷组:#vgchange -ay vg0(vgName)
禁用卷组:#vgchange -an vg0(vgName) - 修改LV属性
激活逻辑卷:#lvchange -ay /dev/vg0/lv0(lvName)
禁用逻辑卷:#lvchange -an /dev/vg0/lv0(lvName)
设置只读:#lvchange -pr /dev/vg0/lv0(lvName)
设置读写:#lvchange -prw /dev/vg0/lv0(lvName)
7 逻辑卷快照
LVM快照的实现有两种方式
-
COW:写实复制
如下图所示,打快照时候将元数据a复制一份为b,此时ab同时指向源卷中的数据,当源卷中的某个数据发生变化时(例如w3),在发生变化时候会将w3复制一份给快照的的卷,此时快照的元数据则会取消与源卷中w3的连接(绿色带红叉的线段),转而将连接指向快照卷的w3文件(红色w3),新数据写入同理 -
ROW:写重定向
创建快照时会生成一个新的差分卷(快照),虚拟机会挂载这个差分卷作为磁盘文件,读请求会重定向到源卷中,写操作会被重定向到新卷中,所有旧数据均保留在只读的源卷
- 创建逻辑卷快照
#lvcreate -L 64M -n datasnap1 -s /dev/vg0/lv01
-L:指定快照大小
-n:指定快照名字
-s:指定逻辑卷 - 挂载逻辑卷快照
#mkdir -p /data/datasnap
#mount /dev/vg0/datasnap1 /data/datasnap (xfs文件系统需要加-o nouuid挂载) - 备份
- 卸载并移除快照
#unmount /data/datasnap
#lvremove /dev/vg0/datasnap1 - 快照恢复
方式一:直接从快照挂载点复制文件
#cp /data/datasnap/* 目标路径
方式二:从快照进行恢复
#unmount /data/datasnap(恢复快照必须卸载挂载点)
#lvconvent –merge /dev/vg0/datasnap1 - 逻辑卷迁移
- 卸载逻辑卷:#mount /挂载点
- 禁用卷组:#vgchange -an vgName
- 导出卷组信息到磁盘:#vgexport vgName
- 关机并拔出磁盘,将磁盘插入新主机
- 扫描PV:#pvscan
- 导入卷组:#vgimport vgname
- 激活卷组:#vgchange -ay vgname
第二十四章 stratis和vdo高级存储
1 精简存储池(stratis)管理
stratis将磁盘设备放置于一个精简配置的共享存储池中,stratis文件系统没有固定大小,也不会预分配未使用的快空间,一个共享池中可以创建多个文件系统,文件类型为xfs
1.1 stratis架构
结构如下,将多快磁盘或者分区加入某一个存储池pool1,然后在pool1上创建文件系统,多个文件系统共用pool1的容量,当容量不足时添加磁盘设备或者分区加入到pool1中即可
1.2 安装配置精简存储池
- 安装软件包stratis-cli和stratisd:#yum -y install stratis-cli stratisd
- 激活stratisd服务:#systemctl enable –now stratisd
- 创建精简池:#stratis pool create pool01 /dev/sda
- 查看精简池:#stratis pool list
- 创建文件系统:#stratis filesystem create pool01 fs01
- 查看文件系统:#stratis filesystem list
- 查看文件系统的uuid:sblk –output=UUID /stratis/pool01/fs01
- 设置开机挂载:
注意:挂载选项x-systemd.requires=stratisd.service 可延迟挂载文件系统,直到stratisd.service启动好为止
###1.3 管理精简配置的文件系统
- 向精简池中添加快设备(扩容):#stratis pool add-data pool01 /dev/sdb
- 创建快照:#stratis filesystem snapshot pool01 fs01 snap01
- 恢复快照:
- 卸载文件系统: #umount /stratis/pool01/fs01
- 删除元文件系统:#stratis filesystem destroy pool01 fs01
- 根据快照在创建源文件系统:#stratis filesystem snashot pool01 snap01 fs01
- 说明:sstratis创建快照可以独立存在,因此可以删除源文件系统
1.4 删除配置
- 删除配置文件系统:#stratis filesystem destroy pool01 fs01
- 删除精简池:#stratis pool destroy pool01
stratis工具查看
查看stratis命令帮助:#stratis --help
查看stratis关于存储池的命令:#stratis pool --help
查看stratis关于文件系统的命令:#stratis filesystem --help
查看stratis关于快照的命令:#stratis filesystem snapshot --help
2 ★vdo高级存储功能
红帽企业Linux8使用vdo功能,可以优化设备上数据空间占用问题,它可以减少块设备上的磁盘使用空间,同时最大限度减少数据重复,从而节省磁盘空间,vdo包含两个模块,kvdo用于控制数据压缩,uds用于重复数据删除
vdo层位于现在块设备(raid或者本地磁盘)之上,存储层(如lvm和文件系统)位于vdo之上,下图暂时了kvm虚拟机架构中vdo所处的位置
2.1 vod特性说明
- 利用vdo创建的逻辑设备成为vdo卷,vdo卷与磁盘类似,可以将这些卷格式化为所需要的文件系统类型。此外,还可以将vdo卷用作LVM物理卷。
- 在创建vdo卷时,可以指定块设备,以及vdo向用户显示的逻辑设备的名称。也可以指定vdo卷的逻辑大小,vdo卷的逻辑大小可以大于实际块设备的物理大小。
- 如果未指定逻辑大小,则vdo会将实际物理大小视为卷的逻辑大小,这种方式有利于提高性能,但是会降低存储空间的使用效率,应视情况而定
- 由于vdo卷采用了精简配置,因此用户只能看到正在使用的逻辑空间,而无法了解实际可用的物理空间。
- vdo卷的逻辑大小超过实际物理大小,应使用vdostatus -verbose命令查看实际使用情况
2.2 vdo配置过程
-
安装软件包(默认已安装,但考试会被卸载):yum install vdo kmod-kvdo -y
-
创建vod卷:#vd0 create --name vdo0 –device /dev/sdb –vdoLogicalSize 100G
-
查看vdo卷:
-
验证压缩和重删功能已经开启:#vdo status [–name=vdo0]
-
查看文件系统使用情况:#df -h
-
查看vdo卷列表:#vdo list
-
启动和停止vdo卷:#vdo start|stop -n vdo
-
用vdostats查看卷的状态
#vdostats --human-readable -
将vdo格式化为xfs文件系统
#mkfs.xfs /dev/mapper/vdo0 -
★永久挂载vdo卷
注意:挂载选项x-systemd.requires=vdo.service可延迟挂载文件系统,知道vdo.service启动为止
2.3 vdo的其他命令
删除vdo卷:#vdo remove -n vdo1
查看vdo工具的帮助:vdo -h
查看关于vdo卷移除的命令:#vdo remove -h
第二十五章 NFS和自动挂载
1 NFS服务
存储按照使用用途来分可以分为以下几种
直连式存储(DAS):通常是存储设备通过控制总线直接连接在主板上,比如硬盘光盘等,通常是一个块设备
网络附加存储(NAS):windows:CIFS,Linux/Unix:NFS(NetFileSystem) ,通常是一个共享目录(文件实存储系统)
存储区域网络(SAN):IP-SAN,FC-SAN,通常也都是一个块设备
NFS:是用在Linux或者Unix之间来进行文件共享的一个方式,可以将本地的文件目录共享给远端的服务器进行使用,涉及到的
协议nfsv4,
软件包nfs-utils,
服务名nfs-server
配置文件:/etc/export
#exportfs -r 使配置生效
#exportfs -v 查看所有的nfs共享
1.1 NFS服务端配置
-
在服务端创建需要共享的目录:#mkdir /share
-
编辑配置文件/etc/exports:
/share *(sync,rw)
/ share 表示需要共享的文件目录,
*表示谁可以使用这个共享 ,可以是一个ip或者一个子网
()括号内是共享的选项,rw表示共享读写,sync表示同步共享,权限即功能详情如下(红色为默认) -
重启服务:#systemctl restart nfs-server
-
防火墙放行服务nfs,mountd,rpc-bind
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
1.2 NFS客户端配置
-
在客户端创建挂载点:#mkdir /data
-
检测可用挂载:#showmount -e ip/主机名
如下图所示,查看改服务器共享出来的共享,结果表示/rhcedata目录可以提供给任何人 -
手动挂载:#mount -t nfs 192.168.195.128:/share /data
-
永久挂载,编辑/etc/fstab:192.168.195.128:/share /data nfs defaults 0 0
注意:永久挂载时服务端需要先开机并启动服务,否则客户端开机会卡主,
挂载时可以指定挂载选项,
192.168.195.128:/share /data nfs defaults,(挂载选项) 0 0
2 按需自动挂载(autofs)
自动挂载程序是一个服务(autofs),他可以根据需要自动挂载NFS共享,不需要时,将自动卸载NFS共享,其优势如下
自动挂载的NFS共享可以供计算机上所有的用户使用
NFS共享不像/etc/fstab中的条目一样永久挂载,可释放网络和系统资源
自动挂载是在客户端,不需要服务端进行配置
NFS是默认的文件系统挂载,但也可以用来挂载其他文件系统
autofs是一种服务,像其他系统一样管理
2.1 autofs服务配置
- 示例1:以配置autofs自动挂载cdrom到/media/cdrom为例
- 安装软件包:#yum install autofs -y
- 重启服务:#systemctl enable --now autofs
- 编辑配置文件/etc/auto.master或者在/etc/auto.master.d目录下新建一个以.autofs结尾的文件
#vim /etc/auto,master
/media(挂载点的上级目录) /etc/auto.cdrom(挂载时读取的配置文件(以随便定义)) - 创建配置文件/etc/auto.cdrom(文件内容可以参考/etc/auto.misc)
#vim /etc/auto.cdrom
cdrom(挂载点) -fstype=iso9660(文件系统类型) ,ro(挂载选项) :/dev/cdrom(需要挂载的设备) - 重启autofs服务让配置生效:#systemctl rstart autofs
- 验证生效:# cd /media/cdrom ;df -h 查看
- 示例2:配置autofs自动挂载nfs到/redhat/data
- 编写nfs的触发配置文件(以自定义文件为例)
#vim /etc/auto.master.d/nfs.autofs
/redhat /etc/nfs.misc - 编写挂载的配置文件/etc/nfs.misc
#vim /etc/nfs.misc
data -rw 172.168.195.128:/recedata - 重启autofs服务让配置生效:#systemctl rstart autofs
- 验证:cd /redhat/data;df -h
- autofs通配符映射
如果nfs服务端host:/share共享多个子目录,并且同事使用相同挂载选项访问这些目录,则映射文件/etc/auto.nfs文件内容可以进行如下配置
#vim /etc/auto.nfs
- -rw 192.168.195.128:/rechdata/&
这里的会代替源位置中&符号的内容,例如在/rechdata/下有dir1~100个目录,这分别会代表这100个目录
第二十六章 管理SELiux安全性
1 SELinux简介
- SELinux在Linux中具有重要的安全用途它可以运行或者聚聚文件及其他资源,且精准度相比用户权限要大幅度提高
- SELinux由应用开发人员定义的若干策略组成,这些策略准确声明了对于应用使用的每个二进制可执行文件,配置文件和数据文件,哪些操作和访问权限是恰当且被允许的,这被称为目标政策。策略声明了各个程序,文件和网络端口上放置的预定义标签。
- 并非所有的安全问题都可以提前预测,SELinux实施了一组可以防止一个应用程序的弱点影响其他应用或基础系统的访问规则。SELinux提供了一个额外的安全层,此外还增加了一层复杂结构,同时也给使用者带来了一定的难度。因此学习SELinux可能会需要一些时间。
2 SELinux的三种模式
-
强制模式(Enforcing):SELinux强制执行访问控制规则(默认),在强制模式下,严格执行访问控制规则,例:如下apache只能访问拥有apache标签的html目录,访问其他目录则会被阻止
-
许可/警告模式(Permissive):SELinuxx处于活动状态,但不强制执行访问控制规则,而是记录违反规则的警告,该模式主要用于测试和故障排除,例:apache可以访问除自己标签以外的目录,但会记录违反规则的访问日志
-
关闭模式(disabled):SELinux完全关闭,不拒绝任何SELinuxx违规行为,并不记录
2.1 SELinux模式切换
-
更改当前系统SELinx模式(临时切换,下次开机一样会根据SELinux配置文件进行启动):
-
查看当前模式:getenforce
-
将强制模式切换到警告模式 setenforce 0
-
将警告模式切换到强制模式 setenforce 1
-
不能切换到禁用模式
-
启动时向内核传参,设置SELinux模式(临时有效)
如下图红框所示,在系统启动时给内核传递参数,指定SELinux模式 -
enforcing=0 警告模式
-
enforcing=1 强制模式
-
selinux=0 关闭模式
-
selinux=1 启动selinux
-
设置默认SELinux模式(重启生效)
修改配合文件/etc/selinux/config,该配置文件尽在下次重启后生效 -
SELINUX=enforcing 强制模式
-
SELINUX=permissive 警告模式
-
SELINUX=disabled 关闭模式
-
SELINUXTYPE=targeted 设置SELinux类型,其中targeted为默认,专注于网络服务器的端口及管控,MLS为最严格的selinux策略,普片用于军事领域
3 文件的安全上下文
3.1 查看文件/进程的安全上下文(SELinux标签)
-
查看进程的上下文:ps -efZ
加Z选项可以查看进程上下文 -
查看文件的向下文:ll -Z 文件名
system_u:Selinux的用户unconfined_u表示没有指定
object_r:Selinux的角色
admin_home:Selinux的类型(文件的上下文)(但selinuxtype=targeted时,只关注该选项)
s0:安全级别
3.2 管理文件的安全上下文
在启动SELinux的系统时,或者创建一个新文件时,SELinux已经为系统中的资源morning设置了安全上下文,保存在/etc/selinux/targeted/contexts/files/file_contexts文件中 -
临时生效(在系统重新打标签(restorecon file)时会失效):#chcon -t 安全上下文 file/dir(需要修改的上下文的文件或者目录)
示例:将/tmp下的test.html文件的上下文改为符合htppd安全的上下文的
chcon -t httpd_sys_content_t /tmp/tets.html -
还原标签:restorecon -Rv file/dir
还原标签是指重新从selinux数据库中读取文件标签信息,也可以理解为刷新标签
#semanage fcontext -a -t httpd_sys_content_t “/tmp/newhtml(/.*)?”
-R :递归还原目录默认的上下文
-v:查看详情 -
永久生效#semanage fcontext -a -t 安全上下文 “file/dir(/.*)?”(需要修改的上下文的文件或者目录的绝对路径)
restorecon -v 文件 重新打标签
semanage 是selinux的管理工具
fcontext 是对文件的上下文进行设置
-a 添加
-d 删除
-t 指定文件上下文类型
-l 列出文件的上下文:semanage fcontext -l 查看当前目录下
示例:将/tmp下的test.html文件的上下文改为符合htppd安全的上下文的
- 写出标签到selinuxx数据库中:#semanage fcontext -a -t httpd_sys_content_t /tmp/tets.html
- 还原标签(指从selinux数据库中从新读取标签,也可以理解为刷新标签):#restorecon /tmp/tets.html
4 使用布尔值调整SELinux策略
4.1 SELinux的布尔值(开关)
SELinux布尔值是可以应该SELinux策略行为的参数,SELinnux布尔值可以启用和禁用规则来有效的调整策略
使用#semanage boolean -l查看所有的布尔值(只有root可执行)
- 查看布尔值
getsebool -l 查看当前所有的布尔值
getsebool -a 查看当前所有生效的布尔值
#getsebool http_enable_homedirs 查看指定规则的布尔值 - 设置布尔值
setsebool http_enable_homedirs 1 临时调整布尔值
setsebool -P 规则 on|off 永久设置指定规则布尔值启用和禁用(on|off可用0|1替代)
#setsebool -P http_enable_homedirs on
4.2 管理SELinuxx的布尔值案例
- 安装配置httpd服务
- 修改配置文件/etc/httpd/conf/userdir.conf配置文件,添加如下内容后重启服务
#UserDir disabled
UserDir public_html - 用户家目录下创建对应文件并写入内容
#cd /home/admin
#mkdir public_html
#echo helo admin home >/home/admin/public_html/index.html
#chmod -R 701 /home/admin/ - 客户端通过curl访问 http://localhost/~admin/index.html会被拒绝
- 设置SELinux的布尔值后即可访问
#setsebool -P httpd_enable_homedirs on
#curl http://localhost/~admin/index.html
helo admin home
5 控制SELinux端口标记
5.1 SELinux端口标记管理
SELinux不仅是对文件和进程进行标记,还通过标记网络端口来控制网络流量,但进程希望监听某个端口时,将检查是否允许该进程相关的标签绑定该端口标签,这可以阻止恶意服务控制本应由其他网络服务使用的端口
如果在非标准端口上运行服务器,SELinux会拦截,这时候必须修改SELinux端口标签
-
查看所有的端口标签:semanage port -l,示例中表示80 端口的标签是http_port_t,而这个标签则可以使用后续列出的80/81/443/488/8008/8009/8443/9000几个端口
-
管理端口标签:
-
语法:semanage port [option] portnumber
-
常用选项
-a 添加端口标签
-d 删除端口标签(默认标签不能删除,比如http_port_t默认的80)
-m 修改端口标签
-t 指定端口标签类型
-p 指定协议 例如tcp/udp
-l 列出所有的端口标签
-C 列出所有修改过的端口标签 -
示例:#semanage port -a -t http_port_t -p tcp 8899
5.2 SELinux端口标记管理示例
-
安装配置httpd服务
-
访问httpd服务能正常访问
-
修改httpd配置文件中的默认端口
-
重启httpd服务
启动报错,通过查看/var/log/message日志可以判断是新端口没有httpd的标记 -
修改端口或者给标记添加端口后重启服务,服务正常
#semanage port -a -t http_port_t -p tcp 8899
或者#semanage prot -m -t http_port_t -p tcp 8899
6 SELinux日志分析
通用性日志排错:
排查方式:
1、先查看message 再message查看报错
SELinux拍错的唯一途径就是看日志, ,并发送简短摘要到/var/log/message日志文件,
如下所示,但修改httpd服务的80端口为8899时启动报错,提示不能绑定8899地址,提示运行sealert -l 6aadac4f-fa24-4205-a4b4-2b2a383aabe2查看,
继续运行sealert -l 6aadac4f-fa24-4205-a4b4-2b2a383aabe2结果如下,提示我们httpd服务需要绑定8899地址,如果我们需要绑定,可以执行“semanage port -a -t PORT_TYPE -p tcp 8899”,然后PROT_TYPE可能是后续中的一个
第二十七章 管理网络安全
1 防火墙架构概念
- Linux内核中包含netfilter,它是网络流量操作(包括数据包过滤,网络地址转换和端口转发)的框架
- Linux内核中还包含了nftables,这是一个新的过滤器和数据包分类的子系统,其增强了netfilter的部分代码,但是仍保留了netfilter的架构。nftables更新的优势在于更快的数据包处理、更快的规则集更新,以及以相同的规则同时处理ipv4和ipv6
- netfilter通过多个程序进行配置,其中包括iptables、ip6tables等,这些框架现在已经被弃用,nftables则使用单个nfs用户空间程序,通过一个接口来管理所有协议
- Firewalld是一个动态防火墙管理器,它是nftables框架的前端 (使用nfs命令),firewalld曾使用iptables命令来直接配置iptables。在RHEL8中,firewalld仍然是推荐的前端,它使用nfs来管理防火墙规则集。
2 firewalld简介
Firewalld上有一些预定义区域,可分别进行自定义,以下是初始区域配置
-
trusted: 可信区域,防火墙放行一切流量。等同于关闭防火墙功能。
-
home: 区域内主动发起连接的流入回程数据包允许通过,默认放行ssh,mdns,ipp-client,sambaclient或dhcpv6-client服务。
-
internal: 与home区域相同
-
work: 区域内主动发起连接的流入回程数据包允许通过,放行ssh,dhcpv6-client服务
-
external: 区域内主动发起连接的流入回程数据包允许通过,放行ssh服务匹配,开启地址伪装功能(开启IP转发后,实现地址访问)
nat功能:snat 源地址转换 可以实现nat中多主机上网
dnat功能: 目的地址转换 实现端口转发 -
dmz: 区域内主动发起连接的流入回程数据包允许通过,放行ssh服务匹配
-
block: 区域内主动发起连接的流入回程数据包允许通过
-
drop: 对进入该区域的所有数据包丢弃,并且不进行任何回包,区域内主动发起连接的流入回程数据包允许通过
3 firewalld默认配置文件
/usr/lib/firewall 系统配置 尽量不要修改
/etc/firewalld 用户配置
4 firewall的两种模式
runtime:临时有效,立即生效,重启后配置丢失
permaent:持久生效,需重新载入生效
5 防火墙配置
firewalld有4种方式
5.1 防火墙配置-web控制台
仅限配置端口和服务:http://127.0.0.1:9090/network/firewall(仅限rhel8,)
5.2 防火墙配置-firewall-config图形控制台
可以配置所有功能(rhel8需单独安装 yum install firewall-config)
5.3 防火墙配置-firewall-cmd命令行工具(最常用)
–get-default-zone :查访默认的区域名称
–set-default-zone=<区域名称> :设置默认的区域,使其永久生效(不需要重新载入规则)
firewall-cmd --set-default-zone=drop
- -list-all :显示当前区域的网卡配置参数、资源、端口以及服务等信息
- -list-all-zones :显示所有区域的网卡配置参数、资源、端口以及服务等信息
- -get-zones :显示可用的区域
- -get-active-zones:显示当前正在使用的区域、来源地址和网卡名称
- -add-source=:将源自此IP或子网的流量导向指定的区域
firewall-cmd --add-source=172.168.195.1 --zone=drop 作用相当于拉黑该IP - -remove-source=:不再将源自此IP或子网的流量导向这个区域
firewall-cmd – remove-source=172.168.195.1 --zone=drop 取消拉黑该IP - -change-source=:将源自此IP或子网的流量导向指定到新的区域
–add-interface=<网卡名称> :将源自该网卡的所有流量都导向某个指定区域
–change-interface=<网卡名称> :将某个网卡与区域进行关联
firewall-cmd --chage-interface=ens160 –zone=drop 等同于拉黑该网卡
–get-services:显示预定义的服务
★放行服务和端口
–add-service=<服务名>:设置默认区域允许该服务的流量(放行服务)
firewall-cmd --permanent --add-service=mysql
–remove-service=<服务名>:设置默认区域不再允许该服务的流量
–add-port=<端口号/协议>-:设置默认区域允许该端口的流量(放行端口)
firewall-cmd --permanent --add-port=9999/tcp
–remove-port=<端口号/协议>:设置默认区域不再允许该端口的流量
firewall-cmd --permanent --remove-port=9999/tcp
–permanent:让配置永久生效
–reload:让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
5.4 防火墙配置-直接编辑防火墙配置文件xml文件
默认情况下在/etc/firewalld/zones目录下只有一个public.xml文件,如果非另一个zone做一些修改并永久保存,那么戹自动生成对应的xml文件,手动修改xml文件后需要重新reload防火墙才能生效
其文件内容如下,修改时仿照增删服务或者端口即可,该种方式难度较大,需要了解服务和规则的编写方法
6 防火墙规则优先级
firewalld会对于一个接受到的请求具体使用哪个zone,firewall是通过三种方式来判断的,
1、 source --------->来源地址
2、 interface ------->接收请求的网卡
3、 firewalld-------->配置的默认区域(zone)
这三种方式的优先级一次降低,也就是说如果按照source可以找到就不会再按照interface去找,如果都前两个都找不到就会使用第三个默认区域
7 查看防火墙规则
#firewall-cmd --zone=home --list-all #查看指定区域设置
#firewal-cmd --list-all #查看默认区域设置
target:目标(策略)
icmp-bolck-inversion:icmp协议类型黑白名单开关,yes/no
interface:关联的网卡接口
source:来源,可以是ip或者mac
services:允许的服务
ports:允许的目标端口,及本地开放的端口
protocols:允许通过的协议
masquerade:ip地址伪装,即将接收到的请求的源地址设置为转发网卡的地址
forward-ports:端口转发
source-ports:允许的来源端口
icmpblocks:可添加的icmp类型,但icmpblock-inversion为no时,这些icmp类型被拒绝,为yes时则被允许
rich rules:富规则,即更细致,更详细的防火墙策略,他的优先级也是所有防火墙策略中最高的
8 设置防火墙规则
8.1 设置默认的zone
查看:# firewall-cmd --sget-default-zone
设置:#firewall-cmd --set-default-zone=public
8.2 设置zone的目标
查看:firewall-cmd --permanent --zone=zone-name --set-target
设置:firewall-cmd --zone=zone-name --set-target=drop
8.3 firewalld管理服务
#firewall-cmd --get-services 查看预设的服务,/usr/lib/firewalld/services/目录中所有的服务名称
#firewall-cmd–permanent–add-service=samba --zone 永久放行samba服务
#firewall-cmd–permanent --remove-service=ssh --zone 永久移除ssh服务
#firewall-cmd --reload 设置立即生效
#firewall-cmd --zone=home --query-service=samba 查询home zone是否允许sabma服务
自定义服务
复制/usr/lib/firewalld/services/*,xml文件到/etc/firewalld/services/下面,修改文件名为自定义的服务名,修改对应的端口号即可。
#cp /usr/lib/firewalld/services/sambaxml /etc/firewalld/services/aaa.xml 复制模板文件
#firewall-cmd --reload 配置立即生效
8.4 firewalld管理端口和协议
#firewall-cmd --zone=public --list-ports 查询指定区域开放的端口
#firewall-cmd --permanent --add-port=8090/tcp 放行8090端口
#firewall-cmd --permanent –remove-port=8090/tcp 移除8090端口
#firewall-cmd --zone=public --list-protocols 查询区域开放的协议
#firewall-cmd --permanent --add-protocol=icmp 放行协议
#firewall-cmd --permanent --remove-protocol=icmp 移除协议
8.5 firewalld端口转发
本地转本地 9999端口转发给本机的80端口
#firewall-cmd --permanent --add-forward-port=port=9999:proto=tcp:toport=80
本地转远程 6666端口转发给远程的主机的22端口
#firewall-cmd –permanent --add-forward-port=port=6666:proto=tcp:toport=22:toaddr=172.18.64.14
注意数据包转发到其他主机,还需要开启包转发功能,systcl -w net.ipv4.ip_forward=1
8.6 firewalld 富规则(详细的防火墙规则)
- 示例0:仅允许指定IP可以访问本机的22端口
firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“172.18.64.14” port port=“22” protocol=“tcp” accept” - 示例1:允许192.168.2.208主机的所有流量
#firewall-cmd --permanent --add-rich-rule="rule family= “ipv4” source address=“192.168.2.208” accept - 示例2:允许192.168.2.208主机的icmp协议,即允许192.168.2.208主机ping
#firewall-cmd --permanent --add-rich-rule=“rule family= ipv4” source address="192.168.2.208 protocol value="icmp’accept - 示例3:允许192.168.2.0/24网段的主机访问22端口
#firewall-cmd --permanent --add-rich-rule="rule family=“ipv4” source address="192.168.2.0/24’ port protocol="tcp’port="22"accept - 示例4:将来自192.168.2.0/24网段访问本地80端口的流量转发到192.168.2208主机的22端口
#firewal-cmd --permanent --add-rich-rule="rule family=“ipv4” source address="192.168.2.0/24’ forward-port port=80protocol=tcp to-port=22 to-addr=192.168.2.208 - 示例5:伪装来自192.168.20/24网段访问外网的流量
#firewall-cmd --permanent --add-rich-rule=“rule family=ipv4 source address=192.168.2.0/24 masquerade”
9 防火墙脚本示例
下面是一个简单的防火墙初始化脚本
#!/bin/bash
systemctl enable --now firewalld
firewall-cmd --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=ens32
firewall-cmd --permanent --zone=drop --add-protocol=icmp
firewall-cmd --permanent --zone=drop --add-masquerade
firewall-cmd --permanent --zone=drop --add-rich-rule="rule family="ipv4" sourceaddress=192.168.2.208” port protocol="tcp"port=“22"accept"
第二十八章 Podman容器_密码
容器就是一种自包含(软件以及软件的依赖一起)的软件打包技术
Podman 是一个开源项目,可在大多数 Linux 平台上使用,并位于GitHub 上。Podman 是一个无守护程序的容器引擎,用于在 Linux 系统上开发、管理和运行 Open Container Initiative (OCI) 容器和容器映像。Podman 提供了一个与 Docker 兼容的命令行前端,它可以简单地为Docker cli 命名,别名 docker=podman。遵从Apache2.0协议开源,全面兼容docker
podman是一个工具没有守护进程
1 容器的优势
- 对于开发人员 - Build Once, Run Anywhere
容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。 - 对于运维人员 - Configure Once, Run Anything
只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性
2 容器与虚拟机的区别
隔离性:虚拟机的隔离性好(基于内核隔离),容器隔离性较弱(基于进程的隔离)
性能:虚拟机性能较差,容器的性能好
镜像大小:虚拟机镜像较大一般以G为单位,容器的镜像小,一般在几十兆以下
镜像标准:虚拟机的镜像各异,容器的镜大部分是OCI(open container image)的格式
创建和启动速度:虚拟机慢,容器很快
资源虚拟化颗粒度:虚拟机颗粒度低 10-100左右,但容器可达10000+
3 Podman和docke的比较
4 容器的三大核心技术
容器是利用Linux的内核特性而构建
- namespace:资源隔离
inux namespaces(命名空间) 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。 - cgroup:资源控制
Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。 - chroot:切换根文件系统
chroot就是Change Root,也就是改变程序执行时所参考的根目录位置。CHROOT可以增进系统的安全性,限制使用者能做的事。用来隔离容器之间对于物理机根的访问控制。
5 Podman和Docker的比较
- 架构:
docker是CS架构
Podman只是一个工具 - 特权:
docker需要root权限来运行
Podman支持无根容器(普通用户运行的容器)更加安全 - 安全:
Podman更加安全 - system:
podman支持systemd集成,可以将容器已服务的方式来进行管理
docker则需要设置docker daemo来启动,openstack、ceph、k8s已开始使用podman技术 - 构建镜像:
docker all in one docker利用自身来运行dockerfile 构建镜像
podman 是模块化,有专门的镜像管理模块
6 安装容器工具集
在rhel操作系统中,提供容器工具集Container-tool,其行如下内容
- podman:管理容器和容器image
- skopeo:检查、复制、删除和签名image
- buildah:创建容器镜像
安装conainer-tool工具集:yum module install container-tools
7 容器镜像
容器镜像就像是一个将操作系统、依赖库、应用程序、配置参数等,所有容器运行时所需组合成的一个集合;它包含了我们的应用程序所需的所有依赖。红帽器镜像有两种类型:
- Red Hat Enterprise Linux 基础镜像(RHEL 基础镜像 收费)
- Red Hat Universal Base Images(UBI 镜像 免费)
主要区别在于 UBI 镜像允许您与其他共享容器镜像。您可以使用 UBI 构建容器化应用程 序,将其推送到您选择的 registry 服务器,轻松地与他人共享,甚至将其部署到非红帽平台上。UBI 镜像被设 计为在容器中开发的云原生和 Web 应用程序用例的基础。
8 ★容器镜像仓库
- 配置容器镜像仓库有一下两个文件,但用户的配置文件存在时优先使用用户配置文件
- 全局配置文件(对所有用户生效) /etc/containers/registries.conf
- ★用户配置文件/home/$user/.config/containers/registries.conf
- 配置文件配置项如下:
- [registries.search] 搜索域 也就是在以下地址中去搜索镜像,根据地址的顺序来进行搜索
- [registries] = [‘registry.access.redhat.com’, ‘regiastry.redht.io’, ‘docker.io’] 支持多个仓库
- [registries.insecure] 忽略不安全的镜像仓库也就是http类型的仓库
- [registries] = [‘registry.example.com’] 写上http的仓库地址,表示使用http访问而不使用https
- [registries.block] 列表中禁用的仓库
- registries = [‘demo.example.com’] 禁用的仓库地址
- 配置镜像仓库的约束:
- 每个 registry 都必须通过单引号包围起来
- registries = key 设置多个 registry,则必须使用逗号将这些 registry 分开
- 可以通过 IP 地址或主机名指定 registry
- 可以使用非标准端口且可以使用http协议
- 推荐的容器镜像仓库:
- 公共仓库:
registry.redhat.io(需要身份验证)
registry.access.redhat.com(不需要验证)
docker.io (docker官方仓库)
Quay.io (quay官方仓库,红帽的企业级托管仓库,需要注册账号) - 私有仓库:
huaweicloud.com
cloud.tencent.com
aliyun.com
ucloud.cn - 从仓库获取镜像: podman pull [:]/[/]:
#podman pull uhub.service.ucloud.cn/redhat-demo/nginx-118:latest - pull 下载/拉取 镜像
- uhub.service.ucloud.cn 仓库的地址(注册服务器的地址)
- redhat-demo 仓库的名字
- nginx-118 镜像的名字
- latest 镜像最新的版本(标签tag)
9 容器镜像仓库管理
- 查看本地镜像:podman images
- 查看镜像详细信息
- 查看本地镜像podman inspect
podman inspect registry.example.com/ubi8 - 查看远程镜像skopeo inspect
skopeo inspect docker://registry.redhat.io/ubi8/ubi-init - 查找镜像
- 从配置文件的默认仓库查找:podman search ubi8
- 从指定仓库中搜索镜像:podman search registry.access.redhat.com/ubi
- 将镜像上传到私有仓库
- 登录/登出到私有仓库:
podman login/logout registry.access.redhat.com - 对镜像重新标记:使用tag可以修改镜像额名称/注册表服务器地址以及仓库对象
podman tag registry/ubi8/httpd-24:v1 registry/ubi8/httpd-24:v2 - 将镜像上传你到私有仓库:
podman push uhub.service.ucloud.cn/redhat-exam/httpd:latest
- 移植镜像到内网主机
- 导出成tar包:podman save -o httpd.tar uhub.service.ucloud.cn/redhat-exam/ubi8:latest
- 导入镜像到系统:podman load < httpd.tar
- 删除镜像
podman rmi uhub.service.ucloud.cn/redhat-exam/httpd:latest
10 容器的操作
- 创建容器
- podman create --name demo registry.access.redhat.com/ubi8:litest
- 运行容器
podman run [options] image [command [arg …]]
podman run -d --name container1 registry.redhat.com/ubi/ubi8 top - 管理容器状态
启动/停止/重启/挂起/恢复:podman start/stop/restart/pause/unpause: - 查看容器
podman ps 正在运行的容器
podman ps -a 所有容器包含运行结束的容器 - 在容器中运行命令
podman run --rm registry.access.redhat.com/ubi8/ubi cat /etc/os-release 在主机上运行容器命令
podman run -it --name test -it registry.access.redhat.com/ubi8/ubi /bin/bash 容器内运行容器命令
-d 在后台运行容器并打印新容器 ID
– rm 表示在执行完容器命令后将删除容器
– name 指定容器的名称
-it -i 交互式进程 -t 为容器绑定终端 这两个选项一般连用 - 删除容器
删除指定容器:podman rm 容器名/容器id
删除指定状态的容器:podman rm $(podman ps --filter status=exited -q)
删除所有非运行状态的容器:podman rm $(podman ps -aq)
删除所有的容器:podman rm -f $(podman ps -aq) - 进入一个运行中的容器
podman attach 容器名字/容器ID:进入容器后退出容器这容器也在后台自动退出
podman exec it 容器名字/容器ID /bin/bash:退出后容器继续运行,不会从后台退出 - 导入导出容器
- 停止容器:podman stop demo1
- 导出:podman export 容器名/容器ID >镜像名称.tar
#podman export demo >demo.tar - 导入:podman import 镜像
#podman import demo.tar - 定义tag:导入完成的镜像没有仓库和tag,最好手动标记
podman tag 容器ID 名称:tag
#podman tag 容器ID 容器名称:tag
- 斯蒂芬
11 ★无根容器
由普通用户来创建和运行的容器称之为无根容器,(红帽7.7以上才支持无根容器)
- 无根容器的优点
- 他们增加了一个新的安全层;即使容器引擎、运行时或业务流程协调程序受到威胁,攻击者也不会获得主机上的root权限。
- 允许多个非特权用户在同一台计算机上运行容器(这在高性能计算环境中尤其有利)。
- 允许在嵌套容器内进行隔离。
- 无根容器的配置
- 准备一个普通用户(例:alice,)且设置密码(例:redhat,因为使用su切换到普通用户不能正确识别到systemd变量,将来无法配置容器通过systemd自启动,所需需要有密码从而使用ssh切换用户)
- 通过ssh登录到alice:#ssh alice@localhost
2.1 创建容器镜像仓库的配置目录: #mkdir -p ~/.config/containers
2.2 拷贝容器镜像仓库的配置文件到该目录:
#cp /etc/containers/registries.conf ~/.config/containers/ - 搜索需要的容器镜像并拉取:
3.1 搜索mysql的镜像:#podman search mysql
3.2 拉取镜像:#podman pull registry.redhat.com/mysql-56
- 使用镜像运行容器:
#podman run -d -t –name mysql registry.redhat.com/mysql-56:latest
12 容器持久存储
- 使用数据卷进行持久存储
- 创建数据卷:#podman volume create data1
- 查看所有卷:#podman volume list
- 查看数据卷详情:#podman volume inspect data1
- 删除卷:#podman volume rm data1
- 挂载数据卷给镜像:
#podman run -d -t --v data1:/opt –name demo1 registry.redhat.com/mysql-56:latest /bin/bash
–v或者-v:都是挂载数据卷的意思
data1:/opt:表示将data1数据卷挂载给宿主机的/opt目录下
- 使用挂载点共享宿主机目录
- 宿主机创建共享目录:mkdir -p /opt/demo1
- 挂载卷给容器:将宿主机的/opt/demo1目录映射给容器里面的/opt,:Z表示给宿主机的该目录打上SELINUX标签
#podman run -d -t --v /opt/demo1:/opt:Z –name demo1 registry.redhat.com/mysql-56:latest /bin/bash
- 容器的网络:容器的网络有三种:host(复用宿主机网络),bridge(网桥模式),none(无网络)
- 指定容器网络
#podman run –network = host/bridgen/none(默认网桥模式) - 映射主机端口给容器:无根容器只能映射1024之后的端口
#podman run -d -t -p 80:8080 registry.access.redhat.com/ubi8/bin/bash
#podman run -d -t -p 192.168.0.100:80:8080 quay.io/ubi8 /bin/bash - 创建容器网络
#podman network create --subnet 192.168.0.0/24 --gateway 192.168.0.254 net1
#podman run --network=net1 -ip=192.168.0.100 --name demo1 quay.io/ubi8 /
13 容器与systemd集成实现开机自启动
- root用户
- 生成容器的service配置文件
1.1 生成文件:podman generate system --name --file --new demo(容器名) (文件生成在当前目录)
1.2 拷贝文件到systemd目录:cp container-demo.service /etc/system/system/
1.3 重新读取配置:systemctl daemon-reload
1.4 启动或者重启服务: #systemctl restart container-demo.service - 设置容器开机自动
#systemctl enable container-demo.service
- 普通用户(无根容器)
- ssh登录到普通用户(例如alice)
- 创建普通用户的systemd目录
2.1 创建普通用户服务配置存放目录:mkdir -p ~/.config/systemd/user
2.2 在上述目录中生成文件:podman generate system --files --new --name demo1
2.3 重新读取配置文件:systemctl --user daemon-reload
2.4 重启服务,让systemd接管容器:systemd --user restart container-demo1.service
2.5 设置容器开机自启动:#systemctl enable container-demo.service
注意:
用户登录时启动服务,注销时停止服务:
#systemctl --user enable --now container-demo1.service
用户启动保留日志
#loginctl enable-linger 用户启动保留日志
第二十九章 Ansible自动化运维
1 ansible的原理和安装
1.1 ansible原理
1.1.1 ansible 简介
ansible是一个it自动化工具,他能配置系统,部署软件,编排更花在的it任务,入连续的部署或零停机时间滚动更新
ansible利用python编写,尽管市面上有很多可供选择的配置管理放哪,但各有优劣,而ansilbe的特点在于简洁,让ansible在主流配置管理系统中与众不同的一点便是他并不需要在想要的每个节点上安装自己的组件
1.1.2 ansible的特性
Agentless:不需要在被管理节点上安装客户端,只需要有原生的sshd/winRM/snmp,强大到只要网络能到的地方,ansible都能到
- Serverless:在服务端不需要启动任何服务,只需要执行命令即可
- Modules in any language:基于模块工作,可以使用任意语言开发ansible模块
- YAML,not code:使用yaml语言定制playbook(剧本)
- SSH by default:默认使用ssh控制各节点
- Strong multi-tier solution:可实现多级控制(避免ssh连接数限制,在各区域内选择出级联节点与控制节点通信)
RHEL8 的 ISO 镜像源中包含 Ansible 及其依赖包,配置 yum 源安装即可: yum install ansible
1.1.3 ansible架构
1.1.4 ansble基本组件
- 核心:ansible
- 核心模块(core modules):这些都是ansible自带的模块
- 扩展模块(custom modules):如果核心模块不足以完成某种功能,可以添加扩展模块
- 插件(plugins):完成模块功能的补充
- 剧本(playbooks):把需要完成的多个任务定义在剧本中
- 连接插件(connection plugins):ansible基于连接插件连接到各个被控设备,虽然ansible默认使用ssh连接,但它还支持其他的连接方式,列如连接到windows,路由器交换机等设备所需的连接插件
- 主机清单(host inventory):ansible在管理多台主机时,可以选择只对其中一部分进行某些操作
1.1.5 ansible工作机制
Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、ZeroMQ) 推送到被管理节点,执行完操作后再将模块删除。可以使用版本控制系统(git/svn)来管理自定义模块及playbooks
1.2 ansible安装
ansible的安装有很多种方式,常用安装方式基于yum或者源码,如果基于yum安装,需要配置epel源
安装方式1
#yum -y install ansible
#ansible –version
安装方式二
访问ansible官网,下载源码包进行编译安装
安装方式三
访问国内各大开源网站镜像站,下载对应版本的epel进行下载,如下
2 ansible的主机清单和配置文件
2.1 主机清单
在使用ansible来批量管理主机的时候,通常先定义需要管理那些主机或者主机组,而这个用于管理主机与主机组的文件佳作inventory(主机清单),改文件默认位于/etc/ansible/hosts,当然我们也可以通过修改ansible的配置文件的inventory配置项来修改默认的inventory位置
2.1.1 定义主机和主机组
主机清单注意事项:主机清单中如果定义了主机组,则单个主机需要定义在主机组之前,否则会被识别成主机组中的成员,主机部分可以使用可解析的域名/ip/主机名等
192.168.195.128 普通ip定义
192.168.195.110
192.168.195.111
[mast] #定义普通组
192.168.195.128
[node]
192.168.195.110
192.168.185.111
[alls:children] #嵌套组
mast
node
[webservers]
192.168.195.[110:111]
[databaseserver]
db-[a:f]-wx.com
2.1.2 选择主机组
在前面定义的主机清单的时候我们会将所有可能要被管理的主机定义在其中,但我们实际使用的时候可能只需要对某一个,或者某一类主机进行操作,这个时候我们就需要通过匹配的方式来指定特定的主机或主机组
-
匹配所有主机:
#ansible all –list-hosts -
匹配指定的主机或者主机组
匹配单个主机:#ansible 192.168.195.110 --list-hosts
匹配单个组:#ansible dbserever --list-hosts
匹配多个主机:#ansible ‘192.168.195.110,192.168.195.111,192.168.195.112’ --list-hosts
匹配多个主机组:#ansible ‘mast,node’ --list-hosts
匹配不属于任何组的主机:#ansible ungrouped --list-hosts -
通配符匹配
匹配包含192.168的主机:#ansible ‘192.168.*’ --list-hosts
匹配包含server的主机或者主机组:#ansible ‘server’ --list-hosts -
通配符组合匹配(多个条件间为或,&为且,!为取反)
匹配包含server但不包含db的主机或者主机组:#ansible ‘server,!db’ --list-hosts
匹配在mast组且在node组但不在alls组:#ansible ‘mast,&node,!alls’ --list-hosts -
正则表达式匹配
#ansible ‘~(web|no)..example.com’
表示匹配已web或者no开头,然后中间任意多个字符且已“.example.com”结尾的主机
~:表示这是一个正则表达式
(web|no):括号表示这个是一个整体,已web或no
.:表示任意多个字符
.:转义.的特殊含义,表示就是.这个字符 -
通过—limit明确指定主机(了解即可,)
ansible --limt 192.168.195.111 --list-hosts
引用文件
将主机列表写入文件,然后通过引用文件来达到选择主机的目的
ansible --limt @hostList.txt --list-hosts
2.2 配置文件
执行ansible时会按照优先级寻找ansible配置文件,如果没找到则向下一级寻找,如果都没有则会使用ansible默认的配置文件,其优先级如下:
- ANSIBLE_CONFIG环境变量
- 当前工作目录下的ansible.cfg
- 当前用户家目录下的.ansible.cfg隐藏文件
- /etc/ansible/ansible.cfg默认配置文件
2.2.1 配置文件详解
[defaults];通用配置项
[inventory]:与主机清单相关的配置项
[privilege_escalation]:特权升级相关配置项目
[paramiko_connection]:使用paramiko连接的项目配置项,paramiko在rhel6以及早期版本中默认使用ssh连接方式
[ssh_connection]:使用openssh连接的相关配置项,openssh是ansible在rhel6之后默认使用的ssh连接方式
[persistent_connection]:持久连接的配置项
[accelerate]:加速模式配置项
[selinux]:selinux相关配置项
[colors]:ansible命令输出的颜色相关配置项
[diff]:定义是否在运行时打印diff,(变更前后的差异)
简化的配置文件
[defaults] #通用配置
inventory = /etc/ansible/iplist 主机清单的路径
forks = 5 主机的并发数量 表示一次在五台主机上执行任务
sudo_user = root 提权到root
ask_sudo_pass = True 提权时 需要验证密码
ask_pass = True 连接时需要验证密码false时表示秘钥认证 true密码认证
remote_port = 22 ssh远程的端口
remote_user = root 远程连接的用户
host_key_checking = False 第一次连接时忽略主机公钥
command_warnings = False 执行命令时忽略警告信息
module_name = command 执行任务时默认使用的模块
[privilege_escalation]#提权配置
become= true #是否提权
become_method= sudo #提权的方式
become_user= root #提权到哪一个用户
become_ask_pass= false #提权是否需要密码验证
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s 开启ssh的参数,用来压缩连接的数据进行加速,以提升性能
2.3 ansible手动配置清单
ansible在执行ad-hoc(ansible临时命令)的时候,需要使用被控主机上的一个用户身份,默认这个用户是root,而实际生产环境中不建议直接使用root,推荐使用普通用户(如ansilb),且配置该用户可以通过sudo提权到root
- 被控主机创建ansible且配置sudo提权
#useradd ansible
#passwd ansible #实际生产环境中不建议给该用户设置密码,而是直接将管理端公钥写入被控端ansible用户
#echo ‘ansible ALL=(ALL) NOPASSWD:ALL’ >> /etc/sudoers.d/ansible - 在管理端修改ansible.cfg文件配置如下
[defaults]
inventory= ./hosts
ask_pass= false
remote_user= ansible
log_path= /var/log/ansible
[privilege_escalation]
become= true
become_method= sudo
become_user= root
become_ask_pass= false
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
host_key_checking= false
2.4 创建免密
#ssh-keygen #生成秘钥对
#ssh-copy-id -i ~/.ssh/id_rsa.pub ansible@192.168.195.110 #发送公钥到被控端
2.5 测试
#ansible node110 -m ping
2.3.1 ansible自动配置清单
当前部分内容引用了ansible的ad-hoc,如果看不懂请看完【3 ansible ad-hoc与命令执行模块】再返回来看当前部分类容
通过ansible在远程主机上创建ansible用户并指定密码(如果失败,放开ansible.cfg文中host_key_checking = False的注释)
ansible node110 -m shell -a ‘useradd ansible;echo dragon |passwd --stdin’ -u root -k -v
通过ansible在远程主机上设定ansible用户提权
ansible node110 -m shell -a ‘echo ansible node110=(ALL) NOPASSWD:ALL >>/etc/sudoers.d/ansible’ -u root -k -v
通过ansible在远程主机创建ansible用户免密文件存放目录,并更改属组信息为ansible
ansible node110 -m shell -a 'mkdir /home/ansible/.ssh; chown ansible:ansible /home/ansible/.ssh ’ -u root -k -v
通过ansible在远程主机创建公钥文件、修改属组为ansible,修改权限为600
ansible node110 -m shell -a 'touch /home/ansible/.ssh/authorized_keys;chown ansible:ansible /home/ansible/.ssh/authorized_keys; ’ -u root -k -v
查看mast主机公钥
[root@ycf01a ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSpsXUJOIynlD69/fl7kvri/6kuuYyxmPafj0H/722+KgULyBoEV1/4iO4DDIBmMmrnzsyyU6gwZ19o6DivG8HA+GUrmH8C/0/s1F7ZxQ/RLm9r79oyFY8OfmC5NYKtrjvSgpeytIi7S1tFjlN9cF0P/o14F9IGyyoP/BC1OOyJQ+GUepLRH4gxivrSfRNOJgaBtRVG1ofQNlcIQpu5IR/AnTgvax4nc0Ej3/mLgXjBTn9lEKAAeCgber3EB3xwhPtP+KDjhqyN7SyAJJYA21Xa2vOk5SI+e26lFWEEFWlRCPbKMgVMjjUC20s0ibqSZ4qiAXH6YuLISz98/g0xp0fysPz1VFMma1nMxHktS2oVgCro4ZQGijU0s8+5xZPotCE4bjg8C2hrMITOlEavh+kP92NkKXqHms5za2dIRyloeFYKBXEhFYcZleB9F4VHcuyyNLHh7dqQYv53KhCg5hjAV4oWonYOiiL0dDPYBljRMxoMuGvXR0JHzKDUXo8Xg0= root@ycf01a
[root@ycf01a ~]#
通过ansible将mast公钥写入远程主机文件
ansible node110 -m shell -a ‘echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSpsXUJOIynlD69/fl7kvri/6kuuYyxmPafj0H/722+KgULyBoEV1/4iO4DDIBmMmtRVG1ofQNlcIQpu5IR/AnTgvax4nc0Ej3/mLgXjBTn9lEKAAeCgber3EB3xwhPtP+KDjhqyN7SyAJJYA21Xa2vOk5SI+e26lFWEEFWlRCPbKMgVMjjUC20s0ibqSZ4qiAXH6YCg5hjAV4oWonYOiiL0dDPYBljRMxoMuGvXR0JHzKDUXo8Xg0= root@ycf01a >> /home/ansible/.ssh/authorized_keys’ -u root -k -v
测试:通过ansible ping远程主机
[root@ycf01a opt]# ansible node110 -m ping
192.168.195.110 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.195.111 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
[root@ycf01a opt]#
3 ansible ad-hoc与命令执行模块
3.1 ad-hoc简介
ad-hoc是指ansible下临时执行的一条命令,对于复杂的命令会使用playbook,ad-hoc的执行以来于模块,ansible官方提供了大量的模块,如command、raw、shell、file、cron等
帮助查询:
ansible-doc -l 查看所有模块
ansible-doc -s module 查看某个模块的参数
ansible-doc module 查看某个口快更详细的信息,/EXAMPLES可以在文档中查询样例
3.2 ad-hoc命令结构
ansible 主机或组 -m 模块名 -a ‘模块参数’ ansible参数
- 主机和组:在主机清单文件中指定的主机中进行选择
- 模块名:可以通过ansible-doc -l查看目前已安装的模块,默认不指定时使用的是command模块,默认模块可以在当前ansible使用的配置文件(ansible.cfg)中的#module_name= command配置项部分修改,
- 模块参数:可以通过ansible-doc 模块名 查看具体用法,/EXAMPLES可以查看样例
- ansible参数:可以通过ansible --help命令的帮助信息里查看,这里有很多参数可以选择,如是否需要输入密码、提权等
3.3 ad-hoc命令执行模块
命令执行模块包含如下四个模块
- command:该模块通过-a跟上要执行的命令可以直接执行,不过命令里如果带有【重定向符号”<>”、管道符“|”以及“&”】字符则执行不成功,command为ansible默认模块,可以使用modue name=shell来更改设置
- shell:用法基本和command一样,不过是通过/bin/sh进行执行,所以shell模块可以执行任何命令,就行在本机执行一样
- raw:用法和shell一样,也可以执行任意命令,就像在本机执行一样但和command.shell模块不同的是raw没有chdir(切换工作目录)、creates(文件判断,但文件存在时不执行)、removes(当文件存在时执行命令)参数
- script:将管理端的shell复制到被管理端上执行,其原理是先将shell复制到远程主机,再在远程主机上执行,注意不是把脚本复制到被管理端执行
3.3.1 shell模块
shell模块包含如下选项
- free_form:要执行的linux指令
- chdir:在执行前先切换到指定的目录,默认工作目录是远程主机的家目录
- creates:指定一个文件名,如果存在则不执行命令
- removes:指定一个文件名,如果不存在,命令不执行
- chdir示例,以下三个命令都会成功执行,但实际上只有前两个会在/tmp目录下创建对应的文件,而第三个实际上也被正常创建了,但因为不支持raw不支持chdir,所以被创建在了当前用户的家目录
#ansible node1 -m command -a ‘chdir=/tmp touch com.file’
#ansible node1 -m shell -a ‘chdir=/tmp touch shell.file’
#ansible node1 -m raw -a ‘chdir=/tmp touch raw.file’
- creates和removes示例:
#ansible node1 -a ‘creates=/tmp/text.txt uptime’ 当/tmp/text.txt文件存在时命令不被执行
#ansible node1 -a ‘removes=/tmp/text.txt uptime’ 当/tmp/text.txt文件不存在时命令不被执行
3.3.2 script模块
示例:要执行的脚本文件df.sh内容如下
#!/bin/bash
##############################################################
#File Name£ºdf.sh
#Version :V1 .
#Author: wangXiaoFeng
#Email: 1289832464@qq.com
#Created Time £º2023-01-27 09:18:06
#Description£º
#############################################################
df -h |grep -E '^/dev'
执行ansible指令,利用script模块在选中主机上执行df.sh脚本,注意:该脚本不用上传到远程主机
[root@ycf01a ansible]# ansible 192.168.195.110 -m script -a 'df.sh' -v
Using /home/ansible/ansible.cfg as config file
192.168.195.110 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.195.110 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.195.110 closed."
],
"stdout": "/dev/mapper/centos-root 17G 12G 5.1G 71% /\r\n/dev/sdb1 20G 9.7G 9.0G 52% /data\r\n/dev/sda1 1014M 185M 830M 19% /boot\r\n",
"stdout_lines": [
"/dev/mapper/centos-root 17G 12G 5.1G 71% /",
"/dev/sdb1 20G 9.7G 9.0G 52% /data",
"/dev/sda1 1014M 185M 830M 19% /boot"
]
}
4 ansible常用模块
4.1 file
file模块主要用于对远程主机上的文件操作,常见选项及选项如下
- path:必选项,定义文件/目录的路径
- state:状态/动作
- file:查看文件状态,默认选项,若文件不存在则报错提示文件不存在
- tourch:如果文件不存在则创建,如果存在则更新时间戳
- absent:删除目录、文件或者取消连接文件
- directory:日过目录不存在则创建目录
- link:创建软连接
- hard:创建硬连接
- owner:定义文件/目录的属主
- group:定义文件/目录的属组
- mode:定义文件/目录的权限
- src:要被连接的源文件路径,只适用于state=link的情况
- dest:被连接的路径,只适用于state=link的情况
- force:需要在两种情况下强制创建软连接,一种是源文件不存在但之后会创建的情况,另一种是目标软连接已存在,需要先取消之前的软连接然后创建新的软连接,有两个选项,yes/no
样例
#ansible node110 -m file -a ‘path=/tmp/test.txt state=file’
#ansible node110 -m file -a ‘path=/tmp/text.txt state=touch owner=root group=root mode=644’
#ansible node110 -m file -a ‘src=/tmp/text.txt desc=/root/text.txt state=link’
#ansible node110 -m file -a ‘path=/emp/test state=directory owner=root group=root mode=755’
#ansible node110 -m file -a ‘path=/tmp/test state=absent’
4.2 copy
copy模块:将本机文件复制到远程主机,包含如下选项
- src:要复制到远程主机的文件在本地的地址,如果路径是一个目录且以“/”结尾,则只递归复制目录下的内容,如果不是以“/”结尾,则将包含目录在内的整个内容全部复制
- dest:复制到远程主机的所在的绝对路径
- force:如果目标主机包含改文件,但内容不同,如果设置为yes则强制覆盖,如果为no则只有当目标主机的目标位置不存在该文件时才复制,默认yes
- backup:在覆盖前将原文件备份,备份文件包含时间信息,有两个选项 yes/no
- content:用于替代src,可以直接设定指定文件的值
- others:所有的file模块里的相关属性选项都可以在这里使用
- remote_src:复制远程主机的文件,即将远程主机的文件或目录复制到其他位置
样例
#ansible node110 -m copy -a ‘src=/data dest=/opt/soft/’
#ansible node110 -m copy -a ‘src=/data/ dest=/opt/soft/ ’
#ansible node110 -m copy -a ‘src=/etc/ansible/ansible.cfg dest=/opt/soft/ owner=root group=root mode=644’
#ansible node110 -m copy -a ‘backup=yes src=/etc/fstab desc=/opt/soft/ owner=root group=root mode=644’
#ansible node110 -m copy -a ‘content=”hello ycf01a” dest=/opt/soft/test.txt’
4.3 yum_repository
使用yum_repository管理yum仓库,其选项如下
- file:配置文件的名字,不包含repo,等同于Centos7.repo中的Centos7
- name:yum仓库的名字,等同于配置文件中“[]”中的名字
- description:仓库的描述信息,等同于配置文件中的name
- baseurl:yum源地址
- enabled:是否启用当前yum源仓库 yes/no
- gpgcheck:是否检查软件包的完整性 yes/no
- gpgkey:公钥地址
使用示例
#ansible node110 -m yum_repository -a ‘file=media name=BaseOS description=BaseOS baseurl=file:///media/BaseOS enabled=yes gpgcheck=yes gpgkey=file:///etc/pki/rpm-gpg/RPM-GG-KEY-redhat-release’
4.4 yum
使用yum包管理器来管理软件包,其选项如下
- name:要进行管理的软件包名字,也可以是一个url或者本地rpm包的路径
- state:状态/动作(present安装、absent卸载、latest更新到最新版本)
使用样例
#ansible node110 -m yum -a ‘name=httpd state=latest’
#ansible node110 -m yum -a ‘name=httpd state=absent’
#ansible node110 -m yum -a ‘name=”@Development Tools” state=present’
4.5 service
用于管理服务,该模块包含如下选项
- name:服务名称
- state:动作(started启动、stoped停止、restarted重启、reloaded重新加载)
- enabled:是否开机启动 yes/no
使用示例
#ansible node110 -m service -a ‘name=httpd state=started enabled=yes’
4.6 systemd
用于管理服务,包含如下选项
- name:指定服务名称
- state:动作(started启动、stoped停止、restarted重启、reloaded重新加载)
- enabled:是否设置开机启动 yes/no
- daemon_reload:当前服务配置文件发生改变时重新加载服务 yes/no
使用示例
#ansible node110 -m systemd -a ‘name=httpd state=started enabled=yes daemon_reload=yes’
4.7 cron
用于管理计划任务,包含如下选项
- name:该任务的描述
- state:确认该任务计划是创建还是删除(present创建、absent删除)
- user:以那个用户的身份执行
- minute:分(0-59)
- hour:小时(0-23)
- day:日(1-31)
- month:月(1-12)
- weekday:周(0-6)
- job:要执行的任务,依赖于state=present
- cron_file:指定配置文件,例如/etc/crontab,/etc/cron.d/*
使用示例
#每隔 2 分钟向/tmp/date.txt 文件中写入系统当前时间
#ansible node110 -m cron -a ‘name=“touch a file” state=present minute=“*/2” job=“echo $(date) >> /tmp/date.txt”’
#每天晚上 12 点使用 root 用户重启系统
#ansible node110 -m cron -a ‘name=“reboot system” state=present minute=0 hour=0 user=root job=reboot’
#删除上面两条计划任务
ansible node110 -m cron -a ‘name=“touch a file” state=absent’ ansible node110 -m cron -a ‘name=“reboot system” state=absent’
4.8 user
用于对用户进行管理,其选项有:
- name:用户名
- state:动作(present创建、absent删除)
- password:密码(不会自动加密,需先 openssl passwd -6 明文密码手动加密)
- uid:用户的 uid
- group:指定用户的主组
- groups:指定用户的附加组
- comment:定义用户的描述信息
- create_home:是否创建家目录 yes|no
- home:指定用户的家目录,需于 create_home 结合使用
- shell:指定用户的 shell 类型
- remove:删除家目录与邮箱 yes|no,需 state=absent
使用示例
①创建一个名为 haha 的用户,其密码设置为 123123,uid 为 1666,主组为 haha, 附加组为 bingren,描述信息为 hahahaha,家目录为/home/haha,并指定 shell 为/bin/bash
#[root@ycf01a ~]# openssl passwd -6 123123
$6$ZMnZJq3TK7sizP6l$qkdMmu6tc5IKNjPBVdfWZ.s/dtBwGHA0j2Vpc3r33trBru36wBhWl5U/H82wKpTuoFvUqnlk670dWUZsiLVin.
[root@ycf01a ~]# ansible node110 -m user -a 'name=haha state=present password= "$6$Cysyq7zUa2wlVhBT$VhdnabjyBrOHAV3wfbkhGS.VRQ9w7rnkVrimVEp5F8ssrfci. x9HhAHT9meQjj472gxJNtIbu6nZNA7KUjKSt0"
uid=1666 groups=bingren comment=hahahaha create_home=yes home=/home/haha shell=/bin/bash'
注意:group 主组无需指定,会自动创建;-a 后的模块选项需使用单引号包裹, 此时若使用双引号,password 字段中的$符合会被特殊翻译。
②删除上述创建的 haha 用户,同时删除家目录与邮箱
#ansible node110 -m user -a ‘name=haha state=absent remove=yes’
4.9 group
用于对用户组进行管理,其选项有:
- name:组名
- gid:指定组 id
- state: 动作(present创建、 absent删除)
使用示例
①创建一个名为 haha,gid 为 1888 的组
ansible node110 -m group -a ‘name=haha state=present gid=1888’
②删除上述创建的 haha 组
ansible node110 -m group -a ‘name=haha state=absent’
4.10 fetch
fetch与copy模块刚好相反,copy主要是把主控端文件复制到被控端,而fetch则是把被控端的文件复制到主控端,并在主终端指定的目录下以被控端主机名的形式来组织目录结构,常用选项有:
- src:要复制的文件在被控端的地址,只能是文件不能是目录
- dest:存放在主控端的地址,
- flat:默认是no,表示在主控端指定目录下以被控端主机名的形式来组织目录结构,yes宝石不会以被控端主机名的形式来组织目录结构, 为yes时候dest必须以/结尾
使用示例
#ansible node110 -吗fetch -a ‘src=/etc/shadow dest=/opt/soft’
#ansible node110 -吗fetch -a ‘src=/etc/shadow dest=/opt/soft/ flat=yes’
4.11 get_url
用于从 http、https、ftp 服务器上下载文件,其选项有:
- url:文件的 url 地址
- dest:指定下载后存放文件的目标目录
- owner:指定文件的拥有人
- group:指定文件的拥有组
- mode:指定文件的权限
- url_username:用于 HTTP 验证的用户名
- url_ password:用于 HTTP 验证的密码
使用示例
从http://192.168.195.110/ 服务器上下载 ycf01a.zip 文件至/tmp 目录,并设置文件属主为 ycf01a、 属组为 ycf01a,权限为 600
#ansible all -m get_url -a ‘url=http:// 192.168.195.110/ycf01a.zip dest=/tmp owner= ycf01a group= ycf01a mode=600’
从 192.168.195.110ftp 服务器上下载 ycf01a.zip 文件至/opt 目录,并设置文件属主为 ycf01a、 属组为 ycf01a,权限为 600 (ftp账号密码ftpuser/dragon)
#ansible all -m get_url -a ‘url=ftp://ftpuser: dragon @192.168.195.110/ ycf01a.zip dest=/opt owner= ycf01a group= ycf01a mode=600’
4.12 unarchive
用于解压文件,其选项有:
- src:需解压文件的源路径
- dest:文件解压后的存放路径
- remote_src:默认为 no,用于将主控端的文件解压至被控端,当该选项为 yes 时,用于将被控端的文件解压至被控端
- owner:解压后文件/目录的属主
- group:解压后文件/目录的属组
- mode:解压后文件的权限
- creates:指定一个文件名路径,当该文件不存在时,解压命令执行
- list_files:默认为 no,当为 yes 时会列出压缩包里的文件
示例
①将主控端/tmp/123.tar.gz 文件解压至 node110 节点的/opt 目录
#ansible node110 -m unarchive -a ‘src=/tmp/123.tar.gz dest=/opt’
②将被控端 node110 上的/tmp/123.tar.gz 文件解压至 node110 节点的/opt 目录
#ansible node2 -m unarchive -a ‘src=/tmp/123.tar.gz dest=/opt remote_src=yes’
4.13 synchronize
用于同步文件或目录,其选项有:
- src:需同步的文件/目录,目录已/结尾表示拷贝只拷贝目录内的所有内容,
- 不以/结尾表示拷贝目录本身及目录内的所有内容;
- dest:目标路径
- mode:模式(push(默认)从本机向远程主机同步、pull从远程主机向本机同步)
- compress:是否开启压缩
- delete:删除不存在的文件,默认为 no
- dest_port:目标主机上的端口,默认为 ssh 协议 22 号端口
- archive:归档,相当于同时开启 recursive(递归)、links、perms、times、owner、group、-D 选项都为 yes
- rsync_opts:rsync 的选项,选项之间用逗号隔开,如-a,-v,-z 等
使用示例
①将主控端的/opt 整个目录同步至 node110的/tmp 目录中
#ansible node110 -m synchronize -a ‘src=/opt dest=/tmp’
②将主控端的/opt/目录下的所有内容同步至 node110的/tmp 目录中
#ansible node110 -m synchronize -a ‘src=/opt/ dest=/tmp’
③将 node110上的/opt 整个目录同步至主控端的/tmp 目录
#ansible node110 -m synchronize -a ‘src=/opt dest=/tmp mode=pull’
5 ansibleplaybook及handler用法
ansible-playbook是一系列ansible命令的集合,利用yaml语言编写,playbook命令根据自上而下的顺序依次执行,同时playbook开创了很多特性,它可以允许创术某个命令的状态到后面的指令,如果可用从一台机器的文件中抓取内容并赋值为变量,然后在另一台机器中使用,这使得可以实现一些复杂的部署机制,这是ansible命令不能实现的
5.1 playbook结构
playbook是由一个或多个幕(play)组成的列表,play的主要功能是对选定主机应用play中定义好的任务(task),从根本上来讲task就是对ansible中某一个模块(module)的调用,而将多个play按照一定顺序组织到一个playbook中,我们称之为编排,一个完整的playbook主要由以下几个部分组成
- target section(目标部分):定义将要执行playbook的远程主机、用户、远程连接协议(默认ssh)
-
variable section(变量):定义playbook运行时需要的变量
- task section(任务列表):定义将要在远程主机上执行的任务列表
- handler section:定义task执行完成后需要调用的任务
5.1.1 target section
playbook中每一个play的目的都是为了让某个或某部分主机以指定的用户身份去执行后续任务,如果不特意指定,则直接使用ansible.cfg配置中的用户相关配置,也可以在playbook中定义如下:
- name: create file
hosts: node110,node111
remote_user: ansible
become: yes
become_mothod: sudo
become_user: root
tasks:
- name: create filess
file:
path: /tmp/txt
state: touch
5.1.2 Task section
play的主体部分是任务列表,任务列表中的各个任务按次序逐个在hosts中指定的所有主机上运行,运行完第一个再运行第二个,而不是在一个主机运行完所有任务后再到另一个主机运行,在自上而下运行某个playbook时,如果中途发生错误则整个playbook会停止执行,由于playbook的幂等性playbook可以被反复执行,所以即便发生了错误,在修复playbook后再从新执行以下剧本即可,不会影响已正常部署的内容
注解:幂等性:对同一个系统,使用同样的条件,ansible一次请求和重复的多次请求对系统资源的影响是一致的。通俗一点讲就是比如这一个任务的内容是去安装apache httpd这个软件,但这个任务去安装的时候发现apache httpd已经被安装了,这个结果与当前任务的目标期望值是一致的,所以只要任务的目标期望值是一致的,那ansible就认为任务是成功的
5.1.2.1 任务返回值调整
在tasks中如果报错,则整个playbook会被终止,可以使用更改命令退出码或者忽略报错也或者时候后续的Handler section来进行错误监控分支处理
- 如果命令或者脚本的退出码不为0(执行成功)可以使用如下方式替代(不会显示错误信息)
tasks:- name: run this command and ignore the result
#逻辑或,有一个为真则整个为真,在||/bin/true回为真,则整个语句返回为真
shell: /usr/bin/sommecommand || /bin/true
- name: run this command and ignore the result
- 可以使用ignore_errors来忽略报错(会显示错误信息,但不会终止剧本)
tasks: - name: run this command and ignore the result
#逻辑或,有一个为真则整个为真,在||/bin/true回为真,则整个语句返回为真
shell: /usr/bin/sommecommand
ignore_errors: True
5.2 Handler Section
在ansible playbook中,handler事实上也是一个task,只不过这个task默认并不执行,只有在被触发的时候才执行
- handler通过notify来监视某个或者某几个task,一旦task执行结果发生变化,则触发handler执行相应操作,
- handler会在所有的play都执行完毕后才会执行,这样可以避免但handler监视的多个task执行结果都发生变化之后而导致handler的重复执行(handler只需要在最后执行一次即可)
- handler格式
- notify:定义需与当前监控的具体任务对齐(代码7、11行)
- handlers:定义需与tasks对齐(代码6、14行)
- handlers中的name定义的值需与notify定义的值一致(代码11、15行)
- 默认情况下在一个play中,只要有task执行失败,则整个play终止,即使与handler关联的task之前成功执行,handler也不会被执行,如果希望这种情况下handler能正常执行,这需要添加如下第3行加入“force_handlers: yes”配置,这样即使第12行taks报错,但与handlers关联的第7行task是成功执行的,则handlers会被正常执行(注意,如果在第7行前还有其他任务失败,则play终止,handlers不会被执行)
1 - name: create user
2 hosts: node110
3 force_handlers: yes
4 vars:
5 userName: ycf0121
6 tasks:
7 - name: create user task
8 user:
9 name: "{{userName}}"
10 state: present
11 notify: get_users
12 - name: error print
13 shell: ls /optaaa
14 handlers:
15 - name: get_users
16 debug:
17 msg: hello "{{userName}}"
5.3 yaml基本语法
YAML 语言即 Yet Another Markup Language,是专门用来写配置文件的语言, 非常简介和强大,且便于人类读写。
- 基本语法规则如下:
①大小写敏感
②使用空格缩进,表示层级关系
③相同层级的元素需左侧对齐
④#表示注释当前行 - 支持的数据类型:
① 纯量:单个的不可再分的值,相当于 python 中单个变量;
② 数组:一组按次序排列的值,又称序列 sequence/列表 list, 数组元素使用短横线“-”开头,横线后面有空格隔开; - jake
- tom
- harry
③ 对象:键值对的集合,又称映射 mapping/字典 dictionary/哈希 hashes,对象中一组键值对使用冒号:分隔,类似于 python 中字典数据
platformName: android
plaformVersion: 9.0.1
yaml也允许将所有键值对写成一行 例如:{ platformName: android, plaformVersion: 9.0.1}
注意冒号后面必须带一个空格
yaml示例
5.4 playbook样例及执行
- playbook简单示例1:在选定主机上创建用户
一个简单的playbook示例 说明
#cat user.yml
- name: create user 对当前play实现功能的一个描述,后续执行过程中会打印改变量的值
hosts: all 指定对那被管理的主机进行操作
remote_user: root 指定在远程机器上执行操作时使用的用户,如果不指定则使用默认配置
gather_facts: false 在任务开始前执行setup模块收集主机相关信息,不用可以不指定
vars: 定义后续可能会使用到的变量
userName: “test” 定义一个名为userName的变量并赋值为test
tasks: 定义具体需要执行的任务
- name: create user 对任务进行描述,在执行过程中会打印改描述
user: name=”{{user}}” 任务内容,当前表示调用user模块并引用userName变量
- playbook简单示例2:在指定主机上安装httpd搭建web服务
#cat manage_apache.yml
- name: play to setup web server 指定当前play描述 搭建web服务
hosts: all 选中主机清单中所有主机
tasks:
- name: install lastest httpd 任务一描述 安装httpd
yium: 调用yum模块
name: httpd yum模块选项 指定需要操作的软件包 httpd
sitate: latest yum模块选项 指定动作类型 安装
- name: copy index.html 任务二描述 复制主控机器的网页文件到被控主机
copy: 调用copy模块
src: files/index.html copy模块选项 指定文件路径
dest: /var/www/html/index.html copy模块选项 指定被控端文件存放路径
- name: start httpd service 任务三描述 管理httpd服务
service: 调用service模块
name: httpd service模块选项 指定需要操作的服务名 htppd
state: started service模块选项 指定动作类型 启动
enabled: true service模块选项 指定开机启动
- 执行playbook
#ansible-playbook ./manage_apache.yml
5.5 playbook命令常用选项
- -u 指定用户
- -k 指定ssh远程连接密码
- -K 指定sudo提权密码
- -C 测试运行playbook 不会真正执行
- -v 打印运行结果,-vv打印任务运行结果及配置信息,-vvv打印更详细的信息
- –syntax-check 检查语法信息
5.6 Multiple Plays(多幕剧本)
在playbook结构中曾介绍过剧本(playbook)是又一个或多个幕(play)组成,这种由多个幕组成的剧本称之为多幕剧本(Multiple Plays),如下代码所示,第1行的幕(play)在node110服务器上安装httpd并设置开机启动,第15行的幕(play)在node111服务器上安装nginx,
1 - name: first play snstall web
2 hosts: node110
3 gather_facts: false
4 tasks:
5 - name: install the latest version of Apache
6 yum:
7 name: httpd
8 state: latest
9 - name: Start service httpd
10 service:
11 name: httpd
12 state: started
13 enabled: yes
15 - name: second play install nginx
16 hosts: node111
17 gather_facts: false
18 tasks:
19 - name: install nginx
20 yum:
21 name: nginx
22 state: latest
23 - name: Start service nginx
24 service:
25 name: nginx
26 state: started
27 enabled: yes
28
6 ansible变量定义和引用
6.1 变量定义规则
ansible支撑变量,用于储存在整个项目中重复使用到的一些值,以简化项目的创建于维护,降低出错的几率
- 变量必须以字母开头
- 可以有字母+数字+下划线组成
- ansible内置关键字不能作为变量
6.2 变量调试输出
有些时候我们在引用变量之前,可能需要知道变量是否正确或者包含什么内容,以便在执行过程中针对性处理,ansible提供了一个debug模块用于输出变量
常见选项
msg:直接打印输出内容
var:可以将变量传递给debug模块进行打印
示例
[root@ycf01a ansible]# cat var.yml
- name: echo var
hosts: node110
vars:
str1: 123
tasks:
- name: print msg
debug:
msg: this is debugmsg
- name: print var
debug:
msg: "{{ str1 }}"
- name: print varr
debug:
var: str1
tasks中的第一个任务 msg:this debugmsg 直接将“this debugmsg”进行打印输出
tasks中的第二个任务 msg:”{{ str1 }}” 调用str1变量进行打印输出
tasks中的第三个任务 var:str1 将变量str1传递给debug模块进行打印输出,结果如下
6.3 变量定义
6.3.1 主机清单中定义变量
所谓主机内置变量其实就是ansible.cfg配置文件中的选项,在其前加上ansible即成为内置变量,当然内置内置变量拥有比ansible.cfg选项更高的优先级,而且针对不同的主机,可以定义不同的值
- 一般连接
- ansible_host 用于指定被管理主机的真实ip
- ansible_port 用于指定被管理主机的ssh端口 默认22
- ansible_user 用于指定ssh连接时使用的用户名,默认为 “remote_user =的配置
- ansible_password 用于指定ssh连接时的密码
- 特权升级
- ansible_become 相当于ansible_sudo或者ansible_su,允许强制特权升级
- ansible_become_user 通过特权升级到的用户相当于ansible_sudo_user或者ansible_su_user
- ansible_become_pass 提升特权时所需的密码,相当于ansible_sudo_pass或ansible_su_pass
- ansible_sudo_exec 如果sudo命令不在默认路径,需要指定sudo命令路径
- 特定ssh连接
- ansible_connection ssh连接的类型,local、ssh、paramiko,默认ssh
- ansible_ssh_pass ssh连接时候的密码
- ansible_ssh_priate_key_file 秘钥文件路径,不使用ssh-agent管理秘钥文件时使用该选项
- ansible_ssh_executable 如果ssh指令不在默认路径中,可以使用该变量来定义路径
使用样例
如下图所示,但我们每个服务器有不同的用户、端口、密码的时候,则需要对清单中每个被控主机定义变量,或者定义其他自定义变量
[root@ycf01a ansible]# cat hosts
node110 ansible_host=192.168.195.110 ansible_port=22 ansible_user=root ansible_password=dragon
[root@ycf01a ansible]#
[root@ycf01a ansible]# ansible node110 -m debug -a 'var=serverName'
node110 | SUCCESS => {
"serverName": "nginx"
}
[root@ycf01a ansible]#
也可以利用vars对某个主机组进行批量定义,如果主机组定义的变量与主机定义的变量冲突,主机的变量优先级更高
[testGroup]
node110
node111
[testGroup:vars]
ansible_user=root
ansible_port=22122
6.3.2 通过vars定义变量
除了上述在主机清单中定义变量外,可以在playbook中通过vars关键字自定义变量,如下
vars:
http_port: 80
server_name: nginx
conf_file: /etc/nginx/conf/nginx.conf
6.3.3 通过vars_files关键字引入变量文件
通过vars_files关键字应用一个专门存放变量的yml文件来应用变量
示例
vars_files:
- /opt/vars/user.yml
- /opt/vars/demo.yml
其中/opt/vars/user.yml文件内容如下
[root@ycf01a ansible]# cat user.yml
users:
bjones:
first_name: bon
last_name: Jones
home_dirs: /users/bjones
acook:
first_name: anne
last_name: cook
home_dirs: /users/acook
6.3.4 注册变量:复用执行结果保存为变量
在有的时候我们需要将某一个任务的结果保存下来,以便在后续任务中做出判断,这种情况可以通过register关键字来实现将某一任务执行结果保存为一个变量,我们称之为注册变量
使用示例:将ls /opt的执行结果保存为get_file变量
- name: print registerVar
hosts: node110
gather_facts: false
tasks:
- name: get /opt file
shell: ls /opt
register: get_file
- name: print get_file
debug:
msg: “{{ get_file }}”
6.3.5 fact变量
ansible中有一个模块叫setup,用于获取远程初级的相关信息,并将这些信息作为变量在playbook中进行调用,而setup模块获取这些信息就依赖于fact
6.3.5.1 setup模块用法:
- 查看所有的fact信息:ansible test -m step
- 查看网卡信息:ansible test -m setup -a ‘filter=ansible_ens160’
- 查看主机内存信息:ansible test -m setup -a ‘filter=ansible_*_mb’
- 查看所有主机的信息输入到/tmp/facts目录 ansible all -m setup –tree /tmp/facts
6.3.5.2 facts数据中经常获取的信息
ansible_python_verson python版本
ansible_distribution 显示是什么系统
ansible_distribution_major_version 显示系统主版本
ansible_devices 显示磁盘设备信息
ansible_lvm 显示lvm相关信息
ansible_memtotal_mb 显示系统总内存
ansible_kernel 显示内核版本
ansible_ens160 显示网卡版本
ansible_fqdn 显示主机fqdn
ansible_hostname 显示主机名
6.3.5.3 facts变量引用
facts数据的顶级key为ansible_facts,但自动收集的facts比较特殊,它以ansible_facts作为key,ansible每次收集后会自动将其注册为变量,所以facts中的数据都可以直接通过变量引用,
使用示例:收集被控端ipv4的address
应该写成ansible_ens160.ipv4.address,
而不是ansible_factsansible_ens160.ipv4.addres
6.3.5.4 开启/关闭收集facts
如果不用到facts数据,可以手动关闭收集功能,如果手动关闭后则不收集信息,但仍然可以在后续通过手动调用stup模块进行收集
- name: print facts info
hosts: node110
gather_facts: false #默认是开启,如果手动关闭后则不收集信息,但仍然可以在后续通过
tasks:
- name: get facts
setup:
- name: debug info
debug:
msg: “{{ansible_ens160.ipv4.address}}”
6.3.6 自定义facts变量
1、 在被控端主机上创建存放fact变量文件的/etcansible/facts.d
2、 编写facts文件并推送到被控端
3、 推送到被控端后,使用setup获取facts信息会发现自定义的fact变量被存储在ansible_local的变量名中
6.3.6.1 使用set_fact模块定义新的变量
6.3.6.2 使用lookup生成变量
使用方法 lookup( ‘方法’ , ‘ 内容’ )
例如
6.4 ★魔法变量
ansible默认会提供一些内置变量可以实现一些特定的功能,我们称之为魔法变量,
- hostvars:获取某台指定主机的相关变量,如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为db.exmaple.com,ip绑定在eth0网卡,我们可以通过如下方法在web服务器上调用db服务器的ip地址
{{ hostvars[‘db.example.com’].ansible_eth0.ipv4.address }} - inventory_hostname:识别当前正在运行的task的主机名
{{ hostvars[inventory_hostname].ansible_eth0.ipv4.address }}获取当前任务主机的ip - groups:是inventory中所有主机组的列表,可用用于枚举主机组中的所有主机
{{ groups }}:列出所有主机
{{ group.test }}:列出test组中所有的主机,
{{ group_names }}列出当前zheng在执行task的目标主机位于的主机组
6.5 变量引用
- 针对6.3.2中通过vars关键字定义的简单变量(纯量)我们可以直接通过 {{ 变量名} } 进行调用
- 针对5.3.3中应用的yml文件中复杂变量(数组或者对象),如果需要获取users对象中bjones用户的first_name则可以使用如下方法
{{ users.bjones.first_name }}
7 ansible Playbook条件语句
ansible条件语句的场景
据前面任务的执行结果来判断后续任务是否还有执行的必要性,
需要限制任务执行所需最小配置,比如内存最低需求以及存储空间
根据目标主机的特性来执行不同的任务,比如安装软件包,centos用yum,ubunt使用apt-get
用来检测服务器的配置是否发生改变,如果改变这重载配置或者重启服务
when基本使用:
在ansible中使用条件判断的关键字是when,示例:在安装软件包时需要根据主机操作系统来选择安装命令,或者但磁盘满了之后需要清空文件等,可以使用when来判断,但表达式结果为false时跳过本次任务
示例:安装vim时根据操作系统来调整使用的安装命令
- name: install vim
host: all
task:
-name: install vim yum
yum:
name: vim-enhanced
state: installed
when: ansible_os_family == “RedHat”
-name: install vim apt
apt:
name: vim
state:installed
when: ansible_os_family == “Debian”
-name: Unexpected OS fimily
debug:
msg: OS fimily {{ ansible_os_family }} is not supported
when: not ansible_os_family == “RedHat” or ansible_os_family == “Debian”
7.1 比较运算 - ==:比较两个对象是否相等,相等则返回真。可用于比较字符串和数字、
- !=: 比较两个对象是否不等,不等则为真
->:比较两个对象的大小,左边的值大于右边的值,则为真 - <:比较两个对象的大小,左边的值小于右边的值,则为真
-
=: 比较两个对象的大小,左边的值大于等于右边的值,则为真
- <=:比较两个对象的大小,左边的值小于等于右边的值,则为真
示例:
when: ansible_machine == “x86_64”
when: max_memoy <= 512
7.2 逻辑运算符号 - and: 逻辑与,当左边和右边两个表达式同时为真,则返回真
- or: 逻辑或,当左右和右边两个表达式任意一个为真,则返回真
- not: 逻辑否,对表达式取反
- ():当一组表达式组合在一起,形成一个更大的表达式,组合内的所有表达式都是逻辑与的关系
示例:
#逻辑或
when: ansible distribution == “RedHat” or ansible distribution == "Fedora’
#逻辑与
when: ansible distribution version == “8.0” and ansible kernel == "4.18.0-80.el8.x86 64”
#组合
when: =>
( ansible distribution == “RedHat” and ansible distribution major version == “8”)
or
( ansible distribution == “Fedora” and ansible distribution major version == "28”)
7.3 条件判断
7.3.1 判断变量
defined: 判断变量是否已定义,已定义则返回真
undefined: 判断变量是否未定义,未定义则返回真
none: 判断变量的值是否为空,如果变量已定义且值为空,则返回真
示例:
7.3.2 判断执行结果
ok:目标状态与期望值一致,没有发生变更
change或changed: 目标发生变更,与期望值一样
sucess或succeeded: 目标状态与期望值一致,或者任务执行成功
failure或failed: 任务执行失败s
kip或skipped:任务被跳过
示例
7.3.3 判断路径
fle: 判断指定路径是否为一个文件,是则为真
directory: 判断指定路径是否为一个目录,是则为真
link: 判断指定路径是否为一个软链接,是则为真
mount: 判断指定路径是否为一个挂载点,是则为真
exists: 判断指定路径是否存在,存在则为真
特别注意:关于路径的所有判断均是判断主控端上的路径,而非被控端上的路径
7.3.4 判断字符大小写
lower: 判断字符串中的所有字母是否都是小写,是则为真
upper: 判断字符串中的所有字母是否都是大写,是则为真
7.3.5 其他条件判断
subset 判断一个list是不是另一个list的子集: when: a is subset(b)
superset 判断一个list是不是另一个list的父集: when: b is superset(a)
in 判断一个字符串是否存在于另一个字符串中,也可用于判断某个特定的值是否存在于列表中supported distros:
- RedHat
- CentOs
when: ansible distribution in supported distros
string 判断对象是否为一个字符串,是则为真 when: var1 is string
number 判断对象是否为一个数字,是则为真 when: var3 is number
7.3.6 条件判断与block
当我们多个任务使用同一个判断条件时,ansible提供了一种很好的解决方式,在ansible中使用blokc来对多个任务进行组合,当做一个整体,我们可以对这个整体来做判断条件,但条件成立时则执行块中的所有任务
7.3.7 错误处理
7.3.7.1 resue
block除了能和when一起使用之外,还能做错误处理,这个时候就需要rescue关键字,但blokc中发生错误的时候,可以使用grescue对错误进行处理
7.3.7.2 always
但block执行失败时,rescue中的任务才会被执行,而无论block执行失败还是成功,always中的任务都会被执行
7.3.7.3 fail
fail模块用于终止当前playbook的执行,通常与条件语句组合使用,但满足条件时终止当前play的运行,选项只有一个:msg,终止前打印输出信息,示例:使用fail模块中断playbook输出
- hosts: test
tasks:- shell; echo "Just a test–error
register: result - fail:
msg: “Conditions established,nterrupt running playbook”
when: "“error’ in result.stdout” - debug:
msg: “I never execute,Because the playbook has stopped”
7.3.7.4 failed_when
实时上fail和when组合使用的时候,还有一个更简单的写法,即failed_when,但满足某个条件时,ansible主动触发失败,ansible一单执行返回失败,后续操作就会中断,所以failed_when通常可以用于满足某种条件时主动终止playbook运行的一中方式
示例:如果command_result存在错误且错误输出中包含ERROR字符串,即返回失败状态
- shell; echo "Just a test–error
- hosts: test
tasks- name: this command prints ERROR when it fails
command: /usr/bin/example-command -x -y -z
register: command result
failed_when: “ERROR’ in command result.stderr”
- name: this command prints ERROR when it fails
8 ansible playbook循环语句
8.1 with_items:循环列表
8.2 with_dict:循环字典
8.3 循环语句loop
在ansible2.5及以前的版本中,所有的循环都使用with_x风格,但从2.6起,官方开始推荐使用loop关键词替代with_x风格的关键词,如下示例,启动http和postfix服务
- hosts: node1
tasks- name: postfix and httpd are running
service:
name: "(f item )
state: started
loop:
- postfix
- httpd
- name: postfix and httpd are running
9 ansible 文件管理模块
9.1 lineinfile模块
lineinfile模块主要对单行文本进行处理,支持正则表达式,主要是改配置文件
常用参数
- path: 要修改的文件
- regexp: 正则表达式匹配要修改的行
- line: 修改或者插入行的内容
- insertbefore: 在匹配的行前面插入
- insertafter: 在匹配的行后面插入
- backup: 是否备份文件
- create: 文件不存在则创建文件
- validate: 验证文件修改的有效性,需要文件自带验证机制
示例:修改SELinux为禁用,即将/etc/selinux/config中SELINUX=开头的行换成SELINUX=disbled - name: lineinfile demo
hosts: node2
gather_facts: false
tasks:
- name: disabled selinux
lineinfile:
path: /etc/selinux/config
regexp: ‘^SELINUX=’
line: ‘SELINUX=disabled’
9.2 blockinfile模块
blockinfile模块主要是对多行文本进行处理,主要是写配置文件
10 ansible jinja2模块管理
1、jinja2是基于python的模板引擎,那么什么是模板?
案例: 假设说现在我们需要一次性在10台主机上安装redis,这个通过playbook现在已经很容易实现默认情况下,所有的redis安装完成之后,我们可以统一为其分发配置文件。这个时候就面临一个问题,这些redis需要监听的地址各不相同,我们也不可能为每一个redis单独写一个配置文件。因为这些配置文件中,绝大部分的配置其实都是相同的。这个时候最好的方式其实就是用一个通用的配置文件来解决所有的问题。将所有需要修改的地方使用变量替换,如下示例中redis.confj2文件
修改redis的配置文件如下:
bind {{ ansible_ens160.ipv4.address }} 127.0.0.1
将其作为模板文件发送到被控端
- name: copy redis.conf to dest
template:
src: redis.conf.j2
dest: /etc/redis.conf
2、在playbook中使用jinja2
- playbook使用template模块来实现模板文件的分发,其用法与copy模块基本相同,唯一的区别是,copy模块会将原文件原封不动的复制到被控端,而template会将原文件复制到被控端,并且使用变量的值将文件中的变量替换以生成完整的配置文件。
- 关于template模块的更多参数说明:
- src: 源模板文件路径
- dest: 目标文件路径
- group: 目标文件属组
- mode: 目标文件的权限
- owner: 目标文件属主
- force: 是否强制覆盖,默认为yes
- backup: 如果原目标文件存在,则先备份目标文件
3、Jinja2条件语句
- 我们直接取了被控节点的eth0网卡的ip作为其监听地址。那么假如有些机器的网卡是bond0,这种做法就会报错。这个时候我们就需要在模板文件中定义条件语句如下:
{% if ansible bondo is defined %}
bind {{ ansible bondo.ipv4.address }} 127.0.0.1
{% elif ansible ens160 is defined %}
bind {{ ansible ens160.ipv4.address }} 127.0.0.1
{% else %}
bind 0.0.0.0
{% endif %}
11 ansible roles角色管理
第三十章 考试相关
1 关于考试
- RHCE考试的科目一共需要参加两场
RHCAS红帽系统管理员(RH124 RH134 考试代码EX200)
RHCE系统工程师(RH294) - 考试时间 要求在一天内完成,上午考RHCSA(3小时),下午考试RHCE(4小时)
- 做题时间 RCHSA最好40分钟内完成,RHCE 1.5小时以便有在把环境弄崩溃后有时间让考官重置服务器来重做
- 考试题量
RHCSA 25个题目,其中有2-3个附加题(每场考试随机变题),
RHCE16个题目,其中有3道题有两个版本(即同一个问题有两种提问方法) - 考试的证书:两个证书 RHCSA RHCE
RHCSA考挂了,RHCE过了,一个证书都没有,补考RHCSA就会办法RHCE证书
RHCSA考过了,RHCE没过,会得到一个RHCSA证书
补考费:RHCSA(1500) RHCE(3000) - 考试的分数:满分300 通过要求210
- 考试内容:填写个人信息:
- 姓名:英文格式的拼音(姓名是倒着的、首字母大写),例如张三丰 SanFengZhang
- 邮箱:使用国内主流遇见服务器(网易、新浪、腾讯…不推荐国外或企业邮箱),且下列三个地方需要使用同一个邮箱
- RHN ID 红帽官网ID红帽注册账号的邮箱
- 考试的时候需要邮箱
- 考完后绑定证书也需要验证邮箱
- 补考需要填ID
- 证书有效期:3年
这3年表示在此期间可以随时下载证书,且用于公司招投标
过期后证书不能下载,且不能用于公司招投标,但证书和考试记录仍然可以查到 - 证书续期:(红帽高顶级证书可以刷新低等级证书有效期)
方式一:重考RHCSA和RHCE,在rhcsa失效前补考rhce即可
方式二:升级:选择考一门CA 4500 刷新RHCE和RHCSA 得到某一个CA某个科目的证书
2 考试流程
- 考试报名:老师帮助报名,个人无法报名
- 考试证件:二代身份证、临时身份证(电子身份证)、辅助证件原件(驾驶证)
- 考试位置:外地考试建议提前一天到达考场熟悉考试位置、联系人电话等
- 流程:已武汉为例:
-
到达后询问前台(考试)
-
等待考试(休息室)
-
考官验证考试环境
-
通知联系人()
-
联系人通知大家签到
-
进入考场(找个喜欢且屏幕正常的位置坐下)(不要动电脑)
-
根据考官提示填写个人信息(不会填写的可以呼叫考官)
-
确认提交后进入第二页(考试调查)(类似满意度调查 随便勾选几个即可)
-
确认提交后到达第三页(确认考试信息),如果信息填错了举手呼叫考官回退服务器后点击back,确认后提交,屏幕黑屏(大概几秒到几十秒),考官会切换到考试环境
-
考官会提示 打开【菜单】-【所有应用程序】-
-
红色帽子[View Exam]是考题(认真查看考题须知)
-
小电脑图标是考试所需虚拟机
-
开始考试答题