Skip to main content

Mount

이 문서는 리눅스 파일시스템의 핵심 개념인 Mount의 개요를 살피고, 리눅스에서 파일시스템을 마운트하는 방법을 학습합니다.

Mount is the process of making a filesystem accessible at a certain point in the directory tree.
In Linux, everything is a file, and mount allows you to attach storage devices and filesystems to the directory structure.

마운트는 파일시스템을 디렉토리 트리의 특정 지점에서 접근 가능하게 만드는 프로세스입니다.
리눅스에서는 모든 것이 파일이며, 마운트를 통해 스토리지 디바이스와 파일시스템을 디렉토리 구조에 연결할 수 있습니다.

출처: Linux Filesystem Hierarchy

Mount = Connecting Storage to Directory Tree

리눅스에서 마운트는 물리적 디스크, 파티션, 네트워크 드라이브, 심지어 가상 파일시스템까지 디렉토리 구조에 통합하는 핵심 메커니즘입니다.
컨테이너 기술에서도 Mount Namespace를 통해 격리된 파일시스템 뷰를 제공합니다.


마운트의 개념

리눅스에서 모든 파일과 디렉토리는 단일 디렉토리 트리로 구성됩니다.
루트 디렉토리(/)에서 시작하여 모든 파일시스템이 하나의 계층 구조로 통합됩니다.

마운트 포인트 (Mount Point)

  • 마운트 포인트: 파일시스템이 연결되는 디렉토리
  • 마운트 포인트는 기존 디렉토리여야 하며, 마운트 후 해당 디렉토리의 기존 내용은 숨겨짐
  • 언마운트하면 원래 디렉토리 내용이 다시 보임

파일시스템 타입

리눅스는 다양한 파일시스템 타입을 지원합니다:

디스크 기반 파일시스템

mount-0

  • ext4: 리눅스의 표준 파일시스템. 저널링 지원, 안정성과 성능의 균형
    • 최대 파일 크기: 16TB
    • 최대 볼륨 크기: 1EB (Exabyte)
  • xfs: 고성능 저널링 파일시스템. 대용량 파일과 병렬 I/O에 최적화
    • RHEL/CentOS의 기본 파일시스템
  • btrfs: 최신 Copy-on-Write 파일시스템. 스냅샷, 압축, RAID 지원
    • 데이터 무결성 검증 기능
  • ntfs: Windows 파일시스템. 리눅스에서 읽기/쓰기 지원
  • vfat (FAT32): USB 드라이브 등에서 범용적으로 사용

가상/특수 파일시스템

추가로 가상 및 특수 파일시스템도 마운트됩니다.

  • proc: 프로세스 정보를 파일로 제공하는 가상 파일시스템
    • /proc/cpuinfo, /proc/meminfo
  • sysfs: 커널 객체와 디바이스 정보를 제공
    • /sys/class/net, /sys/block
  • tmpfs: RAM 기반 임시 파일시스템. 매우 빠름
    • /tmp, /run 등에 사용
  • devtmpfs: 디바이스 파일 자동 생성
    • /dev 디렉토리

컨테이너 관련 파일시스템

  • overlay2: Docker의 기본 스토리지 드라이버
    • 레이어 기반 파일시스템
    • 효율적인 이미지 관리
  • aufs: 또 다른 Union 파일시스템

Mount Commands

기본 마운트 명령어

  • mount : 파일시스템 마운트 또는 현재 마운트된 파일시스템 확인
  • umount : 파일시스템 언마운트
  • findmnt : 마운트된 파일시스템을 트리 형태로 표시
  • lsblk : 블록 디바이스 목록과 마운트 포인트 확인
  • df : 마운트된 파일시스템의 디스크 사용량 확인
  • blkid : 블록 디바이스의 UUID와 파일시스템 타입 확인

마운트 확인

# 현재 마운트된 모든 파일시스템 확인
mount

# 특정 타입의 파일시스템만 확인
mount -t ext4

# 트리 형태로 마운트 포인트 확인
findmnt

# 블록 디바이스와 마운트 포인트 확인
lsblk

# 디스크 사용량 확인
df -h

mnt1 mnt2

수동 마운트

수동으로 마운트를 생성하고 언마운트하는 방법은 다음과 같습니다.

# 기본 마운트 문법
sudo mount -t <filesystem_type> <device> <mount_point>

# USB 드라이브 마운트 예시
# /dev/sdb1은 USB 드라이브의 파티션
sudo mkdir -p /mnt/usb
# vfat은 FAT32 파일시스템
sudo mount -t vfat /dev/sdb1 /mnt/usb

# ext4 파티션 마운트
sudo mount -t ext4 /dev/sda2 /mnt/data

# 읽기 전용으로 마운트
sudo mount -o ro /dev/sdb1 /mnt/usb

# 언마운트
sudo umount /mnt/usb

영구 마운트 설정 (/etc/fstab)

시스템 부팅 시 자동으로 마운트하려면 /etc/fstab 파일을 수정하면 됩니다.

# /etc/fstab 파일 형식
# <device> <mount_point> <type> <options> <dump> <pass>

# UUID를 사용한 마운트 (권장)
UUID=1234-5678 /mnt/data ext4 defaults 0 2

# 디바이스 경로를 사용한 마운트
/dev/sdb1 /mnt/usb vfat defaults,noauto 0 0

# NFS 마운트
192.168.1.100:/shared /mnt/nfs nfs defaults 0 0

# tmpfs 마운트
tmpfs /tmp tmpfs defaults,size=2G 0 0

fstab 필드 설명:

  • device: 디바이스 경로 또는 UUID
  • mount_point: 마운트 포인트 디렉토리
  • type: 파일시스템 타입
  • options: 마운트 옵션 (defaults, ro, rw, noauto 등)
  • dump: 백업 여부 (0 또는 1)
  • pass: fsck 검사 순서 (0, 1, 2)
# UUID 확인
sudo blkid

# fstab 파일 테스트 (재부팅 없이)
sudo mount -a

# 특정 마운트 포인트만 마운트
sudo mount /mnt/data

Docker와 Mount

Docker는 컨테이너 내부에 데이터를 저장하기 위해 volume을 사용합니다.
volume컨테이너에 데이터를 제공하기 위한 여러 마운트 방식을 제공합니다.

도커 볼륨을 공부하면서, 리눅스 mount를 학습한 내용이 떠올랐습니다. 이전에 작성한 도커 볼륨 글을 복습 차원에서 읽어봤습니다. 이처럼 도커의 각 기능들이 리눅스 커널 기능과 밀접하여 함께 살펴보면 좋은 것 같습니다.

Volume Mount

# Docker 볼륨 생성
docker volume create my-volume

# 볼륨을 컨테이너에 마운트
docker run -d \
--name nginx-volume \
-v my-volume:/usr/share/nginx/html \
nginx

# 볼륨 목록 확인
docker volume ls

# 볼륨 상세 정보
docker volume inspect my-volume

# 호스트 디렉토리를 컨테이너에 마운트
docker run -d \
--name nginx-bind \
-v /home/user/html:/usr/share/nginx/html \
nginx

# 임시 파일시스템 마운트 tmpfs 옵션을 사용하여 컨테이너 내부에 임시 파일시스템을 마운트합니다.
docker run -d \
--name nginx-tmpfs \
--tmpfs /tmp:rw,size=100m \
nginx

Mount Namespace

Mount Namespace는 리눅스 네임스페이스의 한 종류로, 프로세스마다 독립적인 마운트 포인트 뷰를 제공합니다.

Mount Namespace = Isolated Filesystem View

특징

  • 각 네임스페이스는 독립적인 마운트 테이블을 가짐
  • 한 네임스페이스의 마운트/언마운트가 다른 네임스페이스에 영향을 주지 않음
  • 컨테이너의 격리된 파일시스템 구현의 핵심

Mount Namespace 생성

mnt-3

mount 명령어는 현재 네임스페이스의 마운트 테이블을 보여줍니다. unshare를 사용하여 새로운 mount 네임스페이스를 생성하고, mount 명령어를 사용하여 마운트 테이블을 확인할 수 있습니다.

# unshare로 새로운 mount namespace 생성
sudo unshare --mount /bin/bash

# 현재 네임스페이스에서만 마운트
mount -t tmpfs tmpfs /tmp

# 다른 터미널에서 확인하면 마운트가 보이지 않음
mount | grep tmpfs

# 네임스페이스 종료
exit

마운트 옵션

자주 사용되는 마운트 옵션들입니다.

옵션설명
defaultsrw, suid, dev, exec, auto, nouser, async
ro읽기 전용 (Read-Only)
rw읽기/쓰기 (Read-Write)
noexec실행 파일 실행 금지
nosuidSUID/SGID 비트 무시
nodev디바이스 파일 접근 금지
noauto부팅 시 자동 마운트 안 함
user일반 사용자도 마운트 가능
async비동기 I/O (성능 향상)
sync동기 I/O (데이터 안정성)
relatime접근 시간 업데이트 최소화
# 보안 강화 옵션으로 마운트
sudo mount -o noexec,nosuid,nodev /dev/sdb1 /mnt/usb

# 성능 최적화 옵션
sudo mount -o async,relatime /dev/sdb1 /mnt/data

Namespace, Cgroup, Mount의 관계

구분NamespaceCgroupMount
목적격리 (Isolation)자원 제한 (Limiting)파일시스템 연결
기능"무엇을 볼 수 있는가""얼마나 사용할 수 있는가""어디에 연결되는가"
예시독립적인 PID, 네트워크 뷰CPU 50%, 메모리 512MB/dev/sda1 → /mnt/data
컨테이너 역할프로세스 격리리소스 제한독립적인 파일시스템

Namespace = What You Can See
Cgroup = How Much You Can Use
Mount = Where Storage Connects

세 기술은 함께 작동하여 완전한 컨테이너 격리를 구현합니다:

  • Namespace: 컨테이너가 독립적인 파일시스템 뷰를 가짐
  • Mount: 컨테이너에 필요한 파일시스템을 연결
  • Cgroup: 컨테이너의 디스크 I/O를 제한

참고 자료