Chemmy's Blog

chengming0916@outlook.com

本文档介绍如何在麒麟V10系统中挂载ISO镜像文件,并配置本地YUM源。

1. 挂载ISO文件

假设ISO文件存放在 /opt/iso/ 目录,目标挂载路径为 /mnt/media/iso

1.1 临时挂载

1
mount -t iso9660 /opt/iso/Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso /mnt/media/iso

1.2 永久挂载

编辑 /etc/fstab 文件,在末尾添加以下行:

1
/opt/iso/Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso    /mnt/media/iso    iso9660    loop,ro,auto    0 0

2. 配置YUM源

/etc/yum.repos.d/ 目录下创建新的源配置文件 Kylin_Local.repo

1
2
3
4
5
6
[Kylin-Local]
name=Kylin V10 Local Repository
baseurl=file:///mnt/media/iso
enabled=1
gpgcheck=1
gpgkey=file:///mnt/media/iso/RPM-GPG-KEY-Kylin

配置项说明

  • baseurl: 指定本地ISO的挂载路径。
  • enabled: 设为 1 以启用此仓库。
  • gpgcheck: 设为 1 以启用GPG签名验证,确保软件包安全。
  • gpgkey: 指定用于验证的GPG公钥文件位置。

3. 测试源配置

配置完成后,执行以下命令测试源是否正常工作:

1
2
3
4
5
6
7
8
9
# 清理旧的YUM缓存并生成新缓存
dnf clean all
dnf makecache

# 列出已启用的仓库,检查本地源是否在列
dnf repolist

# 尝试搜索一个软件包,测试源功能
dnf search openssh-server

4. 扩展:搭建局域网共享源

若需在多台机器上使用,可在局域网内搭建一个共享源服务器。

4.1 在源服务器上操作

1
2
3
4
5
6
7
8
9
10
# 1. 安装Nginx Web服务器
dnf install -y nginx
systemctl enable --now nginx

# 2. 将ISO挂载到Nginx的Web目录
mount -t iso9660 -o loop /opt/iso/Kylin-Server-V10-SP3-2403-Release-20240426-x86_64.iso /usr/share/nginx/html/kylin-local/

# 3. 配置防火墙,允许HTTP访问
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

4.2 在客户端机器上配置

将客户端YUM源配置文件中的 baseurl 修改为:

1
baseurl=http://<源服务器IP地址>/kylin-local

5. 常见问题与解决方案

问题1:挂载点不存在或权限不足

1
2
3
# 创建挂载目录并设置权限
mkdir -p /mnt/media/iso
chmod 755 /mnt/media/iso

问题2:GPG密钥验证失败

  • 临时解决方案(不推荐用于生产环境)
    Kylin_Local.repo 文件中将 gpgcheck=1 改为 gpgcheck=0
  • 正确解决方案
    检查GPG密钥文件路径和名称是否正确。
    1
    ls -l /mnt/media/iso/RPM-GPG-KEY-Kylin

问题3:软件包依赖缺失

1
2
3
4
# 查看详细的安装错误信息
dnf --verbose install <软件包名>

# 如果确认本地源缺少某些依赖,可以考虑配置多个YUM源(如结合官方网络源)

麒麟V10配置EPEL源指南

概述

在麒麟V10系统上配置EPEL(Extra Packages for Enterprise Linux)源,可以方便安装大量额外的开源软件包。由于麒麟V10基于CentOS系(内核版本介于CentOS 8与9之间),大部分 EPEL 8 的软件包都能直接使用。

方法一:直接安装官方EPEL RPM包

操作步骤

1. 下载并安装EPEL源RPM包

1
2
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
rpm -ivh epel-release-latest-8.noarch.rpm --nodeps --force

2. 清理缓存并生成新缓存

1
2
yum clean all
yum makecache

3. 测试安装软件

1
yum install htop -y

方法二:使用国内镜像(推荐)

操作步骤

1. 创建EPEL仓库配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat > /etc/yum.repos.d/epel.repo <<EOF
[epel]
name=Extra Packages for Enterprise Linux 8 - \$basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/\$basearch/
enabled=1
gpgcheck=0
countme=1

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 8 - \$basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/\$basearch/debug/
enabled=0
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 8 - \$basearch - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/source/tree/
enabled=0
gpgcheck=0
EOF

2. 更新缓存并测试

1
2
yum makecache
yum install vnstat -y

验证方式

执行 yum repolist 确认 epel 仓库已启用,并能正常安装来自EPEL的软件包。

配置建议

  1. 版本选择:麒麟V10建议使用 EPEL 8
  2. 架构适配:对于ARM架构,$basearch 会自动匹配 aarch64,无需手动修改
  3. 网络优化:若需长期稳定运行,建议优先选择国内镜像以减少网络延迟

1. Chrony简介

Chrony是一个开源自由的网络时间协议(NTP)客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,确保计算机保持精确的时间。Chrony也可以作为服务端软件为其他计算机提供时间同步服务。

Chrony由两个程序组成:

  • chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步
  • chronyc:用户界面程序,用于监控性能并进行多样化的配置

2. 时间同步相关概念

2.1 硬件时间

硬件时间,也被称为实时时钟(RTC),是指计算机主板上的一个独立于操作系统的设备,它在电源关闭甚至断电情况下也能保持运行。

相关命令:

1
2
3
4
5
6
7
8
# 查询硬件时间
hwclock --show

# 将系统时间设置为硬件时间
hwclock --systohc

# 将硬件时间设置为系统时间
hwclock --hctosys

2.2 时间标准

  • UTC:协调世界时,基于原子时钟的时间标准
  • Local time:本地时间,系统时间经过时区转换后的时间

2.3 时间同步目的

  1. 对外同步:保证本地时间和国际通用时间保持同步(通过NTP)
  2. 对内同步:保证系统时间和硬件时间同步(通过rtcsync)

3. 安装与配置

3.1 服务端配置

安装Chrony:

1
2
3
yum -y install chrony
systemctl enable chronyd
systemctl start chronyd

修改配置文件 /etc/chrony.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 记录时间补偿调整
driftfile /var/lib/chrony/drift

# 允许系统时钟在前三次更新中步进
makestep 1.0 3

# 启用RTC内核同步
rtcsync

# 允许所有客户端连接
allow all

# 本地时间作为标准时间授时
local stratum 10

配置说明:

  • local指令允许将本地时间作为标准时间授时给其他客户端
  • stratum 10表示距离真实时间源较远,防止机器本身的时间与真实时间混淆

3.2 客户端配置

修改配置文件 /etc/chrony.conf

1
server 10.0.0.1 iburst

重启服务:

1
systemctl restart chronyd

4. 常用命令与监控

4.1 查看同步状态

1
chronyc sources -v

状态标识说明:

标识 说明
* chronyd当前同步到的源
+ 可接受的信号源
- 被合并算法排除的可接受源
? 已失去连接性或数据包未通过测试
x 被认为是虚假行情的时钟
~ 时间似乎具有太多可变性的来源

4.2 时间同步状态检查

1
chronyc tracking

关键参数说明:

  • Reference ID:正在同步的NTP服务器地址
  • Stratum:系统在NTP层次中的级别
  • System time:系统时间相对于NTP服务器时间的差异
  • Last offset:上一次时间同步时的偏移量
  • Frequency:本地系统时钟的速度(ppm)

4.3 系统时间管理

1
2
3
4
5
# 查看时间状态
timedatectl

# 设置NTP服务状态(慎用)
timedatectl set-ntp yes/no

5. 常见问题与解决方案

5.1 迁移VM后时间差异较大

问题:需要快速同步时间

解决方案:

1
2
3
4
5
# 逐步校正(较慢)
chronyc makestep 0.1 3

# 立即同步时钟
chronyc -m 'burst 3/3' 'makestep 0.1 3'

5.2 外网时间源不可用

问题:启用本地模式后,客户端无法同步时间

解决方案local模式只能有一个服务器配置该参数

5.3 Chronyd服务正常但未同步

问题:NetworkManager调度程序脚本BUG(3.2-2版本)

解决方案:

  • 临时:重启chronyd服务
  • 永久:升级到3.4以上版本

6. 常用时钟源推荐

6.1 公共NTP服务器

  • pool.ntp.orgcn.pool.ntp.org0-3.cn.pool.ntp.org
  • 阿里云ntp.aliyun.comntp1-7.aliyun.com
  • 大学NTP服务
    • s1a.time.edu.cn(北京邮电大学)
    • s1b.time.edu.cn(清华大学)
    • s1c.time.edu.cn(北京大学)
  • 国家授时中心210.72.145.44

6.2 配置示例

1
2
3
4
# 使用阿里云NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst

使用MSYS2替代原生MinGW-w64搭建Qt 4.8.7 ARM32交叉编译环境,优势是MSYS2的包管理更便捷、依赖兼容性更强,且能完美兼容POSIX命令行环境(适配Qt 4.8.7的Unix风格编译脚本)。以下是基于MSYS2的完整实操指南,核心步骤与原生MinGW一致,但环境搭建环节适配MSYS2生态:

一、前置准备:下载清单(替换原生MinGW为MSYS2)

组件名称 用途 下载地址/获取方式
MSYS2 替代原生MinGW,提供编译环境 MSYS2官网(选Windows x86_64安装包)
ARM32交叉编译工具链 编译ARM32架构程序 推荐Linaro 7.5.0(arm-linux-gnueabihf):Linaro官网
Qt 4.8.7源码 Qt核心源码 Qt Archive
7-Zip 解压压缩包 7-Zip官网

说明:MSYS2内置Python 2.7/Perl/CMake,无需单独安装,通过包管理器一键部署即可。

二、步骤1:安装并配置MSYS2

1.1 安装MSYS2

  • 运行MSYS2安装包,默认安装到C:\msys64禁止修改路径含中文/空格);

  • 安装完成后自动打开MSYS2终端,执行更新命令(首次更新需耐心等待):

1
pacman -Syu
若终端提示“关闭后重启”,则关闭终端,重新打开MSYS2 MSYS终端,再次执行:
1
pacman -Su

1.2 安装MSYS2编译依赖(替代原生MinGW/Perl/Python/CMake)

打开MSYS2 MinGW64终端(关键:必须选MinGW64环境,而非MSYS环境),执行以下命令安装依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装MinGW64 GCC(核心编译工具)
pacman -S --needed mingw-w64-x86_64-gcc

# 安装Python 2.7(Qt 4.8.7编译必需)
# pacman -S --needed mingw-w64-x86_64-python2
pacman -U https://repo.msys2.org/mingw/mingw64/mingw-w64-x86_64-python2-2.7.18-8-any.pkg.tar.zst

# 安装Perl(Qt编译脚本依赖)
pacman -S --needed mingw-w64-x86_64-perl

# 安装CMake(辅助编译)
pacman -S --needed mingw-w64-x86_64-cmake

# 安装make工具(mingw32-make)
pacman -S --needed mingw-w64-x86_64-make

# 安装依赖库(如zlib、libpng,Qt编译需)
pacman -S --needed mingw-w64-x86_64-zlib mingw-w64-x86_64-libpng mingw-w64-x86_64-libjpeg-turbo

1.3 验证MSYS2环境

在MinGW64终端执行以下命令,验证依赖安装成功:

1
2
3
4
5
6
7
8
# 验证GCC
gcc -v
# 验证Python 2.7
python2 --version
# 验证Perl
perl -v
# 验证make
mingw32-make -v

三、步骤2:配置ARM32交叉编译工具链(适配MSYS2)

2.1 解压Linaro工具链到MSYS2路径

  • 下载Linaro工具链(如gcc-linaro-7.5.0-2019.12-i686-mingw32_arm-linux-gnueabihf.tar.xz);

  • 用7-Zip解压到MSYS2的目录下(建议路径:C:\msys64\opt\arm-linux-gnueabihf-7.5.0),避免路径含空格/中文。

2.2 配置MSYS2环境变量(永久生效)

  • 打开MSYS2 MinGW64终端,编辑环境变量配置文件:
1
vi ~/.bashrc
  • 在文件末尾添加以下内容(指定交叉工具链路径):
1
2
3
4
# ARM交叉工具链路径
export PATH=/opt/arm-linux-gnueabihf-7.5.0/bin:$PATH
# 别名(可选,简化命令)
alias arm-gcc='arm-linux-gnueabihf-gcc'
  • 生效配置:
1
source ~/.bashrc

2.3 验证交叉工具链

在MinGW64终端执行:

1
arm-linux-gnueabihf-gcc -v

输出Linaro 7.5.0版本信息则成功(若提示“找不到命令”,检查工具链解压路径是否正确)。

四、步骤3:修改Qt 4.8.7源码(与原生MinGW一致,适配MSYS2路径)

4.1 解压Qt源码到MSYS2路径

将Qt 4.8.7源码解压到MSYS2可识别的路径(如C:\msys64\home\你的用户名\qt-4.8.7-arm),MSYS2中路径表示为/home/你的用户名/qt-4.8.7-arm(避免Windows风格路径导致编译报错)。

4.2 修改交叉编译配置文件

复制并修改mkspecs配置文件(与原生MinGW步骤一致,仅路径适配MSYS2):

  1. 进入Qt源码目录:
1
cd /home/你的用户名/qt-4.8.7-arm
  1. 复制并修改配置文件:
1
2
3
4
# 复制ARM配置模板
cp -r mkspecs/qws/linux-arm-gnueabi-g++ mkspecs/qws/linux-arm-gnueabihf-g++
# 编辑qmake.conf
vi mkspecs/qws/linux-arm-gnueabihf-g++/qmake.conf
  1. 替换qmake.conf内容(与原生MinGW的配置一致,工具链前缀不变):
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
MAKEFILE_GENERATOR      = UNIX
TEMPLATE = app
CONFIG += qt warn_on release incremental link_prl gdb_dwarf_index
QT += core gui
QMAKE_INCREMENTAL_STYLE = sublib

# 交叉编译工具链前缀(匹配Linaro)
CROSS_COMPILE = arm-linux-gnueabihf-
CC = $$CROSS_COMPILE gcc
CXX = $$CROSS_COMPILE g++
LINK = $$CROSS_COMPILE g++
AR = $$CROSS_COMPILE ar cqs
RANLIB = $$CROSS_COMPILE ranlib
STRIP = $$CROSS_COMPILE strip
RC = $$CROSS_COMPILE windres

# ARM架构参数(适配ARMv7)
QMAKE_CFLAGS = -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard -O2
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
QMAKE_LFLAGS = -march=armv7-a -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard

# 系统库与路径(适配MSYS2)
QMAKE_INCDIR =
QMAKE_LIBDIR =
QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
QMAKE_LIBS = -lrt -ldl -lpthread
QMAKE_LIBS_QT_ENTRY = -lQtCore -lQtGui
QMAKE_LIBS_GUI = -lX11 -lXext -lXt -lm -lSM -lICE -lfontconfig -lfreetype
QMAKE_LIBS_CORE = -lz -lm -ldl -lpthread

# 输出目录
DESTDIR = ../bin

五、步骤4:配置并编译Qt 4.8.7 ARM版本(MSYS2终端执行)

5.1 清理旧配置(首次编译可跳过)

1
2
cd /home/你的用户名/qt-4.8.7-arm
mingw32-make distclean

5.2 执行configure(核心:适配MSYS2路径)

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
./configure -prefix /home/你的用户名/qt-4.8.7-arm-build \
-opensource \
-confirm-license \
-release \
-shared \
-embedded arm \
-xplatform qws/linux-arm-gnueabihf-g++ \
-no-webkit \
-no-phonon \
-no-phonon-backend \
-no-qt3support \
-no-multimedia \
-no-ltcg \
-no-dbus \
-no-opengl \
-no-openvg \
-no-svg \
-no-javascript-jit \
-no-script \
-no-scripttools \
-no-declarative \
-no-declarative-debug \
-nomake demos \
-nomake examples \
-nomake docs \
-qt-libpng \
-qt-libjpeg \
-qt-zlib \
-little-endian \
-host-little-endian \
-verbose

关键差异:-prefix使用MSYS2的Unix风格路径(/home/...),而非Windows路径(D:...),避免Qt配置解析路径出错。

5.3 编译Qt源码

1
2
# 多核编译(-j后接CPU核心数,如8核则-j8)
mingw32-make -j8

5.4 安装编译结果

1
mingw32-make install

安装完成后,/home/你的用户名/qt-4.8.7-arm-build(对应Windows路径C:\msys64\home\你的用户名\qt-4.8.7-arm-build)即为ARM交叉编译环境。

六、步骤5:验证交叉编译环境(MSYS2终端)

6.1 新建测试工程

在MSYS2中新建测试目录:

1
2
mkdir /home/你的用户名/qt-arm-test
cd /home/你的用户名/qt-arm-test

新建test.pro

1
2
3
4
QT += core gui
TARGET = test
TEMPLATE = app
SOURCES += main.cpp

新建main.cpp

1
2
3
4
5
6
7
8
9
10
#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel lbl("Hello ARM32 Qt 4.8.7 (MSYS2)!");
lbl.show();
return a.exec();
}

6.2 生成Makefile并编译

1
2
3
4
# 使用ARM版本的qmake
/home/你的用户名/qt-4.8.7-arm-build/bin/qmake -spec qws/linux-arm-gnueabihf-g++ test.pro
# 编译
mingw32-make

6.3 验证ARM程序

  • 安装file命令(MSYS2终端):
1
pacman -S file
  • 验证程序架构:
1
file test

输出类似test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked,说明成功。

七、MSYS2专属问题与解决

  1. configure提示“bash: ./configure: 权限不够”

  2. 执行chmod +x configure赋予执行权限。

  3. 编译时提示“找不到python”

  4. MSYS2中Python 2.7命令为python2,Qt 4.8.7默认找python,需创建软链接:

1
ln -s /mingw64/bin/python2.exe /mingw64/bin/python.exe
  1. 工具链路径识别失败

  2. MSYS2中/opt对应Windows路径C:\msys64\opt,确保工具链解压到该路径,且~/.bashrc中PATH配置正确。

  3. mingw32-make报错“recipe for target failed”

  4. 降低编译核心数(如-j4),避免内存不足;检查Qt源码路径是否含中文/空格。

总结

用MSYS2替代原生MinGW的核心优势是:

  1. 无需手动安装Python/Perl/CMake,包管理器一键部署,版本兼容性更高;

  2. POSIX终端环境更适配Qt 4.8.7的Unix风格编译脚本,减少路径/命令兼容问题;

  3. 环境变量配置永久生效,无需频繁修改系统PATH。

核心注意点:全程使用MSYS2 MinGW64终端(而非MSYS终端/系统CMD),路径统一使用MSYS2的Unix风格路径(/home/...),避免Windows路径解析错误。

常用Grafana模板

名称 模板ID 说明
Node Exporter Full 1860 Kubernetes 集群监控
K3s Cluster Dashboard 14205,7249 K3s专属监控
kube-state-metrics 12740
MySQL Overview 7362
Nvidia GPU Metrics 14574 英伟达显卡监控
PostgreSQL Database 9628
Redis 12497
EMQX 17446
Docker-cAdvisor 13946

Alloy配置模板

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
// 基础设施指标收集组件一般都是prometheus.exporter.*的形式, 见官方文档https://grafana.com/docs/alloy/latest/reference/components/prometheus/
// 目标组件, 这里目标组件是Linux
prometheus.exporter.unix "node" {}

// 抓取目标组件指标
prometheus.scrape "node" {
// 源
targets = prometheus.exporter.unix.node.targets
// 指标转发
forward_to = [prometheus.relabel.node.receiver]
// 10s抓取一次指标
scrape_interval = "10s"
}

// 筛选指标
// prometheus.relabel 组件通常用于筛选 Prometheus 指标或标准化传递给一个或多个下游接收器的标签集
prometheus.relabel "node" {
// 将address或者instance替换成host
rule {
action = "replace"
source_labels = ["__address__", "instance"]
separator = "/"
target_label = "host"
}
// 处理完后转发到组件
forward_to = [prometheus.remote_write.metrics_service.receiver]
}


prometheus.exporter.redis "redis" {
redis_addr = "redis:6379"
redis_password = "123456"
}

prometheus.scrape "redis" {
targets = prometheus.exporter.redis.redis.targets
forward_to = [prometheus.remote_write.metrics_service.receiver]
}


// 指标发送到prometheus中
prometheus.remote_write "metrics_service" {
endpoint {
url = "http://prometheus:9090/api/v1/write"
}
}

0%