/proc를 읽을 때 어떤 기능이 실행되고 있는지 확인하는 방법

/proc를 읽을 때 어떤 기능이 실행되고 있는지 확인하는 방법

netstat에서 일부 소켓을 숨기는 커널 모듈을 작성하려고 합니다. netstat의 작동 방식을 확인한 결과 /proc/net/tcp.

이제 나는 막혔습니다. 파일을 읽을 때 무슨 일이 일어나는지 알아내려고 노력 중입니다 /proc/net/tcp. Google 조사를 통해 기능을 사용하고 있다는 것을 알게되었습니다 tcp4_seq_show.

내 질문은 인터넷 검색 없이 어떤 기능이 사용되는지 어떻게 알 수 있습니까?

나는 strace를 사용해 보았습니다 -

strace -y -yy -v cat /proc/net/tcp

그러나 출력에는 tcp4_seq_show이 함수나 다른 커널 함수에 대한 참조가 포함되어 있지 않습니다.

관련 출력 -

arch_prctl(ARCH_SET_FS, 0x7ff5ec3e1580) = 0
mprotect(0x7ff5ec3d6000, 12288, PROT_READ) = 0
mprotect(0x55c369b3b000, 4096, PROT_READ) = 0
mprotect(0x7ff5ec420000, 4096, PROT_READ) = 0
munmap(0x7ff5ec3e2000, 71701)           = 0
brk(NULL)                               = 0x55c36a40e000
brk(0x55c36a42f000)                     = 0x55c36a42f000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=5698896, ...}) = 0
mmap(NULL, 5698896, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff5ebc7f000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
openat(AT_FDCWD, "/proc/net/tcp", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5ebc5d000
read(3, "  sl  local_address rem_address "..., 131072) = 900
write(1, "  sl  local_address rem_address "..., 900  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0915 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 69736 1 ffff9f59772fc600 100 0 0 10 0                     
   1: 3500007F:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000   102        0 31698 1 ffff9f59772f9a40 100 0 0 10 0                     
   2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 38399 1 ffff9f5972c3a300 100 0 0 10 5                     
   3: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 38548 1 ffff9f5972c3b480 100 0 0 10 0                     
   4: 0100007F:A879 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 44812 1 ffff9f59772fd780 100 0 0 10 0                     
) = 900
read(3, "", 131072)                     = 0
munmap(0x7ff5ebc5d000, 139264)          = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

또한 사용해 보았 ltrace으나 빈 출력이 반환되었습니다...

그렇다면 모든 커널을 모르고 검색할 필요 없이 사용할 기능을 어떻게 결정합니까?

답변1

커널 호출을 추적하기 위해 단순히 사용자 공간 도구를 사용할 수는 없다고 생각합니다. 당신이 찾고 있는 것은ftrace, 그러면 (커널이 지원하는 경우) 다음과 같은 작업을 수행할 수 있습니다.

sysctl kernel.ftrace_enabled=1
echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
cat /proc/net/tcp
echo 0 > /sys/kernel/debug/tracing/tracing_on
less /sys/kernel/debug/tracing/trace

를 읽을 때 정확히 무슨 일이 일어나고 있는지에 대한 자세한 내용을 보려면 /proc/net/tcp커널 소스 파일을 다운로드하거나 커널 문서 등을 읽어보세요. 관련된가상 파일 시스템, /프로세스그리고시퀀스 파일상호 작용.

파일 시스템은 사용자 공간에서 시스템 정보를 사용할 수 있도록 하는 커널 기능 이므로 /proc소켓을 숨기는 것이 가능한지는 모르겠습니다 netstat(참조:/proc/net/tcp를 어떻게 편집하나요?).

관련 정보