cat / proc / cpuinfo 명령을 실행하면 어떻게됩니까?


답변:


72

에서 파일을 읽을 때마다 /proc파일 내용으로 읽을 텍스트를 계산하는 커널의 일부 코드를 호출합니다. 내용이 즉석에서 생성된다는 사실은 거의 모든 파일의 시간이 현재로보고되고 크기가 0으로보고 된 이유를 설명합니다. 여기서 0은 "모름"으로 표시되어야합니다. 일반적인 파일 시스템과 달리 procfs/proc 라고 하는에 마운트 된 파일 시스템은 디스크 나 다른 스토리지 미디어 (FAT, ext2, zfs 등) 또는 네트워크 (NFS, Samba 등)를 통해 데이터를로드하지 않습니다. FUSE 와 달리 사용자 코드를 호출하지 않습니다 .

Procfs는 대부분의 비 BSD 유니스에 존재합니다. 이 글은 AT & T의 벨 연구소에서의 생활을 시작 UNIX 8 판 프로세스에 대한 정보를보고하는 방법으로 (그리고 ps정보를 통해 읽어 종종 꽤-프린터입니다 /proc). 대부분의 procfs 구현에는 /proc/123PID 123으로 프로세스에 대한 정보를보고하기 위해 호출되는 파일 또는 디렉토리가 있습니다 . Linux는 proc 파일 시스템을 확장하여 시스템 상태를보고하는 더 많은 항목을 포함합니다 (예 :) /proc/cpuinfo.

과거에는, 리눅스는 /proc드라이버에 대한 정보를 제공하는 다양한 파일을 인수하지만,이 사용은 지금의 호의에서 더 이상 사용되지 않습니다 /sys, 그리고 /proc이제 서서히 진화. 항목 좋아 /proc/bus하고 /proc/fs/ext4그들은 호환성을 위해 남아있는 곳이지만 새로운 유사한 인터페이스에 생성된다 /sys. 이 답변에서는 Linux에 중점을 둘 것입니다.

/procLinux에 대한 설명서의 첫 번째 및 두 번째 진입 점 은 다음과 같습니다.

  1. proc(5)man 페이지 ;
  2. /proc파일 시스템 에서 커널 문서 .

설명서에서 다루지 않은 세 번째 진입 점 은 소스를 읽는 것입니다 . 머신에서 소스를 다운로드 할 수 있지만 이는 큰 프로그램이며 Linux 상호 참조 인 LXR 은 큰 도움이됩니다. (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

의 또 다른 중요한 영역 /procIS /proc/sys에 직접 인터페이스입니다 sysctl. 이 계층 구조의 항목을 읽으면 해당 sysctl 값이 반환되고 쓰기는 sysctl 값을 설정합니다. sysctl의 진입 점은에 fs/proc/proc_sysctl.c있습니다. Sysctls에는 자신 register_sysctl과 친구 가있는 자체 등록 시스템이 있습니다.


59

무대 뒤에서 어떤 종류의 마술이 일어나고 있는지에 대한 통찰력을 얻으려고 할 때 가장 친한 친구가 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.

# 1을 실행
$ 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: -

액세스, 수정 및 변경 시간을 확인 하시겠습니까? 액세스 할 때마다 계속 변경됩니다. 이것은 3 가지가 모두 그렇게 바뀌는 것은 매우 드문 일입니다. 파일의 타임 스탬프 속성을 편집하지 않으면 일반적으로 동일하게 유지됩니다.

# 3- 파일 포함

이 파일이 일반 파일이 아니라는 또 다른 단서가 있습니다.

$ 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의 'none busy'오류 메시지는 혼동 될 수 있습니다.)

그리고 우리 proc의 매뉴얼 페이지를 보면 :

proc 파일 시스템은 커널 데이터 구조에 대한 인터페이스로 사용되는 의사 파일 시스템입니다. 일반적으로 / proc에 마운트됩니다. 대부분 읽기 전용이지만 일부 파일에서는 커널 변수를 변경할 수 있습니다.

같은 매뉴얼 페이지에서 조금 더 아래로 :

/ proc / cpuinfo

이것은 지원되는 각 아키텍처마다 다른 목록 인 CPU 및 시스템 아키텍처 종속 항목의 모음입니다. 두 개의 공통 항목은 CPU 번호와 bogomips를 제공하는 프로세서입니다. 커널 초기화 중에 계산되는 시스템 상수 SMP 머신에는 각 CPU에 대한 정보가 있습니다. lscpu (1) 명령은이 파일에서 정보를 수집합니다.

매뉴얼 페이지의 맨 아래에는 / proc FILESYSTEM 이라는 제목의 커널 문서에 대한 참조가 있습니다 . 해당 문서에서 인용 :

proc 파일 시스템은 커널의 내부 데이터 구조에 대한 인터페이스 역할을합니다. 시스템에 대한 정보를 얻고 런타임 (sysctl)에서 특정 커널 매개 변수를 변경하는 데 사용할 수 있습니다.

결론

그래서 우리는 여기서 무엇을 배웠습니까? 그것이 /proc의사 파일 시스템이라고도하고 "내부 데이터 구조에 대한 인터페이스"라고도하며, 그 안에있는 항목이 실제 파일이 아니라 파일처럼 보이기 만하지만 실제로 는 그렇지 않다고 가정하는 것이 안전 할 것입니다 .

나는 man 5 proc2004 년경 의 이전 버전에 있었지만 어떤 이유로 든 더 이상 포함되지 않은 이 인용문으로 마무리 할 것입니다 . 참고 : 그것이 무엇인지 잘 설명했기 때문에 왜 제거되었는지 확실하지 않습니다 /proc.

GNU / Linux 시스템의 / proc 디렉토리는 커널 인터페이스와 같은 파일 시스템을 제공합니다. 따라서 응용 프로그램과 사용자는 정상적인 파일 시스템 I / O 작업을 사용하여 커널에서 정보를 가져 와서 값을 설정할 수 있습니다.

proc 파일 시스템은 프로세스 정보 의사 파일 시스템이라고도합니다. 여기에는``실제 ''파일이 아니라 런타임 시스템 정보 (예 : 시스템 메모리, 마운트 된 장치, 하드웨어 구성 등)가 포함됩니다. 이러한 이유로 커널의 제어 및 정보 센터로 간주 될 수 있습니다. 실제로, 많은 시스템 유틸리티는 단순히이 디렉토리의 파일을 호출합니다. 예를 들어, 커널에 의해로드 된 모듈을 나열하는 lsmod 명령은 기본적으로 'cat / proc / modules'와 동일하지만 시스템의 PCI 버스에 연결된 장치를 나열하는 lspci는 'cat / proc / pci '. 이 디렉토리에있는 파일을 변경하면 시스템이 실행되는 동안 커널 매개 변수를 변경할 수 있습니다.

출처 : proc pseudo 파일 시스템

참고 문헌


1
Cool, :) 이것이 제가 질문을 보았을 때 가장 먼저 시도한 것입니다 :strace -o catcpuproc.txt cat /proc/cpuinfo
mkc

1
좋은 대답입니다! 리눅스에서 더 깊이 파고 싶다면 proc 파일 시스템의 소스는 커널 소스의 fs / proc에 있습니다. fs / proc / cpuinfo.c가 있다는 것을 알 수 있지만 불행히도 무거운 리프트가 아키텍처에 따라 아치 / 전체에 퍼져 있기 때문에 다소 비어 있습니다. 더 간단한 예는 fs / proc / uptime.c를 참조하십시오. 파일을 살펴보면 uptime_proc_show가 원하는 데이터를 얻는 주요 요소라고 생각할 수 있으며 호출하는 함수로 다이빙하여 더 자세히 탐색 할 수 있습니다. seq_file 인터페이스와 procfs에서 사용되는 방법을 이해하려면 다음을 참조하십시오.
Steven D


1
@slm : +1, 좋은 답변입니다. 그러나 나에게, 첫 번째 힌트는 특수 파일이라는 크기는 ^^ 0 바이트이지만 많은 파이프 파일과 같은 것을 얻을 수 있습니다.
Olivier Dulac

@OlivierDulac-좋은 지적. 귀하의 의견에 따라 추가로 수정했습니다. 더 개선 할 수 있다면 LMK. 감사.
slm

14

@slm의 대답은 매우 포괄적이지만 간단한 설명은 관점의 변화에서 비롯된 것으로 생각됩니다.

일상적인 사용에서는 파일을 물리적 인 것으로 생각할 수 있습니다. 일부 장치에 저장된 데이터 덩어리. 이것은 / proc / cpuinfo와 같은 파일을 매우 신비스럽고 혼란스럽게 만듭니다. 그러나 파일을 인터페이스 로 생각하면 모든 것이 완벽합니다 . 일부 프로그램에서 데이터를주고받는 방법.

이러한 방식으로 데이터를 송수신하는 프로그램은 파일 시스템 또는 드라이버입니다 (이 용어를 정의하는 방법에 따라 정의가 너무 광범위하거나 너무 좁을 수 있음). 중요한 점은 이러한 프로그램 중 일부 는 하드웨어 장치를 사용하여이 인터페이스를 통해 전송 된 데이터를 저장하고 검색한다는 것입니다. 그러나 전부는 아닙니다.

저장 장치를 사용 하지 않는 (적어도 직접적으로) 파일 시스템의 일부 예 는 다음과 같습니다.

  • 조회 또는 계산 된 데이터를 사용하는 파일 시스템. Proc는 다양한 커널 모듈에서 데이터를 가져 오기 때문에 예입니다. 극단적 인 예는 πfs (github.com/philipl/pifs)입니다
  • 일반 사용자 공간 프로그램으로 데이터를 처리하는 모든 FUSE 파일 시스템
  • 암호화, 압축 또는 심지어 오디오 트랜스 코딩 (khenriks.github.io/mp3fs/)을 사용하여 다른 파일 시스템의 데이터를 즉석에서 변환하는 파일 시스템

Plan9 OS ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs )는 파일을 일반적인 프로그래밍 인터페이스로 사용하는 극단적 인 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.