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.
- Lệnh
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.