Superblock trong hệ thống tập tin

1. Tổng quan

Superblock là một trong những thành phần cốt lõi của file system (filesystem) trên Linux/Unix. Nó lưu trữ thông tin siêu dữ liệu (metadata) để hệ điều hành có thể hiểu và quản lý toàn bộ cấu trúc dữ liệu trên đĩa. Nếu coi file system như một cuốn sách, thì Superblock chính là mục lục và quy tắc định dạng của cuốn sách đó.

2. Khái niệm Superblock

  • Superblock chứa các thông tin cơ bản về filesystem, ví dụ:
    • Kích thước block
    • Tổng số block/inode
    • Số lượng block/inode còn trống
    • Vị trí của inode table
    • Thông tin mount và trạng thái filesystem
  • Trong ext2/ext3/ext4, Superblock gốc thường nằm ở vị trí offset 1024 byte kể từ đầu phân vùng.

3. Vị trí và cách sao lưu Superblock

3.1 Vị trí các bản backup

  • ext2/ext3 (cũ): theo mặc định, mỗi block group sẽ có 1 bản sao Superblock và Group Descriptor.
  • ext4 (mới): áp dụng cơ chế sparse superblock → chỉ một số block group nhất định có bản sao, cụ thể:
    • Block group số 0, 1 (luôn có).
    • Các block group có số thứ tự là lũy thừa của 3, 5, hoặc 7 (ví dụ: 3, 5, 7, 9, 25, 49…).

Cách tính:

  • Giả sử block size = 4 KiB.
  • Superblock backup của block group n nằm ở block đầu tiên của block group đó (trừ group 0 thì nằm ở offset 1024 byte).
  • Công thức tổng quát: Vị trí backup = (n * block_group_size) + block_offset_superblock trong đó block_group_size = block_size * blocks_per_group.

3.2 Sơ đồ vật lý (ext4, block size 4 KiB, mỗi group = 32768 block)

Group 0:  [Boot | Superblock | GroupDesc | ...]
Group 1:  [Superblock copy | GroupDesc copy | ...]
Group 2:  [Data only]
Group 3:  [Superblock copy | GroupDesc copy | ...]
Group 4:  [Data only]
Group 5:  [Superblock copy | GroupDesc copy | ...]
...

3.3. Backup Superblock là full hay partial?

  • Bản backup không phải full toàn bộ Superblock, mà là bản rút gọn (partial copy).
  • Thông tin được lưu trong bản sao đủ để:
    • Nhận diện filesystem (magic number).
    • Biết thông số cơ bản (block size, số inode/block, vị trí inode table…).
    • Phục hồi lại khi Superblock chính hỏng.

Các bản backup không lưu toàn bộ metadata runtime (ví dụ: thông tin mount cuối cùng, trạng thái clean/dirty có thể khác nhau).

4. Cơ chế hoạt động với Superblock

  • Khi người dùng mở một file, quy trình diễn ra:
    • OS → đọc Superblock để biết thông tin filesystem.
    • Superblock → trỏ đến bảng inode.
    • Inode → cho biết block nào chứa dữ liệu của file.
    • Cuối cùng → đọc dữ liệu thực tế từ block trên đĩa.
  • Sơ đồ minh họa:
User → OS → Superblock → Inode Table → Data Block

5. Ví dụ thực tế

  • Khi mount một phân vùng ext4, hệ thống sẽ kiểm tra Superblock để biết thông tin:
    • Filesystem sạch hay bị lỗi.
    • Thời gian mount cuối cùng.
    • Số lần mount tối đa trước khi bắt buộc fsck.
  • Trong trường hợp Superblock hỏng:
    • Lệnh fsck -b <backup-superblock> có thể dùng để phục hồi từ bản sao.

Kiểm tra Superblock chính và backup:

dumpe2fs /dev/sda1 | grep -i superblock

Sẽ hiển thị danh sách tất cả vị trí backup.

Phục hồi khi Superblock chính hỏng:

fsck -b 32768 /dev/sda1

(32768 là vị trí block backup).

6. Superblock chính và Superblock backup khác nhau thế nào?

  • Superblock chính: đầy đủ thông tin, trong đó có cả metadata runtime (dirty flag, last mount time, số lần mount…).
  • Superblock backup: bản sao được tạo ra khi mkfs (format filesystem). Nó chứa:
    • Các thông số “bất biến” để nhận diện và dựng lại filesystem (magic number, block size, inode size, số lượng tổng block/inode, vị trí các bảng chính…).
    • Không chứa (hoặc không cập nhật) những dữ liệu thay đổi thường xuyên.

Nói cách khác, bản backup giống như một “bản thiết kế khung” của filesystem, không phải log hoạt động hằng ngày.

Cơ chế sử dụng Superblock backup khi chính bị lỗi

  • Khi mount, kernel sẽ tìm Superblock chính ở offset chuẩn (1024B). Nếu đọc thất bại hoặc checksum sai → báo lỗi.
  • Quản trị viên có thể dùng lệnh fsck -b <block_backup> để chỉ định vị trí Superblock backup.
  • fsck sẽ:
    • Đọc thông tin từ Superblock backup (block size, số inode, vị trí inode table…).
    • Dùng thông tin này để “dựng lại bản đồ” filesystem.
    • Sau đó quét inode table + block bitmap để kiểm tra và tái đồng bộ metadata còn lại.

Nhờ đó, chỉ cần có khung cấu trúc đúng từ backup, filesystem vẫn có thể khôi phục đầy đủ dữ liệu.

7. Demo Superblock trên ext4.

Tạo file image làm ổ đĩa giả

Tạo file 100MB

shell> sudo dd if=/dev/zero of=disk1.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.105012 s, 999 MB/s

Tạo thiết bị loop gắn với file

losetup -fP disk1.img

Để xem loop device vừa được gán (ví dụ /dev/loop3)

shell> losetup -a | grep disk1.img
/dev/loop3: [64768]:1706057 (/root/disk1.img)

Có thể verify bằng lệnh lsblk

shell> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0   62M  1 loop /snap/core20/1587
loop1                       7:1    0 79.9M  1 loop /snap/lxd/22923
loop2                       7:2    0   47M  1 loop /snap/snapd/16292
loop3                       7:3    0  100M  0 loop
sda                         8:0    0   50G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   48G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   48G  0 lvm  /
sdb                         8:16   0    2G  0 disk
sdc                         8:32   0    2G  0 disk
sdd                         8:48   0    2G  0 disk
sr0                        11:0    1 1024M  0 rom

Tạo filesystem ext4 trên image

shell> mkfs.ext4 /dev/loop3
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 25600 4k blocks and 25600 inodes

Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

Trong quá trình này, lệnh mkfs.ext4 sẽ in ra vị trí Superblock chính và các bản backup (sparse).

Lưu ý rằng, bạn có thể không thấy danh sách backup trong output trên giống trường hợp của mình, có thể không phải vì không có superblock backup mà do phiên bản mke2fs 1.46.5 ẩn thông tin đó.

Bạn có thể kiểm tra vị trí Superblock bằng dumpe2fs cũng được.

shell> dumpe2fs /dev/loop3 | grep -i superblock
dumpe2fs 1.46.5 (30-Dec-2021)
  Primary superblock at 0, Group descriptors at 1-1

Bạn sẽ thấy danh sách tất cả bản sao backup của Superblock, tuy nhiên trường hợp trên của mình cũng chưa thấy backup của Superblock. Đây chính là trường hợp đặc biệt do dung lượng filesystem bạn tạo quá nhỏ.

Vậy vì sao chỉ có Primary superblock mà không có backup?

Vì mình đã tạo FS trên loop3 với kích thước:

25600 blocks × 4K = 100 MB

Nhưng mỗi block group trong ext4 mặc định có:

32768 blocks / group (với block size = 4K)
→ tức là 128 MB / group

Nhưng filesystem mình tạo chỉ có 25600 block (~100 MB) < 32768 block → nghĩa là chỉ có 1 block group (Group 0).

Khi chỉ có 1 group → không còn group nào để đặt bản sao Superblock → bạn chỉ thấy Primary superblock at 0.

Bây giờ mình sẽ tạo filesystem lớn hơn, ví dụ tạo image 200 MB.

shell> sudo dd if=/dev/zero of=disk2.img bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.193055 s, 1.1 GB/s

shell> losetup -a | grep disk2.img
/dev/loop5: [64768]:1706059 (/root/disk2.img)

shell> losetup -fP disk2.img
shell> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0   62M  1 loop /snap/core20/1587
loop1                       7:1    0 79.9M  1 loop /snap/lxd/22923
loop2                       7:2    0   47M  1 loop /snap/snapd/16292
loop3                       7:3    0  100M  0 loop
loop4                       7:4    0 89.4M  1 loop /snap/lxd/31333
loop5                       7:5    0  200M  0 loop
sda                         8:0    0   50G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   48G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   48G  0 lvm  /
sdb                         8:16   0    2G  0 disk
sdc                         8:32   0    2G  0 disk
sdd                         8:48   0    2G  0 disk
sr0                        11:0    1 1024M  0 rom

Khi đó, dung lượng > 128 MB, sẽ có tối thiểu 2 block group và bạn sẽ thấy thêm bản sao backup như output ở dưới.

shell> mkfs.ext4 /dev/loop5
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 51200 4k blocks and 51200 inodes
Filesystem UUID: 54c22b36-4bf9-410c-a97e-8edf2b3bd6b7
Superblock backups stored on blocks:
	32768

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

Nếu lớn hơn nữa (ví dụ vài trăm MB → vài GB) sẽ có nhiều group và nhiều backup hơn (32768, 98304, 163840 …).

Kiểm tra vị trí Superblock bằng dumpe2fs.

shell> dumpe2fs /dev/loop5 | grep -i superblock
dumpe2fs 1.46.5 (30-Dec-2021)
  Primary superblock at 0, Group descriptors at 1-1
  Backup superblock at 32768, Group descriptors at 32769-32769

Bạn sẽ thấy danh sách tất cả bản sao backup của Superblock.

Giả lập hỏng Superblock chính.

Ghi đè vài byte đầu để phá Superblock chính.

shell> sudo dd if=/dev/zero of=/dev/loop5 bs=1K count=2 conv=notrunc
2+0 records in
2+0 records out
2048 bytes (2.0 kB, 2.0 KiB) copied, 0.0200603 s, 102 kB/s

Lúc này nếu thử mount, sẽ báo lỗi vì Superblock chính bị hỏng.

shell> mount /dev/loop5 /mnt
mount: /mnt: wrong fs type, bad option, bad superblock on /dev/loop5, missing codepage or helper program, or other error.

Phục hồi bằng Superblock backup.

Giả sử bản backup ở block 32768, ta dùng fsck:

shell> fsck.ext4 -b 32768 /dev/loop5
e2fsck 1.46.5 (30-Dec-2021)
/dev/loop5 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Padding at end of inode bitmap is not set. Fix<y>? yes

/dev/loop5: ***** FILE SYSTEM WAS MODIFIED *****
/dev/loop5: 11/51200 files (0.0% non-contiguous), 7358/51200 blocks

Kết quả fsck sẽ đọc Superblock backup, dựng lại cấu trúc filesystem, rồi fix lại metadata. Sau đó bạn có thể mount bình thường:

shell> mount /dev/loop5 /mnt
shell> df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              1.6G  1.2M  1.6G   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   47G  7.2G   38G  17% /
tmpfs                              7.9G     0  7.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  126M  1.7G   7% /boot
tmpfs                              1.6G  4.0K  1.6G   1% /run/user/1001
/dev/loop5                         172M   24K  158M   1% /mnt

Kết luận sau demo.

Superblock chính hỏng → filesystem mất khả năng mount.

Superblock backup chứa đủ thông tin cấu trúc → fsck có thể dùng để thay thế và dựng lại.

Đây chính là lý do tại sao ext2/3/4 tạo nhiều bản sao Superblock rải rác trên ổ.

8. Lời khuyên

Luôn giữ danh sách backup Superblock (ghi chú từ lệnh dumpe2fs) để phòng sự cố.

Tránh ghi đè khi filesystem bị lỗi, chỉ thao tác read-only trước.

Nếu filesystem quan trọng → cân nhắc snapshot hoặc RAID để tránh phụ thuộc duy nhất vào Superblock.

9. Kết luận

Superblock là thành phần xương sống của filesystem, lưu giữ toàn bộ metadata cần thiết để quản lý dữ liệu. Superblock gốc luôn nằm tại offset 1024 byte đầu phân vùng, bản sao Superblock được phân bố rải rác theo block group theo cơ chế sparse (ext4). Các bản sao này là partial copy, đủ để phục hồi filesystem khi Superblock chính hỏng. Việc nắm được vai trò, vị trí và cơ chế sao lưu của Superblock giúp ta chủ động hơn trong việc bảo trì, xử lý sự cố và khôi phục dữ liệu khi cần thiết.

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email