RedHat-RHCE-RHEL8_rhel8定义命令别名-程序员宅基地

技术标签: RedHat  shell  linux  RHCE  RHEL8  

RHCE8.2 RH124 RH134 RH294

RHCE 7.0
RH124 RH134 RH254

RH124 + RH134 = EX200

RHCE 8.0
RH124 RH134 RH294
RH294 = EX294

Redhat级别
RHCSA、RHCE、RHCA

EX200v8 -> RHCSA 上午 考试时长 3小时
EX294 -> RHCE 下午 考试时长 4小时

day01 ======================================================================================================== day01

修改主机名
[root@localhost ~]# vim /etc/hostname
redhat200

修改IP
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
BOOTPROTO=static
#UUID=4c4385dd-1b0f-4d74-9261-5243ecbe1f20
ONBOOT=yes
IPADDR=192.168.2.200
NETMASK=255.255.255.0
GATEWAY=192.168.2.2
DNS1=192.168.2.2
DNS2=114.114.114.114

刷新网络
[root@localhost ~]# nmcli c reload ens160

配置ip映射
[root@localhost ~]# vim /etc/hosts
192.168.2.100 rhel100

关闭防火墙
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# firewall-cmd --state
not running

永久关闭图形化界面
[root@localhost ~]# systemctl set-default multi-user.target

临时关闭图形化界面
[root@rhel100 ~]# systemctl isolate multi-user.target

#永久开启图形化界面
[root@localhost ~]# systemctl set-default graphical.target

#临时开启图形化界面
[root@rhel100 ~]# systemctl isolate graphical.target

关闭安全策略
[root@rhel100 ~]# getenforce
Enforcing
[root@rhel100 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled

设置为0,表示临时关闭
[root@rhel100 ~]# setenforce 0

设置用户打开最大进程数和文件数
[root@rhel100 ~]# vim /etc/security/limits.conf

  • soft nofile 65535
  • hard nofile 1028576
  • soft nproc 65535
  • hard nproc unlimited
  • soft memlock unlimited
  • hard memlock unlimited

[root@rhel100 ~]# ulimit -a

普通用户赋予root权限
[root@rhel100 ~]# vim /etc/sudoers
alex ALL=(ALL) ALL
alex ALL=(ALL) NOPASSWD: ALL

查看当前是由哪个主机连接到服务器
[root@rhel100 ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1059 root 4u IPv4 31244 0t0 TCP *:ssh (LISTEN)
sshd 1059 root 6u IPv6 31251 0t0 TCP *:ssh (LISTEN)
sshd 1428 root 5u IPv4 35992 0t0 TCP rhel100:ssh->192.168.2.1:7311 (ESTABLISHED)
sshd 1449 root 5u IPv4 35992 0t0 TCP rhel100:ssh->192.168.2.1:7311 (ESTABLISHED)
ssh 2100 root 5u IPv4 48523 0t0 TCP rhel100:34274->rhel100:ssh (ESTABLISHED)
sshd 2101 root 5u IPv4 45863 0t0 TCP rhel100:ssh->rhel100:34274 (ESTABLISHED)
sshd 2108 root 5u IPv4 45863 0t0 TCP rhel100:ssh->rhel100:34274 (ESTABLISHED)

关机
[root@rhel100 ~]# shutdown now

重启
[root@rhel100 ~]# reboot

查看当前目录
[root@rhel100 ~]# pwd

使用分号可以执行多条命令
存在一定的风险,如果第一条执行失败,第二条依然执行
顺序执,不在乎第一条命令是否执行成功
[root@rhel100 ~]# cd /home/;ls
alex

只有当你第一条命令执行失败的时候,才会去执行第二条命令
[root@rhel100 ~]# cd /tmp/test || ls

只有当你第一条命令执行成功的时候,才会去执行第二条命令
[root@rhel100 ~]# cd /tmp/test && ls

如果不存在就创建
[root@rhel100 ~]# cd /tmp/test || mkdir /tmp/test

如果存在就不查看
[root@rhel100 ~]# cd /tmp/test || ls -l /tmp/test

进入目录并查看目录
[root@rhel100 ~]# cd /tmp/test && ls -l /tmp/test

创建文件并查看目录
[root@rhel100 ~]# touch /tmp/test/a.txt && ls -l /tmp/test/

如果你的命令比较长,那么可以使用 “” 符号来做分隔
[root@rhel100 ~]# cd \

/home/
[root@rhel100 home]#

关于命令执行的快捷键
Tab 补全
Tab补全的前提是已经安装了依赖包
[root@rhel100 home]# rpm -qa | grep -i bash-com
bash-completion-2.7-5.el8.noarch
在最小化安装操作系统的时候,这个依赖包并没有被安装

Tab的正确使用方式
1)针对命令部分
Tab一次,你输入的关键字能唯一确定一个命令的时候就会弹出
如果你的关键字不能唯一识别一个命令的时候,Tab两次,就会把所有与该关键字有关的命令全部显示

2)参数提示
你可以在一个完整命令的任何位置使用Tab键
[root@rhel100 home]# nmcli connection
add delete edit help load monitor show
clone down export import modify reload up

3)补全文件或者目录名称
[root@rhel100 home]# cd /h

其它快捷键
Ctrl + A -> 跳到命令行的开头
Ctrl + E -> 跳到命令行的末尾
Ctrl + U -> 将光标处到命令行开头的内容清除
Ctrl + K -> 将光标处到命令行末尾的内容清除
Ctrl + 左箭头 -> 跳到命令行中前一字的开头
Ctrl + 右箭头 -> 跳到命令行中前一字的末尾
Ctrl + L -> 清屏

Ctrl + R -> 在历史记录列表中搜索某一模式的命令
1)关键字,你曾经执行过的命令中的某个关键字,一般我都是输入命令
2)查找历史记录(你曾经执行过的操作)中包含这个关键字的命令
3)找到正确的之后,按下Enter键盘
Linux是可以记录你执行多的操作,默认情况下四记录1000条!

查看历史命令
[root@rhel100 ~]# history

执行历史命令
[root@rhel100 home]# !36
cd

!36 就是把编号为36的历史命令重新执行一遍

总结: 关于执行命令的总结
1、Enter 键执行一条命令
2、;|| && 可以连接多条命令
3、Tab 补全
4、快捷方式
5、历史记录

day02 ======================================================================================================== day02
权限 -> 有9个字符 3个字符一个段

拥有者: rwx
数组: rwx
其他人: rwx

rwx = 4 + 2 + 1 = 7

查看命令别名
[root@rhel100 ~]# alias
alias cp=‘cp -i’
alias egrep=‘egrep --color=auto’
alias fgrep=‘fgrep --color=auto’
alias grep=‘grep --color=auto’
alias l.=‘ls -d .* --color=auto’
alias ll=‘ls -l --color=auto’

定义别名 等于号两边不能有空格
[root@rhel100 ~]# alias alexmk=“ls -l”

[root@rhel100 ~]# mkdir /mnt/sr0
[root@rhel100 ~]# mount /dev/sr0 /mnt/sr0/
[root@rhel100 yum.repos.d]# vim dvd.repo
[AppStream]
name=AppStream
baseurl=/mnt/sr0/AppStream/
enabled=1
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=/mnt/sr0/BaseOS/
enabled=1
gpgcheck=0
[root@rhel100 yum.repos.d]# dnf repolist
[root@rhel100 ~]# yum install -y mariadb-server
[root@rhel100 ~]# systemctl start mariadb
[root@rhel100 ~]# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 31287 mysql 22u IPv6 70128 0t0 TCP *:mysql (LISTEN)
[root@rhel100 ~]# ll /var/lib/mysql/mysql.sock

[root@rhel100 ~]# mysql -uroot -h127.0.0.1 -P3306
MariaDB [(none)]>

[root@rhel100 ~]# mysql -uroot -S /var/lib/mysql/mysql.sock
MariaDB [(none)]>

创建目录
[root@rhel100 opt]# mkdir test

创建多级目录
[root@rhel100 opt]# mkdir -p aa/bb/cc

删除空目录
[root@rhel100 opt]# rmdir test

强制递归删除
[root@rhel100 opt]# rm -rf aa/

查看目录
[root@rhel100 opt]# ls -al module/

复制文件到指定目录
[root@rhel100 opt]# cp a.txt module/

递归复制目录到指定目录
[root@rhel100 opt]# cp -r mm/ module/

移动文件到指定目录
[root@rhel100 opt]# mv a.txt module/

递归移动目录到指定目录
[root@rhel100 opt]# mv -r mm/ module/

mv还可以对文件重命名
[root@rhel100 opt]# mv a.txt b.txt

查看文件并输出行号
[root@rhel100 opt]# cat -n a.txt

分批查看文件
Enter键往下翻一行
空格键往下翻一页
不能往上翻页
[root@rhel100 opt]# more a.txt

less的作用和more差不多,也是分屏输出
Enter键往下翻一行
空格键往下翻一页
pageup往上翻一页
方向键的向上键是往上翻一行
[root@rhel100 opt]# less a.txt

查看一个文件的前10行
[root@rhel100 opt]# head a.txt

查看文件前5行并输出行号
[root@rhel100 ~]# cat -n /tmp/anaconda.log | head -n 5

查看文件后10行
[root@rhel100 ~]# tail /tmp/anaconda.log

查看文件后10行并输出行号
[root@rhel100 ~]# cat -n /tmp/anaconda.log | tail

查看文件后2行
[root@rhel100 ~]# tail -n 2 /tmp/anaconda.log

持续查看一个文件新增的内容
[root@rhel100 ~]# tail -f /tmp/anaconda.log

软连接
[root@rhel100 ~]# ln -s jdk-1.8 jdk

硬连接
[root@rhel100 ~]# ln jdk-1.8 jdk

通配符
? 这个位置一定有一个任意字符,而且只有一个
[root@rhel100 ~]# ls -l f?
[a-z] 这个位置,一定有一个字符,而且只有一个。并且这个字符不是任意字符是[a-z]中的一个
[root@rhel100 ~]# ls -l f[a-z]
[root@rhel100 ~]# ls -l f[0-9a-z]

取反,取值范围不包含[a-z]
^ 和 ! 的作用是一样的
[root@rhel100 ~]# ls -l f[^a-z]
[root@rhel100 ~]# ls -l f[!a-z]

[[:alpha:]] -> [a-zA-Z]
[root@rhel100 ~]# ls -l f[[:alpha:]]

[[:lower:]] -> 小写[a-z]
[root@rhel100 ~]# ls -l f[[:lower:]]

[[:upper:]] -> 大写[A-Z]
[root@rhel100 ~]# ls -l f[[:upper:]]

[[:digit:]] -> 数字[0-9]
[root@rhel100 ~]# ls -l f[[:digit:]]

[[:space:]] -> 空格
[root@rhel100 ~]# ls -l f[[:space:]]t

[[:punct:]] -> 特殊符号 #$%^&
[root@rhel100 ~]# ls -l f[[:punct:]]

大括号
[root@rhel100 ~]# touch {a,b,c,d,e}.log
[root@rhel100 ~]# ls -l {a,b,c,d,e}.log

重定向
什么是重定向?
执行一条命令,默认的输出结果是在终端上展示,我们可以通过重定向的方式,将输出在终端的结果导入到文件中或者"null设备",这里注意是"null设备"而不是"null"

是覆盖

是追加
[root@rhel100 ~]# ls -l > a.txt
[root@rhel100 ~]# ls -l >> b.txt
[root@rhel100 module]# ls -l > /dev/null

想搞清楚重定向,首先需要知道结果的类型
1)正确的输出结果
一条命令的正常输出结果!
针对正确的输出结果,可以采用 > 或者 >> 来进行重定向
> 是覆盖
>> 是追加

2)错误的输出结果
比如说命令不存在之类的
[alex@rhel100 ~]# cd /root/ > f1
2> 是覆盖
2>> 是追加

我们还可以重定向到null设备,一般在写shell脚本的时候使用
[root@rhel100 module]# ls -l > /dev/null
[root@rhel100 module]# ls -l >> /dev/null

针对这两种不同的输出结果,重定向的方式不同

我们也可以同时重定向,一条命令,既有正确的输出结果,又有错误的输出结果,就可以采用 &> 或者 &>> 来实现同时重定向
只重定向了正确的
[alex@rhel100 module]# find / -user alex >> /dev/null
只重定向了错误的
[alex@rhel100 module]# find / -user alex 2>> /dev/null

正确的和错误的都重定向了
&> 是覆盖
[alex@rhel100 module]# find / -user alex &> /dev/null

&>> 是追加
[alex@rhel100 module]# find / -user alex &>> /dev/null

特别说明: 当你采用重定向的时候,尤其是要将输出的内容重定向到一个重要文件的时候。务必小心不要使用 “>” 因为文件内容会被覆盖

管道说明 “|” 把前面一条命令的输出,作为后面一条命令的输入
[root@rhel100 module]# cat -n a.log | head -n 2

如果你的输出内容,既想在控制台输出,又想保存在文件中
tee 是将上一条命令的输出作为输入写进m.log文件并在控制台打印
[root@rhel100 module]# cat -n a.log | tee m.log
[root@rhel100 module]# cat m.log

vim
vim 就是一个文本编辑器,就像你在使用widnow的时候,去编辑一个文件
1)命令行模式
yy -> p

2)输入模式
i o a
I O A -> Esc 退出到命令模式

3)末行模式
:?/
:set nu
:wq!

vim字符串替换
替换的框架 -> 1,5s///g
1表示从第一行开始查找要替换的内容
5表示查到第5行位置
s/要替换的内容/替换成什么/g

为什么要先构建框架呢?
例如
把1行到最后一行的 /sbin/nglogion 替换成/bin/bash
这里面牵扯到字符转义
1,$s//sbin/nologion//bin/bash/g

叹号
:! 命令 -> Enter
! 命令 表示暂时离开vim编辑环境,输入Enter又回到vim编辑命令

r 可以将另外一个文件的内容呢读取到你正在编辑的文件上面
:r 文件绝对或相对路径

:r ! commad
:r ! ls -l 讲执行的命令作为输入,写入这个文件

vim 同时编辑多个文件
[alex@rhel100 module]# vim -O a.txt b.txt
只是多了一道切换的程序
如何切换呢?
Ctrl + w + 方向键 进行切换

Vim可视化模式 其实就是块操作
Ctrl + V -> 左右移动
Shift + V -> 上下移动
Esc 退出视图模式

day03 ===================================================================================================== day03

用户和用户组
[root@rhel100 module]# su alex
[root@rhel100 module]# su - alex

[root@rhel100 module]# id root
[root@rhel100 module]# id alex
[root@rhel100 module]# id mysql

用户添加
[root@rhel100 module]# useradd -u uid -g 初始组 -G附加组 -s shell类型 -c 注释 -d 家目录

用户删除
[root@rhel100 module]# userdel -r alex
-r 递归删除 删除用户的同时也把删除用户的家目录一并删除了

添加组
[root@rhel100 module]# groupadd test8

删除组
[root@rhel100 module]# groupdel test8

把alex用户添加到test8组中
[root@rhel100 module]# gpasswd -a alex test8

把alex用户从test8组中删除
[root@rhel100 module]# gpasswd -d alex test8

修改密码方式一
[root@rhel100 module]# echo 000000 | passwd --stdin alex

修改密码方式二
[root@rhel100 module]# passwd alex

查看密码信息
[root@rhel100 module]# passwd -S alex

锁定密码
[root@rhel100 module]# passwd -l alex

解锁密码
[root@rhel100 module]# passwd -u alex

设置多少天之内不能更改密码
[root@rhel100 module]# chage -m 1 alex

设置多少天之后必须要更改密码
[root@rhel100 module]# chage -M 7 alex

设置提前多少天开始密码告警
[root@rhel100 module]# chage -W 4 alex

设置密码到期后宽限多少天
[root@rhel100 module]# chage -I 2 alex

设置账号失效时间
[root@rhel100 module]# chage -E 2021-11-15 alex

查看
[root@rhel100 module]# grep alex /etc/shadow

查看默认值
[root@rhel100 module]# vim /etc/login.defs

sudo 用于权限提升
[alex@rhel100 module]# fdisk -l /dev/nvme0n1
提升alex用户的权限,让他能够去执行某些root权限,而不是全部
让一个普通用户具备root用户的某些权限!
通过sudo来给alex用户具备root用户的某些权限,就是通过修改指定的配置 /etc/sudoers
修改 /etc/sudoers 配置文件可以使用vim ,但是更建议使用visudo去编辑,因为 visudo 具备语法检测功能

visudo
[alex@rhel100 module]# visudo

用户名(提升谁的权限) ALL=(ALL) ALL(指的就是权限)
你要把那些权限给那个用户
ALL=(ALL) 从那个主机上面登陆
权限:指的就是操作
alex ALL=(ALL) /usr/sbin/fdisk

[alex@rhel100 module]# sudo fdisk -l /dev/nvme0n1

除了可以使用用户名外,还可以使用组名,使用组名的时候要加 % 号
%galex ALL=(ALL) /usr/sbin/fdisk

也可以使用别名,别名必须大写,别名不用使用%号
这是用户别名
User_Alias ADMINS = alex, mk
ADMINS ALL=(ALL) /usr/sbin/fdisk

命令别名
Cmnd_Alias RHCE = /bin/passwd, /usr/sbin/fdisk
ADMINS ALL=(ALL) NOPASSWD: RHCE

默认属性
为什么??
直接创建的目录权限是755
直接创建的文件权限是644

是因为有一个默认属性: umask 反掩码
[root@rhel100 module]# umask

创建一个目录的默认权限 -> 等于满权限(777) - umask值 777 - 022 = 755
创建一个文件的默认权限 -> 等于满权限(666) - umask值 666 - 022 = 644

root 用户 和 普通用户的 umask 值不一样
普通用户的用户名和组名一样的时候 umask 值 才是002
[root@rhel100 module]# vim /etc/profile
if [ $UID -gt 199 ] && [ “/usr/bin/id -gn” = “/usr/bin/id -un” ]; then
umask 002
else
umask 022
fi

查看 gn
[root@rhel100 ~]# id -gn
root

查看 un
[root@rhel100 ~]# id -un
root

临时修改umask值
[root@rhel100 module]# umask 000
[root@rhel100 module]# umask
0000

特殊权限位置
suid
sgid
stick bit

suid
问: 普通用户能不能修改自己的密码?
答: 能

问: 修改密码,最终会修改那个文件
答: /etc/shadow

问: /etc/shadow 文件有什么权限?
答: 无权限
[root@rhel100 ~]# ls -l /etc/shadow
----------. 1 root root 1385 Nov 10 17:51 /etc/shadow

问: 既然没有权限,普通用户alex是如何把密码写进去的呢?
答: alex 执行的是哪个二进制文件呢?
[root@rhel100 ~]# which passwd
/usr/bin/passwd
[root@rhel100 ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 Dec 14 2019 /usr/bin/passwd
user -> rws
SUID: 当一个s权限出现在拥有者的x位上时就是SUID
SUID 仅仅针对二进制文件生效: 比如 passwd

作用: 当一个用户alex去执行一个带有SUID的二进制文件(passwd)的时候
那么这个用户(alex)在执行过程中,会获取到这个二进制文件(passwd)的拥有者(root)的权限(暂时的)!
后续操作,比如修改(passwd)这个文件的时候,会拿着(root)这个拥有者的身份去执行
passwd -> /etc/shadow -> root的身份去操作的
[alex@rhel100 ~]# ps -ef | grep -i passwd
[alex@rhel100 ~]# pstree -Aup | grep passwd

SGID
当一个s权限出现在属组的X位上的时候,就是SGID
[alex@rhel100 ~]$ which cat
/usr/bin/cat
[alex@rhel100 ~]$ ls -l /usr/bin/cat
-rwxr-xr-x. 1 root root 38504 Apr 14 2020 /usr/bin/cat
[alex@rhel100 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[root@rhel100 ~]# chmod g+s /usr/bin/cat
[root@rhel100 ~]# su - alex
[alex@rhel100 ~]$ ls -l /usr/bin/cat
-rwxr-sr-x. 1 root root 38504 Apr 14 2020 /usr/bin/cat
[alex@rhel100 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

依然没有权限,怀疑是因为 un 和 gn 是一样的

SGID
1)针对二进制文件
2)能够针对目录

默认情况下
新建一个文件或者新建一个目录,属组是谁?是初始组

[root@rhel100 ~]# mkdir /tmp/test_root
[root@rhel100 ~]# chmod g+s /tmp/test_root
[root@rhel100 ~]# chmod o+w /tmp/test_root
[root@rhel100 ~]# su - alex
[alex@rhel100 ~]$ touch /tmp/test_root/f1
[alex@rhel100 ~]$ ls -ld /tmp/test_root/f1
-rw-rw-rw- 1 alex root 0 Feb 12 05:46 /tmp/test_root/f1

chmod o+t /tmp
t
如果一个目录具备了 t 位置! 那么该目录下的文件,或者目录只有root和它自己能删除,其余人都不能删除

特殊属性: a i
这两个特殊属性
[root@rhel100 ~]# chattr +i /etc/fatab
如果一个文件加了 i ,这个文件就变成了只读文件了

[root@rhel100 ~]# chattr +a /etc/fatab
如果一个文件加了 a ,这个文件就变成了不能保存的文件
不能写,不能删除,但是能追加(重定向追加)

赋予文件权限的时候,可以使用逗号分隔
[root@rhel100 ~]# chmod u=rwx,g+w,o-rwx /tmp/a.txt

修改用户
[root@rhel100 ~]# chown alex a.txt

修改用户组
[root@rhel100 ~]# chgrp alex b.txt

迭代修改用户和用户组
[root@rhel100 ~]# chown -R alex:alex a.txt

day04 ======================================================================================================== day04
进程

静态的程序 -> 触发成了一个动态的进程!
1)进程怎么来的?
2)进程的状态怎么样的?
3)这个进程占用了多少资源
4)我的系统中总共有多少进程
5)那个进程占用的资源多
6)那个进程占用的资源少
7)是否存在不正常的进程
8)我的系统还剩下多少资源

Linux 查看进程
1)工具软件
zabbix promethus grafana

2)通过系统命令
ps pstree top free
[root@rhel100 ~]# pstree -Aup | grep pass

PRI 是进程的优先级
进程优先级PRI(进程优先级) = PRI + NICE 的结果
NICE默认值是0
NICE值的取值范围是 [-20,19]
普通进程:80 内核分配的
[root@rhel100 ~]# nice -n -15 passwd
调整优先级,只能调整NICE的值

现在的系统,优先级对于系统调度的影响,已经没有那么大了
系统已经自动优化,而且系统资源比较充沛

[root@rhel100 ~]# ps -aux | more
[root@rhel100 ~]# pstree -Aup

[root@rhel100 ~]# top
[root@rhel100 ~]# top -d 1 -n 1
-d 时间间隔,单位是秒
-n 刷新次数

命令后端执行
[root@rhel100 ~]# ping www.baidu.com >> /dev/null &
& 就把命令丢到后端进行

查看后端进程
[root@rhel100 ~]# jobs

后端进程转到前端进程
[root@rhel100 ~]# fg 1%

把后台停止进程变成后台运行进程
[root@rhel100 ~]# bg 1%

ctrl + z -> 前台进程 -> 编程后台进程

关闭当前后台运行的命令
[root@rhel100 ~]# kill %jobnum
[root@rhel100 ~]# kill pid

不管是前端进程还是后端进程,只要终端结束额,跟这个终端相关的所有的进程都会停止

创建一个后台任务,和终端无关的任务
xshell终端关闭了,这个job任务依然可以运行,没有关系,我是一个与终端没有关系的任务!
注销: 都不影响
[root@rhel100 ~]# nohup ping www.baidu.com >> /dev/null &

信号控制
结束进程
[root@rhel100 ~]# kill -9 pid

服务管理
熟知的Linux服务有 apache、Mysql、NFS、SAMBA等服务
systemctl start/status/stop service

httpd:所有的访问处理都是通过进程来处理的

只有进程才能处理问题!!
那为什么需要服务这个概念呢?
1)当你采用 /usr/sbin/httpd 这个可执行文件去创建进程,没问题

2)修改配置的时候,重启httpd服务?
[root@rhel100 ~]# killall -1 httpd

  1. 如果你需要去停止所有的httpd进程
    [root@rhel100 ~]# killall -15 httpd

4)如果你需要开机自动启动
killall 是没有办法完成的

5) httpd 服务没什么

6) 服务器服务:系统必要的,或者在你系统存在很多进程的情况下
必然不可能使用killall/kill来做管理!

7)更加方便的去管理!
方便的管理这个服务所对应的进程

8)RHEL8 或者 RHEL7 都是通过 systemd来做管理
(1) 系统的启动
(2) 一般服务启动
(3)一般服务的管理
systemd: 本身也是个服务,systemd是用来管理别人的
(1) 系统的启动
(2) 一般服务的启动
(3) 一般服务的管理

通过什么样的方式的管理
systemd-
命令工具 systemctl RHEL7 之前: RHEL 6/5/4

service:
/bin/systemctl
init: service /etc/init.d/ xinet ch

systemd: 这个只有一个管理工具: systemctl
systemctl 管理服务的时候需要去读取一个单元配置文件,根据单元配置文件的定义去启动和管理相对应的进程

单元配置文件的路径
/usr/lib/systemd/system/httpd.service

systemd: 需要对你的系统服务进行分类
1、一般服务有关的
httpd、samba、nfs、dns、dhcp等
.service 以 .service 结尾的就是和一般服务有关的
.service httpd.service dhcpd.service 等

2、与开机启动有关的
.target

3、套接字单元的
.socket

但是不管你是什么样的类型单元的,都一定会有一个单元配置文件

[root@rhel100 ~]# systemctl -t help
Available unit types:
service
socket
target
device
mount
automount
swap
timer
path
slice
scope

systemd的管理工具 systemctl 仅认单元配置文件!
只要你提供了一个可用的单元配置文件: 那么就能通过 systemctl 来管理
你就可以自己定义单元配置文件来定义服务!!! 比如 nginx
自己定义nginx的单元配置文件。你就能通过systemctl来管理nginx
systemctl start/stop/restart/reload/status/enable/disable/is-enable/is-disable/list-units httpd

/etc/systemd/system/multi-user.target.wants/ 单元配置文件优先级高于/usr哪个
vim /etc/rc.local
Serivce: Simple /notify !
Service:

SSH 是比 Telnet 更安全的远程登陆的服务
因为Telnet是明文传输,SSH是密文传输
SSH需要使用密钥加密
加密方式
1、对称加密
1)加密密码和解密密码是同一个!
2)安全度稍微低一点!

2、非对称加密
1)公钥
2)私钥

非对称加密的这种方式安全但是相对速度慢

生成公钥和私钥
[root@rhel100 ~]$ ssh-keygen -t rsa

拷贝公钥
[root@rhel100 .ssh]$ ssh-copy-id rhel101

.ssh文件夹下的文件功能解释
(1)known_hosts :记录ssh访问过计算机的公钥(public key)
(2)id_rsa :生成的私钥
(3)id_rsa.pub :生成的公钥
(4)authorized_keys :存放授权过得无秘登录服务器公钥

基于SSH的无密钥登陆,在SSH Client创建一个密钥对
[root@rhel100 .ssh]$ ssh-keygen -t rsa -b 4096 -N ‘’ -f 指定保存路径

[root@rhel100 .ssh]$ ssh-keygen -t rsa -b 4096 -N ‘’ -f /root/.ssh/id_rsa

参数解析
1)ssh-keygen

SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

从客户端来看,SSH提供两种级别的安全验证:

第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密匙的安全验证)ssh-keygen:需要依靠密匙,你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒 。

ssh-keygen有很多的参数,比如这里的-t -b -C都是他的一些参数

2) -t rsa
-t即指定密钥的类型,密钥的类型有两种,一种是RSA,一种是DSA:

RSA:RSA加密算法是一种非对称加密算法,是由三个麻省理工的牛人弄出来的,RSA是他们三个人姓的开头首字母组合。

DSA:Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种。

为了让两个linux机器之间使用ssh不需要用户名和密码。所以采用了数字签名RSA或者DSA来完成这个操作。ssh-keygen默认使用rsa密钥,所以不加-t rsa也行,如果你想生成dsa密钥,就需要加参数-t dsa。

3)-b 2048
-b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。命令中的4096指的是RSA密钥长度为4096位。

DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。

4) -c
命令后面还可以增加-C “注释内容”

-C表示要提供一个新注释,用于识别这个密钥,可以是任何内容,一个用来识别的key

小结:当你创建ssh的时候:-t 表示密钥的类型 ,-b表示密钥的长度,-C 用于识别这个密钥的注释 ,这个注释你可以输入任何内容

yes 为允许root用户登陆
no 为不允许root用户登陆
[root@rhel100 ~]# vim /etc/ssh/sshd_config
PermitRootLogin yes

控制服务和守护进程
1)在 RHEL7 以后服务管理都是通过 systemd 来完成的
2)systemd 提供了一个唯一的管理工具: systemctl
3) systemd 讲系统服务类型分类:一种类就是一个单元
比如
service 单元
path 单元
socket单元

systemctl
enable
is-enable
disable
start
stop
reload
restart
status
is-active 插件服务运行状态类似于status
mask -> 类似于 [root@rhel100 module]# ln -s /etc//systemd/system/syslog.service -> /dev/null
unmask
list-dexx
展示所有服务状态详细信息
list-units --type service --all
列出所有服务并且检查是否开机启动
systemctl list-unit-files --type service
day05 ======================================================================================================= day05

日志管理
在 RHEL 系统中,日志是通过什么协议记录的呢? syslog
[root@rhel100 ~]# systemctl status systemd-journald.service
[root@rhel100 ~]# systemctl status rsyslog.service

syslog: 只是一个协议,一个标准!
systemd-journald.service: 记录:服务有关的,开机引导有关的,服务在运行只有有关的日志保存在: 以二进制文件的形式保存在内存中,如果系统被重启以后,systemd-journald.service 保存的日志就没有了
rsyslog.service: 就是要把 systemd-journald.service 保存的二进制内容,转换成文本文档,并且会保存在 /var/log/ 中

如果你要查看日志,就需要知道 /var/log/ 有哪些目录

/var/log/secure 的日志一般是和登陆有关
systemd-journald.service 是没有日志分类功能的
日志分类功能是 rsyslog 干的事情,查看日志的方式一般是less 或 tail
日志格式如下
Feb 28 20:59:23 www sshd[7559]: Accepted password for root from 192.168.2.100 port 64465 ssh2
时间 记录日志的时候 时间产生的时间
www表示谁产生了这条日志
rsyslog可以记录远程主机的日志
SSHD 这个日志是由哪个服务产生的
Accept XXX: 具体的日志事件


服务类型的日志,比如httpd的日志,是有自己的定义格式

对于特定的服务日志格式,在服务的配置文件会定义好保存的日志格式
[root@rhel100 ~]# systemctl start httpd
[root@rhel100 ~]# cd /var/log/httpd
[root@rhel100 httpd]# ls -l
access_log
error_log
[root@rhel100 ~]# cat access_log

redhat 没有注册,无法使用,只能使用本地镜像
[root@rhel100 ~]# cd /etc/yum.repos.d/
[root@rhel100 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@rhel100 yum.repos.d]# yum clean all
[root@rhel100 yum.repos.d]# yum makecache

开机需要重新挂载
[root@rhel100 ~]# mount /dev/sr0 /mnt/sr0/

安装httpd
[root@rhel100 ~]# yum install -y httpd


在你以后使用Linux的时候,你如果要查看日志
1、首先你需要知道,查看的是什么样的日志
1)你要查看某个具体的服务: 比如httpd服务
httpd 的配置文件中,关于日志的定义路径,以及日志格式

2)查看的是系统有关的日志或服务的简略日志
那就去 /var/log 下面去查看 或者使用 systemctl status httpd 这样的命令查看

3)更多的场景下是通过专门的记录日志的方式去查看日志,比如说ELK

接下来的问题:
rsyslog:分门别类的存在,是通过rsyslog的配置文件来定义的

[root@rhel100 ~]# vim /etc/rsyslog.conf
.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.
/var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
.emerg :omusrmsg:

authpriv.* /var/log/secure
表示凡是和登陆验证有关的全部放在/var/log/secure中
.* 表示日志的级别
日志是有级别的,总共分了8个级别
代码 优先级 严重性
0 emerg 系统不可用
1 alert 必须立即采取措施
2 crit 临界情况
3 err 非严重错误状况
4 warning 警告情况
5 notice 正常但重要的事件
6 info 信息性事件
7 debug 调试级别信息

warning: 表示警告,比如使用一个软件,这个软件的某一个功能在下一个版本中可能会被剔除和移除!那么在当前版本中给你一个warning
ERROR: ERROR 和 ERROR 以上的日志,表示事件紧急,就需要人为干预了

:omusrmsg:* 会在所有的终端上去显示日志,尤其是针对emerg级别的日志

手动发送日志
[root@rhel100 ~]# logger -p authpriv.debug “Log entry created on host …”
当日志定义到了emerg上后,所有终端都能看到
[root@rhel100 ~]# logger -p authpriv.emerg “Log entry created on host …”

local7.* -> 日式设备
首先有服务记录日志到特定的 local 设备,然后再通过 rsyslog 存储到特定的文件

最大是local7.*
[root@rhel100 ~]# yum install -y haproxy
[root@rhel100 ~]# vim /etc/haproxy/haproxy.cfg
local2.* /var/log/haproxy.log
Haproxy 这个服务要把日志记录到 local2 这个日志设备中
rsyslog 会把记录在 local2 这个日式设备中的文件,记录到特定的文件中去~

[root@rhel100 ~]# vim /etc/rsyslog.conf
local3.* /var/log/test.log
[root@rhel100 ~]# grep local3 /etc/rsyslog.conf
[root@rhel100 ~]# logger -p local3.debug “test local device”
[root@rhel100 ~]# cat /vat/log/test.log

local 这个设备是可以接受任何你所定义的日志
authpriv:就是指安全登录有关的,就不能接收所有的自定义日志格式

定义日志的方式:
Haproxy: 在Rsyslog并没有某种日志类型对应Haproxy
Haproxy 的日志应该放在那里呢? Haproxy 的日志 -> local -> /vat/log/haproxy.log

local日志设备,最多只有7

日志轮替
自己定义一种规则,日志文件大小或者周期
比如说我们有一个日志
/var/log/secure
[root@rhel100 ~]# mv /var/log/secure /var/log/secure01.log
[root@rhel100 ~]# touch /var/log/secure
不能无限制的保存日志,所以最重要的就是日志的轮替规则
1)以周期为规则
比如说每周的周五执行一次轮替,当然也可以以天为单位
2)日志文件的大小来进行轮替
比如说当这个日志文件的体积达到了5MB的时候,就执行一次轮替
3)混用轮替规则
当时间周期或者体积大小,只要有一个满足条件了,就执行一次轮替

weekly 以周为执行轮替的周期单位
rotate 4 日志文件最多保留几分
create 执行轮替后,创建一个空文件
dateext 执行轮替后,添加时间后缀

[root@rhel100 module]# cd /etc/logrotate.d/
[root@rhel100 logrotate.d]# vim syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
如果某些服务没有定义轮替规则,那么他们的轮替规则就是在 /etc/lograted.conf 当中定义的轮替规则

[root@rhel100 logrotate.d]# vim ./haproxy
如果针对某个具体的日志文件,也定义了轮替规则,那么这个日志文件的轮替规则就会采用自己定义的轮替方式

总结日志系统
rsyslog -> 根据配置文件 /etc/rsyslog.conf , 将内存日志保存到文本文档中
保存规则,日志分类 也是在配置文件中,比如说 authpriv.* /var/log/secure
local 日志保存设备,是有点特殊的,需要在其它的某个地方定义将日志保存到 local 设备中
日志发送 logger -p
日志的轮替

-l 参数表示查看详细信息
[root@rhel100 ~]# systemctl status httpd -l

查看跟error相关的日志,-p指定日志级别
[root@rhel100 ~]# journalctl -p error

根据时间查看日志
[root@rhel100 ~]# journalctl --since 21:20 --until 22:50

显示最后5行
[root@rhel100 ~]# journalctl -n 5

类似于 tail -f 实时监控
[root@rhel100 ~]# journalctl -f

[root@rhel100 ~]# getenforce
Enforcing

查看内存
[root@rhel100 ~]# free -m

[root@rhel100 02965004ee064883a98ed7ddde0afd56]# pwd
/run/log/journal/02965004ee064883a98ed7ddde0afd56

[root@rhel100 02965004ee064883a98ed7ddde0afd56]# ls -lh system.journal
-rw-r-----+ 1 root systemd-journal 8.0M Nov 13 23:23 system.journal

改为永久存储,内存就会写入到磁盘
[root@rhel100 ~]# vim /etc/systemd/journald.conf
[Journal]
Storage=persistent

[root@rhel100 ~]# cd /usr/local/bin/
[root@rhel100 bin]# vim logger.sh
#!/bin/bash
while true
do
logger -p local7.debug “test local aaaaa”
done

RHEL 7 和 RHEL8 它改的方式有一点点区别
直接创建目录就可以
[root@rhel100 ~]# mkdir -p /var/log/journal

[root@rhel100 ~]# cat /etc/group | grep journal

维护准确的时间

查看本地时间
[root@rhel100 bin]# timedatectl
Local time: Sat 2021-11-13 23:36:02 CST
Universal time: Sat 2021-11-13 15:36:02 UTC
RTC time: Sat 2021-11-13 15:36:00
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no

设置时区为 CST 不一定是对的,但是设置时区是上海 一定是对的,因为全球 CST 时区一共有4个
[root@rhel100 bin]# timedatectl set-timezone “Asia/Shanghai”

CST 可视为美国,澳大利亚,古巴,中国的标准时间

设置时间
如果想设置本地时间,需要把ntp服务给关闭掉
[root@rhel100 ~]# timedatectl set-ntp false
[root@rhel100 ~]# timedatectl set-time “2021-11-13 23:41:30”
[root@rhel100 ~]# date
Sat Nov 13 23:41:32 CST 2021
[root@rhel100 ~]#

修改ntp 配置文件
[root@rhel100 ~]# vim /etc/chrony.conf

查看同步情况
[root@rhel100 ~]# timedatectl set-ntp true
[root@rhel100 ~]# chronyc sources -v

网络的管理
添加一个网卡仅主机模式

在 RHEL7 乃至RHEL7之前,有一个专门的network服务
RHEL8 从此不再有这个服务
[root@rhel100 ~]# systemctl status network
Unit network.service could not be found.

RHEL8 使用 NetworkManager 服务,管理网络
[root@rhel100 ~]# systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
Active: active (running)

RHEL6 和 RHEL7 的时候,很多时候建议把 NetworkManager 服务关闭,但是在 RHEL8 中这个服务不再允许关闭,必须开着

1)网络设备信息
device 的命名
[root@rhel100 ~]# ifconfig
[root@rhel100 ~]# ip addr show

网络接口名称以接口类型开头:
以太网接口以en开头
WLAN接口以wl开头
WWAN接口以ww开头

RHEL7 以后命名网卡的方式,不再是 eth0、eth1之类,而是和网卡类型有关,ens160 中 en 表示以太网卡 s表示 PCl插槽
事实上,网卡的device 名字是可以更改的,比如按照功能更改

2)网络信息的查看
ip地址信息 mac信息 状态信息 等
ifconfig
ip addr 这个命令
[root@rhel100 ~]# ip addr show ens160
[root@rhel100 ~]# ifconfig ens160

3)路由信息查看
[root@rhel100 ~]# ip route
default via 192.168.2.2 dev ens160 proto static metric 100
192.168.2.0/24 dev ens160 proto kernel scope link src 192.168.2.100 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown

仅仅需要知道两个信息
(1) 整个系统的默认路由是谁,就是没有明细路由的情况下,吓一跳去哪里,带有default关键的哪一行
(2)要学会查看具体的明细路由,去某个特定网络的吓一跳是谁
比如 192.168.2.0/24 -> dev ens160

[root@rhel100 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.2 0.0.0.0 UG 100 0 0 ens160
192.168.2.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

  1. 查看DNS信息
    你的RHEL系统DNS服务器是谁: 比如 你访问www.baidu.com 这个域名的时候是哪个服务器帮你做的解析
    [root@rhel100 ~]# cat /etc/resolv.conf

Generated by NetworkManager

nameserver 192.168.2.2
nameserver 114.114.114.114

5)查看主机名信息
[root@rhel100 ~]# hostname
rhel100

6)统计信息
[root@rhel100 ~]# ifconfig ens160
[root@rhel100 ~]# ip -s link show ens160

7)网络连通性测试
-c 指定 ping 的次数
[root@rhel100 ~]# ping www.baidu.com -c 4

-s 指定一个包的大小
[root@rhel100 ~]# ping www.baidu.com -c 4 -s 2048

ping ipv6
[root@rhel100 ~]# ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.100 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::dad6:8d1a:748c:7c4 prefixlen 64 scopeid 0x20
ether 00:0c:29:b8:d6:92 txqueuelen 1000 (Ethernet)
RX packets 2026 bytes 199732 (195.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1714 bytes 201661 (196.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@rhel100 ~]# ping6 fe80::dad6:8d1a:748c:7c4

[root@rhel100 ~]# ping6 fe80::dad6:8d1a:748c:7c4 -c 4

追踪流量采用的路由 -> 跟踪路由
[root@rhel100 ~]# tracepath www.baidu.com

8)查看端口
[root@rhel100 ~]# lsof -i:22

ss 命令 类似于 netstat
[root@rhel100 ~]# ss -tuln
-n 显示接口和端口的编号,而不显示名称
-t 显示TCP套接字
-u 显示UDP套接字
-l 仅显示侦听中的套接字
-a 显示所有(侦听中和已建立的)套接字
-p 显示使用套接字的进程
-A inet 对于inet地址系列,显示活动的连接

[root@rhel100 ~]# dnf install -y net-tools
[root@rhel100 ~]# netstat -tulnp | grep 22

网络信息的配置与管理

1、IP地址的配置修改、路由的配置、DNS的配置等
在RHEL8 之前,直接修改配置,然后重启network服务

2、RHEL8 之后已经不再提供 network 服务,所有网络的管理都是通过 NetworkManager 来完成的
NetworkManager 即提供了图形化的工具,又提供了命令行方式

图形化方式
[root@rhel100 ~]# nm-connection-editor

命令行方式
[root@rhel100 ~]# nmcli
connection 连接是可以为设备配置的设置的集合
连接文件: 把一个配置的集合放在一个文件内,就叫做连接文件,也可称之为网卡的配置文件
[root@rhel100 ~]# nmcli connection show
[root@rhel100 ~]# nmcli c show

1、如何才能修改呢??

网卡设备查看
[root@rhel100 ~]# nmcli device show
[root@rhel100 ~]# nmcli device status
[root@rhel100 ~]# nmcli device disconnect ens256
[root@rhel100 ~]# nmcli device connect ens256
[root@rhel100 ~]# nmcli connection show

一个设备一定是有连接的,如果没有,说明 nmcli device(connect) 没有自动生成
如果有,但是没有connect,那也是处于 disconnect 的状态

[root@rhel100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160

确认3点信息
1) 确认device的状态 -> [root@rhel100 ~]# nmcli device status
2) 确认device的连接 -> [root@rhel100 ~]# nmcli connection show
3) 确认device所对应的连接文件 -> [root@rhel100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160

nmcli -> device
-> status -> 状态查看
-> connect -> 连接
-> disconnect -> 断开连接
-> show -> 查看具体信息
-> connection
-> show -> 查看一个设备的连接是否正常

查看一个设备的具体连接属性
[root@rhel100 ~]# nmcli device show ens160

2、修改配置
1)当你通过 nmcli device status 查看一个设备的状态是 disconnect 的时候
nmcli connect ens256
连接就能看到
nmcli connect show
连接文件也就有了
2)nmcli device status 已经存在就不用管了

3)通过 nmcli connection modify 来修改设备所对应的连接属性
ip 子网掩码 DNS 网关(gateway) 这四个信息
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.addresses 192.168.3.5/24
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.method auto
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.method manual
[root@rhel100 ~]# nmcli connection reload ens256
[root@rhel100 ~]# nmcli connection down ens256
[root@rhel100 ~]# nmcli connection up ens256

[root@rhel100 ~]# nmcli connection add type ethernet ifname ens256 con-name “Wired connection 1”

IP 是针对设备的,但是网关和DNS是针对系统的!!

添加明细路由,重启后就没有了,需要编写脚本
[root@rhel100 ~]# ip route add 10.10.10.0/24 dev ens256
除了编写从那个网卡出去,还可以编写吓一跳网关是谁,吓一跳网关一定可达
[root@rhel100 ~]# ip route add 10.10.10.0/24 via 1.1.1.2

[root@rhel100 ~]# nmcli connection modify ens160 ipv4.addresss 192.168.2.100/24 ipv4.gateway 192.168.2.2 ipv4.dns 192.168.2.2

所有的DNS设置,都在这个文件里面,DNS只有两个能够生效
[root@rhel100 ~]# cat /etc/resolv.conf

DNS设置
你存在多网卡的情况下,你只需要在任意一张网卡上设置DNS就好了,不需要在所有的网卡配置上都去配置DNS

以上就是配置网关和DNS的思路

day06 ================================================================================================================= day06

网络管理
1、配置网络信息的思路
1)确认一个网络设备是否已经connect(是否有关联的连接),以及是否存在连接文件
[root@rhel100 ~]# nmcli connection show
[root@rhel100 ~]# nmcli device status

2)如果不存在,可以创建一个连接文件
[root@rhel100 ~]# nmcli device connect ens256
[root@rhel100 ~]# nmcli connection show
[root@rhel100 ~]# nmcli connection add type ethernet ifname ens256 con-name ens256
[root@rhel100 ~]# nmcli connection show

3)存在或者创建好以后,开始配置网络信息
配置网络信息
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.addresses 192.168.112.3/24 ipv4.gateway 192.168.111.2 ipv4.dns 192.168.111.2
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.method auto
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.method manual
检查是否生效
[root@rhel100 ~]# ip addr show
如果没有生效
[root@rhel100 ~]# nmcli connection down ens256
[root@rhel100 ~]# nmcli connection up ens256
4)启用!
[root@rhel100 ~]# nmcli connection down ens256
[root@rhel100 ~]# nmcli connection up ens256

如何才能正确去配置网络信息呢?
1)针对一个设备查看是否存在连接(connect) 以及连接文件
[root@rhel100 ~]# nmcli connection show
[root@rhel100 ~]# nmcli device status
[root@rhel100 ~]# nmcli connection add type ethernet ifname ens256 con-name ens256
[root@rhel100 ~]# nmcli connection show

2)如果不存在就创建一个
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.addresses 192.168.112.3/24 ipv4.gateway 192.168.111.2 ipv4.dns 192.168.111.2
[root@rhel100 ~]# nmcli connection modify ens256 ipv4.method manual

3)直接修改配置文件就可以了
[root@rhel100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens224

4)生效
[root@rhel100 ~]# nmcli connection reload ens256
[root@rhel100 ~]# nmcli connection down ens256
[root@rhel100 ~]# nmcli connection up ens256

查看主机名
[root@rhel100 ~]# hostname
rhel100
[root@rhel100 ~]# hostnamectl
[root@rhel100 ~]# hostnamectl status

修改主机名
[root@rhel100 ~]# hostnamectl set-hostname rhel100
[root@rhel100 ~]# vim /etc/hostname

  1. 首先创建一个逻辑的设备绑定口(team口)
    设置以主备的方式,还是以负载均衡的方式
    [root@rhel100 ~]# nmcli connection add type team ifname team0 con-name team0 config ‘{“runner”:{“name”:“activebackup”}}’

activebackup or loadbalance

查看处于down的状态
[root@rhel100 ~]# ip addr show team0

查看多了一个连接文件
[root@rhel100 ~]# ls -l /etc/sysconfig/network-scripts/ifcfg-*

  1. 添加物理网卡
    [root@rhel100 ~]# nmcli connection add type team-slave ifname ens161 con-name ens161 master team0
    [root@rhel100 ~]# nmcli connection add type team-slave ifname ens162 con-name ens162 master team0

3)修改连接文件(team0)物理口不需要修改IP地址!
[root@rhel100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-team0

4)启动
[root@rhel100 ~]# nmcli connection down team0
[root@rhel100 ~]# nmcli connection up team0

压缩
压缩只能针对文件进行压缩

压缩格式
gzip 压缩
gzip 压缩,源文件就没有了,只有压缩文件
[root@rhel100 module]# gzip a.txt
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 30 Nov 13 05:45 a.txt.gz

gzip 压缩 -c 参数,既保留压缩文件,又保留源文件
[root@rhel100 module]# gzip -c a.txt > a.txt.gz

gzip解压缩
解压缩后,压缩文件没有了
[root@rhel100 module]# gunzip a.txt.gz
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt

gunzip 解压缩 -c 参数,既保留压缩文件,又保留源文件
[root@rhel100 module]# gunzip -c a.txt.gz > a.txt

bzip2
bzip2 压缩,压缩后,源文件没有了
[root@rhel100 module]# bzip2 a.txt
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 44 Nov 13 05:45 a.txt.bz2

bzip2 压缩,添加 -k参数,保留源文件
[root@rhel100 module]# bzip2 -k a.txt
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt
-rw-r–r--. 1 root root 44 Nov 13 05:45 a.txt.bz2

bzip2 解压缩,解压缩后,压缩文件没有了
[root@rhel100 module]# bzip2 -d a.txt.bz2
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt

bzip2 解压缩,添加-k参数,压缩文件保留
[root@rhel100 module]# bzip2 -k -d a.txt.bz2
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt
-rw-r–r--. 1 root root 44 Nov 13 05:45 a.txt.bz2

xz
xz 压缩,xz压缩也不保留源文件
[root@rhel100 module]# xz a.txt
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 60 Nov 13 05:45 a.txt.xz

xz 压缩,添加-k参数 保留源文件
[root@rhel100 module]# xz -k a.txt
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt
-rw-r–r--. 1 root root 60 Nov 13 05:45 a.txt.xz

xz解压缩,不保留压缩文件
[root@rhel100 module]# xz -d a.txt.xz
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt

xz解压缩,-k 参数保留压缩文件
[root@rhel100 module]# xz -k -d a.txt.xz
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 4 Nov 13 05:45 a.txt
-rw-r–r--. 1 root root 60 Nov 13 05:45 a.txt.xz

tar.gz 是可以压缩目录的
tar 打包一个目录,把这个目录打包成一个文件

tar 把目录打包
[root@rhel100 module]# tar -cvf uu.tar uu/

tar 解包一个文件
[root@rhel100 module]# tar -xvf uu.tar

压缩
-z 参数 表示使用 gzip 压缩和解压缩
[root@rhel100 module]# tar -czvf modd.tar.gz modd/

解压缩
-C 参数可以指定解压路径
[root@rhel100 module]# tar -xzvf modd.tar.gz -C modd/

tar解压缩,-t 参数是测试解包
[root@rhel100 module]# tar -tzvf uu.tar.gz
drwxr-xr-x root/root 0 2021-11-15 12:29 uu/
-rw-r–r-- root/root 4 2021-11-13 05:45 uu/a.txt

[root@rhel100 module]# tar -tvf modd.tar.gz | more

tar 打包,使用 bzip2 进行压缩
[root@rhel100 module]# tar -cjvf uu.tar.bz2 uu/

tar 解包,使用 bzip2 进行解压
[root@rhel100 module]# tar -xjvf uu.tar.bz2

tar 打包,使用 xz 进行压缩
[root@rhel100 module]# tar -cJvf uu.tar.xz uu/

tar 解包,使用 xz 进行解压
[root@rhel100 module]# tar -xJvf uu.tar.xz

参数解析
-z 表示 gzip -> 后缀 -> gz
-j 表示 bzip2 -> 后缀 -> bz2
-J 表示 xz -> 后缀 -> xz

压缩的时候,排除某个文件
[root@rhel100 module]# tar --exclude=a.txt -czvf uu.tar.gz uu/

压缩的时候,排除多个文件
[root@rhel100 module]# tar --exclude=a.txt --exclude=b.txt -czvf uu.tar.gz uu/

解压缩的时候,只解压指定文件
[root@rhel100 module]# tar --extract uu/a.txt -xzvf uu.tar.gz

传输文件
系统之间传输文件
scp 传输,基于SSH通道,意思就是整个传输过程中,数据是被加密的

推送的方式传输数据
[root@rhel100 module]# scp -r a.txt root@rhel101:/opt/module/

拉的方式传输数据
[root@rhel100 module]# scp -r root@rhel101:/opt/module/ ./a.txt

sftp 传输文件
l表示本机,不带l表示远程主机
[root@rhel100 module]# sftp [email protected]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added ‘192.168.2.104’ (ECDSA) to the list of known hosts.
[email protected]’s password:
sftp> lpwd
sftp> pwd
sftp> put /opt/module/uu/a.txt -> 上传
sftp> get a.txt -> 下载

scp 和 sftp 都是全量传输,都不能增量传输数据

[root@rhel100 module]# dd if=/dev/zero of=f1 bs=1M count=200
[root@rhel100 module]# ll
-rw-r–r--. 1 root root 209715200 Nov 15 13:32 f1
[root@rhel100 module]# du -h f1

rsync 可以增量传输
参数 -n 是模拟传输
参数 -a 是组合套餐
[root@rhel100 module]# rsync -rvl uu/ root@rhel101:/opt/module/

–delete 表示如果源删除了,传输的过程中也会把目的文件删除
[root@rhel100 module]# rsync -rvl --delete uu/ root@rhel101:/opt/module/

分析和管理远程服务器

cockpit 已经安装
[root@rhel100 module]# rpm -qa | grep cock

[root@rhel100 opt]# systemctl enable cockpit.socket --now

web 访问端口
[root@rhel100 opt]# lsof -i:9090

帮助
man --help
[root@rhel100 opt]# cd --help
[root@rhel100 opt]# man date

安装包管理 dnf
RHEL8 yum 还能使用

[root@rhel100 opt]# which yum
/usr/bin/yum

[root@rhel100 opt]# ls -l /usr/bin/yum
lrwxrwxrwx. 1 root root 5 Jul 29 2020 /usr/bin/yum -> dnf-3

[root@rhel100 opt]# which dnf
/usr/bin/dnf

[root@rhel100 opt]# ls -l /usr/bin/dnf
lrwxrwxrwx. 1 root root 5 Jul 29 2020 /usr/bin/dnf -> dnf-3

DNF: 是 RHEL 中安装包管理工具!!!

1)怎么样才能获取RPM包 ?
(1)通过购买订阅就会有rpm包
(2)ISO文件
安装 RHEL8 系统的ISO文件,就包含了 6000 个 RPM 包
(3)如果你是centos的系统,熟知网站上就有RPM包
清华大学开源软件镜像站
https://mirrors.tuna.tsinghua.edu.cn

    阿里镜像网站
    https://developer.aliyun.com/mirror/

iso 当中拿取 rpm 包
1)首先要挂载ISO文件,才能读取到RPM包
把一个ISO文件,或者分区关联到一个目录上,访问这个目录,就相当于访问ISO文件的内容或者分区的内容
[root@rhel100 ~]# mkdir /mnt/cdrom
[root@rhel100 ~]# mount /dev/cdrom /mnt/cdrom/

[root@rhel100 ~]# vim /etc/yum.repos.d/dvd.repo
[AppStream]
name=AppStream
baseurl=/mnt/cdrom/AppStream/
enabled=1
gpgcheck=0

[BaseOS]
name=BaseOS
baseurl=/mnt/cdrom/BaseOS/
enabled=1
gpgcheck=0

RHEL8 之前,所有的RPM包在 Packages 里面

对于 RHEL而言, rpm 就是 RedHat Package Manager
attr-2.4.48-3.el8.x86_64.rpm
attr -> 包名
2.4.48 -> 包的版本信息
3 -> 修订版
el8 -> RHEL8包 RedHat Enterprise Linux
x86_64 -> 64 位操作系统,从 RHEL 7 开始不再发行 32 位 RHEL 操作系统

如何才能安装 RPM包 -> 两种方式
1)rpm 这个工具可以用来安装rpm
rpm 安装 rpm包
rpm包与包之间存在依赖关系,就是A依赖B,在安装A之前,必须先把B安装好
rpm 这种安装包工具不提供依赖解决方案,就是你必须收工的一个一个安装

安装
[root@rhel100 ~]# rpm -ivh /mnt/cdrom/BaseOS/Packages/samba-4.12.3-12.el8.3.x86_64.rpm
查看库是在那个包里面
[root@rhel100 ~]# yum whatprovides libxattr-tdb-samba4.so
[root@rhel100 ~]# rpm -ivh /mnt/cdrom/BaseOS/Packages/samba-libs-4.12.3-12.el8.3.x86_64.rpm
[root@rhel100 ~]# rpm -ivh /mnt/cdrom/BaseOS/Packages/samba-common-tools-4.12.3-12.el8.3.x86_64.rpm

卸载
[root@rhel100 ~]# rpm -e --nodeps samba-4.12.3-12.el8.3.x86_64.rpm

强制安装当前包下的所以rpm包,并不检查依赖
[root@rhel100 ~]# rpm -Uvh *.rpm --nodeps --force

rpm 在查询方面还是有优势的
[root@rhel100 ~]# rpm -qa | grep -i samba
[root@rhel100 ~]# rpm -qa | grep -i targetcli

查看提供哪些文件或者目录,所谓安装包是个什么概念: 一个包就是各种各样的文件以及目录,然后安装就是把这个所提供的文件以及目录放到对应的路径下面去!

-qc 参数,是查看一个包的配置文件
[root@rhel100 ~]# rpm -qc httpd

-qd 参数 查看说明文档
[root@rhel100 ~]# rpm -qd httpd

查看这个包的一些基本信息
[root@rhel100 ~]# rpm -qi httpd

-qf 查看一个目录 属于哪个包
[root@rhel100 ~]# rpm -qf /etc/fstab 
setup-2.12.2-6.el8.noarch

[root@rhel100 ~]# rpm -ivh /mnt/cdrom/BaseOS/Packages/samba-4.12.3-12.el8.3.x86_64.rpm

导入 redhat 的公钥
[root@rhel100 ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-*


破坏rpm包
[root@rhel100 module]# cp /mnt/cdrom/BaseOS/Packages/samba-4.12.3-12.el8.3.x86_64.rpm ./
[root@rhel100 module]# echo 123 >> samba-4.12.3-12.el8.3.x86_64.rpm
[root@rhel100 module]# rpm -e samba-4.12.3-12.el8.3.x86_64
[root@rhel100 module]# rpm -ivh samba-4.12.3-12.el8.3.x86_64.rpm
  1. dnf 或者 yum -> 就可以解决依赖关系
    dnf 或者 yum 是怎么样解决依赖关系的呢?
    rpm 包与包之间的依赖的关系!
    [root@rhel100 module]# ls -l /mnt/cdrom/BaseOS/
    dr-xr-xr-x. 2 root root 305152 Oct 9 2020 Packages
    dr-xr-xr-x. 2 root root 2048 Oct 9 2020 repodata

repodata 目录内的文件,存放的就是包与包之间的依赖关系
那么dnf以及yum又是怎么读取到这个目录的文件的呢?

搭建一个yum仓库
yum仓库其实就是一个连接地址,能够同时找到Package和REPO目录
[root@rhel100 module]# vim /etc/yum.repos.d/dvd.repo
[AppStream]
name=AppStream
baseurl=/mnt/cdrom/AppStream/
enabled=1
gpgcheck=0
在/etc/yum.repos.d/ 这个目录下 创建一个文件,后缀名必须是repo
baseurl这个路径下必须同时包含repodata和rpm包

能够查看,说明本地yum仓没有搭建失败
[root@rhel100 module]# dnf repolist

yum 安装包
[root@rhel100 module]# yum install -y targetcli

yum 卸载
[root@rhel100 module]# yum remove -y httpd

yum 列出包
[root@rhel100 module]# yum list

查看信息
[root@rhel100 module]# yum info httpd

搜索httpd这个包
[root@rhel100 module]# yum search httpd

yum 查看那个软件是由那个包提供给的
[root@rhel100 module]# yum whatprovides /etc/fstab

查看 yum 安装的历史记录
[root@rhel100 module]# yum history

跟历史记录相反操作
[root@rhel100 module]# yum history undo 1 -y

group 查看
[root@rhel100 module]# yum grouplist

组安装
[root@rhel100 module]# yum groupinstall -y “Server with GUI”
[root@rhel100 module]# yum groupinstall -y “Virtualization Host”

所有yum 命令 都可以直接切换成 dnf

查看镜像仓
[root@rhel100 module]# dnf repolist

清除缓存
[root@rhel100 module]# dnf clean all

制作缓存
[root@rhel100 module]# dnf makecache

BaseOS
BaseOS 存储库以RPM 软件包的形式为红帽企业 Linux 提供核心操作系统内容。BaseOS组件的生命周期与之前红帽企业Linux发行版中的内容相同。

AppStream
应用流存储库提供具有不同生命周期的内容,作为模块和传统软件包。应用流包含系统的必要部分,以及以前作为红帽软件集合的一部分以及其他产品和程序提供的各种应用。

模块
[root@rhel100 module]# dnf module list

基于模块查看
[root@rhel100 module]# dnf module list | grep perl

基于模块安装
[root@rhel100 module]# yum module install -y perl

查看
[root@rhel100 module]# rpm -qa | grep -u perl

禁用某模块
[root@rhel100 module]# yum module disable perl:5.26

删除perl模块
[root@rhel100 module]# yum module remove perl
[root@rhel100 module]# yum module reset perl

[root@rhel100 module]# dnf module enable perl:5.24 -y

模块: 包含了很多个包
应用流?就是在RHEL8针对一个模块存在多个版本!!
比如 Perl 5.24 5.26

利用模块安装,我们启动或者禁用某个模块
切换模块步骤
0)yum module remove perl
1)yum/dnf module reset perl
2)yum/dnf module disable perl:5.26
3)yum/dnf module enable perl:5.24
4)yum/dnf module install -y perl
appstream 就是应用流,包含多个版本,可以选择安装其中的某一个进行安装
RHEL7 是不包含应用流的

[root@rhel100 module]# dnf module list postgresql
[root@rhel100 module]# dnf module list | grep postgresql
[root@rhel100 module]# dnf module remove postgresql
[root@rhel100 module]# dnf module reset postgresql
[root@rhel100 module]# dnf module disable postgresql:10
[root@rhel100 module]# dnf module enable postgresql:9.6
[root@rhel100 module]# yum module install -y postgresql

文字解说
1)卸载已经安装的应用流版本
2)重置应用流
3)禁用旧的应用流
4)设置新的应用流,激活新的应用流
5)安装

查找文件 …

1、which
查找可执行文件,在Path变量内查找的

[root@rhel100 ~]# which dnf
/usr/bin/dnf

which 就是在 环境变量里面查找命令
[root@rhel100 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2、locate
[root@rhel100 ~]# locate test
locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory

重新构建
[root@rhel100 ~]# updatedb
[root@rhel100 ~]# ls -l /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 3206204 Nov 16 05:38 /var/lib/mlocate/mlocate.db

[root@rhel100 ~]# locate alex

3、find
有条件查找
根据你设置的条件,从定义的路径中查找符合要求的文件或者目录!!

1)根据拥有者
[root@rhel100 ~]# find /home/ -user alex

2)文件大小
等于2MB
[root@rhel100 ~]# find /home/ -size 2M

大于2MB
[root@rhel100 ~]# find /home/ -size +2M

小于2MB
[root@rhel100 ~]# find /home/ -size -2M

3)文件名或者目录名称
[root@rhel100 ~]# find /home/ -name alex

4)权限
查找/etc目录下所有用户都没有写权限的文件
[root@rhel100 ~]# find /etc -not -perm +222

5)时间
从凌晨 00:00 -> 23:59 创建的文件
[root@rhel100 ~]# find /opt/ -mtime 0

今天之前的文件
[root@rhel100 ~]# find /opt/ -mtime +0

未来的文件
[root@rhel100 ~]# find /opt/ -mtime -0

day07 ========================================================================================================================================================== day07

[root@rhel100 ~]# nmcli connection modify ens193 connection.id ens199

怎么没有对应关系?
一个连接想和device建立一个对应关系
终极大招:在配置文件中加入一个HWADDR 网卡的MAC地址
DEVICE + HWADDR

可以查看到物理地址
[root@rhel100 ~]# ip addr show

[root@rhel100 ~]# cd /etc/sysconfig/network-scripts/
[root@rhel100 network-scripts]# vim ifcfg-ens256
DEVICE=ens161
HWADDR=00:0c:29:b8:d6:b0 -> ens161 mac 物理地址

[root@rhel100 network-scripts]# vim ifcfg-ens161
DEVICE=ens256
HWADDR=00:0c:29:b8:d6:a6 -> ens256 mac 物理地址

[root@rhel100 ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens160 ea74cf24-c2a2-ecee-3747-a2d76d46f93b ethernet ens160
ens161 f1160740-d8ae-476c-8b5c-89bdb80c8a1f ethernet ens256
ens224 83a445f1-781f-4948-8242-88508158888f ethernet ens224
ens256 4f11b3fd-3c89-4473-b59a-5fa448867fe6 ethernet ens161

DEVICE 和 HWADDR 代表同一个东西,如果 DEVICE 代表 ens161 的设备名称,那么 HWADDR 就是 ens161设备的 MAC 物理地址

shell 脚本
利用Shell脚本功能,结合控制语句写的程序,用在帮你维护系统!

Shell 功能有哪些呢?
1)学过的所有命令
2)变量
定义变量的时候,等号两侧不能有空格
条件判断的时候,等于号两边就必须有空格
[ 条件判断式 ],中括号和条件判断式之间必须有空格

定义变量 -> var1=test
变量名=变量值
尖叫提示:
等于号两边不能有空格
变量名不能以数字作为开头
变量名可以使用下划线开头
如果变量的值含有空格,必须使用引号,引号分为两种,单引号和双引号
var2=“I Love Linux” -> 这种情况必须使用双引号给引起来
单双引号是有区别的
可以把一个命令的结果赋予给一个变量
[root@rhel100 ~]# var2=hostname
[root@rhel100 ~]# echo $var2
hostname
[root@rhel100 ~]# var2=hostname
[root@rhel100 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 38: …root@rhel100 ~]#̲ var3=(hostname)
[root@rhel100 ~]# echo $var3
rhel100

$() 和 `` 有异曲同工之妙

单双引号的区别
双引号可以获取变量值
[root@rhel100 ~]# var1="$(hostname)"
[root@rhel100 ~]# echo $var1
rhel100

单引号是什么就是什么
[root@rhel100 ~]# var1=’$(hostname)’
[root@rhel100 ~]# echo $var1
$(hostname)

如果我们的内容没有特殊字符,单双引号都可以,都行
如果含有特殊字符,那么就要看情况了

如何取值?
[root@rhel100 ~]# $var1

如何显示值?
[root@rhel100 ~]# echo $var1

变量的类型
局部变量 -> 不能被子进程调用
var1=hostname
全局变量 -> 可以被子进程调用
export var1=hostname

变量的值类型
字符串类型
默认是字符串类型
[root@rhel100 ~]# var1=1
[root@rhel100 ~]# var2=1
[root@rhel100 ~]# echo v a r 1 + var1+ var1+var2
1+1

数字类型 -> 通过 declare 来定义变量的类型
[root@rhel100 ~]# declare -i var1=1
[root@rhel100 ~]# declare -i var2=2
[root@rhel100 ~]# declare -i var3= v a r 1 + var1+ var1+var2
[root@rhel100 ~]# echo $var3
3

[root@rhel100 ~]# var1=$((1+1))
[root@rhel100 ~]# echo $var1
2

[root@rhel100 ~]# let var1=1+1
[root@rhel100 ~]# echo $var1
2

% 是取余数 ,/ 是取整数
[root@rhel100 ~]# let var1=9%6
[root@rhel100 ~]# echo $var1
3

[root@rhel100 ~]# let var1=9/6
[root@rhel100 ~]# echo $var1
1

[root@rhel100 module]# vim test1.sh
#!/bin/bash
var1="$((3+1))"
echo $var1

从键盘输入一个变量的值,赋予一个变量
read -p “Please input your name:” NAME;
[root@rhel100 module]# sh test1.sh
4

脚本练习一
[root@rhel100 module]# vim sum.sh
#!/bin/bash

function sum() {
declare -i s=0
s=$[$1+$2]
echo $s
}

read -p “Please input the number1:” n1;
read -p “Please input the number2:” n2;

sum $n1 $n2;
[root@rhel100 module]# sh sum.sh

脚本练习二
[root@rhel100 module]# vim if.sh
#!/bin/bash

if [ $1 -eq ‘123’ ]
then
echo ‘123’
elif [ $1 -eq ‘456’ ]
then
echo ‘456’
fi
[root@rhel100 module]# sh if.sh 123

3)文本处理
(搜索 查找 替换)就是针对普通的文本文档!!

grep
grep 查看,并且默认区分大小写
grep 是以行作为输出单位的
[root@rhel100 module]# grep user a.txt
I love Linux username

参数 -i 忽略大小写
[root@rhel100 module]# grep User -i a.txt
I love Linux username

参数 -A 标书输出目标行 + 下一行 after
[root@rhel100 module]# grep User -iA 1 a.txt
I love Linux username
I love Linux password

参数 -B 标书输出目标行 + 上一行 before
[root@rhel100 module]# grep User -iB 1 a.txt
I love Linux password
I love Linux username

参数 -v 表示查看不含有的内容,反选
[root@rhel100 module]# grep user a.txt
I love Linux username
[root@rhel100 module]# grep -v user a.txt
I love Linux password
I love Linux password
I love Linux password
I love Linux password

查询条件是 or 的关系 -> pass or spark
[root@rhel100 module]# grep -e pass -e spark a.txt

查询条件是 and 的关系 -> pass and spark
[root@rhel100 module]# grep pass a.txt | grep spark
I love Linux spark password

egrep 可以同时指定多个条件,也是 or 的关系
[root@rhel100 module]# egrep ‘pass|spark’ a.txt

cut
-d 参数 指定使用什么字符来分隔
-f 参数 表示显示分隔后的那几列
-d 只能指定一个分隔符,只适合于标准化格式的文档
-d ‘::’ 这种写法就是错误的
[root@rhel100 module]# cut -d ‘u’ -f 1,2,3 a.txt

awk
awk -F ‘::’ 参数是可以指定多个字符的
[root@rhel100 module]# echo 1:2:3:4:5:6:7:8 > a.txt
[root@rhel100 module]# awk -F ‘:’ ‘{print $1,$3,$6}’ a.txt

awk 在多空格,非标准数据面前,比cut更具备优势
[root@rhel100 module]# vim a.txt
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
[root@rhel100 module]# awk -F ’ ’ ‘{print $1,$3,$6}’ a.txt
1 3 6
1 3 6

‘/root/{print $1 “\t” $2 “\t” $3}’ -> 模式匹配
模式配置当中,如果有关键字,必须加双斜杠 //
[root@rhel100 module]# awk -F ’ ’ ‘/root/{print $1 “\t” $2 “\t” $3}’ a.txt

N F 表 示 某 一 行 的 最 后 一 列 , 每 一 行 的 列 不 同 , NF 表示某一行的最后一列,每一行的列不同, NFNF也不同
[root@rhel100 module]# awk -F ‘:’ ‘{print $1 “\t” $2 “\t” $NF}’ a.txt

获取倒数第二列
[root@rhel100 module]# awk -F ‘:’ ‘{print $1 “\t” $2 “\t” $(NF-1)}’ a.txt

NR1显示查找到的第一行
NR 就是指定行数
NF 就是指定列数
[root@rhel100 module]# awk -F ‘:’ 'NR
1{print $1 “\t” $2 “\t” $(NF-1)}’ a.txt

NR 只显示具体的某一行,只显示一行
[root@rhel100 module]# awk -F ’ ’ ‘NR==3{print $1 “\t” $2 “\t” $3}’ a.txt
root test pass

编写脚本,获取网卡设备名称和mac物理地址以及IP地址
[root@rhel100 module]# vim get_ip.sh
#!/bin/bash
#获取设备名: 以read -p 的方式输入
#只要我输入某个对应的设备名
read -p ‘please input your device name:’ dev_name

#获取MAC地址
dev_mac=ip addr show $dev_name | awk -F ' ' 'NR==2{print $2}'

#获取IP地址
dev_address=ip addr show $dev_name | awk -F ' ' '/inet /{print $2}'

echo $dev_name $dev_mac $dev_address

[root@rhel100 module]# sh get_ip.sh
please input your device name:ens161
ens161 00:0c:29:b8:d6:b0 192.168.5.3/24

[root@rhel100 module]# vim get_ips.sh
#!/bin/bash
for i in nmcli device status | grep -v unmanaged | awk -F ' ' 'NR>1{print $1}'
do
dev_mac=ip addr show $i | awk -F ' ' 'NR==2{print $2}'
dev_address=ip addr show $i | awk -F ' ' '/inet /{print $2}'
echo $i $dev_mac $dev_address
done
[root@rhel100 module]# sh get_ips.sh
ens160 00:0c:29:b8:d6:92 192.168.2.100/24
ens161 00:0c:29:b8:d6:b0 192.168.5.3/24
ens224 00:0c:29:b8:d6:9c 192.168.3.3/24
ens256 00:0c:29:b8:d6:a6 192.168.4.3/24
virbr0 52:54:00:e0:2e:50 192.168.122.1/24

sed 也是一种文本处理工具
awk/grep/egrep/cut都没有替换功能

1到3行控制台打印两遍,文件并没有发生变化
[root@rhel100 module]# sed 1,3p a.txt

控制打印的时候,删除第一行,文件并没有发生变化
[root@rhel100 module]# sed 1d a.txt

控制台答应的时候,第一行之前插入值
[root@rhel100 module]# sed ‘1i test sedi’ a.txt

控制台答应的时候,第一行之后插入值
[root@rhel100 module]# sed ‘1a test sedi’ a.txt

参数 -n 只打印变化的哪一行
[root@rhel100 module]# sed ‘1a test sedi’ a.txt -n

参数-i 将变化的内容,以覆盖的方式写入到文件
[root@rhel100 module]# sed ‘1a test sedi’ a.txt -i

当你的sed -i 参数遇见-n 参数的时候,请多看一眼,谨慎使用

将第三行的root替换成alex
[root@rhel100 module]# sed ‘3,$s/root/alex/g’ a.txt

通过查找进行替换,不指定行号
[root@rhel100 module]# sed ‘/pass/,$s/root/alex/g’ a.txt

[root@rhel100 module]# sed ‘s/root/alex/g’ a.txt

对一行进行多次修改,处理的过程中是流式的
[root@rhel100 module]# sed -e ‘3, s / r o o t / a l e x / g ′ − e ′ 3 , s/root/alex/g' -e '3, s/root/alex/ge3,s/pass/word/g’ a.txt

4)正则表达式
awk grep egrep cut sed 命令结合正则表达式的时候,威力才是最大的
正则表达式符号,不要和通配符混淆哦
. -> 句点表示匹配任何单个字符
? -> 前面的项目是可选的,且最多匹配一次

  • -> 前面的项目将匹配零次或多次
  • -> 前面的项目将匹配一次或多次
    {n} -> 前面的项目恰好匹配n次
    {n,} -> 前面的项目匹配n次或者更多次
    {,m} -> 前面的项目最多匹配m次
    {n,m} -> 前面的项目至少匹配n次,但不超过m次
    [:alnum:] -> 字母数字字符: ‘[:alpha:]’ 和 ‘[:digit:]’ 在 c 语言环境 和 ASCII 字符编码中它等同于 ‘[0-9A-Za-z]’
    [:alpha:] -> 字符字符 ‘[:lower:]’ 和 ‘[:upper:]’ 在 c 语言环境 和 ASCII 字符编码中它等同于 ‘[A-Za-z]’

[root@rhel100 module]# vim a.txt
gd
god
good
goood

[root@rhel100 module]# grep gd a.txt
gd
[root@rhel100 module]# grep g.d a.txt
god

Linux Shell 正则表达式分为两种
基础正则表达式: BRE (basic regular express)
扩展正则表达式: ERE (extend regular express) 扩展的表达式有 +、?、和()
[root@rhel100 module]# egrep g?d a.txt
[root@rhel100 module]# grep g?d a.txt -E
gd
god
good
goood

[root@rhel100 module]# grep gd a.txt
gd
god
good
goood
[root@rhel100 module]# grep go
d a.txt
gd
god
good
goood

[root@rhel100 module]# grep go+d a.txt -E
god
good
goood

[root@rhel100 module]# grep “go{1}d” a.txt
god

[root@rhel100 module]# grep ‘go{1,}d’ a.txt
god
good
goood

[root@rhel100 module]# grep ‘go{1,2}d’ a.txt
god
good

^ 表示以什么开头
[root@rhel100 module]# grep ^root /etc/passwd

$ 表示以什么结尾
[root@rhel100 module]# grep bash$ /etc/passwd
root0:0:root:/root:/bin/bash
alex1000:1000:alex:/home/alex:/bin/bash
root0:0:root:/root:/bin/bash

捕捉空行
[root@rhel100 module]# grep ^$ a.txt

捕捉空行之反选
[root@rhel100 module]# grep ^$ a.txt

[root@rhel100 module]# grep g[a-z]d a.txt
god
ggd

查看不是a-z开头的
[root@rhel100 module]# grep [^a-z]d a.txt
1d
[root@rhel100 module]# grep [a-z]d a.txt
1d

以root开头的
[root@rhel100 module]# sed ‘/^root/s/root/alex/g’ a.txt

以bash 结尾的
[root@rhel100 module]# awk -F ‘:’ ‘/bash$/{print $1}’ a.txt

Linux Shell 脚本编写注意事项
1)创建的文件一定要以.sh结尾
[root@rhel100 module]# touch shell01.sh

2)sh文件,编写的第一行,一定是#!/bin/bash

3)定义解释器
学会写注释,这个脚本的这条命令是干什么用的!

4)变量和函数写在前面!

5)脚本要执行,必须赋予执行权限
[root@rhel100 module]# chmod +x shell01.sh

6)执行脚本的方式有很多种,启动 . 脚本 和 source 脚本,可以回传变量值
[root@rhel100 module]# source shell01.sh
00:0c:29:b8:d6:92
[root@rhel100 module]# sh shell01.sh
00:0c:29:b8:d6:92
[root@rhel100 module]# ./shell01.sh
00:0c:29:b8:d6:92
[root@rhel100 module]# . shell01.sh
00:0c:29:b8:d6:92
[root@rhel100 module]# /opt/module/shell01.sh
00:0c:29:b8:d6:92

. 是可以回传变量值的
[root@rhel100 module]# vim varfile
var1=1
var2=2

[root@rhel100 module]# vim shell02.sh
#!/bin/bash
. /opt/module/varfile
echo $var1 $var2
[root@rhel100 module]# sh shell02.sh
1 2

[root@rhel100 module]# vim /etc/profile
export var3=test
[root@rhel100 module]# source /etc/profile
[root@rhel100 module]# echo $var3

[root@rhel100 module]# vim shell03.sh
#!/bin/bash
echo $1
echo $2
echo $*
echo $@
echo $#
[root@rhel100 module]# sh shell03.sh qwe asd zxc
qwe
asd
qwe asd zxc
qwe asd zxc
3

[root@rhel100 module]# vim for.sh
#!/bin/bash
for i in “$*”
do
echo $i
done

for j in “$@”
do
echo $j
done
[root@rhel100 module]# sh for.sh 1 2 3
1 2 3
1
2
3

[root@rhel100 module]# vim for.sh
#!/bin/bash
for i in $*
do
echo $i
done

for j in $@
do
echo $j
done
[root@rhel100 module]# sh for.sh 1 2 3
1
2
3
1
2
3

shift 变量偏移
shift 2

控制语句有哪些呢?
1)判断
[root@rhel100 module]# vim if1.sh
#!/bin/bash
#判断 test []
#在脚本中使用判断的时候,基本上使用[],而不使用test
test -e /opt/module/for.sh

$? 返回上一级执行的返回结果,非0就是有异常

echo $?

[ -e /opt/module/for.sh ]
echo $?
[root@rhel100 module]# sh if1.sh
0
0

test
1)判断一个文件或者目录是否存在
-d 判断一个目录是否存在
[root@rhel100 module]# [ -d /opt/module/ ]
[root@rhel100 module]# echo $?
0
[root@rhel100 module]# [ -d /opt/module/for.sh ]
[root@rhel100 module]# echo $?
1

-e 判断一个文件或者目录存在或者不存在就使用 -e 参数
-f 判断一个文件是否存在就使用 -f 参数

2)字符串判断
-n 参数 判断一个变量是否是非空,非空为0,空位1
[root@rhel100 module]# [ -n “$var2” ]
[root@rhel100 module]# echo $?
1

-z参数 判断一个变量是否为空,空为0,非空为1
[root@rhel100 module]# [ -z “$var2” ]
[root@rhel100 module]# echo $?
0

== 字符串判断是否等于使用 ==
[ “$1” == “$2” ]

[root@rhel100 module]# vim if2.sh
#!/bin/bash

if [ -f /opt/module/mk ]
then
echo “The is exist”
else
touch /opt/module/mk
echo “touch file success”
fi
[root@rhel100 module]# sh if2.sh
touch file success
[root@rhel100 module]# sh if2.sh
The is exist

3)数值判断
declare -i a=1
declare -i b=2
[ “ a " − l e " a" -le " a"le"b” ]

-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
!= 不等于

if 判断嵌套
[root@rhel100 module]# vim if3.sh
#!/bin/bash
if [ $1 -le $2 ]
then
if [ $2 -le $3 ]
then
echo $3
else
echo $2
fi
else
if [ $1 -le $3 ]
then
echo $3
else
echo $1
fi
fi
[root@rhel100 module]# sh if3.sh 1 2 3
3

[root@rhel100 module]# vim case1.sh
#!/bin/bash
case $1 in
‘hello’)
echo ‘hello world’
;;
‘world’)
echo ‘hello more world’
;;
*)
echo ‘usage hello or world’
;;
esac
[root@rhel100 module]# sh case1.sh hello
hello world

2)循环
#案例一
[root@rhel100 module]# vim for1.sh
#!/bin/bash
for i in test1 test2 test3
do
echo $i
done
[root@rhel100 module]# sh for1.sh
test1
test2
test3

#案例二
[root@rhel100 module]# vim for2.sh
#!/bin/bash
for i in {1…20}
do
useradd user_test_KaTeX parse error: Expected group after '_' at position 47: …stdin user_test_̲i
done
[root@rhel100 module]# sh for2.sh

案例三 计算1到100的和 1+2+3+4… + 99 + 100

[root@rhel100 module]# vim for_sum.sh
#!/bin/bash
declare -i sum=0

for ((i=1;i<=100;i++))
do
sum= s u m + sum+ sum+i
done

echo $sum
[root@rhel100 module]# sh for_sum.sh
5050

案例四 while 循环

[root@rhel100 module]# vim while1.sh
#!/bin/bash
declare -i count=10
while [ c o u n t − g t 0 ] d o c o u n t = count -gt 0 ] do count= countgt0]docount=count-1
echo $count
done
[root@rhel100 module]# sh while1.sh
9
8
7
6
5
4
3
2
1
0

案例五 function 函数

[root@rhel100 module]# vim function1.sh
#!/bin/bash

定义函数

function add_user() {
for i in {1…6}
do
echo $i
done
}

调用函数

add_user
[root@rhel100 module]# sh function1.sh
1
2
3
4
5
6

day08 ===================================================================================================== day08

计划任务
计划任务: 让系统在某个时间点,执行一次你所定义的操作

计划任务分类
一次性计划任务
你让你的系统在某个具体的时间点执行一次操作。当这次操作执行完成之后,这个计划任务就结束了
周期性计划任务
根据你所定义的时间条件,让你的系统循环的执行这次任务,比如说吃饭、上班

一次性计划任务的实现是基于atd服务处于激活状态
[root@rhel100 ~]# systemctl status atd.service

一次性的计划任务是怎么定义的呢?定义一个具体的时间点
[root@rhel100 ~]# which touch
/usr/bin/touch

Ctrl + d 结束编辑
由于 at 使用的是#!/bin/sh 而不是 #!/bin/bash 所以一定使用绝对路径
[root@rhel100 ~]# at “12:05 2021-11-17”
warning: commands will be executed using /bin/sh
at> /usr/bin/touch /opt/module/f1
at> -> Ctrl + d 结束编辑
job 1 at Wed Nov 17 12:05:00 2021

查看计划任务
[root@rhel100 ~]# ls -l /var/spool/at/
-rwx------ 1 root root 3063 Nov 17 11:59 a0000101a05775
drwx------. 2 root root 6 Aug 12 2018 spool

为什么说at是一次性的计划任务?
因为当你定义之后 /var/spool/at/ 目录下就会创建一个文件等待 at 来执行,当执行完成之后,这个文件就被删除了

还有这种操作
7天
[root@rhel100 ~]# at now + 7 day
7分钟
[root@rhel100 ~]# at now + 7 min
7小时
[root@rhel100 ~]# at now + 7 hours

查看一次性计划任务
[root@rhel100 ~]# at -l
2 Wed Nov 24 12:04:00 2021 a root

删除 at 一次性计划任务,使用 -r 参数,设置 jobid
[root@rhel100 ~]# at -r 2

查看jobid为2的计划任务详情
[root@rhel100 ~]# at -c 2

查看计划任务,就类似于 at -l
[root@rhel100 ~]# atq

周期性计划任务,是基于crond服务的
[root@rhel100 ~]# systemctl status crond.service
周期性计划任务分类
周期性的用户计划任务
crontab -e
00 09 * * 1-5 /usr/bin/echo “you need go work”
30 09 * * 6-7 /usr/bin/echo “you need to study with me”
使用空格作为分隔
格式 -> 分 时 日 月 星期 任务

crontab -l -> 查看当前用户的所有计划任务
crontab -r -> 删除当前用户的所有计划任务
crontab -e -> 编辑当前用户的计划任务
周期性的系统计划任务

查看当前月的日历
[root@rhel100 ~]# cal
查看某年的12个月的日历
[root@rhel100 ~]# cal 2021

查看3个月份的日历
比如说当前月是10月,查看的就是 10/11/12月份的日历
[root@rhel100 ~]# cal 2021 -n 3

查看周期性用户计划任务
[root@rhel100 ~]# ls -l /var/spool/cron/

查看某个用户的计划任务
[root@rhel100 ~]# crontab -l -u alex

定义任务删除,直接使用 crontab -e 进行编辑删除就行

系统周期性调度
[root@rhel100 ~]# vim /etc/crontab
05 * * * * root echo “hello world” >> /opt/module/f1

系统周期性调度
[root@rhel100 ~]# vim /etc/anacrontab

管理临时文件
管理临时文件,依靠systemd-tmpfiles-setup这个服务
[root@rhel100 ~]# systemctl status systemd-tmpfiles-setup.service

创建必要的文件,删除不能存在的文件
[root@rhel100 ~]# systemd-tmpfiles --create --remove

[root@rhel100 ~]# cd /usr/lib/tmpfiles.d/

[root@rhel100 ~]# systemctl status systemd-tmpfiles-clean.timer
[root@rhel100 ~]# systemctl daemon-reload
[root@rhel100 ~]# systemctl restart systemd-tmpfiles-clean.timer

R -> 是删除目录
r -> 是删除文件
编辑文件后,重启会删除,因为systemd-tmpfiles-setup这个服务只有在开机的时候才会生效

[root@rhel100 ~]# vim /usr/lib/tmpfiles.d/test1.conf
d /opt/test1_dir 0700 root root -
d /opt/test2_dir 0700 root root -
f /opt/test_file 0660 root root -

[root@rhel100 ~]# vim /usr/lib/tmpfiles.d/test2.conf
R /opt/module
r /opt/software/a.txt

手动命令执行
[root@rhel100 ~]# systemd-tmpfiles --create /usr/lib/tmpfiles.d/test1.conf
[root@rhel100 ~]# systemd-tmpfiles --remove /usr/lib/tmpfiles.d/test2.conf

三个目录都可以,这三个目录是有优先级的
/etc/tmpfiles.d/.conf
/run/tmpfiles.d/
.conf
/usr/lib/tmpfiles.d/*.conf

优先级
run > etc > usr

这个文件添加的用户,就相当于被添加到黑名单里面了
[root@rhel100 ~]# vim /etc/cron.deny
stu01
stu02

白名单,白名单默认是不存在的,如果添加了一个用户,说明只有这一个用户可以编辑计划任务
[root@rhel100 ~]# vim /etc/cron.allow

白名单
[root@rhel100 ~]# vim /etc/at.allow

黑名单
[root@rhel100 ~]# vim /etc/at.deny

调优
RHEL针对不同的使用场景,已经自己定义了一个调优的配置集profile

挂载
[root@rhel100 ~]# mount /dev/cdrom /mnt/cdrom/

展示repo
[root@rhel100 ~]# dnf repolist

安装
[root@rhel100 ~]# dnf install -y tuned

查看
[root@rhel100 ~]# tuned-adm list

查看服务是否启动
[root@rhel100 ~]# systemctl status tuned

设置开机启动
[root@rhel100 ~]# systemctl enable --now tuned

查看当前调优状态,发现是virtual-guest,是一个虚拟机调优配置集
[root@rhel100 ~]# tuned-adm active
Current active profile: virtual-guest

查看默认推荐使用的调优集
[root@rhel100 ~]# tuned-adm recommend
virtual-guest

设置调优集
[root@rhel100 ~]# tuned-adm profile virtual-host
[root@rhel100 ~]# tuned-adm active
Current active profile: virtual-host

使用ACL控制对文件的访问

提出一个问题
两个用户,分别是student、teacher
一个目录/opt/module root:root 权限是700
让student用户对/opt/module具备rx的权限
让teacher用户对/opt/module具备rw的权限
实现的时候,不允许更改/opt/module的拥有者和属组
当你做不大的时候,可以使用ACL,ACL就是访问控制列表
访问控制列表,就是针对一个文件或者目录,给与一个用于特殊指定的权限!

[root@rhel100 ~]# useradd student
[root@rhel100 ~]# passwd student
[root@rhel100 ~]# useradd teacher
[root@rhel100 ~]# passwd teacher

修改密码方式一
[root@rhel100 module]# echo ‘000000’ | passwd --stdin alex

修改密码方式二
[root@rhel100 module]# passwd alex

针对用户来做访问控制
针对相同目录或者文件,不同用户赋予不同权限
-R 参数是递归的意思
-m 参数是修改的意思
-u 参数是针对用户
[root@rhel100 ~]# setfacl -R -m u:student:rx /opt/module/
[root@rhel100 ~]# setfacl -R -m u:teacher:rw /opt/module/

针对用户组做访问控制
[root@rhel100 ~]# setfacl -R -m g:teacher:rw /opt/module/

查看
[root@rhel100 ~]# getfacl /opt/module/
getfacl: Removing leading ‘/’ from absolute path names

file: opt/module/

owner: root

group: root

user::rwx
user:student:r-x
user:teacher:rw-
group::r-x
mask::rwx
other::r-x

获取帮助
[root@rhel100 ~]# setfacl --help

删除某条访问控制
[root@rhel100 ~]# setfacl -x g:teacher /opt/module/

删除文件或目录的所有访问控制
[root@rhel100 ~]# setfacl -b /opt/module/

[root@rhel100 module]# mkdir testmm

移动
[root@rhel100 module]# mv test[0-9] testmm/

创建1和4两个文件
[root@rhel100 module]# touch testmm/{1,4}

创建4到8多个文件
[root@rhel100 module]# touch testmm/{4…8}

如果针对一个目录设置过ACL访问控制后,那么该目录下新创建的文件或者目录是否会继承呢?
不会继承,除非针对这个目录设置过默认的ACL,这个more你的ACL就是给下面的新建文件或者目录继承的

参数d 表示default 默认ACL
[root@rhel100 ~]# setfacl -R -m d:u:teacher:rw /opt/module/
[root@rhel100 ~]# setfacl -R -m d:g:teacher:rw /opt/module/

所有的权限都不能超过mask,如果mask的权限是rw-,没有x权限,其它的配置里面有x权限,那么所有的x权限是不生效的,mask权限也是可以改的

[root@rhel100 ~]# setfacl -R -m m:rwx /opt/module/

SeLinux 安全策略
[root@rhel100 module]# getenforce
Enforcing

如果不一致
方式1 修改默认值,再还原默认值 -> 这是使用最多的

方式2 不修改默认值,就是修改文件的当前值

[root@rhel100 module]# systemctl start httpd
[root@rhel100 module]# systemctl status httpd
[root@rhel100 module]# echo ‘redhat’ > index.html
[root@rhel100 module]# mv index.html /var/www/html/

[root@rhel100 module]# curl http://rhel100
redhat
[root@rhel100 module]# curl http://rhel100 -I

[root@rhel100 module]# ls -ld /var/www/html/ -Z

-a -> add
-t -> type
重新打标签
[root@rhel100 module]# semanage fcontext -a -t “httpd_sys_content_t” /var/www/html/index.html

还原
[root@rhel100 module]# restorecon -Rv /var/www/html/index.html

查看
[root@rhel100 module]# ls -ld /var/www/html/index.html -Z

修改
[root@rhel100 module]# chcon -t httpd_sys_content_t /var/www/html/index.html

再次查看
[root@rhel100 module]# ls -ld /var/www/html/index.html -Z

以/opt/module为参考,去修改
[root@rhel100 module]# chcon --reference /opt/module/ /var/www/html/index.html

递归修改
[root@rhel100 module]# semanage fcontext -a -R -t “httpd_sys_content_t” /var/www/html/index.html

通配符修改
[root@rhel100 module]# semanage fcontext -a -t “httpd_sys_content_t” “/virtual(/.*)?”

还原,改完之后还原就行
[root@rhel100 module]# restorecon -Rv /virtual/

day09 ============================================================================================================== day09

查看磁盘
[root@rhel100 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 8.8G 0 rom
nvme0n1 259:0 0 200G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 199G 0 part
├─rhel-root 253:0 0 70G 0 lvm /
├─rhel-swap 253:1 0 2G 0 lvm [SWAP]
└─rhel-home 253:2 0 127G 0 lvm /home
nvme0n2 259:3 0 20G 0 disk

nvme0n1 和 nvme0n2 代表磁盘文件名,不同磁盘类型,磁盘名称是不一样的
比如你是KVM虚拟化的场景下
如果你的驱动是virtio -> /dev/vd[a-z] -> /dev/vda /dev/vdb /dev/vdc
如果是SCSI 或 SATA 类型的 -> 磁盘名称就是 /dev/sd[a-z]
如果是物理环境nvme,那么磁盘名称就是 /dev/nvme0n[数字]
如果是IDE磁盘 -> /dev/hd

查看磁盘
[root@rhel100 ~]# ls -l /dev/nvme0n[1-9]
brw-rw---- 1 root disk 259, 0 Nov 18 11:09 /dev/nvme0n1
brw-rw---- 1 root disk 259, 3 Nov 18 11:09 /dev/nvme0n2

通过 lsblk 命令可以确定磁盘大小
nvme0n1 200GB 大小
nvme0n2 20GB 大小

通过 nvme0n1p1 分支数,可以查看分区数量
MBR分区
0号扇区,分区信息可以有主分区和扩展分区,一共4笔分区
主分区最多可以有4个,扩展分区最多只能有一个,扩展分区可以没有
系统盘符必须要有主分区
数据盘符可以没有主分区
主分区是可以直接格式化和挂载的,只要能格式化就能写数据
扩展分区不能直接格式化,或者说扩展分区本身是不能直接存数据的
扩展分区再划分逻辑分区,也就是说逻辑分区是从扩展分区里面划出来的

扩展分区的基础上,需要去划分逻辑分区,需要格式化和存储数据的是逻辑分区
扩展分区里面划分逻辑分区,逻辑分区进行格式化,然后逻辑分区就可以存数据了,逻辑分区可以有很多个

划分出来的逻辑分区的分区信息是在哪里呢?
是在你的整个扩展分区空间的扇区内

怎么划分分区呢?
1、如果是系统盘,一定要有主分区,多少个呢?
一定要有/boot分区,其它随意
系统盘,建议搞一个扩展分区

2、如果是数据盘,可以不需要主分区,直接搞扩展分区和逻辑分区

GPT分区
GPT分区比较简单,没有扩展分区和逻辑分区的概念,全部都是主分区,而且最多可以划分128个主分区

划分分区
根据你不同的分区类型,以及磁盘大小,以及需求采用不同的分区工具
1、fdisk
1)如果分区类型是MBR,且磁盘大小小于2T的情况下,可以采用fdisk
SAS/SATA/RAID5/RAID1

2、gdisk

  1. 如果分区类型是GPT,且大小小于2T的情况下,那么请使用gdisk工具
    特别要注意: 千万不要使用gdisk去操作,已经是MBR格式的分区

3、parted
1)只要你的磁盘大小是大于2T的,那么就可以使用parted,不在乎你是MBR格式还是GPT格式
2)parted 确实难用

查看磁盘信息
[root@rhel100 ~]# fdisk -l /dev/nvme0n2

分区
[root@rhel100 ~]# fdisk /dev/nvme0n2
参数解析
m 查看帮助
p 打印分区信息
n 添加一个新的分区
p 添加一个主分区
default
default
+1G
e 添加一个扩展分区
d删除分区

删除分区的时候,一定要注意,如果扩展分区被删除,那么逻辑分区也会全部被删除

nvme0n2p5 分区数大于4的一定是逻辑分区
分区大小是1K的,一定是扩展分区
分区数小于等于4的,一定是主分区

GPT 分区
[root@rhel100 ~]# gdisk /dev/nvme0n3

parted 分区
[root@rhel100 ~]# parted /dev/nvme0n2
print -> 打印信息
mkpart -> 创建分区
primary/logical -> 主分区或逻辑分区
ext2/xfs -> 系统磁盘格式
Start? 2150MB -> 上一个点的结束,就是这一个点的开始
End? 4198MB
Ignore/Cancel? -> Ignore
quit 退出就是保存,没有后悔药可以吃,哈哈

parted 分区
[root@rhel100 ~]# parted /dev/nvme0n4
mklabel msdos -> msdos 代表 MBR
mklabel gpt -> gpt 代表 GPT

设置分区类型,或者格式转换
[root@rhel100 ~]# parted /dev/nvme0n2 mklabel msdos

parted分区,可以不交互
[root@rhel100 ~]# parted /dev/nvme0n2 mkpart primary xfs 1000MB 3000MB

打印
[root@rhel100 ~]# parted /dev/nvme0n2 print

删除
[root@rhel100 ~]# parted /dev/nvme0n2 rm 2

对分区进行格式化,也就是设置文件系统
扩展分区不能被格式化
[root@rhel100 ~]# mkfs -t xfs /dev/nvme0n2p5

挂载
格式化之后的分区,挂载后才能写入数据,目录称之为挂载点

挂载分类
1)临时挂载
临时挂载,服务器重启后就没有了
[root@rhel100 ~]# mount /dev/nvme0n2p5 /mnt/test1/

查看挂载信息
[root@rhel100 ~]# df -Th

卸载
[root@rhel100 ~]# umount /mnt/test1

查看分区id
[root@rhel100 ~]# blkid

通过UID挂载
[root@rhel100 ~]# mount -U 1f484130-0db9-428e-a70c-bec447431190 /mnt/test1/

2)永久挂载
写在 /etc/fstab 文件中,就是永久挂载
永久挂载方式一
[root@rhel100 ~]# vim /etc/fstab
/dev/nvme0n2p5 /mnt/test1/ xfs defaults 0 0

永久挂载方式二
[root@rhel100 ~]# vim /etc/rc.d/rc.local
mount /dev/nvme0n2p5 /mnt/test1/

讲fstab文件中还没有挂载的设备挂在上
[root@rhel100 ~]# mount -a

特殊分区 swap
当你的系统内存不够用的情况下,会把内存不常用的数据置换到swap分区,如果需要使用了,就从swap分区置换到内存
swap:置换分区,特点就是用磁盘来模拟内存

创建一个分区
[root@rhel100 ~]# fdisk /dev/nvme0n2
n

t -> t用来修改标识
6 -> 指定修改那个分区的标识
L -> 查看标识列表
82 -> swap分区的标识
p -> 打印查看
w -> 保存退出

查看是否有swap分区
[root@rhel100 ~]# free -m

查看有几个swap设备
[root@rhel100 ~]# swapon -s

把分区格式化成swap设备
[root@rhel100 ~]# mkswap /dev/nvme0n2p6

激活swap设备,再次查看就会发现有了swap设备,但是重启后就没有了
[root@rhel100 ~]# swapon /dev/nvme0n2p6

永久设置swap分区,这时候使用mount -a是没有用的,要么重启服务器,要么使用swapon /dev/nvme0n2p6 激活swap分区
[root@rhel100 ~]# vim /etc/fstab
/dev/nvme0n2p6 swap swap defaults 0 0

swap 思路步骤
1)创建分区
2)修改标识
3)对分区进行swap格式化成swap设备
4)激活swap设备

LVM RH134 第七章 逻辑卷管理
Logical volume Manager 逻辑卷管理
什么是逻辑卷?就是在线调整分区大小

创建LVM逻辑分区,具体步骤如下
pe -> pv -> vg -> lv

创建分区,这里全部使用逻辑分区
先创建扩展分区,然后在扩展分区里面创建逻辑分区
[root@rhel100 ~]# fdisk /dev/nvme0n3
------> 创建扩展分区
n
e
default

------> 创建逻辑分区
n
5
+1G

查看分区
[root@rhel100 ~]# lsblk
nvme0n3 259:8 0 20G 0 disk
├─nvme0n3p1 259:15 0 1K 0 part
├─nvme0n3p5 259:16 0 1G 0 part
├─nvme0n3p6 259:17 0 1G 0 part
├─nvme0n3p7 259:18 0 1G 0 part
├─nvme0n3p8 259:19 0 1G 0 part
└─nvme0n3p9 259:20 0 1G 0 part

修改标识
[root@rhel100 ~]# fdisk /dev/nvme0n3
p -> 查看
t -> 修改标识
5 -> 修改分区的id
8e -> lvm标识id

创建pv
[root@rhel100 ~]# pvcreate /dev/nvme0n3p{5…9}

查看pv
[root@rhel100 ~]# pvs
[root@rhel100 ~]# pvscan
[root@rhel100 ~]# pvdisplay
[root@rhel100 ~]# pvdisplay /dev/nvme0n3p5

查看vg帮助
[root@rhel100 ~]# vgcreate --help

将dev/nvme0n3p{5…9}这几个pv,添加到vg里面,并通过-s参数设置pe的大小,给这个vg起了一个名字叫test_vg_rhce
pe是lvm中,数据存储的最小单元
[root@rhel100 ~]# vgcreate -s 4M test_vg_rhce /dev/nvme0n3p{5…9}
Volume group “test_vg_rhce” successfully created

查看vg
[root@rhel100 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 3 0 wz–n- <199.00g 0
test_vg_rhce 5 0 0 wz–n- 4.98g 4.98g

查看vg
[root@rhel100 ~]# vgscan
Found volume group “test_vg_rhce” using metadata type lvm2
Found volume group “rhel” using metadata type lvm2

查看vg
[root@rhel100 ~]# vgdisplay test_vg_rhce

再次查看pv,发现已经加入到vg中
[root@rhel100 ~]# pvdisplay /dev/nvme0n3p5

通过vg创建lv
参数 -L 指定LV的大小
参数 -l 指定PE的数量
[root@rhel100 ~]# lvcreate -L 200M -n test_lv_rhce test_vg_rhce
Logical volume “test_lv_rhce” created.
or
[root@rhel100 ~]# lvcreate -l 200 -n test_lv_rhce test_vg_rhce

查看lv
[root@rhel100 ~]# lvs
[root@rhel100 ~]# lvscan
[root@rhel100 ~]# lvdisplay /dev/test_vg_rhce/test_lv_rhce

对lv进行格式化
[root@rhel100 ~]# mkfs -t xfs /dev/test_vg_rhce/test_lv_rhce

挂载
[root@rhel100 ~]# mkdir /mnt/lvm01
[root@rhel100 ~]# mount /dev/test_vg_rhce/test_lv_rhce /mnt/lvm01/s

查看挂载
[root@rhel100 ~]# df -Th

思路步骤
1)创建分区
(1)创建扩展分区
(2)创建逻辑分区
(3)修改分区标识
2)创建pv
3) 创建vg
4) 创建lv
5) 格式化lv
6) 挂载lv

动态在线扩容LVM
动态扩展到400M
[root@rhel100 ~]# lvresize -L 400M /dev/test_vg_rhce/test_lv_rhce

查看lv,变成400MB了
[root@rhel100 ~]# lvs

查看文件系统,还是200MB
[root@rhel100 ~]# df -Th

基于挂载点,扩展xfs文件系统
[root@rhel100 ~]# xfs_growfs /mnt/lvm01/

再次查看文件系统,发现变成400MB
[root@rhel100 ~]# df -Th

在线扩容思路步骤
1)调整LV的大小
lvresize -L 400M /dev/test_vg_rhce/test_lv_rhce
lvresize -L +200M /dev/test_vg_rhce/test_lv_rhce
如果你的vg剩余空间,不满足你扩大需求的时候,那么你首先要增加vg的大小
就是创建新的pv,把pv增加到vg当中,之后再去扩容lv大小
2)调整文件系统
不同的文件系统,调整的方式不一样
xfs_growfs /mnt/lvm01/(挂在点)

vg扩容步骤
1)创建分区
[root@rhel100 ~]# fdisk /dev/nvme0n3
n
… 添加逻辑卷
t
10
8e 修改lvm标识

2)创建pv
[root@rhel100 ~]# pvcreate /dev/nvme0n3p10

3)将pv添加到vg中
[root@rhel100 ~]# vgextend test_vg_rhce /dev/nvme0n3p10

4)查看,发现vg已经扩容
[root@rhel100 ~]# vgs

5)扩容lvm
[root@rhel100 ~]# lvresize -L 4G /dev/test_vg_rhce/test_lv_rhce

6)加载文件系统
[root@rhel100 ~]# xfs_growfs /mnt/lvm01/(只能是挂载点)

resize2fs主要是针对extN系列的文件系统
[root@rhel100 ~]# resize2fs /dev/test_vg_rhce_02/test_lv_rhce_02(只能是路径)

lvm 缩小
1)文件系统是不能在线缩小的,所以第一步就是卸载
[root@rhel100 ~]# umount /mnt/lvm02

2)其二就是查看文件系统格式,有的文件系统是不支持的
xfs就不支持缩小
ext4是支持的

3)检查
[root@rhel100 ~]# e2fsck -f /dev/test_vg_rhce_02/test_lv_rhce_02

4)文件系统缩小
[root@rhel100 ~]# resize2fs /dev/test_vg_rhce_02/test_lv_rhce_02 30M

5)挂载
[root@rhel100 ~]# mount /dev/test_vg_rhce_02/test_lv_rhce_02 /mnt/lvm02/

6)查看lv,发现没有缩小
[root@rhel100 ~]# df -Th
[root@rhel100 ~]# lvs

7)lv缩小
[root@rhel100 ~]# lvresize -L 30M /dev/test_vg_rhce_02/test_lv_rhce_02

缩小VG
首先要把已经被分配的PE,移动到其余的PV上面去

查看 pv
[root@rhel100 ~]# pvdisplay /dev/nvme0n3p5

移动pv数据,pv5 的数据移动到 pv8里面
[root@rhel100 ~]# pvmove /dev/nvme0n3p5 /dev/nvme0n3p8

从vg中移除pv
[root@rhel100 ~]# vgreduce test_vg_rhce /dev/nvme0n3p5

删除pv
[root@rhel100 ~]# pvremove /dev/nvme0n3p5


实施高级存储功能
Stratis -> 文件系统构建在一个精简配置的共享池中

创建
[root@rhel100 ~]# cd /var/lib/libvirt/images/
[root@rhel100 images]# qemu-img create -f qcow2 test.qcow2 10G
[root@rhel100 images]# du -h test.qcow2
196K test.qcow2

写入100MB,最大可以写到10G
[root@rhel100 images]# dd if=/dev/zero of=test.qcow2 bs=1M count=100

开始 Stratis 实验
1)挂载
临时挂载
[root@rhel100 ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom/

永久挂载
[root@rhel100 ~]# vim /etc/fstab
/dev/cdrom /mnt/cdrom/ iso9660 defaults 0 0
[root@rhel100 ~]# mount -a

2)查看是否挂载上
[root@rhel100 ~]# df -Th

3)查看是否有dnf源
[root@rhel100 ~]# dnf repolist

4)安装 Stratis 依赖
[root@rhel100 ~]# dnf install -y stratis-cli stratisd

5)启动服务
[root@rhel100 ~]# systemctl enable --now stratisd
[root@rhel100 ~]# systemctl status stratisd

6)添加新磁盘,并查看
[root@rhel100 ~]# ls -l /dev/nvme0n[4-5]

7)基于磁盘创建池资源
[root@rhel100 ~]# stratis pool create rhce_pool_01 /dev/nvme0n4

8)查看池资源
[root@rhel100 ~]# stratis pool list

9)查看池中有哪些块设备
[root@rhel100 ~]# stratis blockdev list rhce_pool_01

10)基于池,构建文件系统
[root@rhel100 ~]# stratis filesystem create rhce_pool_01 rhce_fs_01

11)查看文件系统,本身就是文件系统,不需要再格式化了
[root@rhel100 ~]# stratis filesystem list

12)查看UUID
[root@rhel100 ~]# blkid
/dev/mapper/stratis-1-180dc1fbcbc044c1ae3a08afc59fde11-thin-fs-73d1cd9c9fa04c22a1458a9892c71861: UUID=“73d1cd9c-9fa0-4c22-a145-8a9892c71861” BLOCK_SIZE=“512” TYPE=“xfs”

13)创建挂载点
[root@rhel100 ~]# mkdir /mnt/stra01

14)永久挂载
[root@rhel100 ~]# vim /etc/fstab
UUID=73d1cd9c-9fa0-4c22-a145-8a9892c71861 /mnt/stra01 xfs defaults,x-systemd.requires=stratisd.service 0 0

15)挂载未挂载的
[root@rhel100 ~]# mount -a

16)查看挂载点
[root@rhel100 ~]# df -Th

17)查看文件系统大小
[root@rhel100 ~]# du -sh /mnt/stra01/
0 /mnt/stra01/

18)往文件系统中,写10GB数据
[root@rhel100 ~]# cd /mnt/stra01/
[root@rhel100 stra01]# dd if=/dev/zero of=f1 bs=1M count=10240

19)查看文件系统大小
[root@rhel100 stra01]# du -sh /mnt/stra01/
10G /mnt/stra01/

20)查看池资源,发现文件系统10.57GB
[root@rhel100 ~]# stratis pool list

21)删除文件
[root@rhel100 stra01]# rm -rf f1

22)再次查看池资源,发现还是10.57GB
[root@rhel100 ~]# stratis pool list

23)向池资源中添加新的磁盘
[root@rhel100 stra01]# stratis pool add-data rhce_pool_01 /dev/nvme0n5

24)查看池资源,发现池资源由原来的20GB变成现在的40GB
[root@rhel100 ~]# stratis pool list

25)查看池中有哪些块设备
[root@rhel100 ~]# stratis blockdev list
[root@rhel100 ~]# stratis blockdev list rhce_pool_01

实验简单步骤思路
1)安装包
[root@rhel100 ~]# dnf install -y stratis-cli stratisd

2)启动服务
[root@rhel100 ~]# systemctl enable --now stratisd
[root@rhel100 ~]# systemctl status stratisd

3)创建池资源
[root@rhel100 ~]# stratis pool create rhce_pool_01 /dev/nvme0n4

4)创建文件系统
[root@rhel100 ~]# stratis filesystem create rhce_pool_01 rhce_fs_01

5)挂载文件系统
(1)临时挂载
[root@rhel100 stra01]# stratis filesystem list
[root@rhel100 ~]# mount /stratis/rhce_pool_01/rhce_fs_01 /mnt/stra01

(2)永久挂载
[root@rhel100 ~]# blkid
[root@rhel100 ~]# mkdir /mnt/stra01
[root@rhel100 ~]# vim /etc/fstab
UUID=73d1cd9c-9fa0-4c22-a145-8a9892c71861 /mnt/stra01 xfs defaults,x-systemd.requires=stratisd.service 0 0

信息查看
1)pool 池资源的查看
[root@rhel100 ~]# stratis pool list

2)文件系统的查看
[root@rhel100 ~]# stratis filesystem list

3)这个 pool 中包含哪些块设备
[root@rhel100 ~]# stratis blockdev list

4)扩容
[root@rhel100 stra01]# stratis pool add-data rhce_pool_01 /dev/nvme0n5

快照
1)stratis 创建快照
[root@rhel100 stra01]# stratis filesystem snapshot rhce_pool_01 rhce_fs_01 rhce_snap_01

2)查看快照,快照也是一个文件系统
[root@rhel100 stra01]# stratis filesystem list

3)删除快照,删除文件系统
[root@rhel100 ~]# stratis filesystem destroy rhce_pool_01 rhce_snap_01


vdo
vdo的出现,就是为了更加有效的使用磁盘的存储空间
去重,压缩!!

kvdo 模块,用于以透明的方式控制数据压缩,
uds 模块,则可用于重复数据删除。

vdo实验
1)查看vdo
[root@rhel100 stra01]# dnf search vdo

2)安装vdo依赖
[root@rhel100 stra01]# dnf install -y kmod-kvdo vdo

3)创建vdo卷
[root@rhel100 ~]# vdo create --name=rhce_vdo_01 --device=/dev/nvme0n6 --vdoLogicalSize=50G

4)查看vdo模块是否加载
[root@rhel100 ~]# lsmod | grep uds
[root@rhel100 ~]# lsmod | grep kvdo

5)查看vdo
[root@rhel100 ~]# vdo list

6)查看vdo压缩是否激活
[root@rhel100 ~]# vdo status --name=rhce_vdo_01 | grep -i compression

7)查看去重功能是否激活
[root@rhel100 ~]# vdo status --name=rhce_vdo_01 | grep -i deduplication

8)格式化vdo卷
[root@rhel100 ~]# vdo status --name=rhce_vdo_01 | grep -i mapper
[root@rhel100 ~]# mkfs -t xfs -K /dev/mapper/rhce_vdo_01

9)挂载
[root@rhel100 ~]# mkdir /mnt/rhce_vdo_01
[root@rhel100 ~]# mount /dev/mapper/rhce_vdo_01 /mnt/rhce_vdo_01/

10)测试最初的统计信息
[root@rhel100 ~]# vdostats --human-readable

11)写入数据,做测试准备
[root@rhel100 ~]# dd if=/dev/zero of=/mnt/rhce_vdo_01/f1 bs=1M count=5120
再次查看
[root@rhel100 ~]# vdostats --human-readable

day10 ============================================================================================================================================ day10

访问网络附加存储
NFS:Network filesystem

1)安装NFS的包
[root@rhel100 ~]# dnf install -y nfs-utils

2)启动NFS服务
[root@rhel100 ~]# systemctl enable --now nfs-server.service

3)查看服务
[root@rhel100 ~]# systemctl status nfs-server.service

4)创建共享目录
[root@rhel100 ~]# mkdir /mnt/share1

5)配置共享目录
[root@rhel100 ~]# vim /etc/exports
/mnt/share1 192.168.2.104(rw,no_root_squash)

6)使配置生效
[root@rhel100 ~]# exportfs -rv

7)查看防火墙
[root@rhel100 ~]# firewall-cmd --state
not running

8)Client 怎么测试
(1)安装nfs-utils这个包
[root@rhel100 ~]# dnf install -y nfs-utils
[root@hadoop104 ~]# rpm -qa | grep -i nfs-utils
(2)查看服务共享
[root@hadoop104 ~]# showmount -e 192.168.2.100

9)客户端如何挂载
[root@hadoop104 ~]# mkdir /mnt/nfs
[root@hadoop104 ~]# mount -t nfs 192.168.2.100:/mnt/share1 /mnt/nfs/

10)客户端创建文件,并编写内容
[root@hadoop104 ~]# touch /mnt/nfs/f1
[root@hadoop104 ~]# echo ‘I Love RHCE’ > /mnt/nfs/f1

11)服务端查看内容,发现实现了NFS共享
[root@rhel100 ~]# cat /mnt/share1/f1
I Love RHCE

12)永久挂载
[root@hadoop104 ~]# vim /etc/fstab
192.168.2.100:/mnt/share1 /mnt/nfs/ nfs defaults 0 0

13)自动挂载: Client 配置
当我访问一个目录(通常是挂载点),会自动的把NFS上的共享目录自动挂载到你的访问目录上!
通过 autofs 的服务来实现的
auto 的原理是怎么样的呢?

(1)autofs 会持续监听一个目录:比如这个目录是/mnt
(2)当我使用到这个目录下的子目录的时候,/mnt/nfs
(3)会自动的根据规则文件,将远程服务的目录挂载过来
挂载谁,挂载到哪里~

自动挂载实验
1)需要安装autofs的包,并且启动服务
[root@hadoop104 ~]# yum install -y autofs

2)启动服务
[root@hadoop104 ~]# systemctl enable --now autofs.service

3)查看服务
[root@hadoop104 ~]# systemctl status autofs.service

4)配置监听目录
[root@hadoop104 ~]# vim /etc/auto.master
/mnt /etc/auto.ldap

意思就是持续去监听/mnt目录
用谁?挂载谁?都是定义在/etc/auto.ldap这个文件里面

5)拷贝模板并修改模板
[root@hadoop104 ~]# cp /etc/auto.misc /etc/auto.ldap
[root@hadoop104 ~]# vim /etc/auto.ldap
nfs -fstype=nfs 192.168.2.100:/mnt/share1
#当你使用/mnt/nfs这个目录的时候,会自动的将192.168.2.100:/mnt/share1 挂载到 /mnt/nfs 这个目录上

6)卸载,并查看文件
[root@hadoop104 ~]# umount /mnt/nfs/
[root@hadoop104 ~]# ls -l /mnt/nfs/

7)重启autofs服务,并查看
[root@hadoop104 ~]# systemctl restart autofs.service
[root@hadoop104 ~]# ls -l /mnt/nfs/

8)重启电脑做测试
[root@hadoop104 ~]# df -Th
[root@hadoop104 ~]# ls -l /mnt/nfs
[root@hadoop104 ~]# df -Th

9)还可以自动挂载光驱或本地磁盘
[root@hadoop104 ~]# vim /etc/auto.ldap
cdrom -fstype=iso9660 :/dev/cdrom

10)磁盘自动挂载
(1)基于磁盘,进行分区
[root@hadoop104 ~]# fdisk /dev/sdb
n
p
default…

(2)对分区进行格式化
[root@hadoop104 ~]# mkfs -t xfs /dev/sdb1

(3)编辑文件
[root@hadoop104 ~]# vim /etc/auto.ldap
xfs -fstype=xfs :/dev/sdb1

(4)重启autofs服务,并查看
[root@hadoop104 ~]# systemctl restart autofs.service
[root@hadoop104 ~]# ls -l /mnt/xfs/

(5)查看
[root@hadoop104 ~]# df -Th

RH134 第10章 控制启动过程
获取启动方式
[root@rhel100 ~]# systemctl get-default
graphical.target

graphical.target -> 图形化启动
multi-user.target -> 命令行启动
emergency.target -> 只读系统

设置启动方式
[root@rhel100 ~]# systemctl set-default multi-user.target

设置为只读系统后,输入root密码即可
[root@rhel100 ~]# systemctl set-default emergency.target

从只读系统中,重新设置回来,需要先挂载一下
[root@rhel100 ~]# mount -o remount,rw /
[root@rhel100 ~]# systemctl set-default multi-user.target

isolate 设置的是临时的,set-default 设置的是默认的永久的
[root@rhel100 ~]# systemctl isolate multi-user.target

关机模式
[root@rhel100 ~]# systemctl isolate poweroff.target

重启模式
[root@rhel100 ~]# systemctl isolate reboot.target

进入单用户
开机3秒内按e键盘,
在"linux16 /vmlinux-3.10.0-5.14.e17.x86_64 …. LANG=zh_CN.UTF-8" 这句话将ro改成rw,并在末尾添加上 init=/bin/bash

ro -> rw rd.break graphical.target -> ctrl + x
switch_root:/# chroot /sysroot/
sh-4.4# systemctl set-default multi-user.target
sh-4.4# exit

设置root密码
[root@rhel100 ~]# passwd root

进入单用户修改root密码
开机3秒内按e键盘 -> ro 改成 rw rd.break -> ctrl + x
切换根目录
switch_root:/# chroot /sysroot/
sh-4.4# echo ‘000000’ | passwd --stdin root
sh-4.4# touch /.autorelabel
sh-4.4# exit
sh-4.4# exit

修复在启动时出现的文件系统问题

管理网络安全
firewalld 防火墙
执行报的过滤,不是 firewalld 完成的
Linux 内核中 包含 netfilter 模块

开启防火墙
[root@rhel100 ~]# systemctl start firewalld.service

激活防火墙
[root@rhel100 ~]# systemctl enable firewalld.service

[root@rhel100 ~]# locate netfilter
[root@rhel100 netfilter]# cd /usr/lib/modules/4.18.0-240.el8.x86_64/kernel/net/netfilter
[root@rhel100 netfilter]# ls

查看
[root@rhel100 ~]# firewall-cmd --list-all

查看默认zone
[root@rhel100 ~]# firewall-cmd --get-default-zone
public

firewalld 是设置规则的,针对你不同的网段,你项配置不同的规则的时候,那么你可以划分不同zone中
在你配置这个防火墙规则之前,首先把源或者网卡关联的zone配置好

在默认情况下,所有的网卡都加入到默认zone中

修改的思路:
1)如果你想针对源来做操作!,首先定义你的源关联的是哪个zone
[root@rhel100 ~]# firewall-cmd --help | grep source
–list-sources List sources that are bound to a zone [P] [Z]
–add-source=[/]||ipset:
Bind the source to a zone [P] [Z]
–change-source=[/]||ipset:
Change zone the source is bound to [Z]
–query-source=[/]||ipset:
Query whether the source is bound to a zone [P] [Z]
–remove-source=[/]||ipset:
Remove binding of the source from a zone [P] [Z]

将 192.168.2.0/24 加入到 home zone 中
–permanent 参数是永久的意思,否则重启后不生效
[root@rhel100 ~]# firewall-cmd --add-source=192.168.2.0/24 --permanent --zone=home

使当前生效
[root@rhel100 ~]# firewall-cmd --reload

查看
[root@rhel100 ~]# firewall-cmd --list-all --zone=home

以后你的数据报文,来源如果是192.168.2.0/24这个网段的,那么就会进入 home zone 内匹配规则

查看,并列出一个zone关联了那些源
[root@rhel100 ~]# firewall-cmd --list-sources --zone=home
192.168.2.0/24

查询一个源是否在一个zone内
[root@rhel100 ~]# firewall-cmd --query-source=192.168.2.0/24 --zone=home
yes

修改一个zone
[root@rhel100 ~]# firewall-cmd --change-source=192.168.2.0/24 --zone=public --permanent
使当前生效
[root@rhel100 ~]# firewall-cmd --reload

采用第二种方案
就是采用网卡

查看,默认就是所有的网卡都在默认zone(public)里面
[root@rhel100 ~]# firewall-cmd --list-all

其实对于网卡的操作
[root@rhel100 ~]# firewall-cmd --change-interface=ens160 --zone=home --permanent

使当前生效
[root@rhel100 ~]# firewall-cmd --reload

查看是否在zone中
[root@rhel100 ~]# firewall-cmd --list-all --zone=home

删除
[root@rhel100 ~]# firewall-cmd --remove-interface=ens160 --zone=home --permanent

Add
[root@rhel100 ~]# firewall-cmd --add-interface=ens160 --zone=public --permanent

使当前生效
[root@rhel100 ~]# firewall-cmd --reload

查看zone中有哪些网卡
[root@rhel100 ~]# firewall-cmd --list-interfaces --zone=public
ens160

查看网卡是否在这个zone中
[root@rhel100 ~]# firewall-cmd --query-interface=ens160 --zone=public
yes

先看源再看网卡,是有优先级的

1)在正常情况下面,所有的网卡都应该在默认zone内,如果你不想去设置源分开或者网卡分开
那么你就可把所有的规则设置在默认zone(public)里面
[root@rhel100 ~]# firewall-cmd --get-default-zone
public
一个网卡只能在一个zone中

2)如果您想分开,那么你可以通过设置源或者网卡
我们需要学会在zone内设置规则
[root@rhel100 ~]# firewall-cmd --permanent --add-source=192.168.2.0/24 --zone=home
[root@rhel100 ~]# firewall-cmd --permanent --add-service=http --zone=home
[root@rhel100 ~]# firewall-cmd --reload
[root@rhel100 ~]# firewall-cmd --list-all --zone=home

zone中添加服务
[root@rhel100 ~]# firewall-cmd --permanent --remove-service=http --zone=home
[root@rhel100 ~]# curl http://rhel100
redhat

zone中添加端口
[root@rhel100 ~]# firewall-cmd --permanent --add-port=80/tcp --zone=home

ACCEPT 除了被明确写好的规则,会接受所有流入的数据包。
REJECT 除了被明确写好允许的规则,会拒绝所有流入的数据包, 会给发起连接的机器回复被拒绝的消息。
DROP 除了被明确写好允许的规则,会拒绝所有流入的数据包, 不会给发起连接的机器回复任何消息。

–set-target=DROP ,只有当服务或者端口,被添加进来后才能被访问
[root@rhel100 ~]# firewall-cmd --permanent --set-target=DROP --zone=home

[root@rhel100 ~]# firewall-cmd --permanent --set-target=ACCEPT --zone=home

firewalld的规则
1)基本规则(RHEL8)

2)富规则
[root@rhel100 ~]# firewall-cmd --permanent --add-rich-rule=‘rule family=ipv4 source address=192.168.111.0/24 service name=http reject’ --zone=home

[root@rhel100 ~]# firewall-cmd --reload
[root@rhel100 ~]# firewall-cmd --list-all

3)Masqurade

4)端口转发
[root@rhel100 ~]# firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toport=22:toaddr=“192.168.2.101” --zone=home

富规则做端口转发
[root@rhel100 ~]# firewall-cmd --permanent --add-rich-rule=‘rule family=ipv4 source address=192.168.2.0/24 forward-port port=99 protocol=tcp to-port=22’ --zone=home

[root@rhel100 ~]# firewall-cmd --list-all --zone=home

[root@rhel100 ~]# semanage port -l | grep 80

[root@rhel100 ~]# setenforce 1

参数-a 是增加的意思
[root@rhel100 ~]# semanage port -a -t http_port_t -p tcp 7874
[root@rhel100 ~]# systemctl stop httpd
[root@rhel100 ~]# systemctl start httpd

参数 -d 表示删除
[root@rhel100 ~]# semanage port -d -p tcp 7874

参数 -m 表示修改
[root@rhel100 ~]# semanage port -m -t speech_port_t -p tcp 7874

虚拟化技术KVM
KVM虚拟技术是从 RHEL6 开始的, KVM 虚拟化是基于内核的虚拟化技术,是基于硬件的虚拟化技术

查看是否支持虚拟化
svm 表示 AMD CPU
vmx 表示 Intel CPU
[root@rhel100 ~]# cat /proc/cpuinfo | egrep “svm|vmx”

[root@rhel100 ~]# dnf repolist
[root@rhel100 ~]# dnf module install -y virt

检测一下物理机是否可以成为宿主机
[root@rhel100 ~]# virt-host-validate

[root@rhel100 ~]# lsmod | grep kvm

安装 cockpit 依赖插件,这是一个管理虚拟机的插件
[root@rhel100 ~]# dnf install -y cockpit-machines

激活并启动
[root@rhel100 ~]# systemctl enable --now cockpit.socket

查看端口
[root@rhel100 ~]# lsof -i:9090

类似的工具还有很多, virsh/virt-install/virt-spec/qemu-img/gustfish

[root@rhel100 ~]# virt-manager

day11 ========================================================================================================================== day11

window + r -> tcping64.exe 192.168.2.100 22

Ansible 自动化的运维工具
批量去管理服务器的时候
1)你所有的服务器的通用配置
2)应用管理
3)服务管理
4)系统管理

等等所有的管理,都可以通过 Ansible 来实现

一、概念
1、定义主机清单
2、Playbook 剧本,定义各种各样的任务
3、Controller 是通过SSH的方式,远程连接到受管理主机上面的
SSH 是基于无密码验证的

Node就是受管理主机

二、安装Ansible
Ansible是由python编写的,所以要有python的环境
1、查看
[root@rhel100 ~]# dnf repolist
[root@rhel100 ~]# dnf search ansible
[root@rhel100 ~]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y

2、安装ansible
[root@rhel100 ~]# dnf install -y ansible

3、查看ansible
[root@rhel100 ~]# ansible --version
ansible 2.9.27

[root@rhel100 ~]# ansible -m setup localhost | more

定义受管理主机(定义资产清单),表示将来要管理那些服务器
默认配置文件 /etc/ansible/hosts

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28652401/article/details/121473883

智能推荐

Hexo博客主题安装和优化(二)_hexo matery设置雪花飘落-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏14次。一、Hexo自定义 —晚枫博客—1. 动态标题打开博客主题文件夹,路径:themes/matery/layout/layout.ejs,在对应位置添加如下代码:<script type="text/javascript"> var OriginTitile = document.title, st; document.addEventLis..._hexo matery设置雪花飘落

tomcat session管理_tomcat session管理页面-程序员宅基地

文章浏览阅读248次。最近有空看了一下tomcat 6源码里面对session管理的实现,现在写下来,以供后考,也希望能对对此感兴趣的朋友有所提示。 闲话少说,先贴一下tomcat6的component层次图(此图来自tomcat doc) Server 就是一个servlet container _tomcat session管理页面

FPGA小白的第一篇博客-程序员宅基地

文章浏览阅读410次。今天是2015年9月22日,我得记住这一天,从今天开始,笔者正式开始FPGA的板级学习,希望早日成为熟练的设计开发者_fpga小白

小经验_chmod: 无法创建符号链接-程序员宅基地

文章浏览阅读4.5k次。1.一个文件夹删不掉,是权限问题,chmod 777 xxx。类似的,根目录下的root文件夹不能访问,也是权限问题。2.serial port terminal(linux下串口终端) CompizConfig(花样)3.source insight安装,得先装wine.4.删除非空文件夹,rm -rf xxx5.arm-linux-gcc -v查看arn-_chmod: 无法创建符号链接

OC----synthesize 关键字_oc synthesize-程序员宅基地

文章浏览阅读998次。@synthesize 关键字6.1 问题: setter, getter的实现也是没有什么任何技术含量6.2 作用: 自动生成getter、setter方法的实现.6.3 语法: @synthesize @property名称; 如: @interface Person : NSObject{ int _age; } @property int age;..._oc synthesize

LWN:Fedora里的fstrim-程序员宅基地

文章浏览阅读827次。关注了就能看到更多这么棒的文章哦~Fedora and fstrimByJake EdgeDecember 31, 2019原文来自:https://lwn.net/Articles/..._fstrim 服务

随便推点

day14_Python基础内容—数据持久化、文件操作、数据持久化方法_每次运行程序输入一个学生的信息怎么回事-程序员宅基地

文章浏览阅读365次。Python学习第14天。学习内容:数据持久化、文件操作、数据持久化方法。一、数据持久化问题1:什么是数据持久化?为什么要持久化?计算机存储空间分为:运行内存和磁盘两种。程序中产生的数据默认都是保存在运行内存中,存储在运行内存中的数据在程序结束后会自动销毁。如果将数据存储到磁盘中,那么数据除非手动删除或者磁盘损坏,否则会一直存在,实现了数据的持久保存,存储在磁盘中的数据可以反复使用。磁盘存储数据的基本单位是文件。数据持久化指的就是将程序中的数据以文件的形式保存到磁盘中。为什么要持久化? _每次运行程序输入一个学生的信息怎么回事

linux安装maven-程序员宅基地

文章浏览阅读76次。1、下载maven包apache-maven-3.3.9-bin.tar.gz2、创建目录mkdir -p/usr/local/maven3、拷贝安装包到指定路径cpapache-maven-3.3.9-bin.tar.gz/usr/local/maven4、解压tar -zxvf apache-maven-3.2.5-bin.tar.gzmv apach..._linux安装maven 3.2.5

机器学习应用之WebShell检测_webshell-master-程序员宅基地

文章浏览阅读6.4k次。本文主要参考自兜哥的《Web安全之机器学习入门》前段时间在研究WebShell的检测查杀,然后看到兜哥的著作中提到的几个机器学习算法中也有实现WebShell检测的,主要有朴素贝叶斯分类、K邻近算法、图算法、循环神经网络算法等等,就一一试试看效果吧。Python中的几个机器学习的库1、numpy:安装:pip install --user numpy2、SciPy:_webshell-master

MySQL调优之索引匹配方式及索引种类_索引包含( )模式匹配的查询-程序员宅基地

文章浏览阅读1.3k次。索引匹配方式下面举例皆在索引 idx(name,age,pos)建立前提下全值匹配全值匹配指的是和索引中的所有列进行匹配匹配最左前缀只匹配前面的几列匹配列前缀可以匹配某一列的值的开头部分比如:select * from staffs where name like ‘J%’;这个语句可以利用到用name建立的索引进行查找。但是如果是 select * from staffs where name like ‘%J%’;就无法用到。匹配范围值可以查找某一个范围的数据比如:explain_索引包含( )模式匹配的查询

Unity给力插件之ShaderForge(一)-程序员宅基地

文章浏览阅读597次。这是一个用来制作shader的插件,也是一个很好的学习shader的工具。这个插件上手很容易,但是要用它来制作理想的Shader,需要下点功夫。这儿先列举出基础知识,以及我的一些实践。以后我还会继续学习并记录更多的内容。一、基本操作:    1)、截断连线:按住alt并右键   2)、框选:按住alt键并框选   3)、对于不认识的节点,右键选择what,出现API官网,可选..._shaderforge遮罩

长东应用 - 流程标题的高级定制、应用换肤与应用预览_流程标题是什么意思-程序员宅基地

文章浏览阅读122次。长东应用拟定在今年12月份发布,这是一款完全免费的高度自由定制的个人单机软件。本文主要介绍流程标题的高级定制、应用自由换肤以及应用发布前的预览功能。目录应用换肤与预览流程标题应用换肤与预览在自定义应用中,右键待发布的app,选择个性化设置。新建个性化设置,系统默认提供六种默认样式,分别为:暗夜精灵、挪威森林、铁血丹心、紫气东来、粉色回忆、酒醉探戈。也可以根据选项自由定制应用内的背景色、字体颜色,可点击上方预览按钮,查看效果。(1)预览 - 暗夜精灵效果(2_流程标题是什么意思

推荐文章

热门文章

相关标签