尝试跑 p4factory app int,其 vxlan 内核模块目前只支持内核版本 3.19,而当前 ubuntu 16.04 默认内核版本都为 16.04,内核模块编译不过,因此需要安装旧版内核并默认启动旧版内核。
完整流程
下载旧 Linux 内核版本
见 askubuntu David Foerster 的答复。从 Kernel/MainlineBuilds 下载旧版内核 deb,链接,这里以 3.19.8-vivid 为例。
- headers, 32-bit, 64-bit
- images, 32-bit, 64-bit
安装旧 Linux 内核版本
- 安装依赖
sudo apt-get install module-init-tools
- 修改
/usr/src/linux-headers-3.19.8-031908-generic/include/generated/utsrelease.h
宏#define UTS_UBUNTU_RELEASE_ABI 031908
为#define UTS_UBUNTU_RELEASE_ABI 31908
。 - 使用
sudo dpkg -i xxx.deb
,将 xxx 替换为你下载的 headers 和 images。
失败log - 未安装 module-init-tools
1 | sunyongfeng@openswitch-OptiPlex-380:~/Downloads$ sudo dpkg -i linux-headers-3.19.8-031908_3.19.8-031908.201505110938_all.deb |
失败 log - 未修改 utsrelease.h
1 | sunyongfeng@openswitch-OptiPlex-380:~/Downloads$ sudo apt-get install module-init-tools |
查看 make.log 发现,dkms 将 /usr/src/linux-headers-3.19.8-031908-generic/include/generated/utsrelease.h
的十进制数宏 #define UTS_UBUNTU_RELEASE_ABI 031908
用成八进制数(估计是不兼容旧版本导致,不过 utsrelease.h 的这种写法也很别扭,因为默认使用 0
做为前导码标识八进制数)。将该宏改为 #define UTS_UBUNTU_RELEASE_ABI 31908
即可。
1 | sunyongfeng@openswitch-OptiPlex-380:~/Downloads$ vi /var/lib/dkms/lttng-modules/2.8.0/build/make.log |
修改后 log:
1 | sunyongfeng-380:~/Downloads$ sudo dpkg -i linux-image-3.19.8-031908-generic_3.19.8-031908.201505110938_amd64.deb -OptiPlex |
修改 grub
详见 Set “older” kernel as default grub entry 中 DaimyoKirby 的回答。
- 备份 grub 配置,
sudo cp /etc/default/grub /etc/default/grub.bak
- 修改 grub 配置,
sudo vi /etc/default/grub
,将GRUB_DEFAULT=0
改为GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 3.19.8-031908-generic"
。Advanced options for Ubuntu
表示 grub 的第一级菜单>
表示接下一级菜单Ubuntu, with Linux 3.19.8-031908-generic
表示第二级菜单- 以上菜单都可在
/boot/grub/grub.cfg
中指到原始字符
- 更新 grub,
sudo update-grub
确认修订成功
更新 grub 后,sudo shutdown -r 0
重启设备,重新登陆设备,通过 uname -a
确认内核已更新为旧版内核。
1 | sunyongfeng@openswitch-OptiPlex-380:~/workshop/p4factory$ uname -a |