쉘스크립트를 사용하여 파일 시스템의 변경 사항을 검색할 때, 제외하는 것을 잊어버렸기 /dev
때문에 core
그것도 테스트했습니다. 이상한 점은 어떤 방식으로 테스트하더라도 유형에 따라 일관성이 없다는 것입니다.
$ if [ -f ./core ] ; then echo file ; else echo something else ; fi
file
$ ls -al core
lrwxrwxrwx 1 root root 11 Sep 29 15:40 core -> /proc/kcore
$ file core
core: symbolic link to `/proc/kcore'
$ if test -f core ; then echo file ; else echo something else ; fi
file
$ if /usr/bin/test -f core ; then echo file ; else echo something else ; fi
file
$ if test -h core ; then echo link ; else echo something else ; fi
link
$ if /usr/bin/test -h core ; then echo link ; else echo something else ; fi
link
여기서 무슨 일이 일어나고 있는 걸까요?
답변1
첫째, /dev/core
일반 파일에 대한 심볼릭 링크가 있습니다 /proc/kcore
. 따라서 및 둘 다 정확 test -h /dev/core
합니다 test -f /dev/core
. -h
왜냐하면 기호 링크이고 -f
기호 링크의 대상이 일반 파일이기 때문입니다.
이제 그것이 무엇인지 이야기해 봅시다 /proc/kcore
. 일반 파일이지만 익숙한 일반 파일과는 약간 다릅니다. 프로그램이 파일에 대해 일부 작업(열기, 읽기, 쓰기 등)을 수행할 때마다 다음을 수행합니다.시스템 호출즉, 커널에서 일부 코드를 실행하는 것입니다. 호출되는 코드는 파일 시스템 유형에 따라 다릅니다. 디스크 파일 시스템(예: ext4 또는 FAT)의 경우 이 코드는 파일을 구성하는 데이터 조각이 어떻게 배열되어 있는지 파악하고 기본 스토리지 계층(예: 디스크 드라이버)을 호출하여 이러한 데이터 조각을 읽고 씁니다. 네트워크 파일 시스템(예: NFS 또는 Samba)의 경우 이 코드는 네트워크 패킷을 파일 서버로 보냅니다. 의 경우 /proc
이는 장착 지점입니다.procfs 파일 시스템, 이 코드는 커널 데이터 구조를 표시하거나 수정합니다.
대부분의 파일은 마운트 지점 목록 보고, 로드된 모듈 목록 보고, PID 123을 사용하여 프로세스에 대한 상태 정보 보고 /proc
등과 같은 시스템에 대한 정보를 보고합니다 . 이 파일은 디버거에 적합한 형식으로 시스템의 실제 메모리 내용을 보고하므로 이 파일에서 바이트를 읽는 것은 본질적으로 실제 메모리의 내용을 읽는 것입니다./proc/mounts
/proc/modules
/proc/123/stat
/proc/kcore
/proc/kcore
procfs 파일 시스템의 파일은 다음과 같이 "마법"으로 간주될 수 있습니다.장치 파일그것은 "마법"이다. procfs 및 같은 장치 파일 및 파일 시스템시스템 파일 시스템다른 방법으로 마법을 사용하십시오. 장치 파일은 모든 (대부분의) 파일 시스템에서 생성될 수 있으며 디렉토리 항목에 "일반 파일" 대신 "문자 장치"에 대해 "블록 장치"라고 표시되어 있기 때문에 마법입니다 /proc
. 아래의 파일은 /sys
그 파일이 있는 전체 파일 시스템이 마술적이기 때문에 마술적입니다.
그 외에는 위에서 본 것처럼 실제 마법이 관련되어 있지 않습니다. 해당 코드가 블록 레이아웃을 계산하고 디스크에서 읽거나 커널 데이터 구조를 포맷하는지 여부는 단지 커널 코드일 뿐입니다.
procfs 파일 시스템에 대한 설명서는 다음에서 볼 수 있습니다.proc
매뉴얼 페이지그리고커널 문서.
답변2
파일 /dev/core
은 링크입니다 /proc/kcore
. kcore 파일은 더미 파일로, 다음 용도로만 사용됩니다.프로세스 파일 시스템. 커널이 할당할 수 있는 메모리가 포함되어 있습니다. 64비트 시스템에서는 크기가 /proc/kcore
128TB까지인데, 이는 64비트 시스템이 할당할 수 있는 절대적인 한계이기 때문입니다. 파일 형식은 다음과 유사합니다.ELF 바이너리. 다음을 확인하고 파일 크기를 확인하세요.
$ file /proc/kcore
/proc/kcore: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, [...]
$ ls -lh /proc/kcore
-r-------- 1 root root 128T Sep 29 20:01 /proc/kcore
파일은 그 순간 이전과 이후가 아닌 파일로만 존재하기 때문에 내가 명령을 호출하는 시간 과 ctime
같습니다 .mtime
ls
따라서 일반 파일처럼 보이지만 proc 파일 시스템의 다른 모든 파일과 마찬가지로가상. 커널은 요청 시 할당 가능한 메모리를 파일로 추상화합니다. 이것은 단지 그것이다는 것을 의미합니다쓸 수 있는언제read()
또는stat()
시스템 호출에 의해 요청됩니다( stat()
파일에서 유틸리티를 사용할 때 발생). test
그런 다음 커널은 시스템 호출을 가로채거나 캡처하고 대신 특정 값을 제공합니다.진짜콘텐츠가 존재하지 않습니다. 예를 들어 /proc/kcore
파일로 읽는 경우 cat
커널은 메모리 읽기를 수행합니다.
proc 파일 시스템의 각 파일 뒤에는 파일 내용으로 반환되어야 하는 내용을 담당하는 처리기 함수가 옵니다.
ELF 형식으로 인해 /proc/kcore
콘텐츠는 디버거로 검사됩니다 gdb
.