SRE第五周作业

这篇博客详细介绍了如何搭建和配置DHCP服务器,包括基本概念、实现原理和实际部署。接着,深入讲解DNS服务器的正向解析流程,并搭建主辅DNS服务器。此外,还涉及智能DNS的实现、网络服务放行策略以及NAT和iptables的应用。最后,文章涵盖了MySQL和MariaDB的二进制安装过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.搭建dhcp服务,实现ip地址申请分发。需要有DHCP原理分析,需要画图

1.1 dhcp的基本概念

dhcp (Dynamic Host Configuration Protocol) 动态主机配置协议, 是一种C/S架构, 作用是自动为局域网内的主机自动分配IP, 子网掩码,网关,DNS等信息。客户端获得ip信息后自动配置相应IP。

1.2 dhcp的实现原理

  1. DHCP 客户端在启动时向网络广播 DHCP Discover报文,以寻求可用的 DHCP 服务器。

  2. DHCP 服务器接收到 DHCP Discover 报文后,将 DHCP Offer报文广播回客户端。该报文包含可用的 IP 地址、子网掩码、默认网关、DNS 服务器等网络配置信息。(可能会有多台DHCP服务器响应)

  3. DHCP 客户端从多个 DHCP Offer 报文中选择其中一个,并向 DHCP 服务器发送 DHCP Request报文,请求分配选中的 IP 地址。

  4. DHCP 服务器接收到 DHCP Request 报文后,将分配给客户端的 IP 地址等配置信息打包在 DHCP ACK报文中,向客户端广播该报文。

  5. DHCP 客户端接收到 DHCP ACK 报文后,将分配给它的 IP 地址和其他网络配置信息应用于自己的网络接口,完成网络配置。

在 DHCP 的实现过程中,所有的通信都是通过广播报文进行的,包括 DHCP Discover、DHCP Offer、DHCP Request 和 DHCP ACK 报文。DHCP 的实现可以提高网络管理的效率和可靠性,减少手动配置的工作量,并避免 IP 地址冲突等问题。

需要注意的是"DHCP租约"的概念, 相当于IP的有效期, 在租约期内客户端向DHCP服务器发生 DHCP REQUEST报文请求续租。如果租约到期改IP地址可能会被分配给其其它的客户端。

DHCP服务器中通过"客户端的MAC地址"标识客户端, 客户端申请IP地址后, DHCP服务器会把客户端的MAC地址和分配的IP记录到"租约数据库"中, 避免该IP被重复分配。

1.3 DHCP服务器部署

#1. 安装dhcp软件包
yum install dhcp-server -y


#2.编辑配置文件
#拷贝示例配置文件
cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf

vim /etc/dhcp/dhcpd.conf

#修改全局配置项, 添加dns设置
option domain-name "gopherabc.com";
option domain-name-servers dns1.gopherabc.com;

#添加子网
#子网172.16.0.0/24
subnet 172.16.0.0 netmask 255.255.255.0 {
  range 172.16.0.100 172.16.0.120;    #ip地址范围 100-120
  option domain-name-servers dns1.gopherabc.com;   #该子网的dns配置,优先于全局配置
  option domain-name "gopherabc.com";
  option routers 172.16.0.11;      #子网的默认网关
  option broadcast-address 172.16.0.255;       #广播地址
  default-lease-time 600;    #默认的DHCP租约时间, 此时间段内客户端续约继续使用此IP
  max-lease-time 7200;    #最大的客户端租用时间, 时间达到客户端不能续约, 避免某个客户端长期占用某IP
}

#3. 启动服务
systemctl enable --now dhcpd

dhcp服务器的 172.16.0.11/24 这个地址使用的是 LAN区段, 找台虚拟机网卡改为同样的LAN区段, 然后将IP配置为DHCP尝试自动获取:

 可以看到 客户端的地址自动获取为了 IP地址池中的第一个地址。

2. 简述DNS服务器原理,并搭建主-辅服务器,画出架构图(有几个主机,在什么网络,什么域名),再有原理解释文字,再是代码格式化块,编写代码,代码对必要的选项,完成流程有文字描述,有实践的过程和实践的结果。

2.1 DNS正向解析流程

以浏览器访问`www.gopherabc.com`为例:

1.  浏览器会先查询浏览器缓存和本机的hosts文件
2.  然后查询运营商的DNS服务器, local dns, 
3.  local dns会先查询自己的缓存, 
4.  local dns如果没有再到, 则会查询根服务器
5.  根服务器将 `.com`顶级域名服务器地址返回给local dns
6.  local dns 再向`.com`顶级域名服务器发起查询请求, 
7.  `.com`服务器将`.gopherabc.com`这个`域`所在的`权威DNS`地址返回(权威DNS服务器通常是你的域名服务的接入商, 比如域名在阿里云解析, 那权威域名服务器就会是阿里云的DNS服务器)
8.  local dns 向`权威DNS`服务器查询,
9.   `权威DNS`服务器  查询到`www`主机的地址, 返回给local dns。
10.  local dns得到`www.gopherabc.com`的地址后, 返回给客户端也就是浏览器, 并缓存在本地方便下次查询。

 递归查询: 客户端--->local dns这一段是递归查询, local dns将最终结果返回给了客户端

迭代查询: local dns--->根域名服务器查询, 根域名服务器没有直接返回结果, 而是返回的.com服务器的地址;

local dns不得向.com服务器查询,而.com服务器返回的却是权威DNS服务器, 这样一次又一次的查询是迭代

DNS缓存: 将解析数据放在离客户端近的地方,以此减少迭代查询的过程。

Local DNS: 又称缓存DNS, 像114.114.114.114就是国内最大的中立缓存DNS

 2.2 搭建主辅DNS

 搭建过程:

 1. 主从服务器安装bind及基本配置

#安装bind
dnf -y install bind bind-utils

#修改监听地址
vi /etc/named.conf
options {
#注释掉下面两行
// listen-on port 53 { 127.0.0.1; };
// allow-query { localhost; };
}

#检查配置文件语法
#主配置文件
named-checkconf

 2. 修改主服务器配置文件, 添加配置允许区域传输

vim /var/named/gopherabc.com.zone
options {
   ...
   allow-transfer { 192.168.56.13; };
   ...
}

#修改主服务器, 区域数据库解析文件, 添加从服务器NS记录

$TTL 1D
$ORIGIN gopherabc.com.
@       IN SOA  dns1 admin.gopherabc.com. (
                                        2023022701      ; serial
                                        3m      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN      NS      dns1
        IN      NS      dns3        ; 从服务器的NS记录
dns1    IN      A       192.168.56.11
dns3    IN      A       192.168.56.13   ; 从服务器的IP地址
www     IN      A       192.168.56.12
#检查语法并重启服务
[root@node01 etc]# systemctl restart named
[root@node01 etc]# named-c
named-checkconf    named-checkzone    named-compilezone  
[root@node01 etc]# named-checkconf
[root@node01 etc]# named-checkzone gopherabc.com /var/named/gopherabc.com.zone 
zone gopherabc.com/IN: loaded serial 2023022701
OK
[root@node01 etc]# systemctl restart named
[root@node01 etc]# rndc reload
server reload successful
[root@node01 etc]#

3. 修改从节点配置, 指向主节点

#安装bind
[root@node03 ~]# dnf -y install bind bind-utils

#修改主配置文件
[root@node03 ~]# vim /etc/named.conf
options {
	// listen-on port 53 { 127.0.0.1; };
	// allow-query { localhost; };
	// 不允许其它主机进行区域传输
	allow-transfer { none;};
}

#添加区域要传输的配置
[root@node03 ~]# vim /etc/named.rfc1912.zones
zone "gopherabc.com" IN {    // 要传输的区域
        type slave;		// 角色是从节点类型
        masters { 192.168.56.11; }; 	// 要同步的主节点是
        file "slaves/gopherabc.com.slave";	// 区域数据库配置文件的路径
};

// 从节点的区域数据库配置文件是通过拉取主节点自动生成的, 不需要自己写
#从节点启动服务
[root@node03 ~]# named-checkconf
[root@node03 ~]# systemctl enable named --now
[root@node03 ~]# rndc reload
server reload successful
[root@node03 ~]#

4. 验证测试

#测试节点
echo -e 'nameserver 192.168.56.11\nnameserver 192.168.56.13' >/etc/resolv.conf
dig www.gopherabc.com

关闭主节点的named服务, 然后测试:

然后启动主节点, 关闭从节点再测试:

3.搭建并实现智能DNS,架构图,原理解释文字,编写代码 ,代码对必要的选项,完成流程有文字描述,有实践的过程和实践的结果。

实现目标:

对于同一个域名 blog.gopherabc.org 来自172.16.0.0/24网段的请求解析为 172.16.0.20;

来自192.168.56.0/24网段的请求解析为 192.168.56.20

 概念:

acl: 划分ip地址。

view: 将acl划分的IP地址与指定的 区域数据库配置文件绑定。

dns01配置:

1.写主配置文件, 添加acl, 并使用view绑定到独立的区域配置文件

[root@node01 ~]# cat /etc/named.conf
//定义acl
acl bjnet {		//来至北京的流量
	192.168.56.0/24; //192.168.56.0/24网段属于bjnet这个acl
	192.168.56.7;	//仅指定IP
};

acl njnet {		//来至南京的流量
	172.16.0.0/24;
	172.16.0.7; 
};

acl othernet {	//其他地区的流量
	any;
};

//定义view
view bjview {
	match-clients { bjnet; };	//绑定acl
	//有两种写法
	//zone "gopherabc.org" {
	//	type master;
	//	file "gopherabc.org.bj.zone";
	//};
	include "/etc/named.bj.zone";	//绑定区域数据库配置文件
};

view njview {
	match-clients { njnet; };
	include "/etc/named.sh.zone";
};

view otherview {
	match-clients { othernet; };   //这里把北京和南京之外的查询请求都由/etc/named.rfc1912.zones这个区域数据库处理
	include "/etc/named.rfc1912.zones";
};

acl 和view 要写在options前面

需要注意的是一旦使用了view, 所有的区域解析文件必须放在view里面, 主配置文件中不能出现独立配置的zone, 都必须结合view使用

2.写独立的区域配置文件, 与view绑定的一一对应


[root@node01 ~]# cat /etc/named.bj.zones 	# bjview匹配的都使用这个区域配置文件
zone "gopherabc.org" IN {
 	type master;
        file "gopherabc.org.bj.zone";
};

[root@node01 ~]# cat /etc/named.nj.zones 	# njview匹配的都使用这个区域配置文件
zone "gopherabc.org" IN {
 	type master;
        file "gopherabc.org.nj.zone";
};

#修改权限
[root@node01 ~]# chown .named /etc/named.*

3.写区域数据库文件

[root@node01 ~]# cat /var/named/gopherabc.org.bj.zone 
$TTL 1D
$ORIGIN gopherabc.org.
@	IN SOA	dnsbj admin.gopherabc.org. (
					2023022803	; serial
					10s	; refresh
					3s	; retry
					1W	; expire
					3H )	; minimum
	IN	NS	dnsbj
dnsbj	IN	A	192.168.0.11
blog	IN	A	192.168.0.20
[root@node01 ~]#

[root@node01 ~]# cat /var/named/gopherabc.org.nj.zone 
$TTL 1D
$ORIGIN gopherabc.org.
@	IN SOA	dnsnj admin.gopherabc.com. (
					2023022803	; serial
					10s	; refresh
					3s	; retry
					1W	; expire
					3H )	; minimum
	IN	NS	dnsnj
dnsnj	IN	A	172.16.0.11
blog	IN	A	172.16.0.20
[root@node01 ~]# 
[root@node01 ~]# chown .named /var/named/gopherabc.org.*

4.检查语法

[root@node01 ~]# named-checkconf 
[root@node01 ~]# named-checkzone gopherabc.org /var/named/gopherabc.org.bj.zone 
zone gopherabc.org/IN: loaded serial 2023022803
OK
[root@node01 ~]# named-checkzone gopherabc.org /var/named/gopherabc.org.nj.zone 
zone gopherabc.org/IN: loaded serial 2023022803
OK
[root@node01 ~]# rndc reload

5.客户端测试

准备两台客户端, 分别是192.168.56.0/24, 172.16.0.0/24网段

client1: 192.168.56.7

 client2: 172.16.0.7

 如果是测试环境, 没有路由器的话, 需要在dns服务器192.168.56.11上面再添加一块172.16.0.0/24的网卡ip配置为172.16.0.11, 并开启ipv4转发;

然后在client2 172.16.0.7上面添加默认路由指向172.16.0.11即可。

  1. 开启ipv4转发

    sysctl -w net.ipv4.ip_forward=1

    echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf

  2. client2 添加默认路由

    ip route add default via 172.16.0.11 dev ens22

4. 使用iptables/firewalld/nftable实现 放行SSH,TELNET,FTP,WEB, 拒绝其他端口服务

iptables:

iptables -I INPUT 1 -p tcp -m multiport --dport 22,23,21,80 -j ACCEPT
iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 3 -j DROP
service iptables save

firewalld:

firewall-cmd --set-default-zone=public
firewall-cmd --add-service=ssh --add-service=telnet --add-service=ftp
firewall-cmd --add-port=80/tcp
firewall-cmd --runtime-to-permanent

nftable:

#创建规则表
nft add table inet account_table
#表中创建规则链,并绑定到INPUT链
nft add chain inet account_table account_filter_input_chain {type filter hook input priority 0\;}

#向表中的链添加放行规则
nft add rule inet account_table account_filter_input_chain tcp dport ssh accept
nft add rule inet account_table account_filter_input_chain tcp dport telnet accept
nft add rule inet account_table account_filter_input_chain tcp dport ftp accept
nft add rule inet account_table account_filter_input_chain tcp dport 80 accept
nft add rule inet account_table account_filter_input_chain drop

#保存规则
nft list ruleset >/etc/sysconfig/nftables.conf

7.NAT原理总结,使用iptables实现NAT,抓包分析NAT通信过程。

网络通信其实就是数据包的交互, 而A发的数据包如果到达B?

在网络中A和B都有一个唯一标识就是IP地址和MAC地址, 由于IPv4地址有限不可能给每一个计算机分配一个独立地址, 因此IP中有一部分需要拿来重复使用, 这部分IP叫做"私有IP" , 就是只能在本地局域网中通信。"私有IP"只能在局域网中使用, 不能与公网通信, 如果要与公网通信则需要借助"NAT地址转换"。

NAT地址转换是一种IP地址转换技术, 通常位于局域网的网络出口处, 它会将经过的特定的数据包解开更换其中的源IP,源端口,目的IP,目的端口。

比如有一台防火墙一个接口连接了运营商网络有公网IP地址, 而另一个接口连接了公司内网, 公司内网使用的"私有IP", 这些主机需要上网时发出的数据包到达防火墙, 防火墙就把数据包中的源IP地址更改为特定的网络IP地址, 然后从网卡发到公网上, 这些数据包也就相当于有了公网IP地址就能实现上网。

iptables实现NAT

#node01 配置:
sysctl -w net.ipv4.ip_forward=1
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf


#POSTROUTING链上出去的报文, 源地址是172.16.0.0/24 去往其他网段的数据包的源地址都转换为 192.168.56.11
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24  -j SNAT --to-source 192.168.56.11
service iptables save
#lan16-1配置:
配置默认网关指向172.16.0.11

 抓包分析:

以 lan16-1 ping www.baidu.com 为例

1. 分别在lan16-1 ens160, node01 ens160和ens224上面抓取icmp报文

2. [root@lan16-1 ~]# ping baidu.com

首先是lan16-1 的 ens160网卡的报文, 正常来说lan区段模式的虚拟机是无法连接外网的, 但是这里却ping通了。发出去的icmp报文源地址是自己, 目的地址是baidu.com这都是正常的。

然后是node01 的 ens224网卡, 这块网卡与 lan16-1 直连, 它们两个收到的报文是相同的。

最后看 node01 的 ens160网卡, 它转发的报文源地址是 192.168.56.11 它自己, 这里面就进行了nat转换, 将源地址 172.16.0.1 替换为了 192.168.56.11

8. IPTABLES实现SNAT和DNAT,并对规则持久保存

#SNAT, 将来至172.16.0.1去往其他网段的数据包的源地址都转换为192.168.56.11, 多用于内网访问外网环境
iptables -t nat -A POSTROUTING -p tcp -s 172.16.0.1 ! -d 172.16.0.0/24  -j SNAT --to-source 192.168.56.11


#DNAT, 将发往 192.168.56.11:80 的数据包的目的地址都修改为 172.16.0.1
iptables -t nat -A PREROUTING -d 192.168.56.11 --dport 80 -s 172.16.0.1 -j DNAT --to-todestination 172.16.0.1

service iptables save

9.通过编译、二进制安装MySQL5.7。要求完成一键完成脚本。

9.1 二进制安装 mysql 5.7

下载MySQL 5.7 二进制安装包

MySQL :: Download MySQL Community Server (Archived Versions)

 二进制包其实就是编译好的可执行程序, 下载解压后直接使用即可。

#安装依赖
yum -y install libaio numactl-libs
#准备工作
[root@node05 ~]# mkdir tools      #存放下载的文件
[root@node05 ~]# cd tools/
[root@node05 tools]# groupadd -r -g 306 mysql    #创建mysql账户和组
[root@node05 tools]# useradd -r -g 306 -u 306 -d /data/mysql mysql

[root@node05 tools]# mkdir -p /data/mysql    #创建mysql数据目录
[root@node05 tools]# chown mysql:mysql /data/mysql    #授权
[root@node05 tools]

上传二进制文件
tar xf mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.40-linux-glibc2.12-x86_64 /usr/local/mysql
cd /usr/local/mysql/

#添加mysql环境变量
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh


cat /etc/my.cnf 
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid


[client]
socket=/data/mysql/mysql.sock


#初始化mysql数据库
mysqld --initialize --user=mysql --datadir=/data/mysql
ll /data/mysql/


#查看mysql的初始密码
[root@node05 mysql]# grep password /data/mysql/mysql.log
2023-03-14T13:41:38.259392Z 1 [Note] A temporary password is generated for root@localhost: .ut%btw*(2DL
[root@node05 mysql]# 

#配置mysql服务文件
[root@node05 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@node05 mysql]# chkconfig --add mysqld
[root@node05 mysql]# service mysqld start
Starting MySQL. SUCCESS! 
[root@node05 mysql]#

报错:

[root@node05 mysql]# mysql -uroot -p
mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
[root@node05 mysql]#

[root@node05 mysql]# find / -name 'libncurses.so*'
/usr/lib64/libncurses.so.6
/usr/lib64/libncurses.so.6.1
[root@node05 mysql]# ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
[root@node05 mysql]#


[root@node05 mysql]# find / -name 'libtinfo.so.*'
/usr/lib64/libtinfo.so.6
/usr/lib64/libtinfo.so.6.1
[root@node05 mysql]# ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5

安装脚本:

#!/bin/bash
#
# fileName: install_mysql_binary.sh
# author: liAng
# mail: angl6112@163.com
# created: Tue 14 Mar 2023 10:42:57 PM CST
# 
### BEGIN INIT INFO
# Description:
# 1. 二进制安装mysql-5.7.40
# 2. 将mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz 与脚本放在同一目录,如果没有会自动下载
### END INIT INFO
set -e

cores=$(lscpu | awk -F'[: ]+' '/^CPU\(s\):/ {print $NF}')
PWD=$(dirname $(realpath ${BASH_SOURCE[0]}))
package_file="$PWD/mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz 与脚本放在同一目录"
user="mysql"
conf="/etc/my.cnf"
BASE_DIR="/usr/local"
DATA_DIR="/data/mysql"


function color(){
	case $1 in
		red)
			echo -e "\033[0;31m$2\033[0m"
			;;
		yellow)
			echo -e "\033[0;33m$2\033[0m"
			;;
		blue)
			echo -e "\033[0;36m$2\033[0m"
			;;
		green)
			echo -e "\033[0;32m$2\033[0m"
			;;
		*)
			echo -e "$@\n"
			;;
	esac
}


function Init(){
	color green "Start init."

	test -f $package_file || {
		color yellow "Warning: install package $package_file not found."
		color green "Downloading mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz..."
		wget -P $PWD https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz || {
			color red "Download failed."
			color red "Ple run command \
				'wget -P $PWD https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.40-linux-glibc2.12-x86_64.tar.gz'"
			exit
		}
	} && color green "Found installation package $package_file"

	color green "Start install libaio numactl-libs"
	yum -y install libaio numactl-libs || {
	color red "Error: yum failed."
	exit
  }

	color green "Create data dir, $DATA_DIR"
	test -d $DATA_DIR && {
		color red "Warning: $DATA_DIR already exist."
		exit
	} || mkdir -p $DATA_DIR
	
	color green "Create user, $user"
	id $user &>/dev/null || {
		groupadd $user
		useradd -r -g $user -s /bin/false -d $DATA_DIR $user
	}
    chown -R $user.$user $DATA_DIR
}

function CreateMyCnf(){
	color green "Create $conf."
cat >$conf<<EOF
[mysqld]
datadir=$DATA_DIR
skip_name_resolve=1
socket=$DATA_DIR/mysql.sock
log-error=$DATA_DIR/mysql.log
pid-file=$DATA_DIR/mysql.pid

[client]
socket=$DATA_DIR/mysql.sock
EOF
}

function ResolveDependencies(){
	test -f /usr/lib64/libncurses.so.5 || ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
	test -f  /usr/lib64/libtinfo.so.5 || ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
}

function Install(){
	color green "Decompressing $package_file..."
	cd $PWD &&
	tar xf $package_file -C $BASE_DIR/ && ln -s $BASE_DIR/mysql-5.7.40-linux-glibc2.12-x86_64 $BASE_DIR/mysql &&

	CreateMyCnf

	color green "Initialize mysql database."
	$BASE_DIR/mysql/bin/mysqld --initialize --user=$user --datadir=$DATA_DIR
    
	color green "Create the service startup file."
	cp -b $BASE_DIR/mysql/support-files/mysql.server /etc/init.d/mysqld
	chkconfig --add mysqld
    
	color green "Add Mysql PATH."
	echo "export PATH=${BASE_DIR}/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
}

function EchoInfo(){
	echo -e "\n"
	color blue '========================================================================='
	color blue "ROOT PASSWD: $(grep password $DATA_DIR/mysql.log | awk -F'[: ]+' '{print $NF}')"
	color blue "Run command '. /etc/profile.d/mysql.sh' to apply mysql PATH."
	color blue "About command:"
	color blue "   'service mysqld start' to run mysqld."
	color blue "   'chkconfig mysqld on' to run mysqld as system start."
	color blue "   'mysql -uroot -p' to connect the mysql."
	color blue "Use command 'mysqladmin passowrd -uroot -p' to change the root password."
	color blue '========================================================================='
}

function main(){
	Init
	ResolveDependencies
	Install
	EchoInfo
}

main

9.2 源码编译安装

下载源码包, 选择带有boost的

MySQL :: Download MySQL Community Server (Archived Versions)

wget -P ~/tools https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.40.tar.gz

 安装依赖包

yum -y install cmake gcc gcc-c++ cmake bison zlib-devel libcurl-devel libarchive boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dumper openssl openssl-devel ncurses-devel libtirpc-devel

#编译安装rpcsvc-proto
wget -P ~/tools https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz
tar xf rpcsvc-proto-1.4.tar.gz -C /usr/local/src/
cd  /usr/local/src/rpcsvc-proto-1.4
./configure && make -j 16 && make -j 16 install

编译安装

#编译安装
tar xf mysql-boost-5.7.40.tar.gz -C /usr/local/src/
ln -s /usr/local/src/mysql-5.7.40  /usr/local/src/mysql
cd  /usr/local/src/mysql
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/ \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DWITH_BOOST=boost \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

make -j 16 && make -j 16 install

#添加环境变量
echo "PATH=${BASE_DIR}/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh

#初始化数据库
mysqld --initialize --datadir=/data/mysql --user=mysql

保存数据库密码

配置service

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld

启动mysql,设置开机启动

service mysqld start
chkconfig mysqld on

登录MySQL

mysql -uroot -p

 修改mysql密码

 关于my.cnf

如果不存在配置文件5.7.40会使用默认配置。可以直接添加my.cnf, 重启mysql即可。

cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid

[client]
socket=/data/mysql/mysql.sock

安装脚本:

#!/bin/bash
#
# fileName: install_mysql_compile.sh
# author: liAng
# mail: angl6112@163.com
# created: Wed 15 Mar 2023 04:43:57 PM CST
# 
### BEGIN INIT INFO
# Description:
# 1. 编译安装mysql-5.7.40
# 2. 将mysql-boost-5.7.40.tar.gz与脚本放在同一目录, 如果没有会自动下载
### END INIT INFO
set -e


cores=$(lscpu | awk -F'[: ]+' '/^CPU\(s\):/ {print $NF}')
PWD=$(dirname $(realpath ${BASH_SOURCE[0]}))
package_file="$PWD/mysql-boost-5.7.40.tar.gz"
my_conf="/etc/my.cnf"
my_user="mysql"
initdb_log="$(mktemp)"
BASE_DIR="/usr/local"
DATA_DIR="/data/mysql"


function color(){
	case $1 in
		red)
			echo -e "\033[0;31m$2\033[0m"
			;;
		yellow)
			echo -e "\033[0;33m$2\033[0m"
			;;
		blue)
			echo -e "\033[0;36m$2\033[0m"
			;;
		green)
			echo -e "\033[0;32m$2\033[0m"
			;;
		*)
			echo "$2"
			;;
	esac
}


function Init(){
	color green "Start init..."
	test -f $package_file || {
		color yellow "Warning: installation package $package_file not found."
        color green "Downloading mysql-boost-5.7.40.tar.gz..."
		wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.40.tar.gz || {
            color red "Download failed."
            color blue "Ple run command 'wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.40.tar.gz'"
            exit
        }
	} && color green "found installation package $package_file"

	color green "Create user: $my_user"
	useradd -r -s /sbin/nologin -d $DATA_DIR $my_user
	color blue "`id $my_user`"	

	color green "Create data dir: $DATA_DIR"
	mkdir -p $DATA_DIR && chown $my_user.$my_user $DATA_DIR
	ls -ld $DATA_DIR
	
	if [ ! -d "$BASE_DIR/src" ];then
		mkdir -p $BASE_DIR/src && color green "Create src dir:$BASE_DIR/src success!"
	fi
}


function ResolveDependencies(){
	color green "Installing dependency packages..."
	yum -y install cmake gcc gcc-c++ cmake bison zlib-devel libcurl-devel libarchive \
boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel \
libaio-devel perl-Data-Dumper openssl openssl-devel ncurses-devel libtirpc-devel || {
	color red "Failed to install the dependency package."
	color blue "Ple run command 'yum -y install cmake gcc gcc-c++ cmake bison zlib-devel libcurl-devel libarchive boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel perl-Data-Dumper openssl openssl-devel ncurses-devel libtirpc-devel' to install dependency packages."
	exit
}
	InstallRpcsvcProto(){
		if [ -d "$BASE_DIR/src/rpcsvc-proto-1.4" ];then
			color yellow "$BASE_DIR/src/rpcsvc-proto-1.4 already installed."
		else	
			if [ -f "rpcsvc-proto-1.4.tar.gz" ];then
				color green "rpcsvc-proto-1.4.tar.gz already existed."
			else
				wget -P $PWD https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz || {
					color red "Source package rpcsvc-proto-1.4.tar.gz download failed."
					color red "Please re-download the \
						'https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz'\
						to this directory."
					exit
				}
			fi
			cd $PWD &&
			tar xf rpcsvc-proto-1.4.tar.gz -C $BASE_DIR/src/
			cd $BASE_DIR/src/rpcsvc-proto-1.4
			./configure && make -j $cores && make -j $cores install
		fi
	}
	
	if InstallRpcsvcProto ;then
		color green "rpcsvc-proto-1.4 installed success."
	else
		color red "rpcsvc-proto-1.4 installed failed."
		exit
	fi	
}

function CompileInstall(){
	cd $PWD &&
	color green "Unzip the source package."
	tar xf $package_file -C $BASE_DIR/src &&
	
	color green "Create a mysql soft connection."
	ln -s $BASE_DIR/src/mysql-5.7.40 $BASE_DIR/src/mysql &&
	
	color blue "Start compiler."
	color blue "CPU Cores: $cores"
	sleep 3
	cd $BASE_DIR/src/mysql &&
	cmake . \
	-DCMAKE_INSTALL_PREFIX=$BASE_DIR/mysql \
	-DMYSQL_DATADIR=$DATA_DIR \
	-DSYSCONFDIR=/etc/ \
	-DMYSQL_USER=$my_user \
	-DWITH_INNOBASE_STORAGE_ENGINE=1 \
	-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
	-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
	-DWITH_PARTITION_STORAGE_ENGINE=1 \
	-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
	-DWITH_DEBUG=0 \
	-DWITH_READLINE=1 \
	-DWITH_SSL=system \
	-DWITH_ZLIB=system \
	-DWITH_LIBWRAP=0 \
	-DWITH_BOOST=boost \
	-DENABLED_LOCAL_INFILE=1 \
	-DMYSQL_UNIX_ADDR=$DATA_DIR/mysql.sock \
	-DDEFAULT_CHARSET=utf8mb4 \
	-DDEFAULT_COLLATION=utf8mb4_general_ci
	
	if [ $? -ne 0 ];then
		color red "cmake failed."
		exit
	fi

	make -j $cores && make -j $cores install && \
		color green "MySQL 5.7.40 Compile and installed success!" || {
		color red "make or make install failed."
		exit
	}
	
	color green "Config mysql path env."
	echo "PATH=${BASE_DIR}/mysql/bin:$PATH" >/etc/profile.d/mysql.sh

	color green "Start initializing the database."
	$BASE_DIR/mysql/bin/mysqld --initialize --datadir=$DATA_DIR --user=$my_user &>$initdb_log 

}


function CreateMyCnf(){
	if [ -f $my_conf ];then
		break
	else
cat >$my_conf<<EOF
[mysqld]
datadir=$DATA_DIR
skip_name_resolve=1
socket=$DATA_DIR/mysql.sock
log-error=$DATA_DIR/mysql.log
pid-file=$DATA_DIR/mysql.pid

[client]
socket=$DATA_DIR/mysql.sock
EOF
	fi
	color green "Create $my_conf."
}


function AddService(){
	cp $BASE_DIR/mysql/support-files/mysql.server /etc/init.d/mysqld
	chkconfig --add mysqld && color green "Add mysql services."
}


function EchoInfo(){
	echo -e "\n"
	color blue '========================================================================='
	color blue "ROOT PASSWORD: $(grep password $initdb_log | awk -F'[: ]+' '{print $NF}')"
	color blue "Run command '. /etc/profile.d/mysql.sh' to apply mysql PATH."
	color blue "About command:"
	color blue "   'service mysqld start' to run mysqld."
	color blue "   'chkconfig mysqld on' to run mysqld at system start."
	color blue "   'mysql -uroot -p' to connect the mysql."
	color blue "Use command 'mysqladmin passowrd -uroot -p' to change the root password."
	color blue '========================================================================='
	
} 


function main(){
	Init
	ResolveDependencies
	CompileInstall
	CreateMyCnf
	AddService
	EchoInfo
}


main

10.Mariadb10.4.25的二进制安装。

下载二进制安装包

Download MariaDB Server - MariaDB.org

https://archive.mariadb.org/mariadb-10.4.25/bintar-linux-systemd-x86_64/mariadb-10.4.25-linux-systemd-x86_64.tar.gz

 准备mysql用户和组

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

数据目录

mkdir -p /data/mysql
chown -R mysql.mysql /data/mysql

#程序目录
mkdir /usr/local/mysql

配置文件

vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock

解压二进制文件

tar xf mariadb-10.4.25-linux-systemd-x86_64.tar.gz -C /usr/local/
ln -s /usr/local/mariadb-10.4.25-linux-systemd-x86_64 /usr/local/mysql

初始化数据库

/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --defaults-file=/etc/my.cnf

 准备数据库启动文件

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start

 

配置环境变量

echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh

连接数据库

ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5

安装脚本:

#!/bin/bash
#
# fileName: install_mariadb_binary.sh
# author: liAng
# mail: angl6112@163.com
# created: Tue 16 Mar 2023 80:32:49 PM CST
# 
### BEGIN INIT INFO
# Description:
# 1. 二进制安装mariadb-10.4.25
# 2. 将mariadb-10.4.25-linux-systemd-x86_64.tar.gz 与脚本放在同一目录,如果没有会自动下载
### END INIT INFO
set -e


cores=$(lscpu | awk -F'[: ]+' '/^CPU\(s\):/ {print $NF}')
PWD=$(dirname $(realpath ${BASH_SOURCE[0]}))
package_file="$PWD/mariadb-10.4.25-linux-systemd-x86_64.tar.gz"
package_url="https://archive.mariadb.org/mariadb-10.4.25/bintar-linux-systemd-x86_64/mariadb-10.4.25-linux-systemd-x86_64.tar.gz"
user="mysql"
conf="/etc/my.cnf"
BASE_DIR="/usr/local"
DATA_DIR="/data/mysql"


function color(){
	case $1 in
		red)
			echo -e "\033[0;31m$2\033[0m"
			;;
		yellow)
			echo -e "\033[0;33m$2\033[0m"
			;;
		blue)
			echo -e "\033[0;36m$2\033[0m"
			;;
		green)
			echo -e "\033[0;32m$2\033[0m"
			;;
		*)
			echo -e "$@\n"
			;;
	esac
}


function Init(){
	color green "Start init."

	test -f $package_file || {
		color yellow "Warning: install package $package_file not found."
		color green "Downloading ${package_file##*/}..."
		wget -P $PWD $package_url || {
			color red "Download failed."
			color red "Ple run command \
				'wget -P $PWD $package_url' to get mairadb package."
			exit
		}
	} && color green "Found installation package $package_file"

	color green "Start install libaio numactl-libs"
	yum -y install libaio numactl-libs || {
	color red "Error: yum install libaio numactl-libs failed."
	exit
  }

	color green "Create data dir: $DATA_DIR"
	test -d $DATA_DIR && {
		color red "Warning: $DATA_DIR already exist."
		exit
	} || mkdir -p $DATA_DIR

	color green "Create user: $user"
	id $user &>/dev/null || {
		groupadd $user
		useradd -r -g $user -s /bin/false -d $DATA_DIR $user
	}
	chown -R $user.$user $DATA_DIR

}

function CreateMyCnf(){
	color green "Create $conf."
cat >$conf<<EOF
[mysqld]
datadir=$DATA_DIR
skip_name_resolve=1
socket=$DATA_DIR/mysql.sock
log-error=$DATA_DIR/mysql.log
pid-file=$DATA_DIR/mysql.pid

[client]
socket=$DATA_DIR/mysql.sock
EOF
}

function ResolveDependencies(){
	test -f /usr/lib64/libncurses.so.5 || ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5
	test -f  /usr/lib64/libtinfo.so.5 || ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
}

function Install(){
	color green "Decompressing $package_file..."
	cd $PWD &&
	tar xf ${package_file##*/} -C $BASE_DIR/ && ln -s $BASE_DIR/mariadb-* $BASE_DIR/mysql || {
		color red "Decompressing $package_file to $BASE_DIR failed."
	}
	color blue "$BASE_DIR/mysql is a symlink to $BASE_DIR/mariadb-*"

	CreateMyCnf

	color green "Initialize mysql database."
	$BASE_DIR/mysql/scripts/mysql_install_db --user=$user --datadir=$DATA_DIR --defaults-file=$conf
    
	color green "Create the service startup file."
	cp -b $BASE_DIR/mysql/support-files/mysql.server /etc/init.d/mysqld
	chkconfig --add mysqld
    
	color green "Add Mysql PATH."
	echo "export PATH=${BASE_DIR}/mysql/bin:$PATH" >/etc/profile.d/mysql.sh
}

function EchoInfo(){
	echo -e "\n"
	color blue '========================================================================='
	color blue "root  password: None" 
	color blue "mysql password: None"
	color blue "About command:"
	color blue "   '. /etc/profile.d/mysql.sh' to apply mysql PATH."
	color blue "   'service mysqld start' to run mysqld."
	color blue "   'chkconfig mysqld on' to run mysqld as system start."
	color blue "   'mysql' to connect the mysql as root."
	color blue "   'mysqladmin passowrd -uroot -p' to change the root password."
	color blue '========================================================================='
}

function main(){
	Init
	ResolveDependencies
	Install
	EchoInfo
}

main

执行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值