如何在AWS EC2实例上编译自定义Linux内核解决模块缺失问题
AARCH64架构AWS EC2 SocketCAN vcan模块缺失解决方案
方案优先级
- 优先方案(无风险,无需编译):90%以上官方AARCH64镜像的vcan模块已经包含在额外模块包中,无需重编内核,直接安装对应包即可:
- Amazon Linux 2/2023:执行
sudo dnf install -y kernel-modules-extra-$(uname -r),安装完成后直接执行sudo modprobe vcan即可加载模块 - Ubuntu/Debian:执行
sudo apt install -y linux-modules-extra-$(uname -r),安装完成后执行sudo modprobe vcan验证加载
- Amazon Linux 2/2023:执行
- 次优方案(推荐,耗时短):如果额外模块包未包含对应模块,选择单独编译vcan及依赖模块,无需全量重编内核,耗时通常在10分钟以内
- 兜底方案:如果需要同步调整其他内核配置,再选择全量重编内核替换现有内核
单独编译vcan模块操作流程
- 安装编译依赖
按发行版执行对应命令安装编译工具链:- Amazon Linux 2/2023:
sudo dnf install -y gcc make perl elfutils-libelf-devel bison flex - Ubuntu/Debian:
sudo apt update && sudo apt install -y build-essential libelf-dev bison flex bc
- Amazon Linux 2/2023:
- 获取匹配版本内核源码
必须使用和当前运行内核版本完全一致的源码,避免版本不匹配导致模块加载失败:- 先查询当前内核版本:
uname -r,记录输出的完整版本号 - Amazon Linux:执行
sudo dnf download --source kernel-$(uname -r)下载对应版本源码包,解压到工作目录 - Ubuntu/Debian:执行
apt source linux-image-$(uname -r)拉取匹配版本源码
- 先查询当前内核版本:
- 准备编译配置
进入内核源码根目录,导入当前运行内核的现有配置:
编辑cp /boot/config-$(uname -r) .config make olddefconfig.config文件,确认以下配置项生效,缺失则手动补全:
其中CONFIG_CAN=y CONFIG_CAN_RAW=m CONFIG_CAN_BCM=m CONFIG_CAN_GW=m CONFIG_CAN_VCAN=mCONFIG_CAN=y是vcan模块的基础依赖,必须开启,否则模块无法正常加载。 - 编译CAN相关模块
仅编译CAN驱动目录下的模块,无需全量编译内核:make M=drivers/net/can modules -j$(nproc) - 安装并加载模块
执行sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/can sudo cp drivers/net/can/*.ko /lib/modules/$(uname -r)/kernel/drivers/net/can/ sudo depmod -a sudo modprobe vcanlsmod | grep vcan,如果能看到vcan模块输出则代表加载成功。
全量重编内核部署流程(仅在需要调整多内核配置时使用)
操作前必须为EC2实例根卷创建快照备份,避免内核配置错误导致实例无法启动,故障时可通过快照回滚恢复。
- 依赖安装、源码获取、配置准备步骤和上述单独编译模块的步骤完全一致。
- 全量编译内核、模块及设备树:
注意AARCH64架构的内核镜像为make -j$(nproc) Image modules dtbsImage,不要使用x86架构的bzImage参数。 - 安装内核模块:
sudo make modules_install - 部署内核镜像及启动文件:
sudo cp arch/arm64/boot/Image /boot/vmlinuz-$(uname -r)-custom sudo cp .config /boot/config-$(uname -r)-custom sudo dracut -f /boot/initramfs-$(uname -r)-custom.img $(uname -r)-custom # Ubuntu/Debian系统将上一行dracut命令替换为:sudo mkinitramfs -o /boot/initrd.img-$(uname -r)-custom $(uname -r)-custom - 更新GRUB启动配置,设置新内核为默认启动项后重启:
sudo update-grub # 根据grub菜单实际条目调整默认启动项,Amazon Linux可直接修改/boot/grub2/grub.cfg设置默认启动内核 sudo reboot - 实例重启后,执行
uname -r确认运行的是新编译内核,执行modprobe vcan验证模块正常加载即可。
内容的提问来源于stack exchange,提问作者Tuthmosis
相关产品推荐
相关产品推荐

