GIT – I. Hệ thống file Có hai cách hiểu tùy theo ngữ cảnh: A- Một hệ thống file (file system) là một kiểu lưu trữ và tổ chức các file và dữ liệu trong file để dễ tìm kiếm và truy cập. Hiện tại trong Linux phổ biến hai kiểu hệ thống file là ext3 và ext4. B- Một hệ thống file là một cây thư mục bao gồm một thư mục gốc (/), các thư mục con và các file chứa trong đó. Trên mỗi partition chỉ có thể có một kiểu hệ thống file (được tạo ra khi format: ext3, ext4, fat, ntfs, …). Nhưng một cây thư mục có thể đặt trên nhiều partition: thư mục gốc / đặt ở partition sda2, thư mục /home đặt ở sda5, v.v… tùy ý người dùng chọn khi cài đặt. Các kiểu hệ thống file:
Đơn vị lưu trữ file trên ổ cứng (và các thiết bị lưu trữ quay hình tròn?)
Đơn vị lưu trữ file logic
Superbloc: Superblock gồm các thông tin chung về một hệ thống file: dung lượng, dung lượng block, các block đã ghi và còn trống, vị trí và dung lượng bảng inode, … Nếu superblock bị hỏng thì hệ thống file không mount được và do đó không truy cập được. Vì vậy hệ điều hành định kỳ sẽ tạo các bản backup của superblock ngoài bản chính (primary superblock). [root@localhost zxc]# dumpe2fs /dev/sda2 | grep -i superblock dumpe2fs 1.41.11 (14-Mar-2010) Primary superblock at 0, Group descriptors at 1-1 Backup superblock at 32768, Group descriptors at 32769-32769 Backup superblock at 98304, Group descriptors at 98305-98305 Nội dung chi tiết của superblock(ví dụ với partition /dev/sda2): dumpe2fs -h /dev/sda2 Nội dung chi tiết của toàn bộ hệ thống file trên một partition /dev/sda2, xuất ra thành file sda2.txt cho dễ đọc: dumpe2fs /dev/sda2 > sda2.txt Hai lệnh trên đều chạy với quyền root (với Ubuntu thêm sudo vào đầu). II. Cây thư mục II.1-inodeinode là một cấu trúc dữ liệu chứa các metadata của mỗi file, thư mục trong các hệ thống file Linux. Trong một inode có các metadata sau:
Có hai chú ý trong nội dung inode:
Mỗi inode có một số inode, tạo thành một bảng inode ghi ở một khu vực riêng trên ổ cứng. Chú ý là trong inode không có tên file. Tên file được lưu trong thư mục cùng với số inode của nó (xem lệnh ls -i dưới đây). Khi truy cập đến một file, hệ điều hành từ tên file tìm ra số inode rồi dùng số inode để đọc nội dung inode, từ đó theo các con trỏ để đọc nội dung file. Trong hình trên, lệnh ls -l liệt kê nội dung của thư mục /home/zxc. Lệnh thứ hai ls -i liệt kê các số inode của các đối tượng trong thư mục: thư mục DATA có số inode là 5, file icsw.png có số inode là 430555. Lệnh stat <path/filename> cho biết chi tiết về nội dung inode: [zxc@Man2010 ~]$ stat /home/zxc/Downloads/ND145CP.rtf File: `/home/zxc/Downloads/ND145CP.rtf’ Size: 68738 Blocks: 144 IO Block: 4096 regular file Device: 80ah/2058d Inode: 151395 Links: 1 Access: (0644/-rw-r–r–) Uid: (10001/ zxc) Gid: (10001/ zxc) Access: 2010-03-25 14:34:29.000000000 +0700 Modify: 2010-03-25 14:34:23.000000000 +0700 Change: 2010-03-25 14:34:23.000000000 +0700 Lệnh stat có nhiều option (xem stat –help), ví dụ hai lệnh sau cho biết số bloc dùng lưu file và dung lượng một block (đơn vị byte): [zxc@Man2010 ~]$ stat -c %b /home/zxc/Downloads/ND145CP.rtf 144 [zxc@Man2010 ~]$ stat -c %B /home/zxc/Downloads/ND145CP.rtf 512 III. Tên file và hard link, soft link Trong một hệ thống file, mỗi file có một và chỉ một inode, mỗi inode cũng chỉ có một số inode duy nhất. Nhưng một file có thể có nhiều tên file tùy theo số hard link trỏ đến nó. Một hard link là một liên kết (link) trỏ đến vị trí lưu một file trên ổ cứng:
Soft link (còn gọi là Symbolic link hoặc symlink) là một liên kết tạo một đường dẫn khác đến thư mục hoặc file gốc.
Tóm lại thì tên file, hardlink, softlink giống và khác nhau cái gì? Tên file giống như tên khai sinh và tên các hardlink giống như các bí danh (tên gọi khác). Chúng đều tham chiếu trực tiếp tới một số inode cụ thể và từ đó tới inode trỏ tới các block đang lưu file trên ổ cứng. Đi từ tên file hay hardlink đều thông qua số inode để đến cùng một chỗ trên ổ cứng. Softlink không tham chiếu trực tiếp đến số inode mà tham chiếu đến “cấp trung gian” là tên file (kèm theo đường dẫn ở một thư mục cụ thể), từ tên file mới đến số inode rồi inode để truy cập vào file. Vì vậy nếu “cấp trung gian” là tên file thay đổi, file bị di chuyển hoặc xóa là softlink “bơ vơ” không truy cập được vào nội dung file nữa. Hardlink chỉ tạo được với file nằm trên cùng một partition, không tạo được với thư mục hoặc với file nằm trên partition khác. Softlink tạo được với thư mục và tạo được với thư mục, file nằm trên partition khác. IV. Hệ thống file Linux có bị phân mảnh không? Về nguyên tắc thì có, nhưng phân mảnh không đáng kể và không ảnh hưởng lớn đến tốc độ truy cập file. Người dùng bình thường không cần quan tâm đến vấn đề này. V. Kiểm tra hệ thống file Hệ thống file được kiểm tra bằng lệnh fsck (file system check). Lệnh này kiểm tra theo 5 giai đoạn (phase): Phase 1: Check Blocks and Sizes – kiểm tra các inode Phase 2: Check Path-Names – kiểm tra sự tương thích giữa inode và thư mục. Phase 3: Check Connectivity – các thư mục có được kết nối vào hệ thống file ? Phase 4: Check Reference Counts – sửa các sai lệch về số link ở hai phase trên. Phase 5: Check Cylinder Groups – kiểm tra các block chưa dùng có phù hợp với bảng inode không. Mỗi lần hệ thống khởi động, lúc partition chính chưa mount, fsck tự động chạy và kiểm tra, sửa các lỗi nhỏ (nếu có thể). Nếu lỗi nặng, fsck không tự sửa được nó sẽ thông báo: /dev/sda4: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY (Tại partition /dev/sda4 có lỗi không tương thích, hãy chạy fsck bằng tay) Lệnh tương đương trong windows là chkdsk và scandisk. Điểm khác là fsck kiểm tra được cả các partition NTFS và FAT. Sau khoảng 25-30 lần khởi động, fsck sẽ thực hiện một lần kiểm tra kỹ lưỡng hệ thống file. Khi đó, quá trình boot sẽ lâu hơn thường lệ và có thông báo trên màn hình. V.1-Kiểm tra các badblocks. Badblock là những block bị hỏng vật lý, dữ liệu không ghi được vào đó hoặc ghi bị sai. Vì vậy định kỳ cần kiểm tra, đánh dấu các badblock để hệ điều hành biết, không ghi dữ liệu vào đó nữa (nhất là với các ổ cứng cũ). Có hai lệnh (chạy bằng quyền root): fsck -c /dev/sda2 (thay sda2 bằng ký hiệu partition cần kiểm tra). badblocks /dev/sda2 |