背景
Linux块设备驱动程序在5.15高版本内核下编译报错。这样就有两种办法:
- 修改驱动程序代码以适应版本更改
- 换用低版本内核
第一种办法由于我水平太低,是无法选的
所以只好换一个低版本内核,哪想到就遇到了许多问题
更换指定内核
具体操作:具体操作
以5.4.0版本为例
wget https://raw.githubusercontent.com/pimlie/ubuntu-mainline-kernel.sh/master/ubuntu-mainline-kernel.shchmod +x ubuntu-mainline-kernel.shsudo mv ubuntu-mainline-kernel.sh /usr/local/bin/
search and find your wanted version
ubuntu-mainline-kernel.sh -r | grep 5.4
install that version kernel
ubuntu-mainline-kernel.sh -i v5.4.0
update grub
update-grub
reboot
reboot now
verify
uname -r
失败了,22.04发行版装5.4版本内核,貌似不行。
我使用下面这条命令搜索内核时,只能看到5.15和5.17版本的。当我强行下载5.4.0版本的内核后,重启虽然可以选择更换的内核,但是进不了系统。于是只好作罢。
`apt-cache search linux-image-`
反思了一下,还是对linux内核版本和发行版本的理解不够深刻。5.4版本是在20.04版本的Ubuntu上使用的内核,5.15版本是在22.04版本的Ubuntu上使用的。不同发行版本对内核的修改肯定是不同的,所以我强行将5.4版本安装到22.04版本的Ubuntu上时,系统根本就无法启动。
尝试20.04版本Ubuntu
-
下载iso文件,设置root密码
-
安装增强功能,实现文件和粘贴板共享
直接安装增强功能,然后重启虚拟机就可以 -
配置清华镜像源
切换为root ,下载vimsu -
apt-get vim
备份源
cp /etc/apt/sources.list /etc/apt/sources.list.bak
手动替换或命令替换
vim /etc/apt/sources.list
更新
apt-get update
再次尝试更改内核
这一次在20.04版本的Ubuntu上,就找得到很多5.4版本的内核了。
这次我试一试5.4.75版本
ubuntu-mainline-kernel.sh -i v5.4.75
修改grub文件,以便开机时选择内核
vim /etc/default/grub
改为:
GRUB_HIDDEN_TIMEOUT=10#GRUB_STYLE_HIDDEN
更新grub
update-grub
重启验证一下
选择才装的5.4.75版本内核
查看现在的版本,已经成功更换了。
uname -r
安装开发工具,重新编译块驱动程序
更换内核后虚拟机增强功能还失效了,移除了VboxGuest那个盘片重新安装一次再重启还是不行。
算了先不管了
sudo apt-get install build-essential #安装开发工具包,包含gcc等
安装headers
uname -r
查看当前内核版本
apt search linux-header
查找软件库所有的header版本
sudo apt-get install linux-headers-XXX-X-amd6
安装header
安装一系列内核用环境
sudo apt-get install kernel-package #测试中会出现缺这缺那的情况,如以下包会丢失,如编译源码出现错误,可尝试执行 sudo apt-get install flex bison #和/或 sudo apt-get install libssl-dev #和/或 sudo apt-get install libelf-dev #libelf-devel or elfutils-libelf-devel #如仍未解决,可自行搜索或尝试解决方案 #编译生成menuconfig配置内核界面所需文件(非必须) sudo apt-get install libncurses5-dev #开发版本管理及自动化包 sudo apt-get install automake#此处可能会有版本号 sudo apt-get install autoconf cvs subversion
开始编译驱动程序sbull
进入sbull文件夹,make
一举编译成功了,看来确实是内核版本的问题。
安装模块:insmod sbull.ko
dmesg查看日志
查看模块信息:lsmod
看到了sbull
查看块设备信息:fdisk -l /dev/sbulla
格式化块设备:mkfs.ext4 /dev/sbulla
它说Filesystem too small for a journal,我不懂
挂载和使用块设备
之后可以像使用其他硬盘一样使用此设备
查看加载结果:mount
查看使用情况
可以看到计数变为1了
进入设备创建一个文件
卸载后重新挂载
发现卸载后数据不见了,但是重新挂载后,数据又恢复了。
卸载磁盘
卸载/mnt/sbull的挂载,等待时间超过30秒后,当尝试再次挂载/dev/sbulla设备时,系统提示必须指明该块设备上的分区类型。说明设备已经格式化 。
卸载内核模块
来源地址:https://blog.csdn.net/qq_51794847/article/details/128432277