파일 시스템 쓰기가 손실된 것 같습니다.

파일 시스템 쓰기가 손실된 것 같습니다.

저는 tcpdump를 실험해 본 결과 매우 이상한 파일 시스템 동작을 발견했습니다. 이는 tcpdump 문제가 아닌 것 같습니다. 이에 대해서는 나중에 설명하겠습니다.

다음 명령은 파일을 생성하지 않습니다.

tcpdump -w test.pcap

그러나 이 명령은 예상대로 PCAP 파일을 생성합니다.

tcpdump -w - > test.pcap

처음에는 tcpdump가 쉘에서 발생하지 않은 파일에 쓰는 동안 오류가 발생했다고 생각했습니다. 그래서 추적한 결과 쓰기가 제대로 진행되고 있음을 발견했습니다!

open("test.pcap", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4 
fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff9bf5cb000
rt_sigaction(SIGUSR1, {0x4557d0, [], SA_RESTORER, 0x7ff9bea2ab60}, {SIG_DFL, [], 0}, 8) = 0 
write(2, "tcpdump: ", 9tcpdump: )                = 9 
write(2, "listening on eth0, link-type EN1"..., 73listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes) = 73
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(4, "\324\303\262\241\2\0\4\0\0\0\0\0\0\0\0\0\377\377\0\0\1\0\0\0001\2\210P\34\3\3\0"..., 4096) = 4096
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(4, "\232\241\4\17X\213\f9+\225\35\t\364QF\223\242\7\217Y\226\373l\231vQ\354\223\250i\336."..., 4096) = 4096
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])
write(4, "\34\226\346%\354\210\342\331\377\373\222d\261\0\5\207wX\6i`\0U\260\350\260\300\250\0\16\335\241"..., 4096) = 4096

test.pcap은 파일 설명자 4로 열리고 요청된 바이트 수가 실제로 기록되었음을 보고하는 시스템 호출과 함께 해당 설명자에 여러 번 쓰기가 수행됩니다.

그래도 파일이 생성되지 않습니다. test.pcap에 대한 파일 시스템을 검색했지만 아무것도 찾지 못했습니다.

무엇이 이런 행동을 유발할 수 있습니까?

tcpdump version 4.3.0
libpcap version 1.3.0
GNU bash, version 4.2.37(1)-release (x86_64-pc-linux-gnu)
Linux persephone 3.4.9-gentoo #1 SMP Wed Oct 3 10:02:39 EDT 2012 x86_64 Intel(R) Xeon(R) CPU E5645 @ 2.40GHz GenuineIntel GNU/Linux

답변1

tcpdump파일에 대해 다른 작업이 수행되고 있습니다. 당신은 전체 명령줄이 무엇인지 말하지 않았습니다. 아마도 -G거기에 하나가 있을 것입니다.

추가 조사를 위한 가능한 방법:-

  1. strace 출력을 계속 살펴보세요. 이름 변경이나 링크 해제를 찾을 수 있을 것입니다.
  2. tcpdump가 실행 중일 때 이를 실행 ln test.pcap pin.test.pcap하면 나중에 파일의 링크가 해제되었는지 알 수 있습니다.
  3. tcpdump가 실행되면 해당 프로세스 ID를 찾고 ls -l /proc/${pid}/fd열려 있는 파일의 전체 경로 이름에 대한 링크를 찾을 수 있는지 확인하세요. (@Gilles의 의견에 따르면 이것이 실제로 작동하는 것입니다.)

관련 정보