JFS (파일 시스템)

**저널드 파일 시스템**(Journaled File System, **JFS**)는 IBM이 만든 64비트 저널링 파일 시스템이다. AIX, OS/2, eComStation, ArcaOS 및 리눅스 운영체제용 버전이 있다. 후자는 GNU 일반 공중 사용 허가서(GPL) 조건에 따라 자유 소프트웨어로 제공된다. HP-UX에는 JFS라는 다른 파일 시스템이 있는데, 이는 실제로 베리타스 소프트웨어의 VxFS의 OEM 버전이다.

AIX 운영 체제에는 JFS (JFS1) 및 JFS2라고 불리는 두 세대의 JFS가 존재한다.

IBM의 **JFS**는 원래 32비트 시스템용으로 설계되었다. **JFS2**는 64비트 시스템용으로 설계되었다.

OS/2 및 리눅스와 같은 다른 운영 체제에서는 두 번째 세대만 존재하며 단순히 JFS라고 불린다. 이것은 실제로 JFS1을 지칭하는 AIX의 JFS와 혼동해서는 안 된다.

## 역사
IBM은 1990년 2월 AIX 버전 3.1의 초기 릴리스와 함께 JFS를 도입했다. 현재 AIX에서 JFS1이라고 불리는 이 파일 시스템은 다음 10년 동안 AIX의 주요 파일 시스템이었으며 수천 또는 수백만 명의 고객 AIX 시스템에 설치되었다. 역사적으로 JFS1 파일 시스템은 AIX의 메모리 관리자와 매우 밀접하게 연결되어 있으며, 이는 단일 운영 체제만 지원하는 파일 시스템의 일반적인 설계이다. JFS는 저널링을 지원하는 최초의 파일 시스템 중 하나였다.

1995년에 파일 시스템을 더욱 확장 가능하게 만들고 두 개 이상의 프로세서를 가진 머신을 지원하기 위한 작업이 시작되었다. 또 다른 목표는 여러 운영 체제에서 실행할 수 있는 더 휴대용 파일 시스템을 만드는 것이었다. 몇 년간의 설계, 코딩 및 테스트 끝에 새로운 JFS는 1999년 4월 eBusiness용 OS/2 워프 서버에 처음 출시되었고, 이어서 2000년 10월 OS/2 워프 클라이언트에 출시되었다. 1999년 12월, 원래 OS/2 JFS 소스의 스냅샷이 오픈 소스 커뮤니티에 제공되었고 JFS를 리눅스로 포팅하는 작업이 시작되었다. 리눅스용 JFS의 첫 번째 안정적인 릴리스는 2001년 6월에 나타났다. 리눅스용 JFS 프로젝트는 JFS 코어 팀으로 알려진 소수의 기여자 그룹에 의해 유지된다. 이 소스 릴리스는 또한 오픈 소스 JFS를 OS/2로 다시 포팅하는 기반을 형성하는 데 기여했다.

이러한 노력과 병행하여, JFS 개발 팀의 일부는 1997년에 AIX 운영 체제 개발 그룹으로 돌아와 이 새로운 JFS 소스 기반을 AIX 운영 체제로 옮기기 시작했다. 2001년 5월, 두 번째 저널링 파일 시스템인 향상된 저널링 파일 시스템(JFS2)이 AIX 5L용으로 제공되었다.

2008년 초 IBM이 더 이상 JFS 유지 관리에 관심이 없으므로 프로덕션 환경에서 사용되어서는 안 된다는 추측이 있었다. 그러나 IBM 리눅스 기술 센터 및 JFS 코어 팀의 구성원인 데이브 클레이캠프(Dave Kleikamp)는 여전히 리눅스 커널의 변경 사항을 추적하고 잠재적인 소프트웨어 버그를 수정하려고 노력하고 있다고 설명했다. 그는 일부 배포판이 더 큰 리소스 약속을 기대하며 파일 시스템을 지원하지 않기로 선택한다고 덧붙였다.

2012년, 솔리드 스테이트 드라이브에 대한 TRIM 명령 지원이 JFS에 추가되었다.

## 기능
JFS는 다음 기능을 지원한다.

### 저널
JFS는 저널링 파일 시스템이다. ext3 파일 시스템처럼 저널링을 추가 기능으로 추가하는 대신 처음부터 구현되었다. 저널은 최대 128MB까지 가능하다. JFS는 메타데이터만 저널링하므로 메타데이터는 일관성을 유지하지만 사용자 파일은 충돌 또는 전원 손실 후에 손상될 수 있다. JFS의 저널링은 XFS와 유사하게 아이노드의 일부만 저널링한다.

### B+ 트리
JFS는 디렉터리에서 조회를 가속화하기 위해 B+ 트리를 사용한다. JFS는 디렉터리의 아이노드에 디렉터리 항목 8개를 저장할 수 있으며, 그 후 항목을 B+ 트리로 이동한다. JFS는 또한 B+ 트리에서 익스텐트를 색인화한다.

### 동적 아이노드 할당
JFS는 필요에 따라 디스크 아이노드를 위한 공간을 동적으로 할당한다. 각 아이노드는 512바이트이다. 16KB 익스텐트에는 32개의 아이노드가 할당된다.

### 익스텐트
JFS는 파일을 익스텐트로 할당한다. 익스텐트는 가변 길이의 집계 블록 시퀀스이다. 익스텐트는 여러 할당 그룹에 위치할 수 있다. 이를 해결하기 위해 익스텐트 위치를 찾을 때 더 나은 성능을 위해 익스텐트는 B+ 트리에서 색인화된다.

### 압축
압축은 AIX의 JFS1에서만 지원되며 LZ 알고리즘의 변형을 사용한다. 높은 CPU 사용량과 증가된 여유 공간 단편화로 인해 압축은 단일 사용자 워크스테이션 또는 오프라인 백업 영역 이외의 사용에는 권장되지 않는다.

### 동시 입출력 (CIO)
JFS는 일반적으로 파일에 읽기-공유, 쓰기-배타적 잠금을 적용하여 데이터 불일치를 방지하지만 파일 수준에서 쓰기 직렬화를 강제한다. CIO 옵션은 이 잠금을 비활성화한다. 관계형 데이터베이스와 같이 자체적으로 데이터 일관성을 유지하는 애플리케이션은 이 옵션을 사용하여 파일 시스템 오버헤드를 크게 줄일 수 있다.

### 할당 그룹
JFS는 할당 그룹을 사용한다. 할당 그룹은 전체 공간을 청크로 나눈다. 이를 통해 JFS는 리소스 할당 정책을 사용하여 뛰어난 I/O 성능을 달성할 수 있다. 첫 번째 정책은 디스크 블록과 관련 데이터의 디스크 아이노드를 동일한 AG에 클러스터링하여 디스크에 대한 좋은 지역성을 달성하는 것이다. 두 번째 정책은 여유 공간 단편화를 최소화하기 위해 파일 시스템 전체에 관련 없는 데이터를 분산하는 것이다. 파일이 열려 있을 때 JFS는 파일이 상주하는 AG를 잠그고 열린 파일만 증가하도록 허용한다. 이는 열린 파일만 AG에 쓸 수 있으므로 단편화를 줄인다.

### 슈퍼블록
슈퍼블록은 전체 파일 시스템에 대한 정보를 유지하며 다음 필드를 포함한다.
* 파일 시스템의 크기
* 파일 시스템의 데이터 블록 수
* 파일 시스템 상태를 나타내는 플래그
* 할당 그룹 크기
* 파일 시스템 블록 크기

## 리눅스에서
리눅스 운영 체제에서 JFS는 커널 모듈(커널 버전 2.4.18pre9-ac4 이후)과 JFSutils라는 이름으로 패키징된 보완 사용자 공간 유틸리티를 통해 지원된다. 대부분의 리눅스 배포판은 라이브 CD와 같이 공간 제약으로 인해 특별히 제거되지 않는 한 JFS를 지원한다.

리눅스에서 사용 가능한 파일 시스템의 벤치마크에 따르면 JFS는 빠르고 안정적이며 다양한 종류의 부하에서 일관되게 좋은 성능을 보인다.

리눅스에서 JFS의 실제 사용은 흔치 않지만, JFS는 대부분의 다른 리눅스 파일 시스템과 달리 대소문자 구분 없는 마운트 옵션을 제공하는 틈새 역할을 한다.

JFS에는 저널 쓰기 구현과 같은 잠재적인 문제도 있다. 이는 다른 트리거가 있을 때까지 연기될 수 있으며, 이론적으로 무한한 시간 동안 데이터 손실을 유발할 수 있다.

## 같이 보기

* 저널링 파일 시스템
* 파일 시스템 목록
* 파일 시스템 비교
* Fsck – 파일 시스템 검사 유틸리티

## 각주

## 외부 링크
* JFS for Linux 프로젝트 웹사이트
* JFS1 파일 시스템 레이아웃, IBM
* JFS2 파일 시스템 레이아웃, IBM
* JFSRec, 손상된 JFS 파일 시스템에서 파일 및 디렉터리를 읽기 전용으로 추출하는 콘솔 프로그램

분류:1990년 소프트웨어