Journaling

June Lee·2021년 4월 18일
0

운영체제

목록 보기
25/25

저널링은 파일에 write하기 전과 후에 3가지 정보(intent)를 journal에서 보관해주는 것을 말한다.
이때 3가지 정보란,

  1. data block
  2. super block
  3. pointer block

를 뜻한다.

데이터 블락은 실제 파일 내용을 의미하고,
슈퍼 블락은 디스크의 어디가 차있고 비어있는지를 의미하며,
포인터 블락은 inode에서 데이터 블락을 가리킬 때 데이터 블락 갯수가 많아지면 중간에 포인터 블락을 거져서 데이터 블락을 가리키게 되는데, 이때 데이터 블락 주소를 가지고 있는 블락을 말한다.
즉 Journaling은 실제 데이터와 메타 데이터를 둘 다 기록하는 것을 의미한다.

inode가 데이터 블락 자체의 주소를 가지면 디스크 I/O도 줄일 수 있고 가장 좋지만, 그렇게 되면 데이터 블락 갯수가 엄청 많은 파일의 경우 inode 크기도 무한정으로 커져야하는데 그게 불가능하기 때문이다. 그래서 중간에 포인터 블락을 여러 단계 거치도록 구현해서 아이노드가 가리킬 수 있는 데이터 블락 갯수의 제한을 늘려준다.
그러나 이렇게 되면 한 단계를 거칠 때마다 디스크 I/O 횟수도 그만큼 늘어나기 때문에 주의가 필요하다.

이처럼 저널링은 intent를 먼저 쓴 후 실제 데이터 블락에 써주는 것인데,
이렇게 하면 디스크에 기록하는 상황에서 crash가 날 때 복구가 가능하다는 장점이 있다.

즉, 만약 intent를 못쓴 상황에서 crash가 난다면 아무것도 안해주면 되고,
intent를 쓴 후, 실제 data block에 쓰는 과정에서 crash가 난다면 journal에 기록된 log를 이용해서 복구해줄 수 있다.


Write Back

데이터가 아닌 메타데이터만 기록한다. 뭔가 문제가 생겼다는 정도만 확인할 수 있다.

ordered (default)

메타데이터만 기록하는건 똑같은데,
메타데이터를 먼저 기록하고, 이후 실제 데이터블락에 쓴다. 메타데이터를 기록하는 도중에 실제 데이터블락에 쓰는 작업을 같이 한다면, 기록하는 도중에 crash가 났을 때 둘 다에 문제가 생길 수 있기 때문이다.
ordered 방식을 사용하면, 적어도 데이터 블락이 잘못되는 일은 없기 때문에 medium safe하다.

profile
📝 dev wiki

0개의 댓글