我正在开发一个 pi 设备,我可以将其插入网络,它会自动开始将数据包捕获到旋转文件。该设备背后的想法是,当我的一个客户的端点出现非常不稳定的问题时,他们可以将设备插入镜像端口并使其保持运行,直到问题发生,此时他们可以拔下 pi 并将其发回给我进行分析。
我遇到的问题是,当我再次启动 Pi 以查看它跟踪的 pcap 文件时,它们似乎都是 0 数据包大小。
我正在使用以下命令来执行此操作:
tcpdump -i eth0 -U -W 10 -C 500 -w /opt/tcpdump/packetcapture-$(date +%Y%m%d.%H:%M:%S).pcap
当我实际运行我的小 tcpdump 服务时,它似乎正在写入文件:
-rw-r--r-- 1 root root 104439843 24 Nov 9 11:42 packetcapture-20211109.11:42:41.pcap0
但是当我拔掉设备上的电源插头并重新启动它时,我会看到以下内容:
-rw-r--r-- 1 root root 24 Nov 9 11:42 packetcapture-20211109.11:42:41.pcap0
我真的很好奇为什么?它似乎确实将其写入磁盘,如果我在重新启动之前结束服务,则该文件中包含数据。
我在这里做了一些更根本的错误吗?
答案1
ls
当您在拔掉电脑插头之前键入命令时,您将从内存缓存中获取数据。大多数程序通过缓存写入文件,然后在 write 系统调用返回后实际上不会将任何内容写入磁盘。这使得系统更加高效。
邮件服务器、数据库等敏感程序使用 fsync 系统调用,该系统调用明确要求在发送确认或继续工作之前将文件同步到磁盘。
您有一个sync
命令将缓存中的所有数据刷新到磁盘并随后返回。请重试,并且在此命令结束之前不要拔掉电脑电源。