OverlayFS는 리눅스 커널에 내장된 파일 시스템 중 하나로, 여러 파일 시스템을 겹쳐서 하나의 파일 시스템처럼 사용할 수 있게 해준다. 주로 컨테이너 기술(예: Docker)에서 사용되며, 파일 시스템 계층을 결합하여 읽기와 쓰기 작업을 효율적으로 처리할 수 있다. 이 글에서는 OverlayFS의 기본 개념과 작동 방식, 예제 코드를 통해 OverlayFS를 설정하고 사용하는 방법을 알아본다.
OverlayFS?
OverlayFS는 두 개의 디렉토리(혹은 파일 시스템)를 겹쳐서 하나의 파일 시스템으로 만드는 오버레이 파일 시스템 이다.
OverlayFS에서는 두 가지 주요 디렉토리가 있다.
- Lower Layer: 읽기 전용 파일 시스템
- Upper Layer: 읽기 및 쓰기 가능한 파일 시스템
OverlayFS는 이 두 디렉토리를 겹쳐서 하나의 파일 시스템으로 보여준다. 파일을 읽는 경우에는 Lower Layer
와 Upper Layer
에서 동시에 정보를 가져오지만, 파일을 수정하는 경우에는 Upper Layer
에서만 동작한다. 이러한 방식은 컨테이너와 같은 환경에서 효율적인 파일 시스템 관리를 가능하게 한다.
OverlayFS의 주요 개념
- Lower Layer: 읽기 전용이며, 원본 파일 시스템
- Upper Layer: 읽기와 쓰기가 가능하며, 사용자가 수정한 내용이 저장되는 계층
- Merged Layer: Lower Layer와 Upper Layer가 합쳐진 가상의 파일 시스템으로, OverlayFS에서 최종적으로 보여지는 파일 시스템
OverlayFS의 동작 방식
OverlayFS는 두 개의 계층(Lower Layer와 Upper Layer)을 결합하여 하나의 통합된 파일 시스템(Merged Layer)을 제공한다. 아래는 OverlayFS에서 읽기/쓰기 동작이 어떻게 이뤄지는지 간단히 기술한다.
- 읽기 작업: OverlayFS는
Upper Layer
에서 먼저 파일을 찾고, 존재하지 않는다면Lower Layer
에서 해당 파일을 찾는다. - 쓰기 작업: OverlayFS는 파일이 수정되면,
Upper Layer
에 해당 파일의 복사본을 만들어 저장한다. 이 과정은 Copy-on-Write(COW)라고 불리며,Lower Layer
는 그대로 유지된다.
OverlayFS의 구조
OverlayFS의 구조는 아래 그림과 같이 표현할 수 있습니다.
Lower Layer (Read-Only)
├── bin/
├── lib/
├── usr/
└── var/
Upper Layer (Read-Write)
├── bin/ # 빈 디렉토리
├── lib/ # 빈 디렉토리
├── usr/ # 빈 디렉토리
└── var/
└── log.txt # Upper Layer에만 존재하는 파일
Merged Layer (최종)
├── bin/
├── lib/
├── usr/
└── var/
└── log.txt # Upper Layer의 파일이 우선 적용됨
Lower Layer
위에 Upper Layer
가 스택킹(Stacking) 즉, 겹쳐지면서 실제로 Upper Layer
에 존재하는 log.txt
가 겹쳐진 Merged Layer
에서 사용자에게 노출되며, 수정할 수 있게 된다.
OverlayFS 설정하기
OverlayFS를 설정하려면, Lower Layer
와 Upper Layer
두 디렉토리를 준비하고 이 디렉토리를 OverlayFS를 통해 합쳐지도록 구성한다.
1. 디렉토리 준비
먼저, Lower Layer
, Upper Layer
, Merged Layer
에 해당하는 세 개의 디렉토리를 생성합니다.
sudo mkdir -p /overlayfs/lower
sudo mkdir -p /overlayfs/upper
sudo mkdir -p /overlayfs/work
sudo mkdir -p /overlayfs/merged
여기서 각 디렉토리의 역할은 다음과 같다.
/overlayfs/lower
: 읽기 전용 파일 시스템을 위한 Lower Layer/overlayfs/upper
: 쓰기 가능한 파일 시스템을 위한 Upper Layer/overlayfs/work
: OverlayFS가 필요로 하는 작업 디렉토리/overlayfs/merged
: 최종적으로 결합된 파일 시스템이 표시되는 Merged Layer
2. Lower Layer와 Upper Layer에 파일 추가
Lower Layer
와 Upper Layer
에 예시 파일을 추가하여 어떻게 파일 시스템이 병합되는지 확인해본다.
# Lower Layer에 파일 추가
echo "This is the lower layer file" | sudo tee /overlayfs/lower/example.txt
# Upper Layer에 파일 추가
echo "This is the upper layer file" | sudo tee /overlayfs/upper/override.txt
3. OverlayFS 마운트
mount
명령어를 사용하여 OverlayFS를 마운트한다. 이때, Lower Layer
와 Upper Layer
를 결합하여 /overlayfs/merged
디렉토리에 최종 파일 시스템을 마운트한다.
sudo mount -t overlay overlay -o lowerdir=/overlayfs/lower,upperdir=/overlayfs/upper,workdir=/overlayfs/work /overlayfs/merged
이제 /overlayfs/merged
디렉토리에서 결합된 파일 시스템을 확인할 수 있다.
4. OverlayFS 테스트
/overlayfs/merged
디렉토리로 이동하여 Lower Layer와 Upper Layer의 파일들이 어떻게 병합되는지 확인한다.
ls /overlayfs/merged
출력 결과:
example.txt override.txt
example.txt
는 Lower Layer에서, override.txt
는 Upper Layer에서 온 파일이다.
5. 파일 추가 및 수정 테스트
Upper Layer
에 파일을 추가하고, Lower Layer
의 파일을 수정해 본다.
Upper Layer
에 파일 추가
Upper Layer
에 새로운 파일을 추가해보면, 이 파일이 Merged Layer
에 나타난다.
echo "This is a new file in the upper layer" | sudo tee /overlayfs/merged/new_file.txt
ls /overlayfs/merged
를 실행하면 new_file.txt
가 Merged Layer
에 나타난다.
Lower Layer의 파일 수정
아래와 같이 Lower Layer
의 파일을 Merged Layer
에서 수정한다.
echo "Modified in merged layer" | sudo tee /overlayfs/merged/example.txt
Lower Layer
의 example.txt
파일을 수정했지만, 실제로는 Upper Layer
에 복사본이 생성되고 이 복사본이 수정된다. 이는 Lower Layer가 읽기 전용으로 유지되기 때문에 발생하는 현상이다. 이를 Copy-on-Write(COW)
라고 한다.
OverlayFS 마운트 해제
OverlayFS 마운트를 해제하려면 umount
명령어를 사용한다.
sudo umount /overlayfs/merged
OverlayFS는 여러 계층을 결합하여 파일 시스템을 효율적으로 관리하고, 읽기 및 쓰기 작업을 최적화할 수 있는 리눅스의 강력한 기능 중 하나이다. 주로 컨테이너 기술이나 라이브 시스템 환경에서 널리 사용되며, Copy-on-Write 방식으로 데이터가 변경되지 않은 원본 계층을 그대로 유지하면서도 개별적인 파일 시스템 작업을 수행할 수 있다.