我花了一段时间才弄清楚这个问题,但我一直陷入困境,似乎无法找到解决方案。
所以基本上我想将本地 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