리눅스 파일시스템 -1
파일시스템
어디에 어느 정도의 데이터가 있는지, 어디가 빈 영역인지를 관리하는 방법이 파일시스템
파일시스템은 사용자에게 의미가 있는 하나의 데이터를 이름,위치,사이즈 등의 보조 정보를 추가하여 파일이라는 단위로 관리한다.
어느 장소에 어떤 파일을 배치할지 등의 데이터 구조는 사양으로 미리 정한다.
커널 안에서 파일시스템을 다루기 위한 처리가 이 사양을 바탕으로 데이터를 다루게 된다.
이런 방법 덕분에 사용자는 각 데이터(파일)의 이름을 기억해 놓으면 저장장치에서 데이터의 위치나 사이즈 등의 복잡한 정보를 기억할 필요가 없다.
단순한 파일시스템 사양
- 0기가바이트의 지점부터 파일의 리스트를 기록한다.
- 하나의 파일에 대해 이름,장소,사이즈라는 세가지의 정보를 기록한다.
사용자(프로세스)가 파일 읽기 시스템 콜을 호출하여 파일 이름과 파일상의 오프셋 및 사이즈를 지정하면 파일시스템을 다루는 처리가 해당하는 데이터를 찾아서 사용자에게 전달한다.
참고
파일시스템과 저장 장치 사이에 디바이스 드라이버가 존재한다.
리눅스의 파일 시스템
리눅스의 파일시스템에는 디렉터리라고 부르는 파일을 보관하는 특수한 방법이 존재한다.
디렉터리 안에는 파일 또는 다른 디렉터리가 존재할 수 있음.
각기 다른 디렉터리 안에 존재한다면 같은 이름의 여러 파일을 가질수 있다.
리눅스가 다루는 파일시스템 종류
- ext4
- XFS
- Btrfs
각각의 파일시스템마다 다룰 수 있는 파일의 사이즈, 파일시스템의 사이즈, 개개의 처리의 속도 등도 다르다.
하지만, 어떤 파일시스템이라도 다음 시스템 콜을 호출하면 통일된 인터페이스로 접근 가능
- 파일의 작성,삭제
- 파일을 열고 닫음
- 열린 파일로부터 데이터를 읽어드림
- 열린 파일에 데이터를 씀
- 열린 파일의 특정 위치로 이동
위에 언급한 것 이외에 파일시스템에 의존적인 특수한 처리
시스템콜이 호출되면 다음과 같은 순서로 파일의 데이터가 읽어진다.
- 커널 내의 모든 파일시스템 공통 처리가 동작하고 대상 파일의 파일시스템을 판별한다.
- 각 파일시스템을 처리하는 프로세스를 호출하여 시스템 콜에 대응되는 처리를 한다.
- 데이터의 읽기를 하는 경우에는 디바이스 드라이버에 처리를 의뢰한다.
- 디바이스 드라이버가 데이터를 읽어들인다.
(파일시스템 공통 처리를 통한 후 각 파일시스템에서 처리된 후 디바이스 드라이버를 통해 저장장치에 도달한다.)
데이터와 메타데이터
- 데이터: 사용자가 작성한 문서나 사진,동영상,프로그램 등의 내용
- 메타데이터: 파일의 이름이나 저장 장치 내에 위치 사이즈 등의 보조 정보
- 종류: 데이터를 보관하는 일반 파일인지 디렉터리인지 혹은 다른 종류인지를 판별하는 정보
- 시간정보: 작성한 시간, 최후에 접근한 시간, 최후에 내용이 변경된 시간
- 권한 정보: 어느 사용자가 파일에 접근이 가능한가
(df 로 보는 파일스토리지 사용량은 메타데이터도 포함)
용량 제한
파일시스템에는 용량을 용도별로 사용할 수 있게 제한하는 쿼터라는 기능이 있음.
- 사용자 쿼터: 파일의 소유자인 사용자별로 용량을 제한하는 것으로 예를 들어 특정 사용자 때문에 /home이 가득 차게 되는 사태를 방지한다.ext4와 XFS는 사용자 쿼터기능을 사용할 수 있다.
- 디렉터리 쿼터: 특정 디렉터리별로 용량을 제한하는 것으로 예를 들어 프로젝트 멤버가 공유하는 디렉터리에 용량 제한을 걸어둔다. ext4와 XFS는 디렉터리 쿼터 기능을 사용할 수 있다.
- 서브 볼륨 쿼터: 파일 시스템 내의 서브 볼륨이라는 단위별 용량을 제한하는 것으로 거의 디렉터리 쿼터와 사용법은 유사하다.Brts는 서브 볼륨 쿼터 기능을 사용할 수 있다.
파일시스템이 깨진경우
파일시스템의 데이터를 스토리지에 쓰고 있는 도중에 시스템의 전원이 강제적으로 끊어졌을 때와 같은 경우 발생
mv / bar / foo 인 경우
1. foo에서 bar로 링크 연결
2. root에서 bar로의 링크 삭제
3. 변경 완료
링크 연결 후 강제 전원 단절된 경우 링크가 전부 연결된 상태로 유지중인 문제 발생
파일시스템이 깨지는 것을 막기 위한 기술
- 저널링 - ext4, XFS
- Copy on Write - Copy on Write
저널링
파일 시스템 안에 저널 영역이라는 특수한 영역을 준비한다.
(저널 영역은 사용자가 인식할수 없는 메타데이터)
- 저널 영역에 필요한 조작을 작성(전반)
- 저널 영역에 필요한 조작을 쓰기 시작함(후반)
- 저널 영역의 내용을 바탕으로 데이터를 고쳐 씀(전반)
- 저널 영역의 내용을 원래의 데이터로 덮어씀(후반)
- 저널 영역을 지우고 완료
파일시스템 업그레이드 시 순서
- 업데이트에 필요한 아토믹한 처리의 목록을 일단 저널 영역에 작성한다. 이 목록을 저널로그라 함.
- 저널 영역의 내용을 바탕으로 실제로 파일시스템 내용을 업데이트
- 저널로그 업데이트 중에 강제로 전원을 끊으면, 저널영역의 데이터를 지워버릴뿐, 실제 데이터는 처리하기 전과 같아진다.
- 실제 데이터를 업데이트하는 중에 강제로 전원이 끊어지면 저널로그를 처음부터 다시 수행하면 파일시스템의 처리는 완료된다.
위 두가지 경우 어느쪽이든 파일시스템은 깨지지 않음. 처리 전 또는 처리 후 상태만 있을 뿐
- 저널 영역을 바탕으로 데이터를 고쳐쓰는 도중 강제 전원 단절
- 재부팅 후 파일시스템 깨짐
- 마운트 할 떄 로그를 보고 다시 데이터 업데이트(전반)
- 마운트 할 때 로그를 보고 다시 데이터 업데이트(후반)
- 저널 영역을 지우고 완료
Copy on Write
ext4나 XFS 등의 예전부터 있던 파일시스템은 일단 파일을 작성하면 그 파일의 배치 장소는 원칙적으로 바뀌지 않음
파일의 내용을 업데이트할때 마다 저장 장치상의 같은 장소에 새로운 데이터를 써넣음.
Btrfs 등의 Copy on Write형의 파일시스템은 일단 파일을 작성하더라도 업데이트할 떄 다른 장소에 데이터를 쓴다.
- 파일을 작성하면 저장 창치의 특정 장소에 파일을 쓴다.
- 업데이트 후 파일 A의 내용을 다른 장소에 쓴다.,
- 디렉터리에서 링크를 교체 연결한다.
아토믹으로 처리해야 할 여러 개의 처리를 실행할 경우에도 업데이트되는 데이터를 다른 장소에 전부 쓴 뒤에 링크를 고쳐 쓰는 방식으로 동작
파일시스템 깨짐 대책
정기적인 백업으로 깨진 경우 마지막에 백업한 시점의 상태로 복원하는 것이 대책
복구용 명령어 사용
공용 - fsck (추천하지 않음)
- ext4 - fsck.ext4
- XFS - xfs_repair
- Btrfs - btrfs check
파일시스템 전체를 조사하기 때문에 시간이 파일시스템 사용량에 비례하여 증가한다.
복구에 오랜 시간 들여도 실패하고 끝날수 있다.
사용자가 원하는 상태로 복원한다고 보장 할 수 없다.
출처 - 실습과 그림으로 배우는 리눅스 구조