Các loại Filesystem và cơ hội khôi phục dữ liệu – Phần 3: Linux
Phần 1: Cơ hội khôi phục dữ liệu trên các định dạng ổ đĩa Windows – NTFS, FAT32, exFAT, ReFS
Phần 2: Các loại Filesystem và cơ hội khôi phục dữ liệu: macOS
Các loại filesystem của Linux
Không giống như Windows và macOS, Linux là một dự án nguồn mở được phát triển bởi một cộng đồng những người có cùng đam mê. Đó là lý do vì sao có rất nhiều biến thể filesystem mà bạn có thể lựa chọn: Ext2, Ext3, Ext4, ReiserFS, XFS, JFS, Btrfs and F2FS.
1. Ext2
Tất cả các tham số của FS này có thể tìm được trong Superblock. Ext2 chia không gian lưu trữ thành các đơn vị nhỏ gọi là block. Các block này được sắp xếp thành các đơn vị lớn hơn gọi là Block Group. Thông tin về tất cả các Block Group có trong Bảng mô tả được lưu trữ ngay sau Superblock. Mỗi Block Group cũng chưa Block Bitmap và Inode Bitmap để theo dõi trạng thái các block và inode của chúng. Inode là khái niệm cốt lõi của Ext2. Nó được sử dụng để mô tả mọi tệp và thư mục trong FS, bao gồm kích thước và vị trí của các block chứa dữ liệu thực tế. Các inode của mỗi Block Group được lưu trong Inode Table của chúng.
Tuy nhiên, theo như loại FS này, tên gọi không được coi là metadata. Tên được lưu trữ riêng trong các tệp thư mục đặc biệt, cùng với số inode tương ứng. Trong hình dưới đây, bạn có thể thấy mối quan hệ giữa các thành phần chính của cấu trúc Ext2 – Superblock, Block Group, Inode Table, inode:
Đối với lệnh xóa
Nguyên lý: Ext2 gắn nhãn inode mô tả tệp là trống và cập nhật các Block Bitmap, Inode Bitmap. Bản ghi liên kết với số inode cụ thể sẽ bị xóa khỏi tệp thư mục.
Cách phục hồi: Nếu sử dụng thông tin còn sót lại trong inode thì khả năng lấy lại file đã xóa là khá cao. Tuy nhiên, do tên file không được lưu trong inode và liên kết đến nó không còn tồn tại nên rất có thể ta sẽ mất nó vĩnh viễn.
Đối với lệnh định dạng
Nguyên lý: Ext2 xóa các Block Group hiện hữu và các inode.
Cách phục hồi: Phương pháp khôi phục RAW có thể được áp dụng để khôi phục các tệp theo nội dung đã biết của chúng. Khả năng phục hồi dữ liệu phụ thuộc rất nhiều vào mức độ phân mảnh: nếu bị phân mảnh, các tệp có thể bị lỗi.
2. Ext3/Ext4
Lợi ích chính của Ext3 so với Ext2 là nó được bổ sung thêm tính năng ghi nhật ký. Nhật ký được triển khai dưới dạng một tệp đặc biệt để theo dõi tất cả các sửa đổi đối với filesystem.
Ext4 là kết quả của việc mở rộng Ext3 với cấu trúc filesystem mới. Đáng chú ý nhất là extent. Thay vì phân bổ nội dung cho từng block riêng lẻ, Ext4 đặt càng nhiều dữ liệu càng tốt vào cùng một khu vực liên tục. Khu vực này được mô tả bằng địa chỉ của block bắt đầu và độ dài của chúng trong khối. Những extent như vậy có thể được lưu trữ trực tiếp trong inode. Tuy nhiên, khi một tệp có nhiều hơn 4 extent, phần còn lại sẽ được sắp xếp dưới dạng B+tree. Ext4 cũng sử dụng phân bổ trễ – cơ chế này thu thập những dữ liệu phải được ghi vào bộ lưu trữ trước khi phân bổ vào không gian thực tế, do đó sự phân mảnh được hạn chế ở mức tối thiểu.
Trong hình bên dưới, bạn có thể thấy mối quan hệ giữa các thành phần chính của cấu trúc Ext3/Ext4 – Superblock, Nhật ký, Blick Group, Inode Table, inode:
Đối với lệnh xóa
Nguyên lý: FS tạo một entry trong Nhật ký và sau đó xóa node liên quan. Bản ghi thư mục không bị xóa hoàn toàn mà thay vào đó thứ tự đọc thư mục sẽ bị thay đổi.
Cách phục hồi: Có thể truy xuất các tệp đã xóa ngay cả với tên ban đầu của chúng bằng các entry Nhật ký. Tuy nhiên, chất lượng của kết quả khôi phục còn phụ thuộc vào khoảng thời gian filesystem vẫn hoạt động sau lệnh xóa.
Đối với lệnh định dạng
Nguyên lý: Tất cả các Block Group cũng như tệp inode và thậm chí cả Nhật ký đều bị xóa. Dù vậy, Nhật ký vẫn có thể chứa thông tin về một số tệp được tạp gần đây.
Cách phục hồi: Việc khôi phục các tập tin bị mất chỉ có thể được thực hiện với sự trợ giúp của phương pháp khôi phục RAW. Tuy nhiên, khả năng thành công là rất thấp trong trường hợp chúng bị phân mảnh.
3. ReiserFS
Phân vùng ReiserFS được chia thành các khối có kích thước cố định. Những thông tin quan trọng nhất về nó có sẵn trong Superblock. Ngay sau Superblock có một bitmap về các block đã được sử dụng và còn trống.
FS dựa hoàn toàn vào cấu trúc được gọi là S+tree, được tạo thành từ các nút lá nội bộ. Những cây như vậy được sử dụng để sắp xếp tất cả các tệp, thư mục và metadata. Có 4 loại mục cơ bản trong cây: mục gián tiếp, mục trực tiếp, mục thư mục và mục chỉ số. Các mục trực tiếp chứa dữ liệu thực tế, trong khi các mục gián tiếp chỉ trỏ đến các block dữ liệu nhất định. Các mục thư mục đại diện cho các entry trong thư mục còn các mục chỉ số chứa thông tin chi tiết về các tệp và thư mục. Mỗi mục được gán một khóa duy nhất và có thể sử dụng để định vị chúng trong cây. Khóa chứa mã định danh, điah chỉ và loại mục.
ReiserFS áp dụng một cơ chế đặc biệt gọi là tail-packing. Nó kết hợp các tệp và mảnh tệp tin nhỏ hơn một block đầy đủ và lưu trữ chúng trực tiếp trong các nút lá của S+tree. Cách tiếp cận này giúp giảm không gian lưu trữ bị lãng phí và mức độ phân mảnh.
Nhật ký ghi lại tất cả các sửa đổi được thực hiện với filesystem. Thay vì tiến hành các thay đổi trực tiếp trêm S+tree, ReiserFS sẽ ghi chúng vào Nhật ký trước tiên. Sau đó, chúng sẽ được sao chép từ Nhật ký đến một vị trí thực tế trên bộ lưu trữ. Vì vậy, ReiserFS có thể lưu trữ nhiều bản sao metadata.
Trong hình bên dưới, bạn có thể thấy mối quan hệ giữa các thành phần chính của cấu trúc ReiserFS – Superblock, S+tree và các thư mục cây:
Đối với lệnh xóa
Nguyên lý: ReiserFS cập nhật S+tree để loại bỏ tệp và thay đổi trạng thái của các block tương ứng trong bitmap.
Cách phục hồi: Vì bản sao của S+tree được giữ nguyên nên ta có thể khôi phục tất cả các tệp, bao gồm cả tên của chúng. Hơn thế nữa, phiên bản trước của tệp có thể được lấy ra từ bản sao cũ hơn của S+tree.
Đối với lệnh định dạng
Nguyên lý: ReiserFS tạo ra một S+tree mới trên cái đã có.
Cách phục hồi: Bản S+tree cũ có thể được lấy ra từ bản sao lưu, cho phép khôi phục dữ liệu hoàn chỉnh. Tuy nhiên, nếu phân vùng đã đầy thì cơ hội này là rất nhỏ. Trong các trường hợp như vậy filesystem có thể ghi thông tin mới lên trên dữ liệu cũ.
4. XFS
XFS bao gồm các vùng có kích thước bằng nhau được gọi là các Nhóm phân bổ (Allocation Group). Mỗi Nhóm phân bổ hoạt động giống như một filesystem có Superblock riêng, duy trì cấu trúc và cách sử dụng không gian lưu trữ của riêng mình. Không gian trống được theo dõi bằng cách sử dụng một cặp B+tree: cái đầu tiên biểu thị block bắt đầu của vùng không gian trống liền kề còn cái thứ 2 hiển thị số block trong đó. Cách tiếp cận dựa trên phạm vi (extent) tương tự được sử dụng để theo dõi các block được gán cho mỗi tệp.
Tất cả tệp và thư mục trong XFS được thể hiện bằng các cấu trúc inode đặc biệt chứa metadata của chúng. Nếu có thể, việc phân bổ các extent sẽ được lưu trữ trực tiếp trong inode. Đối với các tệp lớn hoặc bị phân mảnh, extent sẽ được theo dõi bởi một B+tree khác liên kết với nút. Một B+tree riêng biệt được sử dụng trom Nhóm phân bổ để giữ các bản ghi nút này khi chúng được phân bổ và làm trống.
Cũng như nhiều filesystem tương tự, XFS không lưu tên tệp trong nút. Tên chỉ tồn tại trong các đường dẫn thư mục. XFS thực hiện ghi nhật ký cho các thao tác với metadata. Nhật ký lưu trữ các thay đổi đối với nó cho đến khi các bản cập nhật thực tế được thực hiện.
Trong hình bên dưới, bạn có thể thấy mối quan hệ giữa các thành phần chính của cấu trúc XFS – Nhóm phân bổ, Superblock, cấu trúc S+tree, nút:
Đối với lệnh xóa
Nguyên lý: Nút chịu trách nhiệm về tệp bị loại khỏi B+tree, hầu hết các thông tin trong đó đều bị ghi đè, tuy nhiên, dữ liệu extent vẫn còn nguyên vẹn. Tham chiếu giữa đường dẫn thư mục và tên tệp đã bị mất.
Cách phục hồi: XFS giữ các bản sao metadata trong Nhật ký, cho phép khôi phục thành công các tệp bị mất. Ta có khả năng cao lấy lại những dữ liệu đã mất, thậm chí là cả tên tệp chính xác.
Đối với lệnh định dạng
Nguyên lý: B+tree quản lý việc phân bổ không gian bị xóa và thư mục gốc mới sẽ ghi đè lên thư mục hiện có.
Cách phục hồi: Cơ hội khôi phục các tệp nằm xa điểm bắt đầu của bộ lưu trữ sẽ cao hơn là những điểm ở gần.
5. JFS
Những thông tin quan trọng về JFS nằm trong Superblock. Một volume JFS có thể bao gồm nhiều vùng được gọi là Nhóm phân bổ (Allocation Groups). Mỗi nhóm phân bổ có một hoặc nhiều FileSet.
Mỗi tệp và thư mục trong filesystem được mô tả bằng nút của nó. Ngoài việc lưu trữ thông tin nhận dạng, nút còn trỏ đến vị trí lưu trữ nội dung của tệp. Bản thân nội dung được thể hiện bằng một hoặc nhiều extent. Mỗi extent được tạo thanh từ một hoặc nhiều block liền kề. Tất cả các extent đều được lập chỉ mục bằng một B+tree đặc biệt.
Nội dung của các thư mục nhỏ được lưu trữ trong các nút của chúng, trong khi đó, các thư mục lớn hơn được tổ chức dưới dạng B+tree. Không gian trống trong JFS cũng được truy xuất bằng cách sử dụng B+tree: một cái được dùng cho các block bắt đầu của extent trống, và một cái để ghi lại số lượng extent trống. JFS có một khu vực log chuyên biệt và ghi chép Nhật ký mỗi khi có sự thay đổi về metadata.
Trong hình bên dưới, bạn có thể thấy mối quan hệ giữa các thành phần chính của cấu trúc JFS – Superblock, Nhóm phân vùng, FileSet, B+tree, Nhật ký, nút:
Đối với lệnh xóa
Nguyên lý: JFS cập nhật B+tree của không gian trống và giải phóng nút liên kết với tệp. Thư mục được xây dựng lại để phản ánh những thay đổi đó.
Cách phục hồi: Nút vẫn được giữ trên bộ lưu trữ sẽ tăng khả năng phục hồi tệp lên đến gần 100%. Cơ hội phục hồi với tên tệp tương đối thấp.
Đối với lệnh định dạng
Nguyên lý: JFS tạo một B+tree mới. Kích thước ban đầu của nó khá nhỏ và sẽ được mở rộng hơn khi filesystem hoạt động nhiều hơn.
Cách phục hồi: Cơ hội phục hồi các tệp bị mất sau khi format là khá cao nhờ vào kích thước nhỏ của B+tree mới.
6. Btrfs
Cũng như nhiều filesystem khác, Btrfs bắt đầu bằng Superblock – nơi cung cấp những thông tin thiết yếu về bố cục của nó. Các phần tử khác được biểu diễn dưới dạng B-tree với những mục đích riêng. Vị trí của Gốc B-tree có thể được tìm thấy trong Superblock và nó chứa các tham chiếu đến phần còn lại của B-tree. Bất kỳ B-tree nào cũng bao gồm các nút và lá: nút nội bộ liên kết với các nút con hoặc lá, trong khi đó, lá chứa đựng một số mục có thông tin thực tế. Cấu trúc và nội dung chính xác của một mục phụ thuộc vào loại B-tree được cho.
Một trong những tính năng nổi bật của Btrfs là nó có thể trải rộng trên nhiều thiết bị, nơi không gian của chúng được kết hợp thành một nhóm chung duy nhất. Sau đó, mỗi block lưu trữ vật lý được gán một địa chỉ ảo. Những địa chỉ này sẽ được sử dụng bởi các cấu trúc FS khác. Thông tin về sự đối ứng giữa địa chỉ ảo và địa chỉ vật lý thể hiện trong Chunk B-tree. Nó cũng sẽ nhận biết được các thiết bị tạo thành nhóm. Ngược lại, Device B-tree liên kết các block vật lý trên các thiết bị cơ sở với địa chỉ ảo của chúng.
B-tree của Hệ thống tệp tổ chức tất cả thông tin về tệp và thư mục. Các tệp nhỏ có thể được lưu trữ trực tiếp trên cây bên trong các mục phạm vi. Các tệp lớn hơn được lưu bên ngoài các khu vực liền kề được gọi là extent. Trong trường hợp này, mục phạm vi sẽ tham chiếu đến tất cả extent sở hữu dữ liệu của tệp thực tế. Các mục directory tạo ra nội dung của các thư mục, bao gồm tên tệp và trỏ đến các mục nút của chúng. Các mục nút được sử dụng cho các thuộc tính khác nhau, ví dụ như kích thước, phân quyền, v.v.
Extent B-tree theo dõi các extent được phân bổ trong các mục phạm vi. Nó hoạt động giống như một bản đồ các khoảng không gian trống. Trong B-tree đã được mô tả, việc sửa đổi không bao giờ được thực hiện ngay tại chỗ. Thay vào đó, các thông tin sửa đổi được ghi vào một vị trí khác. Kỹ thuật này còn được gọi là Copy-on-Write. Tuy nhiên, trên các ổ SSD, Btrfs có thể phát hiện các extent được đánh dấu là không sử dụng và tự động xóa chúng bằng cách khởi chạy lệnh TRIM.
Đối với lệnh xóa
Nguyên lý: Brtfs xây lại B-tree của filesystem nhằm loại trừ các nút được liên kết với tệp và giải phóng các extent được phân bổ cho nó trong Extent B-tree. Tất cả các cấu trúc liên kết đều được cập nhật.
Cách phục hồi: Các mục cần thiết không còn là một phần của cấu trúc FS. Tuy nhiên, vì Brtfs hoạt động trên nguyên tắc Copy-on-Write, ta có thể truy cập các bản copy cũ hơn, (bao gồm cả những phiên bản trước của File System B-tree) phân tích và truy xuất thành công tệp đã xóa, miễn là nội dung và metadata của nó chưa bị ghi đè.
7. F2FS
F2FS được thiết kế với những đặc tính của bộ lưu trữ flash. Nó chia toàn bộ không gian thành các đoạn có kích thước cố định. Một phần gồm các đoạn nối tiếp nhau và một tập hợp các phần bao gồm một vùng (zone). Superblock được tìm thấy ở đầu phân vùng F2FS. Nó chứa các thông tin cơ bản về chính nó và vị trí các khu vực quan trọng khác. Có một bản sao thứ hai của Superblock cho mục đích dự phòng. Các block Checkpoint lưu trữ các điểm khôi phục cho trạng thái cũ và hiện tại của các thành phần hệ thống tệp quan trọng.
Vị trí của dữ liệu được quản lý bằng các cấu trúc nút đặc biệt. Các nút này có 3 loại: nút gián tiếp, nút trực tiếp và inode. Một nút trực tiếp lưu địa chỉ của các block dữ liệu thực tế, nút gián tiếp liên kết đến các block trong các nút khác và inode chứa metadata, bao gồm tên, kích thước tệp và các thuộc tính khác. Việc ánh xạ các nút tới vị trí vật lý của chúng trong filesystem được lưu trữ trong Node Address Table (NAT).
Nội dung các tập tin và thư mục được lưu trữ trong Main Area. Các phần trong đó tách các block chứa dữ liệu khỏi các block nút bằng thông tin lập chỉ mục. Trạng thái sử dụng của tất cả các loại block được biểu thị trong Segment Information Table (SIT) – những block đang sử dụng được gắn nhãn là hợp lệ và những block chưa dữ liệu đã xóa được coi là không hợp lệ. Segment Summary Area (SSA) ghi lại block nào thuộc về nút nào.
Đường dẫn thư mục trong FFS được gọi là dentry. Dentry chứa tên tệp và số nút của chúng. F2FS thực hiện dọn dẹp khi không có đủ phân đoạn trống và ở chế độ nền khi hệ thống không hoạt động. Trong trường hợp này, các phân đoạn mục tiêu được chọn dựa trên số lượng block được sử dụng theo SIT hoặc theo tuổi thọ của chúng.
Đối với lệnh xóa
Nguyên lý: Các thay đổi được thực hiện đối với Node Address Table (NAT) và Segment Info Table (SIT). Thông tin này được lưu trữ trong bộ nhớ cho đến khi một checkpoint mới được tạo ra và ghi vào Checkpoint block. Nội dung của các block được giải phóng vẫn còn nguyên cho đến khi bị xóa trong quá trình làm sạch bộ nhớ.
Cách phục hồi: Sử dụng checkpoint gần đây, ta có thể truy cập trạng thái trước đó của metadata filesystem và xác định vị trí nút và các block dữ liệu được liên kết với tệp, trừ khi chúng bị ghi đè.
Phần 4: Các loại filesystem của BSD, Solaris, Unix