/var/log/messages
리눅스 파일시스템이란 본문
리눅스를 배워봤다면, 파일 시스템이란 말에 대해서는 한번은 들어봤을 것이다. 필자는 주로 디스크 추가를 배울 때, 디스크의 파일시스템을 정해줘야 한다면서 배웠던 기억이 난다. 그때는 그냥 그러려니 했었다. 그러나 선배분들이 파일 시스템을 점검 하는 것을 보고, 필자도 알아야 되겠다고 느꼈다. 그런데 막상 점검은 df 명령어로 하는 것이었다. 파일 시스템이라치고는, 매우 간단하게 끝내는 것이니 말이다. 그래서 직접 공부를 해보니 그럴 수 있던 이유를 알았다.
파일시스템은 일반적으로 xfs가 자주 쓰이고 그 밑으로 ext4와 btrfs가 있다. 특히 xfs는 대용량을 다루기에 적합한 파일 시스템이라 많이 쓰인다. 그래서 웬만한 리눅스 벤더 공식 사이트를 찾아봐도, 이러한 파일시스템의 특징을 설명해주는 글은 많지만, 뭔가 그것보다 파일시스템 자체를 설명해주는 문서는 생각보다 찾기 어려웠다. 그래서 필자가 공부했던 내용을 적어보려고 한다.
필자가 파일시스템을 비유해보자면, 지도라고 생각한다. 이유는 파일시스템의 뜻을 보면 공감을 할 수 있을 것이다.
파일시스템은 데이터를 I-node라는 파일로 관리한다. 그럼 I-node가 무엇일까?
I-node는 파일의 정보와 열다섯 개의 블록으로 구성이 되어 있다. 그 블록에는 주소가 저장되어 있다.
아래 그림처럼 말이다. 아래 그림에서 ‘i_’로 시작하는 내용을 보고 싶다면, 아래 링크에서 확인할 수 있다. 이 글에서는 이 내용을 적지 않기 때문이다.
( 출처: https://velog.io/@jinh2352/inode-%EA%B5%AC%EC%A1%B0 )
파일마다 이런 i-node가 있고, 파티션 내 특정 영역에 모여 있다. 파일당 하나의 I-node를 부여한다. I-node영역에 I-node들이 있고, 데이터 영역에 디렉터리와 파일들이 있다.
지도라고 비유한 이유는 지금부터 나타난다. I-node에는 데이터가 있는 주소를 포함한다. 그렇기에 이 파일의 주소를 찾아서 위치를 찾아서 기능을 사용할 수 있고 그런 것이다. 그런데 파일이 너무 크면 단순하게 끝나지 않는다.
다시 위 그림을 확인해보자. 12 direct block과 3 indirect block으로 나누어져 있다. 이렇게 표기된 이유는, 12 direct block( 0~11번째 블록 )은 파일의 크기와 관계 없이, 직접적으로 데이터의 주소를 가르킬 수 있다. 즉, 바로 mapping이 된다는 것이다. 그러나 파일의 용량이 일정 수준 이상이면 3 indirect block을 차례로 쓴다. 예를 들어 500MB 이상이면 12번 블록 사용, 1GB이상이면 13번 블록 사용 이런 식으로 말이다. 심지어 각 블록을 할당할 때 마다 방식이 달라지기도 한다. 과정을 정리해보면 아래와 같다.
블록 중소 중 열두 개에는 직접 블록 주소를 저장 ( 0~11)
처음 열두 개에는 파일 데이터가 저장된 블록 주소가 직접적으로 명시, 이러한 블록을 직접 블록(direct block).
1번 내용으로 불충분시, 열세 번째 주소에 단일 간접 블록 주소를 저장 ( 12 )
열세 번째 블록은 단일 간접 블록이라고 함
단일 간접 블록은, 파일 데이터를 저장한 블록 주소가 저장된 블록
즉, 12번째 블록에는 파일 데이터를 저장한 블록의 주소가 존재한다. 인덱스 블록이라고도 함
다음 방식도 이와 같은 패턴으로 이루어져 있다.
2번 내용으로도 불충분시, 열네 번째 주소에 이중 간접 블록 주소를 저장
12 블록에는 단일 간접 블록 주소 상태가 되어있고, 13번 블록에는 하나의 블록에 단일 간접 블록처럼 주소가 있다.
이때는 2곳의 주소가 존재한다.
3번 내용으로도 불충분시, 열다섯 번째 주소에 삼중 간접 블록 주소를 저장
아래 그림을 보면 2, 3번 설명들이 이해가 갈 것이다.
( 출처: https://rrhh234cm.tistory.com/185 )
여기서 알아둬야 할 점은, 디스크가 적절한 용량을 포함하고 있어도, i-node가 없으면 파일을 새로 만들 수 없다. 주소를 할당해주지 못하기 때문이다. 그러니 health check를 할 때, 이 항목도 측정을 해야 한다. df –i로 확인을 할 수 있다.
Byte단위가 아닌, 순수하게 몇 개 I-node가 있고, 남았는지 등등을 볼 수 있는 명령어인 df –i이다. 여기서, --human 옵션을 붙여서 사람이 보기 쉽게 확인해보자.
Mega, Kilo Byte 단위로 볼 수 있다.
i-node가 부족하면, 새로운 하드를 추가하거나, 파일이 삭제하는 거 이외에는 별다른 방도가 없다.
ext계열을 사용하는 사용자는 ext 할당 시 기본적으로 배정되는 inode를 변경할 수 있으나, xfs는 동적으로 할당한다.
그러나 btrfs는 inode의 개수를 추가할 수 있다.
( xfs와 btrfs가 inode를 할당하는 과정은 커널을 봐야 한다. )
파일시스템을 지도로 비유했듯이 결국은 지도를 펼치는 사람이 있어야만, 그 역할을 할 수 있는 것이다. 즉, 지도를 펼쳐주는 기능 또한 존재한다. 그 기능은 프로세스가 가지고 있다. 프로세스는 호출이 되면 아래의 기능들을 사용할 수 있다.
creat() | 파일의 작성 |
unlink() | 파일의 삭제 |
open() | 파일을 염 |
close() | 파일을 닫음 |
read() | 열린 파일로부터 데이터를 읽음 |
write() | 열린 파일에 데이터를 씀 |
lseek() | 열린 파일의 특정 위치로 이동 |
ioctl() | 파일시스템에 의존적인 특수한 처리 |
이러한 콜이 요청되면 아래와 같은 동작을 수행
커널 내의 모든 파일시스템 공통 처리가 동작하고 대상 파일의 파일시스템을 판별
각 파일시스템을 처리하는 프로세스를 호출하여 시스템 콜에 대응되는 처리를 함
데이터의 읽기를 하는 경우에는 디바이스 드라이버에 처리를 의뢰
디바이스 드라이버가 데이터를 읽어 들임
지금까지 파일시스템의 종류보다는, 파일시스템 자체에 대해서 설명을 한 글이었다. 아래 링크는 suse 공식 문서로, 파일 시스템 ‘종류’에 대해 보다 자세히 쓴 글이다.
https://documentation.suse.com/pt-br/sles/15-SP2/html/SLES-all/cha-filesystems.html
다음 글에는 ‘free’라는 명령어에 대해서 자세히 알아보려고 한다.
'SUSE' 카테고리의 다른 글
X.509란? (0) | 2023.03.13 |
---|---|
free 명령어 정리 (0) | 2023.02.27 |
/var, 로그 메시지가 생기는 과정 (0) | 2023.02.13 |
/usr 디렉터리 (0) | 2023.02.11 |
리눅스 디렉토리 구조 (2) | 2023.01.29 |