返回

openEuler学习记录

前言

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使用简介

列出目前可用的网络连接:

1
nmcli con show

设置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服务

注意提前安装tarutil-linux-user

配置shell工具

参考:Shell工具

注意提前安装util-linux-user

安装wireguard

问题

openEuler24.03 SP1 的内核版本是6.6,内核源码里已经包含了wireguard,但没有编译出的内核里没有、没有以模块的形式存在。用dnf去搜源里也只有wireguard-toolspython版的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

解决思路

  1. 编译内核:自己编译一个跟 openEuler 同版本的 Linux 内核,把 wireguard 模块包含进去
  2. 使用新编译的同版本含 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/

1
make -j$(nproc)

安装编译好的内核模块,安装位置一般是当前系统的/lib/modules/<kernel-version>/kernel/

1
make modules_install

安装编译好的内核映像和初始化内存盘到系统的 /boot/ 目录,并更新引导加载器(如 GRUB)

1
make install

可以在/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

参考

Built with Hugo
Theme Stack designed by Jimmy