/dev, 하위 디렉터리 및 파일 이해

/dev, 하위 디렉터리 및 파일 이해
$ 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. 평균 링크 l에 있다면 무엇 을 의미합니까 ?lrwx------ccrw--w----

답변1

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

b장치 파일에는 블록 장치( 출력의 첫 번째 문자로 표시 ls -l)와 문자 장치( 로 표시 c) 의 두 가지 유형이 있습니다 . 블록 장치와 문자 장치의 구별은 완전히 보편적이지 않습니다. 블록 장치는 디스크와 같으며 큰 고정 크기 파일처럼 동작합니다. 특정 오프셋에서 바이트를 쓴 다음 해당 오프셋에서 장치에서 읽으면 이 바이트를 얻습니다. 문자 장치는 바이트 쓰기가 직접적인 영향을 미치고(예: 직렬 회선에서 방출됨) 바이트를 읽는 것도 직접적인 영향을 미치는(예: 직렬 포트에서 읽음) 다른 장치와 매우 유사합니다.

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

아래 장치 파일 중 일부는 /dev하드웨어 장치에 해당하지 않습니다. 모든 UNIX 시스템에는 하나가 있습니다 /dev/null. 여기에 써도 아무 효과가 없으며 읽어도 데이터가 반환되지 않습니다. 쉘 스크립트에서 이는 명령의 출력을 무시 >/dev/null하거나( ) 입력 없이 명령을 실행하려는 경우( )에 편리한 경우가 많습니다. </dev/null다른 일반적인 예는 다음과 같습니다 /dev/zero(널 바이트 반환무기한)/dev/urandom(임의의 바이트를 반환합니다.무기한).

일부 장치 파일의 의미는 해당 파일에 액세스하는 프로세스에 따라 다릅니다. 예를 들어, /dev/stdin현재 프로세스의 표준 입력을 지정하면 프로세스의 표준 입력으로 열린 원본 파일을 여는 것과 거의 같은 효과가 있습니다. 다소 유사하게 /dev/tty프로세스가 연결된 터미널을 지정합니다. 오늘날 Linux에서 /dev/stdin친구는 더 이상 문자 장치로 구현되지 않지만 각 파일 설명자를 참조할 수 있는 보다 일반적인 메커니즘에 대한 기호 링크로 구현됩니다(예: 기존 접근 방식에서는 0, 1, 2만 사용) /dev/stdin. 에 대한 심볼릭 링크 /proc/self/fd/0. 바라보다/dev/fd와 /proc/self/fd/ 사이의 관계는 무엇입니까?.

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

/dev마지막으로, 레거시 이유로 인해 아래에서 몇 가지 추가 파일을 찾을 수 있습니다. 모든 시스템에서 동일한 콘텐츠를 찾을 수는 없습니다. 대부분의 unice에서는 /dev/log그렇습니다 .소켓로그 메시지를 발행하는 데 사용되는 프로그램입니다. /dev/MAKEDEV에 항목을 생성하는 스크립트입니다 /dev. 최신 Linux 시스템에서는 항목이 /dev/다음 명령에 의해 자동으로 생성됩니다.우데브, 구식입니다 MAKEDEV.

¹ Linux에서는 실제로 더 이상 적용되지 않지만 이 세부 사항은 장치 드라이버 작성자에게만 중요합니다.

답변2

  1. 그렇습니다. 직접적으로든 심볼릭 링크로든 그게 목적입니다 /dev/.
  2. 다양한 목적을 위해: 때로는 명명 체계 간의 호환성을 위해, 때로는 작업 환경에 필요합니다 /dev/stdin.아니요보다정적으로아니면 /dev/pts/2다른 터미널로 전환하면 알 수 있습니다. /dev/stdin표준 입력입니다현재의터미널 세션. 이는 심볼릭 링크가 필요한 이유에 대한 예이기도 합니다.
  3. man mknod및 을 참조하십시오 info coreutils 'mknod invocation'. 일반적으로 c문자 장치 유형을 나타냅니다.

답변3

첫 번째 질문은 파일 설명자가 아니라 장치 파일입니다. (일명 "개발 노드")

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

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

두 번째 질문은 위의 rozcietrzewiacz의 답변을 참조하세요.

관련 정보