티스토리 뷰
2024.05.23 - [분류 전체보기] - 리눅스 - 모든 것은 파일이다
리눅스 - 모든 것은 파일이다
리눅스를 배울 때 한번쯤은 듣는 말이 "리눅스의 모든 것은 파일"이라는 것이다.필자도 듣기로는 자주 들었지만, 실제로 어떤 의미인지는 잘 와닫지 않았다.그냥 "리눅스에서 파일이 자주 쓰인
lhs9602.tistory.com
이전 글에서 리눅스의 모든 것은 파일이다 라고 했다.
그렇다면 리눅스에는 종류에 파일이 존재한다는 것인데 이것을 어떻게 관리할까?
심지어 내가 알기로는 네트워크 통신에 사용되는 소켓도 파일인데, 이렇게 다양한 종류의 파일들을 하나의 시스템에서 관리할 수 있을까? 정답은 각 파일 종류별로 지원하는 파일 시스템은 다르다는 것이다.
그럼 리눅스에서 파일 실행 시 어떻게 딱 맞는 파일 시스템과 연결해주는 것일까?
정답은 VFS라는 커널의 요소를 통해서 관리하는 것이다.
가상 파일 시스템(Virtual File System, VFS)
리눅스 커널에서는 다양한 파일 시스템을 제공하고, 이를 통합하여 관리하기위해서 사용되는 것이 가상의 파일 시스템 VFS이다. 실제로 우리가 리눅스에서 파일을 사용하고자할 때, 사용되는 인터페이스(open,read,write,close 등)는 모두 동일하다.
이는 VFS가 유저와 파일 시스템 사이에서 가상의 계층을 형성하여, 파일 형식에 맞는 파일 시스템을 호출하기 때문이다.
때문에 모든 파일 시스템은 초기화시, 즉 부팅 단계에서 VFS에 등록하고 필요할 때마다 모듈을 로드되는 것이다.
VFS는 다양한 파일 시스템과 연동되고, 이를 위해서 4가지 주요 구조체로 구성되어 있다.
각 구조체는 파일 시스템을 관리하는 데, 필요한 정보들이 구성되어 있다.
슈퍼 블럭
struct super_block {
struct list_head s_list; /* Keep this first */
dev_t s_dev; /* search index; _not_ kdev_t */
unsigned char s_blocksize_bits;
unsigned long s_blocksize;
loff_t s_maxbytes; /* Max file size */
struct file_system_type *s_type;
const struct super_operations *s_op;
...
unsigned long s_magic;
struct dentry *s_root;
...
}
마운트된 파일시스템을 나타내는 자료구조로, 파일 시스템이 마운트 될때마다 super_block이 하나씩 할당된다.
일반적인 디스크 기반 파일시스템의 경우에는 디스크 상에 슈퍼블록과 대응되는 데이터가 저장되어있다.
가상 메모리 기반 파일시스템 (tmpfs, debugfs 등)은 디스크에서 불러오는 것이 아니라 실행 중에 동적으로 슈퍼블록을 생성한다.
슈퍼블럭에 저장된 필드는 다음과 같다.
inode
파일의 메타 데이터가 저장된 구조체로, 파일 당 1개의 inode가 존재한다.
VFS가 아이노드 객체를 생성하고 파일시스템에 특정 파일에 대한 정보를 요청하면 파일시스템은 자신이 관리하고 있는 파티션에서 파일의 메타데이터를 읽어서 아이노드 객체를 채운다.
그림에서 보면 direct blocks에서 4kb의 데이터가 12개 저장되어 있는 모습이 있는데, 이는 파일의 실제 내부 데이터가 디스크에 저장된 주소를 저장한다.
그러나 48kb의 이상의 데이터를 저장하기에는 모자른데, 이를 위래서 indrect가 존재한다.
single indrect는 4kb의 데이터를 1024개 저장하는 배열의 포인터가 저장된다.
또 double indrect는 single indrect 이 1024개가 모여 있고, triple도 double이 모여 있다.
이런 구조를 통해, 대용량의 데이터를 관리할 때, inode가 너무 커지지 않으면서 효율적으로 관리하게 해준다.
참고로 4kb단위로 실제 데이터를 나누는 이유는 메모리 페이징 단위가 4kb이기 때문이다.
현재로 보면 너무 작은 단위인데, 때문에 DPDK라는 패킷 고속 처리 툴에서 huge page하는 대용량 페이지를 사용해 2MB에서 1GB까지의 페이지를 가진다고 한다.
struct inode {
umode_t i_mode;
unsigned short i_opflags;
kuid_t i_uid;
kgid_t i_gid;
...
const struct inode_operations *i_op;
struct super_block *i_sb;
...
loff_t i_size;
struct timespec64 i_atime;
struct timespec64 i_mtime;
struct timespec64 i_ctime;
...
}
페이지가 길어져서 나머지는 다음 글에서 계속
'개발 > 리눅스' 카테고리의 다른 글
리눅스 - 파일 시스템 VFS 2 (0) | 2024.05.28 |
---|---|
리눅스 - 모든 것은 파일이다 (0) | 2024.05.23 |