CentOS-7.6(1810)虚拟机模板制作

CentOS-7.6(1810)虚拟机模板制作

  • 基于RHEL7.6的CentOS-7.6(1810)在12月初正式发布了
  • 发行注记
  • 顺便更新一下虚拟机模板,这里记录一下操作过程。

下载镜像

创建虚拟机

  • 这里使用VMware Workstation 14 Pro 版本号14.1.3 build-9474260
  • 虚拟机规格
    • 客户机操作系统版本Red Hat Enterprise Linux 7 64 位
    • 处理器数量1
    • 内存2GB
    • 硬盘40GB
    • 网络适配器NAT模式

安装操作系统

  • 语言选择English
  • 软件包选择Minimal Install
  • 硬盘分区
    • /dev/sda1boot分区、1GB、EXT4
    • /dev/sda2/分区、39GB、XFS
    • 这里不使用swap分区,有需要可以自己增加swap分区
  • 网络设置
    • NAT地址段为172.16.80.0/24
    • 这里设置为
      • IP地址172.16.80.200
      • 子网掩码255.255.255.0
      • 网关172.16.80.2
      • DNS114.114.114.114
  • 时区选择Asia/Shanghai
  • 打开网络对时
  • KDUMP看情况选择打开或者关闭,这里我选择关闭
  • 设置ROOT密码

操作系统启动后初始化设置

关闭SELINUX

1
2
sed -i 's,^SELINUX=.*,SELINUX=disabled,' /etc/selinux/config
setenforce 0

关闭防火墙服务

1
systemctl disable --now firewalld.service

清空iptables规则

1
2
3
4
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

配置ssh证书登录

  • 通过ssh命令生成密钥对
  • 将~/.ssh/id_rsa.pub提取出来
1
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa

添加sysctl参数

fs参数

1
2
3
4
5
6
7
8
9
10
11
12
cat > /etc/sysctl.d/99-fs.conf <<EOF
# 最大文件句柄数
fs.file-max=1048576
# 最大文件打开数
fs.nr_open=1048576
# 同一时间异步IO请求数
fs.aio-max-nr=1048576
# 在CentOS7.4引入了一个新的参数来控制内核的行为。
# /proc/sys/fs/may_detach_mounts 默认设置为0
# 当系统有容器运行的时候,需要将该值设置为1。
fs.may_detach_mounts=1
EOF

vm参数

1
2
3
4
5
6
7
8
9
10
cat > /etc/sysctl.d/99-vm.conf <<EOF
# 内存耗尽才使用swap分区
vm.swappiness=10
# 当内存耗尽时,内核会触发OOM killer根据oom_score杀掉最耗内存的进程
vm.panic_on_oom=0
# 允许overcommit
vm.overcommit_memory=1
# 定义了进程能拥有的最多内存区域,默认65536
vm.max_map_count=262144
EOF

net参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
cat > /etc/sysctl.d/99-net.conf <<EOF
# 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤
net.bridge.bridge-nf-call-arptables=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 关闭严格校验数据包的反向路径,默认值1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 进程间通信发送数据, 默认100
net.unix.max_dgram_qlen=512
# 设置 conntrack 的上限
net.netfilter.nf_conntrack_max=1048576
# 设置连接跟踪表中处于TIME_WAIT状态的超时时间
net.netfilter.nf_conntrack_tcp_timeout_timewait=30
# 设置连接跟踪表中TCP连接超时时间
net.netfilter.nf_conntrack_tcp_timeout_established=1200
# 端口最大的监听队列的长度
net.core.somaxconn=21644
# 接收自网卡、但未被内核协议栈处理的报文队列长度
net.core.netdev_max_backlog=262144
# 系统无内存压力、启动压力模式阈值、最大值,单位为页的数量
#net.ipv4.tcp_mem=1541646 2055528 3083292
# 内核socket接收缓存区字节数min/default/max
net.core.rmem=4096 65536 8388608
# 内核socket发送缓存区字节数min/default/max
net.core.wmem=4096 65536 8388608
# 开启自动调节缓存模式
net.ipv4.tcp_moderate_rcvbuf=1
# TCP阻塞控制算法BBR,Linux内核版本4.9开始内置BBR算法
#net.ipv4.tcp_congestion_control=bbr
#net.core.default_qdisc=fq
# 用作本地随机TCP端口的范围
net.ipv4.ip_local_port_range=10000 65000
# 打开ipv4数据包转发
net.ipv4.ip_forward=1
# 允许应用程序能够绑定到不属于本地网卡的地址
net.ipv4.ip_nonlocal_bind=1
# 系统中处于 SYN_RECV 状态的 TCP 连接数量
net.ipv4.tcp_max_syn_backlog=16384
# 内核中管理 TIME_WAIT 状态的数量
net.ipv4.tcp_max_tw_buckets=5000
# 指定重发 SYN/ACK 的次数
net.ipv4.tcp_synack_retries=2
# TCP连接中TIME_WAIT sockets的快速回收
# 4.12内核版本开始移除了 tcp_tw_recycle
net.ipv4.tcp_tw_recycle=0
# 不属于任何进程的tcp socket最大数量. 超过这个数量的socket会被reset, 并告警
net.ipv4.tcp_max_orphans=1024
# TCP FIN报文重试次数
net.ipv4.tcp_orphan_retries=8
# 加快系统关闭处于 FIN_WAIT2 状态的 TCP 连接
net.ipv4.tcp_fin_timeout=15
# TCP连接keepalive的持续时间,默认7200
net.ipv4.tcp_keepalive_time=600
# TCP keepalive探测包发送间隔
net.ipv4.tcp_keepalive_intvl=30
# TCP keepalive探测包重试次数
net.ipv4.tcp_keepalive_probes=10
# TCP FastOpen
# 0:关闭 ; 1:作为客户端时使用 ; 2:作为服务器端时使用 ; 3:无论作为客户端还是服务器端都使用
net.ipv4.tcp_fastopen=3
# 限制TCP重传次数
net.ipv4.tcp_retries1=3
# TCP重传次数到达上限时,关闭TCP连接
net.ipv4.tcp_retries2=15
EOF

修改limits参数

1
2
3
4
5
6
7
8
cat > /etc/security/limits.d/99-centos.conf <<EOF
* - nproc 1048576
* - nofile 1048576
* - core unlimited
root - nproc 1048576
root - nofile 1048576
root - core unlimited
EOF

修改systemd默认值

1
2
3
4
5
6
sed -r \
-e 's,^#(DefaultLimitCORE)=,\1=1048576,' \
-e 's,^#(DefaultLimitNOFILE)=,\1=1048576,' \
-e 's,^#(DefaultLimitNPROC)=,\1=1048576,' \
-e 's,^#(DefaultTasksMax)=,\1=1048576,' \
-i.bak /etc/systemd/system.conf

修改journal设置

1
2
3
4
5
sed -e 's,^#Compress=yes,Compress=yes,' \
-e 's,^#SystemMaxUse=,SystemMaxUse=2G,' \
-e 's,^#Seal=yes,Seal=yes,' \
-e 's,^#RateLimitBurst=1000,RateLimitBurst=5000,' \
-i.bak /etc/systemd/journald.conf

修改rsyslog配置

rsyslog会重复收集journal的日志

1
2
3
4
sed -r \
-e 's/^\$ModLoad imjournal/#&/' \
-e 's/^\$IMJournalStateFile/#&/' \
-i.bak /etc/rsyslog.conf

修改终端提示符

1
2
3
export PS1="[\t]\[$(tput setaf 1)\][\u@\h:\W]\[$(tput setaf 7)\]\\$ \[$(tput sgr0)\]"

echo 'export PS1="[\t]\[$(tput setaf 1)\][\u@\h:\W]\[$(tput setaf 7)\]\\$ \[$(tput sgr0)\]"' >> ~/.bashrc

修改网卡配置信息

  • CentOS安装设置网卡后,会添加很多不需要的字段,例如UUID、HWADDR什么的
  • 删减后字段信息如下
1
2
3
4
5
6
7
8
9
10
11
12
cat /etc/sysconfig/network-scripts/ifcfg-ens33 
TYPE=Ethernet
BOOTPROTO=none
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=172.16.80.200
NETMASK=255.255.255.0
GATEWAY=172.16.80.2
DNS1=114.114.114.114
NM_CONTROLLED=no
USERCTL=no

修改YUM源

替换成阿里云的源

1
2
3
4
sed -e 's,^mirrorlist,#mirrorlist,g' \
-e 's,^#baseurl,baseurl,g' \
-e 's,http://mirror.centos.org,https://mirrors.aliyun.com,g' \
-i /etc/yum.repos.d/*.repo

安装EPEL源

1
yum install epel-release -y

修改EPEL源

1
2
3
4
5
sed -e 's,^#baseurl,baseurl,g' \
-e 's,^metalink,#metalink,g' \
-e 's,^mirrorlist=,#mirrorlist=,g' \
-e 's,http://download.fedoraproject.org/pub,https://mirrors.aliyun.com,g' \
-i /etc/yum.repos.d/epel.repo

更新软件包

通常来说,安装完操作系统,都需要更新一下软件包

1
yum update -y

安装常用软件包

CentOS最小化安装不能满足我的使用,需要额外安装一些软件包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
yum groups install base -y
yum install -y nc \
git \
vim \
ipvsadm \
tree \
dstat \
iotop \
htop \
socat \
ipset\
conntrack \
tcpdump \
wireshark \
bcc-tools \
perf \
trace-cmd \
systemtap \
nethogs \
lrzsz \
jq

修改HISTORY参数

1
2
3
4
5
6
7
cat > /etc/profile.d/history.sh <<EOF
export HISTSIZE=10000
export HISTFILESIZE=10000
export HISTCONTROL=ignoredups
export HISTTIMEFORMAT="`whoami` %F %T "
export HISTIGNORE="ls:pwd:ll:ls -l:ls -a:ll -a"
EOF

修改时区

1
timedatectl set-timezone Asia/Shanghai

启动NTP网络对时

1
systemctl enable chronyd.service

修改LANG默认值

1
2
3
localectl set-locale LANG=en_US.UTF-8
localectl set-keymap us
localectl set-x11-keymap us

修改SSH配置

这里禁用root通过密码方式登录,修改默认端口222233

1
2
3
4
sed -e 's,^PermitRootLogin.*,PermitRootLogin without-password,' \
-e 's,^#UseDNS no,UseDNS no,' \
-e 's,^#Port 22,Port 2233,' \
-i.bak /etc/ssh/sshd_config

修改CPUfreq调节器

为了让 CPU 发挥最大性能,将 CPUfreq 调节器模式设置为 performance 模式。

查看调节模式

通过cpupower命令查看系统支持的调节模式

1
cpupower frequency-info --governors

示例输出,可以看到支持performancepowersave两种模式

1
2
analyzing CPU 0:
available cpufreq governors: performance powersave

如果命令输出如下,则不支持CPUfreq调节

1
2
analyzing CPU 0:
available cpufreq governors: Not Available

查看当前调节模式

通过 cpupower 命令查看系统当前的 CPUfreq 调节器模式

1
cpupower frequency-info --policy

示例输出

1
2
3
4
analyzing CPU 0:
current policy: frequency should be within 800 MHz and 4.60 GHz.
The governor "powersave" may decide which speed to use
within this range.

可以看到当前的调节器模式是powersave

修改调节模式

通过cpupower命令修改CPUfreq调节模式

1
cpupower frequency-set --governor performance

可选操作

禁用IPV6设置

1
2
3
4
5
6
cat > /etc/sysctl.d/99-disable-ipv6.conf <<EOF
# 禁用ipv6
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
EOF

禁用ICMP

1
2
3
4
cat > /etc/sysctl.d/99-disable-icmp.conf <<EOF
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_broadcasts=1
EOF

添加vim设置

将vim设置写入~/.vimrc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
cat > ~/.vimrc <<EOF
" 显示行号
set number
" 高亮光标所在行
set cursorline
" 打开语法显示
syntax on
" 关闭备份
set nobackup
" 没有保存或文件只读时弹出确认
set confirm
" 禁用modeline功能
set nomodeline
" tab缩进
set tabstop=4
set shiftwidth=4
set expandtab
set smarttab
" 默认缩进4个空格大小
set shiftwidth=4
" 文件自动检测外部更改
set autoread
" 高亮查找匹配
set hlsearch
" 显示匹配
set showmatch
" 背景色设置为黑色
set background=dark
" 浅色高亮显示当前行
autocmd InsertLeave * se nocul
" 显示输入的命令
set showcmd
" 字符编码
set encoding=utf-8
" 开启终端256色显示
set t_Co=256
" 增量式搜索
set incsearch
" 设置默认进行大小写不敏感查找
set ignorecase
" 如果有一个大写字母,则切换到大小写敏感查找
set smartcase
" 不产生swap文件
set noswapfile
" 设置备份时的行为为覆盖
set backupcopy=yes
" 关闭提示音
set noerrorbells
" 历史记录
set history=10000
" 显示行尾空格
set listchars=tab:»■,trail:■
" 显示非可见字符
set list
" c文件自动缩进
set cindent
" 文件自动缩进
set autoindent
" 检测文件类型
filetype on
" 智能缩进
set smartindent
EOF

配置开发语言国内源

Python

1
2
3
4
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config set global.trusted-host mirrors.aliyun.com
pip config set global.timeout 120
pip config set install.trusted-host mirrors.aliyun.com

NPM

1
2
3
4
5
6
7
8
9
npm config set registry https://mirrors.huaweicloud.com/repository/npm/
npm config set disturl https://mirrors.huaweicloud.com/nodejs
npm config set sass_binary_site https://mirrors.huaweicloud.com/node-sass
npm config set phantomjs_cdnurl https://mirrors.huaweicloud.com/phantomjs
npm config set chromedriver_cdnurl https://mirrors.huaweicloud.com/chromedriver
npm config set operadriver_cdnurl https://mirrors.huaweicloud.com/operadriver
npm config set electron_mirror https://mirrors.huaweicloud.com/electron/
npm config set python_mirror https://mirrors.huaweicloud.com/python
npm cache clean -f

Golang

  1. Golang 1.11+
  2. 开启Go Module
1
2
go env -w GO111MODULE=on
go env -w GOPROXY='https://mirrors.aliyun.com/goproxy/'
  1. 针对Golang 1.13+
1
2
go env -w GO111MODULE=on
go env -w GOPROXY='https://goproxy.cn,https://mirrors.aliyun.com/goproxy/,http://mirrors.huaweicloud.com/goproxy,direct'

Maven

阿里云代理了Maven的公共仓库,这里是说明文档

Maven配置

打开 Maven 的配置文件(windows机器一般在maven安装目录的conf/settings.xml),在<mirrors></mirrors>标签中添加 mirror 子节点:

1
2
3
4
5
6
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>aliyunmaven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

如果想使用其它代理仓库,可在<repository></repository>节点中加入对应的仓库使用地址。以使用spring代理仓为例:

1
2
3
4
5
6
7
8
9
10
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>

Gradle配置

在 build.gradle 文件中加入以下代码:

1
2
3
4
5
6
7
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
mavenLocal()
mavenCentral()
}
}

如果想使用 maven.aliyun.com 提供的其它代理仓,以使用 spring 仓为例,代码如下:

1
2
3
4
5
6
7
8
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/public/' }
maven { url 'https://maven.aliyun.com/repository/spring/'}
mavenLocal()
mavenCentral()
}
}

配置内核模块

配置lvs模块

LVS的调度算法简介

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
# 负载均衡调度算法-最少连接
ip_vs_lc
# 负载均衡调度算法-加权最少连接
ip_vs_wlc
# 负载均衡调度算法-轮询
ip_vs_rr
# 负载均衡调度算法-加权轮询
ip_vs_wrr
# 源地址散列调度算法
ip_vs_sh
EOF

配置连接状态跟踪模块

1
2
3
4
5
cat > /etc/modules-load.d/nf_conntrack.conf <<EOF
nf_conntrack
nf_conntrack_ipv4
#nf_conntrack_ipv6
EOF

配置kvm模块

1
2
3
4
5
6
7
8
9
10
cat > /etc/modules-load.d/kvm.conf <<EOF
# Intel CPU开启嵌套虚拟化
options kvm-intel nested=1
options kvm-intel enable_shadow_vmcs=1
options kvm-intel enable_apicv=1
options kvm-intel ept=1

# AMD CPU开启嵌套虚拟化
#options kvm-amd nested=1
EOF

安装docker

版本可以自行选择自带的Docker1.13或者docker-ce

这里以docker-ce 最新版本为例

  • 清理旧Docker包
1
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
  • 安装Docker依赖包
1
yum install -y yum-utils device-mapper-persistent-data lvm2
  • 添加Docker-CE源
1
yum-config-manager --add-repo http://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
  • 修改Docker—CE源地址
1
sed -e 's,https://download.docker.com,https://mirrors.aliyun.com/docker-ce,g' -i /etc/yum.repos.d/docker-ce.repo
  • 安装Docker-CE
1
yum install docker-ce -y
  • 配置Docker启动参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"cgroup-parent": "systemd.slice",
"data-root": "/var/lib/docker",
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
},
"nproc": {
"Name": "nproc",
"Hard": 65535,
"Soft": 65535
}
},
"exec-opts": [
"native.cgroupdriver=systemd"
],
"insecure-registries": [],
"log-driver": "json-file",
"log-opts": {
"max-file": "3",
"max-size": "100m"
},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"registry-mirrors": [
"https://pqbap4ya.mirror.aliyuncs.com"
],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
  • 设置Docker命令补全
1
cp /usr/share/bash-completion/completions/docker /etc/bash_completion.d/
  • 禁用Docker-CE源
1
yum-config-manager --disable docker-ce-stable

清理现场

清理yum缓存

1
yum clean all

关闭操作系统

1
history -c && sys-unconfig