CCAV - 媚眼如初 岁月如故 - Linux
type: channel
link: https://ccav.me/category/Linux/
description: Linux
items: 为SolusVM设置acme.sh自动续期Let’s Encrypt证书
items: RPS和RFS网卡多队列性能调优实践
items: Mariadb数据库主从同步
items: 迁移SolusVM Master
items: LVM卷删除恢复
items: Ubuntu切换默认Python版本
items: 自建 DNS 解析利器：PowerDNS+PowerDNS-Admin
items: Linux CPU频率调整工具
items: 设置KVM虚拟机支持嵌套虚拟化
items: 为Directadmin增加PHP多版本切换

为SolusVM设置acme.sh自动续期Let’s Encrypt证书
type: item
date: 2025-07-11T17:51:00+08:00
description: 我最初尝试使用 论坛和网上有人提到的 svmstack-letsencrypt 包，但就是不行。一番查找之后，我发现有人在使用一个 acme.sh 脚本。 我甚至联系了支持人员，并引用他们的话， letsencrypt 脚本并不适合所有人，他们还建议我使用acme.sh，所以这些是我在我们的 SolusVM 主服务器上安装多域证书所执行的步骤。 您可以按照 ACME Deploy SolusVM 说明中的步骤进行操作，但如果您像我一样运行 CentOS 7.x，那么您的某些步骤会略有不同。首先下载并安装脚本curl https://get.acme.sh | sh现在，这会将脚本以 .acme.sh/acme.sh 的形式安装到您的用户帐户中，并添加一个别名。完成后，您需要注销并重新登录，以便系统识别更新后的 shell 路径。 接下来确保该文件夹可用，如果不可用，您可能需要升级整个安装，以便目录存在并且 Nginx 具有将 ACME 请求传递到正确目录的配置。ls -la /usr/local/solusvm/www/.verification自 2022 年以后，acme.sh 默认将 CA 改为 ZeroSSL，如果没有设置邮箱，会卡在获取 EAB 授权这一步。Let’s Encrypt 则不需要账号注册，可直接申请证书，我们切换CA为 Let’s Encrypt。acme.sh --set-default-ca --server letsencrypt如果提示 -bash: acme.sh: command not found则需要手动加载source ~/.bashrc如果没问题，接下来我们就可以获取证书了。acme.sh --issue -d example.com -d www.example.net -w /usr/local/solusvm/www/.verification之后您需要安装证书。acme.sh --installcert -d example.com -d www.example.net --keypath /usr/local/svmstack/nginx/ssl/ssl.key --fullchainpath /usr/local/svmstack/nginx/ssl/ssl.crt --reloadcmd "systemctl restart svmstack-nginx; cd /usr/local/svmstack/nginx/ssl && cat ssl.key ssl.crt > ssl.pem"完成这些步骤后，我可以浏览 SolusVM 主机上的每个 URL，并看到它现在正在使用 Let's Encrypt 证书。此证书将通过 Let's Encrypt 自动续订，但您需要一个 cron 来更新。这是我的0 0 * * * “/root/.acme.sh”/acme.sh --cron --home “/root/.acme.sh” > /dev/null60天后会通过cron自动尝试证书renew。文章转自 https://centosquestions.com/setup-solusvm-with-lets-encrypt-free-ssl-certificate/

RPS和RFS网卡多队列性能调优实践
type: item
date: 2025-04-08T22:57:00+08:00
description: 前言为了解决 LVS ksoftirqd CPU 使用率 100% 导致网卡软中断丢包，我和同事们一起搜索了大量的资料去分析问题，特别是感谢美团技术团队的分享帮助我们快速梳理优化思路，最后明确了如何重构 RPS 和 RFS 网卡多队列的优化脚本。个人认为这是一个大家可能普遍会遇到的问题，文章内的分析思路和解决方案未必是最优解，也欢迎各位分享自己的解决方法。RPS 和 RFS 网卡多队列性能调优实践更新历史2019 年 07 月 03 日 - 初稿阅读原文 - https://wsgzao.github.io/post/rps/扩展阅读Redis 高负载下的中断优化 - https://tech.meituan.com/2018/03/16/redis-high-concurrency-optimization.html事故复盘我们遇到的问题属于计划外的 incident，现象是某产品用户在线率突然降低，LVS Master 同时收到 CPU High Load 告警，检查发现该节点出现网卡大量断开重连和丢包情况，应急切换到 LVS Slave 也出现上述问题，在排除掉流量异常和外部攻击后选择切换 DNS 到背后的 Nginx Real Servers 后服务逐步恢复。复盘核心原因在于系统初始化时 rps 优化脚本没有成功执行，这个脚本起初是因为早期 DBA 团队遇到过 CPU 负载较高导致网卡异常，这个优化脚本也一直传承至今，却已经没有人知道为什么添加。现在大多数服务器没有执行成功而被大家一直所忽视显然也是 post check 没有做到位。在早期大家都停留在 Bash Shell 运维的阶段，没有专职的团队来管理确实容易失控，好在现在可以基于 Ansible 来做初始化和检查，运维的压力也减轻了一部分。通过 Google 搜索相关知识的过程中，我们也发现在不少人都会遇到这样类似的问题。比如这篇文章提到 lvs/irqlvs 的性能问题，软中断耗尽 CPU 单核后到达处理极限瓶颈现象：当压力较大时，Lvs 服务器 CPU 的其中一个核使用率达到 100%（处理软中断）。当 Lvs 服务器处理软中断的那个核使用率达到 100%，就到达系统处理上限。占用 CPU 的是进程 “ksoftirqd”，它未能使用到多核。做双网卡绑定，然后调试内核 SMP，中断主要是来自网卡的，不是 LVS 本身。需要把 2 个网卡来的 IRQ 均衡在双核 CPU 上面。和华为的工程师们在交换经验的时候对方分享了一个关于 RSS 和 RPS 关系图，之后的内容还会引用美团技术团队的分析我们遇到的情况是缺少可用服务器资源选择把用户外部请求流量和 Codis Cache Cluster 内部流量临时混在了同一个 LVS 上，虽然看上去 CPU 和 traffic 的整体压力都不算高，但是 CPU 的处理压力可能恰好集中在了和外网 Bond1 网卡相同的 Core 上最后引起了 ksoftirqd 软中断，而内网 Bond0 网卡就没有监控到任何丢包。虽然我们也有正常开启 irqbalance，但不清楚是不是因为受到 cpupower performance 和 NUMA 的影响最后也没能阻止事故的发生，最终的优化方案主要是手动开启 RPS 和 RFS，大致步骤如下：set cpupower cpupower frequency-set -g performance，CPU 优化建议使用 cpupower 设置 CPU Performance 模式activate rps/rfs by script: rps.shdouble ring buffer size: ethtool -G p1p1 [rx|tx] 4096, check ethtool -g p1p1double NAPI poll budget: sysctl -w net.core.netdev_budget=600add zabbix monitor on net.if.in[eth0,errors,dropped,overruns], CPU softirq time system.cpu.util[,softirq]#!/bin/bash # chkconfig: 2345 90 60 ### BEGIN INIT INFO # Provides: rps # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-De…

Mariadb数据库主从同步
type: item
date: 2023-05-16T01:10:00+08:00
description: 一、主(master)数据库配置1./etc/my.cnf 添加配置[mariadb] log-bin server_id=1 log-basename=master1 binlog-format=mixed max_binlog_size=200M expire_logs_days=7server_id 必须唯一。log-basename 是指定binlog 的命名规则， binlog 会以它为前缀生成日志，如 master1-bin.000001。max_binlog_size=200M 生成的log最大值，到达最大值，会重新创建一个，如 master1-bin.000002。expire_logs_days binlog 过期天数。2.然后重启数据库生效。systemctl restart mariadb3.创建执行同步的数据库用户//用户名： replication_user， 密码： PWD，可以修改成你想要的。 //授予仅同步权限 CREATE USER 'replication_user'@'%' IDENTIFIED BY 'PWD'; GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%'; //刷新授权 flush privileges; //查看所有用户 MariaDB [(none)]> SELECT User, Host, Password FROM mysql.user; +------------------+-----------+-------------------------------------------+ | User | Host | Password | +------------------+-----------+-------------------------------------------+ | root | localhost | ***************************************** | | root | 127.0.0.1 | ***************************************** | | root | ::1 | ***************************************** | | replication_user | % | ***************************************** | +------------------+-----------+-------------------------------------------+4.锁定数据库FLUSH TABLES WITH READ LOCK;在导出数据库时，先加锁，避免在导出时修改了数据库导致数据不一致。5.记录当前的同步位置MariaDB [(none)]> show master status; +--------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +--------------------+----------+--------------+------------------+ | master1-bin.000001 | 1379828 | | | +--------------------+----------+--------------+------------------+ 1 row in set (0.000 sec)当前master 生成的日志文件: master1-bin.000001,日志位置： 1379828。6.导出数据库//查看所有数据库 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | db01 | | db02 | | information_schema | | mysql | | performance_schema | +--------------------+ 5 rows in set (0.001 sec)//备份数据库 mysqldump -u root -pPWD --databases db01 db02 db03 | gzip > dump.master.gzdb01 db02 db03 替换为你的数据库名7.解锁数据库UNLOCK TABLES ;…

迁移SolusVM Master
type: item
date: 2022-12-18T23:58:00+08:00
description: 例子:旧服务器 solusvm.conf 文件：cat /usr/local/solusvm/includes/solusvm.conf Vmf7LEAnrb5S8x6:218H3lW42EkJZ1y:GOJebeWEl0IOaciXhnM27OryQfQikF:localhost:XFrORvKb69F1QDlmJ6hDqg374iQjL2ndgGIEtkYFTixpFIYFQ0 新服务器 solusvm.conf 文件：cat /usr/local/solusvm/includes/solusvm.conf ORq0dnadRkMyu5S:O4enHwSNLOQImDx:p1BSl44Mi0CBCaGEUZk1txkAdDHNRJ:localhost:gcTrdvQorLnvJhyZYrC0cIOUBJ3H4gJVl3k0SjQ54xgT4hFC5a 将旧服务器的加密密钥修改到新服务器上cat /usr/local/solusvm/includes/solusvm.conf ORq0dnadRkMyu5S:O4enHwSNLOQImDx:p1BSl44Mi0CBCaGEUZk1txkAdDHNRJ:localhost:XFrORvKb69F1QDlmJ6hDqg374iQjL2ndgGIEtkYFTixpFIYFQ0 XFrORvKb69F1QDlmJ6hDqg374iQjL2ndgGIEtkYFTixpFIYFQ0 - 应在新服务器上添加的来自旧服务器的加密密钥SolusVM 主数据库的部分使用存储在/usr/local/solusvm/includes/solusvm.conf. 格式solusvm.conf如下：<DATABASENAME>:<USER>:<PASSWORD>:<HOST>:<the key is the last entry> 之后，将解压过后的SolusVM数据库的mysql dump上传到新服务器，并在新服务器上恢复：/usr/bin/mysql --user=USER --password=PASSWORD DATABASENAME < database USER、PASSWORD、DATABASE 应取自新solusvm.conf文件。将 SSL 证书从旧主节点复制到新主节点，证书位于以下位置：/usr/local/svmstack/nginx/ssl/ssl.crt /usr/local/svmstack/nginx/ssl/ssl.key /usr/local/solusvm/includes/nvnc/cert.pem 或仅上传ssl.crt ssl.pem，生成cert.pemcat /usr/local/svmstack/nginx/ssl/ssl.crt /usr/local/svmstack/nginx/ssl/ssl.key > /usr/local/solusvm/includes/nvnc/cert.pem 在Nodes > List nodes > Edit localhost node中，将 IP 地址替换为主节点的新 IP 地址。旧主节点停止后，立即删除每个母鸡上的 /usr/local/solusvm/data/allow.dat 和 /usr/local/solusvm/data/ftp.dat 文件。rm -rf /usr/local/solusvm/data/allow.dat & rm -rf /usr/local/solusvm/data/ftp.dat

LVM卷删除恢复
type: item
date: 2022-12-15T10:56:00+08:00
description: 该文章内容提及的第二步有一定几率会出现事故的风险。 LVM删除一些分区后数据仍然保留在磁盘内，只要没有被完全覆盖是可以恢复的。大致上3个步骤完成：第一步查找出日志位置，第二步恢复分区，第三步激活分区。以下内容的约定：卷组名为vggroup，kvm*_img为卷。恢复卷的对象是kvm22572_img第一步查找日志#vgcfgrestore -l /dev/vggroup vgcfgrestore -l /dev/vggroup|grep -B2 -A1 lvremove 执行后可以看到类似以下的日志内容。在日志内找到了kvm22572_img卷然后对应的File是/etc/lvm/archive/vggroup_01087-654942930.vg-- File: /etc/lvm/archive/vggroup_01087-654942930.vg VG name: vggroup Description: Created *before* executing 'lvremove -v -f /dev/vggroup/kvm22572_img' Backup Time: Thu Dec 15 10:35:29 2022 -- File: /etc/lvm/backup/vggroup VG name: vggroup Description: Created *after* executing 'lvremove -v -f /dev/vggroup/kvm22572_img' Backup Time: Thu Dec 15 10:35:29 2022 第二步对卷进行恢复vgcfgrestore /dev/vggroup -f /etc/lvm/archive/vggroup_01087-654942930.vg *执行命令后会有回显信息 Restored volume group vggroup第三步对卷做激活。lvchange -a y /dev/vggroup/kvm22572_img 本文转载自 http://www.kvm.la/910.html

Ubuntu切换默认Python版本
type: item
date: 2021-08-29T13:00:00+08:00
description: 1.以 root 身份登录，首先罗列出所有可用的python 替代版本信息update-alternatives --list python 这一步可能会报错update-alternatives: error: no alternatives for python2.如果出现以上所示的错误信息，则表示 Python 的替代版本尚未被update-alternatives 命令识别。想解决这个问题，我们需要更新一下替代列表，将python2.7 和 python3.6 放入其中。update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2 最后的1、2、3...代表序号，后面会有用3.再次列出可用的 Python 替代版本update-alternatives --list python 4.我们就可以使用下方的命令随时在列出的 Python 替代版本中任意切换了update-alternatives --config python 顺手安装pip3sudo apt-get install python3-pip

自建 DNS 解析利器：PowerDNS+PowerDNS-Admin
type: item
date: 2020-04-07T02:06:00+08:00
description: 1.1 系统环境Centos7.7.1908 PowerDNS 4.4.0 MariaDB 10.4 PowerDNS官方源 https://repo.powerdns.com/PowerDNS文档 https://doc.powerdns.com/authoritative/2.1 安装PowerDNS#添加PowerDNS官方源 yum install -y epel-release yum-plugin-priorities curl -o /etc/yum.repos.d/powerdns-auth-master.repo https://repo.powerdns.com/repo-files/centos-auth-master.repo yum install -y pdns pdns-backend-mysql.x86_64 #修改前备份配置文件 cp /etc/pdns/pdns.conf /etc/pdns/pdns.conf.bak #赋予权限，否则PowerDNS无法启动 chown pdns. /etc/pdns/pdns.conf 2.2 修改配置文件，添加以下内容vim /etc/pdns/pdns.conf launch=gmysql gmysql-host=127.0.0.1 gmysql-user=root gmysql-dbname=pdns gmysql-password=123456 api=yes api-key=123456 webserver=yes # ttl default-ttl=3002.3 启动PowerDNS（日志在message中）systemctl start pdns systemctl enable pdns systemctl status pdns.service2.4 开放DNS服务端口firewall-cmd --zone=public --add-port=53/tcp --permanent firewall-cmd --zone=public --add-port=53/udp --permanent firewall-cmd --reload 3.1 安装MariaDB10.4Centos7仓库最新版5.5，需要手动添加新版10.4到仓库。vim /etc/yum.repos.d/Mariadb.repo# MariaDB 10.4 CentOS repository list - created 2020-04-06 18:11 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.4/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 yum clean all yum makecache all yum install -y mariadb-server mariadb 3.2 添加以下内容，配置MariaDB的字符集为UTF-8vim /etc/my.cnf [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake vim /etc/my.cnf.d/client.cnf [client] default-character-set=utf8 vim /etc/my.cnf.d/mysql-clients.cnf [mysql] default-character-set=utf8 3.3 启动MariaDBsystemctl start mariadb systemctl enable mariadb systemctl status mariadb 3.4 初始化MariaDBmysql_secure_installation 回车, N, Y, #设置root密码 root密码, 重复root密码, Y, #删除匿名登入 Y, #禁用root远程登入 Y, #删除test库 Y, #刷新权限 3.5 初始化PowerDNS数据库mysql -u root -p #先确认已设置UTF-8编码 mysql > show variables…

Linux CPU频率调整工具
type: item
date: 2020-02-29T01:37:00+08:00
description: 现在的CPU耗电很大，按需调节CPU频率对普通桌面及移动设备节能有重要的意义，目前多数Linux发行版都已经默认启用了这个功能，但在一些像数据库，集群系统等特别需要CPU高性能的服务器环境中，Linux提供的这种对CPU频率调节的功能对CPU性能使用受到一些限制，不利于系统性能的更好发挥。为此需要Linux系统管理员进行必要相关参数优化及设置来确保CPU性能最大化。本文将针对应用中常见的RedHat6、7系列及Debian Gnu/Linux 8系列中CPU频率调整工具的使用进行描述，以方便Linux用户进行该方面工作的优化。在Linux中，内核的开发者定义了一套框架模型来完成CPU频率动态调整这一目的，它就是CPU Freq系统。尽管在各个Linux发行版中，前端软件稍有差异，但其最终都会通过Linux内核的CPU Freq系统来实现CPU频率动态调整的功能。这些软件都会提供如下CPU模式（governor参数）：ondemand：系统默认的超频模式，按需调节，内核提供的功能，不是很强大，但有效实现了动态频率调节，平时以低速方式运行，当系统负载提高时候自动提高频率。以这种模式运行不会因为降频造成性能降低，同时也能节约电能和降低温度。一般官方内核默认的方式都是ondemand。interactive：交互模式，直接上最高频率，然后看CPU负荷慢慢降低，比较耗电。Interactive 是以 CPU 排程数量而调整频率，从而实现省电。InteractiveX 是以 CPU 负载来调整 CPU 频率，不会过度把频率调低。所以比 Interactive 反应好些，但是省电的效果一般。conservative：保守模式，类似于ondemand，但调整相对较缓，想省电就用他吧。Google官方内核，kang内核默认模式。smartass：聪明模式，是I和C模式的升级，该模式在比interactive 模式不差的响应的前提下会做到了更加省电。performance：性能模式！只有最高频率，从来不考虑消耗的电量，性能没得说，但是耗电量。powersave 省电模式，通常以最低频率运行。userspace：用户自定义模式，系统将变频策略的决策权交给了用户态应用程序，并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置Hotplug：类似于ondemand, 但是cpu会在关屏下尝试关掉一个cpu，并且带有deep sleep，比较省电。在进行CPU频率优化之前，我们首先需要使用命令：lsmod | grep "acpi_cpufreq" 查看内核是否加载了acpi_cpufreq模块，如果加载了此模块，按照一般情况发行版都会将CPU设置为 “ondemand”模式。之后可以通过命令：cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 来进一步确认CPU节能模式，但此时用户无法进行修改，需要进行修改必须使用命令安装cpufreq管理软件，在Debian Gnu/Linux下使用如下命令：apt-get install cpufrequtils 在RedHat6以下版本中使用如下命令：yum install cpuspeed 在RedHat7系列版本中使用如下命令：yum install kernel-tools 之后我们就可以通过修改相应系统所在配置文件，Debian Gnu/Linux 8、RedHat6以下版本、RedHat7系列版本cpufreq管理软件配置文件分别为：/etc/init.d/cpufrequtils、/etc/sysconfig/cpuspeed、/etc/sysconfig/cpupower 修改Debian Gnu/Linux 8配置文件中：GOVERNOR="ondemand" 为： GOVERNOR="performance" RedHat6以下版本配置文件中：GOVERNOR 为 GOVERNOR=performance RedHat7系列版本配置文件中：CPUPOWER_STOP_OPTS=”frequency-set -g ondemand” 为： CPUPOWER_STOP_OPTS=”frequency-set -g performance” 在Debian Gnu/Linux 8、RedHat6一下版本、RedHat7系列版本中分别执行：/etc/init.d/cpufrequtils restart /etc/init.d/cpuspeed restart systemctl restart cpupower.service 命令即可重启相…

设置KVM虚拟机支持嵌套虚拟化
type: item
date: 2019-08-14T16:48:27+08:00
description: 首先检查 KVM host（宿主机/母机）上的kvm_intel模块是否打开了嵌套虚拟机功能（默认未开启的）：root@localhost:~# modinfo kvm_intel | grep nested parm: nested:bool root@localhost:~# cat /sys/module/kvm_intel/parameters/nested N root@localhost:~# 如果上面的显示结果是 N 的话需要开启 nested：root@localhost:~# modprobe -r kvm-intel root@localhost:~# modprobe kvm-intel nested=1 root@localhost:~# cat /sys/module/kvm_intel/parameters/nested Y 如果提示下面的报错，则说明宿主机中有KVM虚拟机正在运行，全部关机后再操作。modprobe: FATAL: Module kvm_intel is in use.

为Directadmin增加PHP多版本切换
type: item
date: 2019-06-23T17:15:51+08:00
description: 新版本Directadmin已经支持4个版本的PHP共存，需搭配CustomBuild 2.0实现。cd /usr/local/directadmin/custombuild ./build set php1_mode mod_php ./build set php2_mode mod_php ./build set php3_mode mod_php ./build set php4_mode mod_php ./build set php1_release 5.6 ./build set php2_release 7.0 ./build set php3_release 7.2 ./build set php4_release 7.3 ./build php n ./build rewrite_confs