1.搭建dhcp服务,实现ip地址申请分发。需要有DHCP原理分析,需要画图
1.1 dhcp的基本概念
dhcp (Dynamic Host Configuration Protocol) 动态主机配置协议, 是一种C/S架构, 作用是自动为局域网内的主机自动分配IP, 子网掩码,网关,DNS等信息。客户端获得ip信息后自动配置相应IP。
1.2 dhcp的实现原理
-
DHCP 客户端在启动时向网络广播 DHCP Discover报文,以寻求可用的 DHCP 服务器。
-
DHCP 服务器接收到 DHCP Discover 报文后,将 DHCP Offer报文广播回客户端。该报文包含可用的 IP 地址、子网掩码、默认网关、DNS 服务器等网络配置信息。(可能会有多台DHCP服务器响应)
-
DHCP 客户端从多个 DHCP Offer 报文中选择其中一个,并向 DHCP 服务器发送 DHCP Request报文,请求分配选中的 IP 地址。
-
DHCP 服务器接收到 DHCP Request 报文后,将分配给客户端的 IP 地址等配置信息打包在 DHCP ACK报文中,向客户端广播该报文。
-
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即可。
-
开启ipv4转发
sysctl -w net.ipv4.ip_forward=1
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
-
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
准备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
执行结果: