Trong bài viết dưới đây, chúng tôi sẽ giới thiệu với bạn đọc những kiến thức cơ bản về filesystem, tìm hiểu các loại filesystem, cách tạo filesystem và nhiều thông tin hữu ích khác về hệ thống tập tin này.
1. Filesystem là gì?
Filesystem là các phương pháp và các cấu trúc dữ liệu mà một hệ điều hành sử dụng để theo dõi các tập tin trên ổ đĩa hoặc phân vùng. Có thể tạm dịch filesystem là hệ thống tập tin. Đó là cách các tập tin được tổ chức trên ổ đĩa. Thuật ngữ này cũng được sử dụng để chỉ một phân vùng hoặc ổ đĩa được sử dụng để lưu trữ các tập tin hoặc loại hệ thống tập tin. Vì vậy, nếu ai đó nói "Tôi có hai filesystem" nghĩa là người dùng đó có hai phân vùng, trong đó một phân vùng lưu trữ các file, hoặc một phân vùng sử dụng "extended filesystem", nghĩa là loại filesystem.
- Tìm hiểu khái niệm cơ bản về hệ thống file trong Linux
- Tìm hiểu hệ thống tập tin và thư mục trên hệ điều hành Linux
Sự khác biệt giữa một ổ đĩa hoặc phân vùng và hệ thống tập tin được lưu trên đó là rất quan trọng. Một vài chương trình (bao gồm cả chương trình tạo ra các hệ thống tập tin) hoạt động trực tiếp trên các sector thô của một ổ đĩa hoặc phân vùng. Nếu có một hệ thống tập tin tồn tại, nó sẽ bị phá hủy hoặc hỏng hóc nghiêm trọng. Hầu hết các chương trình hoạt động trên một hệ thống tập tin, do đó chúng sẽ không hoạt động trên một phân vùng không chứa một (hoặc có chứa một loại sai).
Để một phân vùng hoặc một ổ đĩa có thể được sử dụng như một hệ thống tập tin, nó cần được khởi tạo và các cấu trúc dữ liệu của kiểu hệ thống tập tin đó cần phải được ghi vào ổ đĩa. Quá trình này được gọi là tạo hệ thống tập tin.
Hầu hết các loại hệ thống tập tin UNIX đều có cấu trúc chung tương tự nhau, mặc dù các chi tiết cụ thể khác nhau khá nhiều. Các cái niệm chủ chốt là superblock, inode, data block, directory block và indirection block. Các superlock chứa thông tin về hệ thống tập tin như một toàn thể, chẳng hạn như kích thước của nó (thông tin chính xác ở đây phụ thuộc vào hệ thống tập tin). Inode chứa tất cả các thông tin về một tập tin, ngoại trừ tên của nó. Tên được lưu trữ trong thư mục, cùng với số lượng lớn các inode. Mục nhập thư mục bao gồm tên tập tin và số lượng inode đại diện cho tập tin đó. Inode chứa số lượng lớn các khối dữ liệu, được sử dụng để lưu trữ dữ liệu trong tập tin. Có không gian cho một số khối dữ liệu trong inode, tuy nhiên, nếu cần thiết, sẽ có thêm không gian cho con trỏ tới các khối dữ liệu được phân bổ tự động. Các khối phân bổ này là các khối gián tiếp, tên chỉ ra rằng để tìm khối dữ liệu, đầu tiên người dùng phải tìm số của nó trong khối gián tiếp.
Các hệ thống tập tin UNIX thường cho phép tạo ra một lỗ hổng trong tập tin (điều này được thực hiện bằng cuộc gọi hệ thống Iseek(), kiểm tra trang hướng dẫn), có nghĩa là hệ thống tập tin chỉ đánh lừa rằng nó ở một nơi cụ thể trong tệp có 0 byte, nhưng không có sector đĩa thực tế nào được dành riêng cho địa điểm đó trong tệp (nghĩa là tập tin sẽ sử dụng ít không gian ổ đĩa hơn). Điều này thường đặc biệt xảy ra với các tệp nhị phân nhỏ, thư viện chia sẻ Linux, một vài cơ sở dữ liệu và một số trường hợp đặc biệt khác. (Các lỗ hổng được thực hiện bằng cách lưu trữ một giá trị đặc biệt như địa chỉ của khối dữ liệu trong khối gián tiếp hoặc inode. Địa chỉ đặc biệt này có nghĩa là không có khối dữ liệu nào được phân bổ cho một phần của tập tin, do đó, có một lỗ hổng trong file).
2. Filesystem galore
Linux hỗ trợ một vài loại hệ thống tập tin. Trong bài viết này, những hệ thống quan trọng nhất là:
Minix
Minix là hệ thống lâu đời nhất và được cho là đáng tin cậy nhất, nhưng nó khá hạn chế về các tính năng (một số nhãn thời gian (time stamp) bị thiếu, tối đa 30 kí tự tên tập tin) và hạn chế về khả năng (tối đa 64 MB cho mỗi filesystem)
Xia
Xia là phiên bản sửa đổi của hệ thống tập tin minix - nâng cao giới hạn về tên tập tin và kích thước hệ thống tập tin, nhưng không giới thiệu tính năng mới nào cả. Xia cũng không phổ biến lắm nhưng các báo cáo cho thấy hệ thống này hoạt động rất tốt.
Ext3
Hệ thống tập tin ext3 có tất các tính năng của ext2. Tuy nhiên, sự khác biệt là sự có mặt của journaling. Điều này cải thiện hiệu suất và thời gian phục hồi phòng khi hệ thống bị treo. Chính điều đó khiến ext3 phổ biến hơn ext2.
Ext2
Ext2 là hệ thống nhiều tính năng nhất của các tập tin hệ thống Linux đời đầu. Nó được thiết kế để dễ dàng tương thích với phiên bản mới, do đó các phiên bản code mới của hệ thống tập tin không yêu cầu viết lại hệ thống tập tin hiện có.
Ext
Là phiên bản cũ hơn của ext2, phiên bản này không tương thích với các phiên bản mới. Nó hầu như không bao giờ được sử dụng trong các cài đặt mới nữa và hầu hết người dùng đều chuyển đổi sang ext2.
Reiserfs
Là một hệ thống tập tin mạnh hơn. Việc sử dụng journaling sẽ làm mất ít dữ liệu hơn.
Jfs
JFS là một hệ thống tập tin có journaling được thiết kế bởi IBM để làm việc trong các môi trường hiệu suất cao.
Xfs
XFS được thiết kế lần đầu bởi Silicon Graphics để hoạt động như một hệ thống tập tin có journaling 64-bit. XFS cũng được thiết kế để duy trì hiệu năng cao với các file lớn và hệ thống tập tin.
Ngoài ra, hỗ trợ cho một số hệ thống tập tin bên ngoài hoạt động, để dễ dàng trao đổi các file với các hệ điều hành khác. Các hệ thống tập tin bên ngoài hoạt động giống như các chương trình gốc, ngoại trừ việc chúng thường thiếu một số tính năng UNIX thông thường hoặc có những hạn chế kì lạ khác.
Msdos
Msdos có khả năng tương thích với các hệ thống tập tin FAT của MS-DOS (gồm OS/2 và Windows NT )
Umsdos
Umsdos mở rộng driver hệ thống tập tin msdos trong Linux để nhận được tên tập tin dài, chủ sở hữu, quyền hạn, liên kết và các file thiết bị. Điều này cho phép một hệ thống tập tin msdos thông thường được sử dụng như thể nó là một Linux, do đó umsdos loại bỏ sự cần thiết cho một phân vùng riêng của Linux.
Vfat
Đây là phần mở rộng của hệ thống tập tin FAT được gọi là FAT32. Nó hỗ trợ kích thước ổ đĩa lớn hơn FAT. Hầu hết các đĩa Windows đều là vfat.
Iso9660
Iso9660 là hệ thống tập tin CD-ROM tiêu chuẩn, phần mở rộng Rock Ridge phổ biến cho tiêu chuẩn CD-ROM cho phép tên tệp dài hơn được hỗ trợ tự động.
Nfs
Nfs là một hệ thống tập tin mạng cho phép chia sẻ một filesystem giữa nhiều máy tính để cho phép dễ dàng truy cập vào các tập tin từ chúng.
Smbfs
Là một hệ thống tập tin mạng cho phép chia sẻ một filesystem với một máy tính MS Windows. Nó tương thích với các giao thức chia sẻ file Windows.
Hpfs
Là hệ thống tập tin OS/2
Sysv
Là hệ thống tập tin SystemV/386, Coherent và Xenix .
NTFS
Là hệ thống tập tin tiên tiến nhất của Microsoft cung cấp khả năng truy cập và ổn định tệp nhanh hơn các hệ thống tập tin của Microsoft trước đây.
Sự lựa chọn của hệ thống tập tin để sử dụng phụ thuộc vào tình hình. Nếu tính tương thích hoặc các lý do khác khiến cho một trong những hệ thống tập tin không phải bản gốc trở nên cần thiết, thì lựa chọn đó cần được sử dụng. Nếu có thể chọn tự do, thì có lẽ cách thông minh nhất là sử dụng ext3 bởi nó chứa tất cả các tính năng của ext2 và là một hệ thống tập tin journaling. Để biết thêm thông tin về tập tin, hãy đọc phần 5.10.6 bên dưới.
Ngoài ra còn có proc, có thể truy cập như thư mục /proc, có thể coi đây là một filesystem dù thực sự thì không phải. Hệ thống proc giúp bạn dễ dàng truy cập các cấu trúc dữ liệu nhân (kernel data structures) nhất định, chẳng hạn như danh sách tiến trình (process). Nó làm cho các cấu trúc dữ liệu trông giống như một hệ thống tập tin, và hệ thống này có thể được thao tác với tất cả các công cụ tập tin thông thường. Ví dụ, để có danh sách của tất cả các tiến trình, bạn có thể sử dụng lệnh sau:
$ ls -l /proc total 0 dr-xr-xr-x 4 root root 0 Jan 31 20:37 1 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 63 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 94 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 95 dr-xr-xr-x 4 root users 0 Jan 31 20:37 98 dr-xr-xr-x 4 liw users 0 Jan 31 20:37 99 -r--r--r-- 1 root root 0 Jan 31 20:37 devices -r--r--r-- 1 root root 0 Jan 31 20:37 dma -r--r--r-- 1 root root 0 Jan 31 20:37 filesystems -r--r--r-- 1 root root 0 Jan 31 20:37 interrupts -r-------- 1 root root 8654848 Jan 31 20:37 kcore -r--r--r-- 1 root root 0 Jan 31 11:50 kmsg -r--r--r-- 1 root root 0 Jan 31 20:37 ksyms -r--r--r-- 1 root root 0 Jan 31 11:51 loadavg -r--r--r-- 1 root root 0 Jan 31 20:37 meminfo -r--r--r-- 1 root root 0 Jan 31 20:37 modules dr-xr-xr-x 2 root root 0 Jan 31 20:37 net dr-xr-xr-x 4 root root 0 Jan 31 20:37 self -r--r--r-- 1 root root 0 Jan 31 20:37 stat -r--r--r-- 1 root root 0 Jan 31 20:37 uptime -r--r--r-- 1 root root 0 Jan 31 20:37 version $ |
Lưu ý rằng mặc dù nó được gọi là hệ thống tập tin nhưng không có một phần nào của hệ thống tập tin proc làm việc trực tiếp trên ổ đĩa. Nó chỉ tồn tại trong hệ thống ảo của nhân hệ thống. Nếu tìm kiếm các phần của hệ thống tập tin proc, nhân hệ thống khiến phần đó hiển thị ở đâu đó, dù thực tế không phải vậy. Vì thế, mặc dù có tập tin /proc/kcore nhiều MB, nó vẫn không chiếm một tí không gian ổ đĩa nào.
3. Nên sử dụng filesystem nào?
Thường có ít điểm trong việc sử dụng nhiều hệ thống tập tin. Hiện nay, ext3 là filesystem phổ biến nhất bởi nó là một hệ thống tập tin có journaling (journaling là khả năng ghi lại các hoạt động của hệ thống khi thao tác trên dữ liệu, giúp phát hiện file bị lỗi nhanh chóng mà không cần quét toàn bộ file và giúp quá trình khôi phục dữ liệu đáng tin cậy hơn). Nó là lựa chọn khôn ngoan nhất. Reiserfs cũng là một lựa chọn phổ biến bởi nó cũng có journaling. Tùy thuộc vào chi phí cho các cấu trục kế toán, tốc độ, độ tin cậy (được nhận thức), khả năng tương thích và các lý do khác, người dùng được khuyên là nên sử dụng hệ thống tập tin khác. Điều này được quyết định theo từng trường hợp cụ thể.
Một filesystem sử dụng journaling cũng được gọi là hệ thống tập tin journaling. Một hệ thống tập tin journaling duy trì bản ghi, biên bản, về những gì đã xảy ra trên hệ thống tập tin. Trong trường hợp hệ thống bị treo, hoặc nếu con bạn chạm phải nút nguồn, hệ thống tập tin journaling sẽ sử dụng bản ghi của filesystem để tái tạo những dữ liệu đã mất và chưa được lưu. Việc này khiến khả năng mất dữ liệu giảm đi và có thể sẽ trở thành một tính năng tiêu chuẩn trong các hệ thống tập tin Linux. Tuy nhiên, giống như những hệ thống khác, các lỗi vẫn có thể xảy ra. Vì vậy, hãy nhớ sao lưu dữ liệu của bạn trong trường hợp khẩn cấp.
Đọc phần 5.10.6 để biết thêm chi tiết về các tính năng của các loại hệ thống tập tin khác nhau.
4. Tạo filesystem
Các filesystem được tạo ra, tức là được khởi tạo với lệnh mkfs. Thực sự có một chương trình riêng biệt cho mỗi loại hệ thống tập tin. Mkfs chỉ là một giao diện người dùng chạy chương trình thích hợp phụ thuộc vào loại filesystem mong muốn. Loại này được chọn với tùy chỉnh -t fstype.
Các chương trình được gọi bởi mkfs có giao diện dòng lệnh hơi khác nhau. Các tùy chọn phổ biến và quan trọng nhất được tóm tắt dưới đây:
-t fstype
Chọn loại tập tin hệ thống.
-c
Tìm kiếm các khối xấu và khởi tạo danh sách chặn xấu cho phù hợp.
-l filename
Đọc danh sách chặn xấu ban đầu từ tập tin tên.
Ngoài ra còn có nhiều chương trình được viết để thêm các tùy chọn cụ thể khi tạo một hệ thống tập tin cụ thể. Ví dụ, mkfs.ext3 thêm một tùy chọn -b để cho phép các quản trị viên xác định kích thước khối cần được sử dụng. Đảm bảo để tìm ra nếu có một chương trình cụ thể có sẵn cho loại tập tin hệ thống mà bạn muốn sử dụng. Để biết thêm thông tin về việc xác định các kích cỡ khối sử dụng, xem thêm ở phần 5.10.5 bên dưới.
Để tạo một hệ thống tập tin ext2 trên đĩa mềm, cần đưa ra các lệnh sau:
$ fdformat -n /dev/fd0H1440 Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 KB. Formatting ... done $ badblocks /dev/fd0H1440 1440 $>$ bad-blocks $ mkfs.ext2 -l bad-blocks /dev/fd0H1440 mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 360 inodes, 1440 blocks 72 blocks (5.00%) reserved for the super user First data block=1 Block size=1024 (log=0) Fragment size=1024 (log=0) 1 block group 8192 blocks per group, 8192 fragments per group 360 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done $ |
Đầu tiên, đĩa mềm phải được định dạng (tùy chọn -n ngăn chặn xác nhận, nghĩa là kiểm tra khối xấu). Sau đó các khối xấu đã được tìm kiếm với badblocks, với đầu ra được chuyển hướng tới một tập tin - badblocks. Cuối cùng, hệ thống tập tin được tạo ra với danh sách chặn xấu được khởi tạo với bất kì badblocks nào được tìm thấy.
Tùy chọn -c có thể đã được sử dụng với mkfs thay vì badblocks và một tập tin riêng biệt. Hãy xem ví dụ dưới đây.
$ mkfs.ext2 -c /dev/fd0H1440 mke2fs 0.5a, 5-Apr-94 for EXT2 FS 0.5, 94/03/10 360 inodes, 1440 blocks 72 blocks (5.00%) reserved for the super user First data block=1 Block size=1024 (log=0) Fragment size=1024 (log=0) 1 block group 8192 blocks per group, 8192 fragments per group 360 inodes per group Checking for bad blocks (read-only test): done Writing inode tables: done Writing superblocks and filesystem accounting information: done $ |
Tùy chọn -c thuận tiện hơn việc sử dụng riêng các badblocks, nhưng badblocks lại cần thiết trong việc kiểm tra sau khi hệ thống tập tin được tạo ra.
Quá trình chuẩn bị các hệ thống tập tin trên các đĩa cứng hoặc phân vùng tương tự như cho các đĩa mềm, ngoại trừ việc định dạng là không cần thiết.
5. Kích thước khối filesystem
Kích thước khối xác định kích thước mà hệ thống tập tin sẽ sử dụng để đọc và ghi dữ liệu. Những kích thước khối lớn hơn sẽ giúp cải thiện hiệu suất I/O khi sử dụng các tập tin lớn, chẳng hạn như cơ sở dữ liệu. Điều này xảy ra bởi các ổ đĩa có thể đọc hoặc ghi dữ liệu trong thời gian dài hơn trước khi tìm kiếm khối kế tiếp.
Mặc khác, nếu bạn có nhiều tập tin nhỏ hơn trong filesystem, ví dụ như /etc, có khả năng là nhiều không gian ổ đĩa sẽ bị lãng phí.
Ví dụ, nếu bạn đặt kích thước khối là 4096 hoặc 4K và bạn tạo một tập tin có kích thước 256 byte, nó vẫn sẽ chiếm 4K dung lượng trên đĩa cứng của bạn. Đối với tập tin có vẻ bình thường, nhưng khi hệ thống tập tin của bạn chứa hàng trăm hoặc hàng nghìn tập tin, điều này có thể làm tăng thêm.
Kích thước khối cũng có thể ảnh hưởng đến kích cỡ tập tin được hỗ trợ tối đa trên một số hệ thống tập tin, bởi nhiều filesystem hiện đại bị giới hạn không phải bởi kích thước khối hay kích thước tập tin, mà bởi số lượng các khối. Vì vậy, bạn sẽ cần sử dụng công thức "block size * max # of blocks = max block size".
6. So sánh các loại filesystem
Bảng 1: So sánh các loại filesystem
Filesystem | Năm ra đời | Hệ điều hành gốc | Max File Size | Max FS Size | Journaling |
---|---|---|---|---|---|
FAT16 | 1983 | MSDOS V2 | 4GB | 16MB đến 8GB | N |
FAT32 | 1997 | Windows 95 | 4GB | 8GB đến 2TB | N |
HPFS | 1988 | OS/2 | 4GB | 2TB | N |
NTFS | 1993 | Windows NT | 16EB | 16EB | Y |
HFS+ | 1998 | Mac OS | 8EB | ? | N |
UFS2 | 2002 | FreeBSD | 512GB đến 32PB | 1YB | N |
ext2 | 1993 | Linux | 16GB đến 2TB4 | 2TB đến 32TB | N |
ext3 | 1999 | Linux | 16GB đến 2TB4 | 2TB đến 32TB | Y |
ReiserFS3 | 2001 | Linux | 8TB8 | 16TB | Y |
ReiserFS4 | 2005 | Linux | ? | ? | Y |
XFS | 1994 | IRIX | 9EB | 9EB | Y |
JFS | ? | AIX | 8EB | 512TB đến 4PB | Y |
VxFS | 1991 | SVR4.0 | 16EB | ? | Y |
ZFS | 2004 | Solaris 10 | 1YB | 16EB | N |
Kilobyte - KB | 1024 Bytes |
Megabyte - MB | 1024 KBs |
Gigabyte - GB | 1024 MBs |
Terabyte - TB | 1024 GBs |
Petabyte - PB | 1024 TBs |
Exabyte - EB | 1024 PBs |
Zettabyte - ZB | 1024 EBs |
Yottabyte - YB | 1024 ZBs |
Cần lưu ý rằng Exabyte, Zettabyte và Yottabyte hiếm gặp trong thực tế. Có một ước tính hiện tại rằng vật liệu in (printed material) trên thế giới bằng 5 Exabyte. Vì vậy, một vài giới hạn hệ thống tập tin được xem xét chủ yếu trên lý thuyết. Tuy nhiên, phần mềm hệ thống tập tin đã đạt được đến những kích thước này.
Trên đây chỉ là một phần nhỏ trong lý thuyết Filesystem, bài viết dài và hơi hàn lâm, trong quá trình viết không thể tránh khỏi lỗi, rất mong bạn đọc có thể đóng góp ý kiến để bài viết thêm hoàn thiện!