寻求RocketRAID 640在Ubuntu 16.04/Kernel 4.13下的适配方案
解决RocketRAID 640在Ubuntu 16.04下的兼容问题
我之前帮朋友处理过类似的RocketRAID控制器在新Ubuntu内核下的适配难题,给你几个实际可行的思路,不用急着换硬件:
1. 给旧驱动打内核适配补丁
官方驱动只针对旧版内核开发,新内核的API和结构体有不少变化,这就是你编译失败的核心原因。可以尝试手动修改驱动源码适配新内核:
- 先下载官方提供的对应旧内核版本的驱动源码包(比如针对3.x或早期4.x内核的版本),解压到本地目录
- 执行
make编译,记下报错的关键信息(比如某个函数未定义、结构体成员不存在) - 对照Ubuntu 16.04当前内核的头文件(路径一般是
/usr/src/linux-headers-$(uname -r)/),修改驱动源码里的对应部分:比如如果是struct file_operations里的owner成员被移除,就删掉相关代码;如果是函数参数变化,就调整参数格式 - 修改完成后重新编译安装:
make clean && make && sudo make install,然后加载驱动模块sudo modprobe rr640 - 如果自己改源码有难度,把编译报错的完整信息贴到Linux社区论坛,大概率有人能帮你写出适配补丁
2. 用DKMS实现驱动自动适配内核
DKMS(Dynamic Kernel Module Support)可以让驱动在每次内核更新时自动重新编译,避免每次升级内核都要手动折腾:
- 先创建DKMS兼容的驱动目录:
sudo mkdir -p /usr/src/rr640-1.0(这里的1.0替换成你的驱动版本号) - 把解压后的驱动源码全部复制到这个目录,然后在目录里创建
dkms.conf文件,内容如下:PACKAGE_NAME="rr640" PACKAGE_VERSION="1.0" CLEAN="make clean" BUILT_MODULE_NAME[0]="rr640" BUILT_MODULE_LOCATION[0]="./" DEST_MODULE_LOCATION[0]="/kernel/drivers/scsi" AUTOINSTALL="yes" - 添加驱动到DKMS:
sudo dkms add -m rr640 -v 1.0 - 编译安装:
sudo dkms build -m rr640 -v 1.0,如果编译失败还是要先修改源码适配当前内核,之后再执行sudo dkms install -m rr640 -v 1.0
3. 降级Ubuntu内核到驱动支持的版本
这是最省心的方案,如果你不想折腾源码编译:
- 先确认官方驱动支持的最高内核版本(比如假设是4.4.x,Ubuntu 16.04默认内核就是这个系列,但如果你升级过内核就需要降级)
- 安装旧版本内核:
sudo apt-get install linux-image-4.4.0-210-generic linux-headers-4.4.0-210-generic(版本号可以通过apt-cache search linux-image-4.4查询可用的旧版本) - 重启系统,在GRUB菜单的「Advanced options for Ubuntu」里选择安装的旧内核启动
- 此时再安装官方驱动,应该就能正常编译加载了
- 可以执行
sudo update-grub确保旧内核在启动菜单中,还能修改GRUB配置设置默认启动旧内核,避免误更新内核导致驱动失效
4. 切换到JBOD模式+软件RAID(长期最稳定方案)
很多RAID控制器支持切换到JBOD(Just a Bunch Of Disks)模式,此时控制器只做硬盘转接,不处理RAID逻辑,你可以用Ubuntu原生支持的mdadm做软件RAID:
- 开机时按控制器的BIOS快捷键(一般是Ctrl+R)进入RocketRAID的配置界面,把现有的RAID阵列改成JBOD模式
- 重要提醒:操作前一定要备份所有数据!虽然理论上JBOD模式不会破坏数据,但保险起见先备份
- 进入Ubuntu后,用
lsblk确认所有硬盘都能被识别,然后用mdadm创建软件RAID(比如创建RAID5:sudo mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde) - 之后格式化挂载即可,软件RAID不受厂商驱动限制,Ubuntu对
mdadm的支持非常完善,稳定性也有保障
内容的提问来源于stack exchange,提问作者DGCupit
相关产品推荐
相关产品推荐

