Ubuntu更换指定版本内核

背景

Linux块设备驱动程序在5.15高版本内核下编译报错。这样就有两种办法:

  1. 修改驱动程序代码以适应版本更改
  2. 换用低版本内核

第一种办法由于我水平太低,是无法选的
所以只好换一个低版本内核,哪想到就遇到了许多问题

更换指定内核

具体操作:具体操作

以5.4.0版本为例

	wget https://raw.githubusercontent.com/pimlie/ubuntu-mainline-kernel.sh/master/ubuntu-mainline-kernel.sh
	chmod +x ubuntu-mainline-kernel.sh
	sudo 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 ,下载vim

    su -

    apt-get vim
    

    备份源

    	cp /etc/apt/sources.list /etc/apt/sources.list.bak
    

    手动替换或命令替换

    vim /etc/apt/sources.list
    

    去镜像源网站找替换的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设备时,系统提示必须指明该块设备上的分区类型。说明设备已经格式化 。

卸载内核模块
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51794847/article/details/128432277
今日推荐