내가 글을 쓰면 어떻게 되나요 cat /proc/cpuinfo
? 이것은 CPU 정보를 동적으로 읽고 호출될 때마다 해당 텍스트를 생성하는 파이프(또는 기타)라는 운영 체제입니까?
답변1
에서 파일을 읽을 때마다 /proc
커널의 일부 코드가 호출되어 파일 내용으로 읽을 텍스트를 계산합니다. 콘텐츠가 동적으로 생성된다는 사실은 거의 모든 파일의 시간이 현재로 보고되고 크기가 0으로 보고되는 이유를 설명합니다. 여기서 0은 "모름"으로 읽어야 합니다. 일반 파일 시스템과 달리 마운트된 파일 시스템 /proc
을프로세스 파일 시스템, 디스크나 기타 저장 매체(예: FAT, ext2, zfs 등) 또는 네트워크(예: NFS, Samba 등)를 통해 데이터를 로드하지 않으며 사용자 코드(예:퓨즈).
Procfs는 BSD가 아닌 대부분의 unice에 존재합니다. AT&T Bell Labs에서 탄생했습니다.유닉스 버전 8프로세스에 대한 정보를 보고하는 방법( ps
종종 정보를 읽기 위한 예쁜 프린터 /proc
). 대부분의 procfs 구현에는 /proc/123
PID 123을 사용하는 프로세스에 대한 정보를 보고하는 파일 또는 디렉터리가 있습니다 . Linux는 시스템 상태를 보고하는 더 많은 항목(예제 포함)을 사용하여 proc 파일 시스템을 확장합니다 /proc/cpuinfo
.
과거에는 Linux가 /proc
드라이버에 대한 정보를 제공하는 다양한 파일을 얻었으나 이제는 더 이상 사용되지 않으며 대신 다음을 사용합니다./sys
, /proc
이제 천천히 발전하고 있습니다. 이전 버전과의 호환성을 위해 /proc/bus
및 같은 항목은 원래 위치에 유지되지만 더 새롭고 유사한 인터페이스가 아래에 생성됩니다. 이 답변에서는 Linux에 중점을 둘 것입니다./proc/fs/ext4
/sys
Linux 문서의 첫 번째 및 두 번째 진입점은 다음 /proc
과 같습니다.
- 이것
proc(5)
매뉴얼 페이지; - 파일
/proc
시스템내부에커널 문서.
문서에서 다루지 않는 경우 세 번째 진입점은 다음과 같습니다.소스 코드 읽기. 컴퓨터에 소스 코드를 다운로드할 수 있지만 이는 거대한 프로그램이며LXLinux 상호 참조는 큰 도움이 됩니다. (LXR에는 다양한 변형이 있습니다. lxr.linux.no
현재 실행 중인 버전이 가장 좋지만 안타깝게도 사이트가 자주 다운됩니다.) 약간의 C 지식이 필요하지만 신비한 값을 추적하기 위해 프로그래머가 될 필요는 없습니다.
항목의 핵심 처리는 /proc
다음과 같습니다.fs/proc
목차. 모든 드라이버는 에 항목을 등록할 수 있으므로 /proc
(언급한 대로 현재는 더 이상 사용되지 /sys
않음) 에서 원하는 항목을 찾지 못한 경우 fs/proc
다른 곳을 찾아보십시오. 드라이버가 선언된 함수를 호출합니다.include/linux/proc_fs.h
. 커널 버전최대 3.9함수 create_proc_entry
와 일부 래퍼(특히 create_proc_read_entry
) 및 커널 버전 제공3.10 이상proc_create
및 (및 그 이상)만 사용할 수 있습니다 proc_create_data
.
예 를 들어 /proc/cpuinfo
, 검색을 하면 "cpuinfo"
전화를 걸게 됩니다 proc_create("cpuinfo, …")
.fs/proc/cpuinfo.c
. 이 코드는 거의 상용구와 같다는 것을 알 수 있습니다. 대부분의 파일은 /proc
일부 텍스트 데이터를 덤프하기 때문에 이를 수행하는 도우미 함수가 있습니다. 단 하나seq_operations
구조, 진짜 고기가 들어있어요cpuinfo_op
아키텍처와 관련된 데이터 구조는 일반적으로 arch/<architecture>/kernel/setup.c
(때때로 다른 파일)에 정의됩니다. x86을 예로 들면,arch/x86/kernel/cpu/proc.c
. 주요 기능은 show_cpuinfo
원하는 파일 내용을 인쇄하는 것입니다. 나머지 인프라는 읽기 프로세스에서 요청한 속도로 데이터를 읽기 프로세스에 공급합니다. 동적으로 계산된 숫자를 포함하여 커널의 다양한 변수에 있는 데이터에서 동적으로 조합된 데이터를 볼 수 있습니다.CPU 주파수.
그 중 큰 부분은 /proc
프로세스별 정보입니다 /proc/<PID>
. 이 항목은 다음에 등록되어 있습니다.fs/proc/base.c
, 내부에tgid_base_stuff
대량으로;여기에 등록된 일부 기능은 다른 파일에 정의되어 있습니다. 이러한 항목을 생성하는 방법에 대한 몇 가지 예를 살펴보겠습니다.
cmdline
에 의해 생성됩니다proc_pid_cmdline
같은 파일에. 프로세스에서 데이터를 찾아 인쇄합니다.clear_refs
지금까지 본 항목과 달리 쓰기는 가능하지만 읽을 수는 없습니다. 그러므로proc_clear_refs_operations
구조는 다음을 정의합니다.clear_refs_write
기능은 있지만 읽기 기능은 없습니다.cwd
다음으로 구성된 심볼릭 링크(다소 마술적)입니다.proc_cwd_link
, 어느프로세스의 현재 디렉터리 찾기링크 콘텐츠로 반환합니다.fd
하위 디렉토리입니다. 디렉토리 자체에 대한 작업은 다음에 정의되어 있습니다.proc_fd_operations
데이터 구조(항목을 열거하는 함수를 제외하고 모두 상용구입니다.proc_readfd
, 프로세스의 열린 파일을 열거함), 항목에 대한 작업은 다음 위치에 있습니다.`proc_fd_inode_작업.
또 다른 중요한 영역은 직접적인 인터페이스라는 점 /proc
입니다./proc/sys
sysctl
. 이 계층 구조의 항목을 읽으면 해당 sysctl 값의 값이 반환되고, 쓰면 sysctl 값이 설정됩니다. sysctl의 진입점은 다음과 같습니다.fs/proc/proc_sysctl.c
. Sysctl에는 자체 등록 시스템이 있습니다.register_sysctl
그리고 친구들.
답변2
배후에서 어떤 마법이 일어나고 있는지 더 깊이 이해하려고 노력하는 것은 당신의 가장 친한 친구입니다 strace
. 이 도구의 작동 방법을 배우는 것은 뒤에서 일어나는 놀라운 마법을 더 잘 이해하기 위해 할 수 있는 가장 좋은 일 중 하나입니다.
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
위의 출력에서 이것이 /proc/cpuinfo
단지 일반 파일이거나 적어도 하나인 것처럼 보인다는 것을 알 수 있습니다. 그럼 조금 더 자세히 살펴보겠습니다.
더 깊이 다이빙
#1- ls와 함께..파일 자체를 보면 "단지 파일"인 것처럼 보입니다.
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
하지만 좀 더 자세히 살펴보세요. 그 특이성에 대해 우리가 얻는 첫 번째 힌트는 파일 크기가 0바이트라는 것입니다.
#2- 통계로..이제 를 사용하여 파일을 보면 stat
다음 프롬프트인 를 얻을 수 있습니다 /proc/cpuinfo
.
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
실행 #2
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
액세스, 수정 및 변경 시간을 확인하세요. 방문할 때마다 바뀌어요. 세 가지 요소가 모두 이렇게 변하는 것은 매우 이례적이다. 파일의 타임스탬프 속성은 일반적으로 편집하지 않는 한 변경되지 않습니다.
#삼- 서류로..파일이 일반적이지 않다는 또 다른 단서가 있습니다.
$ file /proc/cpuinfo
/proc/cpuinfo: empty
명명된 파이프를 표현한 경우 다음 파일 중 하나와 유사하게 나타납니다.
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
emptyfile
을 터치하면 /proc/cpuinfo
파이프라기보다는 파일처럼 보입니다.
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
#4- 설치와 함께..
따라서 이 시점에서 우리는 한 걸음 물러서서 조금 축소해야 합니다. 우리는 특정 파일을 보고 있지만 파일이 있는 파일 시스템을 살펴봐야 할 수도 있습니다. 이를 위해 이 명령을 사용할 수 있습니다 mount
.
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
좋아요, 파일 시스템 유형은 유형입니다 proc
. 다른 파일 시스템 유형에도 동일하게 적용됩니다 /proc
. 이는 아래 파일이 특별하다는 힌트입니다 /proc
. 그것들은 단지 일반적인 파일이 아닙니다. 이제 proc
파일 시스템의 특별한 점에 대해 자세히 알아 보겠습니다 .
mount
매뉴얼 페이지를 살펴보십시오 .
proc 파일 시스템은 특수 장치와 연결되어 있지 않으며 이를 마운트할 때 장치 사양 대신 어떤 키워드(예: proc)도 사용할 수 있습니다. (없음을 선택하면 행운이 없습니다. umount에서 "없음 사용 중"이라는 오류 메시지가 표시되면 혼란스러울 수 있습니다.)
proc
매뉴얼 페이지를 보면 :
proc 파일 시스템은 커널 데이터 구조에 대한 인터페이스 역할을 하는 의사 파일 시스템입니다. 일반적으로 /proc에 설치됩니다. 이들 중 대부분은 읽기 전용이지만 일부는 커널 변수 변경을 허용합니다.
같은 매뉴얼 페이지에서 조금 더 아래로 내려가면 다음과 같습니다.
/proc/cpu 정보
이는 지원되는 각 아키텍처마다 다른 목록이 있는 CPU 및 시스템 아키텍처 관련 항목의 모음입니다. 두 가지 공통 항목은 CPU 번호를 제공하는 프로세서와 커널 초기화 중에 계산되는 시스템 상수입니다. SMP 시스템에는 CPU별 정보가 있습니다. lscpu(1) 명령은 이 파일에서 정보를 수집합니다.
매뉴얼 페이지 하단에는 다음과 같은 커널 문서에 대한 참조가 있습니다./proc 파일 시스템. 문서 인용:
proc 파일 시스템은 커널의 내부 데이터 구조에 대한 인터페이스 역할을 합니다. 시스템에 대한 정보를 얻고 런타임에 특정 커널 매개변수(sysctl)를 변경하는 데 사용할 수 있습니다.
결론적으로
그럼 우리는 여기서 무엇을 배웠나요? /proc
의사 파일 시스템이라고 불리며 "내부 데이터 구조에 대한 인터페이스"이기도하다는 점을 고려하면 그 안에 있는 항목이 다음과 같다고 가정하는 것이 안전합니다.아니요실제 파일은 파일처럼 보이지만 그렇지 않은 표현일 뿐입니다.
이 인용문으로 마무리하겠습니다. 이 인용문은 2004년경 이전 버전에 등장한 것으로 보이지만 man 5 proc
어떤 이유로 더 이상 포함되지 않습니다.노트:그것이 무엇을 잘 설명하는지 설명하기 때문에 왜 제거되었는지 모르겠습니다 /proc
.
GNU/Linux 시스템의 /proc 디렉토리는 파일 시스템과 유사한 커널 인터페이스를 제공합니다. 이를 통해 애플리케이션과 사용자는 일반적인 파일 시스템 I/O 작업을 사용하여 커널에서 정보를 얻고 커널에 값을 설정할 수 있습니다.
proc 파일 시스템은 프로세스 정보 의사 파일 시스템이라고도 합니다. 여기에는 "실제" 파일이 포함되어 있지 않지만 런타임 시스템 정보(예: 시스템 메모리, 설치된 장치, 하드웨어 구성 등)가 포함되어 있습니다. 따라서 커널의 제어 및 정보 센터로 간주할 수 있습니다. 실제로 상당수의 시스템 유틸리티는 이 디렉토리에 있는 파일을 호출합니다. 예를 들어, lsmod 명령은 커널에 의해 로드된 모듈을 나열하고 기본적으로 "cat /proc/modules"와 동일하며, lspci 명령은 시스템의 PCI 버스에 연결된 장치를 나열하며 "cat /"와 동일합니다. proc/pci'. 이 디렉토리의 파일을 변경하면 시스템이 실행되는 동안 커널 매개변수를 변경할 수 있습니다.
원천: proc 의사 파일 시스템
인용하다
답변3
@slm의 답변은 매우 포괄적이지만 관점을 바꾸면 더 간단한 설명이 나올 수도 있다고 생각합니다.
일상적인 사용에서 파일은 물리적인 것으로 생각할 수 있습니다. 특정 장치에 저장된 데이터 블록. 이는 /proc/cpuinfo와 같은 파일을 매우 신비롭고 혼란스럽게 만듭니다. 그러나 파일을 다음과 같이 간주하면상호 작용;특정 프로그램과 데이터를 주고 받는 방법.
이런 방식으로 데이터를 보내고 받는 프로그램은 파일 시스템이거나 드라이버입니다(이러한 용어를 어떻게 정의하느냐에 따라 정의가 너무 넓거나 너무 좁을 수 있음). 중요한 점은일부이러한 프로그램은 하드웨어 장치를 사용하여 이 인터페이스를 통해 전송된 데이터를 저장하고 검색합니다.
파일 시스템의 몇 가지 예아니요저장 장치를 사용하는 것은 (적어도 직접적으로) 다음과 같습니다.
- 파일 시스템을 사용하여 데이터를 찾거나 계산합니다. Proc은 다양한 커널 모듈에서 데이터를 가져오는 예입니다. 극단적인 예는 πfs(github.com/philipl/pifs)입니다.
- 모든 FUSE 파일 시스템은 일반 사용자 공간 프로그램을 사용하여 데이터를 처리합니다.
- 암호화, 압축 또는 오디오 트랜스코딩을 사용하여 다른 파일 시스템의 데이터를 즉시 하나의 파일 시스템으로 변환합니다( khenriks.github.io/mp3fs/ ).
Plan9 운영 체제(http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs)은 파일을 일반 프로그래밍 인터페이스로 사용하는 극단적인 예입니다.