본문 바로가기
Linux

Linux FileSystem (1)

by oncerun 2023. 6. 11.
반응형

 

리눅스 파일 시스템을 공부할 때 POSIX라는 배경을 알면 상당히 도움이 된다. 

 

오늘은 인터페이스 규격인 POSIX와 대부부의 각 파일시스템 구조 그리고 여기에서 사용될 수 있는 다양한 리눅스 명령어를 암기한다. 

 

 

POSIX

 

UNIX는 매우 다양한 형태로 발전되었습니다. 다양한 형태의 UNIX 계열 운영체제가 등장하고 발전해 가면서 운영체제 간의 호환성과 이식성은 매우 어려워졌습니다. 

 

개발자나 서버 엔지니어나 통일된 무언가를 원합니다. 이 욕망은 UNIX 계열 운영체제 간의 이식성을 높이기 위해 80년대 후반에 Portable operation system interface  표준이 탄생했습니다. 

 

POSIX는 인터페이스를 정의하는 개념이기에 프로그래머는 약간의 자유를 얻었고 하드웨어, 운영체제 ,공급업체에 독립적이기에 응용프로그램의 이식성을 더 쉽게 얻을 수 있었습니다. 

 

91년 POSIX 표준을 만족하는 Linux가 등장했고 아직까지도 오픈소스 소프트웨어로 다양한 분야에서 널리 사용되죠. 

 

 

EXT 파일 시스템

 

MINIX에서 사용하던 파일 시스템에서 파일 이름과 파일 크기의 한계를 보안되며 설계되었습니다. 

최대 파일 이름 사이즈는 255Bytes를 지원하며 최대 파일 사이즈는 2GB입니다. 

 

다만 EXT 단점으로는 timestamp와 inode 수정을 지원하지 않고 링크드 리스트를 통해 free block 및 inode를 추적하여 성능상 저하가 발생했습니다. 

 

EXT2 파일 시스템

 

EXT2의 구조는 3, 4에서도 비슷한 구조를 갖습니다. 

 

디스크에서 파티션을 나누는 경우 파일 시스템은 파티션 당 하나씩 생성됩니다. 만약 하나의 파티션에 EXT2를 사용하게 되면 파티션은 Block Group으로 나누어집니다. 

 

이렇게 파티션을 다수의 블럭 그룹으로 나누어지면 같은 파일에 대한 inode, data block이 인접한 실린더에 위치하게 되어 seek time을 줄일 수 있습니다. 

 

EXT2는 부트 블록과 여러 개의 블록 그룹으로 구성됩니다. 

이후 블롭 그룹은 super bloack, block group descriptor, block bitmap, inode bitmap, inode table, data blocks으로 구분됩니다. 

 

EXT2와 비교하여 EXT3의 특징을 알아봅니다. 

 

HTree를 도입했습니다. 이는 directory 검색 성능을 높이기위해 hash 기반 알고리즘입니다. 

따라서 디렉토리 내부 파일이 많아져도 상수 시간의 접근 시간을 제공할 수 있습니다. 

 

다음은 중요한 저널링 기능을 지원합니다.

 

저널링이란 파일시스템의 손상을 빠르게 복수하는 기능입니다. 

 

실제 EXT2에서는 재부팅 시에 e2fsck를 통해 모든 항목을 검증하고 블록을 체크해야 합니다.

다만 대용량 파일시스템은 e2 fsck 완료하는데 까지 매우 오랜 시간이 소요됩니다.

 

EXT3에서는 전체 파일시스템을 검사할 필요가 없죠. EXT3는 데이터를 파일 시스템의 실제 영역에 기록하기 전에 해당 정보를 log영역에 기록합니다.

 

3가지 저널링 모드가 존재하고 이를 선택할 수 있습니다.

 

Journal : data commit 전에 모든 데이터를 저널에 기록하고 나중에 파일시스템에 복사하는 방식

Ordered : 메타데이터에 한해 저널을 사용 (쓰기 순서 보장)

Writeback : 낮은 안정성으로 메타데이터와 쓰기 순서 보장이 안됨.

 

EXT4는 EXT3에 비해 대용량 파일 시스템의 파일 크기를 지원하도록 변경되었습니다. 

 

  • pre-allocation을 통해 fragmentation 개선
  • Delayed allocation 
  • Extent로 메타
  • 데이터 양을 줄임.

 

XFS

 

64bit의 저널링 파일시스템으로 고성능입니다. 대부분의 리눅스 배포판에서 지원됩니다.

 

특징은 다음과 같습니다.

 

  • 대용량 파일시스템에 효율적
  • 최대 16 EiB 파일 시스템과 최대 8 EiB 파일을 지원할 수 있습니다. 
  • B+tree를 사용함.
  • 파일시스템이 마운트 되어 활성화되어 있는 동안 확장이 가능

 

 

아마 제가 알기엔 대부분 EXT4를 기본 파일시스템으로 쓰고 각 배포판마다 미세하게 다를 수 있는 것 같습니다.

실제 각 구현 방식은 깊게 알아보지 않을 것입니다.

 

 

 

이제 리눅스 파일 시스템의 구조를 살펴봅니다. 

 

사용자 권한으로 접근할 수 있는 디렉터리입니다.

 

bin, home, tmp, usr

 

시스템 파일 디렉터리입니다. 

 

dev, media, mnt, proc

 

관리자 권한으로 자주 살펴보게 되는 디렉토리 입니다.

 

etc, lib, root, sbin, var

 

 

관리자로서 가장 많이 접근하는 디렉터리는 아마 각종 설정 파일이 위차 한 etc와 시스템 운영 중에 생성되는 임시 데이터 저장소인 var 디렉터리일 것입니다.

 

* tip : /etc/*-release ( os, centos, redhat)을 cat 명령어로 출력하면 운영체제의 대한 정보를 알 수 있다. 

 

 

자주 사용되는 명령어를 알아보자.

 

1. 파일 시스템에서 검색하기 위한 유틸리티입니다. 

 

find [Options] [Path] [Expression]

 

 

find / -szie 100M -ls 2> /dev/null //  루트 디렉토리에서  100M 이상을 찾는다.

find / -name "*.txt" 2> /dev/null //  txt 확장자 파일을 찾는다.

 

여기에 exec 명령어를 추가하면 내부적으로 파이프라인을 통해 찾은 결과에 어떠한 행위를 할 수 있게 됩니다.

 

find / -name "*.txt" -exec grep "HELP" {} \; -print 2> /dev/null

exec는 찾은 결과를 전달받아 명령어를 사용할 수 있습니다. 그 끝은 세미콜론으로 구분하고 추가적인 옵션을 부여할 수 있습니다. 

 

다만 유닉스에서 세미콜론은 명령어 separator라고 해서 특별한 의미가 있습니다. 명령어를 연속적으로 실행할 때 사용되는 특별한 기호죠. 따라서 \(역슬래쉬)를 통해 표현해주어야 합니다. 

 

 

 

2. stat 명령어는 원하는 파일의 속성을 확인하는데 주로 시간을 확인하려고 사용합니다.

 

시간의 유형을 알아야 하는데, atime, mtime, ctime입니다.

 

Access: 파일에 최근 접근시간(과거에는 read 시에도 올라갔지만 현재는 다소 변경되어 배포판마다 기본값이 다를 수 있음),

Modify : 내용 변경 시간,

Change : 파일의 수정 시간 (inode 관점에서 변화 시간)

 

ls을 통해 나오는 시간은 mTime을 의미하고 이는 변경이 가능합니다.

 

 

3. awk 명령어는 쉘 스크립트를 사용할 때 매우 자주 사용됩니다. 

 

왜 이름을 저렇게 지었는지 살짝 궁금했는데, 개발자들인 Alfred Aho, Peter Weinberger, Brian Kernighan의 이니셜을 따서 지어졌답니다. 

 

awk는 패턴과 액션 쌍으로 작동됩니다. 입력을 한 줄씩 읽어 지정된 패턴과 일치하면 해당하는 액션을 수행하는 것이죠. 

 

ls -l | awk '{print $1}'

한 줄을 읽어 첫 번째 칼럼의 패턴만 일치하여 첫 번째 칼럼만 가져옵니다. 

 

또한 모든 바이트를 합칠 수도 있습니다.

 

ls -l | awk '{sum += $5} END {print sum}'

 

awk는 기본적으로 tab, space만 보기에 특정 구분자를 선택해 주려면 -F":"로 변경해 줄 수 있습니다.

 

 cat /etc/passwd | awk -F":" '{print $1}'

 

4. sort

 

sort는 uniq와 같이 사용하면 매우 좋습니다. 

 

ls -l | sort ( 첫 번째 컬럼을 기준으로 정렬한다)

ls -l | sort -k2n (두 번째 컬럼을 기준으로 정렬한다)

 

-k 옵션을 여러 개를 주어 여러 조건으로 정렬할 수 있습니다.

 

 

반응형

'Linux' 카테고리의 다른 글

Disk 추가해보자.  (0) 2023.06.13
hostnamectl  (0) 2023.06.13
명령어 [복습]  (0) 2022.03.10
환경 구축 (2)  (0) 2022.03.09
[Linux] 프로세스 관리  (0) 2021.08.02

댓글