VirtualBox虚拟机禁用网络后运行go-bindata出现I/O错误求助
排查VirtualBox虚拟机中go-bindata输入/输出错误的思路
我之前也碰到过类似的VirtualBox虚拟机里二进制文件莫名报IO错误的情况,结合你说的「联网正常、断网就报错」的差异,咱们可以从这几个方向一步步排查:
1. 先确认二进制文件的完整性
虽然你下载后已经验证过工具能正常运行,但断网重启后,VirtualBox的存储同步机制可能悄悄搞坏了文件。你可以对比主机和虚拟机里的go-bindata哈希值:
- 在主机终端运行:
sha256sum /path/to/host/go-bindata - 在虚拟机终端运行:
sha256sum /path/to/bin/go-bindata
如果两个哈希值不一样,说明虚拟机里的文件已经损坏,直接从主机共享文件夹重新复制一份过来(断网状态下也能操作)再试试。
2. 检查VirtualBox的磁盘缓存与存储控制器设置
VirtualBox的磁盘缓存模式有时候会影响离线状态下的文件访问:
- 先关掉虚拟机,打开VirtualBox的「设置」→「存储」,选中虚拟机的磁盘后点击「属性」
- 看看「缓存模式」是不是设成了「直写」或者「无」,改成「回写」试试
- 另外,确认存储控制器是SATA还是IDE,老版本VirtualBox对IDE的兼容性不如SATA,必要时切换成SATA控制器再重启虚拟机测试
3. 排查SELinux/AppArmor等安全模块的干扰
很多Linux发行版默认启用安全模块,可能在断网状态下触发了某种访问限制:
- 临时禁用SELinux试试:
sudo setenforce 0,然后再运行go-bindata - 如果禁用后正常了,就需要给go-bindata设置正确的SELinux上下文:
sudo chcon -t bin_t /path/to/bin/go-bindata - 要是用的是AppArmor,去
/var/log/syslog里搜搜有没有关于go-bindata的拒绝记录,临时禁用对应的profile再测试
4. 验证VirtualBox Guest Additions版本兼容性
Guest Additions和主机VirtualBox版本不匹配,很容易导致文件系统访问异常:
- 检查主机VirtualBox的版本,再看看虚拟机里Guest Additions的版本是否一致
- 如果版本不对,要么更新虚拟机里的Guest Additions,要么把主机VirtualBox更到对应版本
5. 检查虚拟机的内存/交换空间是否充足
有时候内存不足会触发看起来像IO错误的奇怪问题:
- 运行
free -h看看虚拟机的内存和交换空间使用情况 - 如果内存不够,关掉虚拟机里其他没用的进程,或者给虚拟机多分配点内存
- 交换空间不足的话,临时创建一个交换分区:
弄完再测试go-bindatasudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
6. 检查二进制文件的动态链接库依赖
虽然联网时能正常运行,但断网后可能依赖的系统库访问出了问题:
- 运行
ldd /path/to/bin/go-bindata查看这个二进制文件的动态链接依赖 - 逐个检查每个依赖库的路径是否存在、权限是否正常
- 如果有缺失的库,重新安装对应的系统包(比如glibc这类基础库)
内容的提问来源于stack exchange,提问作者Onkar Banerjee
相关产品推荐
相关产品推荐

