특수 장치 파일에 왜 inode가 있습니까?


11

장치 파일은 파일 자체가 아닙니다. Unix와 같은 운영 체제에서 장치를 사용하기위한 I / O 인터페이스입니다. 디스크에는 공간을 사용하지 않지만 stat명령에 의해보고 된대로 여전히 inode를 사용합니다 .

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

장치 파일 이 파일 시스템에서 물리적 아이 노드를 사용 하고 왜 필요한가?


2
아이 노드와 데이터 파일입니다. 아이 노드가 없으면 파일이 없습니다. (장치 파일에는 데이터가 없습니다)
user253751

답변:


16

짧은 대답은 실제 파일 시스템 백업이있는 경우에만 수행된다는 것입니다 /dev(현대 Linux 배포판을 사용하는 경우에는 그렇지 않습니다).

긴 대답은 다음과 같습니다.

이 모든 것이 모든 것이 파일이라는 원래의 UNIX 철학으로 돌아갑니다. 이 철학은 UNIX를 다용도로 만든 것의 일부입니다. 응용 프로그램에 물리적 코드와 직접 통신하기 위해 응용 프로그램에 특별한 코드가 없어도 사용자 공간의 장치와 직접 상호 작용할 수 있기 때문입니다.

원래 /dev는 장치 파일을 넣는 잘 알려진 이름의 다른 디렉토리 일뿐입니다. 일부 UNIX 시스템은 여전히이 접근법을 취합니다 (OpenBSD는 여전히 그렇게 생각합니다). 시스템에 실제로없는 장치 (예 : 모든 파일)가 많은 장치 파일이 있기 때문에 일반적으로 시스템이 이와 같은지 알 수 있습니다 가능한 모든 디스크에서 가능한 파티션). 이렇게하면 약간의 디스크 공간을 사용하는 비용으로 부팅시 메모리 공간과 시간을 절약 할 수 있습니다. 이는 초기 메모리와 비교하면 메모리가 매우 제한적이고 빠르지 않기 때문에 초기 시스템과의 균형이 맞습니다. 이것을 일반적으로 static이라고합니다 /dev.

현대 리눅스 시스템에서 (그리고 FreeBSD와 아마도 최신 버전의 Solaris라고 생각합니다), /dev커널에 의해 채워지는 임시 메모리 내 파일 시스템입니다. . 이렇게하면 일부 메모리 (일반적으로 몇 MB 미만)와 매우 작은 처리 오버 헤드로 일부 디스크 공간이 절약됩니다. 또한 다른 많은 장점이 있으며, 가장 큰 장점 중 하나는 핫 플러그 ​​된 하드웨어를 쉽게 감지 할 수 있다는 것입니다. 이를 일반적으로 동적이라고합니다 /dev.

두 경우 모두 디바이스 노드는 일반 VFS 계층을 통해 액세스됩니다. 즉, 정의 상으로는 노드가 존재 stat()해야하는 가상 노드 일지라도 inode를 가져야한다는 것을 의미 합니다. 이것은 /devinode를 메모리에 저장하거나 필요에 따라 생성하기 때문에 동적을 사용하는 시스템에 영향을 미치지 않으며 /devinode가 디스크에서 거의 0 공간을 차지하고 대부분의 파일 시스템에 대한 상한이 없기 때문에 정적 위치에 거의 영향을 미치지 않습니다. 그 어느 누구보다 필요할 것입니다.


3
조심스럽게 손을 올립니다. 서버에 inode가 부족한 프로젝트를 진행했습니다. 마침내 우리 팀은 경영진이 우리 중 어느 누구에게나 가기 전에 (잘못 상상할 수 있듯이) 설계된 백엔드 시스템을 교체하는 데 투자하도록 설득해야 할 위기였습니다.
KRyan

@KRyan 그것은 일어날 수 있지만, 요즘 관리자가 파일 시스템 생성시 명시 적으로 숫자를 줄이지 않으면 드물다. 많은 최신 파일 시스템 (적어도 NTFS, BTRFS 및 ZFS, XFS도 마찬가지라고 생각합니다)은 실제로 inode를 동적으로 할당하므로 많은 최신 시스템에서 실제로는 실행이 불가능합니다.
Austin Hemmelgarn

@ KRyan 나도 그 문제가 있었다. 그리고 실제로 날짜와 시간이 조금 지나면 잘 설계 된 시스템이었습니다 (각 트랜잭션에는 독립적 인 로그가 필요했고 디스크에 보관되어 결국 작은 작은 inode로 채워졌습니다)
coteyr

1
Od와 Docker는이 inode 문제를 정확하게 일으키는 것으로 유명합니다.
coteyr

@AustinHemmelgarn ext 가족은 정적 수의 inode를 가지고있는 것으로 악명이 높습니다 (그리고 그 후에는 소진됩니다). 또한 우연히도 가장 많이 사용되는 Linux 파일 시스템은 아마도 ZFS와 BTRFS가 비교적 새로운 XFS에 많은 양의 데이터를 저장하는 시나리오이며 대부분의 배포판의 기본값입니다. 물론 최신 시스템에서 기본 최대 inode는 현재 보유하고있는 장치 파일의 수보다 훨씬 큰 크기입니다.

15

장치 파일도 권한을 가지며 inode에 저장됩니다.


언급을 잊어 버린 훌륭한 지적.
Austin Hemmelgarn

5
권한뿐만 아니라 파일 형식 및 기타 메타 데이터도 있습니다. 일반적으로 디렉토리 자체에는 이름과 inode 번호 만 포함되어 있습니다. inode를 읽을 때까지 파일이 장치임을 나타내는 것은 없습니다.
Gilles 'SO- 악마 그만해'

12

디렉토리는 단순히 파일 이름에서 inode 로의 매핑이므로 이름이 참조하는 것 (파일, 심볼릭 링크, 장치, FIFO, 소켓)에 관한 모든 것이 inode에 있어야합니다.

장치에 대한 정보는 inode에 저장됩니다. 주 장치 번호와 부 장치 번호가 있으며 권한, 타임 스탬프 등도 있습니다. 일반 파일이 아닌 블록 또는 문자 장치라는 유형 필드가 저장됩니다.

장치의 inode는 단순히 파일의 블록 맵을 포함하는 필드를 사용하지 않습니다.


0

inode가 없으면 해당 장치에 대한 모든 정보를 담을 파일 이름 만 갖습니다. 이것은 "좋은"장치 이름 /dev/sda은 의문의 여지가 없다는 것을 의미합니다. 같은 특정 드라이버에 연결될 수있는 이름이 필요합니다 /dev/ohci/sda.

더욱 중요한 것은 inode에 의존하는 모든 툴 (예 stat: ls등)을 경로를 /dev특수한 방식으로 처리하도록 수정해야한다는 것입니다. 그것은 현재 상황과 비교할 때 명백한 이익이없는 엄청나게 많은 양의 일입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.