본문 바로가기

CS/운영체제

리눅스 파일 시스템과 디스크 구조 (파티션, Swap, Mount)

리눅스 파일시스템 

File System은 운영체제가 데이터를 저장하고 관리하는 방식이다.

운영체제는 디스크에 저장된 데이터를 파일, 디렉토리 형태로 관리하며 사용자는 파일 시스템을 통해 데이터를 읽고 쓴다. 

 

리눅스는 모든 파일과 디렉토리를 하나의 트리(Tree) 구조로 관리한다.

Linux 디렉토리 구조 (Tree)

 

최상위 디렉토리인 / 를 Root Directory라고 부른다. 

 

/home 

사용자 홈 디렉토리

/root 

root 사용자의 홈 디렉토리 

/etc 

시스템 설정 파일

/var 

변경이 자주 발생하는 데이터

/tmp

임시 파일 저장소

/proc

프로세스와 커널 정보를 제공하는 가상 파일 시스템

/usr

실행 파일, 라이브러리, 매뉴얼

/dev

장치(Device)를 파일처럼 표현

 


 

디스크와 파티션 

디스크 (Disk)

Linux에서는 디스크도 파일로 취급한다. 현재 사용중인 EBS(AWS EC2에서 사용할 블록스토리지 SSD/HDD)도 역시 하나의 디스크 장치로 인식되며 /dev 아래에 장치 파일 형태로 표현된다.

 

디스크 구조를 확인할 때는 lsblk 명령어를 사용한다. List Block Device 의 약자로, Linux에 연결된 블록 장치를 트리 형태로 보여준다.

lsblk

df -h 명령어가 파일 시스템 관점으로 얼마나 사용 중이냐를 보여준다면, lsblk는 디스크 관점의 구조를 보여준다. 

NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0  16G  0 disk
├─nvme0n1p1   259:1    0  16G  0 part /
├─nvme0n1p127 259:2    0   1M  0 part
└─nvme0n1p128 259:3    0  10M  0 part /boot/efi
  • -f (파일 시스템)
lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1
├─nvme0n1p1   xfs          /     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    nG    n% /
├─nvme0n1p127
└─nvme0n1p128 vfat   FAT16       xxxx-xxxx                               nM    n% /boot/efi

 

Linux가 부여한 NVMe 장치 이름

 

/dev/nvme0n1

nvme0은 첫 번째 NVMe 장치, n1은 해당 장치의 첫 번째 네임스페이스를 의미한다.

 

 


 

파티션(Partition)

파티션은 하나의 디스크를 논리적으로 나눈 영역이다. 

예를 들어 하나의 디스크를 운영체제 영역과 데이터 영역으로 분리하거나, Swap 영역을 별도로 관리하기 위해 사용할 수 있다.

 

/dev/nvme0n1p1

nvme0n1 → 첫 번째 디스크

p1 → 첫 번째 파티션

 

파티션을 나누는 가장 큰 이유는 장애를 격리하기 위해서이다.

예를 들어 운영체제와 로그 영역을 분리하지 않고 하나의 파티션만 사용한다면, 로그가 폭증하여 디스크가 가득 찼을 때 시스템 전체가 영향을 받을 수 있다. 반면 파티션을 분리해두면 특정 영역의 용량 부족이 전체 시스템 장애로 이어지는 것을 방지할 수 있다.

 

 

Swap

Swap은 메모리(RAM)가 부족할 때 디스크 일부를 임시 메모리처럼 사용하는 공간이다.

과거에는 별도의 Swap 파티션을 생성하는 방식이 일반적이었지만, 최근에는 Swap 파일을 사용하는 경우도 많다고 한다. 

다만 Swap은 디스크를 사용하기 때문에 RAM보다 훨씬 느리며, Swap 사용량이 많아지면 시스템 성능이 크게 저하될 수 있다.

 

 

포맷 

파티션을 생성했다고 해서 바로 파일을 저장할 수 있는 것은 아니다. 논리적으로 나누어진 파티션에 아직 파일 시스템이 없기 때문이다. 

 

대표적인 리눅스 파일시스템 

  • ext4
  • xfs
  • btrfs

새로운 디스크를 연결한 뒤 다음 명령을 실행하면 ext4 파일 시스템이 생성된다. 이 과정을 포맷(format)이라고 부른다. 

sudo mkfs.ext4 /dev/nvme1n1

 

 

Mount

마운트는 디스크를 특정 디렉토리에 연결하는 것이다.

 

예를 들어 디스크 공간이 부족하여 AWS에서 100GB EBS를 추가로 연결했다고 가정하자. 새로운 EBS가 연결되면 Linux에서는 다음과 같은 장치 파일이 생성된다. 

/dev/nvme1n1

 

하지만 이 상태에서는 단순히 디스크가 연결된 것일 뿐이며, 사용자가 바로 저장 공간을 사용할 수는 없다.

 

 

해당 디스크에 지정하여 파일시스템을 생성한다. 그 후 디스크를 사용할 디렉토리를 생성하고 마운트한다.

sudo mkfs.ext4 /dev/nvme1n1

sudo mkdir /data
sudo mount /dev/nvme1n1 /data

 

이제 사용자는 실제 어떤 물리 디스크를 사용하는지 이름 알 필요 없이 /data 경로를 통해 저장 공간을 사용할 수 있게 된다. 

이처럼 mount는 여러 디스크를 하나의 디렉토리 트리로 통합할 수 있고, 디스크 교체/확장 시 경로 유지에도 용이하게 해준다.

 

 

개인적으로 헷갈리는 부분 

'디스크를 논리적으로 나눈 것이 파티션, 파티션마다 파일시스템을 할당해준다'
그러면 디스크 자체의 파일시스템이 있을 수 있고, 파티션 마다 파일시스템이 또 있는 구조인가? 

 

1. 디스크 자체에 파일시스템이 있을 수 있다. 

mkfs.ext4 /dev/sdb

 

/dev/sdb
└── ext4

 

2. 파티션마다 파일시스템이 있다. 

mkfs.xfs /dev/sdb1
mkfs.ext4 /dev/sdb2

 

/dev/sdb
├── /dev/sdb1 → xfs
└── /dev/sdb2 → ext4

 

3. 이건 불가능 

/dev/sdb
├── ext4
├── /dev/sdb1 → xfs
└── /dev/sdb2 → ext4

 

파일 시스템마다 특성이 다르기에 파티션마다 다른 파일 시스템을 사용할 수 있다.

ext4은 Linux 표준, 안정적이고 범용적이어서 운영체제 영역에서 많이 사용하고, xfs는 대용량 파일 처리에 강하고 병렬 I/O 성능이 좋기 때문에 로그 서버, 데이터 서버에서 많이 사용한다고 한다.