/ dev 및 해당 하위 디렉토리 및 파일 이해


51
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. 아래의 /dev모든 파일과 하위 디렉토리가 모두 장치의 파일 설명자 인지 궁금 합니다.
  2. 서로 너무 많은 링크가있는 이유는 무엇입니까? 예를 들어, /dev/fd/0, /dev/stdin, /proc/self/fd/0모든 링크에 있습니다 /dev/pts/2.
  3. 경우 llrwx------평균 링크, 무슨 않습니다 ccrw--w---- 의미?

3
그리고 # 3으로 대답하기 위해 c는 문자 장치 또는 문자 특수를 나타 냅니다. b는 블록 스페셜을 나타냅니다 .
felixphew 2014

답변:


77

아래의 거의 모든 파일 /dev장치 파일 입니다. 일반 파일을 읽고 쓰는 것이 디스크 나 다른 파일 시스템에 데이터를 저장하는 반면, 장치 파일에 액세스하는 것은 커널의 드라이버와 통신하며, 일반적으로 하드웨어 (하드웨어 장치, 따라서 이름)와 통신합니다.

장치 파일에는 두 가지 유형이 있습니다 : 블록 장치 ( b의 출력에서 ​​첫 번째 문자로 ls -l표시됨) 및 문자 장치 (로 c표시됨). 블록과 문자 장치의 차이점은 완전히 보편적 인 것은 아닙니다. 블록 장치는 크기가 큰 고정 크기 파일처럼 동작하는 디스크와 같은 것입니다. 특정 오프셋에서 바이트를 쓴 다음 나중에 해당 오프셋에서 장치에서 읽을 경우 해당 바이트를 다시 가져옵니다. 문자 장치는 바이트 작성이 즉각적인 영향을 미치며 (예 : 직렬 회선에서 방출 됨) 바이트를 읽는 것도 즉각적인 영향을 미칩니다 (예 : 직렬 포트에서 읽음).

장치 파일의 의미는 이름이 아닌 번호로 결정됩니다 (이름은 응용 프로그램에 중요하지만 커널에는 중요하지 않음). 숫자는 실제로 두 개의 숫자입니다. 주 숫자는이 장치를 담당하는 드라이버를 나타내고 부 숫자는 드라이버가 여러 장치를 구동 할 수있게합니다 ¹. 이 숫자는 ls -l목록에 표시되며 일반적으로 파일 크기를 찾습니다. 예 : brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→이 장치는 메이저 8, 마이너 0입니다.

아래의 일부 장치 파일 /dev이 하드웨어 장치와 일치하지 않습니다. 모든 유닉스 시스템에 존재하는 것은 /dev/null; 쓰기는 효과가 없으며, 읽은 데이터는 전혀 반환되지 않습니다. 명령의 출력을 무시 >/dev/null하거나 ( </dev/null) 입력없이 명령을 실행 하려는 경우 쉘 스크립트에서 편리합니다 . 다른 일반적인 예는 /dev/zero(null 바이트 ad infinitum/dev/urandom 반환 ) (임의 바이트 ad infinitum 반환 )입니다.

일부 장치 파일은 액세스하는 프로세스에 따라 의미가 있습니다. 예를 들어, /dev/stdin현재 프로세스의 표준 입력을 지정합니다. 에서 열기는 프로세스의 표준 입력으로 열린 원래 파일을 여는 것과 거의 동일한 효과를 갖습니다. 다소 비슷하게 /dev/tty프로세스가 연결된 터미널을 지정합니다. 오늘날 리눅스에서는 /dev/stdin친구들이 문자 장치로 구현되는 것이 아니라 모든 파일 디스크립터를 참조 할 수있는보다 일반적인 메커니즘에 대한 상징적 링크로 사용됩니다 (전통적인 방법에서는 0, 1 및 2 만 반대). 예를 들어 /dev/stdin에 대한 심볼릭 링크가 /proc/self/fd/0있습니다. 보기 는 / dev는 FD / PROC / 자기 / FD 관련 / 않는 방법 /? .

아래에 여러 가지 심볼릭 링크가 /dev있습니다. 장치 파일이 한 이름에서 다른 이름으로 이동되었지만 일부 응용 프로그램은 여전히 ​​이전 이름을 사용합니다. 예를 들어 Linux /dev/scd0에서 심볼릭 링크입니다 /dev/sr0. 둘 다 첫 번째 CD 장치를 지정합니다. 심볼릭 링크에 대한 또 다른 이유는 조직 : 리눅스에서, 여러 장소에서 하드 디스크와 파티션을 찾을 수 있습니다 : /dev/sda/dev/sda1친구들 (임의의 문자로 지정된 각 디스크 및 파티션 파티션 레이아웃에 따라), /dev/disk/by-id/*(디스크는 지정 고유 일련 번호) /dev/disk/by-label/*(파일 시스템이있는 파티션, 사람이 선택한 레이블로 지정); 그리고 더. 일반 장치 이름이 여러 이름 중 하나 일 수있는 경우에도 심볼릭 링크가 사용됩니다. 예를 들어/dev/dvd에 대한 심볼릭 링크 /dev/sr0이거나 /dev/sr1두 개의 CD 리더가 있고 두 번째 CD 리더가 기본 DVD 리더 인 경우에 대한 링크 일 수 있습니다 .

마지막으로, 아래 /dev에서 찾을 수있는 몇 가지 다른 파일이 있습니다 . 모든 시스템에서 동일한 것을 찾을 수는 없습니다. 대부분의 유니 세에서 프로그램은 로그 메시지를 생성하는 데 사용 /dev/log하는 소켓 입니다. /dev/MAKEDEV에 항목을 작성하는 스크립트입니다 /dev. 최신 Linux 시스템에서 항목은 udev/dev/의해 자동으로 작성 되어 사용 되지 않습니다 .MAKEDEV

¹ 이것은 Linux에서는 더 이상 사실이 아니지만이 세부 사항은 장치 드라이버 작성자에게만 중요합니다.


감사! "장치 파일의 의미는 번호에 의해 결정됩니다"란 파일 설명자를 의미합니까?
Tim

@Tim : 아니요. 숫자 ls -l는 날짜 전에 파일 크기를 찾을 수있는 위치 에 목록에 나타납니다 . 예를 들어 brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→이 장치는 주요 8, 작은 0입니다. 실제로 장치 번호가 자주 나오지 않습니다. 장치를 장치로 만드는 것 (가장 중요한 것은 파일 이름이 아닙니다). 파일 디스크립터 번호는 특정 프로세스에서만 의미가 있습니다.
Gilles 'SO- 악마 그만'

아니요, Linux에서 /dev/stdin(=> /proc/self/fd/0)을 여는 것은 표준 입력 복제와 동일한 효과가 아닙니다. 차이를 확인하려면 su - non_root_user, 다음 exec 5</dev/stdin의 "권한 거부"와 함께 실패하지만 exec 5<&0성공합니다. 그리고 그것은 새로운 FD는 다른 플래그와 함께 열리도록뿐만 아니라이다, 파일 객체 ( "파일 열기 descrip에 대한 모든 POSIX의 용어에서")는 (파일 포인터 오프셋 비 / 차단 모드 등) 다를 수 있습니다.
mosvy

14
  1. 예-직접 또는 심볼릭 링크-그게 /dev/목적입니다.
  2. 다양한 목적을 위해 : 때때로 이름 지정 체계 간의 호환성을 위해 작업 환경에 대한 예가 필요할 수도 있습니다 /dev/stdin. 이것은 정적 으로 또는 다른 것을 가리 키지 않습니다. 단지 다른 터미널로 전환하면 알 수 있습니다. 현재 터미널 세션 의 표준 입력입니다 . 그것이 또한 심볼릭 링크가 필요한 이유이기도합니다./dev/pts/2/dev/stdin
  3. 참조 man mknodinfo coreutils 'mknod invocation'. 일반적으로 cchararacter 장치 유형을 나타냅니다.

3
"현재 터미널 세션의 표준 입력"은 약간 모호합니다. /dev/stdin프로세스를 열 프로세스의 표준 입력을 나타냅니다. 모든 /proc/$pid것은 프로세스에 의존하는 데이터이며 /proc/self프로세스 자체 데이터를 가리키는 일종의 매직 심볼릭 링크입니다.
Stéphane Gimenez

11

첫 번째 질문의 경우 파일 설명자가 아니라 장치 파일입니다. (일명 "dev 노드")

이러한 파일은 주 번호와 부 번호를 사용하여 장치를 처리하는 드라이버와 바인딩됩니다. 예를 들어, ls출력의 "136, 2"는 주 번호 136에 바인딩 된 장치 드라이버를 나타내며 해당 드라이버가 처리하는 장치 # 2를 지정합니다.

첫 번째 출력 ls -l문자는 장치 파일의 경우 장치 유형입니다. 'c'인 경우 문자 장치이거나 'b'인 경우 블록 장치입니다.

두 번째 질문은 rozcietrzewiacz의 위 답변을 참조하십시오.


1
"장치 드라이버 소개"링크가 손상되었습니다.
Slothworks는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.