断电时 tcpdump 不会将数据包存储到文件中

断电时 tcpdump 不会将数据包存储到文件中

我正在开发一个 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命令将缓存中的所有数据刷新到磁盘并随后返回。请重试,并且在此命令结束之前不要拔掉电脑电源。

相关内容