Skip to main content

inode

Ref

  • inode 是 file system 中,檔案的 meta data
  • 很多 file system 的 inode 總數量(可用數量)在建立時就已固定,有些新的 file system 的 inode 總數量可以動態增加
  • 每個 inode 都有一個 i-number (AKA inode number),在同一個 file system 中是唯一的
  • inode 不包含檔案名 (file name 保存在 dirent)
  • 存取檔案:Kernel 找到 file name 所指的 inode,然後存取 inode 指向的內容
  • Kernel 打開檔案後,就不會記住 file name,而是用 inode 存取檔案
  • defrag 時 i-number 不變,只會改變 inode meta data

inode meta data

  • inode number (i-number)
  • Type
    • Regular / file
    • Directory
    • Link
    • ...
  • Mode: file permissions
  • Flags
  • Generation
  • Version
  • User: 檔案 owner 的 UID
  • Group: 檔案 owner 的 GID
  • Project
  • Size
  • File ACL
  • Links: 檔案的 hard links 數量
  • Blockcount
  • Fragment
  • ctime: creation time 檔案建立的時間
  • atime: access time 檔案存取的時間
  • mtime: modification time 檔案修改的時間
  • inode checksum

inode used info

df -i

Show file / directory status

Include: i-number, Links (number of hard link), type, ...

stat <path>

dirent

directory entry

  • directory 也是一個 "檔案","檔案" 內容是一個 dirent list
    • dirent struct:
      • i-number
      • file name ( inode 的 alias / 別名 )
    • 檔案內容包含:
      • 自己的 dirent (.)
      • parent 的 dirent (..)
      • children 的 dirent
  • 刪除檔案是刪除 dirent,hard link 數量減少 1
  • 檔案被開啟時也可以刪除,因為刪除檔案只是刪除 dirent,不影響 inode
  • unused dirent 的 i-number = 0 (Ref)
  • root 的 i-number = 2
  • hard link 是指 dirent 指向 inode,它們之間的連結關係
  • symbolic link 是一個 type 為 symbolic link 的檔案,檔案內容是所指 file 的 path (file name)

Block size

blockdev --getbsz /dev/<device>

在檔案中建立 playground file system

# create a 1MB empty file
truncate -s 1M fs.ext2

# create ext2 file system
mkfs.ext2 -F fs.ext2

mkdir ext2

# mount the file (ext2 file system) to the mount point ext2
mount -o loop,rw fs.ext2 ext2

# show stat of inode #2
debugfs -R "stat <2>" fs.ext2

# enter debugfs CLI
debugfs -w fs.ext2