前言
openEuler 是一个面向数字基础设施的操作系统,支持服务器、云计算、边缘计算、嵌入式等应用场景,支持多样性计算,致力于提供安全、稳定、易用的操作系统。通过为应用提供确定性保障能力,支持 OT 领域应用及 OT 与 ICT 的融合。
- 虚拟化平台:VMware Workstation 17 Pro
- 操作系统:openEuler 24.03 LTS SP1 下载地址 白皮书
搭建环境
创建虚拟机并安装系统
openEuler 24.03 LTS SP1基于Linux 6.6 内核
至少2个CPU、内存4GB、硬盘32GB
安装分区方式:选择自动分区即可
设置root账户密码,复杂度有要求;再创建一个普通用户及密码
安装完成后重启系统
默认为命令行界面,如想安装GUI,可参考官方文档
配置基础环境
配置静态IP
nmcli使用简介
列出目前可用的网络连接:
设置IP地址、子网掩码和网关:
1
2
3
|
nmcli con mod ens33 ipv4.addresses '192.168.2.136/24'
nmcli con mod ens33 ipv4.gateway '192.168.2.2'
nmcli con mod ens33 ipv4.dns '8.8.8.8'
|
保存配置并重启网络服务:
1
|
nmcli con down ens33 && nmcli con up ens33
|
查看当前ip,检查设备及连接的状态,查看配置的连接详情
1
2
3
4
|
ip addr
ifconfig
nmcli device status
nmcli -p con show net-static
|
IP 分配方式置为静态BOOTPROTO=static
1
2
|
vim /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart NetworkManager
|
配置ssh远程访问
参考:使用SSH实现VSCode远端互联
注意要把/etc/ssh/sshd_config
中的AllowTcpForwarding no
改为yes
,确保允许端口转发,再重启ssh服务
注意提前安装tar
、util-linux-user
配置shell工具
参考:Shell工具
注意提前安装util-linux-user
安装wireguard
问题
openEuler24.03 SP1 的内核版本是6.6,内核源码里已经包含了wireguard,但没有编译出的内核里没有、没有以模块的形式存在。用dnf
去搜源里也只有wireguard-tools
和python
版的wireguard
、用modprobe
去尝试手动挂载wireguard
也失败
wireguard官方提供了通过源码编译安装wireguard模块的方法,但是只针对5.6版之前的Linux内核,因此在openEuler系统上通过wireguard官方提供的源码也无法安装(即使修改源码去掉版本判断,也会出现各种编译问题)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 查看内核版本
$ uname -r
6.6.0-72.0.0.76.oe2403sp1.x86_64
# 查看内核编译时间
$ uname -a
Linux localhost.localdomain 6.6.0-72.0.0.76.oe2403sp1.x86_64 #1 SMP Fri Dec 27 12:13:01 CST 2024 x86_64 x86_64 x86_64 GNU/Linux
# 搜源
$ dnf search wireguard
Last metadata expiration check: 0:02:20 ago on 2025年05月08日 星期四 22时23分51秒.
============================================ Name & Summary Matched: wireguard ============================================
python-mitmproxy-wireguard.src : WireGuard interface for mitmproxy.
python-mitmproxy-wireguard-debuginfo.x86_64 : Debug information for package python-mitmproxy-wireguard
python-mitmproxy-wireguard-debugsource.x86_64 : Debug sources for package python-mitmproxy-wireguard
python3-mitmproxy-wireguard.x86_64 : WireGuard interface for mitmproxy.
wireguard-tools-debuginfo.x86_64 : Debug information for package wireguard-tools
wireguard-tools-debugsource.x86_64 : Debug sources for package wireguard-tools
================================================= Name Matched: wireguard =================================================
wireguard-tools.x86_64 : Fast, modern, secure VPN tunnel
# 手动挂载wireguard内核模块
$ modprobe wireguard
modprobe: FATAL: Module wireguard not found in directory /lib/modules/6.6.0-72.0.0.76.oe2403sp1.x86_64
|
解决思路
- 编译内核:自己编译一个跟 openEuler 同版本的 Linux 内核,把 wireguard 模块包含进去
- 使用新编译的同版本含 wireguard 模块的内核
步骤
安装依赖
1
2
|
sudo dnf install elfutils-libelf-devel kernel-devel pkgconfig "@Development Tools"
sudo dnf install kernel-headers.x86_64 pkg-config ncurses-devel openssl-devel dwarves bc
|
下载内核源码,完成后会在/usr/src/linux-<version>/
下生成对应版本的源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$ dnf search kernel-dev
Last metadata expiration check: 0:42:26 ago on 2025年05月08日 星期四 22时23分51秒.
=============================================================== Name Matched: kernel-dev ================================================================
haoc-kernel-devel.x86_64 : Development package for building kernel modules to match the 6.6.0-69.0.0.76.oe2403sp1.x86_64 kernel
kernel-devel.x86_64 : Development package for building kernel modules to match the 6.6.0-87.0.0.93.oe2403sp1.x86_64 kernel
# 上面这俩版本都不是6.6.0-72.0.0.76
$ dnf search kernel-source
Last metadata expiration check: 0:49:17 ago on 2025年05月08日 星期四 22时23分51秒.
========================================================== Name Exactly Matched: kernel-source ==========================================================
kernel-source.x86_64 : the kernel source
============================================================== Name Matched: kernel-source ==============================================================
haoc-kernel-source.x86_64 : the kernel source
$ sudo dnf install kernel-source.x86_64
|
定位 WireGuard 源码,在/usr/src/linux-<version>/drivers/net/wireguard
下
1
|
cd /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64/drivers/net/wireguard
|
当前openEuler 24.03 LTS SP1的内核版本为6.6.0-72.0.0.76
,但下载的源中内核不是该版本,查看本地后发现系统有两套编译好的内核,一套6.6.0-72.0.0.76
、一套6.6.0-87.0.0.93
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$ cd /boot
$ ll
-rw-r--r--. 1 root root 233K 12月27日 12:19 config-6.6.0-72.0.0.76.oe2403sp1.x86_64
-rw-r--r--. 1 root root 234K 4月24日 01:46 config-6.6.0-87.0.0.93.oe2403sp1.x86_64
drwxr-xr-x. 2 root root 4.0K 12月24日 10:47 dracut
drwxr-xr-x. 3 root root 4.0K 5月 8日 20:18 efi
drwx------. 6 root root 4.0K 5月 8日 17:51 grub2
-rw-------. 1 root root 97M 5月 8日 20:21 initramfs-0-rescue-61c2902c3f7b43e1b134fe1465d64033.img
-rw-------. 1 root root 30M 5月 8日 20:23 initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64.img
-rw-------. 1 root root 36M 5月 8日 12:30 initramfs-6.6.0-72.0.0.76.oe2403sp1.x86_64kdump.img
-rw-------. 1 root root 30M 5月 8日 17:51 initramfs-6.6.0-87.0.0.93.oe2403sp1.x86_64.img
drwxr-xr-x. 3 root root 4.0K 5月 8日 20:20 loader
drwx------. 2 root root 16K 5月 8日 20:17 lost+found
-rw-r--r--. 1 root root 305K 12月27日 12:19 symvers-6.6.0-72.0.0.76.oe2403sp1.x86_64.gz
-rw-r--r--. 1 root root 306K 4月24日 01:46 symvers-6.6.0-87.0.0.93.oe2403sp1.x86_64.gz
-rw-r--r--. 1 root root 6.7M 12月27日 12:19 System.map-6.6.0-72.0.0.76.oe2403sp1.x86_64
-rw-r--r--. 1 root root 6.7M 4月24日 01:46 System.map-6.6.0-87.0.0.93.oe2403sp1.x86_64
-rw-r--r--. 1 root root 14M 5月 8日 20:21 vmlinuz-0-rescue-61c2902c3f7b43e1b134fe1465d64033
-rw-r--r--. 1 root root 14M 12月27日 12:19 vmlinuz-6.6.0-72.0.0.76.oe2403sp1.x86_64
-rw-r--r--. 1 root root 14M 4月24日 01:46 vmlinuz-6.6.0-87.0.0.93.oe2403sp1.x86_64
|
切换本地使用的内核版本为另一套已有的6.6.0-87.0.0.93
版本,下面的命令会根据 /boot/
目录下的内核文件自动更新启动引导文件
1
|
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
|
然后重启系统就可以看到多个内核,其中一个就是6.6.0-87.0.0.93
版本内核,可自由选择一个内核启动系统
1
2
3
4
5
6
7
8
|
$ uname -r
6.6.0-87.0.0.93.oe2403sp1.x86_64
# 查看当前系统所有可用内核
cat /boot/grub2/grub.cfg |grep "menuentry "
# 查看系统当前默认内核
grub2-editenv list
|
配置内核编译选项,通过 menuconfig
启用 WireGuard 模块并支持调试,找到 wireguard 模块,按M
进行勾选,一般是在:Device Drivers -> Network device support -> Wireguard secure network tunnel
,开发阶段的话,其下的Debug模式也可以按Y
打开,最底下的save
保存
1
2
|
cd /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64
make menuconfig
|
编译前准备:
编译时报错1:没有规则可制作目标“certs/openeuler-cert.pem”,由“certs/x509_certificate_list” 需求
解决:输入make menuconfig
,找到Cryptographic API > Certificates for signature checking > Additional X.509 keys for default system keyring
删除内容后,保存配置,重新编译
编译内核和模块,启用多线程编译,编译后生成内核映像(vmlinuz
)和模块(.ko
文件),默认在当前目录下的arch/x86/boot/
和 drivers/
安装编译好的内核模块,安装位置一般是当前系统的/lib/modules/<kernel-version>/kernel/
安装编译好的内核映像和初始化内存盘到系统的 /boot/
目录,并更新引导加载器(如 GRUB)
可以在/boot
中看到vmlinuz-6.6.0
等新文件,重启系统,选用该内核
ip addr
查看没有ip
的的话,看一下 IP 分配方式是否为静态BOOTPROTO=static
1
2
|
cat /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart NetworkManager
|
修改系统内核
1
2
3
4
5
6
7
8
|
# 查看当前系统所有可用内核
cat /boot/grub2/grub.cfg |grep "menuentry "
# 查看系统当前默认内核
grub2-editenv list
# 修改默认启动内核
grub2-set-default 6.6.0
|
手动挂载wireguard内核模块并检查
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
|
$ modprobe wireguard
# 检查wireguard模块加载情况
$ lsmod | grep wireguard
wireguard 118784 0
libchacha20poly1305 16384 1 wireguard
ip6_udp_tunnel 12288 1 wireguard
udp_tunnel 28672 1 wireguard
curve25519_x86_64 49152 1 wireguard
libcurve25519_generic 45056 2 curve25519_x86_64,wireguard
# 查看模块信息
$ modinfo wireguard
filename: /lib/modules/6.6.0/kernel/drivers/net/wireguard/wireguard.ko
alias: net-pf-16-proto-16-family-wireguard
alias: rtnl-link-wireguard
version: 1.0.0
author: Jason A. Donenfeld <Jason@zx2c4.com>
description: WireGuard secure network tunnel
license: GPL v2
srcversion: 65F78B1A7076800B17CB058
depends: libcurve25519-generic,udp_tunnel,ip6_udp_tunnel,libchacha20poly1305,curve25519-x86_64
retpoline: Y
intree: Y
name: wireguard
vermagic: 6.6.0 SMP mod_unload modversions
|
测试wireguard使用:参考
注意安装用户态工具:sudo dnf install wireguard-tools
修改内核源码
记得提前保存下镜像
定位WireGuard内核模块源码位置
1
|
cd /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64/drivers/net/wireguard
|
添加调试输出,编辑 main.c
文件,在 module_init
函数中添加初始化日志:
1
2
3
4
5
6
7
|
static int __init wg_mod_init(void)
{
pr_info("WireGuard Modified: Initializing custom version\n"); // 添加的调试输出
int ret;
/* 原有代码... */
}
|
重新编译内核 wireguard 模块
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
|
# 回到内核源码根目录
cd /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64
# 为内核编译铺路,解决环境依赖
# 创建内核编译所需的头文件(如 include/generated/ 中的自动生成头文件)。
# 根据 .config 文件生成内核版本信息、工具链依赖的宏定义等
# 创建内核源码树中的必要符号链接(如 arch/x86 到当前架构的链接)
# 初始化编译输出目录(如 objtool 相关文件)
$ make prepare
CALL scripts/checksyscalls.sh
mkdir -p /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64/tools/objtool && make O=/usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64 subdir=tools/objtool --no-print-directory -C objtool
make[4]: “install_headers”已是最新。
mkdir -p /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64/tools/bpf/resolve_btfids && make O=/usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64 subdir=tools/bpf/resolve_btfids --no-print-directory -C bpf/resolve_btfids
make[4]: “install_headers”已是最新。
# 为模块编译提供符号和元数据支持
# 生成模块编译所需的符号表文件(Module.symvers),记录内核导出符号的哈希值
# 创建模块依赖文件(modules.order 和 modules.builtin),用于后续模块加载顺序管理
# 准备模块相关的头文件(如 vermagic.h,包含内核版本和配置签名)
$ make modules_prepare
CALL scripts/checksyscalls.sh
mkdir -p /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64/tools/objtool && make O=/usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64 subdir=tools/objtool --no-print-directory -C objtool
make[4]: “install_headers”已是最新。
mkdir -p /usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64/tools/bpf/resolve_btfids && make O=/usr/src/linux-6.6.0-87.0.0.93.oe2403sp1.x86_64 subdir=tools/bpf/resolve_btfids --no-print-directory -C bpf/resolve_btfids
make[4]: “install_headers”已是最新。
# 仅编译WireGuard模块(快速编译)
$ make M=drivers/net/wireguard -j$(nproc)
CC [M] drivers/net/wireguard/main.o
LD [M] drivers/net/wireguard/wireguard.o
MODPOST drivers/net/wireguard/Module.symvers
CC [M] drivers/net/wireguard/wireguard.mod.o
LD [M] drivers/net/wireguard/wireguard.ko
# 删除模块
$ rmmod wireguard
# 安装模块到系统
$ make M=drivers/net/wireguard modules_install
INSTALL /lib/modules/6.6.0/updates/wireguard.ko
DEPMOD /lib/modules/6.6.0
|
加载修改后的 wireguard 模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 生成模块依赖关系文件 通常位于 /lib/modules/$(uname -r)/modules.dep
$ depmod -a
# 加载新编译的模块
$ modprobe wireguard
$ lsmod | grep wireguard
wireguard 118784 0
libchacha20poly1305 16384 1 wireguard
ip6_udp_tunnel 12288 1 wireguard
udp_tunnel 28672 1 wireguard
curve25519_x86_64 49152 1 wireguard
libcurve25519_generic 45056 2 curve25519_x86_64,wireguard
# 查看内核日志验证修改
$ dmesg | grep "WireGuard Modified"
[ 1371.893567] wireguard: WireGuard Modified: Initializing custom version
|
参考