ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS服务器USB设备网络共享方案:VirtualHere安装配置与避坑指南

CentOS服务器USB设备网络共享方案:VirtualHere安装配置与避坑指南 CentOS服务器上用虚拟机跑Windows业务最让人头疼的往往不是性能而是USB设备怎么共享。U盾、加密狗、打印机、扫描枪、开发板调试器这些东西在物理机上插得好好的一进虚拟机就变得特别别扭。KVM的USB直通每次重启都要重新绑定RDP的USB重定向又依赖远程桌面会话udisks和usbip那套配置起来更是反人类。我折腾了一圈之后最后稳定用下来的方案是VirtualHere。VirtualHere本质上是一个USB over Network工具它把一个插在CentOS主机上的USB设备变成网络设备。这台CentOS就成了USB设备的中转站同一局域网里任意一台装了客户端的电脑都可以像插在本机一样使用这个设备。本文就从我这个实际使用者的角度完整讲一遍在CentOS上装VirtualHere服务端的步骤、客户端连接方法以及我踩过的几个真实的坑适合需要在虚拟机、远程机器或者多台电脑之间共享USB硬件的同学参考。1. 我为什么最终选了VirtualHere虚拟机USB共享的痛点1.1 最初的需求KVM虚拟机里的U盾和加密狗先说下我的实际环境。一台CentOS 7.9的服务器装了KVM虚拟化上面跑着一个Windows虚拟机用于处理财务和税务业务。问题就出在业务离不开银行U盾和税控设备而这俩都是USB口的。我一开始用的是KVM自带的USB直通也就是把宿主机上的USB设备直接分配给虚拟机。这个方案的毛病在于设备一旦分配给虚拟机宿主机自己就不能用了虚拟机重启或者设备重新插拔之后往往需要重新走一遍virt-manager里添加硬件的流程。遇到U盾这种不怎么稳定的设备几乎每周都要折腾一次特别烦。后来我试过usbip就是把USB设备通过网络从主机共享出去。usbip的思路和VirtualHere有点像但它的绑定方式太原始了在客户端上要手动加载内核模块、绑定设备设备掉线后再重连经常直接失败根本不适合给不懂技术的同事用。最后换成VirtualHere体验完全不一样。Windows虚拟机里装一个客户端输入CentOS服务器的IP和端口设备列表就弹出来了点一下就能用。重启虚拟机之后客户端会自动重新连接设备整个过程不需要任何命令行操作。1.2 一句话理解VirtualHere的工作原理VirtualHere的架构特别简单服务端运行在有USB设备的机器上就是你的CentOS客户端运行在需要使用USB设备的机器上。服务端把USB设备的访问能力封装成网络协议客户端收到之后在本机虚拟出一个USB设备。对上层应用来说它以为设备就是插在自己这台机器上。这个设计用一句大白话概括它相当于一根超长USB线把CentOS上的USB口通过网络延长到了任意一台电脑上。和RDP重定向最大的区别是VirtualHere不依赖远程桌面会话。哪怕你只是远程用命令行连到Windows机器或者本来就是一台独立电脑需要访问远端USB设备它都能工作。1.3 和其他USB共享方案放在一起比一比我整理了一个对比表这样看起来更直观方案是否依赖虚拟化设备掉线重连宿主机同时使用配置难度KVM USB直通依赖KVM需要手动重新绑定宿主机无法使用中RDP USB重定向依赖远程桌面会话跟随会话容易掉受限中usbip不依赖差经常挂起互斥高VirtualHere完全不依赖客户端自动重连可以灵活切换低这就是我选择VirtualHere的核心原因稳定、独立、配置成本低。服务端在CentOS上就是个单文件二进制跑起来就完事了客户端又是图形化操作业务那边的同事完全零学习成本。2. 安装前的环境检查与文件准备2.1 确认CentOS版本和CPU架构VirtualHere的服务端虽然是个单文件程序但它区分CPU架构。下载之前先看一主机架构避免下了个跑不起来的文件。cat /etc/redhat-release uname -muname -m输出的结果很关键输出x86_64下载vhusbdx86_64这个版本输出aarch64下载vhusbdarm64这个版本如果是ARM 32位选vhusbdarmv7CentOS 7、8、9我都在不同机器上跑过VirtualHere服务端没遇到系统版本不兼容的问题。VirtualHere官方是静态编译的二进制对glibc没有特殊依赖CentOS 7的老环境也能直接跑。2.2 从官方渠道获取服务端文件VirtualHere官网上有专门的Linux服务端下载页面找到对应架构的文件下载就行。我建议直接wget到服务器上因为从Windows下载再传上去容易出现权限问题不如直接在服务器上下载。cd /usr/local/bin wget VirtualHere官网Linux服务端下载地址/vhusbdx86_64 chmod x vhusbdx86_64这里提醒一句千万不要去第三方博客或者不知名站点下载所谓的破解版绿化版。VirtualHere服务端是要以root权限运行的程序还要读取USB设备别人给你的二进制完全可以做到你在服务器上的一切操作。官网下载虽然可能慢一点点但至少安全。2.3 下载后先做两个小验证文件下完之后别急着跑先看一眼文件信息file /usr/local/bin/vhusbdx86_64 ldd /usr/local/bin/vhusbdx86_64file命令能看出是不是ELF可执行文件ldd如果输出not a dynamic executable或者statically linked说明是静态编译这种版本在任意CentOS上都能直接跑。如果ldd弹出很多共享库依赖那就得注意系统的glibc版本够不够新。另外一个很容易被忽略的点是系统时间。VirtualHere的客户端和服务端通信时对时间比较敏感如果服务器时间偏差太大可能会出现连接不稳定或者授权验证异常的状况。检查命令date -R如果时间不对先同步时间再往下走yum install -y ntpdate ntpdate ntp.aliyun.com3. 服务端安装、systemd托管与防火墙配置3.1 首次运行验证服务端是否正常VirtualHere服务端没有传统的安装过程核心就是一个二进制文件。首次运行我建议直接前台执行先看日志输出cd /usr/local/bin ./vhusbdx86_64正常情况下终端会滚动输出类似日志信息里面会有当前服务器的状态。如果你这时候已经在CentOS上插了U盘或者其他USB设备日志中会列出识别到的USB设备信息。看到这些信息就说明程序本身跑起来了。用CtrlC停掉它注意观察程序退出的过程这能帮你排除端口被占用之类的基础问题。提示VirtualHere免费授权一般够你共享一台USB设备用来跑通流程。个人非商用时先用免费模式完全没问题多设备共享或者商用再去官网处理许可证。3.2 用systemd把服务托管起来前台的进程一关就没了我们肯定希望它开机自启、崩溃自动拉起。在CentOS 7之后的系统上正确做法是写一个systemd service文件。不要用rc.local那东西在CentOS 9上已经被弱化到要手动放行执行权限维护起来很别扭。创建服务文件vim /etc/systemd/system/vhusbd.service写入以下内容[Unit] DescriptionVirtualHere USB Server Afternetwork.target [Service] Typesimple ExecStart/usr/local/bin/vhusbdx86_64 WorkingDirectory/usr/local/bin Restarton-failure RestartSec3 [Install] WantedBymulti-user.target这里有几个细节值得说明一下。我特意用了Typesimple直接前台运行没有加-b后台参数。这样systemd能精准地跟踪主进程一旦程序崩溃Restarton-failure马上就能拉起新进程。如果用Typeforking加-b后台模式程序启动后会fork出子进程systemd对PID的跟踪反而容易出问题日志也会散落到文件里而不是统一进journald。WorkingDirectory/usr/local/bin这个配置也很重要。VirtualHere会把它的配置信息生成在当前工作目录下。如果不固定工作目录你用systemd启动和手动启动就会生成不同路径的配置表现出来就是明明设置了密码重启服务后又没了这种诡异问题。固定工作目录之后配置就统一在了/usr/local/bin下。写完服务文件之后按顺序执行systemctl daemon-reload systemctl enable vhusbd systemctl start vhusbd systemctl status vhusbd如果看到Active: active (running)服务端就正式跑起来了。3.3 防火墙放行7575端口VirtualHere服务端默认监听TCP 7575端口。CentOS上最常见的问题是程序跑得好好的客户端却死活连不上十有八九是防火墙挡了。如果你的系统用的是firewalldfirewall-cmd --permanent --add-port7575/tcp firewall-cmd --reload firewall-cmd --list-ports如果提示command not found说明系统没装firewalld直接用iptables也行iptables -I INPUT -p tcp --dport 7575 -j ACCEPT service iptables save另外如果你这台CentOS是跑在VMware或者VirtualBox里的虚拟机别忘了检查虚拟网络编辑器和NAT端口转发设置。桥接网卡一般没问题NAT模式下宿主机和外部机器要访问这个7575端口需要在虚拟网络设置里加一条转发规则。3.4 确认端口监听状态防火墙规则配好之后从CentOS本机上验证一下端口ss -lntp | grep 7575能看到LISTEN状态就说明服务端在正常监听了。到这里服务端安装这部分就算彻底搞定了。4. 客户端连接与设备共享的完整流程4.1 Windows客户端连接CentOS服务端服务端起来之后在需要使用USB设备的Windows机器上安装VirtualHere客户端。官网有Windows版本客户端下载有的版本解压出来直接运行exe即可不需要安装。打开客户端界面主界面就是Add VirtualHere Server入口输入CentOS服务器的IP地址和端口号格式是192.168.1.100:7575然后连接。首次连接成功后客户端会列出CentOS上当前插着的所有USB设备。找到你要用的那个设备鼠标右键选择Use this device。这时候Windows会像真插入了一个USB设备一样弹出发现新硬件、自动安装驱动。驱动装完这个设备就正常出现在Windows的设备管理器里了。我那个银行U盾在Windows虚拟机里就是这么用的客户端连接之后U盾的驱动正常加载银行官网的网银助手也能正常识别和我直接把U盾插在Windows物理机上没有任何区别。4.2 Linux和Mac客户端的连接方式如果你是做开发的可能需要在另一台Linux机器上访问CentOS共享的USB设备。VirtualHere也有Linux客户端。Linux客户端通常是命令行或者GUI两种用法和Windows类似先连接服务器IP再选择设备。Mac客户端和Windows基本一致同样是图形界面适合团队里用Mac的同事访问开发板调试器、加密狗这类设备。我实际使用中发现客户端连接的设备可以随时在各个电脑间切换。同一台CentOS上插着一个USB Key你上午在Windows虚拟机里用下午切到Mac上用只要在客户端里断开再连接就行物理插拔完全不必要。4.3 自动连接和访问控制设置实际业务场景里不可能每次重启虚拟机都让用户去手动连接设备。VirtualHere客户端里有一个很重要的选项右键某个设备勾选Connect this device automatically when available。勾上之后只要设备出现在服务端列表里且客户端能访问到这台服务器就会自动建立连接。这个功能我强烈建议在Windows虚拟机里配置好不然虚拟机一重启U盾不会自动挂载财务同事又要来喊你处理问题。关于安全性VirtualHere服务端可以设置访问密码。客户端连接服务器时右键服务器名称可以修改或者设置服务器密码。配置之后其他客户端要连这台服务器就必须输入正确的密码避免同一局域网里的其他电脑随意占用USB设备。有一点要说清楚不是所有USB设备都适合多个客户端同时使用。像打印机、扫码枪这类天然支持多会话的设备还行但像U盾、加密狗这种存储类设备同一时间只能被一个客户端使用。VirtualHere也遵循这个限制A客户端用着B客户端再连会提示设备忙或者自动踢掉之前的连接。这是USB协议本身的问题不是VirtualHere的缺陷。5. 我在CentOS上实际踩过的坑与排查思路5.1 客户端能ping通服务器但就是连不上7575这个坑我踩过好几次而且每次原因都不太一样但排查路径是固定的。第一步查服务端进程还活着没。跑systemd模式的好处就是这里体现出来了systemctl status vhusbd如果服务状态是failed看日志journalctl -u vhusbd -n 50第二步查端口监听ss -lntp | grep 7575这一步能区分是服务端压根没起来还是起来了但监听在错误地址上。第三步查防火墙firewall-cmd --list-all看ports里有没有7575/tcp。没有就加上。第四步是CentOS特有的问题SELinux。我有一次在CentOS 8上装好之后客户端一直连不上进程和端口都正常防火墙也放行了。后来查SELinux的AVC日志ausearch -m avc -ts recent发现是SELinux拦截了程序的行为。当时我用的临时处理方法是调整文件上下文restorecon -v /usr/local/bin/vhusbdx86_64如果restorecon之后还不行再用setsebool或者写SELinux策略。我不建议为了装一个软件就直接把SELinux设成disabledCentOS默认安全机制没必要一上来就关掉。5.2 USB设备在列表里能看到但一连就断开这个问题出现在一个USB转串口设备上设备在客户端列表里能看到点连接之后不到三秒就断开。排查思路是这样先在CentOS上确认设备本身是好的lsusb能看到设备说明USB层面没问题。然后检查设备是不是被宿主机上的某个进程占用了lsof /dev/bus/usb/001/xxx当时发现是宿主机上某个服务程序在轮询这个USB设备导致VirtualHere无法拿到设备的独占控制权。关掉那个服务之后再连接就稳定了。另外凡是USB转串口、USB转并口这类设备连到客户端之后驱动一定要装对。Windows自带的驱动经常识别成未知设备得去芯片厂商官网下载对应驱动这个步骤容易卡住新手。5.3 systemd方式启动后客户端找不到设备手工启动却正常这个问题特别隐蔽。我在另一台CentOS上遇到的情况是手工在/usr/local/bin目录下执行./vhusbdx86_64客户端一切正常但改成systemd启动后设备列表是空的。最后查出来是WorkingDirectory没设置导致systemd启动时的工作目录是/。VirtualHere把它自己的运行状态文件写到根目录读取的时候也按根目录来结果和设备相关的配置没有加载成功。加上WorkingDirectory/usr/local/bin之后立刻恢复正常。所以我的建议是systemd服务文件里最好显式指定WorkingDirectory不要让程序在不确定的位置运行。5.4 升级二进制文件的正确姿势后来VirtualHere服务端有过一次升级。我一开始想得很简单直接把新版本二进制覆盖到/usr/local/bin/vhusbdx86_64然后systemctl restart vhusbd结果客户端连接不上。原因倒也不复杂新版本程序启动时生成了新的状态信息和配置结构和旧版本不完全兼容。我的处理方法是停止服务systemctl stop vhusbd备份原来的配置和旧二进制上传新版本二进制并chmod x启动服务systemctl start vhusbd客户端删除掉旧的服务器连接记录重新添加这个方法顺利解决了升级后的问题。另外升级前最好先看一眼官方更新说明有时候明确写着升级需要先卸载旧版这个就按官方要求来。5.5 设备权限的补充说明如果你用的CentOS是精简安装udev规则可能不完整偶尔会遇到USB设备权限不够的问题。表现是服务端日志里能看到设备客户端连接时直接报权限错误。检查一下设备节点的权限ls -l /dev/bus/usb/001/正常情况这些设备节点都是root root权限VirtualHere以root运行能读写。如果你为了让服务端降低权限而自定义了用户那就要手工调整udev规则给特定用户授权访问USB设备。我个人的建议是内网环境里跑VirtualHere直接用root级别的systemd服务是最省心的不需要为了安全刻意降权运行反而把权限问题搞复杂了。最后分享两个小经验用了这么久VirtualHere有两个习惯我觉得很值得保持。第一个是定期检查服务端日志。VirtualHere的日志输出到journald之后我写了一个简单的定时任务每天检查journalctl -u vhusbd有没有报错有异常就发告警。因为USB设备共享这种东西平时用着没事一旦出问题用户感知特别明显早发现早处理能省很多麻烦。第二个是客户端和服务器的时间同步不能忽视。我遇到过客户端连接后设备列表频繁刷新后来发现是服务器时间慢了五分钟。把NTP配置好之后就稳定了。这个小问题排查起来特别浪费时间写出来提醒大家。VirtualHere这套方案我用了将近一年从CentOS 7到CentOS 9都跑过稳定性比之前那些方案靠谱太多。如果你现在正被USB设备共享问题折磨建议照着这篇文章搭一套试试整个过程半小时以内就能跑通。真出问题了优先看日志别瞎猜。
返回列表