如何在 AWS EC2 Ubuntu 内核版本上安装 usbip vhci_hcd 驱动程序

如何在 AWS EC2 Ubuntu 内核版本上安装 usbip vhci_hcd 驱动程序

我花了一段时间才弄清楚这个问题,但我一直陷入困境,似乎无法找到解决方案。

所以基本上我想将本地 USB 连接到 AWS EC2 实例,在 Linux 上执行此操作的方式是通过usbip,但现在的问题在于 EC2 内核实例,它们没有默认安装驱动程序,并且驱动器需要在系统上加载精确的规格。

现在,我一直在尝试手动编译驱动程序,但我还没有成功完成,原因是系统没有编译特定的.ko模块,但同时,.ko安装的其他模块不受内核支持。

我所遵循的步骤是从 Ubuntu 上获取的,关于如何构建我的内核:https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel

这是从 EC2 中提取正在使用的正确内核版本,其他步骤如下:

ubuntu@:~$ sudo cp /boot/config-$(uname -r) .config
ubuntu@:~$ sudo cp /usr/src/linux-headers-$(uname -r)/Module.symvers .
ubuntu@:~$ sudo make menuconfig
ubuntu@:~$ sudo make modules_prepare && sudo make M=drivers/usb/usbip
ubuntu@:~$ sudo insmod drivers/usb/usbip/usbip-core.ko && sudo insmod drivers/usb/usbip/vhci-hcd.ko

但即使模块编译了,也没有 .ko 驱动程序,也没有编译好的驱动程序。

有没有办法usbip在 EC2 实例上在 AWS 上工作?usbip驱动程序还有其他解决方案吗?

答案1

因此,我从 AWS Support 团队的某个人那里得到了这个问题的答案。希望这个答案能帮助有需要的人。

您联系了 AWS Support,因为您希望在 AWS EC2 实例上使用 usbip 客户端,但发现 Ubuntu[18|20] AMI 上没有可用的必需内核模块(usbip-core、vhci-hcd)。您希望我们帮助您解决此问题并找到让 usbip 在 AWS EC2 实例上运行的方法。

在位于 us-east-1 AWS 区域的测试环境中,我从最新的 Amazon Linux 2 (ami-0be2609ba883822ec) AMI 和 Ubuntu 20.04 (ami-0885b1f6bd170450c) AMI 启动了测试 EC2 实例。

我发现 Amazon Linux 2 有必需的驱动程序:

# uname -r
4.14.209-160.339.amzn2.x86_64
# modinfo vhci_hcd usbip_core | grep filename
filename:       /lib/modules/4.14.209-160.339.amzn2.x86_64/kernel/drivers/usb/usbip/vhci-hcd.ko
filename:       /lib/modules/4.14.209-160.339.amzn2.x86_64/kernel/drivers/usb/usbip/usbip-core.ko

但是,在启用 EPEL 存储库[1] 后,我并没有找到 usbip 用户空间工具,并且扫描了可能包含此二进制文件的软件包:

# yum provides */usbip | grep bin

并从 sourceforge[2] 上的 tarball 中继续安装它:

# yum install autoconf libtool libsysfs-devel glib*
# wget https://downloads.sourceforge.net/project/usbip/usbip/0.1.7/usbip-0.1.7.tar.gz 
# tar -xzf usbip-0.1.7.tar.gz
# cd usbip-0.1.7/src
# ./autogen.sh
# ./configure
# make install

默认情况下,它安装在 /usr/local/bin 中,可以使用配置文件将其添加到 PATH:

# echo "export PATH=$PATH:/usr/local/bin" > /etc/profile.d/path.sh && source /etc/profile.d/path.sh
# usbip --help

对于 Ubuntu 20.04,我发现驱动程序在“linux-image-extra-virtual”中可用,并且我已使用 5.4.0-58-generic 内核安装了它:

# uname -r
    5.4.0-1029-aws
# apt update
# apt install linux-image-extra-virtual
# find /usr/ -iname "vhci*"
/usr/lib/modules/5.4.0-58-generic/kernel/drivers/usb/usbip/vhci-hcd.ko
..
# find /usr/ -iname "usbip*"
/usr/lib/modules/5.4.0-58-generic/kernel/drivers/usb/usbip
/usr/lib/modules/5.4.0-58-generic/kernel/drivers/usb/usbip/usbip-core.ko
/usr/lib/modules/5.4.0-58-generic/kernel/drivers/usb/usbip/usbip-vudc.ko
/usr/lib/modules/5.4.0-58-generic/kernel/drivers/usb/usbip/usbip-host.ko
..

添加了启动时加载的驱动程序:

# echo "vhci_hcd" >> /etc/modules-load.d/modules.conf
# echo "usbip_core" >> /etc/modules-load.d/modules.conf

然后安装usbip:

# apt install linux-tools-5.4.0-58-generic

然后根据我的 /boot/grub/grub.cfg 中的 $menuentry_id_option 修改 grub 以使用 5.4.0-58-generic 而不是 5.4.0-1029-aws 启动

# grep -A1000 submenu  /boot/grub/grub.cfg |grep menuentry
  submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-175c087c-0fe9-4d62-a38d-e5f8a66a5851' {
  ..
    menuentry 'Ubuntu, with Linux 5.4.0-58-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.4.0-58-generic-advanced-175c087c-0fe9-4d62-a38d-e5f8a66a5851' {
  ..
vim /etc/default/grub
  #GRUB_DEFAULT=0
  GRUB_DEFAULT="gnulinux-advanced-175c087c-0fe9-4d62-a38d-e5f8a66a5851>gnulinux-5.4.0-58-generic-advanced-175c087c-0fe9-4d62-a38d-e5f8a66a5851"

然后更新 grub,重新启动 ec2 实例,并验证 usbip 和加载模块:

# update-grub && reboot
# uname -r
5.4.0-58-generic
# lsmod | grep vhci
vhci_hcd               53248  0
usbip_core             36864  1 vhci_hcd

# usbip --help

相关内容