Linux Filesystems, FSCK, and Journaling
CS-446/646
C. Papachristos
Robotic Workers (RoboWork) Lab
University of Nevada, Reno
Linux Filesystems, FSCK & Journaling
Filesystems in Linux
Linux Second Extended File System (ext2)
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Linux ext2
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Linux ext2 Disk Layout
CS446/646 C. Papachristos
Free Blocks
Bitmap
inode
Table
(fixed-size)
Free inodes
Bitmap
Superblock: Contains description of the basic Size and Shape of this Filesystem�
Note: Duplicated in all Groups for corruption
Block Group Descriptor Table: Contains description for each Block Group of this Filesystem (Location of Block Bitmap, inode Bitmap, inode Table, # Free Blocks,�# Free inodes, # Directories)�
Note: Also duplicated in all Groups for corruption
1 Block
1 Block
1 Block
n Blocks
Linux Filesystems, FSCK & Journaling
Block Addressing in ext2
CS446/646 C. Papachristos
inode
Metadata
Direct Blocks
Indirect Blocks
Double-Indirect Blocks
Triple-Indirect Blocks
Note 1: �Indirect Blocks: Contain BLKSIZE/4 Block Entries
(32-bit (i.e. 4-Byte) Pointer Size) → 1024 Block Entries
Linux Filesystems, FSCK & Journaling
ext2 Directory Structure
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Linux ext3
The Consistent Update Problem – Filesystem Consistency
Goal:
Challenge:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Linux ext3
Review: File I/O Path (Reads)
read() from a File
CS446/646 C. Papachristos
Disk
Block NOT in Cache
Block IN Cache
Leave Copy in Cache
1
2
Buffer Cache
(Main Memory)
Case:
Case:
Linux Filesystems, FSCK & Journaling
Linux ext3
Review: File I/O Path (Writes)
write() to File
Note:
fflush(): Flush internal Application Buffers (of a FILE *) to OS
fsync(): Flush OS Buffers to Physical Media (Device)
CS446/646 C. Papachristos
Disk
Delayed Write to Disk
Buffer Write in Memory
1
Buffer Cache
(Main Memory)
2
Linux Filesystems, FSCK & Journaling
Example: File Creation of /a.txt
Initial state:
CS446/646 C. Papachristos
Remember:
Memory
Disk
(Free)
inodes
Bitmap
inode Table
Data Blocks
(Free)
Blocks
Bitmap
| | | | | | | | | | | | | | |
11100
01000
/
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
Example: File Creation of /a.txt
Read-in to Memory Cache:
CS446/646 C. Papachristos
| | | | | | | | | | | | | | |
Memory
Disk
inode Table
Data Blocks
11100
01000
<'.', #2>
<'..', #2>
(Free)
inodes
Bitmap
(Free)
Blocks
Bitmap
/
11100
01000
/
…
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
Example: File Creation of /a.txt
Modify Metadata and Blocks:
CS446/646 C. Papachristos
Memory
Disk
inode Table
Data Blocks
11110
<'.', #2>
<'..', #2>
<'a.txt', #3>
Dirty Blocks, Memory State and Disk State are Inconsistent: Must write to Disk
(Free)
inodes
Bitmap
(Free)
Blocks
Bitmap
| | | | | | | | | | | | | | |
11100
01000
/
01110
/
…
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Possible Crash Scenarios
File creation example dirties (at least) 3 Blocks
Old and new contents of the Blocks:
CS446/646 C. Papachristos
Crash scenarios: Any subset can be written
Linux Filesystems, FSCK & Journaling
One solution: File System Consistency checK (FSCK)
Advantages
Disadvantages
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
FSCK Example 1:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
FSCK Example 2:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
FSCK Example 3:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
FSCK Example 4:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
FSCK Example 4:
C. Papachristos
Linux Filesystems, FSCK & Journaling
Another solution: Journaling
Advantages:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Linux ext3 Journaling
1) Write Dirty Blocks to Journal as a single Transaction (e.g TxBegin, I, B, D Blocks)
2) Write commit Block (containing TxEnd)
3) Copy Dirty Blocks to real Filesystem (“Checkpointing”)
4) Reclaim the Journal Space for the Transaction
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Step 1: Write Blocks to Journal
CS446/646 C. Papachristos
Memory
Disk
Dirty Blocks
/
11110
| | | | | | | | | | | | | | |
11100
01000
/
<'.', #2>
<'..', #2>
<'a.txt', #3>
01110
…
Journal
| | | | | | | | | | | | |
TxB
id=1
11110
01110
/
…
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
Step 2: Write commit Block
CS446/646 C. Papachristos
Memory
Disk
Journal
Dirty Blocks
| | | | | | | | | | | | | | |
11100
01000
/
11110
<'.', #2>
<'..', #2>
<'a.txt', #3>
01110
/
…
| | | | | | | | | | | | | |
TxB
id=1
11110
01110
/
…
TxE
id=1
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
Step 3: Copy Dirty Blocks to Real Filesystem
CS446/646 C. Papachristos
Memory
Disk
Journal
Dirty Blocks
| | | | | | | | | | | | | | |
01110
/
11110
11110
<'.', #2>
<'..', #2>
<'a.txt', #3>
01110
/
…
| | | | | | | | | | | | | |
TxB
id=1
11110
01110
/
…
TxE
id=1
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
Step 4: Reclaim Journal Space
CS446/646 C. Papachristos
| | | | | | | | | | | | | | |
Memory
Disk
|
Journal
Dirty Blocks
11110
01110
/
11110
<'.', #2>
<'..', #2>
<'a.txt', #3>
01110
/
…
#0
#1
#2
#3
#4
#5
#0
#1
#2
#3
#4
#5
Linux Filesystems, FSCK & Journaling
What if there is a Crash?
Recovery :
CS446/646 C. Papachristos
| | | | | | |
Journal
TxB
id=1
I
B
?
TxE
id=1
Linux Filesystems, FSCK & Journaling
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
ext3 Journaling Modes
Several Journaling Modes to balance Consistency and Performance:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Virtual File System (VFS)
Virtual File System:
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Virtual File System (VFS)
CS446/646 C. Papachristos
void mkdir_ext2(struct inode *i_this) {
i_this->…;
}
inode *inode_init() {
inode_ext2 *new_inode = malloc(sizeof(inode_ext2));
new_inode->inode_ops->mkdir = mkdir_ext2;
return (*inode)new_inode;
}
my_dir_inode->inode_ops->mkdir(my_dir_inode);
void mkdir_ext3(struct inode *i_this) {
i_this->…;
}
inode *inode_create() {
inode_ext3 *new_inode = malloc(sizeof(inode_ext3));
new_inode->mkdir = mkdir_ext3;
return (*inode)new_inode;
}
struct inode_ops {
struct inode *i_this; //inode back-pointer
void (*mkdir)(struct inode *); //interface func
};
Linux Filesystems, FSCK & Journaling
VFS Interface Schematic
CS446/646 C. Papachristos
Linux Filesystems, FSCK & Journaling
Key Linux VFS Data Structures
CS446/646 C. Papachristos
Next Lecture Reading Preparation
Operating Systems – Three Easy Pieces (https://pages.cs.wisc.edu/~remzi/OSTEP/)
Persistence
CS446/646 C. Papachristos
Time for Questions !
CS-446/646
CS446/646 C. Papachristos