파일이란 무엇입니까?

파일이란 무엇입니까?

Linux/Unix의 파일 특성은 무엇입니까?

파일은 일반 파일, 디렉터리,심볼릭 링크,장치 파일,소켓,관로,선입선출, 그리고 내가 그리워하는 것 이상. 예를 들어 심볼릭 링크는 다음과 같습니다.

$ sudo file /proc/22277/fd/23
/proc/22277/fd/23: broken symbolic link to socket:[7540288]

소켓:

$ sudo ls -l /run/user/1001/systemd/notify
srwxrwxr-x 1 testme testme 0 Feb  6 16:41 /run/user/1001/systemd/notify
  1. 다음과 같은 특징을 가진 파일입니다인덱스 노드(메모리나 보조 저장 장치에 있는 일부 파일 시스템의 inode?) 모든 파일 유형에 inode가 있습니까? (두 질문에 모두 그렇다고 생각합니다.)

  2. Linux 인터넷 도메인 소켓, 전송 프로토콜(TCP/UDP) 소켓 및 포트열린 파일 설명이 있는 것이 파일이라고 말하는 것 같습니다. 열린 파일 설명이 있는 항목에는 반드시 inode가 있어야 합니까?

    열린 파일 설명은 파일보다 더 나은 용어이므로 "파일"을 정의할 수 없습니다. 네트워크 소켓과 Unix 도메인 소켓은 모두 열린 파일 설명입니다. UDS는 디스크의 무언가와 연관될 수 있습니다(이에 영향을 미칠 수 있는 조건은 많습니다). NS는 디스크의 어떤 것도 연결하지 않습니다.

감사해요.

답변1

긴 이야기 짧게

  • 파일은 일부 또는 모든 기본 작업(열기, 읽기, 쓰기, 닫기)을 수행할 수 있는 개체이며 inode에 메타데이터가 저장되어 있습니다.
  • 파일 설명자는 이러한 객체에 대한 참조입니다.
  • 열린 파일 설명(예, 열린 부분이 중요합니다)은 다음과 같습니다.어떻게파일(최소 하나의 파일 설명자로 표시됨)이 열려 있습니다.

추상화로서의 문서

상담하자POSIX 정의 2017, 섹션 3.164File이 정의되는 방법은 다음과 같습니다.

쓰거나 읽거나 둘 다 할 수 있는 개체입니다. 파일에는 액세스 권한 및 유형을 포함한 특정 속성이 있습니다. 파일 유형에는 일반 파일, 문자 특수 파일, 블록 특수 파일, FIFO 특수 파일, 기호 링크, 소켓 및 디렉토리가 포함됩니다. 구현에서는 다른 유형의 파일을 지원할 수 있습니다.

따라서 파일은 우리가 읽거나 쓸 수 있거나 둘 다 할 수 있는 모든 것이며 메타데이터도 포함합니다. 모두 집에 가세요. 사건은 종결되었습니다!

글쎄요, 그렇게 빠르진 않아요. 이러한 정의는 관련 개념을 위한 많은 공간을 열어주며 일반 파일과 파이프라인 간에는 분명한 차이가 있습니다. "모든 것이 파일이다"는 그 자체가 개념이다디자인 패턴문자 그대로의 진술보다는. 이 패턴을 기반으로 디렉터리, 파이프, 장치 파일, 메모리 파일, 소켓과 같은 파일 유형은 모두 일련의 시스템 호출을 통해 조작될 수 있습니다( 예 open(): 소켓 openat()의 경우 , USB의 경우 일관된 방식으로). 다양한 장치가 있지만 모두 정확히 동일한 USB 포트에 연결되어 있습니다(실제로 A부터 C까지 여러 유형의 USB 포트 유형이 있지만 아이디어를 얻으실 수 있습니다).write()recv()send()

물론 이것이 작동하려면 일관된 방식으로 실제 데이터에 대한 일종의 인터페이스나 참조가 있어야 합니다.파일 설명자:

파일 액세스를 위해 열려 있는 파일을 식별하는 프로세스당 고유한 음수가 아닌 정수입니다. 새로 생성된 파일 설명자는 0부터 {OPEN_MAX}-1까지의 값을 갖습니다.

따라서 write()일반 파일에 쓰는 것과 동일한 방식으로 파일 설명자 1을 통해 STDOUT에 액세스 할 수 있습니다 /home/user/foobar.txt. 파일에 액세스 하면 open()파일 설명자를 얻고 write()동일한 기능을 사용하여 파일에 쓸 수 있습니다. 이것이 바로 Unix의 최초 창시자가 다루려고 했던 것입니다. 바로 미니멀리즘과 일관된 동작입니다. 이렇게 하면 command > /home/user/foobar.txt쉘은 참조된 파일 설명자를 복사하여 foobar.txt 파일 설명자 1( echo 의 STDOUT )로 전달하거나 command더 정확하게는 명령을 실행한 dup2(3,1)다음 execve()명령을 실행합니다. 그러나 그럼에도 불구하고, command마치 아무 일도 일어나지 않은 것처럼 파일 설명자 1에 동일한 쓰기 시스템 호출이 계속 사용됩니다.

물론 대부분의 사용자가 파일이라고 생각하는 만큼 디스크 파일 시스템의 일반 파일로 생각한다. 이는 더 일치합니다.일반 파일 정의, 섹션 3.323:

시스템에서 추가 구조를 적용하지 않고 임의로 액세스할 수 있는 바이트 시퀀스인 파일입니다.

대조적으로, 우리는소켓:

POSIX.1-2017의 시스템 인터페이스 볼륨에 설명된 대로 프로세스 간 통신을 위한 통신 끝점으로 사용되는 특정 유형의 파일입니다.

유형에 관계없이 다양한 파일 유형에 대해 수행할 수 있는 작업은 개념적으로 동일합니다(열기, 읽기, 쓰기, 닫기).


모든 파일에는 inode가 있습니다.

파일 정의에서 주목해야 할 점은 파일에 inode에 저장되는 "특정 속성"이 있다는 것입니다. 실제로 특히 Linux에서는 다음을 참조할 수 있습니다.inode(7) 매뉴얼첫번째 줄:

각 파일에는 파일에 대한 메타데이터가 포함된 inode가 있습니다. 애플리케이션은 stat(2)(또는 관련 호출)을 사용하여 이 메타데이터를 검색할 수 있습니다.

번영. 명확하고 직접적입니다. 우리에게 가장 친숙한 inode는 디스크의 데이터 블록과 디렉토리에 저장된 파일 이름 사이의 브리지입니다(디렉토리는 파일 이름과 해당 inode의 목록일 뿐이기 때문입니다). 일지라도가상 파일 시스템예를 들어 커널의 Pipefs 및 sockfs에서는 inode를 찾을 수 있습니다. 다음 코드 조각을 예로 들어 보겠습니다.

static char *pipefs_dname(struct dentry *dent, char *buffer, int buflen)
{
    return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]",
            dentry->d_inode->i_ino);
}

파일 열기 지침

이제 완전히 혼란스러워졌으므로 Linux/Unix에서는 "열린 파일 설명"이라는 기능을 도입했으며 설명을 단순하게 유지하기 위해 이는 또 다른 추상화입니다.스티븐 차제라스(Stephen Chazeras)의 말에 따르면,

파일 자체보다는 파일이 열린 방법에 대한 기록에 가깝습니다.

그리고 그것은에 부합POSIX 정의:

프로세스 또는 프로세스 그룹이 파일에 액세스한 방법에 대한 기록입니다. 각 파일 설명자는 정확히 하나의 열린 파일 설명을 참조하지만 열린 파일 설명은 여러 파일 설명자에서 참조할 수 있습니다. 파일 오프셋, 파일 상태 및 파일 액세스 모드는 열린 파일 설명의 속성입니다.

이제 우리도 살펴보면Linux 커널에 대해 알아보기책에서 저자는 이렇게 지적한다.

Linux는 다음에 속하는 BSD 소켓을 구현합니다.양말 파일 시스템특수 파일 시스템...더 정확하게 말하면 각각의 새로운 BSD 소켓에 대해 커널은 다음을 수행합니다.양말 파일 시스템특수 파일 시스템.

이것을 기억소켓은 파일 설명자에서도 참조됩니다.따라서 커널의 소켓과 관련된 열린 파일 설명이 있으며 소켓이 파일이라고 결론을 내릴 수 있습니다.

계속됩니다. . . 아마도

답변2

파일이란 무엇입니까?

Linux의 파일은 기본적으로 상호 작용할 수 있는 것입니다. 총 7가지 파일 형식이 있습니다.

  • 소켓,
  • 심볼릭 링크,
  • 일반 파일,
  • 블록 장치,
  • 목차,
  • 캐릭터 디바이스,
  • FIFO(일명 파이프).

상황에 따라 파일에 대해 다른 방식으로 이야기하기 때문에 많은 혼란이 발생합니다. 이 논의에는 두 가지 다른 컨텍스트가 있습니다.

  • 디스크에 표시된 파일(파일 시스템)
  • Linux에서의 파일 표현("메모리 내")

Linux(메모리 내)

리눅스(메모리 내)에서는 모든 파일이(아니면 그럴 수도 있지?)인덱스 노드. 이 파일이 무엇인지 리눅스에게 알려주는 inode이기 때문에 하나가 필요합니다. inode를 의미 있는 콘텐츠(예: 디스크의 파일)에 다시 연결하기 위해 inode는 3가지 주요 정보를 저장합니다.

  • 장치 ID - 파일을 담당하는 파일 시스템 또는 드라이버에 대한 참조
  • inode 번호 - 파일 시스템이나 드라이버가 할당한 고유 번호입니다. 두 개의 inode가 서로 다른 장치 ID를 갖는 경우 동일한 inode 번호를 가질 수 있습니다.
  • Type - 리눅스에게 이 파일이 실제로 무엇인지 알려줍니다. 찾다.

파일과 상호 작용하는 방법은 파일 유형에 따라 다릅니다. 예를 들어 디렉터리를 나열할 수 있지만 장치를 차단할 수는 없습니다. 소켓에는 연결할 수 있지만 일반 파일에는 연결할 수 없습니다.

디스크에

다른 파일 시스템은 매우 다릅니다. ext4와 같은 파일 시스템은 unix 및 linux용으로 작성되었으며 inode 개념을 반영합니다. 따라서 인메모리 inode는 온디스크 inode에서 읽혀지는 것과 거의 같습니다.

그러나 그들은 다릅니다. 예를 들어 디스크의 inode에는 장치 ID가 없거나 필요합니다. Linux 온메모리 inode(인메모리)는 파일 데이터가 디스크에 저장된 위치를 추적해야 합니다. Linux의 Inode는 이 문제를 해결하기 위해 드라이버에 의존합니다.

디스크의 inode 번호는 일반적으로 드라이버에서 Linux의 inode 번호로 사용됩니다. 따라서 디스크의 inode는 종종 메모리의 inode로 오인됩니다.


파일(인덱스 노드)을 어떻게 참조합니까?

파일 이름

파일 이름은 파일을 참조(찾는)하는 가장 친숙한 방법입니다. 파일 시스템은 Linux가 사용하는 파일 이름 트리를 저장합니다 mount. 트리의 각 이름은 하나의 인덱스 노드만 가리킵니다.

Linux의 파일은 여러 개의 파일 이름을 가질 수 있습니다. 이는 파일 시스템에서도 지원하는 경우에만 가능합니다. Linux에서든 디스크에서든 동일한 inode를 가리키는 여러 이름을 가짐으로써 여러 파일 이름(하드 링크)이 구현됩니다.

파일을 삭제하면 해당 파일 이름만 삭제됩니다. 실제 점유된 공간은 모든 파일 이름이 삭제되고 모든 "파일 설명자"가 닫힌 경우에만 회수될 수 있습니다.

따라서 디스크에 있는 일반 파일에는 세 가지가 있습니다: 파일 이름 --> inode --> 데이터

파일 설명자

프로그램이 파일을 열면 파일 이름을 파일 설명자(숫자)로 교환합니다. 이는 이름이나 경로가 없는 inode에 대한 또 다른 링크입니다. 파일에 대한 모든 작업(예: "읽기" 및 "쓰기")은 파일 이름 대신 파일 설명자를 사용합니다.

파일 설명자는 open()을 통해 얻을 필요가 없습니다. 파일 설명자가 있으면 하위 프로세스에서 상속(복사)하거나 (unix 도메인 소켓을 통해) 완전히 다른 프로세스에 복사할 수도 있습니다.

OP에서 인용한 주석에서 "파일 설명"이라는 용어를 사용했기 때문에 이것이 약간의 혼란을 야기했다고 생각합니다. 나는 이 의견이 파일 설명자가 단순한 숫자 이상임을 설명하려고 한다고 생각합니다. 그러나 그들은 이것을 혼란스러운 방식으로 표현합니다.


파일 이름이나 파일 시스템이 없는 파일

이 모델에는 몇 가지 특징이 있습니다. 첫째, 파일을 연 다음 삭제하면(파일을 닫지 않고) 열린 파일 설명자가 디스크의 파일을 회수하는 것을 방지합니다. 그러면 파일 이름이 없는 파일이 생성됩니다.

더 이상한 점은 일부 파일이 파일 시스템에 속하지 않는다는 것입니다. 프로그램은이름없는 파이프또는이름없는 스코콧. Linux에는 inode가 있지만 Linux 커널에만 존재하기 때문에 파일 시스템에 직접 연결되지 않습니다. 이것들은 여전히 ​​파일입니다(이상하기는 하지만). inode를 참조하는 파일 설명자가 있습니다.

명명되지 않은 파이프의 일반적인 예는 명령줄 프로그램의 STDIN, STDOUT입니다. 파이프( foo | bar)를 통해 두 프로그램을 연결하면 두 프로그램 사이의 파이프는 이름 없는 파이프가 됩니다.


결론

종종 우리는 이러한 모든 개념을 하나로 묶고 "파일"이라는 단어를 사용합니다. 일반적으로 별도의 파일 이름, 디스크의 파일 이름으로 변환되는 inode, 디스크의 inode 및 궁극적으로 디스크에 내용을 쓰는 것과 관련하여 신경 쓰지 않고 "파일에 쓰기"를 수행할 수 있습니다. "파일에 쓰기"라는 용어는 이 모든 것을 의미합니다.

특별한 경우에만 이러한 개념을 분리해야 합니다.

답변3

1) Unix의 대부분 파일 시스템에서 파일, fifo, 디렉터리 등은 inode로 설명됩니다. inode에는 많은 필드가 있지만 이 경우 가장 흥미로운 것은 i_mode 필드입니다. 권한 옆에는 inode가 가리키는 "파일" 유형이 포함되어 있습니다.

Constant        Value   Description
-- file format --
EXT2_S_IFSOCK   0xC000  socket
EXT2_S_IFLNK    0xA000  symbolic link
EXT2_S_IFREG    0x8000  regular file
EXT2_S_IFBLK    0x6000  block device
EXT2_S_IFDIR    0x4000  directory
EXT2_S_IFCHR    0x2000  character device
EXT2_S_IFIFO    0x1000  fifo

2) 어떻게 보느냐에 따라 다릅니다. "실제" 파일이든 다른 구성(예: 이름 없는 파이프)이든 열려 있는 모든 파일에 대해 시스템 호출을 통해 inode를 얻을 수 있습니다. 그러나 파일 핸들이 닫히면 inode를 사용할 수 없습니다. (사실적 부정확성을 제거하기 위해 섹션 2가 편집됨)

관련 정보