UNIX 장치 파일이 정적이라고 말하는 사람은 무엇을 의미합니까?

UNIX 장치 파일이 정적이라고 말하는 사람은 무엇을 의미합니까?

나는 읽고 있었다우데브. "개요" 섹션에서 Wikipedia는 "/dev 디렉토리의 장치 노드가 정적 파일 세트인 기존 Unix 시스템과 달리 Linux udev 장치 관리자는 장치에 실제로 존재하는 노드만 동적으로 제공합니다. 시스템 ".

"정적 파일 세트"는 무엇을 의미합니까? 이것은 항상 파일이 있지만 /dev항상 실제 장치를 가리키는 것은 아니라는 의미입니까?

답변1

나는 당신이 이 단락을 언급하고 있다고 가정합니다.

/dev 디렉토리의 장치 노드가 정적 파일 세트인 기존 Unix 시스템과 달리 Linux udev 장치 관리자는 시스템에 실제로 존재하는 장치에 대해서만 동적으로 노드를 제공합니다. devfs는 한때 유사한 기능을 제공했지만 Greg Kroah-Hartman은 여러 가지 이유를 인용합니다.devfs에 비해 구현을 선호합니다.

/dev첫 번째 문장에서는 장치가 정적으로 생성되고 재부팅 후에도 지속되는 다른 Unix 시스템을 참조합니다 . 이전 버전의 Linux(예: 2.4 커널)는 이러한 방식으로 작동했지만 최신 버전에서는 더 이상 이러한 방식으로 작동하지 않습니다. 다른 Unix에는 일반적으로 설치 중에 공통 장치 파일 세트가 포함되어 있으므로 추가 파일을 수동으로 생성할 필요가 거의 없습니다.

2.4에서는 이 mknod명령을 사용하여 필요한 장치 파일을 수동으로 생성할 수 있습니다. 예를 들어:

$ mknod ./dev/random b 12 5

노트:이는 /dev/random파일 설명자를 메이저 번호 12와 마이너 번호 5의 블록 장치로 생성하는 것을 의미합니다.

/dev 아래의 장치 파일

OP는 디렉토리의 전반적인 기능에 대해 다음과 같은 후속 질문을 했습니다 /dev. 그의 질문은 다음과 같습니다.

재부팅 후 장치 파일을 보존하는 기술적 방법에 대한 세부 정보를 추가할 수 있습니까? 디스크에 물리적으로 어떻게 저장되나요? 특별한 파일 시스템 지원이 필요합니까?

이 문제를 조사하는 동안 다음부터 시작해야 한다고 생각했습니다.처음부터 리눅스 프로젝트/dev최신 버전의 Linux 커널에서 관리하는 방법에 대한 기본 개념을 알아보세요 . 예전에는(커널 버전 2.4 이전을 생각해 보세요) /dev디렉터리는 실제로 HDD의 공간을 차지하는 정적 파일 집합이었지만 Linux의 출현으로 더 이상 udev그렇지 sysfs않습니다.

전통적으로 이러한 특수 파일은 설치 중에 명령을 사용하여 배포에 의해 생성됩니다 mknod. 최근 몇 년 동안 Linux 시스템은 런타임 시 udev이러한 파일을 관리하기 시작했습니다 /dev. 예를 들어 udev장치가 감지되면 노드가 생성되고 장치가 제거되면 삭제됩니다(런타임 시 핫 플러그 ​​장치 포함). 이렇게 하면 /dev디렉토리(대부분)에는 존재할 수 있는 장치가 아닌 현재 시스템에 실제로 존재하는 장치에 대한 항목만 포함됩니다.

걱정하지 마세요 /dev. 디렉토리는 이제 재부팅 udev과 재부팅을 통해 완전히 관리됩니다 sysfs.

추가 리소스udevsysfs

인용하다

답변2

"장치 파일"은 특수한 유형의 파일입니다(디렉토리, 기호 링크, 명명된 파이프 및 Unix 도메인 소켓이 특수한 유형의 파일인 것과 거의 같은 방식입니다). 사용자 데이터를 직접 저장하지 않고 대신 주요 및 보조 장치 번호와 장치 유형(문자 또는 블록)을 저장합니다. Unix 계열 시스템용으로 설계된 파일 시스템은 저장 장치 파일을 지원합니다.

응용 프로그램이나 설치 명령을 통해 "장치 파일"에 액세스하면 파일 시스템에서 주요 및 보조 장치 번호와 장치 유형이 검색됩니다. 이 숫자를 기반으로 커널은 드라이버를 선택하고 엽니다.

전통적으로 장치 파일은 루트 파일 시스템의 /dev라는 디렉터리에만 존재하며 일반적으로 구성 파일을 읽고 장치 노드를 만드는 "MAKEDEV"라는 도구를 통해 생성됩니다. 이것을 정적 설정이라고 하며 거의 모든 UNIX 계열 운영 체제(Linux 포함)에서 수년 동안 사용되어 왔습니다. 이 접근 방식에는 몇 가지 단점이 있습니다.

  • 현재 시스템에 해당 하드웨어가 존재하지 않더라도 장치 파일은 존재합니다. 어떤 하드웨어가 존재하는지 존재하지 않는지 말하기는 어렵습니다.
  • 커널 업그레이드로 인해 새로운 장치 유형이 도입되는 경우 관리자는 해당 유형에 대한 장치 노드를 수동으로 생성해야 할 수 있습니다.
  • 메이저 및 마이너 번호의 공급은 제한되어 있으며 가능한 각 장치 노드에 쌍을 정적으로 할당하는 것은(파티셔닝으로 인해 하나의 물리적 장치가 많은 장치 노드를 가질 수 있다는 점을 기억하십시오) 확장이 불가능합니다.

이 문제를 해결하기 위한 Linux의 첫 번째 시도는 devfs였습니다(다른 유닉스 계열 운영 체제에도 devfs라는 파일 시스템이 있었지만 자세한 내용은 모르겠습니다). 이는 커널이 장치 노드를 제공하는 가상 파일 시스템입니다. 사실 상대적으로 아직 탄생하지 않은 상태였으며, 좋든 싫든 자체적인 비표준 장치 이름 지정 체계를 도입했으며 static /dev에 비해 큰 이점을 제공하지 않았습니다.

나중에 udev가 나타났습니다. 이것은 다른 모델을 사용합니다. tmpfs는 /dev에 마운트되며 사용자 공간 데몬은 커널의 알림을 기반으로 그 안에 있는 장치 노드를 관리합니다.https://lwn.net/Articles/65197/

최근에는 devtmpfs라는 것이 나타났습니다. 이는 타협처럼 보입니다. 커널은 기본 장치 노드 세트를 생성하지만 더 복잡한 기능이 필요한 경우 사용자 공간이 대신할 수 있습니다.

답변3

Altos 386(i386/SCO SysV Unix) 시스템에서 커널 업그레이드(또는 재설치) 시 생성해야 하는 정적 장치의 예로는 SCSI HP Dat Tape 장치를 지원하기 위한 과도한 /dev/mt 항목이 있습니다. 메이저 번호는 SCSI 버스의 테이프 드라이버에 사용되고 마이너 번호는 SCSI 장치 번호 및 기능(원본, 되감기, 되감기 제외)에 사용됩니다. 각 버스에 HD 확장 파일 시스템이 설치된 여러 하이브리드 테이프 장치를 지원할 수 있는 두 개의 SCSI 버스가 있습니다.

dev는 단순히 MAKEDDEV로 생성된 루트 파일 시스템의 항목입니다. 실용적인 목적을 위해 SCSI 장치 5의 되감기 장치를 /dev/st(내장 DC300 장치와 구별하기 위해 SCSI 테이프)에 연결할 수 있도록 보다 사용하기 쉬운 이름에 연결할 수 있습니다.

나중에 Slackware Linux를 사용하기 시작했을 때 동일한 작업을 수행해야 했고 3Com 3C509b 콤보 이더넷 카드를 올바르게 사용하려면 .99b 커널을 수동으로 패치해야 했습니다. 카테고리 5, BNC 및 AUI 커넥터가 있어 게임 실행 시 올바른 인터페이스를 얻을 수 있습니다.

관련 정보