본문 바로가기
프로그래밍 놀이터/Script(Python)

[책 정리] 08-1. 파일 시스템 관리하기 - 리눅스 커맨드라인 쉘 스크립트 바이블

by 돼지왕 왕돼지 2020. 4. 27.
반응형

리눅스 파일시스템 살펴보기


* 기본적인 리눅스 파일시스템 이해하기


** 파일 시스템 살펴보기


-

리눅스 운영체제와 함께 도입된 원래의 파일시스템은 확장 파일시스템(extended filesystem, ext)라고 한다.

이 시스템은 물리적 장치를 다루기 위해 가상 디렉토리를 사용하고, 물리적 장치에 고정 길이의 블록을 이용해서 데이터를 저장하는 유닉스와 비슷한 파일시스템이다.

ext 파일시스템은 가상 디렉토리에 저장되어 있는 파일에 대한 정보를 추적하기 위해 아이노드(inode)라는 시스템을 사용한다.

아이노드 시스템은 각각의 물리적 장치마다 파일 정보를 저장하기 위해 아이노드 테이블이라는 것을 만든다

가상 디렉토리에 저장되는 각 파일은 아이노드 테이블에 항목을 가진다.


ext 의 extended 는 다음의 항목을 가지고 있기 때문이다.

    파일 이름

    파일 크기

    파일의 소유자

    파일이 속한 그룹

    파일 접근 권한

    파일에서 데이터가 들어있는 각 디스크 블록에 대한 포인터


리눅스는 데이터 파일이 만들어질 때 파일시스템이 할당하는 고유한 번호(아이노드 번호)를 써서 아이노드 테이블의 각 아이노드를 참조한다.

파일시스템은 파일을 식별하기 위해 전체 파일 이름과 경로를 사용하는 대신 아이노드 번호를 사용한다.



** ext2 파일 시스템 살펴보기


-

원래의 ext 파일시스템은 파일 크기가 2GB 이하로 제한되는 것을 비롯하여 상당히 많은 한계가 있었다.

ext2 는 업그레이드판이다.

ext2 는 각 파일에 대한 추가 정보를 추적할 수 있도록 아이노드 테이블 형식을 확장했다.


ext2 는 만들고, 수정하고, 마지막으로 사용한 시간값을 추가했다.

최대 파일 크기를 2TB 까지 중가시켰다.

(ext2 의 이후 버전에서는 32TB)

저장시 파편화를 줄이는 개선도 있었다.



-

ext2 방식은 수년동안 리눅스 배포판의 기본 파일시스템이었지만, 아이노드 테이블과 파일시스템의 싱크에 문제가 있었다.

예를 들어 파일 업데이트는 되었지만 아이노드 테이블 업데이트 사이에 파워가 나간다거나 하면 연결고리가 끊어져 해당 파일을 참조하지 못하거나 잘못된 정보를 가지고 있다거나 할 수 있었다.



* 저널링 파일시스템 이해하기


-

저널링 파일시스템은 저장장치에 데이터를 직접 작성하고 아이노드 테이블을 업데이트 하는 대신, 저널링 파일시스템은 먼저 임시 파일(저널)에 파일의 변경된 내용을 기록하고, 데이터가 성공적으로 저장장치 및 아이노드 테이블에 기록되고 나면 저널 항목을 지운다.

따라서 ext2 에 있던 싱크가 맞지 않는 사태가 생기면 저널링 파일시스템은 저널 파일을 읽고 싱크되지 않은 데이터를 처리한다.



-

리눅스는 세가지 방식의 저널링이 있으며 각각 다른 수준으로 데이터를 보호한다.


데이터 모드 : 아이노드 및 파일 데이터 모두 저널링되며, 데이터 손실의 위험이 낮지만 성능은 떨어진다.

순차 모드(ordered) : 아이노드 데이터는 저널에 먼저 기록되고, 그 다음 파일 데이터가 성공적으로 기록될 때까지는 기다린다. 성능과 안전 사이의 좋은 타협점.

쓰기 저장 모드(writeback) : 아이노드 데이터만 저널에 기록되는데, 기록되기 전에 파일 데이터가 먼저 기록되었을 수도 있다. 데이터 손실 위험이 있지만 그래도 사용하지 않는 것보다는 나음.



** ext3 파일시스템 살펴보기


-

2001년 리눅스 커널에 추가되었고 최근까지 거의 모든 리눅스 배포판에서 사용되는 기본 파일시스템이었다.

inode table 구조를 사용하며, 각 저장장치마다 저널 파일을 추가한다.

ext3 파일시스템은 순차 모드(ordered) 저널링을 기본값으로 사용한다.

즉 저널 파일은 아이노드 정보만 기록하지만 데이터 블록이 성공적으로 저장장치에 기록되었을 때만 이 저널 항목을 지우지 않는다.

파일시스템을 만들 때 저널링 방법을 바꿀 수도 있다.



-

ext3 파일시스템도 부족한 점이 있었다.

예를 들어 파일을 실수로 삭제했을 때 어떠한 복구 기능도 체공하지 않으며, 내장된 데이터 압축 기능도 없고, 파일 암호화를 지원하지 않았다.



** ext4 파일시스템 살펴보기


-

2008 년 리눅스 파일시스템에 추가되었고, 우분투 등에서 기본 파일 시스템으로 사용되고 있다.

압축 및 암호화를 지원하고, extent 라는 기능을 지원한다.

extent 는 저장장치에 공간을 블록 단위로 할당하고 아이노드 테이블에는 시작 블록의 위치만 저장한다.

파일의 데이터를 저장하는데 사용된 모든 데이터 블록을 기록할 필요가 없으므로 아이노드 테이블의 공간을 절약할 수 있다.



** 라이저 파일시스템 살펴보기


-

ReiserFS(라이저FS) 는 쓰기 저장 모드(writeback)만 지원하는 저널링 파일 시스템이다.

자세한 내용은 생략한다.



** JFS 파일 시스템 살펴보기


-

JFS(Journaled File System)은 가장 오래된 저널링 파일시스템의 하나이다.

순차(Ordered) 저널링 방식을 사용한다.

자세한 내용은 생략한다.



** XFS 파일시스템 살펴보기


-

XFS 는 원래 상용 유닉스 시스템에서 만들어지고 리눅스 세상에 발을 들여 놓은 또다른 파일 시스템이다.

최근 인기를 끌고 있으며 RHEL 을 비롯한 주류 리눅스 배포판에서 기본 파일시스템으로 사용되고 있다.

쓰기 저장(writeback) 저널링 모드를 사용하므로 고성능을 제공하지만 실제 데이터가 저널 파일에 저장되지 않기 때문에 상당한 위험을 안고 있다.



* 카피 온 라이트 파일시스템 이해하기


-

저널링 파일시스템은 안전과 성능 사이의 선택이 중요하다.

데이터 모드는 가장 높은 안정성을 제공하지만 아이노드와 데이터 모두가 저널링되기 때문에 성능이 떨어진다.

쓰기 저장모드는 성능이 좋지만 안전성을 희생해야 한다.



-

파일시스템에서 저널링에 대한 대안은 카피 온 라이트(copy-on-write, COW)라는 기술이다.

COW 는 스냅샷을 통해 안전성과 성능을 함께 제공한다.

데이터를 수정할 때에는 복제본 또는 기록 가능한 스냅샷이 사용된다.

현재의 데이터에 수정 데이터를 덮어쓰는 대신 수정된 데이터는 새로운 파일시스템 위치에 배치된다.

데이터 수정이 완료되어도 기존 데이터를 절대 덮어쓰지 않는다.



** ZFS 파일시스템 살펴보기


-

ZFS 는 안정적인 파일시스템이며, 라이저4, BTRFS, 및 ext4 의 좋은 경쟁자다.

ZFS 에 대한 가장 널리 알려진 비판은 GPL 라이선스가 없다는 것이다.

OpenZFS 프로젝트가 2013년에 시작되긴 했지만.. GPL 라이선스를 얻을 때까지 ZFS 는 기본 리눅스 파일시스템으로는 채택되지 않을 것이다.



** Btrfs 파일시스템 살펴보기


-

B트리 파일시스템이라고도 하는 Btrfs 가 있다.

오픈수세(openSUSE) 리눅스 배포판은 최근 기본 파일시스템으로 Btrfs 를 채택했다.

기본 파일시스템은 아니지만 RHEL 같은 다른 리눅스 배포판에서도 제공한다.




파일 시스템으로 작업하기


-

커맨드라인에서 파일시스템 작업을 손쉽게 할 수 있는 몇 가지 유틸을 제공한다.

새로운 파일시스템을 추가하거나 기존의 파일시스템을 변경할 수 있다.



* 파티션 만들기


-

fdisk 유틸은 시스템에 설치되어 있는 저장장치에 파티션을 구성하기 위해 사용된다.

fdisk 명령은 하드 드라이브에 파티션을 만드는 각 단계에 명령을 입력할 수 있는 대화형 프로그램이다.

fdisk 를 시작하려면 저장장치의 장치 이름을 지정해야 하며 슈퍼유저 권한이 필요하다.



-

새로운 디스크 파티션을 만들 때 리눅스 시스템에서 물리적 디스크를 찾기가 가장 어렵다.

예전의 IDE 드라이브에서 리눅스는 /dev/hdx 라는 이름을 사용하며, 여기서 x 는 드라이브가 검출된 순서에 기반을 둔 문자다.(a, b 순서)

새로운 SATA 드라이브 및 SCSI 드라이브에 대해 리눅스는 /dev/sdx 라는 이름을 사용하며 여기서 x 역시 드라이브가 검출된 순서에 기반을 둔다.

파티션을 포맷하기 전에는 항상 올바른 드라이브를 참조하고 있는지 확실히 하기 위해 다시 한번 확인하는 것이 좋다.



-

$ sudo fdisk /dev/sdb

저장장치에 파티션을 처음으로 하는 경우 fdisk 는 파티션 테이블이 장치에 없다는 경고가 나올 것이다.


fdisk 명령은 아래와 같이 있다.


a : 파티션이 부팅 가능하다는 것을 나타내는 플래그를 켜거나 끈다.

b : BSD 유닉스 시스템에서 사용되는 디스크 레이블을 편집한다.

c : DOS 호환성 플래그를 켜거나 끈다.

d : 파티션을 삭제한다.

l : 사용할 수 있는 파티션의 유형을 나열한다.

m : 명령 옵션을 표시한다.

n : 새 파티션을 추가한다.

o : DOS 파티션 테이블을 만든다.

p : 현재 파티션 테이블을 표시한다.

q : 변경된 내용을 저장하지 않고 끝마친다.

s : 선 유닉스 시스템을 위한 새로운 디스크 레이블을 만든다.

t : 파티션 시스템 ID 를 변경한다.

u : 사용하는 저장장치를 변경한다.

v : 파티션 테이블을 확인한다.

w : 디스크 파티션 테이블을 기록한다.

x : 고급기능



-

자세한 내용은 생략한다.



* 파일 시스템 만들기


-

파티션에 데이터를 저장하기 전에 리눅스가 이를 사용할 수 있도록 파일시스템으로 포맷해야 한다.

각각의 파일시스템 유형은 파티션 포맷을 위한 자체 커맨드라인 프로그램을 사용한다.


mkefs : ext

mke2fs : ext2

mkfs.ext3 : ext3

mkfs.ext4 : ext4

mkreiserfs : 라이너FS

jfs_mkfs : NFS

mkfs.xfs : XFS

mkfs.zfs : ZFS

mkfs.btrfs : Btrfs



-

각각의 파일시스템 유틸은 파티션에 파일시스템을 어떻게 만들 것인지 입맛대로 조절할 수 있는 수많은 커맨드라인 옵션이 있다.



-

파티션에 파일시스템을 만들고 나서 다음 단계는 새로운 파일시스템에 데이터를 저장할 수 있도록 가상 디렉토리의 마운트 지점에 마운트하는 것이다.

$ sudo mkdir /mnt/my_partition

$ sudo mount -t ext4 /dev/sdb1 /mnt/my_partition # -t 는 fs type 지정


이렇게 마운트하면 파일시스템에 일시적으로만 마운트된다.

재시동하면 이 파일시스템은 자동으로 다시 마운트되지 않는다.

부팅 때 새로운 파일시스템을 자동으로 마운트하게 만들려면 /etc/fstab 파일에 새 파일시스템을 추가한다.



* 파일시스템을 검사하고 복구하기


-

현대적인 파일시스템조차도 전원이 갑자기 끊어지거나 파일 엑세스가 진행되는 동안 말썽스러운 앱이 시스템을 먹통으로 만들면 문제가 생긴다.

커맨드라인 도구를 사용하면 파일시스템을 정상으로 복원시킬 수 있다.

각 파일시스템은 상호작용하는 자체 복구 명령이 있다.



-

fsck 명령은 대부분의 리눅스 파일시스템 유형을 검사하고 복구하는 데 사용된다.

$ fsck options filesystem

filesystem 은 장치 이름, 가상 디렉토리의 마운트 지점, 파일시스템에 할당된 특수한 리눅스 UUID 값을 사용하여 참조할 수 있다.



-

저널링 fs 사용자는 fsck 명령이 필요하나 COW fs 사용자도 이 명령이 필요한지에는 논란의 여지가 있다.

ZFS 파일시스템은 fsck 유틸에 대한 인터페이스조차 없다.



-

fsck 명령은 시스템에 정상으로 마운트된 저장장치의 파일시스템을 확인하기 위해 /etc/fstab 파일을 사용한다.

저장장치가 정상으로 마운트되지 않은 경우, 파일시스템 유형을 지정하기 위해 -t 옵션을 사용해야 한다.


다음과 같은 옵션이 있다.


-a : 파일시스템 오류가 발견되면 자동 복구한다.

-A : /etc/fstab 파일에 나열된 모든 파일시스템 검사한다.

-C : 진행 표시 기능을 지원하는 파일시스템에 대해서는 진행률을 표시한다. (ext2, ext3 에 해당)

-N : 검사는 실행하지 않으며 어떤 검사를 할지만 표시한다.

-r : 오류가 발견되면 수정하라는 메시지를 표시한다.

-R : -A 옵션을 사용했을 때 루트 파일시스템을 건너뛴다.

-s : 복수의 파일시스템을 검사할 때 한 번에 하나씩 검사한다.

-t : 파일 시스템 유형을 지정한다.

-T : 시작할 때 헤더 정보를 표시하지 않는다.

-V : 검사도중 자세한 내용을 출력한다.

-y : 오류가 감지되면 파일시스템을 자동으로 복구한다.



-

마운트가 해제된 파일시스템에 대해서만 fsck 명령을 실행할 수 있다.

대부분의 파일시스템은 검사를 위해 언마운트를 한 다음 검사가 끝나면 다시 마운트할 수 있다.

하지만 루트 파일시스템은 핵심 리눅스 명령 및 로그 파일을 포함하고 있기 때문에 실행 중인 시스템에서 마운트를 해제할 수 없다.


바로 이럴 때 리눅스 라이브 CD 가 있으면 편하다.

라이드 CD 로 시스템을 시동한 후 루트 파일시스템에 대해 fsck 명령을 실행하면 된다.



반응형

댓글