yum私有仓库的基本配置
创建本地挂在目录/media/cdrom,并挂在光盘镜像
[root@rocky8 ~]#mkdir /media/cdrom
[root@rocky8 ~]#mount /dev/cdrom /media/cdrom/
[root@rocky8 ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs tmpfs 2.0G 9.0M 2.0G 1% /run
tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/mapper/rl-root xfs 69G 2.5G 66G 4% /
/dev/sda2 xfs 1.1G 216M 848M 21% /boot
/dev/sda1 vfat 628M 6.1M 622M 1% /boot/efi
/dev/mapper/rl-home xfs 34G 268M 33G 1% /home
tmpfs tmpfs 392M 0 392M 0% /run/user/0
/dev/sr0 iso9660 12G 12G 0 100% /media/cdrom
进入到/etc/yum.repos.d/目录备份原文件
[root@rocky8 ~]# cd /etc/yum.repos.d/
[root@rocky8 yum.repos.d]# ls
Rocky-AppStream.repo Rocky-Devel.repo Rocky-Media.repo Rocky-PowerTools.repo Rocky-Sources.repo
Rocky-BaseOS.repo Rocky-Extras.repo Rocky-NFV.repo Rocky-ResilientStorage.repo
Rocky-Debuginfo.repo Rocky-HighAvailability.repo Rocky-Plus.repo Rocky-RT.repo
[root@rocky8 yum.repos.d]# mkdir bak
[root@rocky8 yum.repos.d]# mv Rocky-* bak/
[root@rocky8 yum.repos.d]# ls
bak
创建localsource.repo本地仓库
[root@rocky8 yum.repos.d]# vim localsource.repo
[BaseOS]
name=BaseOS
baseurl=file:///media/cdrom/BaseOS
https://mirror.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/
https://mirrors.huaweicloud.com/centos/8/BaseOS/x86_64/os/
https://mirrors.cloud.tencent.com/centos/8/BaseOS/x86_64/os/
https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///media/cdrom/AppStream
https://mirror.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/
https://mirrors.huaweicloud.com/centos/8/AppStream/x86_64/os/
https://mirrors.cloud.tencent.com/centos/8/AppStream/x86_64/os/
https://mirrors.aliyun.com/centos/8/AppStream/x86_64/os/
gpgcheck=0
[epel]
name=EPEL
baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/$releasever/Everything/$basearch
https://mirrors.cloud.tencent.com/epel/$releasever/Everything/$basearch
https://mirrors.huaweicloud.com/epel/$releasever/Everything/$basearch
https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
gpgcheck=0
enabled=1
[extras]
name=extras
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/os
https://mirrors.cloud.tencent.com/centos/$releasever/extras/$basearch/os
https://mirrors.huaweicloud.com/centos/$releasever/extras/$basearch/os
https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os
gpgcheck=0
enabled=1
测试验证repo源是否可用
[root@rocky8 yum.repos.d]# yum repolist all
repo id repo name status
AppStream AppStream enabled
BaseOS BaseOS enabled
epel EPEL enabled
extras extras enabled
安装服务进行测试验证
[root@rocky8 ~]# yum -y install httpd
BaseOS 9.7 MB/s | 2.6 MB 00:00
AppStream 27 MB/s | 7.8 MB 00:00
EPEL 14 kB/s | 4.7 kB 00:00
extras 6.0 kB/s | 1.5 kB 00:00
Dependencies resolved.
========================================================================================================================================
Package Architecture Version Repository Size
========================================================================================================================================
Installing:
httpd x86_64 2.4.37-47.module+el8.6.0+823+f143cee1.1 AppStream 1.4 M
Installing dependencies:
apr x86_64 1.6.3-12.el8 AppStream 128 k
apr-util x86_64 1.6.1-6.el8.1 AppStream 104 k
httpd-filesystem noarch 2.4.37-47.module+el8.6.0+823+f143cee1.1 AppStream 40 k
httpd-tools x86_64 2.4.37-47.module+el8.6.0+823+f143cee1.1 AppStream 107 k
mailcap noarch 2.1.48-3.el8 BaseOS 38 k
mod_http2 x86_64 1.15.7-5.module+el8.6.0+823+f143cee1 AppStream 153 k
rocky-logos-httpd noarch 85.0-4.el8 BaseOS 22 k
Installing weak dependencies:
apr-util-bdb x86_64 1.6.1-6.el8.1 AppStream 23 k
apr-util-openssl x86_64 1.6.1-6.el8.1 AppStream 26 k
Enabling module streams:
httpd 2.4
Transaction Summary
========================================================================================================================================
Install 10 Packages
Total size: 2.0 M
Installed size: 5.5 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : apr-1.6.3-12.el8.x86_64 1/10
Running scriptlet: apr-1.6.3-12.el8.x86_64 1/10
Installing : apr-util-bdb-1.6.1-6.el8.1.x86_64 2/10
Installing : apr-util-openssl-1.6.1-6.el8.1.x86_64 3/10
Installing : apr-util-1.6.1-6.el8.1.x86_64 4/10
Running scriptlet: apr-util-1.6.1-6.el8.1.x86_64 4/10
Installing : httpd-tools-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 5/10
Running scriptlet: httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch 6/10
Installing : httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch 6/10
Installing : rocky-logos-httpd-85.0-4.el8.noarch 7/10
Installing : mailcap-2.1.48-3.el8.noarch 8/10
Installing : mod_http2-1.15.7-5.module+el8.6.0+823+f143cee1.x86_64 9/10
Installing : httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 10/10
Running scriptlet: httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 10/10
Verifying : mailcap-2.1.48-3.el8.noarch 1/10
Verifying : rocky-logos-httpd-85.0-4.el8.noarch 2/10
Verifying : apr-1.6.3-12.el8.x86_64 3/10
Verifying : apr-util-1.6.1-6.el8.1.x86_64 4/10
Verifying : apr-util-bdb-1.6.1-6.el8.1.x86_64 5/10
Verifying : apr-util-openssl-1.6.1-6.el8.1.x86_64 6/10
Verifying : httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 7/10
Verifying : httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch 8/10
Verifying : httpd-tools-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 9/10
Verifying : mod_http2-1.15.7-5.module+el8.6.0+823+f143cee1.x86_64 10/10
Installed:
apr-1.6.3-12.el8.x86_64 apr-util-1.6.1-6.el8.1.x86_64
apr-util-bdb-1.6.1-6.el8.1.x86_64 apr-util-openssl-1.6.1-6.el8.1.x86_64
httpd-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 httpd-filesystem-2.4.37-47.module+el8.6.0+823+f143cee1.1.noarch
httpd-tools-2.4.37-47.module+el8.6.0+823+f143cee1.1.x86_64 mailcap-2.1.48-3.el8.noarch
mod_http2-1.15.7-5.module+el8.6.0+823+f143cee1.x86_64 rocky-logos-httpd-85.0-4.el8.noarch
Complete!
TCP/IP相关笔记
协议由谁规定
ISO(International Organization for Standards)
国家标准化组织
OSI(Open System Interconnection)
开放式通信系统互联参考模型
Internet Engineering Task Force
非国家或国际机构等公共机构所制定的标准,但属于业界公认的标准
协议分层与 OSI 参考模型
功能 | 概览 | ||
---|---|---|---|
7 | 应用层 | 针对对特定应用的协议 | 电子邮件 --> 电子邮件协议 远程登录 --> 远程登录协议 文件传输 --> 文件传输协议 |
6 | 表示层 | 设备固有数据格式和网络标准数据格式的转换 | 接收不同表现形式的信息,如文字流、图像、声音等 |
5 | 会话层 | 通信管理。负责建立和断开通信连接(数据流动的逻辑通路)。管理传输层以下的分层 | 何时建立连接、何时断开连接以及保持多久的连接 |
4 | 传输层 | 管理两个节点之间数据传输。负责可靠传输(确保数据被可靠地传输到目的地址) | 是否有数据丢失 |
3 | 网络层 | 地址管理和路由选择 | 经过哪个路由传递到目的地址 |
2 | 数据链路层 | 互联设备之间传送和识别数据帧 | 数据帧与比特流之间转换 |
1 | 物理层 | 以‘0’、‘1’ 代表电压的高低、灯光的闪灭。界定连接器和网线的规格 | 比特流和电子信号的切换 连接器与网线的规格 |
7 | 应用层 | 应用层 DNS、HTML、HTTP、TLS/SSL、SMTP、POP、IMAP、TELNET、SSH、FTP、SNMP、MIB、SIP、RTP、LDAP | 应用程序 |
---|---|---|---|
6 | 表示层 | ||
5 | 会话层 | ||
4 | 传输层 | 传输层 TCP、UDP、UDP-Lite、SCTP、DCCP | 操作系统 |
3 | 网络层 | 互联网层 ARP、IP、ICMP、IPsec | |
2 | 数据链路层 | 网卡层 | 设备驱动程序与网络接口 |
1 | 物理层 | 硬件 |
区别:OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。
- 硬件(物理层)
TCP/IP的最底层是负责数据传输的硬件。 - 网络接口层(数据链路层)
网络接口层利用以太网中的数据链路层进行通信,因此属于接口层。 - 互联网层(网络层)
互联网层使用IP协议,它相当于OSI模型中的第3层网络层。IP协议基于IP地址转发分包数据。所有连接互联网的主机和路由器都必须实现IP的功能,其他连接互联网的网络设备(如网桥、中继器或集线器)就没必要一定实现IP或TCP的功能。
IP
IP是跨域网络传送数据包,使整个互联网都能够收到数据的协议。
虽然IP也是分组交换的一种协议,但是它不具有重发机制。即使分组数据包未能到达对端主机也不会重发。因此,属于非可靠性传输协议。
ICMP
IP数据包在发送途中一旦发生异常导致无法到达对端目的地址时,需要给发生端发送一个异常的通知。ICMP就是为这一功能而制定的。它有时也被用来诊断网络的健康状态。
ARP
从分组数据包的IP地址中解析出物理地址(MAC地址)的一种协议。 - 传输层
传输层最主要的功能就是能够让应用程序之间实现通信。
TCP
TCP是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况,。此外,TCP还能够有效利用带宽,缓解网络拥堵。
UDP
UDP是一种面向无连接的传输层协议。UDP不会关注对端是否真的收到了传送过去的数据。
UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。 - 应用层(会话层以上的分层)
浏览器与服务端之间通信所用的协议是HTTP。所传输数据的主要格式是HTML。WWW中的HTTP属于OSI应用层的协议,而HTML属于表示层的协议。
电子邮件(E-Mail)
发送电子邮件时用到的协议叫做SMTP(Simple Mail Tranfer Protocol)。
文件传输(FTP)
在FTP中进行文件传输时会建立两个TCP连接,分别是发出传输请求时所要用到的控制连接与实际传输数据时所要用到的数据连接。
远程登录(TELNET 与 SSH)
网络管理(SNMP)
在TCP/IP中进行网络管理时,采用SNMP协议。使用SNMP管理的主机、网桥、路由器等称作SNMP代理(Agent),而进行管理的那一段叫做管理器。
MAC地址和IP地址
MAC
虽然具体设置制作商编号、内部编号,但是在实际寻址时却是没用的,而IP
的层次性才是有用的,IP=网络号+主机号
理解:
- 网络传输中,每个节点会根据分组数据的地址信息,来判断该报文应该由哪个网卡发送出去,因此,每个地址会参考一个发出接口列表。
- MAC寻址-地址转发表:MAC地址转发表记录的是实际的MAC地址本身
- IP寻址-路由控制表:路由控制表记录的IP地址则是集中了之后的网络号
- 实际的地址转发表与路由控制表获取的信息并不是具体的目标地址,而是该数据应该被发送出去的网卡信息
Mac地址
mac地址长48比特,全世界唯一
注意:
- 物理机硬件唯一:硬件厂家出厂的mac地址是唯一的,可在互联网中进行通信
- 虚拟机可不唯一:比如虚拟网卡,没有硬件,mac地址是自己给的,那么会重复的,但是只要不是出现在同一个数据链路就不会出现问题
1 | 单播地址0/多播地址1 |
---|---|
2 | 全局地址0/本地地址1 |
3~24 | 由 IEEE 管理并保证各家厂家不重复 |
25~48 | 由厂家管理并保证产品之间不重复 |
IP地址的分类
- A:0开头,8位网络位+24位主机位,范围
0.0.0.0~127.0.0.0
,一个网段可容纳 224-2=16 777 214个主机 - B:10开头,16+16,范围
128.0.0.1~191.255.0.0
,一个网段可容纳 216-2=65 534个主机 - C:110开头,24+8,
192.168.0.0~239.255.255.0
,一个网段可容纳 28-2=254个主机 - D:1110开头,32+2,
224.0.0.0~239.255.255.0
,无主机地址,常用作多播
全是0:表示网路地址或IP地址不可获知的情况
全是1:表示广播地址
图解TCP协议的三次握手及四次挥手
TCP 连接建立—三次握手
TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图
- 一开始,客户端和服务端都处于
CLOSED
状态。先是服务端主动监听某个端口,处于LISTEN
状态 - 客户端会随机初始化序号(
client_isn
),将此序号置于 TCP 首部的「序号」字段中,同时把SYN
标志位置为1
,表示SYN
报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT
状态。 - 服务端收到客户端的
SYN
报文后,首先服务端也随机初始化自己的序号(server_isn
),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入client_isn + 1
, 接着把SYN
和ACK
标志位置为1
。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD
状态。
为什么是三次握手?不是两次、四次?
常见回答是:“因为三次握手才能保证双方具有接收和发送的能力。”这回答是没问题,但这回答是片面的,并没有说出主要的原因。
什么是 TCP 连接:
- 用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗口大小称为连接。
所以,重要的是为什么三次握手才可以初始化Socket、序列号和窗口大小并建立 TCP 连接。
三次握手的原因:
- 三次握手才可以阻止重复历史连接的初始化(主要原因)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
TCP 建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。
不使用「两次握手」和「四次握手」的原因:
- 「两次握手」:无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号;
- 「四次握手」:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
TCP 连接断开—四次挥手
- 客户端打算关闭连接,此时会发送一个 TCP 首部
FIN
标志位被置为1
的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态。 - 服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSED_WAIT
状态。 - 客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。 - 等待服务端处理完数据后,也向客户端发送
FIN
报文,之后服务端进入LAST_ACK
状态。 - 客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态 - 服务器收到了
ACK
应答报文后,就进入了CLOSED
状态,至此服务端已经完成连接的关闭。 - 客户端在经过
2MSL
一段时间后,自动进入CLOSED
状态,至此客户端也完成连接的关闭。
你可以看到,每个方向都需要一个 FIN 和一个 ACK,因此通常被称为四次挥手。
这里一点需要注意是:主动关闭连接的,才有 TIME_WAIT 状态。
为什么挥手需要四次?
再来回顾下四次挥手双方发 FIN
包的过程,就能理解为什么需要四次了。
- 关闭连接时,客户端向服务端发送
FIN
时,仅仅表示客户端不再发送数据了但是还能接收数据。 - 服务器收到客户端的
FIN
报文时,先回一个ACK
应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN
报文给客户端来表示同意现在关闭连接。
从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK
和 FIN
一般都会分开发送,从而比三次握手导致多了一次。
一键shell脚本实现网卡配置
注意:此脚本目的是快速配置网卡配置文件;执行脚本之后,需要根据不同操作系统手动进行网卡重启进行验证
#!/bin/bash
echo "(1)检查网卡名称,请先使用ip address show进行查看"
read -p "(2)请输入您的网卡名称:" ENS_NAME
#查看IP地址
#NET_IP=`ifconfig ${ENS_NAME}|grep "inet"|grep -v 'inet6'|awk '{print $2}'`
NET_IP=`ip address show ens192| sed -n 3p | awk '{print $2;}' | cut -d '/' -f1`
echo "您现在的ip是:"${NET_IP}
read -p "(3)请输入修改的ip地址:" IP
read -p "(4)请输入修改的netmask:" NETMASK
read -p "(5)请输入修改的gateway网关:" GATEWAY
mv /etc/sysconfig/network-scripts/ifcfg-${ENS_NAME} /tmp/ifcfg-${ENS_NAME}_bak.`date +%Y%m%d%H%M`
echo "(6)正在配置中,请稍后..."
#将网卡的配置信息输出到ifcfg-${ENS_NAME}
cat>>/etc/sysconfig/network-scripts/ifcfg-${ENS_NAME} <<EOF
TYPE=Ethernet
BOOTPROTO=static
IPADDR=${IP}
NETMASK=${NETMASK}
GATEWAY=${GATEWAY}
DNS1=114.114.114.114
NAME=${ENS_NAME}
DEVICE=${ENS_NAME}
ONBOOT=yes
EOF
实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
目标实现:
1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有
- 安装mysql
- 安装apache
- 免密钥登陆主机
当前我们只实现免密钥登陆主机
3)通过函数封装每个功能
4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
5)支持输入一批主机免密钥,使用数组 实现
前提条件:必须先安装expect工具:
yum -y install expect
脚本实现:
#!/bin/bash
#实现ssh自动登录
ssh_host() {
while true;do
read -p "请输入ip(q退出):" IP
[[ $IP =~ ^(q|Q)$ ]] && exit;
[[ $IP =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "IP不合法,请重新输入";continue; }
break;
done
#set timeout 10
expect <<EE
spawn ssh $IP
expect {
"yes/no" { send "yes\n";exp_continue }
"password" {send "$PASSWORD\n" }
}
#expect eof
interact
EE
read -p "是否继续登录$IP(y/q):" Y
[[ $Y =~ y|Y ]] && ssh $IP || continue;
[[ $Q =~ q|Q ]] && break;
}
install_mysql(){
yum install -y mysql
}
install_apache(){
yum install -y httpd
}
#菜单
menu() {
while true;do
PS3="请输入对应的指令:"
select MENU in 免密登录远程主机 安装mysql 安装apache 退出脚本;do
case $REPLY in
1)
ssh_host
break
;;
2)
install_mysql
break
;;
3)
install_apache
break
;;
*)
echo 退出!
exit
;;
esac
done
done
}
menu
优化2:
#!/bin/bash
#判断系统类型
os_type(){
if grep -i -q ubuntu /etc/os-release;then
echo ubuntu
elif grep -i -q centos /etc/os-release;then
echo centos
else
echo "os can not be supported!"
fi
}
#实现ssh自动登录
ssh_host() {
while true;do
read -p "请输入ip(q退出):" IP
[[ $IP =~ ^(q|Q)$ ]] && exit;
[[ $IP =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]] || { echo "IP不合法,请重新输入";continue; }
break;
done
#set timeout 10
expect <<EE
spawn ssh $IP
expect {
"yes/no" { send "yes\n";exp_continue }
"password" {send "$PASSWORD\n" }
}
#expect eof
interact
EE
read -p "是否继续登录$IP(y/q):" Y
[[ $Y =~ y|Y ]] && ssh $IP || continue;
[[ $Q =~ q|Q ]] && break;
}
install_mysql(){
if [ `os_type` = centos ] ;then
yum install mysql -y
elif [ `os_type` = ubuntu ] ;then
apt install mysql -y
else
echo "os can not be supported"
fi
}
remove_mysql(){
if [ `os_type` = centos ] ;then
yum remove mysql -y
elif [ `os_type` = ubuntu ] ;then
apt remove mysql -y
else
echo "os can not be supported"
fi
}
install_apache(){
if [ `os_type` = centos ] ;then
yum install httpd -y
elif [ `os_type` = ubuntu ] ;then
apt install httpd -y
else
echo "os can not be supported"
fi
}
remove_apache(){
if [ `os_type` = centos ] ;then
yum remove httpd -y
elif [ `os_type` = ubuntu ] ;then
apt remove httpd -y
else
echo "os can not be supported"
fi
}
#菜单
menu() {
while true;do
PS3="请输入对应的指令:"
select MENU in 免密登录远程主机 安装mysql 卸载mysql 安装apache 卸载apache 退出脚本;do
case $REPLY in
1)
ssh_host
break
;;
2)
install_mysql
break
;;
3)
remove_mysql
break
;;
4)
install_apache
break
;;
5)
remove_apache
break
;;
*)
echo 退出!
exit
;;
esac
done
done
}
menu