AWS EC2 Ubuntu 16.04实例snd-aloop内核模块加载失败问题
你碰到的这个问题,核心原因是AWS定制的aws后缀内核是专门针对云环境优化裁剪过的,默认砍掉了snd-aloop这类非云场景必需的音频模块——虽然标准Ubuntu 16.04的generic内核预装了这个模块,但AWS的定制内核并没有包含它。下面给你两种可行的解决办法:
方法一:切换到Generic内核(推荐,操作更简单)
你已经在实例里看到了/lib/modules/4.4.0-116-generic目录,说明generic内核已经安装,只需要切换到这个内核就能解决问题:
确认generic内核的GRUB菜单名称
先查看GRUB里的内核列表:grep menuentry /boot/grub/grub.cfg | grep generic输出会类似这样:
menuentry 'Ubuntu, with Linux 4.4.0-116-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-116-generic-advanced-xxxxxx' {
修改GRUB默认启动项
编辑GRUB配置文件:sudo nano /etc/default/grub找到
GRUB_DEFAULT=0这一行,替换成刚才查到的generic内核菜单条目(注意保留引号):GRUB_DEFAULT="Ubuntu, with Linux 4.4.0-116-generic"保存退出编辑器(按
Ctrl+O回车,再Ctrl+X)。更新GRUB并重启实例
sudo update-grub sudo reboot验证并加载模块
重启后确认内核版本:uname -r输出应为
4.4.0-116-generic,之后就能正常加载模块了:sudo modprobe snd-aloop
方法二:为AWS内核编译snd-aloop模块(适合不想切换内核的场景)
如果必须保留当前的4.4.0-1052-aws内核,就得手动编译对应版本的snd-aloop模块:
安装编译依赖
sudo apt-get update sudo apt-get install linux-headers-$(uname -r) build-essential alsa-source解压ALSA源码并编译模块
sudo dpkg -i /usr/src/alsa-source*.deb cd /usr/src sudo tar xfvj alsa-driver.tar.bz2 cd alsa-driver-* sudo ./configure --with-kernel=/lib/modules/$(uname -r)/build --enable-module=yes --with-card=aloop sudo make sudo make install加载编译好的模块
sudo modprobe snd-aloop
注意:这种方法需要每次内核更新后重新编译模块,维护成本比较高,所以更推荐第一种切换内核的方案。
内容的提问来源于stack exchange,提问作者rahul

