2 분 소요

FSCK and Journaling

만약 write operation 도중 system 에 crash 혹은 power lose 이 발생했을 때, File system inconsistency 혹은 data 손실에 대한 문제점이 발생할 수 있습니다. 이러한 문제에 대한 해결책으로 File system checher , journaling 을 살펴보도록 하겠습니다

Crash Cases

Crash with only a single write succeeds

  • data block is written to disk
    • file 을 읽는 것에는 문제가 되지 않습니다.
  • just updated inode
    • File-system-inconsistency 발생
  • just updated bitmap
    • File-system-inconsistency 발생

Crash with only two write succeeds

  • inode and bitmap are written
    • 보기에는 File system 에 문제가 없어보이지만, Data block 이 쓰레기값을 갖습니다.
  • inode and data block are written
    • File-system-inconsistency 발생
  • bitmap and data block are written
    • File-system-inconsistency 발생

FSCK

file system 의 일부가 아닌, File-system-inconsistency 를 해결하기 위한 도구입니다. data 를 복원하는 등의 모든 문제를 해결할 순 없지만 file system 을 consistent 하게 해주는 정도를 도와주게 됩니다.

  • Superblock 이 reasonable 한지 check 합니다.
  • Free blocks
    • inodes, indirect blocks 등을 scan 합니다.
    • bitmap 과 비교하고, inconsistency 가 발견된다면 수정합니다.
  • inode state
    • inode 의 값들이 valid 한지 확인합니다.
    • 문제점이 발견된다면 해당 inode 와 bitmap 을 삭제합니다.
  • inode links
    • reference count 가 맞는지 확인합니다.
  • Duplicate
    • 같은 block 을 가리키는 inode pointer 가 발견된다면, bad inode 를 제거하거나 block 을 copy 합니다.
  • Bad block pointers
    • 만약 pointer 가 partition 을 벗어나는 datablock 을 가리킨다면 pointer 를 초기화 합니다.
  • Directory checks
    • Directory 들을 잘 포함하고 있는지 inode 와 file name 쌍이 잘 존재하는지 확인합니다.

Drawbacks of FSCK

  • Too slow
  • Works but is wasteful

Journaling

Disk의 내용을 update 하기 전에 일종의 노트(기록)을 남겨두는 작업입니다. 실제로 update 작업인 checkpointing 전에 journaling 을 우선적으로 수행합니다.

On disk structure

  • disk 를 block groups 로 나눕니다.
  • 각각의 block group 에는 inode bitmap, data bitmap, inodes, data blocks 들을 포함합니다
  • journal group 은 TxB(ID) bitmap inode datablock TxE(ID) 를 포함합니다.
  • TxB(ID) 와 TxE(ID) 는 jornal group 을 표시하기 위하여 사용되고 고유한 ID 를 갖습니다.

Writing the journal

CPU 자원을 낭비시키거나, journal 을 쓰는 중 crash 가 발생하여 jounal 자체에도 문제가 생길 수 있는 문제점이 있기 때문에, Two steps 을 따라가며 journal 을 write 합니다.

  • step 1
    • Data block 부분까지만 write 합니다.
  • step 2
    • step 1 이 끝나면 txE(ID) 를 write 합니다.

Recovery

  • 만약 journal 에 transaction 이 완전히 쓰이기 전에 crash 가 발생한다면
    • 해당 update 를 무시합니다.
  • 만약 journal 이 제대로 쓰이고 checkpointing 이전에 crash 가 발생한다면
    • 해당 journal 을 통하여 복구합니다.
    • 복구는 가능하지만, 이미 checkpointing 한 영역에 대하여도 recovery 가 발생하면서 성능이 저하되는 문제점이 있습니다.

Batching Log Updates

  • Problem
    • extra disk traffic 증가의 문제점이 있습니다.
    • ex) 같은 directory 에 대해 inode 가 같은 두개의 file 이 생성될 수 있습니다.
  • Solution
    • 해결책으로 Buffering updates 가 있습니다.
    • File system buffer는 동일한 block 에 대해 update 하려는 시도가 연속적으로 발생하면 buffering 하여 한번에 write 합니다.

Making the Log Finite

  • Problem
    • journal 영역이 커질수록 recovery 시간이 더 오래 걸리게 됩니다.
    • journal 들의 반영 여부를 알 수 잆기 때문입니다.
    • journal size 를 줄이게 되면 journal 유실이 발생할 수 있습니다.
  • Solution
    • circular 한 log 즉 journal 구조를 사용합니다.
    • Journal 안에 journal superblock 을 두어 Transaction 의 반영 시기를 관리합니다.
    • 다 update 된 journal 은 circular 하게 재사용 가능합니다.

Ordered Journaling (= Metadata Journaling)

  • Problem (Data journaling)
    • Data block 의 부분이 가장 크므로 해당 부분의 write 횟수를 줄여야 합니다.
  • Solution (Metadata journaling)
    • 실제 data 내용이 아닌 inode 와 bitmap 의 정보만 journal 에 포함시킵니다.
    • Data block 을 journaling 하기전에 우선적으로 write 시킵니다.
  • Basic Protocol
    • Data write
    • Journal metadata write
    • Journal commit
    • Checkpoint metadata
    • Free

업데이트: