서론
근래 서버 설정을 하면서 NAS를 서버에 마운트(Mount) 해야 하는 상황이 생겼다.
마운트를 하며 든 의문점은 '마운트'와 '심볼릭 링크' 사이의 차이점이었다.
둘 모두 특정 파일 혹은 디렉토리를 가리킨다는 점에서 유사하다고 느꼈기 때문이다.
이후 조사를 한 결과, 내가 마운트에 대해 제대로 이해하지 못한 것 같아 이 글을 빌어 정리하고자 한다.
본론
여김 없이 전지전능하신 ChatGPT님께 자문을 구해보았다.
리눅스에서 파일 시스템을 마운트(Mount) 한다는 것은 특정 디렉터리(마운트 포인트)를 통해 장치(디스크, USB, 네트워크 파일 시스템 등)에 접근할 수 있도록 설정하는 것을 의미해. 예를 들어, 외장하드를 컴퓨터에 연결한 후 /mnt/usb 디렉터리에 마운트 하면, 그 디렉터리를 통해 외장하드의 파일에 접근할 수 있게 되는 거야.
마운트는 파일 시스템이 운영체제에 인식되고 사용할 수 있게 해주는 과정이기 때문에 디스크 파티션, 외부 저장 장치 또는 네트워크로 공유된 파일 시스템 등에서 자주 사용해.
출처 | OpenAI. (2024). ChatGPT (4o Version) [Large language model]. https://chat.openai.com
기본적으로 리눅스의 파일시스템은 커널(Kernel)에 의해 관리된다.
커널은 하드웨어와 소프트웨어 사이를 중개해 주는 역할로, 일종의 추상화 계층이라고 보면 된다.
때문에 하드웨어의 복잡한 세부 구조를 몰라도 다양한 환경에서 동작하는 소프트웨어를 만들 수 있게 된다.
파일 시스템 마운트 과정도 커널이 담당하여, 하드웨어의 세부 구조를 몰라도 접근할 수 있도록 관리한다.
마운트 (Mount)
리눅스 파일 시스템의 근간이 되는 마운트(Mount)이다.
마운트란, 특정 파일 시스템을 현재 운영 중인 디렉토리 구조의 특정 위치에 연결하여 사용자가 접근할 수 있게 하는 작업을 의미한다.
여기서 포인트가 되는 부분은 '특정 파일 시스템'을 '특정 위치(Mount Point)'와 연결한다는 것이다.
'특정 파일 시스템'이라 함은 HDD, SSD, USB, NAS 등을 의미한다.
리눅스의 '/' 디렉토리 또한 루트 파일 시스템이 '/' 디렉토리로 마운트 된 결과이다.
현재 어떠한 파일 시스템이 마운트되었는지는 아래 명령어를 통해 확인할 수 있다.
❯ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1s1s1 813Gi 13Gi 666Gi 2% 411k 4.3G 0% /
devfs 202Ki 202Ki 0Bi 100% 700 0 100% /dev
/dev/disk1s3 813Gi 4.2Gi 666Gi 1% 3.0k 7.0G 0% /System/Volumes/Preboot
/dev/disk1s5 813Gi 3.0Gi 666Gi 1% 3 7.0G 0% /System/Volumes/VM
/dev/disk1s6 813Gi 76Mi 666Gi 1% 805 7.0G 0% /System/Volumes/Update
/dev/disk1s2 813Gi 124Gi 666Gi 16% 1.9M 7.0G 0% /System/Volumes/Data
EXT
리눅스의 대표적인 파일 시스템으로, 리눅스의 파일 시스템을 관리하기 위해 만들어졌다.
버전이 발전됨에 따라 EXT2, 3, 4 까지 존재한다.
EXT2 inode
inode는 리눅스 파일 시스템(EXT)의 핵심으로, 알파이자 오메가라고 할 수 있다.
모든 파일(파일, 디렉토리, 소프트 링크, 하드 링크 등)은 inode로 기술되며 해당 inode들은 inode 테이블로 관리된다.
inode는 다음과 같은 정보를 포함한다.
- 파일의 소유자 및 접근 권한
- 파일 크기
- 파일이 마지막으로 수정된 시간
- 데이터 블록의 위치 (파일의 실제 데이터가 저장된 위치)
EXT2 inode는 총 12개의 Direct Blocks와 3개의 Indirect Blocks로 구성된다.
Direct Block는 실제 파일이 저장된 데이터 블록의 주소를 가리키는 포인터 변수로,
각 데이터 블록을 4KB라고 할 때, 12개의 Direct Block으론 최대 48KB의 파일만 가질 수 있다.
때문에 Indirect Block을 사용하는데, 데이터 블록을 가리키는 중계 테이블을 끼는 것이다.
마찬가지로 4KB(4,096Byte)의 테이블은 1,024개의 포인터를 갖게 되므로 4,096KB의 파일을 가질 수 있게 된다.
Single Indirect Block - 1,024 X 4KB = 4MB
Double Indirect Block - 1,024 X 1,024 X 4KB = 4GB
Triple Indirect Block - 1,024 X 1,024 X 1,024 X 4KB = 4TB
이론상 하나의 inode는 48KB + 4MB + 4GB + 4TB로 최대 4TB의 파일을 지원할 수 있으나,
당시 32bit 운영체제의 한계로 인해 실질적으론 최대 4GB의 파일만을 지원하며, 이는 EXT3, 4에서 확장되었다.
EXT2 Superblock (슈퍼블록)
EXT2 파일 시스템에서의 슈퍼 블록은 해당 파일 시스템의 전반적인 메타 정보를 저장하기 위한 블록으로,
파일 시스템의 상태와 구조를 저장하며, 파일 시스템이 마운트 될 때 슈퍼블록에 담겨 있는 메타 정보가 커널에 의해 읽혀 관리된다.
슈퍼블록은 아래와 같은 정보를 포함한다.
- 파일 시스템 크기
- 파일 시스템 상태
- 블록 그룹 정보
- 매직 넘버 (파일 시스템 식별용)
- 유효한 inode 및 블록 수
- 마운트 횟수 및 마지막 검사 정보
- 파일 시스템 이름
VFS (Virtual File System)
리눅스 파일 시스템이 다양한 파일 시스템을 지원하는 비결은 가상 파일 시스템(Virtual File System, VFS) 구조 덕분이다.
VFS는 추상화된 파일 시스템 인터페이스로, EXT와 마찬가지로 inode, superblock으로 구성된다.
리눅스 시스템은 부팅 과정에서 마운트할 파일 시스템 목록들을 불러들은 뒤, 이를 VFS를 통해 실제로 커널에 등록한다.
보다 구체적으론 아래 순서대로 진행된다.
- 커널과 루트 파일 시스템(/) 마운트
- init 프로세스 실행과 파일 시스템(/etc/fstab) 마운트
- 필요한 파일 시스템 드라이버 모듈 로드
- 마운트 된 파일 시스템과 커널의 연결
읽어 들일 파일 시스템 목록은 아래 명령어를 통해 확인할 수 있다.
> cat /etc/fstab
# <file system> <mount point> <type> <options> <dump> <pass>
UUID=1234-5678 / xfs defaults 0 0
UUID=8765-4321 /boot xfs defaults 0 0
VFS를 통해 읽어 들일 수 있는 파일 시스템 형식 목록도 조회가 가능하다
> cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cgroup
nodev cpuset
nodev tmpfs
nodev devtmpfs
nodev debugfs
nodev securityfs
nodev sockfs
nodev dax
nodev bpf
nodev pipefs
nodev configfs
nodev devpts
nodev hugetlbfs
nodev autofs
nodev pstore
nodev mqueue
xfs
nodev xenfs
nodev binfmt_misc
nodev overlay
squashfs
nodev rpc_pipefs
nodev nfs
nodev nfs4
마운트(Mount) VS 심링크(Symlink)
사실 최초 관심사는 이 부분이었는데 굉장히 돌아온 것 같다.
앞서 언급하였듯이, 마운트는 파일 시스템 자체를 커널에 등록하여 루트 파일 시스템에 통합되어 사용할 수 있게 된다.
반면 심볼릭 링크는 해당 파일이나 디렉토리에 대한 참조 포인터를 생성하는 것으로, 단순한 '바로가기'라고 볼 수 있다.
주요 차이점으로는 아래와 같이 정리할 수 있다.
마운트(Mount) | 심볼릭 링크(Symlink) | |
기능 | 파일 시스템을 디렉토리 구조에 통합 | 파일/디렉토리에 대한 참조 포인터 생성 |
적용 대상 | 파일 시스템 전체, 장치, 네트워크 파일 시스템 | 개별 파일 또는 디렉토리 |
작동 방식 | 운영 체제가 장치를 인식하고 연결 | 가상 경로로 원본 파일을 가리킴 |
영향 | 마운트 해제 시 데이터 접근 불가 | 원본 삭제 시 깨진 링크 발생 |
성능 | 직접 접근으로 빠름 | 간접 접근으로 다소 느릴 수 있음 |
참고자료
리눅스 커널(Linux kernel)이란 - 개념, 구성요소, 인터페이스
Linux 커널은 리눅스 운영 체제(OS)의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 연결하는 핵심 인터페이스입니다. 관리 리소스 사이에서 효과적으로 통신합니다.
www.redhat.com
리눅스 커널 - 파일 시스템
본 글은 The Linux Kernel 을 정리한 것이며, 출처를 밝히지 않은 모든 이미지는 원글에 속한 것입니다. 리눅스 파일 시스템 리눅스는 각 파일 시스템이 계층적인 트리 구조로 통합해서 나타내므로,
movefast.tistory.com
linux inode란, inode가 부족한 경우
inode는 리눅스와 유닉스 계열 운영 체제에서 파일 시스템에서 사용되는 중요한 개념입니다. index node의 줄임말로, 파일 시스템에서 파일이나 디렉토리의 메타데이터를 저장하는 데 사용됩니다.
light-tree.tistory.com
[Linux - 리눅스 / Ubuntu - 우분투] 리눅스 파일 시스템 종류 - ext, ext2, ext3, ext4, dd
파일 시스템- 리눅스 운영체제의 주요한 기능 중 하나- 다양한 정보를 가진 파일과 디렉터리의 집합을 구조적으로 관리하는 체계 리눅스 고유의 디스크 기반 파일 시스템 - 리눅스는 초기에 미
sharkmino.tistory.com
[Linux] ext 파일 시스템과 inode - Linux File System Hierarchy
리눅스든 윈도우든 저장 장치 안의 데이터에 접근할 때 일반적으로 직접 저장 장치에 접근하지 않고 파일 시스템을 통해 접근한다. 이게 무슨 뜻일까? 파일 시스템이 없다고 가정하면, 메모리에
heeya-stupidbutstudying.tistory.com
지밍이 블로그
Compare what you do for yourself now to when you were younger.
jiming.tistory.com
CS111 Section 1 Solutions
<!-- --> Sections Wed Jan 18 to Sat Jan 21 Based on a section handout by Jerry Cain and compiled by Parthiv Krishna, with modifications by Nick Troccoli. Solutions 1) Unix v6 Filesystem Overview inode: a structure that stores information for a single file
web.stanford.edu
[파일시스템] EXT2 파일시스템 (1/2)
내용 1. Ext2 1) 리눅스와 Ext2파일 시스템의 발전 - 리눅스가 처음 만들어 질 때 사용된 파일시스템인 Minix 파일시스템을 먼저 살펴 보면, 앤드류 타넨비움 교수가 교육용 유닉스 클론으로 만든 오
kkikyul.tistory.com
파일시스템 5_1 Ext2 파일시스템 구조와 슈퍼블록, 그룹 디스크립터 테이블
제목 : Ext2 파일시스템 구조와 슈퍼블록, 그룹 디스크립터 테이블 사용 환경 : 기본설명 ...
blog.naver.com