零、 环境

  • OS: Kylin Server V10
  • Arch: aarch64
  • MySQL release: mysql-5.7.40-Linux-aarch64
  • HW: 4c16g

一、 安装前准备

1.1 安装依赖

yum install gcc gcc-c++ cmake

1.2 下载安装包

下载带有boost的安装, 省去单独安装boost的步骤

下载链接

编译安装

2.1 解压

tar -xzvf mysql-boost-5.7.43.tar.gz

2.2 编译安装

cd mysql-5.7.43

mkdir bld && cd bld

cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DCOMPILATION_COMMENT='Mysqlma' \
-DWITH_READLINE=ON \
-DWITH_BOOST=/root/mysql-5.7.43/boost/boost_1_59_0 \
-DSYSCONFDIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock

make && make install

三、 部署

参考另外一篇文章

四、 相关问题

4.1 RPC 相关问题

问题描述: rpc相关头文件找不到

--   Package 'libtirpc', required by 'virtual:world', not found
CMake Error at cmake/rpc.cmake:76 (MESSAGE):
Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc
Call Stack (most recent call first):
rapid/plugin/group_replication/configure.cmake:60 (MYSQL_CHECK_RPC)
rapid/plugin/group_replication/CMakeLists.txt:25 (INCLUDE)

解决:
yum install libtirpc libtirpc-devel

但是在 Kylin V10 aarch64 下找不到 libtirpc-devel

只好从其他操作系统里 /usr/bin/rpc 拷贝一份

零、 环境

字段 位置
ENV: vmware centos7.2 4c8g
VER: mysql release: 5.7.34
BIN_PATH: /usr/local/mysql
DATA-DIR: /data/mysql
CONFIGURE: /etc/my.cnf

一、安装前准备

1.0 安装依赖

yum install libaio

1.1 下载

下载地址

1.2 解压二进制文件

tar -xzvf mysql-5.7.43-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local
ln -s /usr/local/mysql-5.7.43-linux-glibc2.12-x86_64 /usr/local/mysql

1.3 创建相关目录和用户及组

groupadd mysql
useradd -r -g mysql -s /bin/false mysql
mkdir -p /data/mysql
mkdir -p /usr/local/mysql/tmp
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /usr/local/mysql

1.4 为MySQL实例创建配置文件

vim /etc/my.cnf

[mysqld]
user=mysql
datadir=/data/mysql/
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/mysql-err.log
port=3306
server-id=1
innodb_buffer_pool_size = 50G
lower_case_table_names=0
tmpdir=/usr/local/mysql/tmp/
lc_messages_dir=/usr/local/mysql/share
log_timestamps=SYSTEM

二、 安装

2.1 初始化实例

./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

这里注意如下几个点:

  • 保证 /usr/local/mysql/data/mysql/usr/local/mysql/tmp的权限为 mysql:mysql
  • 保证 /data/mysql 目录为空

To initialize the data directory, invoke mysqld with the --initialize or --initialize-insecure option, depending on whether you want the server to generate a random initial password for the 'root'@'localhost' account, or to create that account with no password:

Use --initialize for “secure by default” installation (that is, including generation of a random initial root password). In this case, the password is marked as expired and you must choose a new one.

With --initialize-insecure , no root password is generated. This is insecure; it is assumed that you intend to assign a password to the account in a timely fashion before putting the server into production use.

可以使用 grep "password" /path to you mysql-err.log 找到使用--initialize生成的随机密码

三、 管理 MySQL

3.1 传统方式管理

  • 配置管理文件
    cp -a /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld

  • 修改如下两行 (大约46/47两行)
    vim /etc/rc.d/init.d/mysqld
    basedir=/usr/local/mysql
    datadir=/data/mysql

  • 管理 mysql
    /etc/rc.d/init.d/mysql start / status / stop / reload / restart

3.2 使用 systemd 管理

  • 完成传统方式管理的配置之后添加文件如下
    vim /usr/lib/systemd/system/mysqld.service

    # vim /usr/lib/systemd/system/mysqld.service
    [Unit]
    Documentation=man:systemd-sysv-generator(8)
    SourcePath=/etc/rc.d/init.d/mysqld
    Description=LSB: start and stop MySQL
    Before=runlevel2.target
    Before=runlevel3.target
    Before=runlevel4.target
    Before=runlevel5.target
    Before=shutdown.target
    After=network-online.target
    After=remote-fs.target
    After=ypbind.service
    After=nscd.service
    After=ldap.service
    After=ntpd.service
    After=xntpd.service
    After=network-online.target
    After=sshd.service
    Wants=network-online.target
    Conflicts=shutdown.target

    [Service]
    Type=forking
    Restart=no
    TimeoutSec=5min
    IgnoreSIGPIPE=no
    KillMode=process
    GuessMainPID=no
    RemainAfterExit=yes
    ExecStart=/etc/rc.d/init.d/mysqld start
    ExecStop=/etc/rc.d/init.d/mysqld stop
    ExecReload=/etc/rc.d/init.d/mysqld reload

    systemctl daemon-reload
    systemctl enable mysql --now
    systemctl status mysql

四、 MySQL 配置文件参数优化

仅供参考:

[client]                                        #客户端配置
port= 3306 #监听端口
socket= /tmp/mysql.sock #socket通信文件
default-character-set = utf8 #客户端字符编码

[mysql] #终端管理
prompt="MySQL [\d]> " #prompt="\\u@\\h:\\d>" 终端连接后显示后用户、主机、当前数据库
no-auto-rehash #auto-rehash 命令行自动补全功能

[mysqld] #服务器配置
port = 3306 #端口
socket = /tmp/mysql.sock #套接字
datadir = /data/mysql #数据库文件所在目录
basedir = /usr/local/mysql #基准路径,其它路径都相对于此路径
pid-file = /usr/local/mysql/mysql.pid #pid文件
user = mysql #管理用户
server-id=1 #本机序列号
init-connect = 'SET NAMES utf8' #当一个连接进来时,做一些操作,此处为连接创建时设置字符编码
character_set_server=utf8 #服务器默认字符集
#skip-networking #开启则彻底关闭mysql的TCP/IP连接方式
back_log = 300 #并发是等待的数量
open_files_limit = 65535 #打开的文件描述符限制
binlog_cache_size = 1M #事务未提交时会记录到cache,等到事务提交,则把日志持久化到磁盘,默认32k,如果事务比此值大,会使用磁盘临时文件替代
max_heap_table_size = 8M #用户创建的内存表最大值,为防止意外超大的内存表耗尽内存资源
tmp_table_size = 128M #内存中临时表的大小,如果超过此值,则转换为基于磁盘的表,默认32M
ft_min_word_len = 4 #全文索引最小长度,
log_bin = mysql-bin #二进制文件
binlog_format = mixed #二进制日志格式,默认statement,建议mixed
expire_logs_days = 7 #指定二进制日志的有效时间
log_error = /usr/local/mysql/mysql-error.log #错误日志
slow_query_log = 1 #默认不开启,on|off
long_query_time = 1 #超过多少秒的查询就写入日志
slow_query_log_file = /usr/local/mysql/mysql-slow.log #慢查询日志文件,mysqldumpslow -h自带的查询慢日志工具。实例mysqldumpslow -s c -t 20 host-slow.log
performance_schema = 0 #用于收集数据库服务器性能参数
explicit_defaults_for_timestamp #自动填补timestamp字段的值
lower_case_table_names = 1 #0存储和比较都是大小写敏感,1存储时转换为小写,比较时不区分大小写。2存储时区分大小写,比较时转换为小写
skip-external-locking #跳过外部锁定,即多台服务器使用同一个数据目录,那么每台必须开启external-locking

##network setting
skip-name-resolve #禁止mysql对外部连接DNS解析。如果打开,则所有远程主机授权都要使用IP方式,否则无法处理请求
bind-address = 0.0.0.0 #服务监听地址
max_connections = 1024 #指定Mysql允许的最大连接进程数,可以过'conn%'通配符查看当前状态的连接数量,以定夺该值的大小。
max_connect_errors = 102400 #对于同一主机,如果超过该值的中断错误连接,则该主机被禁止连接。解禁FLUSH HOST
max_allowed_packet = 32M #接受的数据包大小,增加该值十分的安全,这是因为只有当需要时才会分配额外的内存。去较小值是预防偶尔使用大信息而导致内存溢出
interactive_timeout = 28800 #默认28800,8小时。服务器关闭交互连接前等待活动的描述
wait_timeout = 28800 #默认28800,服务器关闭非交互连接之前等待活动的秒数

##innodb setting
default_storage_engine = InnoDB #默认存储引擎
innodb_file_per_table = 1 #独享表空间,关闭即可
innodb_open_files = 500 #默认300,限制Innodb能打开表的数据
innodb_buffer_pool_size = 1024M #数据和索引的缓冲池,典型值5-6G(8G内存),20-25GB(32GB内存),100-120GB(128GB内存)。
innodb_write_io_threads = 4 #写入磁盘IO
innodb_read_io_threads = 4 #读取磁盘IO
innodb_thread_concurrency = 0 #你的服务器CPU有几个就设置为几,建议用默认一般为8
innodb_purge_threads = 1 #最大值32,控制做purge(净化)操作的后台线程数
innodb_flush_log_at_trx_commit = 2 #为2表示事务日志在提交时写入日志,但日志文件每次刷新到磁盘一次
innodb_log_buffer_size = 2M #指定日志文件所用内存大小,1-8之间
innodb_log_file_size = 32M #指定日志文件大小
innodb_log_files_in_group = 3 #默认2,推荐3.mysql以循环方式将日志文件写入多个文件
innodb_max_dirty_pages_pct = 90 #默认75
innodb_lock_wait_timeout = 120 #默认50秒,

##cache setting
key_buffer_size = 32M #索引缓冲区大小,增加它可以得到更好的处理性能。对于4G左右服务器来说,该参数可设为256MB或384MB
table_open_cache = 512 #这个参数在5.1.3之后的版本中叫做table_open_cache,用于设置table高速缓存的数量。由于每个客户端连接都会至少访问一个表,
sort_buffer_size = 2M #查询排序时所能使用的缓冲区大小,是一个connection级参数,即500个链接会占用500*8=4G内存
join_buffer_size = 2M #联合查询所能使用的缓冲区大小,该参数分配的内存也是每个链接独享,默认2M
read_buffer_size = 2M #用于对myisam表全表扫描时使用缓冲区大小,读查询所能使用的缓冲区大小,该参数分配的内存也是每个链接独享
read_rnd_buffer_size = 8M #当需要时线程分配,当在排序后,从一个已经分配好的序列中读取行时,行数据从这个缓冲区读取防止磁盘寻道
thread_cache_size = 64 #服务器线程缓存,连接断开时放入缓存,线程重新被请求从缓存读取。设置规则:1GB内存配置8,2G内存配置18,3G内存32,4G或更高可配置更大
query_cache_type = 1 #是否开启查询缓存,默认0不开启,1缓存所有结果,2仅缓存select语句中通过SQL_CACHE指定的查询
query_cache_size = 64M #指定查询缓冲区大小 ,一个select工作后,db会把该语句缓冲,当同一个SQL再次来到,DB未检查到该表发生变化时,会直接把结果返给client
query_cache_limit = 2M #指定单个查询缓存所能使用的缓冲区大小
bulk_insert_buffer_size = 8M #默认8M,批量插入数据缓存大小,可以提高插入效率

myisam_sort_buffer_size = 64M #myisam表发生变化时,重新排序所需的缓冲,默认8M
myisam_max_sort_file_size = 10G #mysql重建索引时允许的临时文件大小

#event_scheduler =ON
#skip-external-locking
#sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

[mysqldump]
quick #备份方式
max_allowed_packet = 500M #服务器发送和接受的最大包长度

[myisamchk]
key_buffer_size = 256M #key缓冲
sort_buffer_size = 8M #排序缓冲
read_buffer = 4M #读取缓冲
write_buffer = 4M #写入缓冲

一、 registry 配置文件

PATH: /etc/docker/registry/config.yml

version: 0.1
log:
accesslog:
disabled: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd ## 密码文件
http:
addr: :5000 ## 端口
host: https://docker.domain.com ## 域名
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.domain.com.crt ## 公钥
key: /etc/docker/registry/ssl/docker.domain.com.key ## 私钥
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

二、 registry docker-compose配置

PATH: /usr/local/docker/docker-compose/registry.yaml

version: "3"
services:
registry:
image: registry:latest
ports:
- "443:5000"
container_name: registry
restart: always
volumes:
- /etc/docker/registry:/etc/docker/registry
- /var/lib/registry:/var/lib/registry
networks:
- "my-network"
networks:
my-network:
driver: bridge

三、配置 http 认证文件

docker run --rm \
--entrypoint htpasswd \
httpd:alpine \
-Bbn $USERNAME $PASSWORD > /etc/docker/registry/auth/nginx.htpasswd

四、 https证书文件

自签https证书, 推荐ZeroSSL申请免费证书

公钥: /etc/docker/registry/ssl/docker.domain.com.crt
私钥: /etc/docker/registry/ssl/docker.domain.com.key
请求: /etc/docker/registry/ssl/docker.domain.com.csr

五、 完成部署

5.1 启动 registry

docker-compose -f /usr/local/docker/docker-compose/registry.yaml up -d

5.2 修改 hosts

vim /etc/hosts
127.0.0.1 docker.domain.com

5.3 测试 register

浏览器访问或者curl https://docker.domain.com

5.4 登录

一开始我以为会有很多有依赖问题,先做了DVD挂载然后制作离线yum源, 结果就这两个包降级了就行了。

yum downgrade initscripts-9.49.30-1.el7.x86_64 centos-release-7-2.1511.el7.centos.2.10.x86_64

离线源制作

1. 挂载镜像文件

2. centos 里将镜像挂载到指定目录

ls /dev/cdrom
mount -t iso9660 -o loop /dev/cdrom /mnt/cdrom/

如果你想开机自动挂载
vim /etc/fstab
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0

3. yum 源编写

vim /etc/yum.repos.d/centos7.2-old.repo

# vim centos7.2-old.repo
[centos7.2-old]
name=centos7.2-old
baseurl=file:///mnt/cdrom
enable=1
gpgcheck=0

yum makecache

4. 查看源里的软件包信息

yum repo-pkgs centos7.2-old list | grep "centos-release"

yum --disablerepo "*" --enablerepo centos7.2-old list | grep "centos-release"

nginx

version: "3"
services: # 服务
nginx:
image: ngin124:latest
ports: # 将本机的 8080 端口映射到容器的80端口
- "8080:80"
container_name: nginx-yaml
restart: always
volumes: # 映射本机 F:/nginx.conf 文件到 容器的 /etc/nginx/nginx.conf:ro 文件
- /usr/local/nginx1.24/html:/usr/local/nginx-1.24/html
- /usr/local/nginx1.24/conf/nginx.conf:/usr/local/nginx-1.24/conf/nginx.conf
networks:
- "my-network"
networks: # 网络
my-network: # 网络名称
driver: bridge

redis

version: "3"
services: # 服务
redis:
image: redis7.2.1:latest
ports:
- "6379:6379"
container_name: redis-yaml
restart: always
volumes:
- /etc/redis.conf:/usr/local/redis7.2.1/conf
networks:
- "my-network"
networks:
my-network:
driver: bridge

tomcat

version: "3"
services: # 服务
tomcat:
image: tomcat8.5.93:latest
ports:
- "9090:8080"
container_name: tomcat-yaml
restart: always
volumes:
- /usr/local/tomcat-8.5.93/conf/server.xml:/usr/local/apache-tomcat-8.5.93/conf/server.xml
networks:
- "my-network"
networks:
my-network:
driver: bridge

零、 配置 docker 自动补齐

1 安装 bash-completion

yum install bash-completion bash-completion-extras.noarch

2 下载配置文件

curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh

3 source 生效

source /etc/bash_completion.d/docker.sh

一、 CentOS7.9 官方镜像

docker pull centos:centos7.9.2009

二、 使用 docker 构建 nginx镜像

2.1 Dockerfile

FROM centos:centos7.9.2009

MAINTAINER zhuang

# 更换centos7源
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirror.nju.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo

# nginx编译依赖
RUN yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib openssl openssl-devel

WORKDIR /usr/local

RUN curl -O https://nginx.org/download/nginx-1.24.0.tar.gz && \
tar -xzvf nginx-1.24.0.tar.gz -C /usr/local && \
mv /usr/local/nginx-1.24.0 /usr/local/nginx-1.24.0-src && \
cd nginx-1.24.0-src && \
./configure --prefix=/usr/local/nginx-1.24.0 && \
make && make install

# 暴露Nginx
EXPOSE 80

# 启动Nginx
CMD ["/usr/local/nginx-1.24.0/sbin/nginx", "-g", "daemon off;"]

2.2 build

docker build -t nginx1.24 .

2.3 run

docker run -d -p 80:80 nginx1.24

三、 使用 docker 构建 redis

3.1 Dockerfile

FROM centos:centos7.9.2009

MAINTAINER zhuang

# 更换centos7源
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirror.nju.edu.cn/centos|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo

# redis 编译依赖
RUN yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl

WORKDIR /usr/local

COPY ./redis-7.2.1.tar.gz /usr/local

RUN tar -xzvf redis-7.2.1.tar.gz && \
cd redis-7.2.1 && \
make PREFIX=/usr/local/redis7.2.1 install && \
cp ./redis.conf /usr/local/redis7.2.1/redis.conf

# 暴露 Redis
EXPOSE 6379

# 启动 Redis
ENTRYPOINT /usr/local/redis7.2.1/bin/redis-server /usr/local/redis7.2.1/redis.conf

3.2 build

docker build -t redis7.2.1 .

3.3 run & verification

docker run -d -p 6379:6379
docker exec -it peaceful_fermi /bin/sh

四、 使用 docker 构建tomcat

4.1 Dockerfile

FROM centos:centos7.9.2009

MAINTAINER zhuang

# # 更换centos7源
# RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
# -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirror.nju.edu.cn/centos|g' \
# -i.bak \
# /etc/yum.repos.d/CentOS-*.repo

ADD ./apache-tomcat-8.5.93.tar.gz /usr/local/
ADD ./jdk-8u202-linux-x64.tar.gz /usr/local/
#ADD ./setenv.sh /usr/lcoal/

ENV MYPATH /usr/local/
WORKDIR $MYPATH

#RUN cp setenv.sh /usr/local/apache-tomcat-8.5.93/bin/

# 配置java和tomcat的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINE_HOME /usr/local/apache-tomcat-8.5.93
ENV CATALINE_BASE /usr/local/apache-tomcat-8.5.93
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINE_HOME/lib:$CATALINE_HOME/bin

# 暴露 tomcat
EXPOSE 8080

# 启动 tomcat
CMD /usr/local/apache-tomcat-8.5.93/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.93/logs/catalina.out

4.2 build

docker build -t tomcat8.5.93 .

4.3 run & verification

docker run -d -p 8080:8080 tomcat8.5.93

五、 常见问题

5.1 docker build 过程 yum install 报错

确保 FROM 的镜像 和 Dockerfile 里 yum 源版本对应起来。

一、 下载 docker 二进制文件

根据自己环境选择合适的版本:
https://download.docker.com/linux/static/stable/x86_64/

二、 解压到 /usr/local/docker

创建docker用户及组

groupadd docker
useradd -g docker docker

tar -xzvf docker-19.03.1.tgz
mv docker /usr/local/

三、 使用 systemctl 管理 docker 服务

文件引用自:
https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service

docker.service

# vim /usr/local/docker/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/local/docker/dockerd
# ExecStart=/usr/local/docker/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ## 注意这种配置的写法,区别在后面会介绍
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target

docker.socket

# vim /usr/local/docker/docker.socket
[Unit]
Description=Docker Socket for the API

[Socket]
# If /var/run is not implemented as a symlink to /run, you may need to
# specify ListenStream=/var/run/docker.sock instead.
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

3.1 配置 containerd 及相关环境

ln -s /usr/local/docker/containerd /usr/bin/
ln -s /usr/local/docker/dockerd /usr/bin/
ln -s /usr/local/docker/docker-init /usr/bin/
ln -s /usr/local/docker/docker-proxy /usr/bin/
ln -s /usr/local/docker/runc /usr/bin/

3.2 重载 systemd

systemctl daemon-reload

3.3 确保 network-online.target 和 firewalld.service 正常

systemctl status network-online.target
systemctl status firewalld.service

3.4 systemctl 配置 docker 并设置自启

systemctl enable docker.socket --now
systemctl enable docker.service --now

3.5 方便后续操作将 docker 等软连接到 PATH

ln -s /usr/local/docker/docker /usr/bin/
ln -s /usr/local/docker/dockerd /usr/bin/

四、 相关问题

4.1 为什么是 /usr/local/docker

答: 如果按照标准的FHS规范应该是/usr/bin等其他目录,选择/usr/local/docker目录的原因方便后续的升级。

4.2 为什么要软连接containerd到/usr/bin

答:

4.3 两种不同的 ExecStart 写法的区别

第一种: ExecStart=/usr/local/docker/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

  1. -H fd
    这个参数告诉 Docker 守护进程使用文件描述符 (fd) 监听 Docker 客户端的连接。
    这通常用于与 Docker 代理一起使用,以便在代理与 Docker 守护进程之间建立通信。
  2. --containerd=/run/containerd/containerd.sock
    这个参数指定 Docker 守护进程应该使用的 containerd 服务的 Unix 套接字。
    Containerd 是一个用于管理容器的基础设施组件,Docker 守护进程通常会与它一起工作。

第二种: ExecStart=/usr/local/docker/dockerd
未指定参数意味着 Docker 守护进程将使用默认配置来运行,通常会监听 Unix 套接字 /var/run/docker.sock 来接收 Docker 客户端的请求。
即我们在 docker.socket 里配置的路径ListenStream=/var/run/docker.sock

注意: 如果需要使用ExecStart=/usr/local/docker/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
需要将containerd注册成系统服务
并且在 AfterWants 需要引用 containerd.service

4.4 systemctl 另外一种管理 docker 的配置写法

请注意这种写法需要将 containerd 注册成系统服务

docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket

[Service]
Type=notify
WorkingDirectory=/usr/local/docker/
ExecStart=/usr/local/docker/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target

docker.socket

[Unit]
Description=Docker Socket for the API

[Socket]
# If /var/run is not implemented as a symlink to /run, you may need to
# specify ListenStream=/var/run/docker.sock instead.
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target


ENV
OS: Debian GNU/Linux 12 (bookworm) x86_64

一、 xray-core 部署

1.1 下载

https://github.com/XTLS/Xray-core/releases
根据自己的环境选择合适的版本

1.2 安装

注意: 本文xray安装的目录不符合 FHS规范

sudo mkdir /xray
sudo unzip Xray-linux-64.zip -d /usr/local/xray

1.3 使用systemd管理

# /etc/systemd/system/xray.service
[Unit]
Description=Xray Service
Documentation=https://github.com/xtls
After=network.target nss-lookup.target

[Service]
User=root
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
NoNewPrivileges=true
ExecStart=/usr/local/xray/xray run -config /usr/local/xray/config.json
Restart=on-failure
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

ln -s /usr/local/xray/xray.service /etc/systemd/system/
sudo systemctl daemon-reload

1.4 使用脚本安装以符合FHS规范

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

这个脚本在没有代理的情况下基本上无法实行,卡在下载过程,TMD这不是winrar.rar行为吗

手动使其符合FHS规范

按照下面目录移动文件,没有就新建

二、 V2RayA 部署

2.1 软件源安装

添加 V2RayA 公钥

wget -qO - https://apt.v2raya.org/key/public-key.asc | sudo tee /etc/apt/trusted.gpg.d/v2raya.asc

添加 V2RayA 源

echo "deb https://apt.v2raya.org/ v2raya main" | sudo tee /etc/apt/sources.list.d/v2raya.list

安装 V2RayA

sudo apt update && sudo apt install v2raya

2.2 deb 包安装

下载

https://github.com/v2rayA/v2rayA/releases

安装

sudo apt install ./$PATH/istaller_debian_amd64_2.0.5.deb

两种安装方式效果相同

三、 V2RayA 配置相关

确保V2RayA正常运行,xray可以不运行。

报错: 检测到geosite.dat, geoip.dat文件或v2ray-core 可能未正确配置

解决: 出现上述原因,大多数是因为 v2ray或xray没有按照 FHS的规范安装,导致 v2raya 找不到相关文件

linux 中有时候需要查看进程相关的文件情况,简单的情况下使用lsof -p $PID即可,但是某些情况下没有lsof这个命令。 这个时候我们可以在 /proc/$PID下面查看相关信息。

/proc 目录介绍

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

PATH 说明
/proc/cpuinfo cpu的信息
/proc/stat 所有的CPU活动信息
/proc/devices 已经加载的设备并分类
/proc/filesystems 内核当前支持的文件系统类型
/proc/modules 所有加载到内核的模块列表
/proc/uptime 系统已经运行了多久
/proc/net 网卡设备信息

公司服务器被挖矿,已经好几次了,之前htop找到进程号, 然后lsof找到相应的文件,kill进程删除文件即可。
这次的病毒,有点不一样, 删除之后还会自启,最后发现是因为删除病毒后没有重启服务器,记录一下过程

服务器环境

CentOS 7.5 on PVE 8C 12G

一、 htop查看进程详情

USER: oracle
COMMAND: /bin/bash/systemd

二、 lsof 查看进程相关文件

lsof -p $PID

PATH: /var/tmp/x86_64(deleted)
外链: 45.10.20.137 (荷兰)

三、 netstat 查看外链详情

netstat -antlp

四、 /proc 查看进程详情

ls -ahl /proc/$PID

  • cwd 进程运行目录;
  • exe 执行程序的绝对路径; /var/tmp/x86_64(deleted)
  • cmdline 程序运行时输入的命令行命令; /bin/bash/systemd
  • environ 记录了进程运行时的环境变量;
  • fd 目录下是进程打开或使用的文件的符号连接

值得注意, 杀死进程又删除文件后还会自启,考虑PPID为1, 在清理完病毒之后重启服务器才彻底解决了问题。

五、 老朋友 xmrig

/var/tmp/x86_64 之前删除过一次, 但是病毒还是复活了, 现在已经没有这个目录了。

想到进程的用户是Oracle,那么到Oracle的家目录看下有没有收获。

果然在Oracle家目录 /home/oracle 发现了可以的隐藏目录。 看到 xmrig 基本上可以确认就这里了。

XMrig 是一个开源的 CPU/GPU 挖矿软件,用于挖掘加密货币 Monero(XMR)以及其他基于 Cryptonight 算法的数字资产。它是一个跨平台的软件,可在多种操作系统上运行,包括 Windows、Linux 和 macOS。 balabalbal……