리눅스 마운트(Mount)와 심볼릭 링크에 대한 이해

서론

근래 서버 설정을 하면서 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

리눅스의 대표적인 파일 시스템인 EXT(Extended File System)는 데이터 관리를 위해 inode라는 개념을 사용한다.

inode는 파일 시스템의 '인덱스 노드'로, 모든 파일과 디렉토리의 메타데이터를 담고 있는 핵심 요소이다. 여기에는 다음과 같은 정보가 포함된다.

  • 파일의 소유자 및 접근 권한
  • 파일 크기
  • 파일이 마지막으로 수정된 시간
  • 데이터 블록의 위치 (파일의 실제 데이터가 저장된 위치)
ext2 inode 구조도 | 출처 : 리눅스 커널 - 파일 시스템, Move Fast

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)

VFS를 통한 파일 시스템 구조도 | 출처 : Linux File System Architecture, CS8118.github.io

리눅스 파일 시스템이 다양한 파일 시스템을 지원하는 비결은 가상 파일 시스템(Virtual File System, VFS) 구조 덕분이다. 

VFS는 추상화된 파일 시스템 인터페이스로, EXT와 마찬가지로 inode, superblock으로 구성된다.

리눅스 시스템은 부팅 과정에서 마운트할 파일 시스템 목록들을 불러들은 뒤, 이를 VFS를 통해 실제로 커널에 등록한다. 보다 구체적으론 아래 순서대로 진행된다.

  1. 커널과 루트 파일 시스템(/) 마운트
  2. init 프로세스 실행과 파일 시스템(/etc/fstab) 마운트
  3. 필요한 파일 시스템 드라이버 모듈 로드
  4. 마운트 된 파일 시스템과 커널의 연결

읽어 들일 파일 시스템 목록은 아래 명령어를 통해 확인할 수 있다.

> 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) 심볼릭 링크 (Symlink)
기능 파일 시스템을 디렉토리 구조에 통합 파일/디렉토리에 대한 참조 포인터 생성
적용 대상 파일 시스템 전체, 장치, 네트워크 파일 시스템 개별 파일 또는 디렉토리
작동 방식 운영 체제가 장치를 인식하고 연결 가상 경로로 원본 파일을 가리킴
영향 마운트 해제 시 데이터 접근 불가 원본 삭제 시 깨진 링크 발생
성능 직접 접근으로 빠름 간접 접근으로 다소 느릴 수 있음


참고자료

리눅스 커널(Linux kernel)이란 - 개념, 구성요소, 인터페이스
Linux 커널은 리눅스 운영 체제(OS)의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 연결하는 핵심 인터페이스입니다. 관리 리소스 사이에서 효과적으로 통신합니다.
리눅스 커널 - 파일 시스템
본 글은 The Linux Kernel 을 정리한 것이며, 출처를 밝히지 않은 모든 이미지는 원글에 속한 것입니다. 리눅스 파일 시스템 리눅스는 각 파일 시스템이 계층적인 트리 구조로 통합해서 나타내므로, 파일 시스템이 하나인 것처럼 보여줌 윈도우즈는 드라이브 이름 등의 장치 식별자로 구분 새로운 파일 시스템을 마운트하면 하나의 파일 시스템에 추가된 형태로 보여짐 파일 시스템은 로컬 시스템이 아닌 네트워크 연결로 원격지에서 마운트된 디스크도 포함 가능 모든 파일 시스템은 어떤 타입이든지 하나의 디렉토리에 마운트되어, 마운트된 파일 시스템의 파일들이 그 디렉토리의 내용을 구성 이는 많은 파일 시스템을 지원할 수 있게 함 이러한 디렉토리를 마운트 디렉토리 또는 마운트 포인트라고 부름 파일 시스템의 마운트가…
linux inode란, inode가 부족한 경우
inode는 리눅스와 유닉스 계열 운영 체제에서 파일 시스템에서 사용되는 중요한 개념입니다. index node의 줄임말로, 파일 시스템에서 파일이나 디렉토리의 메타데이터를 저장하는 데 사용됩니다. 일반적으로 각 파일이나 디렉토리는 고유한 inode를 가집니다. 이 inode는 해당 파일이나 디렉토리의 메타데이터를 저장하는 데 사용됩니다. 이 메타데이터에는 파일의 소유자, 그룹, 권한, 크기, 생성 시간, 수정 시간, 마지막 접근 시간 등의 정보가 포함됩니다. 또한 파일 시스템 내에서 파일이나 디렉토리의 실제 데이터 블록에 대한 참조도 inode에 저장됩니다. inode는 파일 이름과는 별도로 관리되며 파일이나 디렉토리의 이름은 해당 inode에 대한 포인터로 연결됩니다. 이를 통해 파일 시스템은 ino…
[Linux - 리눅스 / Ubuntu - 우분투] 리눅스 파일 시스템 종류 - ext, ext2, ext3, ext4, dd
파일 시스템- 리눅스 운영체제의 주요한 기능 중 하나- 다양한 정보를 가진 파일과 디렉터리의 집합을 구조적으로 관리하는 체계 리눅스 고유의 디스크 기반 파일 시스템 - 리눅스는 초기에 미닉스의 파일 시스템(Minix File System. MFS)를 이용- 곧 ext 파일 시스템으로 알려진 리눅스 고유의 파일 시스템을 사용 ext(ext1) - 레미 카드가 개발.- ext 는 ‘Extended File System’의 약자- extfs라고도 하며, MSF의 기능을 확장했다는 의미- MSF의 경우 16비트 주소 체계를 사용. 파일 시스템의 최대 크기 64MB / ext 의 경우 2GB로 늘어남.- 파일 이름 같은 경우 MFS는 14바이트 / ext는 255바이트까지 지원- 하지만 ext 파일 시스템은 in…
[Linux] ext 파일 시스템과 inode - Linux File System Hierarchy
리눅스든 윈도우든 저장 장치 안의 데이터에 접근할 때 일반적으로 직접 저장 장치에 접근하지 않고 파일 시스템을 통해 접근한다. 이게 무슨 뜻일까? 파일 시스템이 없다고 가정하면, 메모리에 있는 데이터를 저장 장치에 저장할 때 데이터를 보관한 주소와 사이즈를 스스로 기억하지 않으면 안된다. 이렇게 되면 사용자에게 매우 성가신 일이 아닐 수 없다. 파일 시스템은 사용자에게 의미가 있는 하나의 데이터를 이름, 위치, 사이즈 등의 보조 정보를 추가하여 파일(file)이라는 단위로 관리한다. 그리고 어느 장소에 어떤 파일을 배치할지 등의 데이터 구조는 사양으로 미리 정해, 커널 안에서 이 파일 시스템을 다룬다. 이러한 프로세스 덕분에 사용자는 파일의 위치나 사이즈 등 복잡한 정보를 기억하지 않고 파일의 이름만으로…
지밍이 블로그
Compare what you do for yourself now to when you were younger.
CS111 Section 1 Solutions
[파일시스템] EXT2 파일시스템 (1/2)
내용 1. Ext2 1) 리눅스와 Ext2파일 시스템의 발전 - 리눅스가 처음 만들어 질 때 사용된 파일시스템인 Minix 파일시스템을 먼저 살펴 보면, 앤드류 타넨비움 교수가 교육용 유닉스 클론으로 만든 오픈 소스 운영체제인데 이때 사용된 파일시스템이 Minix 파일시스템이라 한다. - Minix의 경우 리누즈 토발즈(리눅스의 창시자)가 Minix에서 리눅스를 교차 개발 하고 있었으며, 새로운 파일시스템을 고안하는거 보다 기존의 Minix 파일시스템을 지원하는 것이 파일 공유에 효율적이고, 안정적이였기 때문에 리눅스에 Minix 파일시스템을 지원하게 된 것이다. - Minix 파일 시스템의 경우 제약사항이 있는데 16비트 정수로 블록 주소를 지정하여 최대 64MB까지 저장할 수 있었고(1024(기본 블…
이것저것 익혀보는... : 네이버 블로그