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

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

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

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

相关帖子

欢迎来到这里!

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

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