파일 시스템에 대한 현재 읽기 및 쓰기를 요청 시 어떻게 인쇄할 수 있습니까?

파일 시스템에 대한 현재 읽기 및 쓰기를 요청 시 어떻게 인쇄할 수 있습니까?

파일 시스템 읽기 및 쓰기, 특히 NFS 마운트에 대한 통계를 얻는 데 관심이 있습니다.

예를 들어 많은 도구가 있다는 것을 알고 있지만 iostat모든 nfsstat프로그램 inotifywait에는 문제가 있습니다.

계층 구조의 복잡성으로 인해 파일 시스템을 탐색하거나 파일 이름을 명시적으로 언급해야 하는 어떤 것도 사용할 수 없습니다.

필요에 따라 다음을 수행할 수 있는 프로그램이 있습니까?

  1. 읽기/쓰기 표시
  2. 읽기/쓰기 경로 표시
  3. 바이트 수 표시

온디맨드란 실행 시간을 의미합니다. 포인트 (3)은 필수 사항이 아닙니다.

예를 들어, 저는 다음을 할 수 있기를 원합니다:

$ magicIOprogram
read, 512, /path/to/file1
read, 256, /path/to/file2
write, 15, /path/to/file3
write, 10562, /path/to/file4

제가 모르는 위의 도구를 사용하여 이 정보를 얻을 수 있는 방법이 있다면 그것도 충분한 해결책이 될 것입니다.

답변1

당신은 시도하고 싶을 수도 있습니다시스템 수도꼭지.

여기서 살짝 수정해 보세요100밀리초마다 열기, 읽기 및 쓰기 표시:

#! /usr/bin/env stap

global fileread, filewrite

probe syscall.open.return {
    if ($return != -1) {
        printf("open, %s, %d/%d\n", user_string($filename), pid(), $return)
    }
}

probe syscall.read.return {
    p = pid()
    fd = $fd
    bytes = $return
    if (bytes > 0)
        fileread[p, fd] += bytes
}

probe syscall.write.return {
    p = pid()
    fd = $fd
    bytes = $return
    if (bytes > 0)
        filewrite[p, fd] += bytes
}

probe timer.ms(100) {
    foreach (v = [p,fd] in fileread) {
        printf("read, %d, %d/%d\n", v, p, fd)
    }                                                                                                                                                                                          
    delete fileread                                                                                                                                                                            
    foreach (v = [p,fd] in filewrite) {                                                                                                                                                        
        printf("write, %d, %d/%d\n", v, p, fd)                                                                                                                                                 
    }                                                                                                                                                                                          
    delete filewrite                                                                                                                                                                           
}

출력 라인의 형식은 다음과 같습니다.

  • open,(경로명),(pid)/(fd)

  • 읽기, (바이트), (pid)/(fd)

  • 쓰기, (바이트), (pid)/(fd)

답변2

리눅스심사1번과 2번 항목에 대한 정보를 얻을 수 있습니다.

RHEL/CentOS 6을 실행 중이고 nfs 공유가 마운트되어 있다고 가정합니다 /mnt/nfs/foo.

$ tree /mnt/nfs/foo
/mnt/nfs/foo
|-- a
|   `-- foo
|-- b
    `-- bar

에서 다음 규칙을 정의해야 합니다 /etc/audit/audit.rules.

# Delete existing rules
-D
# Set buffer size
-b 320
# Log read and write operations
-w /mnt/nfs/foo -p r -k read -k nfs
-w /mnt/nfs/foo -p w -k write -k nfs

그런 다음 auditd다시 로드 서비스를 사용하십시오 /etc/init.d/auditd reload.

완료되면 다음 명령으로 생성된 이벤트 로그를 사용 ausearch하고 읽을 수 있습니다 .aureportauditd

$ cat /mnt/nfs/foo/a/foo
$ echo 'test' > /mnt/nfs/foo/b/bar
$ ausearch -k nfs | aureport -f
File Report
===============================================
# date time file syscall success exe auid event
===============================================
1. 07/15/2015 11:39:04 /mnt/nfs/foo/a/foo 2 yes /bin/cat 500 59
2. 07/15/2015 11:39:05 /mnt/nfs/foo/b/bar 2 yes /bin/bash 500 60

클라이언트에서만 정보를 수집할 수 있습니다. 클라이언트를 신뢰할 수 없다면 이 방법을 사용하여 클라이언트가 nfs를 통해 액세스하는 대상을 안전하게 확인할 수 없습니다.

관련 정보