4.2.31 · Coding › Operating Systems
Ek file system basically aapki disk ka librarian + card catalog hai. Disk ek badi warehouse hai jinmein numbered shelves (blocks) hain. Aap yaad nahi rakhna chahte ki "mera essay block 90412 mein hai". To OS aapko deta hai:
ek human name ("essay.txt"),
ek catalog card jo record karta hai ki data blocks kahan hain aur kiska hai (woh hai inode ),
ek folder jo names ko catalog cards se map karta hai (woh hai directory ),
ek address jisse root se aapki file tak walk kar sako (woh hai path ).
Deep idea yeh hai: names aur metadata, data se alag hote hain . Yahi ek design choice explain karti hai hard links ko, kyun renaming sasta hai, aur kyun ls -l woh dikhata hai jo dikhata hai.
Ek file bytes ka ek named, ordered sequence hai plus metadata. OS ke liye content sirf "bytes" hai; structure (lines, JSON, JPEG) programs interpret karte hain, file system nahi. File OS ki persistent storage ki unit hai ek name ke saath.
Definition Directory (folder)
Ek directory khud ek special file hai jiska content entries ka ek table hai, jismein har entry ek name → ek inode number map karti hai. To ek folder files ko "contain" nahi karta — woh (name, inode#) pairs contain karta hai jo files ki taraf point karte hain.
Definition Inode (index node)
Ek inode ek on-disk structure hai jo ek file ki saari metadata hold karta hai naam chodkar : size, owner UID/GID, permissions, timestamps, link count, aur data blocks ke pointers . Har file ka exactly ek inode hota hai, jo ek inode number se identify hota hai jo ek filesystem ke andar unique hota hai.
Ek path woh route hai jo ek file ko naam se locate karne ke liye use hota hai. Ek absolute path root / se shuru hota hai (jaise /home/ana/a.txt); ek relative path current working directory se shuru hota hai (jaise docs/a.txt). Har /-separated component ek directory lookup hai, jo aakhri file par khatam hota hai.
Intuition The key separation
Agar naam file ki metadata ke andar hota, to ek file ka kabhi sirf ek naam ho sakta tha. Naam ko directory mein aur metadata ko inode mein rakhne se, multiple directory entries ek hi inode number ki taraf point kar sakti hain → yahi hard link hai. Inode ka link count exactly yeh hai ki "kitne names mujhe point karte hain", aur file ka data tab hi free hota hai jab woh count 0 ho jaaye aur koi process use open na rakhe.
directory "docs" inode 5012 data blocks
+-----------+--------+ +------------------+ +---------+
| name | inode# | | size, owner, | ---> | block 9 |
+-----------+--------+ | perms, times, | ---> | block 40|
| a.txt | 5012 |--------> | link_count = 2, | ---> | block 88|
| copy.txt | 5012 |--------> | block ptrs | +---------+
+-----------+--------+ +------------------+
Do names, ek inode, data ka ek copy → a.txt aur copy.txt same file hain.
/home/ana/a.txt open karne ke liye, kernel iterative directory lookup karta hai:
Root inode se shuru karo (uska inode number fixed/known hai, jaise ext-style FS par inode 2).
Root ki directory data padho → entry "home" dhundho → uska inode# lo.
Woh inode load karo, uski directory data padho → "ana" dhundho → inode# lo.
Woh inode load karo, uski directory data padho → "a.txt" dhundho → inode# lo.
Woh inode load karo → ab humein metadata + block pointers mil gaye → permissions check karo → file handle return karo.
Intuition Why this design is fast yet flexible
Har step ek directory table mein ek small lookup hai, isliye cost ≈ (path depth) directory reads . Ek file rename karna = ek (name, inode#) entry change karna — inode aur data kabhi move nahi karte. Yahi reason hai ki mv instant hota hai chahe 4 GB file ho (ek hi filesystem ke andar).
Intuition Why not just "start block + length"?
Ek simple file start, length store kar sakti thi — lekin files badhti hain, ghatti hain, aur fragmented ho jaati hain. Isliye inodes ek array of block pointers store karte hain, plus indirect pointers bade files ke liye scale karne ke liye, bina har inode ko bloat kiye.
Worked example Classic ext2 numbers
B = 4096 , P = 4 bytes → k = 1024 . D = 12 direct.
Yeh kyun? ext2 mein 12 direct + 1 single + 1 double + 1 triple hote hain.
( 12 + 1024 + 102 4 2 + 102 4 3 ) ⋅ 4096 ≈ 4.4 × 1 0 12 bytes ≈ 4 TB .
Chote files sirf direct pointers use karti hain (fast); bade files transparently indirection use karti hain.
/a/b/c/d.txt ke liye directory reads count karna
Root ke baad components: a, b, c, d.txt → 4 lookups (root inode pehle se known hai).
Yeh step kyun? har / ek directory-table search trigger karta hai name→inode map karne ke liye.
stat file size dikhata hai lekin directory naam dikhati hai
stat inode padhta hai (size, perms, times); naam stat mein nahi hota kyunki naam parent directory ke table mein hota hai, inode mein nahi. Kyun? metadata aur naming design ke hisaab se alag hain.
Common mistake "Directory file ke bytes
contain karta hai."
Kyun sahi lagta hai: GUIs files ko folders ke andar draw karte hain, to lagta hai folders contents hold karte hain.
Fix: ek directory sirf (name → inode#) entries hold karta hai. Bytes data blocks mein hote hain jo inode point karta hai. Folder ek index hai, container nahi.
Common mistake "Hard link ek copy hai."
Kyun sahi lagta hai: do naam, dono kaam karte hain — duplication jaisi lagti hai.
Fix: dono naam same inode ki taraf point karte hain → data ka ek copy, shared changes. Sirf link_count ek fresh file se alag hota hai. Ek copy (cp) ek nayi inode + naye blocks banata hai.
Common mistake "Inode filename store karta hai."
Kyun sahi lagta hai: file ka ek "naam" hota hai, to woh file ke record mein zaroor hoga.
Fix: inode naam chodkar sab kuch store karta hai. Naam parent directory mein hota hai — yahi exactly woh cheez hai jo multiple names (hard links) aur saste renames enable karti hai.
Common mistake "Symlink = hard link."
Kyun sahi lagta hai: dono se aap ek file tak doosre naam se pahunch sakte hain.
Fix: ek symlink apne khud ke inode mein ek path string store karta hai (naam se pointer); agar target delete ho jaaye to symlink dangle karta hai. Ek hard link same inode# ka ek aur directory entry hai aur kabhi dangle nahi karta jab tak count > 0 ho. Symlinks filesystems cross kar sakte hain aur directories ko point kar sakte hain; hard links generally nahi kar sakte.
Recall Feynman: explain to a 12-year-old
Ek school library imagine karo. Book aapki file hai (actual pages = data). Catalog card inode hai: usme kahani nahi hai, lekin woh batata hai kitni badi book hai, kaun borrow kar sakta hai, aur pages kis shelf par hain. Titles ki folder/list directory hai: woh sirf "title → card number" map karti hai. Path directions hain: "floor 2 jao, room Science, shelf 5". Aap wahi card number do alag titles ke neeche rakh sakte ho — ab ek book ke do naam hain! Jab us card ki taraf point karne wala last title erase ho jaaye aur koi us waqt pad na raha ho, tab librarian pages phenk deta hai.
"DIP-N" = D irectory N ames hold karta hai, I node metadata + P ointers hold karta hai (Name nahi).
Aur "Last naam + last reader gone → bye" jab data free hota hai (link_count=0 ∧ open_count=0).
Inode kya hai? Ek on-disk structure jo ek file ki saari metadata store karta hai naam chodkar (size, owner, perms, timestamps, link count, data-block pointers).
File ka naam kahan store hota hai? Uski parent directory mein, ek (name → inode number) entry ke roop mein — inode mein nahi.
Directory structurally kya hai? Ek special file jiska content ek table hai jo names ko inode numbers se map karta hai.
Absolute vs relative path? Absolute root / se shuru hota hai; relative current working directory se shuru hota hai.
Inode mein link_count kya hai? Us inode ki taraf point karne wale directory entries (hard links) ki sankhya.
File ke data blocks kab free hote hain? Jab link_count = 0 HO AUR koi process use open na rakhe (open_count = 0).
Ek badi file ko rename karna (same FS) instant kyun hai? Sirf ek (name, inode#) directory entry change hoti hai; inode aur data blocks move nahi karte.
Hard link vs symbolic link? Hard link = SAME inode# ka extra directory entry; symlink = ek file jo ek target PATH string store karti hai, dangle ho sakti hai aur filesystems cross kar sakti hai.
Hard link vs copy? Hard link ek inode aur data ka ek copy share karta hai; copy ek nayi inode aur naye data blocks banata hai.
Direct + 3 levels of indirect ke saath max file size formula? (D + k + k² + k³)·B, jahan k = block/pointer-size, B = block size, D = direct pointers.
/a/b/c.txt resolve karne ke liye kitne directory lookups chahiye? 3 (a, b, c.txt); root inode pehle se known hai.
stat kya padhta hai vs naam kahan se milta hai?stat inode padhta hai (size/perms/times); naam parent directory se aata hai.
Hard links vs Symbolic links
ext2-ext4 inode structure
Virtual File System (VFS) layer
Block allocation and fragmentation
File permissions and UID-GID
open() read() write() system calls
Mount points and multiple filesystems
many entries share one inode
data freed when count hits 0