自从 rust 进入内核以来,一直都想试试 rust 开发内核模块,但是一直以来都比较忙,工作日忙上班,非工作日忙装修。今天终于决定,还是不能任由这样下去。还是得做点什么。
开发环境
我选择的开发环境是 vagrant + libvirt(kvm)。相比较默认的 virtualbox,更喜欢 qemu based 的 libvirt。毕竟 kvm 在 linux 上性能很强。自然就选择了这个组合。
操作系统选择了 rockylinux 9,其实想想 fedora 应该更好一点,不过我感觉这个应该够用了。fedora 用着像做测试的一样。
这里不赘述 vagrant + libvirt 是如何安装组建的,这里是配置文件生成过程。
生成配置文件
mkdir kernel-rust
cd kernel-rust
vagrant init
编辑 Vagrantfile
这里是我使用的 vagrant 配置文件内容
# -*- mode: ruby -*-
# vi: set ft=ruby sts=4 sw=4 ts=4 :
Vagrant.configure("2") do |config|
# 使用rockylinux 9镜像,fedora应当也可以
config.vm.box = "roboxes/rocky9"
# 使用rocky的虚拟机优化配置
config.vm.guest = :rocky
# 默认关闭vagrant的目录共享
config.vm.synced_folder ".", "/vagrant", disabled: true
# 禁用自动升级,手动升级并维护box版本
config.vm.box_check_update = false
config.vm.provider :libvirt do |libvirt|
# CPU 核心数
libvirt.cpus = 16
# 内存大小
libvirt.memory = 8192
# 使用系统接口
libvirt.uri = "qemu:///system"
end
end
启动
解决下载过慢的问题
这里使用 vagrant up
启动虚拟机。但是有一个问题,就是下载速度太慢了。
vagrant up
==> box: Loading metadata for box 'roboxes/rocky9'
box: URL: https://vagrantcloud.com/roboxes/rocky9
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.
1) docker
2) hyperv
3) libvirt
4) parallels
5) virtualbox
6) vmware_desktop
Enter your choice: 3
==> box: Adding box 'roboxes/rocky9' (v4.2.16) for provider: libvirt
box: Downloading: https://vagrantcloud.com/roboxes/boxes/rocky9/versions/4.2.16/providers/libvirt.box
Progress: 15% (Rate: 547k/s, Estimated time remaining: 1:25:45)
所以,我手动使用 aria2
下载,并使用 vagrant box add
添加镜像
aria2c --no-conf -c -x 10 -s 10 https://vagrantcloud.com/roboxes/boxes/rocky9/versions/4.2.16/providers/libvirt.box -o roboxes-rocky9-4.2.16.box -d ~/Downloads/vagrant/boxes
vagrant box add roboxes/rocky9 ~/Downloads/vagrant/boxes/roboxes-rocky9-4.2.16.box
检查镜像与版本调整
这里由于是手动添加的镜像是没有版本号的,虽然 box add
有手动指定版本的参数,但是不能在手动添加时使用。
vagrant box add roboxes/rocky9 ~/Downloads/vagrant/boxes/roboxes-rocky9-4.2.16.box --box-version 4.2.16 --force
==> box: Box file was not detected as metadata. Adding it directly...
You specified a box version constraint with a direct box file
path. Box version constraints only work with boxes from Vagrant
Cloud or a custom box host. Please remove the version constraint
and try again.
同样的也不能进行升级检查
vagrant box update --box roboxes/rocky9 --provider libvirt
Checking for updates to 'roboxes/rocky9'
Latest installed version: 0
Version constraints: > 0
Provider: libvirt
The box 'roboxes/rocky9' is not a versioned box. The box was added
directly instead of from a box catalog. Vagrant can only
check the versions of boxes that were added from a catalog
such as from the public Vagrant Server.
手动调整版本号与生成 metadata
但是也不是完全无解了,还可以进行手动调整。
ls ~/.vagrant.d/boxes/ -l
total 2
drwxr-xr-x 3 ssfdust users 4 Apr 19 19:29 generic-VAGRANTSLASH-centos8
drwxr-xr-x 3 ssfdust users 4 Apr 19 19:10 jaredeh-VAGRANTSLASH-rockylinux85minimal
drwxr-xr-x 3 ssfdust users 3 Jun 17 21:41 roboxes-VAGRANTSLASH-rocky9
drwxr-xr-x 3 ssfdust users 3 Jan 13 22:03 rockylinux-VAGRANTSLASH-9
ls ~/.vagrant.d/boxes/roboxes-VAGRANTSLASH-rocky9/ -l
total 1
drwxr-xr-x 3 ssfdust users 3 Jun 17 21:42 0
这里看名字应该是 roboxes-VAGRANTSLASH-rocky9
,进去发现版本号其实就是文件夹名。修改文件夹名为需要的版本号即可。
同时需要附带上 box 的元数据
echo https://vagrantcloud.com/roboxes/boxes/rocky9 | tr -d '\n' | tee metadata_ur
再次查看版本号与尝试升级
vagrant box list
generic/centos8 (libvirt, 4.2.16)
jaredeh/rockylinux85minimal (libvirt, 0.1.2)
roboxes/rocky9 (libvirt, 4.2.16)
rockylinux/9 (libvirt, 0)
vagrant box update --box roboxes/rocky9 --provider libvirt
Checking for updates to 'roboxes/rocky9'
Latest installed version: 4.2.16
Version constraints: > 4.2.16
Provider: libvirt
Box 'roboxes/rocky9' (v4.2.16) is running the latest version.
正式启动
vagrant up --provider libvirt
一些初始化设置
更新操作系统
将默认的数据源换成国内镜像源,这里选择的是南京大学的镜像源,同时更新系统,安装 nfs 支持
sudo sed -i '/\[crb\]/,/enabled/s/enabled=0/enabled=1/' /etc/yum.repos.d/rocky.repo
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http.://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.nju.edu.cn/rocky|g' \
-i.bak \
/etc/yum.repos.d/rocky*.repo
sudo sed -E 's|^[#]?baseurl=http.://download.example/pub|baseurl=https://mirrors.nju.edu.cn|' \
-i.bak /etc/yum.repos.d/epel.repo
sudo dnf update -y
sudo dnf install -y nfs-utils
修改 Vagrantfile
新增同步目录 config.vm.synced_folder "./", "/home/vagrant/workspace", type: "nfs", nfs_udp: false, nfs_version: "4.2"
配置项目
...
config.vm.guest = :rocky
# 默认关闭vagrant的目录共享
config.vm.synced_folder ".", "/vagrant", disabled: true
# 添加共享到/home/vagrant/workspace
config.vm.synced_folder "./", "/home/vagrant/workspace", type: "nfs", nfs_udp: false, nfs_version: "4.2"
# 禁用自动升级,手动升级并维护box版本
config.vm.box_check_update = false
...
然后关闭 vagrant,并重启
vagrant halt
vagrant up
检查内核版本以及是否支持 Rust
Rust 正式进入内核是在 6.1 的版本,所以默认的 5.14 的内核我是完全不指望了..不排除 redhat 会 backport rust 功能到 5.14,但是自己弄着玩,还是打算用最新的 mainline 版本的内核,所以上 elrepo 的 srpm
rpm -ivh https://elrepo.org/linux/kernel/el9/SRPMS/kernel-ml-6.3.8-1.el9.elrepo.nosrc.rpm
看了一下,果然没有...
head ~/rpmbuild/SOURCES/config-6.3.8-x86_64
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.3.7-1.el9.elrepo.x86_64 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.3.1 20221121 (Red Hat 11.3.1-4)"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=110301
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23502
支持 Rust 一定是 llvm clang 的,所以 gcc 就表示一定不支持了。下次再来编译一个 rust 支持的内核吧。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于