Linux 강좌 / 파일 시스템 마운트와 저장 공간 관리하기

마운트는 파일 시스템을 리눅스의 디렉터리 경로에 연결해 접근할 수 있게 하는 작업입니다. 연결 전에는 대상과 마운트 지점을 확인하고, 연결 후에는 findmnt로 실제 소스·경로·옵션을 검증하며, 저장 공간 부족은 용량과 아이노드를 나누어 확인합니다.

포맷할 대상을 판단하기 전에 디스크·파티션·파일 시스템 구분을 확인하세요. 아래 실습은 운영 디스크 대신 새 임시 이미지 파일만 사용합니다.

시스템 설정 실습의 기준은 Ubuntu 26.04 LTS와 Rocky Linux 9 계열의 일반 설치 VM입니다. 컨테이너·WSL·다른 릴리스에서는 서비스와 패키지 구성이 다를 수 있습니다. 가상 머신 실습 환경 만들기에서 콘솔 복구와 버전 확인을 먼저 준비하세요.

마운트 지점에 있던 파일은 어떻게 되는가

비어 있지 않은 디렉터리에 다른 파일 시스템을 마운트하면 원래 파일이 지워지는 대신 마운트가 유지되는 동안 가려집니다. 마운트를 해제하면 다시 보입니다. 빈 실습 디렉터리를 사용해야 무엇이 원래 파일이고 무엇이 연결된 저장 공간의 파일인지 혼동하지 않습니다. 경로의 실제 저장소를 확인할 때는 그 경로를 지정해 findmnt -T를 사용하세요.

findmnt -T "$HOME"
df -hT "$HOME"
df -i "$HOME"

위 명령은 홈 경로의 마운트 정보, 사람이 읽기 쉬운 용량, 아이노드 사용량을 각각 보여 줍니다. 아이노드는 파일 시스템이 파일 객체를 관리하는 데 사용하는 메타데이터 단위이며 많은 작은 파일이 있으면 바이트 여유가 있어도 부족해질 수 있습니다. 파일 시스템 종류에 따라 보고 방식과 제약이 다릅니다.

새 이미지로 마운트·기록·해제를 실습하기

관리 권한이 있는 실습용 가상 머신에서 실행합니다. ext4 도구가 필요하며, 컨테이너에서는 mount 권한이 없어 실패할 수 있습니다. 아래는 이전 강의의 경로에 의존하지 않는 독립 예제입니다. 이미지 파일만 초기화하며 실제 디스크를 지정하지 않습니다.

아래 전체 코드를 LF 줄바꿈으로 mount-lab.sh에 저장한 뒤 bash mount-lab.sh로 실행합니다. Bash와 util-linux·e2fsprogs 도구, sudo 권한이 필요합니다. Ubuntu에서는 sudo apt install util-linux e2fsprogs, Rocky에서는 sudo dnf install util-linux e2fsprogs로 도구를 준비할 수 있습니다. 루프 장치를 직접 할당하고 정확한 마운트 지점의 소스가 그 장치와 일치할 때만 파일을 씁니다. 어느 준비 단계든 실패하면 쓰기 단계로 진행하지 않습니다.

#!/usr/bin/env bash
set -u
set -o pipefail
for tool in mktemp truncate mkfs.ext4 losetup mount umount findmnt sudo tee; do
  command -v "$tool" >/dev/null || { printf 'Missing tool: %s\n' "$tool" >&2; exit 1; }
done
sudo -v || exit 1
lab=$(mktemp -d "$HOME/linux-mount-lab.XXXXXX") || exit 1
img=$lab/disk.img
mnt=$lab/mnt
loop=''
cleanup() {
  result=$?
  trap - EXIT
  if [[ -n "$loop" ]]; then
    source=$(findmnt -rn --mountpoint "$mnt" -o SOURCE)
    lookup=$?
    if (( lookup == 0 )) && [[ "$source" == "$loop" ]]; then
      sudo umount -- "$mnt" || result=1
    elif (( lookup != 1 )); then
      printf 'Inspect mount before cleanup: %s\n' "$mnt" >&2
      result=1
    fi
    if findmnt -rn --source "$loop" >/dev/null; then
      printf 'Still mounted; keeping loop device: %s\n' "$loop" >&2
      result=1
    else
      lookup=$?
      if (( lookup == 1 )); then
        sudo losetup --detach "$loop" || result=1
      else
        printf 'Cannot verify loop usage; keeping: %s\n' "$loop" >&2
        result=1
      fi
    fi
  fi
  printf 'Lab retained for inspection: %s\n' "$lab"
  exit "$result"
}
trap cleanup EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
truncate -s 128M "$img" || exit 1
mkfs.ext4 -F "$img" || exit 1
mkdir "$mnt" || exit 1
loop=$(sudo losetup --find --show "$img") || exit 1
[[ "$loop" == /dev/loop* ]] || { printf 'Unexpected loop device\n' >&2; exit 1; }
sudo mount -t ext4 -o nodev,nosuid "$loop" "$mnt" || exit 1
source=$(findmnt -rn --mountpoint "$mnt" -o SOURCE) || exit 1
[[ "$source" == "$loop" ]] || { printf 'Mount source mismatch; no write\n' >&2; exit 1; }
printf 'mounted storage\n' | sudo tee "$mnt/note.txt" >/dev/null || exit 1
cat "$mnt/note.txt" || exit 1
sudo umount -- "$mnt" || exit 1
if findmnt -rn --mountpoint "$mnt"; then
  printf 'Mount still present\n' >&2
  exit 1
else
  lookup=$?
  (( lookup == 1 )) || exit 1
fi
printf 'Unmount verified\n'

성공하면 mounted storage와 Unmount verified가 나옵니다. 종료 처리에서는 확인된 자신의 마운트만 해제하고, 그 루프 장치를 사용하는 마운트가 없을 때만 장치를 분리합니다. 해제 실패나 조회 오류가 있으면 장치를 유지하고 오류로 끝냅니다. 임시 폴더와 이미지 파일은 자동 삭제하지 않으며 마지막에 경로를 출력합니다. 재실행 시에는 새 폴더를 만듭니다.

이 예제는 다른 관리자와 마운트를 동시에 변경하지 않는 개인 실습 VM을 가정합니다. 소스 확인과 쓰기 사이의 경쟁 조건까지 없애는 운영용 저장 장치 관리 도구는 아닙니다. 실패 후에는 출력된 경로를 findmnt --mountpoint, 장치를 sudo losetup --list로 확인하고, 마운트가 남아 있으면 파일을 삭제하지 마세요.

busy 오류에서는 사용 중인 작업부터 찾기

마운트 안에 현재 디렉터리를 둔 셸, 열린 파일, 실행 중인 서비스가 있으면 해제가 실패할 수 있습니다. 먼저 터미널에서 마운트 밖으로 이동하고 해당 파일을 사용하는 프로그램을 정상 종료합니다. 설치되어 있다면 fuser -vm 마운트경로 또는 lsof로 사용자를 조사할 수 있습니다. 이유를 모른 채 프로세스를 강제 종료하거나 지연 해제를 사용하는 것을 기본 해결책으로 삼지 마세요.

자동 마운트는 UUID와 검증 절차를 함께 사용하기

/etc/fstab는 파일 시스템의 소스·마운트 경로·형식·옵션·dump·fsck 순서를 기록합니다. 장치 이름은 부팅마다 달라질 수 있으므로 지원되는 환경에서는 UUID처럼 안정적인 식별자를 사용합니다. 다음 줄은 ext4 보조 디스크의 형식 예시이며, 실제 UUID와 기존에 준비한 디렉터리로 바꿔야 합니다. 이 이미지 실습 파일을 그대로 fstab에 등록하지 마세요.

UUID=REPLACE_WITH_ACTUAL_UUID /srv/data ext4 defaults,nodev,nosuid 0 2

수정 전 파일을 백업하고 sudo findmnt --verify --verbose로 구문·접근 가능한 대상을 점검합니다. systemd 환경에서 fstab 변경 뒤에는 sudo systemctl daemon-reload로 생성 유닛을 갱신하고 필요한 마운트만 의도적으로 시험합니다. 검증 명령은 다음 부팅의 모든 상황을 보장하지 않으므로 콘솔 복구 경로를 유지하세요.

nofail은 보조 장치가 없을 때 부팅을 계속하도록 하는 선택지이지만, 서비스가 빈 마운트 디렉터리에 데이터를 써 버리는 문제를 해결하지 않습니다. 필수 저장 공간이라면 마운트 의존성과 애플리케이션의 시작 조건을 설계하세요. 읽기 전용, nodev·nosuid·noexec 옵션도 목적과 프로그램 요구에 맞춰 선택하며 만능 보안 설정으로 취급하지 않습니다.

df와 du가 다른 이유와 공간 정리 순서

df -hT
df -i
du -xhd1 "$HOME" 2>/dev/null | sort -h

df는 파일 시스템 전체 할당 상태를 보고 du는 탐색 가능한 파일의 공간을 합산합니다. 삭제됐지만 프로세스가 열고 있는 파일, 권한 때문에 읽지 못한 경로, 예약 공간·메타데이터가 차이를 만들 수 있습니다. du -x는 다른 파일 시스템으로 넘어가는 것을 제한하며, 큰 트리에서는 조회 자체가 I/O를 발생시킵니다. 권한 오류를 가렸다면 합계가 불완전할 수 있습니다.

큰 파일을 찾았다고 바로 삭제하지 말고 소유 서비스와 보존 정책을 확인합니다. 로그는 로그 회전 정책으로, 캐시는 해당 프로그램의 정리 방법으로 관리하세요. 실습 이미지 정리는 마운트 해제를 확인한 뒤에만 진행하며 fstab을 바꿨다면 먼저 원래 항목을 복구하고 검증합니다.

공식 문서