파일 시스템 및 디스크 관리

LinuxBeginner
지금 연습하기

소개

Linux 스토리지는 서로 연결된 여러 계층으로 구성됩니다. 장치에는 파티션이 포함될 수 있고, 파티션이나 이미지에는 파일 시스템이 포함될 수 있습니다. 파일 시스템은 마운트 지점에서 디렉터리 트리에 연결해야 사용할 수 있습니다. 이러한 용어를 구분하면 디스크 명령을 훨씬 쉽게 이해할 수 있습니다.

이 실습에서는 스토리지를 안전하게 검사하고, 공간 사용량을 분석하며, 일반 파일 안에 ext4 파일 시스템을 만들고 마운트 및 마운트 해제합니다. 또한 파티션 정보를 읽고 연습용 fstab 파일을 작성합니다. 모든 쓰기 작업은 실습을 위해 만든 삭제 가능한 파일을 대상으로 하며, 실제 디스크의 파티션을 다시 나누거나 시스템의 /etc/fstab을 수정하지 않습니다.

Linux 스토리지 계층 이해하기

이 단계에서는 블록 장치, 파일 시스템, 마운트 지점의 관계를 확인한 다음 안전한 작업 공간을 준비합니다.

lsblk 명령은 "list block devices"를 의미합니다. -o 옵션은 표시할 열을 선택합니다.

lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS

출력을 왼쪽부터 오른쪽으로 읽습니다.

  • NAME은 장치 또는 파티션을 식별합니다.
  • TYPE은 디스크, 파티션, loop 장치를 구분합니다.
  • SIZE는 용량을 표시합니다.
  • FSTYPE은 파일 시스템이 감지된 경우 그 유형을 표시합니다.
  • MOUNTPOINTS는 파일 시스템이 디렉터리 트리에 연결된 위치를 표시합니다.

디스크에는 하나 이상의 파티션이 포함될 수 있습니다. ext4 와 같은 파일 시스템은 파티션이나 다른 스토리지 객체 안에 파일을 구성합니다. 마운트 지점은 Linux 가 해당 파일 시스템을 노출하는 일반 디렉터리입니다.

findmnt를 사용하여 현재 프로젝트 디렉터리가 포함된 파일 시스템을 확인합니다. -T 옵션은 임의의 경로를 받아 해당 경로가 속한 마운트된 파일 시스템을 찾습니다.

findmnt -T /home/labex/project

정확한 소스 장치는 환경에 따라 다를 수 있지만, 출력에는 소스, 대상, 파일 시스템 유형, 마운트 옵션이 표시됩니다.

blkid 명령은 파일 시스템 시그니처, 레이블, UUID 를 읽습니다. 사용 가능한 모든 블록 장치를 검사하려면 관리자 권한이 필요합니다.

sudo blkid

UUID 는 장치 이름이 바뀌어도 안정적으로 유지되도록 설계된 파일 시스템 식별자입니다. 이후 영구 마운트를 학습할 때 이 개념을 사용합니다.

전용 작업 공간을 만들고 해당 디렉터리로 이동합니다.

mkdir -p /home/labex/project/storage-lab
cd /home/labex/project/storage-lab
pwd

마지막 출력은 /home/labex/project/storage-lab이어야 합니다.

파일 시스템 및 디렉터리 사용량 분석하기

이 단계에서는 전체 파일 시스템의 공간을 보고하는 df와 파일 및 디렉터리 트리의 사용량을 측정하는 du를 비교합니다.

실제 크기를 알고 있는 샘플 파일 두 개를 만듭니다. truncate -s 옵션은 파일을 의미 있는 데이터로 채우지 않고도 효율적으로 파일 크기를 설정합니다.

cd /home/labex/project/storage-lab
mkdir -p usage/reports usage/archive
truncate -s 2M usage/reports/weekly.log
truncate -s 5M usage/archive/records.bin

작업 공간에서 df -h를 실행합니다. -h 옵션은 MiB, GiB 와 같은 사람이 읽기 쉬운 단위로 표시합니다.

df -h /home/labex/project/storage-lab

df는 "이 경로가 포함된 파일 시스템에서 사용 중인 공간과 사용 가능한 공간은 얼마인가?"라는 질문에 답합니다. 주요 열은 Size, Used, Avail, Use%, Mounted on입니다.

du -sh를 사용하여 샘플 디렉터리의 사용량을 요약합니다. 여기서 -s는 요약을 의미하고 -h는 읽기 쉬운 단위를 선택합니다.

du -sh usage

df와 달리 du는 "이 파일 또는 디렉터리 트리에 속한 공간은 얼마인가?"라는 질문에 답합니다. truncate로 만든 스파스 파일은 실제로 할당된 디스크 공간은 적게 사용하면서 큰 논리적 크기를 가질 수 있습니다. --apparent-size 옵션은 이러한 파일의 논리적 크기를 측정합니다.

du -h --apparent-size --max-depth=1 usage

usage/archiveusage/reports보다 큰 것을 확인할 수 있습니다. du와 정렬을 함께 사용하여 논리적 크기가 큰 항목부터 나열합니다.

du -ah --apparent-size usage | sort -rh | head -n 5

파이프는 du의 출력을 sort로 전달합니다. -r은 순서를 반대로 정렬하고 -h는 읽기 쉬운 크기 접미사를 이해합니다. head -n 5는 처음 다섯 개 결과만 유지합니다.

Ext4 파일 시스템 만들고 검사하기

이 단계에서는 가상 디스크 이미지를 만들고 ext4 로 포맷한 다음 실제 디스크에 영향을 주지 않고 파일 시스템 메타데이터를 검사합니다.

128MiB 크기의 이미지 파일을 만듭니다. 이 파일은 실습의 나머지 단계에서 삭제 가능한 스토리지로 사용합니다.

cd /home/labex/project/storage-lab
truncate -s 128M virtual.img

파일의 논리적 크기를 확인합니다.

ls -lh virtual.img

포맷하기 전에는 file 명령이 이 파일을 일반 데이터 또는 빈 파일로만 인식합니다.

file virtual.img

mkfs.ext4 명령은 ext4 파일 시스템을 만듭니다. -F 옵션은 일반 파일을 의도적으로 대상으로 지정했음을 확인하고, -LLABEXDATA 레이블을 지정합니다.

sudo mkfs.ext4 -F -L LABEXDATA virtual.img

포맷하면 이미지 내부에 파일 시스템 구조가 생성됩니다. 다음 두 도구로 결과를 검사합니다.

file virtual.img
sudo blkid -p virtual.img

출력에는 ext4 가 식별되고 LABEXDATA 레이블과 생성된 UUID 가 표시되어야 합니다. UUID 만 표시합니다.

sudo blkid -s UUID -o value virtual.img

UUID 값은 포맷할 때 생성되므로 학습자마다 다릅니다.

파일 시스템 마운트, 사용, 마운트 해제하기

이 단계에서는 가상 파일 시스템을 Linux 디렉터리 트리에 연결하고, 파일 하나를 작성한 다음 안전하게 연결을 해제합니다.

마운트 지점은 파일 시스템이 표시되는 디렉터리입니다. 임시 관리용 마운트에 사용하는 표준 위치인 /mnt 아래에 마운트 지점을 만듭니다.

sudo mkdir -p /mnt/labex-virtual

이미지를 마운트합니다. -o loop 옵션은 Linux 가 일반 파일을 loop 장치와 연결하여 블록 스토리지처럼 처리하도록 합니다.

cd /home/labex/project/storage-lab
sudo mount -o loop virtual.img /mnt/labex-virtual

현재 활성화된 마운트를 검사합니다.

findmnt /mnt/labex-virtual

소스는 일반적으로 loop 장치로 표시되고, 대상은 /mnt/labex-virtual, 파일 시스템 유형은 ext4 로 표시됩니다. 이 특정 파일 시스템에 대해 df를 실행할 수도 있습니다.

df -h /mnt/labex-virtual

마운트된 파일 시스템 안에 파일을 작성합니다. 리디렉션은 셸이 수행하고 마운트된 루트 디렉터리의 소유자가 root이므로 sudo sh -c를 사용합니다.

sudo sh -c 'echo "stored inside the virtual filesystem" > /mnt/labex-virtual/welcome.txt'
cat /mnt/labex-virtual/welcome.txt

마운트 해제는 대기 중인 쓰기 작업을 반영하고 파일 시스템을 마운트 지점에서 분리합니다.

sudo umount /mnt/labex-virtual

더 이상 마운트되지 않았는지 확인합니다.

findmnt /mnt/labex-virtual

출력이 없어야 합니다. 활성 마운트가 해당 대상에서 발견되지 않으므로 findmnt는 0 이 아닌 상태 코드를 반환합니다. 마운트 지점 디렉터리는 계속 존재하지만, 이미지를 다시 마운트하기 전에는 이미지의 내용을 해당 디렉터리를 통해 볼 수 없습니다.

파티션 테이블 안전하게 검사하기

이 단계에서는 읽기 전용 목록 모드로 fdisk를 사용하고, 파티션 테이블과 파일 시스템 시그니처를 구분합니다.

시스템에서 인식하는 디스크와 파티션을 나열합니다.

sudo fdisk -l

-l 옵션은 목록을 의미합니다. 이 옵션은 디스크 크기, 섹터 크기, 파티션 테이블 유형, 파티션을 보고하지만 변경하지는 않습니다. 익숙하지 않은 운영 환경의 디스크에서 대화형 파티션 작업을 시작하지 마십시오.

이제 가상 이미지를 검사합니다.

cd /home/labex/project/storage-lab
sudo fdisk -l virtual.img

이미지에는 디스크 크기는 있지만 파티션 항목은 없습니다. 이 제어된 예제에서는 전체 이미지에 직접 ext4 를 만들었습니다. 물리 디스크에서 흔히 사용하는 구성은 다음과 같습니다.

disk device -> partition table -> partition -> filesystem -> mount point

비교를 위해 비어 있는 두 번째 이미지를 만듭니다.

truncate -s 64M partition-demo.img
sudo fdisk -l partition-demo.img

이 이미지에도 파티션 테이블이 없습니다. 기본 읽기 전용 모드의 wipefs를 사용하여 파일 시스템 시그니처를 비교합니다.

sudo wipefs virtual.img partition-demo.img

virtual.img에는 ext4 시그니처가 표시되고, 비어 있는 비교 이미지에는 파일 시스템 시그니처가 표시되지 않아야 합니다. 이 실습에서는 파괴적인 wipefs -a 옵션을 사용하지 마십시오.

연습용 Fstab 작성 및 검증하기

이 단계에서는 fstab 항목의 여섯 필드를 배우고 /etc/fstab을 수정하지 않은 채 별도의 연습용 파일을 안전하게 테스트합니다.

시스템은 어떤 파일 시스템을 일관되게 마운트할지 결정할 때 /etc/fstab을 읽습니다. 파일을 편집하지 않고 주석이 아닌 줄만 표시합니다.

grep -Ev '^\s*(#|$)' /etc/fstab

fstab 항목은 공백으로 구분된 여섯 개 필드로 구성됩니다.

source  mount-point  filesystem-type  options  dump  fsck-order

물리 파티션에서는 /dev/sdb1과 같은 이름보다 UUID=<value>를 사용하는 편이 일반적으로 더 안전합니다. 하드웨어 검색 순서가 바뀌면 장치 이름이 달라질 수 있기 때문입니다.

이미지의 UUID 를 가져와 연습용 파일에 주석 처리된 UUID 예제를 추가합니다.

cd /home/labex/project/storage-lab
uuid=$(sudo blkid -s UUID -o value virtual.img)
printf '## Real block device example: UUID=%s /mnt/data ext4 defaults,nofail 0 2\n' "$uuid" > practice-fstab

이 실습에서는 물리 파티션이 아니라 일반 파일을 사용하므로, 실제 연습용 항목에는 절대 이미지 경로와 loop 옵션을 사용합니다.

printf '%s\n' '/home/labex/project/storage-lab/virtual.img /mnt/labex-virtual ext4 loop,nofail 0 2' >> practice-fstab

연습용 파일을 표시하고 검증합니다. --tab-filefindmnt가 실제 /etc/fstab을 사용하지 않도록 합니다.

cat practice-fstab
findmnt --verify --tab-file practice-fstab

마지막 요약에는 0 parse errors0 errors가 표시되어야 합니다. 또한 소스가 일반 파일이라는 경고 하나가 표시됩니다. 이 경고는 예상된 결과입니다. 이 제어된 실습에서는 물리 블록 장치 대신 파일 기반 loop 파일 시스템을 의도적으로 사용하기 때문입니다.

연습용 파일을 사용하여 한 번 마운트합니다. -T 옵션은 mount가 지정된 대체 fstab 파일을 읽도록 합니다.

sudo mount -T practice-fstab /mnt/labex-virtual
findmnt /mnt/labex-virtual

앞에서 만든 welcome.txt가 여전히 존재해야 합니다. 이는 마운트를 통해 파일 시스템에 저장된 데이터를 볼 수 있음을 보여줍니다.

cat /mnt/labex-virtual/welcome.txt

실습을 안전하게 마운트 해제된 상태로 끝내기 위해 다시 마운트 해제합니다.

sudo umount /mnt/labex-virtual

시스템의 부팅 설정을 변경하지 않고 영구 마운트 구문을 검증했습니다. 실제 /etc/fstab에 오류가 있으면 시스템 시작에 문제가 생길 수 있으므로, 관리자는 일반적으로 재부팅하기 전에 변경 사항을 검증합니다.

요약

Linux 스토리지의 주요 계층인 장치, 파티션, 파일 시스템, 마운트 지점을 연결하여 살펴보았습니다. lsblk, blkid, findmnt를 사용해 이러한 계층을 검사하고, df로 확인한 파일 시스템 전체 사용량과 du로 확인한 파일 및 디렉터리 사용량을 비교했습니다.

삭제 가능한 이미지 안에 ext4 파일 시스템을 만들고 레이블을 지정했으며, loop 장치를 통해 마운트하고 마운트 해제 후에도 데이터를 유지했습니다. 또한 실제 디스크를 변경하지 않고 파티션 정보를 검사했습니다. 마지막으로 fstab 의 여섯 필드, 안정적인 UUID 가 중요한 이유, 실제 fstab 을 사용하기 전에 별도의 연습용 fstab 을 검증하는 방법을 배웠습니다.