
Linux에는 실제로 파일이 아닌 특수 파일이 있습니다.
가장 눈에 띄고 명확한 예는 다음 dev
과 같은 "파일" 폴더에 있습니다.
/dev/null
- 파일에 쓰는 모든 내용을 무시합니다./dev/random
- 파일 내용 대신 임의의 데이터를 출력합니다./dev/tcp
- 네트워크를 통해 이 파일에 쓴 모든 데이터를 보냅니다.
우선, 실제로 일종의 스크립트나 변장한 바이너리인 이러한 유형의 "파일"의 이름은 무엇입니까?
둘째, 어떻게 만들어지는가? 이러한 파일은 커널 수준에서 시스템에 내장되어 있습니까? 아니면 직접 "마법 파일"을 만들 수 있는 방법이 있습니까( 는 어떻습니까 /dev/rickroll
)?
답변1
/dev/zero
"특수 파일", 특히 "장치 노드"의 예입니다. 일반적으로 이러한 파일은 distro 설치 프로세스에 의해 생성되지만 다음을 수행할 수 있습니다.완전히원한다면 직접 만들어 보세요.
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
bash 쉘은 /dev/tcp
및 /dev/udp
(에서 복사됨 ksh93
)을 구현한 하나의 프로그램입니다. Bash 리디렉션 연산자가 있는 경로 아래의 경로를 열려고 하면 일반 open
시스템 호출이 수행되지 않습니다. 대신 bash는 TCP 소켓을 생성하여 지정된 포트에 연결합니다.
bash
이는 허용 과 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
차이점 ksh93
은 리디렉션 연산자를 사용하여 TCP 연결만 수행하고 또는 내장 bash
과 같은 파일을 열 수 있는 다른 위치에서는 수행하지 않는다는 것입니다 .source
.
답변3
다른 답변에 설명된 장치 노드 외에도mknod(2)또는 일부에서 제공devfs), Linux에는 특수 프로그램에서 제공하는 다른 "마법의" 파일이 있습니다.가상 파일 시스템, 특히 /proc/
(참조프로세스(5), 에 대해 읽다procfs) 및 /sys/
(에 대해 읽어보십시오.sysfs).
이러한 의사 파일(예:통계(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 마운트)
- 아이퓨즈(iDevice 마운트)
- 퓨즈DAV(WebDAV 공유 마운트)
- 퓨즈-exfat(exFAT 형식의 파일 시스템 마운트)
- NTFS-3g(그만큼리눅스 NTFS 드라이버)
비.키보드, 마우스, 조이스틱 등과 같은 가상 입력 장치를 생성하려는 경우(예: 사용 중인 USB 장치에 대한 사용자 공간 드라이버를 작성하려는 경우 libusb
) 다음이 있습니다.입력하지 않음.
이에 대한 바인딩은 찾기가 더 어렵지만 그것이 존재한다는 것을 알고 있습니다.가다(키보드 전용),파이썬, 그리고루비 (2).
실제 uinput 사용의 예는 다음과 같습니다.
- G15데몬(Logitech G15 게임 키보드의 LCD 및 게임 키용 Linux 드라이버)
- ds4drv(Sony DualShock 4 컨트롤러용 드라이버)
- 엑스박스드라브(대체 XBox 360 컨트롤러 드라이버 및 Linux에 해당)x360ce너무 형편없게 디자인된 게임Runner2: 리듬에이리언의 미래전설실제 XBox 컨트롤러와 대화하고 있지 않은데도 대화하고 있다고 생각할 수 있습니다)
- 오래된 Wiimote 드라이버는 다음과 같습니다.퀴이드누군가가 최종적으로 커널 Wiimote 드라이버를 작성하기 전에 필요했기 때문에 기본적으로 지원이 가능했습니다.
씨.일반 문자 장치의 경우원인(USERspace의 문자 장치). 하지만 훨씬 덜 인기가 있습니다.
개인적으로 알고 있는 CUSE API의 유일한 사용자는 API를 생성한 동일한 프로그램입니다.osspd/dev/dsp
, /dev/adsp
및 /dev/mixer
(OSS 오디오 API)를 사용자 공간에 구현하여 PulseAudio 또는 dmix를 통해 라우팅할 수 있습니다.
내가 찾을 수 있었던 유일한 CUSE 바인딩은 다음과 같습니다.큐피2010년 이후 업데이트되지 않았습니다.
디.새로운 특수 파일이 전혀 필요하지 않을 수도 있습니다.
예를 들어 다음을 사용하여 USB 장치와의 원시 통신을 열 수 있습니다.libusb(페이지의 바인딩 목록) 그런 다음 다른 메커니즘(TCP/UDP 소켓, stdin/stdout 또는 디스크의 일반 파일 읽기/쓰기 등)을 통해 다른 프로그램과 통신합니다.