"/dev" Linux 파일은 어떻게 생성되나요?

"/dev" Linux 파일은 어떻게 생성되나요?

Linux에는 일부 특수 파일이 있지만 실제로는 파일이 아닙니다.

가장 눈에 띄고 명확한 예는 dev"파일" 폴더에 있습니다. 예를 들면 다음과 같습니다.

  • /dev/null- 파일에 쓴 내용은 모두 무시하세요.
  • /dev/random- 파일 내용 대신 무작위 데이터 출력
  • /dev/tcp- 이 파일에 쓴 모든 데이터를 네트워크를 통해 보냅니다.

첫째, 이러한 유형의 "파일"의 이름은 무엇이며 실제로는 일종의 스크립트 또는 변장된 바이너리입니까?

둘째, 어떻게 만들어지는가? 이러한 파일은 커널 수준에서 시스템에 내장되어 있습니까? 아니면 직접 "마법 파일"을 생성할 수 있는 방법이 있습니까(그건 어떻습니까 /dev/rickroll)?

답변1

/dev/zero"특수 파일", 특히 "장치 노드"의 예입니다. 일반적으로 배포판 설치 프로세스에서 생성되지만 다음을 수행할 수도 있습니다.완전히원하는 경우 직접 만들 수 있습니다.

당신 ls이 묻는 다면 /dev/zero:

# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5  Nov 5 09:34 /dev/zero

시작 부분의 "c"는 이것이 "문자 장치"임을 나타냅니다. 다른 유형은 "블록 장치"( ls"b"로 인쇄됨)입니다. 대략적으로 말하면, 하드 디스크와 같은 랜덤 액세스 장치는 블록 장치인 경향이 있는 반면, 테이프 드라이브나 사운드 카드와 같은 순차 장치는 문자 장치인 경향이 있습니다.

"1, 5" 부분은 "주 장치 번호"와 "부 장치 번호"입니다.

이 정보를 사용하여 mknod명령을 사용하여 자체 장치 노드를 만들 수 있습니다.

# mknod foobar c 1 5

그러면 현재 폴더에 다음 foobar작업을 수행하는 새 파일이 생성됩니다.정확히. /dev/zero​(물론 원하는 경우 다른 권한을 설정할 수 있습니다.) 이 "파일"에는 실제로 위의 세 가지 항목(장치 유형, 주요 장치 번호 및 보조 장치 번호)이 포함되어 있습니다. 이를 사용하여 ls다른 장치의 코드를 찾고 다시 만들 수 있습니다. 지루할 때는 rm방금 생성한 장치 노드를 삭제하세요.

기본적으로 주요 장치 번호는 Linux 커널에 어떤 장치 드라이버와 통신할지 알려주고, 보조 장치 번호는 장치 드라이버에 어떤 장치를 사용하는지 알려줍니다. (예를 들어 SATA 컨트롤러가 있지만 여러 개의 하드 드라이브가 연결되어 있을 수 있습니다.)

네가 원한다면발명새로운 일을 하기 위한 새로운 장치... 음, Linux 커널의 소스 코드를 편집하고 자신만의 맞춤형 커널을 컴파일해야 합니다. 그러니 이러지 말자! :-) 하지만 이미 가지고 있는 파일과 중복되는 장치 파일을 추가할 수 있습니다. udev와 같은 자동화 시스템은 기본적으로 장치 이벤트를 모니터링하고 mknod자동으로 사용자를 호출합니다. rm이보다 더 마법같은 일은 없습니다.

아직있다다른특수 파일 형식:

  • Linux는 디렉토리를 특별한 종류의 파일로 간주합니다. (일반적으로 디렉터리를 직접 열 수는 없지만, 가능하다면 해당 디렉터리가 특별히 형식화된 데이터를 포함하고 해당 디렉터리에서 모든 파일을 찾을 수 있는 위치를 커널에 알려주는 일반 파일이라는 것을 알 수 있습니다.)

  • 심볼릭 링크는 특수 파일입니다. (그러나 하드 링크는 그렇지 않습니다.) 이 ln -s명령을 사용하여 심볼릭 링크를 만들 수 있습니다. (맨페이지를 찾아보세요.)

  • "명명된 파이프" 또는 "FIFO"(선입 선출 대기열)라는 것도 있습니다. 를 사용하여 만들 수 있습니다 mkfifo. FIFO는 다음과 같은 방법으로 열 수 있는 마법의 파일입니다.한 번 프로그래밍 - 한 번 읽고, 한 번 쓰세요. 이런 일이 발생하면 일반 쉘 파이프처럼 작동합니다. 하지만 각 프로그램을 개별적으로 시작할 수 있습니다...

어떤 방식으로든 "특별"하지 않은 파일을 "일반 파일"이라고 합니다. Unix 문서에서 이에 대한 언급을 가끔 볼 수 있습니다. 이것이 의미하는 바입니다. 장치 노드나 심볼릭 링크 등의 파일이 아닙니다. 어떤 마법적 속성도 없는 평범한 일상 파일입니다.

답변2

대부분의 /dev항목은 블록 장치 inode 또는 문자 장치 inode입니다.Wikipedia에는 ​​많은 세부정보가 있습니다.이 점에 대해서는 반복하지 않겠습니다.

그러나 /dev/tcp귀하의 질문에 언급된 기존 답변 중 어느 것도 이를 설명하지 않습니다. /dev/tcp그리고 /dev/udp대부분의 다른 항목과는 다릅니다 /dev. 블록 장치와 문자 장치는 커널에 의해 구현되는 반면, /dev/tcp및 는 /dev/udp사용자 모드에서 구현됩니다.

/dev/tcpbash 쉘은 및 구현이 포함된 프로그램입니다 /dev/udp(에서 복사됨 ksh93). Bash 리디렉션 연산자를 사용하여 경로를 열려고 하면 일반적인 open시스템 호출이 수행되지 않습니다. 대신 bash는 TCP 소켓을 생성하고 이를 지정된 포트에 연결합니다.

이는 사용자 모드에서 구현되며 일부 프로그램에서만 구현됩니다. 다음 예에서는 let bash과 try to open cat의 차이점을 보여줍니다./dev/tcp/::1/22

$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3

차이점은 TCP 연결에만 리디렉션 연산자를 사용하고 파일이 열릴 수 있는 다른 곳(예: 또는 내장) 에서는 ksh93사용 하지 않는다는 것입니다.bashsource.

답변3

다른 답변에 설명된 장치 노드 외에도 (사용맥놀드(2)또는 일부에서 제공파일 시스템 개발), Linux에는 특별히 제공되는 다른 "마법" 파일도 있습니다.가상 파일 시스템, 특히 /proc/(참조공정(5), 읽다프로세스 파일 시스템) 및 /sys/(에 대해 읽어보십시오.시스템 파일 시스템).

이러한 의사 파일(look -eg통계(2)- 장치가 아닌 일반 파일로)는 특히 커널에서 제공하는 가상 보기 /proc/입니다 cat /proc/$$/maps.오픈(2)-ing /proc/self/status)은 일반적으로 디스크나 네트워크의 물리적 I/O를 포함하지 않으므로 매우 빠릅니다.

추가 의사 파일을 만들려면 /proc/일반적으로 자체 의사 파일을 작성해야 합니다.커널 모듈그리고 그것을 로드하세요(예를 들어이것).

답변4

다른 사용자들이 이미 자세히 설명했듯이 특수 파일을 백업하려면 코드가 필요합니다. 그러나 Linux가 사용자 공간에서 코드를 작성하는 여러 가지 방법을 제공한다는 사실을 아무도 언급하지 않은 것 같습니다.

ㅏ. 퓨즈(USERspace의 파일 시스템)을 사용하면 커널을 충돌시키지 않고 이와 같은 것을 작성할 수 /proc있으며 원하는 언어/런타임에서 수행할 수 있습니다.가다,Node.js,진주,PHP,파이썬, 루비,,등..

sudo또한 FUSE 파일 시스템은 사용자가 설치를 수행하는 것과 동일한 방식으로 작동하기 때문에 설치할 필요가 없다는 장점도 있습니다 .

다음은 사람들이 FUSE를 사용하여 작성한 내용의 몇 가지 예입니다.

  • mp3fs(FLAC 파일을 MP3 파일로 볼 수 있으며, MP3 플레이어로 복사/클릭하고 드래그하면 즉석에서 생성됩니다)
  • PyTagsFS(메타데이터 태그로 구축된 가상 폴더 트리에서 미디어 보기)
  • 퓨즈 지퍼(Zip 파일을 폴더로 설치)
  • 퓨즈 ISO(ISO를 마운트하는 데 루트 권한이 필요하지 않습니다)
  • 퓨즈(i 장치 설치)
  • 퓨즈 DAV(WebDAV 공유 마운트)
  • 퓨즈-exfat(exFAT 형식 파일 시스템 마운트)
  • NTFS-3G(이것리눅스 NTFS 드라이버)

비.키보드, 마우스, 조이스틱 등과 같은 가상 입력 장치를 생성하려는 경우(예: 사용 중인 USB 장치에 대한 사용자 공간 드라이버 작성 libusb) 다음을 사용할 수 있습니다.입력.

바인딩을 찾기가 어렵지만 그것이 존재하는 이유를 알고 있습니다.가다(키보드만 해당),파이썬, 그리고루비 (2).

uinput 사용의 실제 예는 다음과 같습니다.

  • G15 데몬(Logitech G15 게임 키보드의 LCD 및 게임 키용 Linux 드라이버)
  • ds4drv(Sony DualShock 4 컨트롤러용 드라이버)
  • 엑스박스 드라이버(교체 Xbox 360 컨트롤러 드라이버 및 Linux 동급x360ce다음과 같이 제대로 설계되지 않은 게임러너 2: 퓨처 리듬 에일리언 레전드실제 Xbox 컨트롤러와 대화하고 있다고 생각할 수도 있지만 실제로는 그렇지 않습니다.)
  • Wiimote 베테랑 운전자들이 좋아해요서부 제국누군가가 최종적으로 커널 Wiimote 드라이버를 작성하기 전에 이 작업을 수행해야 하므로 기본적으로 지원이 제공됩니다.

씨.범용 문자 장치의 경우 다음이 있습니다.쿠사이(USERspace의 문자 장치). 하지만 그다지 인기가 없습니다.

개인적으로 아는 한 CUSE API의 유일한 사용자는 CUSE API를 생성한 동일한 프로그램입니다.오스푸드/dev/dsp, /dev/adsp및 (OSS 오디오 API)를 사용자 공간에 구현하여 /dev/mixerPulseAudio 또는 dmix를 통해 라우팅될 수 있습니다.

내가 찾을 수 있는 유일한 CUSE 바인딩은 다음과 같습니다.쿠세피2010년 이후로 업데이트되지 않았습니다.

디.새로운 특수 파일이 전혀 필요하지 않을 수도 있습니다.

예를 들어 다음 명령을 사용하여 USB 장치와의 원시 통신을 열 수 있습니다.libusb(페이지의 바인딩 목록) 그런 다음 다른 메커니즘(TCP/UDP 소켓, stdin/stdout 또는 디스크의 일반 파일 읽기/쓰기 등)을 통해 다른 프로그램과 통신합니다.

관련 정보