원문 보기: https://dawoum.duckdns.org/wiki/Procfs
proc 파일 시스템 (proc filesystem, 줄여서 procfs)은 프로세스와 기타 시스템 정보에 대한 정보를 계층적 파일과 같은 구조로 표현하는 유닉스-계열 운영 시스템의 특수 파일 시스템으로, 전통적인 추적 방법이나 커널 메모리에 대한 직접 접근보다 커널에 보관된 프로세스 데이터에 동적으로 접근하는 데 더 편리하고 표준화된 방법을 제공합니다. 전형적으로, 그것은 부팅 시 /proc라는 마운트 지점에 매핑됩니다. proc 파일 시스템은 커널에서 실행 중인 프로세스에 대한 내부 데이터 구조로의 인터페이스 역할을 합니다. 리눅스에서, 그것은 역시 커널에 대한 정보를 얻고 런타임에 특정 커널 매개변수를 변경하는 (sysctl) 데에 사용될 수 있습니다.
System V, Solaris, IRIX, Tru64 UNIX, BSD, Linux, IBM AIX, QNX, 및 벨 연구소의 Plan 9을 포함하여 많은 유닉스-계열 운영 시스템은 proc 파일 시스템을 지원합니다. OpenBSD는 2015년 5월에 출시된 버전 5.7에서 지원을 중단했습니다. 그것은 HP-UX와 macOS에는 없습니다.
리눅스 커널은 그것을 프로세스와 관련 없는 데이터로 확장합니다.
proc 파일 시스템은 커널 공간과 사용자 공간 사이의 통신 방법을 제공합니다. 예를 들어, 프로세스 보고 유틸리티 ps의 GNU 버전은 임의의 특수 시스템 호출 사용 없이 proc 파일 시스템을 사용하여 데이터를 얻습니다.
History
UNIX 8th Edition
Tom J. Killian은 /proc의 UNIX 8th Edition (V8) 버전을 구현했습니다: 그는 1984년 6월 USENIX에서 "Processes as Files"라는 제목의 논문을 발표했습니다. procfs의 설계는 프로세스 추적에 사용되는 ptrace 시스템 호출을 대체하는 것을 목표로 했습니다. 자세한 설명서는 proc(4) 매뉴얼 페이지에서 찾을 수 있습니다.
SVR3
원래 AT&T System V Release 3 (SVR3) 운영 시스템 (1986년 AT&T 내부에서 사용 가능, 1987년 일반에 공개)에는 /proc 파일 시스템이 없었지만, 이후 증분 버전에는 있었습니다. 그것은 지금 공통적인 하위 디렉터리가 아닌 프로세스를 나타내는 파일만 포함했습니다.
SVR4
Roger Faulkner와 Ron Gomes는 V8 /proc를 SVR4로 이식했고, 1991년 1월 USENIX에서 "The Process File System and Process Model in UNIX System V"라는 논문을 발표했습니다. 이런 종류의 procfs는 ps 생성을 지원했지만, 파일은 read(), write(), 및 ioctl() 함수로만 접근할 수 있었습니다. 1995년과 1996년 사이에, Roger Faulkner는 하위 디렉토리를 갖는 구조화된 /proc 파일 시스템을 제공하는 Solaris-2.6에 대한 procfs-2 인터페이스를 만들었습니다.
Plan 9
Plan 9은 프로세스 파일 시스템을 구현했지만, V8보다 더 나아갔습니다. V8의 프로세스 파일 시스템은 프로세스당 단일 파일을 구현했습니다. Plan 9는 그것들의 기능을 제공하기 위해 별도의 파일 계층을 만들었고, /proc를 파일 시스템의 실제 부분으로 만들었습니다.
4.4BSD and derivatives
4.4BSD는 Plan 9에서 /proc 구현을 복제했습니다. 2011년 2월 기준, procfs는 FreeBSD에서 점차 단계적으로 폐지되고 있었고, 프로세스 관련 정보에 대해 대신 sysctl 인터페이스를 사용하기 시작했습니다. 리눅스 사용자 공간 프로그램과의 바이너리 호환성을 제공하기 위해, FreeBSD 커널은 리눅스 procfs와 유사한 linprocfs도 제공합니다. 그것은 2015년 5월에 출시된 버전 5.7에서 OpenBSD에서 제거되었는데, 왜냐하면 "항상 경쟁 조건에 시달렸고 이제는 사용되지 않기 때문"입니다. macOS는 procfs를 구현하지 않았고 사용자 공간 프로그램은 프로세스 데이터를 검색하기 위해 sysctl 인터페이스를 사용해야 합니다.
Solaris
Solaris에서 /proc는 처음부터 (1992년 6월) 사용할 수 있었습니다. 1996년 Solaris 2.6은 Roger Faulkner로부터 procfs2를 도입했습니다.
Linux
리눅스는 1992년 9월 v0.97.3에서 처음으로 /proc 파일 시스템을 추가했고, 1992년 12월 v0.98.6에서 프로세스와 관련 없는 데이터로 처음으로 확장하기 시작했습니다.
2020년 당시, 리눅스 구현에는 커널 프로세스를 포함한 각 실행 프로세스에 대한 디렉토리가 /proc/PID라는 디렉토리에 포함되어 있으며, 여기서 PID는 프로세스 번호입니다. 각 디렉토리에는 다음을 포함하여 하나의 프로세스에 대한 정보가 포함되어 있습니다:
- /proc/PID/cmdline, 원래 프로세스를 시작한 명령.
- /proc/PID/cwd, 프로세스의 현재 작업 디렉토리로의 심볼릭 링크.
- /proc/PID/environ, 프로세스에 영향을 미치는 환경 변수의 이름과 값을 포함.
- /proc/PID/exe, 원래 실행-가능 파일로의 심볼릭 링크, 만약 그것이 여전히 존재하면 (원래 실행 파일이 삭제되거나 교체된 후에도 프로세스가 계속 실행될 수 있음).
- /proc/PID/fd, 열려 있는 각 파일 설명자에 대한 심볼릭 링크가 들어 있는 디렉토리.
- /proc/PID/fdinfo, 각 열려 있는 파일 설명자의 위치와 플래그를 설명하는 엔트리를 포함하는 디렉토리.
- /proc/PID/maps, 매핑된 파일과 블록 (힙, 스택 등)에 대한 정보를 담고 있는 텍스트 파일.
- /proc/PID/mem, 프로세스의 가상 메모리를 나타내는 이진 이미지, ptrace를 수행하는 프로세스에서만 접근됨.
- /proc/PID/root, 프로세스에서 보는 루트 경로로의 심볼릭 링크. 대부분의 프로세스에 대해 이것은 프로세스가 chroot jail에서 실행 중이 아니면 / 로의 링크일 것입니다.
- /proc/PID/status, 실행 상태와 메모리 사용량을 포함한 프로세스에 대한 기본 정보를 포함.
- /proc/PID/task, 이 (즉, 부모) 프로세스에 의해 시작된 임의의 임무로의 하드 링크를 포함하는 디렉토리.
(사용자는 pgrep, pidof, 또는 ps와 같은 유틸리티를 사용하여 PID를 얻을 수 있습니다:
$ ls -l /proc/$(pgrep -n python3)/fd # List all file descriptors of the most recently started `python3' process
total 0
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 0 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 1 -> /dev/pts/3
lrwx------ 1 baldur baldur 64 2020-03-18 12:31 2 -> /dev/pts/3
$ readlink /proc/$(pgrep -n python3)/exe # List executable used to launch the most recently started `python3' process
/usr/bin/python3.8
)
/proc에는 프로세스와 관련되지 않은 시스템 정보도 포함되어 있지만, 2.6 커널에서는 대부분의 정보가 /sys 아래에 마운트된 별도의 가상 파일 시스템인 sysfs로 이동되었습니다.
- 전원 관리 모드에 따라 (전원이 있으면) sysfs보다 먼저 존재했고 전원 관리 상태에 대한 다양한 정보를 담고 있는 디렉토리, /proc/acpi 또는 /proc/apm이 있습니다.
- /proc/buddyinfo, 메모리 조각화를 처리하는 버디 알고리즘에 대한 정보.
- /proc/bus, PCI/USB와 같은 컴퓨터의 다양한 버스를 나타내는 디렉토리를 포함. 이것은 훨씬 더 많은 정보를 제공하는 /sys/bus 아래에서 sysfs로 대체되었습니다.
- /proc/fb, 사용 가능한 프레임 버퍼 목록
- /proc/cmdline, 커널에 전달되는 부팅 옵션을 제공
- /proc/cpuinfo, 공급업체 (및 사용자가 CPU를 식별할 수 있도록 하는 CPU 제품군, 모델 와 모델 이름)와 속도 (CPU 클럭 속도), 캐시 크기, 시블링의 개수, 코어, 및 CPU 플래그와 같은 CPU에 대한 정보를 포함. 형식과 사용 가능한 정보는 아키텍처에 따라 크게 달라집니다. 일부 아키텍처에서, /proc/cpuinfo는 "bogomips"에 대한 값을 포함하고 있으며, 이는 벤치마크와 같이 CPU 속도를 측정하는 것으로 오해되는 경우가 많지만, 실제로는 최종 사용자에게 합리적인 값을 전혀 측정하지 않습니다. 이는 커널 타이머 보정의 부작용으로 발생하고 같은 클럭 속도에서도 CPU 유형에 따라 매우 다양한 값을 생성합니다.
$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 6
model name : AMD Athlon(tm) II X2 270 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 2000.000
cache size : 1024 KB
...
processor : 1
vendor_id : AuthenticAMD
cpu family : 16
model : 6
model name : AMD Athlon(tm) II X2 270 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 800.000
cache size : 1024 KB
...
다중-코어 CPU에서, /proc/cpuinfo는 다음 계산이 적용됨을 나타내는 "시블" 및 "CPU 코어" 필드를 포함합니다:
"siblings" = (HT per CPU package) * (# of cores per CPU package)
"cpu cores" = (# of cores per CPU package)
CPU 패키지는 여러 코어 (하나에 대해 싱글 코어, 두 개에 대해 듀얼 코어, 네 개에 대해 쿼드 코어)를 가질 수 있는 실제 CPU를 의미합니다. 이를 통해 하이퍼-쓰레딩과 듀얼-코어 사이를 구별할 수 있습니다. 즉, CPU 패키지당 하이퍼-쓰레딩의 개수는 시블 / CPU 코어로 계산될 수 있습니다. 만약 CPU 패키지의 두 값이 모두 같으면, 하이퍼-쓰레딩은 지원되지 않습니다. 예를 들어, 시블=2이고 "cpu 코어"=2를 갖는 CPU 패키지는 듀얼-코어 CPU이지만 하이퍼-쓰레딩을 지원하지 않습니다.
- /proc/crypto, 사용 가능한 암호화 모듈의 목록
- /proc/devices, 장치 ID로 정렬된 문자 및 블록 장치 목록이지만 /dev 이름의 주요 부분도 제공
- /proc/diskstats, 각 논리 디스크 장치에 대한 일부 정보 (장치 번호 포함) 제공
- /proc/filesystems, 나열 시점에 커널에 의해 지원되는 파일 시스템의 목록
- /proc/interrupts, /proc/iomem, /proc/ioports, 및 디렉토리 /proc/irq, 다양한 시스템 자원을 사용하는 장치 (물리적 또는 논리적)에 대한 일부 세부 정보를 제공
- /proc/kmsg, 커널에 의해 출력되는 메시지를 보유
- /proc/loadavg, 지난 몇 분 동안의 현재 부하 평균에 대한 통계를 포함
- /proc/meminfo, 커널이 메모리를 관리하는 방법의 요약을 포함
- /proc/modules, /proc에 있는 가장 중요한 파일 중 하나, 현재 적재된 커널 모듈의 목록을 포함. 그것은 종속성의 몇 가지 표시 (항상 전적으로 정확하지는 않음)를 제공합니다.
- /proc/mounts, self/mounts에 대한 심볼릭 링크로 현재 마운트된 장치와 해당 마운트 지점 (및 사용 중인 파일 시스템과 사용 중인 마운트 옵션)의 목록을 포함
- /proc/net/, 특히 기존 네트워크 연결을 나열하는 /proc/net/nf_conntrack을 포함하여 네트워크 스택에 대한 유용한 정보를 포함하는 디렉토리 (특히 iptables FORWARD를 사용하여 네트워크 연결을 리다이렉션할 때 라우팅을 추적하는 데 유용함)
- /proc/partitions, 커널이 기존 파티션으로 식별한 장치-번호, 크기, 및 /dev 이름의 목록
- /proc/scsi, SCSI 또는 RAID 컨트롤러를 통해 연결된 모든 장치에 대한 정보를 제공
- /proc/self (즉, /proc/PID/, 여기서 PID는 현재 프로세스의 것)에서 현재 (이동) 프로세스에 대한 심볼릭 링크.
- /proc/slabinfo, 리눅스 커널에서 자주 사용되는 대상에 대해 캐시의 통계 나열
- /proc/swaps, 활성 스왑 파티션, 다양한 크기와 우선 순위의 목록
- /proc/sys에서 동적으로 구성 가능한 커널 옵션에 접근. /proc/sys 아래에는 읽기와 쓰기 가능한 가상 파일을 포함하는 커널의 영역을 나타내는 디렉토리가 나타납니다. 예를 들어, 공통적으로 참조되는 가상 파일은 /proc/sys/net/ipv4/ip_forward인데, 왜냐하면 방화벽이나 터널을 라우팅하는 데 필요하기 때문입니다. 파일에는 '1' 또는 '0'이 포함됩니다: 만약 그것이 1이면, IPv4 스택이 지역 호스트를 위한 것이 아닌 패킷을 전달하고, 0이면 전달하지 않습니다.
- /proc/sysvipc, 메모리-공유와 프로세스-사이 통신 (IPC) 정보를 포함
- /proc/tty, 터미널에 대한 정보를 포함. /proc/tty/driver에는 TTY 드라이버와 사용법의 목록을 포함
- /proc/uptime, 부팅 이후 커널이 실행된 시간과 유휴 모드에서 소비된 시간의 길이 (둘 다 초)
- /proc/version, 리눅스 커널 버전, 배포판 번호, gcc 버전 번호 (커널을 빌드하는 데 사용됨), 및 현재 실행 중인 커널 버전과 관련된 임의의 기타 관련 정보를 포함
- 다른 파일은 다양한 하드웨어, 모듈 구성, 및 커널의 변경에 따라 달라집니다.
리눅스 아래에서 /proc를 사용하는 기본 유틸리티는 procps (/proc 프로세스) 패키지에 포함되어 있고, 마운트된 /proc와 함께만 작동합니다.
CYGWIN
Cygwin에서는 기본적으로 리눅스 procfs와 같은 procfs를 구현했습니다.
References
- Nemeth, Evi; Snyder, Garth; Hein, Trent R.; Whaley, Ben (2010-07-14). UNIX and Linux System Administration Handbook. Pearson Education. p. 136. ISBN 978-0-13-211736-4.
- Amit Singh (2003). "/proc on Mac OS X". Mac OS X Internals: The Book. Archived from the original on 2012-05-04. Retrieved 2021-07-10.
- "linprocfs(5)". FreeBSD Manual Pages. The FreeBSD Project. 2019-11-13. Retrieved 2021-06-12.
- "Detailed changes between OpenBSD 5.6 and 5.7". openbsd.org.
- "3.2.2. /proc/buddyinfo". centos.org. Archived from the original on 2 September 2013. Retrieved 23 May 2011.
- Baron, Jason. "HT vs. dual-core". Archived from the original on 13 May 2016. Retrieved 28 June 2011.
- "Understanding Linux /proc/cpuinfo". richweb.com. Archived from the original on 2012-04-03. Retrieved 2015-04-21.
- Nguyen, Binh (2004-07-30). "Linux Filesystem Hierarchy". Binh Nguyen. p. 63. Retrieved 2016-07-18. /proc/kmsg[:] Messages output by the kernel. These are also routed to syslog.
- "The /proc filesystem". Linux Kernel documentation. Retrieved 9 August 2024.
Sources
- Unix 8th Edition proc(2) manual page - Description of the original procfs.
- Plan 9 procfs manual page - Plan 9 greatly expanded the procfs concept, providing a much expanded interface to control and manipulate processes.
- Linux Manual Pages Proc(5) Linux manual documentation for procfs
- Documentation/filesystems/proc.txt Linux kernel documentation for procfs
External links
- A brief history of /proc Eric Schrock's Weblog
- Access the Linux kernel using the Procfs An IBM developerWorks article by M. Tim Jones
- Linux-Filesystem-Hierarchy Linux Documentation Project
- Discover the possibilities of the /proc directory by Federico Kereki