网络
开机启动
第二天:
基础命令
man
ls
-l 长格式
-rw-------. 1 root root 6503 Apr 23 2020 anaconda-ks.cfg
dr-xr-xr-x. 5 root root 4096 May 7 2020 boot
brw-rw----. 1 root disk 252, 0 Aug 14 17:27 vda
lrwxrwxrwx. 1 root root 15 Aug 14 17:26 stderr -> /proc/self/fd/2
- 普通文件
d 目录
b 块设备
l 软连接、符号链接
p 管理我呢见
s 套接字
c 字符
查看所有块设备
ls -l | grep ^b
查看所有s结尾
ls -l | grep s$
dr-xr-xr-x. 5 root root 4096 May 7 2020 boot
5代表连接数,五个目录,包括 . ..
-a 显示隐藏文件
-t 按照文件生成时间排序
-r 按照文件生成时间逆向排序
生成一个文件
dd if=/dev/zero of=/test.raw bs=1G count=2
ll -h /test.raw
-rw-r--r--. 1 root root 2.0G Aug 14 18:13 /test.raw
-h 文件大小可视化
-Z selinux安全性上下文
-R 显示子目录内容
cd 切换目录
cd ~ 家目录
cd - 返回上次目录
pwd 显示当前目录 print work direc
/etc/bashrc 修改45行 W改为w,在终端显示完整路径,修改后bash生效
mkdir生成目录
mkdir xx
-p 连续创建目录
!mkdir执行上次命令
rmdir删除目录 先cd过去
-p 连续删除目录 rmdir test1/test2/ -p
touch 1.txt 创建空文件
第二次 创建已有的1.txt
stat xx 查看文件详细信息
access time Atime 访问时间
modify time Mitme 修改时间
Change time Ctime 修改文件的权限时间
touch 保证三个时间一致
cp复制命令
cp -a a包含dpr参数 复制目录,连同目录子文件一块复制
-d 如果目录有软连接,一块复制
-p 权限复制
-r 递归
-i 目标同名文件提示
-f 覆盖目标同名文件不提示
cp -r -i -f -p -d 复制文件
-v verbose 显示进度
不使用别名 \cp
move文件移动、剪切、重命名
-b backup 同名文件备份 ~
-f 强制覆盖
rm 删除
-f 强制删除
-r 递归删除目录
rm只删除inode
cat 显示文件内容
cat -n 显示行号
输出重定向将文件内容合并
cat 1.txt 2.txt > new.txt 覆盖
cat 1.txt 2.txt >>new.txt 追加
清空文件数据段内容
cat /dev/null > 3.txt
head
显示前10行
head anaconda-ks.cfg -n 10
显示前10个字符
head anaconda-ks.cfg -c 10
tail
显示后10行
tail -n 10
显示后10个字符
tail -c 10
实时输出
tail /var/log/secure -f
more 翻页显示
回车一行
空格一页
b 上一页
q 退出
+/xx 直接显示xx
+100 直接显示100行
管道符 将不同命令结合使用
cat -n anaconda-ks.cfg | more +100 显示第100行
less 翻页显示,支持上下键
find命令
不加参数 查看当前目录下所有文件和目录
find /etc -name inittab 查找etc下ininttab文件
find / -iname myhosts 忽略大小写查询
grep显示文件数据库内关键字的行
grep runlevel /etc/inittab
多关键字 -e
grep -e runlevel -e target /etc/inittab
显示不匹配文本的所有行 -v
grep -e runlevel -e target /etc/inittab -v
不显示空行和注释行,仅显示有效内容
grep -e ^# -e ^$ 4.txt -v
显示关键词行和后三行
grep runlevels /etc/inittab -A 3
tree 树状显示文件夹
tree /opt/ -d 只看目录
tree /opt/ -L 1 只显示1级目录
tree / -L 1 -F 显示全路径
tree / -L 1 -F -p 显示权限
硬链接 inode号相同
1、不占用inode编号
2、节约空间
不能够跨文件系统
创建链接
ln xx xx
软连接
1、可以跨文件系统
2、需要源文件存在,否则链接文件失效
3、跨文件系统之后,需要占用inode编号
创建软连接
ln -s
时间 date
CST 中央标准时间
UTC 格林威治时间
date -u 显示格林威治时间
timedatectl
timedatectl set-time "2022-07-14 18:00:00" 修改时间
激活NTP服务器
timedatectl set-ntp true
修改时区
timedatectl set-timezone Asia/Singapore
w 显示终端登陆状态
up 6:06, 开机6小时
who 谁正在登陆
last一段时间内用户登录情况
lastb
hostname查看主机名
hostnamectl查看系统信息
hostnamectl set-hostname servera设置主机名
uname查看内核信息
df 查看文件系统
df -h
df -hT 查看文件系统
df -iTh 查看inode空间
du 文件目录具体大小
du -h -m -k 显示单位
du -sh ~ 显示目录空间大小
du -sh * 当前目录每一个文件大小
du -sh /* 根目录下每一个文件大小
lscpu查看cpu信息
free -h 查看内存信息
tar -zcvf 创建
tar -ztvf 查看
tar -zxvf 解压 -C 指定目录
shell环境
history -c 从内存中清除命令
history -w 清除用户目录下.bash_history文件
alias xx
unalias xx
alias la='ls -alth'设置别名
单个用户
.bashrc
全局用户
/etc/profile
vi编辑器
编辑模式 - 插入模式 - 命令模式
vi +15 xx 光标定位文件15行
vi + xx 光标定位最后一行
vi +/xx xx 光标定位到xx
:set nu显示行号
翻页ctrl + u d f b
nzz 50zz 跳转到第50行
zz 滚动到底部
i 插入光标前
a 光标后
I 行首
A 行尾
o 当前行之下插入一行
O 当前行之上插入一行
寄存器操作
p 取出 粘贴
P 光标之上粘贴
nyy 复制行 2yy 复制两行
nyl 复制字符 2yl 复制两个字符
ndd 删除行 2dd删除两行
ndl 删除字符 2dl删除两个字符
x 单个删除
搜索
/
?
:set nu 显示行号
:set nonu 隐藏行号
替换
:2,5s/a/A/g 2-5行a替换成A
:1,$s/a/A/g 全部替换
删除列
1、crtl+v
2、移动光标选择
3、x删除
非兼容模式,避免出现AB情况
:set nocompatible
第三天:
/etc/passwd 本地用户账户属性的定义文件,加密口令不放在其中
用户名 密码 UID GID 备注信息 家目录 shell工作环境
root:x:0:0:root:/root:/bin/bash
root 用户名 唯一 区分大小写
x 历史遗留问题 保证兼容性
0 UID
0 该用户所在的私有组、主要组的ID GID
root 备注信息
/root 家目录
/bin/bash shell环境
存放加密口令 /etc/shadow
root:$6$ElcThAePSlHegjYu$j.6Ir2SZUdDfS2nO7eHlaT0nzaFINgSnCFy0pU.xCggeYmbkcUdMawtdKvB6CqbTletZTMcBiHyF0C8USmN8j/:18389:0:99999:7:::
root 用户名
$6 加密口令
$6 加密hash方式 SHA-512
$1 MD5
$5 SHA-256
$oZ1JGQiQ salt 防止、避免多个用户设置同样的密码的时候密文账号一样
$j.6Ir2SZUdDfS2nO7eHlaT0nzaFINgSnCFy0pU.xCggeYmbkcUdMawtdKvB6CqbTletZTMcBiHyF0C8USmN8j/ 散列值
18389 最近更改过的日期的值
0 什么时候可以进行更改,0代表随时可以更改
99999 什么时候密码过期 一般为42-60天 最晚90天过期
incative 宽限天数
expire 账户的过期时间
blank 预留字段
创建用户 useradd upnange
1、passwd有了upnange属性记录
2、shadow有了upnange时间属性
3、用户UID基于目前最大的UID+1
4、创建该用户同名的组upnange,GID和UID保持同步
5、/home目录下给该用户创建家目录
6、linux给该用户一个正常的工作环境bash,可以通过本地、远程进行登录
7、linux会在/var/spool/mail目录创建该用户的mail邮件交换空间
8、linux会在/var/spool/cron未来定义使用该用户的计划任务作业
意义:
1、掌握细节
2、通过加参数自定义创建用户
3、了解用户规则的控制文件 /etc/default/useradd /etc/login.defs
4、修改用户属性
5、删除用户
用户创建控制文件
/etc/default/useradd
useradd defaults file
GROUP=100
HOME=/home 家目录
INACTIVE=-1 没有宽限期
EXPIRE=
SHELL=/bin/bash 默认shell
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes 创建邮件池
grep -e "#" -e "^$" -v /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5 密码长度
PASS_WARN_AGE 7
UID_MIN 1000 UID从1000起步
UID_MAX 60000
SYS_UID_MIN 201 系统用户从201开始
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
useradd upwen
自定义需求:
UID 1600 ,私有组和root在一个组
useradd -u 1600 -g root upnange1
upnange2 /opt/upnange2 不能够进行交互式登录
useradd -d /opt/upnange2 -s /sbin/nologin upnangen2
upnange3 过期时间 宽限期
useradd -e "2022/09/20" -f 2 upnange3
用户设置口令
通过passwd设置,具备特殊权限,管理员 | 普通用户 设置口令
1、交互式方式
passwd | passwd upnange
2、结合echo、管道、标准输入的方式输入密码
echo "redhat" | passwd --stdin upnange1
结合shell脚本位置变量
管理员root密码重置
1、重启
2、grub界面按e进入
3、找到linux开头行最后执行rd.break中断,二虚环境删除con
4、执行ctrl+x开始后续挂在使用sysroot的步骤
5、来到救援模式执行mount -o rw,remount /sysroot
6、执行chroot /sysroot 切换sysroot路径到根文件系统
7、echo | passwd给root修改密码
8、如果selinux开着 出发relable安全策略 执行touch /.autorelabel 非常关键
9、执行sync 状态从内存中读取
10、执行两次exit退出,此时触发selinux安全策略
chage修改账号 密码的过期时间
PASS_MAX_DAYS 最大密码过期时间
PASS_MIN_DAYS 最小可修改密码时间,0可以随时修改
chage -l root 查看root用户当前密码策略
chage -M 42 root 修改密码最大过期时间42天
-m 2 最小可修改密码天数2天
chage -E "2022/09/10" root 账号过期时间
更改用户属性 usermod
useradd -u -g -G -d -s -e usermod复用参数
给用户附加一个组
usermod -aG grid oracle -a append追加
useradd user1
让user1家目录改成/opt/user1目录 家目录迁移 /home/user1 > /opt/user1
usermod -d /opt/user1 user1 -m m迁移目录文件
useradd user2
临时锁定该用户不能登录使用
usermod -L user2
tail -3 /etc/shadow 叹号代表锁定
upnange3:!!:19224:0:99999:7:2:19255:
user1:!!:19224:0:42:7:::
user2:!$6$Hw5Ojxz/RSGu8AYh$3TovAvQjQlSKMPC4O7PcPpXZw/N7K5iAlu8sg4Ki0uezKKzHMZ.bUMkF6SLLMlqex5Q.5.FlFF8s.jzyKoDyq.:19224:0:42:7:::
-U解锁
usermod -l user200 user100 修改用户名,用户目录不变
修改shell环境
chsh -s /bin/bash user200
查找passwd文件中UID为0的文件
1、usermod -u 1009 user1 修改UID
2、usermod -L user1 锁定用户
3、userdel user1 删除用户
4、编辑passwd 注释掉user1
5、修改用户shell chsh | usermod -s
删除用户 userdel
-r 清理用户相关信息 属性、配置、家目录、mail
用户彻底删除后,该用户曾经的遗留文件会变为UID
id 查看用户ID信息,可以判断某个用户是否创建成功
-G 查看附加组
想知道一个用户在哪些组当中,用id命令查看
su 切换用户
su - 切换用户同时切换环境
配置su闲置
/etc/pam.d/su
auth required pam_wheel.so use_uid
usermod -aG wheel user400
只有user400可以su到root用户
用户管理:
1、创建 useradd
2、改属性 usermod
3、删除 userdel
4、账户 密码复杂性 长度 用户su
5、chage 密码过期 账户过期时间
6、root用户 密码恢复
组
/etc/group
root:x:0:
root组名
x 历史遗留兼容性
0 GID
最后一位为附加组
groupadd -g 新建指定组ID
groupmod -n 改组名
groupdel 删除组,私有组无法删除
用户添加或者从组中移除,附加组
gpasswd -a 添加
gpasswd -d 移除
用户权限管理
对用户 | 组设置权限
1、基本权限
2、特殊权限
3、ACL权限
属主 属组 其他 基本权限
普通文件 r访问 w修改 x执行
目录 r浏览遍历 w删除目录中内容、移动目录内容 x可以切换到该目录
权限表示:
1、数字表示
r4 w2 x1 -0
在root工作环境下
文件-rw-r--r-- 644
目录drwxr-xr-x 755
2、文字表示
属主u
属组g
其他人o
所有人a
没有-
修改权限:
chmod
增加执行权限 chmod 755 file
chmod u+x,g+x,o+x file 或 a+x file
chmod -R 递归
ACL权限 细粒度权限分配 文字标识法
setfacl -m u:upwen1:rwx file1 根据用户添加权限
setfacl -m g:upwen:rw- file1 根据组添加权限
setfacl -m o 对其他人
-M 根据目前的ACL修改
-x 根据文件中的访问控制列表删除条目
-b 删除所有访问控制列表
-R 递归操作
查看acl权限getfacl
文件权限最后有加号代表使用ACL权限
改文件目录拥有者 chown
;chown -R 递归
特殊权限
1、suid 执行
-rwsr-xr-x. 1 root root 33K Dec 14 2019 /usr/bin/passwd
大写S不是有效suid,必须是小写,普通用户可以临时拥有权限
chmod u+s
2、sgid
应用在目录上,该目录所建立的文件或子目录的拥有者都会是该目录的拥有者
应用在文件上,普通用户会临时拥有组的权限
chmod g+s
3、sticky粘滞位
只能用在目录里,只有文件拥有者和root用户可以删除对方的文件
chmod o+t
chown修改属主属组
-R递归
umask
0022
第一个 特殊权限 suid4 sgid2 stcky1
第二个 拥有者
第三个 组
第四个 其他
.bashrc写入umask
sudo
visudo 添加用户
设置无密码 NOPASSWD:ALL
进程管理
top
lscpu查看CPU信息
uptime 开机时间 负载
w 查看负载 登录用户
ps aux 查看所有进程
ps -ef
ps -z 进程所对应的selinux安全性上下文是什么 selinux
ps -efZ 进程安全上下文
ps -u root 查看用户的进程
kill关闭 杀死进程
kill -9
pkill -U root 停止所有root用户的进程
pkill -t pts/0 踢掉pts0用户
进程的挂起和恢复
ctrl+z 挂起
ctrl+c 终止
jobs查看后台进程
fg 1 切换到前台
xx & 后台执行
SSH配置 /etc/ssh/sshd_config
禁止root登录ssh PermitRoot
制定普通用户登录ssh AllowUsers user1
ssh密码尝试次数 MaxAuthTries 5
ssh登陆优化 UseDNS no
远端链接并执行命令
ssh -X -I root 10.10.10.10 name
免密登录
私钥文件 id_rsa
公钥文件 id_rsa.pub
家目录.ssh目录
ssh-keygen -t rsa 家目录下生成密钥
复制公钥给对方 给serverb主机的root用户,此后可以自动登录serverb主机
ssh-copy-id root@serverb
此时为单向免密,重复即可实现双向免密
linux软件包管理
RPM软件包
rpm安装 rpm -ivh content.example.com classroom主机
rpm查询 rpm -qa | grep bash
rpm查询多个包 rpm -qa | egrep "vsftpd|sshd|chrony"
查询一批软件包rpm -q --qf 根据软件包完整名称
rpm -q --qf '%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n' \
vsftpd \
chronyd \
crond \
autofs
忽略依赖关系强制安装
--force --nodeps
查看软件包详细信息
rpm -qi
文件 命令 程序 由哪个RPM软件包抽取出来
rpm -q --whatprovides /etc/hosts
setup-2.12.2-5.el8.noarch
rpm -qf /etc/hosts
setup-2.12.2-5.el8.noarch
查询某个软件包在linux系统上产生哪些文件
rpm -ql bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
查询某个软件的配置文件有哪些
rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
从软包抽取文件,文件抽取到当前目录
rpm2cpio cpio
rpm2cpio systemd-239-29.el8.x86_64.rpm | cpio -imd
rpm -Uvh 软件包更新update
rpm -e 卸载软件包
YUM 基于rpm软件包 软件仓库
软件仓库的来源:
1、系统的ISO
2、借助互联网 www.rpmfind.com
配置搭建yum仓库 本地/etc/yum.repos.d目录,创建repo仓库文件
路径baseurl 1本地 2http 3ftp
本地:
baseurl=file:///mnt/BaseOS/Packages
http:
baseurl=https://
cat rhel_dvd.repo
[rhel-8.2-for-x86_64-baseos-rpms]
baseurl = http://content.example.com/rhel8.2/x86_64/dvd/BaseOS 路径
enabled = true 启用该仓库
gpgcheck = false 验证软件是否符合官方签名
name = Red Hat Enterprise Linux 8.2 BaseOS (dvd) 仓库描述
总结:yum仓库配置的格式
/etc/yum.repos.d 目录
touch user.repeo
[]仓库名称
name=仓库描述
baseurl=file:///mnt
http://
ftp://
enabled=1 | true | 0 | false 启用
gpgcheck= 1 | true | 0 | false 启用仓库验证
gpgkey=file:/// | http://
repo一个文件可以满足多个仓库建立
rpm --import key文件导入rpm数据库
yum命令的操作
repo搭建好后
1、创建元信息
yum makecache
2、显示仓库状态
yum repolist all
3、验证repo仓库可用性 罗列repo中所有的软件
yum list
zsh-html.noarch 部分架构
zstd.x86_64 64位
zziplib.i686 32位
4、查看已经安装过的软件包
yum list installed
@anaconda 出厂就装好了
5、查看软件包详细信息
yum info vsftpd
6、了解mariadb软件包的依赖关系
yum deplist mariadb
7、通过yum安装mariadb解决依赖问题
yum install
yum localinstall
8、查看可用于升级的软件包
yum list updates
9、检查可更新的程序
yum check-update
10、搜索软件包
yum search
11、卸载软件包
yum remove
12、重新安装软件
yum resinstall
13、清空缓存
yum clean all
14、更新软件
yum update
15、查看文件来自哪个包
yum whatprovides
16、按软件版本高低显示
yum list --showduplicates
软件包组
yum grouplist 显示软件包组
yum groupinfo 显示软件包组详细信息
yum groupinstall groupremove groupupdate 安装 卸载 更新
yum日志存放路径
/var/log/dnf.log
模块流
yum module list 列出当前模块
yum module list | grep container
yum module info container-tools 列出流内容
yum module list --profile container-tools:2.0 查看指定模块的具体信息
yum module install httpd 安装httpd软件模块流
yum module install nginx 安装nginx流
yum module remove nginx 卸载nginx流
yum module reset nginx 删除后将状态reset
yum module install --profile nginx:1.16 安装指定版本软件流 卸载、reset后才能切换
磁盘管理
盘
/dev/sda sata sas scsi usb
/dev/vdb kvm
/dev/nvme0 m.2 pcie
lsblk 显示所有块设备
lsblk -fp显示文件系统格式、UUID
分区类型
BIOS&MBR 512字节 bootloader446+DPT64(每个分区开始-结束 16字节x4)+2校验
UEFI&GPT
文件系统
传统文件系统 - ceph开源分布式
文件系统格式 ext234 xfs
磁盘分区工具
fdisk mbr
gdisk gpt
parted 全能型
标准分区
卷方式 LVM mdadm VD0 stratis
标准形式:83
扩展分区:5
LVM PV物理卷:8e
swap分区:82
按T键查看
fdisk /dev/vdb
w 保存
n 创建
d 删除
t 修改分区标识
l 查看所有分区标识
p 查看现在的分区
MiB 整除1024 MB 整除1000
gdisk /dev/vdc
o 初始化为gpt
parted
修改后直接生效
help
mklabel gpt 转换为gpt
print 查看
rm 删除
(parted) set 2 swap on
(parted) set 3 lvm on
第五天
文件系统fs type
ext文件系统
xfs文件系统
mkfs -t ext4 /dev/vdb1 格式化为ext4
mkfs -t xfs /dev/vdc1 格式化xfs
mount /dev/vdb1 /mnt/
文件系统可以同时挂载多个目录,目录能同时挂载多个文件系统,但只显示最后一次挂载的
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 887M 0 887M 0% /dev
文件系统 文件系统类型 空间 使用 剩余 使用率 挂载点
umount 可以跟挂载点 也可以跟文件系统名
无法卸载分析:
1、查看当前目录是否是挂载点
2、有咩有其他程序在使用挂载点
mkfs.ext4 mkfs.xfs 对文件系统进行格式化
xfs centos7 开始默认推荐 支持更多数据量 性能高
1、分配组 AG
2、log 日志段 文件任何改变 创建 | 修改 | 删除
3、realtime 实时段 文件系统里创建realtime 根据分配组AG 默认4个AG data内容数据段 B+树索引的机制 提供性能
ext4 文件系统受损修复 linux系统级别 fsck e2fsck
xfs 自己的管理工具
xfs_info /dev/vdc1 查看文件系统信息
meta-data=/dev/vdc1 isize=512(inode占用空间的大小) agcount=4(AG组数量), agsize=131072 blks(每个AG包含的block)
= sectsz=512(删除大小) attr=2, projid32bit=1
= crc=1 finobt=1(B+树), sparse=1, rmapbt=0
= reflink=1
data = bsize=4096(块大小 4k~64k) blocks=524288(块数量), imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载磁盘或分区
mount /dev/vdb2 挂载点
挂载光盘
mount /dev/sr0 挂载点 cdrom dvdrom 软连接
挂载镜像文件ISO
mount -t iso9600 xx.iso 挂载点
挂载LVM
mount /dev/卷组名/逻辑卷名称 挂载点
查看目录占用
lsof
fuser
UUID通用唯一识别码
blkid
/dev/vdc1: UUID="a435f26e-00d4-46f4-82f8-9e454e0f1e4d" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="20fc6814-0fee-4955-8d27-2db39eb377af"
EXT文件系统修改UUID
blkid查看现在UUID
uuidgen /dev/vdc1 生成分区的UUID
umount 卸载文件系统
tune2fs -U fd5530b9-5c02-415e-9b74-34e25a32967d /dev/vdc1 修改ext文件系统UUID
e2fsck -f 检查文件系统
XFS文件系统修改UUID
blkid查看现在UUID
uuidgen /dev/vdc1 生成分区的UUID
umount 卸载文件系统
xfs_admin -U 9464a796-b9f4-40a7-8bb3-24ffb06af463 /dev/vdc1 修改xfs文件系统UUID
e2fsck -f 检查文件系统
/etc/fstab 重点验证文件格式
UUID
文件挂载点
文件系统格式
挂载选项 defaults默认 rw sync从内存同步
0 fs dump 保证兼容性,是否备份,弃用
0 fs pass 检查文件系统 0不检查 root文件系统1 其他文件系统2
UUID=9464a796-b9f4-40a7-8bb3-24ffb06af463 /mnt/xfstest xfs defaults 0 0 使用UUID挂载XFS文件系统
mount -a fstab文件格式
SWAP
mkswap /dev/vdb2 转换为SWAP分区
swapon /dev/vdb2 激活swap分区
swapoff /dev/vdb2 取消swap分区
开机自动挂载
/etc/fstab
UUID=ef675fdf-91dc-4773-851d-3ed4f95bd421 swap swap defaults 0 0
pri=0 优先级,越大越优先
UUID=ef675fdf-91dc-4773-851d-3ed4f95bd421 swap swap defaults,pri=20 0 0
swapon -s 查看所有SWAP
swapon -a 激活所有SWAP
swapoff -a 卸载所有SWAP
LVM逻辑卷管理器
把不同的盘 不同的分区 进行抽象的管理并组合起来 转化为物理卷
LVM可以实现容量大小的扩展
PV物理卷 整盘、分区
VG卷组 多个PV组成 PE建立在卷组之上 等同大小的格子
LV逻辑卷 LE = PE
逻辑卷类型
条带化逻辑卷 数据放到多个PV中,性能最好
PV
pvcreate /dev/vdb3 创建PV
pvcreate /dev/vdc3
pvs | pvdisplay 查看pv信息
多个PV可以隶属于同一个VG
PE划格子就是在不同的PV分配对应的空间
pvchange -x n /dev/vdb2 禁用PE分配空间
pvchange -x y /dev/vdb2 启用PE分配空间
pvchange -x n /dev/vdb3
pvremove /dev/vdb3 删除物理卷
pvmove /dev/vdb3 /dev/vdc3 从vdb3迁移到vdc3,迁移后可以移除vdb3
VG
创建卷组
vgcreate vg01 -s 8M /dev/vdb3 /dev/vdc3 将两个pv加入vg
vgs | vgdisplay 显示vg信息
VG #PV #LV #SN Attr VSize VFree
vg01 2 0 0 wz--n- 4.50g 4.50g -SN 快照
vgremove vg01 删除vg
创建LV逻辑卷
通过指定具体大小 2G
通过只听PE的数量 10个PE 8M 10x8=80M
lvcreate -L 1G -n lv01 vg01 创建1G lv01
lvcreate -l 10 -n lv02 vg01 创建10个PE lv02
lvs | lvdisplay 查看lv信息
lvremove 如果已经使用mount加载,则不能使用lvremove命令删除
lvremove /dev/vg01/lv02 删除lv02
逻辑卷路径/dev/vg01/lv02 设备
DM程序路径/dev/mapper/vg01-lv02 文件系统
对于逻辑卷进行格式化
mkfs.xfs /dev/vg01/lv01 格式化
mount /dev/mapper/vg01-lv01 挂载点 挂载
扩容
VG卷组扩容收缩
partprobe /dev/vdd 重新读分区表
vgextend vg01 /dev/vdd 将PV加入VG卷组
vgreduce vg01 /dev/vdd 将PV移除VG卷组
如果PV被使用,需要先pvmove迁移再移除
LV逻辑卷扩容和收缩
1、明确逻辑卷的文件系统
2、先对文件系统对应的逻辑卷进行扩容
3、重新修改文件系统的尺寸大小
ext系列扩容
1、通过vgdisplay查看是否有可用的pe/size
2、lvextend -L +1G -n /dev/vg02/lv02给LV02添加1G容量
3、lvextend -l +100 -n /dev/vg02/lv02给LV02添加100个PE
4、resize2fs /dev/mapper/vg02-lv02 为ext4文件系统扩容
该操作不需要卸载挂载点
xfs系列扩容
1、通过vgdisplay查看是否有可用的pe/size
2、lvextend -L +1G -n /dev/vg01/lv01给LV01添加1G容量
3、lvextend -l +100 -n /dev/vg01/lv01给LV01添加100个PE
4、xfs_growfs /dev/mapper/vg01-lv01 为xfs文件系统扩容
该操作不需要卸载挂载点
ext系列收缩
1、umount /mnt/ext4 卸载挂载点
2、fsck | e2fsck 扫描文件系统
3、resize2fs -f /dev/mapper/vg01-lv02 2G 收缩文件系统到2G
4、lvreduce -L 2G /dev/vg01/lv02 收缩逻辑卷到2G
5、mount /dev/mapper/vg01-lv02 /mnt/ext4/ 重新挂载文件系统
xfs系列收缩
xfs不能进行动态收缩,需要备份、格式化、还原,与ext4收缩步骤不同
1、xfsdump -f /xfs.dump /mnt/xfs 备份xfs文件系统 file xfs.dump查看备份的文件xfsdump archive (version 3)
2、umount /mnt/xfs 卸载挂载点
3、lvreduce -L 1G /dev/vg01/lv01 收缩逻辑卷
4、mkfs.xfs /dev/mapper/vg01-lv01 -f 强制格式化逻辑卷
5、mount /dev/mapper/vg01-lv01 /mnt/xfs 挂载文件系统
6、xfsrestore -f /xfs.dump /mnt/xfs 通过备份文件恢复
扩容问题
1、lvextend扩LV
2、resize2fs扩文件系统的大小
自动扩容
lvextend -r -L +1G /dev/vg01/lv01 此时-r参数等于resize2fs
容量调整通用
lvresize 容量的调整(扩容或收缩)
关于逻辑卷的配置的导入导出
关于重要的逻辑卷 快照lvconvert
linux:LVM
windows:动态磁盘
AIX:rootvg mirror
都是基于宿主机操作系统 软件方式
结构化数据:虚拟机、容器
非结构化数据:视频、图片
VDO 重复数据删除 节约空间
结构化数据1:10压缩比 盘50G压缩出50G*10=500G
非结构化数据:1:3压缩比 盘50G压缩出50G*3=150G
VDO
yum install vdo kmod-vdo安装
VDO卷只能是/dev/vdb裸盘,不能是分区
1、systemctl enable vdo --now 配置vdo服务器开机启动
2、systemctl status vdo 查看VDO状态
3、vdo create --name=vdo01 --device /dev/vdb --vdoLogicalSize=50G 创建VDO卷,如果无法创建清除盘分区表wipefs /dev/vdb -a
4、mkfs.xfs -K /dev/mapper/vdo01 创建文件系统
5、mount /dev/mapper/vdo01 /mnt/xfs 挂载文件系统
6、UUID="381039fe-d0d6-4dbb-b29a-753920c4ce86" /mnt/xfs xfs defaults,x-systemd.requires=vdo.service 0 0 配置fstab文件
vdostats --human-readable 查看vdo信息
Stratis
存储资源池 精简置备文件系统xfs
安装
1、服务启动开机启动
2、查看状态
3、创建
4、挂载
5、fstab
快照
销毁
清除分区表信息
wipefs /dev/vdb -a
计划任务
/etc/cron.deny 不允许哪些用户实施计划任务
crontab -e 编辑
-u 指定用户
-r 删除当前crontab任务 -r -u 删除指定用户crontab任务
-l 显示当前crontab任务
- /usr/bin/rm xx 使用全路径,通过which查询
systemctl restart crontab编辑完后重启crond服务
/var/log/cron 查看cron日志
/etc/crontab 配置文件示例
- /usr/bin/rm xx 使用全路径,通过which查询
crontab计划任务
- command
分 时 日 月 周 命令(全路径 which)考试中全路径
- command
minute 每个小时的第几分钟
huor 每天的第几个小时
day 每月的第几个天
monteh 每年的第几个月
Day of Week 每个周的第几天
command
每天的4点20
20 4 * command
每月9日3点50分
50 3 9 command
每年9月8日0点1分
1 0 8 9 * command
每天凌晨2点
0 2 * command
每天凌晨2点的每分钟执行一次
- 2 * command
/1 | 代表每一分钟
*/10 代表每十分钟
每月10号10点5分
5 10 10 command
每年的10月10号10点5分
5 10 10 10 * command
每月10号的10点5分,15点5分,20点5分
5 10,15,20 10 command 逗号隔开,不连续
每月10号10点5分,11点5分-15点5分
5 10-15 10 command 10至15,连续
每月11点到13点之间,每十分钟
/10 11-13 command
查询命令
winch 在PATH变量的路径中查找指定的命令
which passwd查找passwd命令位置
whereis 用于程序名搜索,二进制,man,源代码文件
whereis passwd 查找passwd程序相关文件
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
locate 基于数据库查询,不实时
updatedb 使用前需要手动更新数据库
find
实时查询,不基于数据库,查询速度慢
按文件名查找
find / -name upwen 查找根目录下名字为upwen的文件
find / -iname upwen 不区分大小写
按照用户名、组查找
find / -user upwen1查找用户upwen1的文件
find / -user upwen1 -group upwen1 查找用户和组都为upwen1的文件,逻辑或
find / -user upwen1 -o -group upwen1 查找用户或组为upwen1的用户,逻辑与
find / -user upwen1 -not -group upwen1 查找用户为upwen1但组不为upwen1,逻辑与
查找没有属主属组的文件
find -nouser -o -nogroup 查找没有属主或没有属主的文件
查找不是root用户的文件
find / -not -user root 查找属主不是root的文件
按权限查找
find -perm 644 查找权限为644的文件
find -perm /600 查找权限中满足任何一位权限的文件属主6或属组0或其他0
find -perm -655 查找权限完全满足655的文件 精确控制
find -perm /4000 查找具有特殊权限的文件,匹配任意一位
根据文件大小查找
find -size 10M 查找大小为10M的文件
find -size +10M 查找大于10M的文件
find -size -10M 查找小于10M的文件
find / -size +40k -size -50k -perm /4000 查找大于40K小于50K特殊权限满足4000中任意一位的文件
按文件类型查找
find / -type l 查找文件类型为软连接的文件
按时间查找
find -atime +1 查找1天前的文件
find -atime +1 -atime -900 查找1天前到前900天内的文件
find -amin -60 查找60分钟内的文件
find -amin -60 -amin +1 查找1分钟前到前60分钟内的文件
find后执行命令
-exec rm -f {} \; find后执行删除,花括号代表结果
find -amin -60 -amin +20 -exec rm -f {} \; 删除当前目录下创建于60分钟前到20分钟前的文件
find -amin -60 -amin +20 -ok rm {} \; 询问删除当前目录下创建于60分钟前到20分钟前的文件
网络附加存储
NFS 网络文件系统服务 不建议使用fstab自动挂载
NFS守护进程
nfsd 基本守护进程
mountd 管理NFS文件系统
rpcbind 进行端口映射
安装启动
服务nfs-server rpcbind 客户端nfs-utils
配置文件
/etc/exports
输出目录 客户端1 选项1 选项2 客户端2 选项1 选项2
ro只读 rw读写
用户映射选项
all_squash 映射为匿名用户 nfsnobody
no_all_squash 不映射为匿名用户
root_squash 将root映射为默认
no_root_squash 不讲root映射为默认
anonuid=指定用户ID
anongid=指定组ID
secure 限制客户端只能从小于1024的IP端口连接NFS服务器,默认设置
insecure 允许客户端从大约1024的端口连接NFS服务器
sync 同步写入内存缓冲区和磁盘
async 使用内存缓存
wdelay 写操作先在内存缓存
no_wdelay 写操作理解执行,配合sync
subtree_check 若输出目录时一个子目录,则NFS检查父目录权限,默认
no_subtree_check 不检查
配置范例
/home/ftp *() 共享全部用户可读写
/home/ftp 192.168.1.0/255.255.255.0(rw) 允许网段读写
/home/ftp 192.168.1.0/24(rw,async) *(ro) 允许网段读写,内存缓存 其他网段只读
/home/fto *.gdvcp.net(rw,insecure,all_squash,sync,no_wdelay) 允许域名相关操作
/mnt/cdrom *(ro) 共享光驱
创建
systemctl start nfs-server.service 开启nfs-server服务
/etc/exports 添加NFS配置文件
/mnt *(rw,sync,no_wdelay) 默认为匿名组nobody,需要给O写入权限(o+w)
exportfs -a 检查配置文件
exportfs -rv 立即生效并查看详情
showmount -e
clnt_create: RPC: Program not registered
systemctl stop firewalld.service 临时关闭firewalld防火墙
rpc.mountd
showmount -e
Export list for servera.lab.example.com:
/mnt *
开启另一台主机测试
[root@serverb ~]# showmount -e servera 检查servera目前可挂载的NFS
Export list for servera:
/mnt *
mount -t nfs servera:/mnt /mnt
autofs实现按需自动挂载
前提:操作系统已经启动完成,安装了autofs软件,autofs实现了开机自启动
使用nfs目录时autofs自动挂载
思路:
1、本地持续监听目录
2、进入目录时,根据规则配置文件实现自动挂载
autofs相关配置文件:
1、/etc/auto.master 配置持续坚挺的目录及触发配置规则文件
2、/etc/auto.misc 配置规则文件
1、yum install autofs 安装
2、systemctl enable --now autofs 启动
3、/etc/auto.master 主配置文件
/mnt/nfs /etc/auto.misc
4、/etc/auto.misc 配置文件
linux -ro,soft,intr ftp.example.org:/pub/linux
nfs -rw,nfs,sync servera:/mnt
5、systemctl restart autofs.service 重启服务
SELinux
ps -eflZ 查看进程selinux安全性上下文
ls -lZ 查看文件 | 目录 selinux安全性上下文
system_u:object_r:nfs_t:s0 用户:角色:类型(重点):敏感度
system_u:system_r:sshd_t:s0-s0:c0.c1023
selinux工作模式
Enforcing 启用selinux
permissive 启用 不执行 警告
disabled 关闭
/etc/selinux/config 配置文件 考试selinux必须开启
getenforce 查看当前selinux状态
setenforce 0 命令不重启临时关闭
SELINUX=disabled 配置文件需重启关闭
selinux
1、修改selinux安全性上下文 某个进程 某个文件 | 目录 合拍 进程 -> 文件
2、修改端口策略
考试 不能关闭selinux 一定要开启!
查看selinux状态
getenforce 查看selinux是否开启
/etc/selinux/config SELINUX=enforcing
查看进程(主体)安全性上下文
ps -efZ
system_u:system_r:lvm_t:s0
查看文件目录(客体)安全性上下问
ls -lZ
system_u:object_r:admin_home_t:s0
ls -ldZ
home_root_t
semanage fcontext -l 查看已经定义好的安全性上下文策略
semanage fcontext -a 追加安全性上下文策略
semanage fcontext -m 修改安全性上下文策略
-t 文件
-r 递归
修改安全性上下文
[root@servera ~]# chcon -t admin_home_t /pot
[root@servera ~]# ls -lZ /pot
-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0 0 Sep 3 17:44 /pot
恢复改过的文件的安全性上下文 默认的semanage策略所定义的策略
[root@servera ~]# restorecon /pot
[root@servera ~]# ls -lZ /pot
-rw-r--r--. 1 root root unconfined_u:object_r:etc_runtime_t:s0 0 Sep 3 17:44 /pot
semanage fcontext -a -t httpd_sys_content_t "/opt/www(/.*)?" 修改www目录下默认策略
restorecon -v 1 恢复目录默认策略
修改端口策略
模块流安装httpd
yum module install httpd 模块流安装
rpm -qc | ql 查看安装包的配置文件信息
vi +/Listen /etc/httpd/conf/httpd.conf 修改httpd端口
修改端口后启动报错,查看报错信息
systemctl status httpd.service 查看报错
journalctl -xe 查看报错
sealert -l b5a11e87-4300-4fe2-8c4d-6e16ebc9ffe9 查看详细原因
semanage port -l | grep http查看默认http端口上下文
semanage port -a -t http_port_t -p tcp 84 添加端口上下文
再次启动即可
不常用
setsebool httpd_enable_homedirs 1 更改
getsebool -a
setsebool 修改布尔值 0 | 1
防护墙
firewalld代替iptables
ipables nat表 | filter表 | mangle - input链 ouput 链 forward 链 - xxx规则 ACCEPT | DROP
firewalld zone区域
关闭启动状态
systemctl stop | start | status firewalld
查看当前防火墙规则
firewall-cmd --list-all
firewalld 对端口 | 对服务 进行操作
firewalld支持哪些服务
firewall-cmd --list-services 查看当前开放哪些服务
firewall-cmd --get-services 查看能够支持的服务
放行端口 允许外部主机访问
firewall-cmd --add-port=80/tcp --permanent 将80tcp端口永久生效
firewall-cmd --reload 刷新立即生效
开放NFS服务
nfs rpc-bind mount 三个服务支撑
firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=mountd --permanent
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --reload
富规则 => iptables自定义规则
Podman
web应用架构 LAMP | LNMP
L light
A apache ICM 安装配置管理
M mysql | mariadb
P PHP
容器是操作系统上很特殊的进程
1、视图 namespace 容器里跟操作系统没区别 共享内核 ; 容器1 | 容器 2 进程间隔离
2、占用过多的系统资源 资源控制 cgroups
调优范例
while :; do :; done & 死循环
cd /sys/fs/cgroup/cpu/
mkdir container 进程
echo 20000 > cpu.cfs_quota_us 限制CPU使用率20000us=20ms=20%
echo 2828 > tasks 限制对应的进程
echo 2834 > tasks 限制对应的进程
linux调优的一种手段
虚拟化
vmware vsphere
微软 hyper-v
KVM
容器
Docker
云原生 CNCF标准
1、linux -> podman 逐步替代docker
2、通过kubernets容器管理平台 管理 监控 docker容器运行状态
容器 本身没有价值 工具 docker podman工具
docker podman 镜像容器的资源编排 对接应用
Ansible 工具 节省 工作时间 提升工作效率
docker container image ls
docker pull xxx
docker run xxx
dockerfile dockercompose dockerswarm
docker 进程 root
podman 可以运行rootless的容器 可以作为systemd服务管理 本身无daemon 容器管理可以基于普通用户 systemctl --user xxx status xxx.services
考试
不需要安装podman,只需要执行podman --version 确认是1.9.3
平时练习
需要安装1.9.3
实验环境练习
ssh student@workstation
lab containers-basic start 启动环境
安装container-tools
servera#yum module install container-tools
[upnange@servera ~]$ podman -v
podman version 1.9.3
登录容器注册服务器
查看家目录下.config/containers是否有registries.conf
如果没有,复制/etc/containers/registries.conf到家目录下并调整配置文件
普通用户
cat .config/containers/registries.conf
[[registry]]
location = "registry.lab.example.com"
insecure = true
blocked = false
验证登录
[upnange@servera containers]$ podman login registry.lab.example.com
Username: admin
Password:redhat321
Login Succeeded!
镜像使用
搜索镜像
podman search nginx
使用apache最新版本
httpd:latest
使用apache 2.4
httpd:2.4
搜索 registry.lab.example.com 到底有哪些镜像可用
podman search registry.lab.example.com/
领取镜像pull
podman pull registry.lab.example.com/rhel8/httpd-24 使用完整路径拉取
查看镜像详细信息inspect
podman inspect registry.lab.example.com/rhel8/httpd-24
根据json的格式显示出镜像的信息
删除镜像rmi
podman rmi nginx
查看当前镜像images
podman images
通过镜像产生不同的容器
创建容器
podman create --name=upnange1 registry.lab.example.com/rhel8/httpd-24
启动容器
podman start upnange1
停止容器
podman stop upnange1
删除容器
podman rm upnange1
停止并删除
podman stop webserver && podman rm webserver
podman ps 查看已经运行的容器
podman ps -a查看所有的容器(包含已启动已停止等)
直接启动镜像
pdoman run --name=upnange2 nginx
参数
-d 后台运行
--name 容器名称
-v 将宿主机的一个目录映射给容器webserver中的某一个目录 宿主:容器
:Z 自动将SElinux安全性上下文应用到主机
-t 给一个tty终端
-i 交互式
-p 8081:8080 宿主机:容器 端口映射
完整
podman run -dt --name-webserver -v /home/upnange/testdir:/var/log/journal:Z -p 8081:8080 registry.lab.example.com/rhel8/httpd-24
进入容器执行终端
podman exec -it webserver /bin/bash
podman rootless 非root用户环境
对于webserver容器做成基于普通用户upnange 通过systemd 管理容器
创建普通用户
创建podman注册配置
mkdir -p .config/systemd/user/ 创建systemd目录,固定写法
/home/upnange/.config/systemd/user
生成systemd配置文件,在上面的目录中
podman generate systemd --name webserver --files --new
停止并删除原容器
podman stop webserver && podman rm webserver
重新加载systemd服务
systemctl daemon-reload --user
启动并开机启动自己定义容器
systemctl --user enable container-webserver.serivce -now
容器默认情况下是临时的
强制普通用户的服务器开机自启动
loginctl enable-linger upnange
loginctl show-user upnange
lsof -i:8081 查看端口监听
日志服务rsyslog.server
/etc/rsyslog.conf 日志定义文件
kern.* /dev/console 内核日志,默认不开
*.info;mail.none;authpriv.none;cron.none /var/log/messages 任何类型的information信息级别 邮件 认证 计划任务除外
authpriv.* /var/log/secure 认证信息
mail.* -/var/log/maillog 非同步,先读到内存,再写入硬盘
cron.* /var/log/cron 计划任务
.emerg :omusrmsg: 任何类型的严重级别都会在终端显示
uucp,news.crit /var/log/spooler 新闻服务有关
local7.* /var/log/boot.log 启动相关的信息
linux系统配置为rsyslog日志服务器
servera | serverb
把servera作为rsyslog日志服务器,把serverb作为客户端
配置服务器
MODULES模块中 TCP/UDP 514端口
MODULES
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
input(type="imtcp" port="514")
systemctl restart rsyslog.service 重启服务
服务端防火墙开放对应端口
firewall-cmd --add-service=syslog --permanent
firewall-cmd --reload
tail -f /var/log/messages 监控日志
配置客户端
将rsyslog.conf 中日志路径配置位@servera即可
systemctl restart syslog 重启服务
jounal日志
/run/log/journal/ 默认内存位置
journalctl -n 10 查看前十行
journalctl -p err 查看所有错误日志
journalctl --since "2021-06-04 10:00:00" --until "2021-06-05 10:00:00" 按时间范围查看日志
[root@servera ~]# journalctl -b -1 查看上一次重启之后的日志
Specifying boot ID or boot offset has no effect, no persistent journal was found. 没有做持久化
持久化存储配置
journal从/run/log/journal/ 落盘
/etc/systemd/journald.conf 配置文件
Storage=persistent 改为persistent
systemctl restart systemd-journald.service 重启服务器
/var/log/journal/ 持久化存储目录
日志文件轮替
logrotate
行轮替,防止占用太多空间,按照一定的规则产生
通常在四周之后丢弃最旧的文件
/etc/logrotate.conf 配置文件
手动发送syslog消息
logger
-p local0~local7 不同环境不同
logger -p local3.info "666"
NTP
网络时间协议
ntp chronyd 两者不能共用
/etc/chrony.conf 主配置文件
server 172.25.254.254 iburst 配置NTP服务器
allow 192.168/16 允许充当服务器
chronyc sources -v 查看同步状态
systemctl restart chronyd.service 重启服务
性能调优
linux系统会给一些已经做好的调优集,会根据目前的操作系统建议调优集,比对目前活动的调优集
systemctl status tuned.service 调优服务状态
tuned-adm list 查看系统调优集
tuned-adm active 查看当前活动的调优集
tuned-adm recommend 查看系统建议的调优集
tuned-adm profile desktop 切换调优集
tuned-adm profile virtual-guest 切换调优集
定义变量
username=upnange 定义变量
echo $username 查看变量
export username=10.10.10 定义内存变量
export | grep username 查看内存变量
declare -x username="10.10.10" 字符
不能以数字开头,可以下划线开头
存在空格使用单双引号
双引号 "" 保留特殊意义
单引号'' 原样输出
[root@servera ~]# username1="$username"
[root@servera ~]# echo $username1
10.10.10
[root@servera ~]# username2='$username'
[root@servera ~]# echo $username2
$username
确认用户是否已经创建
id upnange
变量默认位字符串
声明变量类型 declare -i int类型
[root@servera ~]# var10=10
[root@servera ~]# var20=20
[root@servera ~]# var30=$var10+var20
[root@servera ~]# echo $var30
10+20
[root@servera ~]# declare -i var30=$var10+var20
[root@servera ~]# echo $var30
30
其他变量:
$1 $2 $3 #位置变量 执行脚本时后面写位置变量的内容
$0 脚本名称
$$ 查看PID
$? 命令执行后的返回状态
$# 已加载位置变量的个数
$* 所有位置变量的值
unset xx 取消变量
文本处理工具grep
-i 不区分大小写
-v 仅显示不包含正则表达式的匹配行
^xxx 以xxx开头
xxx$ 以xxx结尾
-A 行数 显示正则表达式匹配项之后的行数
-B 函数 显示之前的行数
-r 递归匹配
-e 使用多个正则表达式
netstat -tunlpa | grep -e 22 -e 111
egrp
netstat -tunlpa | egrep "22|111"
-v 仅显示不包含正则表达式的匹配行
cut
-d ":" 以冒号裁切
-f 1 显示第一行
[root@servera ~]# cut -d ":" -f 1 /etc/passwd
root
bin
daemon
[root@servera ~]# cut -d ":" -f 1,2,4 /etc/passwd
root:x:0
bin:x:1
daemon:x:2
替换sed
a 在当前行之下
i 当前行之上
d 删除
n 只显示变化的行
p 打印
-i 直接写入文件
\转义
[root@servera opt]# sed '1a root' passwd.txt
root:x:0:0:root:/root:/bin/bash
root
bin:x:1:1:bin:/bin:/sbin/nologin
[root@servera opt]# sed -i '1,$s/root/roott/' passwd.txt
[root@servera opt]# cat passwd.txt
roott:x:0:0:root:/root:/bin/bash
[root@servera opt]# sed -i '1,$s/root/roott/g' passwd.txt
[root@servera opt]# cat passwd.txt
roottt:x:0:0:roott:/roott:/bin/bash
[root@servera opt]# sed -i '1,$s//bin/bash//sbin/nologin/g' passwd.txt
[root@servera opt]# cat passwd.txt
roottt:x:0:0:roott:/roott:/sbin/nologin
文本处理工具awk
-F ":" '{print $1}' 冒号分隔打印第一行
[root@servera opt]# awk -F ":" '{print $1}' passwd.txt
roottt
bin
daemon
[root@servera opt]# awk -F "x" 'NR==1{print$1}' passwd.txt 以x分割打印第一行
roottt:
[root@servera opt]# awk 'NR==1' passwd.txt 打印第一行
roottt:x:0:0:roott:/roott:/sbin/nologin
[root@servera opt]# awk -F ":" 'NR==1{print$(NF)}' passwd.txt 第一行最后一列
/sbin/nologin
[root@servera opt]# awk -F ":" 'NR==1{print$(NF-2)}' passwd.txt 第一行倒数第三列
roott
[root@servera opt]# ip addr show eth0 | awk 'NR==3{print$2}' | cut -d "/" -f 1 提取IP地址
172.25.250.10
正则表达式
. 一位任意值
- 通配符,任意多个字符
[a-z] 一位满足a-z
?
^&
[root@servera opt]# grep r..t passwd.txt
roottt:x:0:0:roott:/roott:/sbin/nologin
[root@servera opt]# grep r*t passwd.txt
roottt:x:0:0:roott:/roott:/sbin/nologin
[root@servera opt]# grep r.*t passwd.txt
roottt:x:0:0:roott:/roott:/sbin/nologin
[root@servera opt]# grep 'ro{2}t' passwd.txt 以2个o搜索,大括号需要转义
roottt:x:0:0:roott:/roott:/sbin/nologin
[root@servera opt]# grep 'roo[a-z]' passwd.txt 匹配a-z任意一个字母
roottt:x:0:0:roott:/roott:/sbin/nologin
shell脚本格式
!/bin/bash 定义解释器
shell对于缩进格式没有要求
for循环语句
passwd=$1
for i in $(seq 1 5);do
useradd test$i
echo "test$i"
echo "$passwd" | passwd --stdin test$i
done
分支控制
test判断
-f 文件
-d 目录
-e 路径
[root@servera opt]# test -f /etc/inittab
[root@servera opt]# echo $?
0
[root@servera opt]# test -e /etc/inittab ;echo $?
0
if [];then
elif [];then
else
fi
VI粘贴模式
:set paste 保持原格式
ansible自动化
环境rh294 12G-16G
bastion 路由器
classroom 存放资料
workstation ansible 管理节点,官方要求使用student普通用户
servera 受管理节点
serverb
serverc
serverd
ansible核心
1、控制节点
2、被管理节点
3、自动化模块
4、清单inventory(静态,手动填写 | 动态 结合CMDB配置管理数据库 通过python调用CMDB设备列表、干系人)
5、playbook 剧本,按照清单中组、主机、设备等推送自动化的任务(结合大量的自动化模块)
6、playbook 剧本重复使用 在不同大项目 提高执行效率 需要role角色
CMDB模型 人 事 物
约束 SLA 服务级别协议
锐捷设备 》坏了风扇 》干系人 30分钟 内做出实质性 响应 》 2小时 内达到现场 换掉
ansible结合CMDB拿到所有设备 操作系统 存储 服务器 资产信息
单向 免密
add-hoc 临时命令 playbook剧本 role角色
ansibletower 增加安全、控制力和扩展性
安装ansible
yum install ansible
ansible --version
ansible 2.9.21 与考试版本一样
/etc/ansible/ansible.cfg 主配置文件
平时练习:
1、通过student普通用户进行登录
2、student普通用户的家目录下新建目录ansible
3、在student用户家目录ansible下有ansible.cfg、清单文件、定义角色的路径的目录roles
ansible.cfg 从etc拷贝
清单文件 ansible目录新建inventory的清单文件
角色路径目录 ansible目录新建roles目录
配置ansible.cfg,配置inventory
配置管理节点到被管理节点的ssh免密,环境已经有了
拷贝配置文件
[student@workstation ansible]$ mkdir -p ~/ansible
[student@workstation ansible]$ cp /etc/ansible/ansible.cfg ~/ansible/
参照/etc/ansible/hosts形成inventory
[student@workstation ansible]$ touch inventory
[student@workstation ansible]$ mkdir roles
ansible.cfg
inventory = /etc/ansible/hosts 默认清单
inventory 静态 inventory.py 动态
指定默认之后,使用其他清单文件需要 ansible -i xxx 指定
[student@workstation ansible]$ ansible-doc -l 查看所有模块
模块+参数 实现自动化的部署
按有序的顺序进行编排 playbook
RHCSA 基础夯实
remote_user = root 指定被管理节点本地用户执行命令
remote_user = student
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
最终配置
inventory = /home/student/ansible/inventory
ask_pass = False
remote_user = student
roles_path = /home/student/ansible/roles
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
优先级 当前路径 > 家目录 > /etc目录下
inventory配置加入主机servera.lab.example.com
[student@workstation ansible]$ ansible -m ping servera.lab.example.com 使用ansible ping
servera.lab.example.com | FAILED! => {
"msg": "Missing sudo password"
}
被管理节点没有为student用户配置sudo
visudo | /etc/sudoers.d
[root@servera sudoers.d]# cat student
student ALL=(ALL) NOPASSWD:ALL
成功执行
[student@workstation ansible]$ ansible -m ping servera.lab.example.com
servera.lab.example.com | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
将该配置文件传送到其他节点
[root@servera sudoers.d]# scp student root@serverb:/etc/sudoers.d
JSON格式
绿色 SUCCESS 任务成功但对结果了没有任何影响
红色 FAILED 任务失败
黄色 CHANGED 任务成功了对结果产生了影响
粉色 你目前使用的模块并不是最佳实践
ansible 幂等性
inventory 基于主机名 基于用户名 基于组
[student@workstation ansible]$ cat inventory
[web]
servera
serverb
[db]
serverc
serverd
[student@workstation ansible]$ ansible -m ping web,db 按组执行
[student@workstation ansible]$ ansible -m ping all 全部执行
组嵌套
[lnmp:children] 关键字:children
web
db
ansible -m ping lnmp
简化描述
server[c:d] 代表serverc和serverd
验证资产清单
ansible db -m ping -i /home/student/ansible/inventory 使用指定清单
[student@workstation ansible]$ ansible-inventory -i /home/student/ansible/inventory --list 验证指定清单
ungrouped 代表没有加入组的主机
[student@workstation ansible]$ ansible web -i /home/student/ansible/inventory --list-hosts 查看组内成员
hosts (2):
servera
serverb
add-hoc临时命令 快速执行单个任务
[student@workstation ansible]$ ansible servera -m ping
-a '' 用于带引号字符串形式去这些参数的列表,单双引号
-i 指定清单位置
ansible 主机组 -m 模块名称 -a '参数1=xxx 参数2=xxx' -i 指定清单
ansible 主机组 -m 模块名称 -a "参数1=xxx 参数2=xxx" -i 指定清单
结合传统命令+ansible模块
文件类型模块 copy
文件复制
内容写入
学习模块的使用
[student@workstation ansible]$ ansible-doc copy 查看copy模块的使用
[student@workstation ansible]$ ansible-doc -s copy
传统命令
cp -p /etc/inisttab /opt
元数据信息得以保留
更改权限 属主属组upnange
copy src /etc/inisttab dest /opt owner mode 4770 owner upnange group upnange setype httpd_sys_t
[student@workstation ansible]$ ansible web -m copy -a 'src=/etc/ansible/hosts dest=/opt mode=4770 owner=student group=devops'
[student@workstation ansible]$ ansible web -m copy -a 'content="upnage66" dest=/opt/upnange66.txt' 内容写入
传统命令执行结果
[student@workstation ansible]$ ansible web -m shell -a "ls -l /opt"
servera | CHANGED | rc=0 >>
total 4
-rwsrwx---. 1 student devops 1016 Sep 5 00:01 hosts
[student@workstation ansible]$ ansible web -m shell -a "cat /opt/upnange66.txt"
serverb | CHANGED | rc=0 >>
upnage66
设置安全性上下文
chcon -t
[student@workstation ansible]$ ansible web -m copy -a 'content="upnage66" dest=/opt/upnange66.txt setype=admin_home_t
[student@workstation ansible]$ ansible web -m shell -a "ls -Zl /opt/" serverb | CHANGED | rc=0 >>
total 8
-rwsrwx---. 1 student devops system_u:object_r:usr_t:s0 1016 Sep 5 00:01 hosts
-rw-r--r--. 1 root root system_u:object_r:admin_home_t:s0 8 Sep 5 00:05 upnange66.txt
涉及到文件目录的操作 用到file模块
touch 1.txt | mkdir dir1
path 目标文件
[student@workstation ansible]$ ansible web -m file -a "path=/opt/upnange66.txt owner=devops group=student mode=0777 setype=httpd_sys_content_t"
[student@workstation ansible]$ ansible web -m shell -a "ls -Zl /opt/" serverb | CHANGED | rc=0 >>
total 8
-rwsrwx---. 1 student devops system_u:object_r:usr_t:s0 1016 Sep 5 00:01 hosts
-rwxrwxrwx. 1 devops student system_u:object_r:httpd_sys_content_t:s0 8 Sep 5 00:05 upnange66.txt
删除文件、目录
rm -r /opt/upnange66.txt
[student@workstation ansible]$ ansible web -m file -a "path=/opt/upnange66.txt state=absent" 递归删除文件目录
创建文件
[student@workstation ansible]$ ansible web -m file -a "path=/opt/upnange66.txt state=touch"
创建目录
[student@workstation ansible]$ ansible web -m file -a "path=/opt/upnange state=directory"
创建软连接
[student@workstation ansible]$ ansible web -m file -a "src=/opt/hosts path=/opt/upnange.link state=link"
从被管理节点往管理节点传文件 fetch
flat=yes 不采用默认文件结构
[student@workstation ansible]$ ansible web -m fetch -a "src=/opt/hosts dest=/tmp/ flat=yes" 只拷贝一份
[student@workstation ansible]$ ansible web -m fetch -a "src=/opt/hosts dest=/tmp/" 按主机名建目录存放
serverb | CHANGED => {
"changed": true,
"checksum": "da996f1a52dbae3b6b43a6c50d761e4ed5ec9a9f",
"dest": "/tmp/serverb/opt/hosts",
替换功能lineinfile模块
path=/ 要替换的文件
regexp= 使用正则表达式的方式匹配你要修改谁
line= 你要替换的内容
[student@workstation ansible]$ ansible web -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line=SELINUX=disable " 修改selinux配置文件
[student@workstation ansible]$ ansible web -m shell -a "cat /etc/selinux/config" 查看文件
用户组有关group模块
[student@workstation ansible]$ ansible web -m group -a "name=g1 state=present" 添加组
[student@workstation ansible]$ ansible web -m group -a "name=g1 state=absent" 删除组
[student@workstation ansible]$ ansible web -m shell -a "cat /etc/group"查看
用户有关user模块
[student@workstation ansible]$ ansible web -m user -a "name=upnange group=g1 uid=1800 state=present" 添加用户
[student@workstation ansible]$ ansible web -m shell -a "cat /etc/passwd" 查看
[student@workstation ansible]$ ansible web -m user -a "name=upnange state=absent remove=yes" 删除用户、删除相关文件、家目录
yum相关模块yum_repository
/etc/yum/repos.d/xxx.repo
[仓库的id名称]
name=
baseurl=
enabled=
gpgcheck=
gpgkey=
file 生成repo文件
[student@workstation ansible]$ ansible web -m yum_repository -a "name=rh294_baseos description='This is rh294 BaseOS' baseurl=http://content.example.com/rhel8.4/x86_64/dvd/BaseOS enabled=yes gpgcheck=no file=rh294_baseos"
yum模块yum
[student@workstation ansible]$ ansible web -m yum -a "name=vsftpd state=present" 安装软件
服务相关模块service模块
启动 停止 重启 重新读取 开机自启
[student@workstation ansible]$ ansible web -m service -a "name=vsftpd state=started enabled=yes" 启动并开机启动
[student@workstation ansible]$ ansible web -m service -a "name=vsftpd state=stopped enabled=no" 停止关禁止开机启动
防火墙模块firewalld模块
- firewalld:
service: https 服务
port: 8081/tcp 端口协议
permanent: yes 永久
state: disabled 开启关闭策略
immediate: yes 立即生效
zone: public 区域
[student@workstation ansible]$ ansible web -m firewalld -a "port=8081/tcp permanent=yes state=enabled immediate=yes"
[student@workstation ansible]$ ansible web -m shell -a "firewall-cmd --list-all"
命令shell模块
网络有关模块wget_url模块
评论