从零开始的 rust 内核开发(零)

本贴最后更新于 632 天前,其中的信息可能已经事过景迁

自从 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

感谢 stackoverflow 上的英雄

再次查看版本号与尝试升级

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 支持的内核吧。

  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • 内核
    10 引用 • 14 回帖
  • kernel
    6 引用 • 2 回帖
1 操作
ssfdust 在 2023-07-03 10:58:31 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...