Hệ ñiều hành UNIX-Linux
Chương 3. Hệ thống File
Linux operating system - Nguyen Tri Thanh
1
Khái niệm cơ bản
Một đối tượng điển hình trong các hệ điều hành đó là file
File là một tập hợp dữ liệu có tổ chức được hệ điều hành quản
lý
Cách tổ chức dữ liệu trong file thuộc về người ñã tạo ra file
File có thể là:
một văn bản (trường hợp ñặc biệt là chương trình nguồn
trên C, PASCAL, shell script ...)
một chương trình ngơn ngữ máy,
Hệ điều hành tổ chức việc lưu trữ nội dung file trên các thiết
bị nhớ lâu dài và ñảm bảo các thao tác lên file.
Linux operating system - Nguyen Tri Thanh
2
Khái niệm cơ bản
Hệ ñiều hành ñảm bảo các chức năng liên quan đến file nên
người dùng khơng cần biết file của mình lưu ở vùng nào trên
đĩa từ, bằng từ cách nào ñọc/ghi lên các vùng của ñĩa từ mà
vẫn thực hiện được u cầu tìm kiếm, xử lý lên các file
Hệ ñiều hành quản lý file theo tên gọi của file (tên file) và
một số thuộc tính liên quan đến file
Hệ điều hành khơng chỉ quản lý nội dung file mà cịn phải
quản lý các thơng tin liên quan ñến các file.
Thư mục (directory) là ñối tượng ñược dùng để chứa
thơng tin về các file
Các thư mục cũng ñược hệ ñiều hành quản lý trên vật dẫn
ngoài và vì vậy thư mục cũng được coi là file
Linux operating system - Nguyen Tri Thanh
3
File trong Linux - UNIX
Tên file trong Linux có thể dài > 256 ký tự
Nên chỉ gồm các chữ cái, chữ số, dấu gạch nối, gạch chân,
dấu chấm
Tên thư mục/file trong Linux có thể có nhiều hơn một dấu
chấm: This_is.a.VERY_long.filename
Xâu con của tên file từ dấu chấm cuối cùng ñược gọi là phần
mở rộng của tên file
Phần mở rộng ở ñây không mang ý nghĩa như một số hệ ñiều
hành khác (chẳng hạn như MS-DOS)
Phân biệt chữ hoa và chữ thường ñối với tên thư mục/file
Nếu trong tên thư mục/file có chứa khoảng trống, đặt tên vào
trong cặp dấu nháy kép: # mkdir “My document”
Một số ký tự khơng được sử dụng trong tên thư mục/file: !, *,
$, &, # ...
Linux operating system - Nguyen Tri Thanh
4
Cách tổ chức file
Trên ñĩa hệ thống file là dãy tuần tự các khối lôgic mỗi khối
chứa hoặc 512B hoặc 1024B hoặc bội của 512B
Các khối dữ liệu ñược ñịa chỉ hóa bằng cách đánh chỉ số liên
tiếp, mỗi địa chỉ ñược chứa trong 4 byte (32 bit)
Cấu trúc nội tại gồm 4 thành phần kế tiếp nhau: Boot block
(dùng ñể khởi ñộng hệ thống), Siêu khối (Super block), Danh
sách inode và Vùng dữ liệu.
Linux operating system - Nguyen Tri Thanh
5
Siêu khối
Chứa thơng tin liên quan đến trạng thái của hệ thống file
Kích thước của danh sách inode
Kích thước của hệ thống file.
Danh sách chỉ số các khối rỗi
Chỉ số các khối rỗi thường trực trên siêu khối
Chỉ số của khối rỗi tiếp theo trong danh sách các khối rỗi
Một danh sách các inode rỗi
Danh sách này chứa chỉ số các inode rỗi ñược dùng ñể phân phối
ngay ñược cho một file mới ñược khởi tạo
Cờ chỉ dẫn rằng hệ thống file chỉ có thể đọc (cấm ghi)
Số lượng tổng cộng các khối rỗi trong hệ thống file
Số lượng tổng cộng các inode rỗi trong hệ thống file
Thông tin về thiết bị
Kích thước khối của hệ thống file
Linux operating system - Nguyen Tri Thanh
6
Linux operating system - Nguyen Tri Thanh
Cấu trúc thư mục
7
Kiến trúc hệ thống file
Linux operating system - Nguyen Tri Thanh
8
Hình ảnh các khối bộ nhớ
Linux operating system - Nguyen Tri Thanh
9
Cấu trúc thư mục
Nội dung của một thư mục là một danh sách các file entry
Mỗi một file entry gồm
Số hiệu inode quản lý file này
Tên file
ðộ dài của tên file
ðộ dài của entry
Inode No
File name
File name length
Entry length
320
a.txt
5
7
Thông tin một file entry
Linux operating system - Nguyen Tri Thanh
10
Cấu trúc thư mục
Khi một file bị xóa thì trường entry length của file ñứng trước sẽ ñược
tăng ñộ dài
Khi chèn thêm một file entry, nó sẽ tính tốn độ dài của entry ñể quyết
ñịnh là chèn vào một entry bị xóa nào đó hay cuối danh sách
Linux operating
system
- Nguyen
Tri Thanh
Trạng thái
của
thư mục
11
Inode
Khi tạo một file mới, hệ thống sẽ cấp một inode chưa sử dụng
inode cho ta biết các khối dữ liệu của file và các thông tin về file
Tổ hợp gồm inode + tập các khối dữ liệu = file vật lý
Các inode có chỉ số: số thứ tự của inode trong danh sách inode
Hệ thống dùng 2 bytes ñể lưu trữ chỉ số của inode
Một file chỉ có một inode + một hoặc một số tên file
Người dùng tác ñộng thông qua tên file và tên file lại tham chiếu
ñến inode
Linux dùng một vùng bộ nhớ chứa danh sách các inode: in-core
inode
Linux operating system - Nguyen Tri Thanh
12
Cấu trúc Inode
Kiểu file (file thơng thường, thư mục, đặc tả kí tự, đặc tả khối,
ống dẫn)
Kiểu file có giá trị 0 tương ứng đó là inode chưa được sử dụng
Quyền truy nhập file: có 3 mức quyền truy nhập
chủ của file
nhóm người dùng của chủ nhân của file
người dùng khác
Quyền truy nhập là ñọc (r), ghi (w), thực hiện (x) hoặc một tổ
hợp nào đó từ nhóm gồm 3 quyền trên
Quyền thực hiện ñối với một thư mục tương ứng với việc cho
phép tìm một tên file có trong thư mục đó
Linux operating system - Nguyen Tri Thanh
13
Cấu trúc Inode (tiếp)
Số lượng liên kết ñối với inode (số lượng các tên file)
ðịnh danh chủ nhân của inode
ðịnh danh nhóm chủ nhân
ðộ dài của file tính theo byte
Thời gian truy nhập file
thời gian file ñược sửa ñổi muộn nhất
thời gian file ñược truy nhập muộn nhất
thời gian file ñược khởi tạo
13 phần tử ñịa chỉ
10 phần tử trực tiếp
1 phần tử gián tiếp bậc 1
1 phần tử gián tiếp bậc 2
1 phần tử gián tiếp bậc 3
Linux operating system - Nguyen Tri Thanh
14
Cácsystem
con trỏ
dữ liệu
Linux operating
- Nguyen
Tri Thanh
15
Nội dung của một Inode
type regular
perms rwxr-xr-x
links 2
owner 41CT
group 41CNTT
size 5703 bytes
accessed Sep 14 1999 7:30 AM
modified Sep 10 1999 1:30 PM
inode Aug 1 1995 10:15 AM
Các phần tử ñịa chỉ dữ liệu
Linux operating system - Nguyen Tri Thanh
16
Truy cập ñến một file
Linux operating system - Nguyen Tri Thanh
17
Linux operating system - Nguyen Tri Thanh
18
Thuật tốn truy nhập tới inode (iget)
Tình huống địi hỏi thuật toán iget: mở / tạo một file mới …
iget cấp phát một bản in-core inode ñối với một số hiệu inode
Nếu chưa có bản sao in-core inode thì để có nội dung của nó cần
phải đọc được nội dung của inode
Nếu mỗi inode ñĩa chiếm 64 bytes, mỗi khối ñĩa chứa 8 inode ñĩa
thì inode số 8 sẽ bắt ñầu từ byte thứ 448 trên khối ñĩa ñầu tiên
trong vùng danh sách các inode.
Linux operating system - Nguyen Tri Thanh
19
Thuật toán iget
Vào: hệ thống file, số hiệu inode
Ra: inode ñược khóa hoặc mã lỗi
while (not done){
if (inode trong vùng đệm các inode){
/*có q trình đang làm việc với inode*/
if (inode đã bị khóa) {
sleep (cho đến khi inode được mở khóa);
continue;
/* quay về while */
}
if (inode tồn tại trong danh sách các inode rỗi)
Loại bỏ nó khỏi danh sách các inode rỗi;
Tăng giá trị trường số file tích cực trong in-core inode;
return (inode)
}
if (danh sách các inode rỗi rỗng) return (mã lỗi)
Loại bỏ một inode mới từ danh sách các inode rỗi;
ðặt lại số lượng inode rỗi vào hệ thống file;
Loại bỏ inode đó trên hàng đợi cũ và ñặt nó lên hàng ñợi mới;
ðọc inode từ ñĩa vào in-core inode;
Khởi tạo inode;
return (inode)
}
Linux operating system - Nguyen Tri Thanh
20
Thuật tốn iput
Vào: con trỏ tới in-core inode
Ra: khơng có
{
if (inode chưa bị khóa) Khóa inode;
Giảm trường số lượng file tích cực đi một đơn vị;
if (số lượng file tích cực ==0)
{
if (số liên kết của inode ==0) {
Giải phóng các khối ñĩa của file tương ứng với inode;
ðặt giá trị trường "file type" của inode là 0;
Giải phóng inode;
}
if (file ñã truy cập hoặc inode bị thay ñổi hoặc file ñã thay ñổi)
Cập nhật inode trên ñĩa;
ðặt inode vào danh sách các inode rỗi;
}
Tháo khóa của inode;
}
Linux operating system - Nguyen Tri Thanh
21
Thuật tốn iname
if (path_name bắt đầu từ thư mục gốc)
working_inode = inode của thư mục gốc;
/* thuật toán
iget */
else
working_inode = inode của thư mục hiện tại;
/* thuật toán iget */
while (thành phần ñã xử lý chưa là thành phần cuối cùng của path_name) {
ñọc thành phần tiếp theo của path_name từ dịng vào;
xác minh quyền truy cập của q trình ñối với working_inode là ñúng ñắn;
if (working_inode là gốc và thành phần tiếp theo là "/")
continue;
/* quay lại while */
ñọc từ ñĩa nội dung thư mục working_inode;
/* nhờ các thuật toán như bmap, bread và brelse */
if (thành phần trùng với một ñiểm vào của thư mục working_inode)
{
nhận số hiệu inode từ thành phần đã gặp;
giải phóng working_inode;
/* nhờ iput */
working_inode = inode của thành phần đã gặp;
/* thuật tốn iget*/
}
else /*khơng có thành phần ở thư mục*/
return (khơng có inode);
}
Linux operating system - Nguyen Tri Thanh
return (working_inode);
22
Thuật toán ialloc
while (true)
{
if (super block của hệthống file bị khóa){
sleep (cho tới khi super block khơng bị khóa);
continue;
}
if (nếu danh sách các inode rỗi trên super block đã rỗng){
Khóa super block;
Lấy inode nhớ trên super block;
Tìm kiếm các inode chưa sử dụng trên ñĩa lên super block cho ñến khi đầy;
Mở khóa super block;
wakeup (cho tới khi super block rỗi);
if (khơng có inode trên đĩa) return (khơng có inode);
ðặt inode nhớ là inode tiếp theo tìm được cuối cùng;
}
Lấy số hiệu của inode từ danh sách các inode trên super block;
Lấy inode;
if (tất cả inode không rỗi) {
Ghi inode lênñĩa; Loại bỏ inode;continue;
}
Thiết lập các giá trị cho inode;
Ghi inode lên ñĩa;
Giảm tổng số các inode rỗi trên hệ thống file;
return (inode);
Linux operating system - Nguyen Tri Thanh
}
23
Thuật tốn ialloc – trường hợp danh sách khơng rỗng
Trước khi gán: 48 là số hiệu inode tiếp theo
Sau khi gán: 48 đã được cung cấp cho nhu cầu, vì vậy 83 trở thành
chỉ số tiếp
Linux operating system - Nguyen Tri Thanh
24
Thuật toán ialloc – trường hợp danh sách rỗng
Trước khi gán: danh sách inode rỗi trên super block là rỗng, do 470
là chỉ số tiếp nên tìm từ số hiệu 471 trở đi
Sau khi tìm kiếm có được danh sách rỗi và 471 là số hiệu inode
cần gán; lúc này, 535 trở thành chỉ số inode tiếp theo
Linux operating system - Nguyen Tri Thanh
25