服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-11-08 简米科技 3,774 字 9 分钟阅读

虚拟机下nfd安装失败怎么办?详细排查步骤有哪些?

导读虚拟机下NFD安装失败,九成是编译环境问题,先把日志中的error行定位出来,再按依赖、Boost、内存、源这四类原因逐项排查就能解决,先搞清楚失败发生在哪一步NFD(Named Data Networking Forwarding Daemon)的安装流程基本固定:先装依赖库,再编译ndn-cxx,最后编译N……

虚拟机下NFD安装失败,九成是编译环境问题,先把日志中的error行定位出来,再按依赖、Boost、内存、源这四类原因逐项排查就能解决。

先搞清楚失败发生在哪一步

NFD(Named Data Networking Forwarding Daemon)的安装流程基本固定:先装依赖库,再编译ndn-cxx,最后编译NFD本体,不同阶段失败的原因完全不同,看一眼终端输出的最后几行,基本就能判断方向。

  • 卡在./configure或apt install阶段,属于依赖缺失或版本冲突。
  • 卡在make编译中途,优先怀疑内存不足或Boost库异常。
  • 卡在make install或sudo ldconfig,大概率是权限问题或动态链接库路径没写对。

打开终端重新执行失败的命令,这次加上2>&1 | tee build.log,把完整日志存下来,后续所有排查都基于这个日志文件,逐行找error关键字,不要盯着屏幕滚动看。

动手之前先备份虚拟机快照,排查过程可能需要反复安装卸载依赖库,有快照能随时回滚到干净状态。

依赖库缺失导致NFD安装失败的常见场景

NFD对依赖的版本要求很严格,Ubuntu默认源里的某些库版本偏旧,直接编过不去,这是虚拟机上最容易踩的坑,因为很多人用的是精简版镜像,默认源只包含基础包。

常见依赖项对照表

依赖库 用途 缺失时典型报错
libboost-all-dev 智能指针、线程、文件系统 Boost libraries not found
libssl-dev 加密与签名 openssl/ssl.h: No such file
libpcap-dev 网络数据包抓取 pcap/pcap.h: No such file
python3-minimal 构建辅助脚本 python3: command not found
libsqlite3-dev 数据库存储 sqlite3.h: No such file

安装命令分两步走:

sudo apt update
sudo apt install libboost-all-dev libssl-dev libpcap-dev python3-minimal libsqlite3-dev

装完再重新跑一次原来的编译命令,如果报错变成了version相关的提示,说明依赖版本不匹配,继续看下一节。

ubuntu nfd编译报错怎么定位?核心看这4类原因

日志里出现fatal error:开头的行,是编译器在告诉你缺了某个头文件;出现undefined reference则是链接阶段出问题,这两种报错的处理方式完全不同,先分清再动手。

报错1:找不到头文件

fatal error: boost/asio.hpp: No such file or directory这类信息,说明Boost库没装全。libboost-all-dev包含所有Boost组件,但有些教程只让你装libboost-dev,那个包只带核心库,不包含asio、filesystem等扩展组件。

检查当前环境中Boost的安装情况:

dpkg -l | grep boost

如果只有libboost-dev,补装libboost-all-dev,装完再清理一下编译缓存,因为CMake会缓存旧路径:

sudo apt install libboost-all-dev
rm -rf build/

报错2:链接阶段报错

undefined reference to boost::filesystem::...这类错误,通常是Boost版本太旧或gcc版本与NFD要求的C++标准不兼容,NFD 0.7.0及以上版本要求C++14支持完善的编译器,建议把gcc升级到7.5以上:

sudo apt install g++-8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100

重新开一个终端让环境变量生效,然后再编。

报错3:编译中途被kill

虚拟机内存不够是常见原因,NFD编译时单个编译进程能吃掉2GB以上内存,如果虚拟机只分了2GB,编到一半会被OOM killer直接杀掉,终端表现为Killed或者signal 9。

临时方案是先编单核:

make -j1

长期方案是调整虚拟机的内存分配,建议至少4GB内存加上2GB交换分区,分配交换分区的命令:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

报错4:apt源里找不到包

精简版虚拟机镜像默认只配置了main源,缺少universe组件,libboost等包在universe源里,查看当前源配置:

grep -r "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/

如果输出里没有universe字样,编辑源文件把这一行改成:

deb http://archive.ubuntu.com/ubuntu focal main universe

改完先apt update再安装依赖。

虚拟机上编译NFD的环境变量配置细节

编译NFD前,环境变量设置不当会引发一连串奇怪的失败,特别是ndn-cxx库没装到标准路径时,NFD的configure脚本找不到就不继续往下走。

标准的安装路径是/usr/local/lib和/usr/local/include,如果你用了--prefix指定了别的目录,需要手动告诉系统动态链接库的位置:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

把这两行写进~/.bashrc,避免每次开终端都要重设。

行业共识认为,编译NFD之前先单独验证ndn-cxx是否安装成功,方法是用ndn-cxx自带的测试程序跑一遍./waf check,全部通过再回来编NFD,分化问题能省去大量反复排查的时间。

内存和存储空间不足的具体排查手段

有些虚拟机磁盘默认只有10GB,装完系统就剩不到3GB,NFD编译过程产生的中间文件能占5GB以上,磁盘满了之后编译器报错会非常奇怪,比如提示Disk quota exceeded或者写文件失败。

查看磁盘剩余空间:

df -h

如果分区使用率超过85%,清理一下apt缓存:

sudo apt clean

排查内存用free -h,注意看available那一列,如果只有几百MB可用,先加swap再继续。

NFD安装失败后怎么干净卸载重装

反复编译失败后,系统里可能残留了不完整的库文件,直接重新安装也可能被这些残留文件干扰,彻底清理的步骤按顺序执行:

# 卸载已安装的NFD相关文件
sudo rm -rf /usr/local/bin/nfd /usr/local/bin/nrd
sudo rm -rf /usr/local/etc/ndn
# 清理编译目录
cd ~/nfd
./waf clean

如果ndn-cxx也是自己编译的,同样需要清理:

cd ~/ndn-cxx
./waf clean

接着重新从源码开始编译,这次按官方推荐流程逐步执行,每完成一个步骤确认没有警告再继续。

Q&A:NFD安装失败的几个高频问题

问:虚拟机里NFD编译总被Killed是什么原因?

答:内存不足导致OOM,用free -h确认物理内存低于4GB,优先增加swap空间,同时降低并行编译数(make -j1),编译时间会拉长但能稳定完成。

问:NFD安装时提示Boost库版本过低该怎么升级?

答:先看Ubuntu版本和当前Boost版本(dpkg -l | grep libboost),Ubuntu 18.04默认是1.65,NFD 0.7.0要求Boost 1.58以上,满足要求则不是版本问题,如果版本低于要求,需要从源码编译安装新版Boost并指定环境变量BOOST_ROOT。

问:configure阶段提示找不到libpcap但明明装过了?

答:确认装的是libpcap-dev而不是libpcap,只有-dev包才包含头文件和pkg-config信息,装完运行pkg-config --libs libpcap验证,虚拟机的64位系统如果安装了32位库路径,也可能导致搜索不到,用find /usr -name pcap.h手动确认头文件位置。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱