1. Tổng quan.
Trong lĩnh vực lưu trữ dữ liệu (storage), các khái niệm như Sector, Block, Chunk, Offset, Group Block là nền tảng để hiểu cách dữ liệu được ghi, đọc và quản lý trên ổ cứng, hệ điều hành và hệ thống RAID/Filesystem. Nắm rõ sự khác biệt và mối quan hệ giữa chúng giúp người quản trị hệ thống (sysadmin) và kỹ sư lưu trữ xử lý hiệu quả các tình huống liên quan đến hiệu năng, quản lý và phục hồi dữ liệu.
2. Chi tiết các khái niệm
2.1. Sector
- Định nghĩa: Đơn vị lưu trữ nhỏ nhất trên đĩa vật lý (HDD/SSD).
- Kích thước phổ biến: 512B (truyền thống) hoặc 4096B (Advanced Format).
- Đặc điểm:
- Dữ liệu luôn được ghi/đọc theo đơn vị sector.
- Nếu chỉ sửa 1 byte thì ổ vẫn phải đọc/ghi cả sector.
Ví dụ: Một ổ cứng HDD cũ thường có sector 512B, còn SSD đời mới thường dùng sector 4KB để tối ưu hiệu năng.
2.2. Block
- Định nghĩa: Đơn vị quản lý dữ liệu của filesystem (EXT4, NTFS, XFS, …).
- Kích thước phổ biến: 1KB, 2KB, 4KB, 8KB.
- Đặc điểm:
- Filesystem dùng block để cấp phát cho file.
- Một file dù chỉ 1 byte vẫn chiếm tối thiểu 1 block.
- Sơ đồ:
[Sector 1][Sector 2][Sector 3][Sector 4] --> gộp thành 1 Block (4KB)
Khi ghi file vào đĩa, filesystem sẽ chia nhỏ dữ liệu thành các block cố định, ví dụ EXT4 với block size 4KB.
Ví dụ:
File file.txt
có dung lượng 10KB, block size của filesystem là 4KB, thì:
- Số block cần:
ceil(10 / 4) = 3 block
- Bố trí:
- Block 1: 4KB
- Block 2: 4KB
- Block 3: 2KB (nhưng vẫn chiếm 4KB trên disk → gây lãng phí gọi là internal fragmentation)
Lưu ý:
- Một file dù chỉ 1 byte vẫn chiếm ít nhất 1 block.
- Filesystem chỉ biết đến block, không thao tác trực tiếp với sector nữa.
- Một block thường gồm nhiều sector bên dưới (VD: 4KB = 8 sector 512B).
2.3. Chunk (Stripe Unit trong RAID)
- Định nghĩa: Đơn vị dữ liệu mà RAID (software hoặc hardware) chia ra để phân phối trên các đĩa.
- Kích thước phổ biến: 16KB, 64KB, 128KB…
- Đặc điểm:
- RAID0 sẽ ghi từng chunk luân phiên trên các đĩa.
- Chunk size ảnh hưởng đến hiệu năng (IOPS vs throughput).
Sơ đồ RAID0 với chunk 64KB và 2 disk:
Disk1: [Chunk1][Chunk3][Chunk5]
Disk2: [Chunk2][Chunk4][Chunk6]
Giả sử bạn ghi một file 256 KB:
- Với block size 4 KB → file gồm 64 block.
- RAID có chunk 64 KB, 2 disk → phân chia:
Chunk | Ghi lên Disk | Dữ liệu chứa block từ FS |
---|---|---|
Chunk 1 (64K) | sdb | block 0 → 15 |
Chunk 2 (64K) | sdc | block 16 → 31 |
Chunk 3 (64K) | sdb | block 32 → 47 |
Chunk 4 (64K) | sdc | block 48 → 63 |
Mỗi chunk thường chứa nhiều block. Khi ghi file, dữ liệu đi từ block → chunk → disk.
RAID Layer (md0 - chunk 64KB)
┌─────────────┬─────────────┬─────────────┬─────────────┐
│ Chunk 0 │ Chunk 1 │ Chunk 2 │ Chunk 3 │
│ 64 KB │ 64 KB │ 64 KB │ 64 KB │
│ Block 0-15 │ Block16-31 │ Block32-47 │ Block48-63 │
└─────────────┴─────────────┴─────────────┴─────────────┘
↓ ↓ ↓ ↓
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Disk sdb│ │ Disk sdc│ │ Disk sdb│ │ Disk sdc│
│ Chunk 0 │ │ Chunk 1 │ │ Chunk 2 │ │ Chunk 3 │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
Nếu bạn thay chunk size trong RAID (ví dụ 128 KB), thứ tự
2.4. Offset
- Định nghĩa:
- Offset là cách định vị dữ liệu từ một điểm gốc (thường là byte 0 hoặc sector 0).
- Có thể hiểu offset như tọa độ của dữ liệu — dùng trong rất nhiều tầng: file, block, sector.
- Offset có thể tăng dần khi dữ liệu được ghi nối tiếp → điều này đúng trong các hệ thống tuần tự hoặc khi viết file theo kiểu log.
- Đặc điểm:
- Dùng để xác định byte/thứ tự sector/block.
- Hệ điều hành dùng offset để dịch địa chỉ logic (file) sang vị trí vật lý.
- Ví dụ file A bắt đầu từ offset 2048 sector (tương ứng ~1MB), nghĩa là phải bỏ qua 2048 sector đầu tiên để đến dữ liệu file.
Tuỳ ngữ cảnh mà offset có các “tầng” như sau:
Loại offset | Mô tả |
---|---|
Offset trong file | Vị trí tính từ đầu file. Ví dụ: seek(1024) → đọc từ byte thứ 1024. |
Offset trong ổ đĩa (LBA) | Tính từ sector đầu tiên → được dùng để xác định nơi đọc/ghi trên disk. |
Offset trong partition | Sector đầu tiên của phân vùng (thường là 2048) |
Offset logic (filesystem) | Offset đến block logic nào đó trong 1 file hoặc inode |
Offset vật lý | Vị trí thật trên đĩa tính từ đầu đĩa |
Offset trong file
- Offset luôn tăng dần khi ghi thêm.
- Khi bạn mở một file để ghi, có một write pointer (con trỏ ghi).
- Ban đầu, pointer này ở offset = 0 → ghi vào đầu file.
- Sau mỗi lần ghi (VD: ghi 1KB), pointer sẽ tự động nhảy tiếp sang offset tiếp theo (offset += 1024).
→ Đây là offset trong file, chứ không phải offset trên disk.
Ví dụ:
int fd = open("data.log", O_WRONLY);
write(fd, "hello", 5); // Ghi ở offset 0
write(fd, "world", 5); // Ghi ở offset 5
=> tổng cộng 10 byte, file sẽ có nội dung: helloworld
. Offset tăng dần theo từng lần ghi → giống như “dịch con trỏ”.
Offset trong ổ đĩa (LBA)
Trên ổ đĩa, offset là vị trí sector nơi dữ liệu sẽ ghi vào.
Giả sử:
- Partition bắt đầu tại sector 2048.
- Filesystem cấp phát block #100 (4KB/block) → offset vật lý trên đĩa:
offset_in_sector = 2048 + (100 * 8) = 2848
⇒ Đây là offset theo sector tính từ đầu đĩa.
Sơ đồ mô hình hóa offset (từ logic đến vật lý)
Để giải thích chuẩn hơn, mình chia làm 2 loại offset:
Offset (logic) – Tương đối
Offset đơn giản là vị trí tương đối, bắt đầu từ 0.
Ví dụ: File file.txt
, block logic 0 đến block logic 2 (vì 3 block).
Khi ánh xạ xuống ổ đĩa, block logic 0 có thể nằm ở block vật lý 1000 (trên filesystem).
Offset (sector/LBA) – Tuyệt đối
- Ổ đĩa vật lý chia thành các sector/LBA tuần tự (VD: sector 0 → sector 2047999 cho ổ 1GB 512B-sector).
- Khi tạo partition, bạn sẽ đặt offset bắt đầu của phân vùng (thường là 2048 sector = 1MB) để căn thẳng hàng với erase block của SSD.
Bạn tưởng tượng vậy cho dễ hiểu:
Disk: 1GB
Partition offset start: 2048 (tức là skip 1MB đầu tiên)
Block size = 4KB
→ Tổng số block ~250,000 block
Filesystem EXT4 tạo bảng inode, bitmap và sau đó bắt đầu cấp phát block rảnh:
- File A (10KB) → cấp block #1000, #1001, #1002
- File B (4KB) → cấp block #2000
- File C (16KB) → cấp block #3000, #3001, #3002, #3003
Block #1000 tương ứng với:
Offset trên disk = 2048 + 1000 * 8 = sector 10048
→ Như vậy, offset thực sự là công thức tính ra vị trí, không phải là vị trí định sẵn.
Thuật ngữ | Ý nghĩa |
---|---|
Offset (Logic) | Vị trí tính từ đầu file hoặc đầu đĩa |
Offset (LBA) | Vị trí tuyệt đối trên đĩa, tính theo sector |
Ví dụ
file.txt (20KB)
|
+-- Logical block 0 (offset = 0)
| → ghi vào FS block #500
| → ghi vào sector offset = 2048 + (500 * 8) = 6048
|
+-- Logical block 1 (offset = 4KB)
| → FS block #501 → offset = 6056
|
+-- Logical block 2 (offset = 8KB)
→ FS block #502 → offset = 6064
Bảng tóm tắt offset là gì?
Ngữ cảnh | Ý nghĩa offset |
---|---|
Trong file | Vị trí ghi/đọc tính từ đầu file |
Trong đĩa | Tọa độ tính bằng sector để xác định vùng dữ liệu |
Trong filesystem | Vị trí block logic, inode, extent… |
Trong ổ cứng | Vị trí sector tuyệt đối trên thiết bị vật lý |
So sánh hình ảnh để dễ hiểu
Giống như số nhà trên bản đồ:
- Block là ngôi nhà
- Offset là tọa độ GPS
- Sector là gạch lát
- File là dãy nhà
→ Khi bạn ghi thêm, bạn xây thêm nhà về phía sau, offset tăng dần (tọa độ dịch chuyển).
- Khi làm việc với
dd
,seek
,skip
, haylseek()
trong code → phải hiểu rõ offset. - Khi cứu dữ liệu hoặc debug filesystem → cần biết offset sector, block, inode để dò thủ công.
- Khi làm RAID, ổ đĩa thô (
/dev/sdX
), hiểu offset giúp canh stripe đúng, không lệch sector.
2.5. Group Block (Filesystem Metadata)
- Định nghĩa: Nhóm block trong filesystem dùng để quản lý dữ liệu (thường gặp trong EXT2/3/4).
- Đặc điểm:
- Mỗi group block chứa Superblock backup, inode table, bitmap.
- Giúp phân tán metadata → tăng độ tin cậy.
- Sơ đồ đơn giản:
[Block Group 0] [Block Group 1] [Block Group 2] ...
| | |
[Inode, bitmap] [Inode, bitmap] [Inode, bitmap]
Ví dụ: EXT4 chia ổ thành nhiều block group để quản lý. Nhờ vậy, khi một vùng hỏng, vẫn có superblock backup ở group khác.
3. Mối liên hệ
- Sector: đơn vị vật lý cơ bản.
- Block: đơn vị logic của filesystem, gồm nhiều sector.
- Chunk: đơn vị phân phối dữ liệu trong RAID, gồm nhiều block hoặc sector.
- Offset: chỉ vị trí dữ liệu trên thiết bị.
- Group Block: tập hợp các block, kèm metadata, giúp quản lý dữ liệu toàn filesystem.
4. Lời khuyên
- Khi chọn block size hoặc chunk size, nên cân nhắc workload (file nhỏ vs file lớn).
- Luôn căn chỉnh offset đúng (ví dụ: partition bắt đầu tại sector 2048) để tránh lãng phí IO.
- Hiểu rõ metadata (như group block) để chuẩn bị cho tình huống phục hồi dữ liệu.
5. Kết luận
Sector, Block, Chunk, Offset và Group Block tuy khác nhau về cấp độ quản lý (từ vật lý đến logic), nhưng chúng liên kết chặt chẽ để hình thành nên toàn bộ quy trình đọc/ghi dữ liệu.
- Sector: nền tảng vật lý.
- Block: nền tảng filesystem.
- Chunk: nền tảng RAID.
- Offset: định vị dữ liệu.
- Group Block: quản lý metadata.
Việc nắm vững những khái niệm này giúp người quản trị hiểu cách dữ liệu được lưu, tối ưu hiệu năng và tăng khả năng khôi phục khi xảy ra sự cố.