/ proc / *는 어떻게 작동합니까?


62

많은 파일이 있습니다 /proc같은, /proc/cpuinfo, /proc/meminfo, /proc/devices등, 어떤, 열, 반환 시스템 정보.

이러한 파일은 실제로 존재하지 않는 것 같습니다. 파일에서 실행하면 파일 file이 비어 있음을 나타냅니다.

$ file /proc/cpuinfo
/proc/cpuinfo: empty

이 파일들은 정확히 어떻게 작동합니까?

답변:


72

적어도 구현 세부 정보가 필요하지 않은 경우 실제로 매우 간단합니다.

우선 Linux에서는 모든 파일 시스템 (ext2, ext3, btrfs, reiserfs, tmpfs, zfs 등)이 커널에서 구현됩니다. 일부는 FUSE를 통해 사용자 영역 코드로 작업을 오프로드 할 수 있으며 일부는 커널 모듈 형태로만 제공됩니다 ( 기본 ZFS 는 라이센스 제한으로 인해 후자의 대표적인 예임 ). 이것은 중요한 기본 사항입니다.

프로그램이 파일에서 읽을하고자 할 때, 그것은 궁극적으로의 형태로 커널에 결국 다양한 시스템 라이브러리 호출을 발행합니다 open(), read(), close()순서는 (아마도과 seek()좋은 법안을 위해 던져). 커널은 제공된 경로와 파일 이름을 가져오고 파일 시스템과 장치 I / O 계층을 통해이를 물리적 읽기 요청으로 변환합니다 (많은 경우 쓰기 요청 (예 : 시간 업데이트)).

그러나 이러한 요청을 구체적으로 물리적 영구 저장소 로 변환 할 필요는 없습니다 . 커널의 계약은 특정 시스템 호출 세트를 발행하면 해당 파일의 내용을 제공한다는 것 입니다. 실제 영역에서 "파일"이 존재하는 곳은 이차적 인 것입니다.

On /proc은 일반적으로 알려진 것으로 마운트됩니다 procfs. 이것은 특별한 파일 시스템 유형이지만 파일 시스템이기 때문에 실제로 ext3파일 시스템이 어딘가에 마운트 된 것과 다르지 않습니다 . 따라서 요청은 procfs 파일 시스템 드라이버 코드로 전달됩니다.이 파일은 모든 파일과 디렉토리를 알고 커널 데이터 구조에서 특정 정보를 반환합니다 .

이 경우 "스토리지 계층"은 커널 데이터 구조이며 procfs이들에 액세스하기위한 깨끗하고 편리한 인터페이스를 제공합니다. procfs를 장착하는 /proc것은 단순히 관례입니다. 다른 곳에 쉽게 장착 할 수 있습니다. 실제로, 때때로 실행되고있는 프로세스가 어떤 이유로 / proc에 액세스해야 할 때 chroot jails에서 수행됩니다.

일부 파일에 값을 쓰면 같은 방식으로 작동합니다. 커널 레벨에서, 그 일련의로 변환 open(), seek(), write(), close()다시 파일 시스템 드라이버로 전달받을 전화; 이 특별한 경우에도 procfs 코드입니다.

file반환 empty이 나타나는 특별한 이유 는 procfs에 의해 노출 된 많은 파일 이 크기가 0 바이트이기 때문입니다. 0 바이트 크기는 커널 측에서 최적화되었을 가능성이 높습니다 (/ proc의 많은 파일은 동적이며 한 읽기에서 다음 읽기까지의 길이가 다양 할 수 있으며 모든 디렉토리 읽기에서 각 파일의 길이를 계산합니다) 잠재적으로 매우 비쌉니다). strace 또는 유사한 도구를 통해 자신의 시스템에서 확인할 수있는이 답변에 대한 의견으로 file먼저 stat()특수 파일을 감지 하는 호출을 발행 한 다음 파일 크기가 0으로보고되면 기회를 얻습니다. 파일을 비우고 중단하고보고합니다.

이 문제는 실제로 문서화 될 수 지정하여 오버라이드 (override) -s또는 --special-filesfile, 호출 등의 부작용이있을 수 있습니다 매뉴얼 페이지에 명시된 있지만. 아래 인용문은 2011 년 10 월 17 일자 BSD 파일 5.11 매뉴얼 페이지에서 인용 한 것입니다.

일반적으로 파일은 stat (2) 보고서가 일반 파일 인 인수 파일의 유형 만 읽고 결정하려고합니다. 특수 파일을 읽는 것이 특별한 결과를 초래할 수 있기 때문에 문제를 예방할 수 있습니다. -s옵션을 지정 하면 파일은 블록 또는 문자 특수 파일 인 인수 파일도 읽습니다. 이것은 블록 특수 파일 인 원시 디스크 파티션에있는 데이터의 파일 시스템 유형을 결정하는 데 유용합니다. 이 옵션은 또한 일부 시스템에서 원시 디스크 파티션에 대해 0 크기를보고하므로 stat (2)에 의해보고 된 파일 크기를 무시 합니다.


5
당신이 그것을 볼 때 strace file /proc/version또는 ltrace -S /proc/version, 최적화 오히려 작다. 그것은 않는 stat()첫 번째 통화를하고 크기가 따라서를 건너 뛰는 0 인 것을 발견 open()-하지만 그 전에 몇 가지 마법 파일을로드합니다.
ott--

2
@ ott-- 사실 이상한 이벤트 시퀀스이지만 여러 파일 이름을에 전달할 수 있다는 사실과 관련이 있을 수 있습니다 file. 이런 방식으로 파일은 매직 파일을 미리로드 한 다음 명령 줄 매개 변수를 매개 변수별로 처리합니다. 매직 파일 로딩을 코드의 "이 파일 어떤 종류의 파일인지 확인하기 전에 수행하십시오"로 코드를 이동하는 대신 복잡성을 증가시킵니다. stat()반환 가치를 부르고 행동하는 것은 본질적으로 무해합니다. 버그 발생으로 인한 추가 내부 상태 위험을 추적하는 데 복잡성을 추가합니다.
CVn

@ ott-- 사실, file“파일이 비어 있습니다”라는 보고서는 stat특수 파일 (이름 지정된 파이프, 장치 등)을 감지하기 위해 호출 하기 때문에 빈 파일 처리를 중지 하는 데이 기회가 걸립니다. file -s /proc/version“ASCII 텍스트”를보고합니다.
Gilles

4
@Gilles The -sblock / char 특수 장치 용입니다. 마지막으로 file소스를 살펴보고 fsmagic.c의 끝에서이 설명이 왜 ASCII text대신에 반환되는지 설명했습니다 empty.If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
ott--

15

이 디렉토리에서 커널이 장치를 보는 방법을 제어하고, 커널 설정을 조정하고, 장치를 커널에 추가하고 다시 제거 할 수 있습니다. 이 디렉토리에서 메모리 사용량 및 I / O 통계를 직접 볼 수 있습니다 .

마운트 된 디스크와 사용 된 파일 시스템을 확인할 수 있습니다. 요컨대, 무엇을 찾아야하는지에 관해 리눅스 시스템의 모든 측면을이 디렉토리에서 조사 할 수 있습니다.

/proc디렉토리는 일반적인 디렉토리가 아니다. 부팅 CD로 부팅하고 하드 드라이브에서 해당 디렉토리를 보면 비어있는 것으로 나타납니다. 정상적인 운영 체제에서 볼 때 상당히 클 수 있습니다. 그러나 하드 디스크 공간을 사용하지 않는 것 같습니다. 가상 파일 시스템이기 때문입니다.

때문에 /proc파일 시스템이 가상 파일 시스템 및 메모리에 상주, 새로운 /proc파일 시스템은 리눅스 머신이 재부팅 될 때마다 생성됩니다.

즉, 파일 및 디렉토리 유형 인터페이스를 통해 Linux 시스템의 내장을 쉽게 엿보고 찌를 수있는 수단 일뿐입니다. /proc디렉토리 에서 파일을 볼 때 Linux 커널에서 다양한 메모리를 직접보고 그 내용을 볼 수 있습니다.

파일 시스템의 레이어

여기에 이미지 설명을 입력하십시오

예 :

  • 내부 /proc에는 프로세스 ID로 이름이 지정된 각 실행중인 프로세스에 대한 디렉토리가 있습니다. 이 디렉토리에는 다음과 같은 프로세스에 대한 유용한 정보가있는 파일이 있습니다.
    • exe: 프로세스가 시작된 디스크의 파일에 대한 심볼릭 링크입니다.
    • cwd: 프로세스의 작업 디렉토리에 대한 심볼릭 링크입니다.
    • wchan: 읽을 때 프로세스가있는 대기 채널을 반환합니다.
    • maps: 읽을 때 프로세스의 메모리 맵을 리턴합니다.
  • /proc/uptime 가동 시간을 공백으로 구분하여 초 단위의 소수점 2 자리로 반환합니다.
    • 커널이 시작된 이후의 시간
    • 커널이 유휴 상태 인 시간
  • /proc/interrupts: 인터럽트 관련 정보.
  • /proc/modules: 모듈 목록입니다.

자세한 내용은 man proc 또는 kernel.org를 참조하십시오 .


"부트 CD로 부팅하고 하드 드라이브의 해당 디렉토리를 보면 비어있는 것으로 보입니다." 이는 / proc에만 국한되지 않으며 기본 파일 시스템이 마운트되지 않은 마운트 지점에 일반적입니다. 동일한 부팅 CD로 부팅하고 다음과 같은 작업을 수행 mount -t procfs procfs /mnt/proc하면 현재 실행중인 커널의 / proc이 표시됩니다.
CVn

5

맞습니다. 실제 파일이 아닙니다.

가장 간단한 용어로, 커널을 직접 호출하는 대신 파일을 읽고 쓰는 일반적인 방법을 사용하여 커널과 대화하는 방법입니다. 그것은 유닉스의 "모든 것이 파일이다"라는 철학과 일치합니다.

파일은 /proc물리적으로 어디에도 존재하지 않지만 커널은 파일 내에서 읽고 쓰는 파일에 반응하고 저장소에 쓰는 대신 정보를보고하거나 무언가를 수행합니다.

마찬가지로, 파일 /dev은 실제로는 전통적인 의미의 파일이 아닙니다 (일부 시스템에서는 파일 /dev이 실제로 디스크에 존재할 수 있지만 참조하는 장치 이외 의 파일 은 많지 않습니다). 일반적인 Unix 파일 I / O API를 사용하는 장치 또는 쉘과 같이 사용하는 모든 장치에


1
파일 만 보호 할 수 있다는 것이 * nix와 같습니다. 액세스 제어 목록은 파일 시스템에 유지되므로 파일 시스템 드라이버에서 이미 제공 한 공통 메커니즘을 사용하여 권한있는 리소스를 보호하는 것이 편리합니다. 이는 커널 구조에 액세스하는 도구의 구현을 단순화하고 대신 proc 파일 시스템 가상 파일을 읽음으로써 높은 권한없이 실행할 수있게합니다.
Pekka

3

/proc디렉토리 안에는 두 가지 유형의 컨텐츠가 있습니다. 첫 번째 디렉토리는 번호가 매겨지고 두 번째는 시스템 정보 파일입니다.

/proc가상 파일 시스템입니다. 예를 들어, ls -l /proc/stat크기가 0 바이트 인 것을 알 수 있지만 "cat / proc / stat"를 수행하면 파일 내부에 일부 내용이 표시됩니다.

를 수행 ls -l /proc하면 숫자가 많은 디렉토리가 많이 표시됩니다. 이 숫자는 프로세스 ID (PID)를 나타냅니다. 이 번호가 매겨진 디렉토리 내의 파일은 해당 특정 PID의 프로세스에 해당합니다.

에서 사용할 수있는 일부 파일 /proc에는 cpuinfo, meminfo 및 loadavg와 같은 시스템 정보가 포함되어 있습니다.

일부 Linux 명령은 이러한 /proc파일 에서 정보를 읽고 표시합니다. 예를 들어, free 명령은 /proc/meminfo파일 에서 메모리 정보를 읽고 포맷하여 표시합니다.

개별 /proc파일 에 대한 자세한 내용을 보려면 “man 5 FILENAME”을 수행하십시오.

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.

2
이것은 "/ proc에있는 것을 어떻게 사용 하는가?" "/ proc은 어떻게 작동합니까?" 유용한 정보이지만 반드시이 특정 질문에 대답 할 필요는 없습니다 .
CVn

/ proc의 각 파일은 런타임 정보입니다. 즉, 커널의 / proc / meminfo 부분을 cat 할 때 파일 내용을 생성하는 기능이 실행됩니다.
Shailesh

3

최소 실행 가능 예

내 생각에 이러한 것들을 이해하는 가장 좋은 방법은 실제로 그것들을 가지고 노는 것이므로 procfs 항목을 만드는 커널 모듈이 있습니다.

myprocfs.c

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
#include <uapi/linux/stat.h> /* S_IRUSR */

static const char *filename = "lkmc_procfs";

static int show(struct seq_file *m, void *v)
{
    seq_printf(m, "abcd\n");
    return 0;
}

static int open(struct inode *inode, struct  file *file)
{
    return single_open(file, show, NULL);
}

static const struct file_operations fops = {
    .llseek = seq_lseek,
    .open = open,
    .owner = THIS_MODULE,
    .read = seq_read,
    .release = single_release,
};

static int myinit(void)
{
    proc_create(filename, 0, NULL, &fops);
    return 0;
}

static void myexit(void)
{
    remove_proc_entry(filename, NULL);
}

module_init(myinit)
module_exit(myexit)
MODULE_LICENSE("GPL");

그리고 우리는 다음과 같이 상호 작용합니다.

insmod procfs.ko
cat /proc/lkmc_procfs

출력이 생성됩니다.

abcd

이 예에서, 우리는 것을 명확하게 볼 proc파일은 우리와 같은 임의의 "파일 관련 시스템 호출"을 구현할 수 open, readllseek.

그런 다음 해당 시스템 호출을 사용하여 커널과의 임의 통신이 가능합니다.

따라서 해당 파일은 파일 시스템의 실제 파일과 관련이 없어도되며 거의 모든 경우에 해당됩니다.

예를 들어 우리의 작은 예에서, 우리는 read항상 쓸만한 쓸모없는 파일을 만듭니다 abcd\n.

다음은이 커널 모듈로 쉽고 안전하게 빌드하고 재생할 수있는 완전 자동화 된 QEMU + Buildroot 설정입니다.

다른 유사한 인터페이스는 다음과 같습니다.

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