Giáo trình Hệ điều hành Unix - Linux
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hệ điều hành Unix - Linux", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- giao_trinh_he_dieu_hanh_unix_linux.doc
Nội dung text: Giáo trình Hệ điều hành Unix - Linux
- ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ === HÀ QUANG THỤY NGUYỄN TRÍ THÀNH Giáo trình: HỆ ĐIỀU HÀNH UNIX - LINUX Dành cho sinh viên ngành Công nghệ thông tin, Điện tử - Viễn thông, Toán tin ứng dụng HÀ NỘI - 2004
- MỤC LỤC LỜI GIỚI THIỆU6 CHƯƠNG 1. GIỚI THIỆU CHUNG VỀ LINUX 7 1.1. Giới thiệu về UNIX và Linux 7 1.1.1. Xuất xứ, quá trình tiến hóa và một số đặc trưng của hệ điều hành UNIX 7 1.1.2. Giới thiệu sơ bộ về Linux 9 1.2. Sơ bộ về các thành phần của Linux 12 1.2.1. Sơ bộ về nhân 13 1.2.2. Sơ bộ về shell 13 1.3. Giới thiệu về sử dụng lệnh trong Linux 14 1.3.1. Các quy ước khi viết lệnh 16 1.3.3. Làm đơn giản thao tác gõ lệnh 18 1.3.4. Tiếp nối dòng lệnh 20 1.4. Trang Man 21 CHƯƠNG 2. THAO TÁC VỚI HỆ THỐNG 23 2.1. Quá trình khởi động Linux 23 2.2. Thủ tục đăng nhập và các lệnh thoát khỏi hệ thống 24 2.2.1. Đăng nhập 24 2.2.2. Ra khỏi hệ thống 25 2.2.3. Khởi động lại hệ thống 26 2.2.4. Khởi động vào chế độ đồ hoạ 27 2.3. Lệnh thay đổi mật khẩu 29 2.4. Lệnh xem, thiết đặt ngày, giờ hiện tại và xem lịch trên hệ thống 31 2.4.1 Lệnh xem, thiết đặt ngày, giờ 31 2.4.2. Lệnh xem lịch 32 2.5. Xem thông tin hệ thống 33 2.6. Thay đổi nội dung dấu nhắc shell 34 2.7. Lệnh gọi ngôn ngữ tính toán số học 35 CHƯƠNG 3. HỆ THỐNG FILE 38 3.1 Tổng quan về hệ thống file 38 3.1.1. Một số khái niệm 38 3.1.2. Sơ bộ kiến trúc nội tại của hệ thống file 40 3.1.3. Một số thuật toán làm việc với inode 44 3.1.4. Hỗ trợ nhiều hệ thống File 46 3.1.5. Liên kết tượng trưng (lệnh ln) 48 1
- 3.2 Quyền truy nhập thư mục và file 49 3.2.1 Quyền truy nhập 49 3.2.2. Các lệnh cơ bản 52 3.3 Thao tác với thư mục 55 3.3.1 Một số thư mục đặc biệt 55 3.3.2 Các lệnh cơ bản về thư mục 57 3.4. Các lệnh làm việc với file 60 3.4.1 Các kiểu file có trong Linux 60 3.4.2. Các lệnh tạo file 61 3.4.3 Các lệnh thao tác trên file 62 3.4.4 Các lệnh thao tác theo nội dung file 69 3.4.5 Các lệnh tìm file 76 3.5 Nén và sao lưu các file 82 3.5.1 Sao lưu các file (lệnh tar) 82 3.5.2 Nén dữ liệu 84 CHƯƠNG 4. QUẢN TRỊ QUÁ TRÌNH 87 4.1 Quá trình trong UNIX 87 4.1.1. Sơ bộ về quá trình 87 4.1.2. Sơ bộ cấu trúc điều khiển của UNIX 87 4.1.3. Các hệ thống con trong nhân 88 4.1.4. Sơ bộ về điều khiển quá trình 91 4.1.5. Trạng thái và chuyển dịch trạng thái 92 4.1.6. Sự ngưng hoạt động và hoạt động trở lại của quá trình 93 4.1.7. Sơ bộ về lệnh đối với quá trình 93 4.2. Các lệnh cơ bản 94 4.2.1. Lệnh fg và lệnh bg 94 4.2.2. Hiển thị các quá trình đang chạy với lệnh ps 96 4.2.3. Hủy quá trình với lệnh kill 97 4.2.4. Cho máy ngừng hoạt động một thời gian với lệnh sleep 98 4.2.5. Xem cây quá trình với lệnh pstree 99 4.2.6. Lệnh thiết đặt lại độ ưu tiên của quá trình nice và lệnh renice 100 CHƯƠNG 5. QUẢN LÝ TÀI KHOẢN NGƯỜI DÙNG 101 5.1 Tài khoản người dùng 101 5.2 Các lệnh cơ bản quản lý người dùng 101 5.2.1 File /etc/passwd 101 5.2.2 Thêm người dùng với lệnh useradd 102 5.2.3 Thay đổi thuộc tính người dùng 104 5.2.4 Xóa bỏ một người dùng (lệnh userdel) 104 2
- 5.3 Các lệnh cơ bản liên quan đến nhóm người dùng 105 5.3.1 Nhóm người dùng và file /etc/group 105 5.3.2 Thêm nhóm người dùng 106 5.3.3 Sửa đổi các thuộc tính của một nhóm người dùng (lệnh groupmod) 106 5.3.4 Xóa một nhóm người dùng (lệnh groupdel) 106 5.4 Các lệnh cơ bản khác có liên quan đến người dùng 107 5.4.1 Đăng nhập với tư cách một người dùng khác khi dùng lệnh su 107 5.4.2 Xác định người dùng đang đăng nhập (lệnh who) 107 5.4.3 Xác định các quá trình đang được tiến hành (lệnh w) 109 CHƯƠNG 6. TRUYỀN THÔNG VÀ MẠNG UNIX-LINUX 110 6.1. Lệnh truyền thông 110 6.1.1. Lệnh write 110 6.1.2. Lệnh mail 110 6.1.3. Lệnh talk 112 6.2 Cấu hình Card giao tiếp mạng 112 6.3. Các dịch vụ mạng 113 6.3.1 Hệ thông tin mạng NIS 113 6.4 Hệ thống file trên mạng 118 6.4.1 Cài đặt NFS 118 6.4.2 Khởi động và dừng NFS 119 6.4.3 Cấu hình NFS server và Client 119 6.4.4 Sử dụng mount 120 6.4.5 Unmount 120 6.4.6 Mount tự động qua tệp cấu hình 121 CHƯƠNG 7. LẬP TRÌNH SHELL VÀ LẬP TRÌNH C TRÊN LINUX 122 7.1. Cách thức pipes và các yếu tố cơ bản lập trình trên shell 122 7.1.1. Cách thức pipes 122 7.1.2. Các yếu tố cơ bản để lập trình trong shell 123 7.2. Một số lệnh lập trình trên shell 126 7.2.1. Sử dụng các toán tử bash 126 7.2.2. Điều khiển luồng 128 7.2.3 Các toán tử định hướng vào ra 138 7.2.4. Hiện dòng văn bản 139 7.2.5. Lệnh read độc dữ liệu cho biến người dùng 140 7.2.6. Lệnh set 140 7.2.7. Tính toán trên các biến 140 7.2.8. Chương trình ví dụ 141 3
- 7.3. Lập trình C trên UNIX 142 7.3.1. Trình biên dịch gcc 142 7.3.2. Công cụ GNU make 144 7.3.3. Làm việc với file 145 7.3.4. Thư viện liên kết 151 7.3.5 Các công cụ cho thư viện 158 TÀI LIỆU THAM KHẢO 160 CHÚ THÍCH MỘT SỐ THUẬT NGỮ 161 PHỤ LỤC A. QUÁ TRÌNH CÀI ĐẶT REDHAT-LINUX 163 AA. Cài đặt phiên bản RedHat 6.2 163 AA.1. Tạo đĩa mềm khởi động 163 AA.2. Phân vùng lại ổ đĩa DOS/Windows hiện thời 164 AA.3. Các bước cài đặt (bản RedHat 6.2 và khởi động từ CD-ROM) 164 AA.4. Các hạn chế về phần cứng đối với Linux 171 PHỤ LỤC B. TRÌNH SOẠN THẢO VIM 174 B.1 Khởi động vim 176 B.1.1 Mở chương trình soạn thảo vim 176 B.1.2. Tính năng mở nhiều cửa sổ 176 B.1.3. Ghi và thoát trong vim 177 B.2. Di chuyển trỏ soạn thảo trong Vim 178 B.2.1. Di chuyển trong văn bản 178 B.2.2. Di chuyển theo các đối tượng văn bản 178 B.2.3. Cuộn màn hình 179 B.3. Các thao tác trong văn bản 179 B.3.1. Các lệnh chèn văn bản trong vim 179 B.3.2. Các lệnh xoá văn bản trong vim 179 B.3.3. Các lệnh khôi phục văn bản trong vim 180 6.3.4. Các lệnh thay thế văn bản trong vim 180 B.3.5. Sao chép và di chuyển văn bản trong vim 181 B.3.6. Tìm kiếm và thay thế văn bản trong vim 182 B.3.7. Đánh dấu trong vim 183 B.3.8. Các phím sử dụng trong chế độ chèn 183 B.3.9. Một số lệnh trong chế độ ảo 184 B.3.10. Các lệnh lặp 184 B.4. Các lệnh khác 184 B.4.1. Cách thực hiện các lệnh bên trong Vim 184 B.4.2. Các lệnh liên quan đến file 185 4
- PHỤ LỤC C. MIDNIGHT COMMANDER 186 C.1. Giới thiệu về Midnight Commander (MC) 186 C.2. Khởi động MC 186 C.3. Giao diện của MC 186 C.4. Dùng chuột trong MC 187 C.5. Các thao tác bàn phím 187 C.6. Thực đơn thanh ngang (menu bar) 189 C.7. Các phím chức năng 191 C.8. Bộ soạn thảo của Midnight Commander 191 PHỤ LỤC D. SAMBA 194 D.1 Cài đặt Samba 194 D.2 Các thành phần của Samba 195 D.3 File cấu hình Samba 196 D.4 Các phần đặc biệt của file cấu hình Samba 197 D.5 Quản lý người dùng trong Samba 203 D.6 Cách sử dụng Samba từ các máy trạm 204 D.6.1 Cách sử dụng từ các máy trạm là Linux 204 D.6.2 Cách sử dụng từ các máy trạm là Windows 206 5
- LỜI GIỚI THIỆU Trong hơn mười năm trở lại đây hệ điều hành Linux đã 6
- CHƯƠNG 1. GIỚI THIỆU CHUNG VỀ LINUX 1.1. Giới thiệu về UNIX và Linux 1.1.1. Xuất xứ, quá trình tiến hóa và một số đặc trưng của hệ điều hành UNIX Năm 1965, Viện công nghệ Massachusetts (MIT: Massachusetts Institute of Technology) và Phòng thí nghiệm Bell của hãng AT&T thực hiện dự án xây dựng một hệ điều hành có tên gọi là Multics (MULTiplexed Information and Computing Service) với mục tiêu: tạo lập được một hệ điều hành phủ trên vùng lãnh thổ rộng (hoạt động trên tập các máy tính được kết nối), đa người dùng, có năng lực cao về tính toán và lưu trữ. Dự án nói trên thành công ở mức độ hết sức khiêm tốn và người ta đã biết đến một số khiếm khuyết khó khắc phục của Multics. Năm1969, Ken Thompson, một chuyên viên tại phòng thí nghiệm Bell, người đã tham gia dự án Multics, cùng Dennics Richie viết lại hệ điều hành đa-bài toán trên máy PDP-7 với tên là UNICS (UNiplexed Information and Computing Service) từ một câu gọi đùa của một đồng nghiệp. Trong hệ điều hành UNICS, một số khởi thảo đầu tiên về Hệ thống file đã được Ken Thompson và Dennis Ritchie thực hiện. Đến năm 1970 hệ điều hành được viết trên assembler cho máy PDP-11/20 và mang tên là UNIX. Năm 1973, Riche và Thompson viết lại nhân của hệ điều hành UNIX trên ngôn ngữ C, và hệ điều hành đã trở nên dễ dàng cài đặt tới các loại máy tính khác nhau; tính chất như thế được gọi là tính khả chuyển (portable) của UNIX. Trước đó, khoảng năm 1971, hệ điều hành được thể hiện trên ngôn ngữ B (mà dựa trên ngôn ngữ B, Ritche đã phát triển thành ngôn ngữ C). Hãng AT&T phổ biến chương trình nguồn UNIX tới các trường đại học, các công ty thương mại và chính phủ với giá không đáng kể. Năm 1982, hệ thống UNIX-3 là bản UNIX thương mại đầu tiên của AT&T. Năm 1983, AT&T giới thiệu Hệ thống UNIX-4 phiên bản thứ nhất trong đó đã có trình soạn thảo vi, thư viện quản lý màn hình được phát triển từ Đại học Tổng hợp California, Berkley. Giai đoạn 1985-1987, UNIX-5 phiên bản 2 và 3 tương ứng được đưa ra vào các năm 1985 và 1987. Trong giai đoạn này, có khoảng 100000 bản UNIX đã được phổ biến trên thế giới, cài đặt từ máy vi tính đến các hệ thống lớn. Đầu thập kỷ 1990. UNIX-5 phiên bản 4 được đưa ra như là một chuẩn của UNIX. Đây là sự kết hợp của các bản sau: . AT&T UNIX-5 phiên bản 3, . Berkley Software Distribution (BSD), . XENIX của MicroSoft . SUN OS Có thể tìm thấy các nội dung liên quan tới một số phiên bản mới của UNIX tại địa chỉ website Các nhóm nhà cung cấp khác nhau về UNIX đang hoạt động trong thời gian hiện nay được kể đến như sau: . Unix International (viết tắt là UI). UI là một tổ chức gồm các nhà cung cấp thực hiện việc chuyển nhượng hệ thống UNIX-5 và cung cấp bản AT&T theo các 7
- nhu cầu và thông báo phát hành mới, chẳng hạn như điều chỉnh bản quyền. Giao diện đồ họa người dùng là Open Look. . Open Software Foundation (OSF). OSF được hỗ trợ bởi IBM, DEC, HP theo hướng phát triển một phiên bản của Unix nhằm tranh đua với hệ thống UNIX-5 phiên bản 4. Phiên bản này có tên là OSF/1 với giao diện đồ họa người dùng được gọi là MOTIF. . Free SoftWare Foundation (FSF): một cộng đồng do Richard Stallman khởi xướng năm 1984 chủ trương phát hành các phần mềm sử dụng tự do, trên cơ sở một hệ điều hành thuộc loại UNIX. Bảng sau đây liệt kê một số cài đặt UNIX khá phổ biến (thường thấy có chữ X ở cuối tên gọi của Hệ điều hành): Tên hệ Nhà cung cấp Nền phát triển AIX International Business Machines AT&T System V A/UX Apple Computer AT&T System V Dynix Sequent BSD (Berkeley SoftWare Distribution) HP-UX Hewlett-Packard BSD Irix Silicon Graphics AT&T System V Linux Free SoftWare Foundation NextStep Next BSD OSF/1 Digital Equipment Corporation BSD SCO UNIX Santa Cruz Operation AT&T System V Solaris Sun Microsystems AT&T System V SunOS Sun Microsystems BSD UNIX Ultrix Digital Equipment Corporation BSD UNIX Unicos Cray AT&T System V UnixWare Novell AT&T System V XENIX MicroSoft AT&T System III-MS Dưới đây liệt kê một số đặc trưng của hệ điều hành UNIX: . Hệ điều hành được viết trên ngôn ngữ bậc cao; bởi vậy, rất dễ đọc, dễ hiểu, dễ thay đổi để cài đặt trên loại máy mới (tính dễ mang chuyển, như đã nói), . Có giao diện người dùng đơn giản đủ năng lực cung cấp các dịch vụ mà người dùng mong muốn (so sánh với các hệ điều hành có từ trước đó thì giao diện của UNIX là một tiến bộ vượt bậc), . Thỏa mãn nguyên tắc xây dựng các chương trình phức tạp từ những chương trình đơn giản hơn: trước hết có các môđun cơ bản nhất của nhân sau đó phát triển để có toàn bộ hệ điều hành, . Sử dụng duy nhất một hệ thống File có cấu trúc cho phép dễ dàng bảo quản và sử dụng hiệu quả, 8
- . Sử dụng phổ biến một dạng đơn giản trình bày nội tại của File như một dòng các byte cho phép dễ dàng khi viết các chương trình ứng dụng truy nhập, thao tác với các dữ liệu trong File, . Có kết nối đơn giản với thiết bị ngoại vi: các file thiết bị đã được đặt sẵn trong Hệ thống File tạo ra một kết nối đơn giản giữa chương trình người dùng với các thiết bị ngoại vi, . Là hệ điều hành đa người dùng, đa quá trình, trong đó mỗi người dùng có thể thực hiện các quá trình của mình một cách độc lập. . Mọi thao tác vào - ra của hệ điều hành được thực hiện trên hệ thống File: mỗi thiết bị vào ra tương ứng với một file. Chương trình người dùng làm việc với file đó mà không cần quan tâm cụ thể tên file đó được đặt cho thiết bị nào trong hệ thống. . Che khuất cấu trúc máy đối với người dùng, đảm bảo tính độc lập tương đối của chương trình đối với dữ liệu và phần cứng, tạo điều kiện thuận lợi hơn cho người lập trình khi viết các chương trình chạy UNIX với các điều kiện phần cứng hoàn toàn khác biệt nhau. 1.1.2. Giới thiệu sơ bộ về Linux Linus Tovalds (một sinh viên Phần lan) đưa ra nhân (phiên bản đầu tiên) cho hệ điều hành Linux vào tháng 8 năm 1991 trên cơ sở cải tiến một phiên bản UNIX có tên Minix do Giáo sư Andrew S. Tanenbaum xây dựng và phổ biến. Nhân Linux tuy nhỏ song là tự đóng gói. Kết hợp với các thành phần trong hệ thống GNU, hệ điều hành Linux đã được hình thành. Và cũng từ thời điểm đó, theo tư tưởng GNU, hàng nghìn, hàng vạn chuyên gia trên toàn thế giới (những người này hình thành nên cộng đồng Linux) đã tham gia vào quá trình phát triển Linux và vì vậy Linux ngày càng đáp ứng nhu cầu của người dùng. Dưới đây là một số mốc thời gian quan trọng trong quá trình hình thành và phát triển hệ điều hành Linux. . Sau ba năm nhân Linux ra đời, đến ngày 14-3-1994, hệ điều hành Linux phiên bản 1.0 được phổ biến. Thành công lớn nhất của Linux 1.0 là nó đã hỗ trợ giao thức mạng TCP/IP chuẩn UNIX, sánh với giao thức socket BSD- tương thích cho lập trình mạng. Trình điều khiển thiết bị đã được bổ sung để chạy IP trên một mạng Ethernet hoặc trên tuyến đơn hoặc qua modem. Hệ thống file trong Linux 1.0 đã vượt xa hệ thống file của Minix thông thường, ngoài ra đã hỗ trợ điều khiển SCSI truy nhập đĩa tốc độ cao. Điều khiển bộ nhớ ảo đã được mở rộng để hỗ trợ điều khiển trang cho các file swap và ánh xạ bộ nhớ của file đặc quyền (chỉ có một ánh xạ bộ nhớ chỉ đọc được thi hành trong Linux 1.0). . Vào tháng 3-1995, nhân 1.2 được phổ biến. Điều đáng kể của Linux 1.2 so với Linux 1.0 ở chỗ nó hỗ trợ một phạm vi rộng và phong phú phần cứng, bao gồm cả kiến trúc tuyến phần cứng PCI mới. Nhân Linux 1.2 là nhân kết thúc dòng nhân Linux chỉ hỗ trợ PC. Một điều cần lưu ý về các đánh chỉ số các dòng nhân (hệ điều hành) Linux. Hệ thống chỉ số được chia thành một số mức, chẳng hạn hai mức như 2.4 hoặc ba mức như 2.2.5. Trong cách đánh chỉ số như vậy, quy ước rằng với các chỉ số từ mức thứ hai trở đi, nếu là số chẵn thì dòng nhân đó đã khá ổn định và tương đối hoàn thiện, còn nếu là số lẻ thì dòng nhân đó vẫn đang được phát triển tiếp. 9
- . Tháng 6-1996, nhân Linux 2.0 được phổ biến. Có hai đặc trưng nổi bật của Linux 2.0 là hỗ trợ kiến trúc phức hợp, bao gồm cả cổng Alpha 64-bit đầy đủ, và hỗ trợ kiến trúc đa bộ xử lý. Phân phối nhân Linux 2.0 cũng thi hành được trên bộ xử lý Motorola 68000 và kiến trúc SPARC của SUN. Các thi hành của Linux dựa trên vi nhân GNU Mach cũng chạy trên PC và PowerMac. . Tới năm 2000, nhân Linux 2.4 được phổ biến. Một trong đặc điểm được quan tâm của nhân này là nó hỗ trợ mã ký tự Unicode 32 bít, rất thuận lợi cho việc xây dựng các giải pháp toàn diện và triệt để đối với vấn đề ngôn ngữ tự nhiên trên phạm vi toàn thế giới. Vấn đề phân phối và giấy phép Linux Về lý thuyết, mọi người có thể khởi tạo một hệ thống Linux bằng cách tiếp nhận bản mới nhất các thành phần cần thiết từ các site ftp và biên dịch chúng. Trong thời kỳ đầu tiên, người dùng Linux phải tiến hành toàn bộ các thao tác này và vì vậy công việc là khá vất vả. Tuy nhiên, do có sự tham gia đông đảo của các cá nhân và nhóm phát triển Linux, đã tiến hành thực hiện nhiều giải pháp nhằm làm cho công việc khởi tạo hệ thống đỡ vất vả. Một trong những giải pháp điển hình nhất là cung cấp tập các gói chương trình đã tiền dịch, chuẩn hóa. Những tập hợp như vậy hay những bản phân phối là lớn hơn nhiều so với hệ thống Linux cơ sở. Chúng thường bao gồm các tiện ích bổ sung cho khởi tạo hệ thống, các thư viện quản lý, cũng như nhiều gói đã được tiền dịch, sẵn sàng khởi tạo của nhiều bộ công cụ UNIX dùng chung, chẳng hạn như phục vụ tin, trình duyệt web, công cụ xử lý, soạn thảo văn bản và thậm chí các trò chơi. Cách thức phân phối ban đầu rất đơn giản song ngày càng được nâng cấp và hoàn thiện bằng phương tiện quản lý gói tiên tiến. Các bản phân phối ngày nay bao gồm các cơ sở dữ liệu tiến hóa gói, cho phép các gói dễ dàng được khởi tạo, nâng cấp và loại bỏ. Nhà phân phối đầu tiên thực hiện theo phương châm này là Slakware, và chính họ là những chuyển biến mạnh mẽ trong cộng đồng Linux đối với công việc quản lý gói khởi tạo Linux. Tiện ích quản lý gói RPM (RedHat Package Manager) của công ty RedHat là một trong những phương tiện điển hình. Nhân Linux là phần mềm tự do được phân phối theo Giấy phép sở hữu công cộng phần mềm GNU GPL. Các thành phần tích hợp Hệ điều hành Linux Linux sử dụng rất nhiều thành phần từ Dự án phần mềm tự do GNU, từ hệ điều hành BSD của Đại học Berkeley và từ hệ thống X-Window của MIT. Thư viện hệ thống chính của Linux được bắt nguồn từ Dự án GNU, sau đó được rất nhiều người trong cộng đồng Linux phát triển tiếp, những phát triển tiếp theo như vậy chủ yếu liên quan tới việc giải quyết các vấn đề như thiếu vắng địa chỉ (lỗi trang), thiếu hiệu quả và gỡ rối. Một số thành phần khác của Dự án GNU, chẳng hạn như trình biên dịch GNU C (gcc), vốn là chất lượng cao nên được sử dụng nguyên xy trong Linux. Các tool quản lý mạng được bắt nguồn từ mã 4.3BSD song sau đó đã được cộng đồng Linux phát triển, chẳng hạn như thư viện toán học đồng xử lý dấu chấm động Intel và các trình điều khiển thiết bị phần cứng âm thanh PC. Các tool quản lý mạng này sau đó lại được bổ sung vào hệ thống BSD. Hệ thống Linux được duy trì gần như bởi một mạng lưới không chặt chẽ các nhà phát triển phần mềm cộng tác với nhau qua Internet, mạng lưới này gồm các nhóm nhỏ và cá nhân 10
- chịu trách nhiệm duy trì tính toàn vẹn của từng thành phần. Một lượng nhỏ các site phân cấp ftp Internat công cộng đã đóng vai trò nhà kho theo chuẩn de facto để chứa các thành phần này. Tài liệu Chuẩn phân cấp hệ thống file (File System Hierarchy Standard) được cộng đồng Linux duy trì nhằm giữ tính tương thích xuyên qua sự khác biệt rất lớn giữa các thành phần hệ thống. Một số đặc điểm chính của Linux Dưới đây trình bày một số đặc điểm chính của của hệ điều hành Linux hiện tại: . Linux tương thích với nhiều hệ điều hành như DOS, MicroSoft Windows : . Cho phép cài đặt Linux cùng với các hệ điều hành khác trên cùng một ổ cứng. Linux có thể truy nhập đến các file của các hệ điều hành cùng một ổ đĩa. Linux cho phép chạy mô phỏng các chương trình thuộc các hệ điều hành khác. . Do giữ được chuẩn của UNIX nên sự chuyển đổi giữa Linux và các hệ UNIX khác là dễ dàng. . Linux là một hệ điều hành UNIX tiêu biểu với các đặc trưng là đa người dùng, đa chương trình và đa xử lý. . Linux có giao diện đồ hoạ (GUI) thừa hưởng từ hệ thống X-Window. Linux hỗ trợ nhiều giao thức mạng, bắt nguồn và phát triển từ dòng BSD. Thêm vào đó, Linux còn hỗ trợ tính toán thời gian thực. . Linux khá mạnh và chạy rất nhanh ngay cả khi nhiều quá trình hoặc nhiều cửa sổ. . Linux được cài đặt trên nhiều chủng loại máy tính khác nhau như PC, Mini và việc cài đặt khá thuận lợi. Tuy nhiên, hiện nay chưa xuất hiện Linux trên máy tính lớn (mainframe). . Linux ngày càng được hỗ trợ bởi các phần mềm ứng dụng bổ sung như soạn thảo, quản lý mạng, quản trị cơ sở dữ liệu, bảng tính . Linux hỗ trợ tốt cho tính toán song song và máy tính cụm (PC-cluster) là một hướng nghiên cứu triển khai ứng dụng nhiều triển vọng hiện nay. . Là một hệ điều hành với mã nguồn mở, được phát triển qua cộng đồng nguồn mở (bao gồm cả Free Software Foundation) nên Linux phát triển nhanh. Linux là một trong một số ít các hệ điều hành được quan tâm nhiều nhất trên thế giới hiện nay. . Linux là một hệ điều hành hỗ trợ đa ngôn ngữ một cách toàn diện nhất. Do Linux cho phép hỗ trợ các bộ mã chuẩn từ 16 bit trở lên (trong đó có các bộ mã ISO10646, Unicode) cho nên việc bản địa hóa trên Linux là triệt để nhất trong các hệ điều hành. Tuy nhiên cũng tồn tại một số khó khăn làm cho Linux chưa thực sự trở thành một hệ điều hành phổ dụng, dưới đây là một số khó khăn điển hình: . Tuy đã có công cụ hỗ trợ cài đặt, tuy nhiên, việc cài đặt Linux còn tương đối phức tạp và khó khăn. Khả năng tương thích của Linux với một số loại thiết bị phần cứng còn thấp do chưa có các trình điều khiển cho nhiều thiết bị, . Phần mềm ứng dụng chạy trên nền Linux tuy đã phong phú song so với một số hệ điều hành khác, đặc biệt là khi so sánh với MS Windows, thì vẫn còn có khoảng cách. 11
- Với sự hỗ trợ của nhiều công ty tin học hàng đầu thế giới (IBM, SUN, HP ) và sự tham gia phát triển của hàng vạn chuyên gia trên toàn thế giới thuộc cộng đồng Linux, các khó khăn của Linux chắc chắn sẽ nhanh chóng được khắc phục. Chính vì lẽ đó đã hình thành một số nhà cung cấp Linux trên thế giới. Bảng dưới đây là tên của một số nhà cung cấp Linux có tiếng nhất và địa chỉ website của họ. Đáng chú ý nhất là Red Hat Linux (tại Mỹ) và Red Flag Linux (tại Trung Quốc). Red Hat được coi là lâu đời và tin cậy, còn Red Flag là một công ty Linux của Trung quốc, có quan hệ với cộng đồng Linux Việt nam và chúng ta có thể học hỏi một cách trực tiếp kinh nghiệm cho quá trình đưa Linux vào Việt nam. Tên công ty Địa chỉ website Caldera OpenLinux www.caldera.com Corel Linux www.corel.com Debian GNU/Linux www.debian.com Linux Mandrake www.mandrake.com Red Hat Linux www.redhat.com Red Flag Linux www.redflag-linux.com Slackware Linux www.slackware.com SuSE Linux www.suse.com TurboLinux www.turbolinux.com 1.2. Sơ bộ về các thành phần của Linux Hệ thống Linux, được thi hành như một hệ điều hành UNIX truyền thống, gồm shell và ba thành phần (đã dạng mã chương trình) sau đây: - Nhân hệ điều hành chịu trách nhiệm duy trì các đối tượng trừu tượng quan trọng của hệ điều hành, bao gồm bộ nhớ ảo và quá trình. Các mô đun chương trình trong nhân được đặc quyền trong hệ thống, bao gồm đặc quyền thường trực ở bộ nhớ trong. - Thư viện hệ thống xác định một tập chuẩn các hàm để các ứng dụng tương tác với nhân, và thi hành nhiều chức năng của hệ thống nhưng không cần có các đặc quyền của mô đun thuộc nhân. Một hệ thống con điển hình được thi hành dựa trên thư viên hệ thống là hệ thống file Linux. - Tiện ích hệ thống là các chương trình thi hành các nhiệm vụ quản lý riêng rẽ, chuyên biệt. Một số tiện ích hệ thống được gọi ra chỉ một lần để khởi động và cấu hình phương tiện hệ thống, một số tiện ích khác, theo thuật ngữ UNIX được gọi là trình chạy ngầm (daemon), có thể chạy một cách thường xuyên (thường theo chu kỳ), điều khiển các bài toán như hưởng ứng các kết nối mạng mới đến, tiếp nhận yêu cầu logon, hoặc cập nhật các file log. Tiện ích (hay lệnh) có sẵn trong hệ điều hành (dưới đây tiện ích được coi là lệnh thường trực). Nội dung chính yếu của tài liệu này giới thiệu chi tiết về một số lệnh thông dụng nhất của Linux. Hệ thống file sẽ được giới thiệu trong chương 3. Trong các chương sau có đề cập tới nhiều nội dung liên quan đến nhân và shell, song dưới đây là một số nét sơ bộ về chúng. 1.2.1. Sơ bộ về nhân Nhân (còn được gọi là hệ lõi) của Linux, là một bộ các môdun chương trình có vai trò điều khiển các thành phần của máy tính, phân phối các tài nguyên cho người dùng (các quá trình người dùng). Nhân chính là cầu nối giữa chương trình ứng dụng với phần cứng. 12
- Người dùng sử dụng bàn phím gõ nội dung yêu cầu của mình và yêu cầu đó được nhân gửi tới shell: Shell phân tích lệnh và gọi các chương trình tương ứng với lệnh để thực hiện. Một trong những chức năng quan trọng nhất của nhân là giải quyết bài toán lập lịch, tức là hệ thống cần phân chia CPU cho nhiều quá trình hiện thời cùng tồn tại. Đối với Linux, số lượng quá trình có thể lên tới con số hàng nghìn. Với số lượng quá trình đồng thời nhiều như vậy, các thuật toán lập lịch cần phải đủ hiệu quả: Linux thường lập lịch theo chế độ Round Robin (RR) thực hiện việc luân chuyển CPU theo lượng tử thời gian. Thành phần quan trọng thứ hai trong nhân là hệ thống các môđun chương trình (được gọi là lời gọi hệ thống) làm việc với hệ thống file. Linux có hai cách thức làm việc với các file: làm việc theo byte (kí tự) và làm việc theo khối. Một đặc điểm đáng chú ý là file trong Linux có thể được nhiều người cùng truy nhập tới nên các lời gọi hệ thống làm việc với file cần đảm bảo việc file được truy nhập theo quyền và được chia xẻ cho người dùng. 1.2.2. Sơ bộ về shell Một số nội dung chi tiết về shell (còn được gọi là hệ vỏ) trong Linux được trình bày trong chương "Lập trình trên shell". Những nội dung trình bày dưới đây cung cấp một cách nhìn sơ bộ về shell và vai trò của nó trong hoạt động chung của hệ điều hành. Người dùng mong muốn máy tính thực hiện một công việc nào đó thì cần gõ lệnh thể hiện yêu cầu của mình để hệ thống đáp ứng yêu cầu đó. Shell là bộ dịch lệnh và hoạt động như một kết nối trung gian giữa nhân với người dùng: Shell nhận dòng lệnh do người dùng đưa vào; và từ dòng lệnh nói trên, nhân tách ra các bộ phận để nhận được một hay một số lệnh tương ứng với các đoạn văn bản có trong dòng lệnh. Một lệnh bao gồm tên lệnh và tham số: từ đầu tiên là tên lệnh, các từ tiếp theo (nếu có) là các tham số. Tiếp theo, shell sử dụng nhân để khởi sinh một quá trình mới (khởi tạo quá trình) và sau đó, shell chờ đợi quá trình con này tiến hành, hoàn thiện và kết thúc. Khi shell sẵn sàng tiếp nhận dòng lệnh của người dùng, một dấu nhắc shell (còn gọi là dấu nhắc nhập lệnh) xuất hiện trên màn hình. Linux có hai loại shell phổ biến là: C-shell (dấu nhắc %), Bourne-shell (dấu nhắc $) và một số shell phát triển từ các shell nói trên (chẳng hạn, TCshell - tcsh với dấu nhắc ngầm định > phát triển từ C-shell và GNU Bourne - bash với dấu nhắc bash # phát triển từ Bourne-shell). Dấu mời phân biệt shell nói trên không phải hoàn toàn rõ ràng do Linux cho phép người dùng thay đổi lại dấu nhắc shell nhờ việc thay giá trị các biến môi trường PS1 và PS2. Trong tài liệu này, chúng ta sử dụng kí hiệu "hàng rào #" để biểu thị dấu nhắc shell. C-shell có tên gọi như vậy là do cách viết lệnh và chương trình lệnh Linux tựa như ngôn ngữ C. Bourne-shell mang tên tác giả của nó là Steven Bourne. Một số lệnh trong C- shell (chẳng hạn lệnh alias) không còn có trong Bourne-shell và vì vậy để nhận biết hệ thống đang làm việc với shell nào, chúng ta gõ lệnh: # alias Nếu một danh sách xuất hiện thì shell đang sử dụng là C-shell; ngược lại, nếu xuất hiện thông báo "Command not found" thì shell đó là Bourne-shell. Lệnh được chia thành 3 loại lệnh: . Lệnh thường trực (có sẵn của Linux). Tuyệt đại đa số lệnh được giới thiệu trong tài liệu này là lệnh thường trực. Chúng bao gồm các lệnh được chứa sẵn trong shell và các lệnh thường trực khác. . File chương trình ngôn ngữ máy: chẳng hạn, người dùng viết trình trên ngôn ngữ C qua bộ dịch gcc (bao gồm cả trình kết nối link) để tạo ra một chương trình trên ngôn ngữ máy. 13
- . File chương trình shell (Shell Scrip). Khi kết thúc một dòng lệnh cần gõ phím ENTER để shell phân tích và thực hiện lệnh. 1.3. Giới thiệu về sử dụng lệnh trong Linux Như đã giới thiệu ở phần trên, Linux là một hệ điều hành đa người dùng, đa nhiệm, được phát triển bởi hàng nghìn chuyên gia Tin học trên toàn thế giới nên hệ thống lệnh cũng ngày càng phong phú; đến thời điểm hiện nay Linux có khoảng hơn một nghìn lệnh. Tuy nhiên chỉ có khoảng vài chục lệnh là thông dụng nhất đối với người dùng. Tài liệu này cũng hạn chế giới thiệu khoảng vài chục lệnh đó. Chúng ta đừng e ngại về số lượng lệnh được giới thiệu chỉ chiếm một phần nhỏ trong tập hợp lệnh bởi vì đây là những lệnh thông dụng nhất và chúng cung cấp một phạm vi ứng dụng rộng lớn, đủ thỏa mãn yêu cầu của chúng ta. Cũng như đã nói ở trên, người dùng làm việc với máy tính thông qua việc sử dụng trạm cuối: người dùng đưa yêu cầu của mình bằng cách gõ "lệnh" từ bàn phím và giao cho hệ điều hành xử lý. Khi cài đặt Linux lên máy tính cá nhân thì máy tính cá nhân vừa đóng vai trò trạm cuối, vừa đóng vai trò máy tính xử lý. Dạng tổng quát của lệnh Linux có thể được viết như sau: # [ ] ¿ trong đó: . Tên lệnh là một dãy ký tự, không có dấu cách, biểu thị cho một lệnh của Linux hay một chương trình. Người dùng cần hệ điều hành đáp ứng yêu cầu gì của mình thì phải chọn đúng tên lệnh. Tên lệnh là bắt buộc phải có khi gõ lệnh. . Các tham số có thể có hoặc không có, được viết theo quy định của lệnh mà chúng ta sử dụng, nhằm cung cấp thông tin về các đối tượng mà lệnh tác động tới. Ý nghĩa của các dấu [, , ] được giải thích ở phần quy tắc viết lệnh. Các tham số được phân ra thành hai loại: tham số khóa (sau đây thường dùng là "tùy chọn") và tham số vị trí. Tham số vị trí thường là tên file, thư mục và thường là các đối tượng chịu sự tác động của lệnh. Khi gõ lệnh, tham số vị trí được thay bằng những đối tượng mà người dùng cần hướng tác động tới. Tham số khóa chính là những tham số điều khiển hoạt động của lệnh theo các trường hợp riêng. Trong Linux, tham số khóa thường bắt đầu bởi dấu trừ "-" hoặc hai dấu trừ liên tiếp " ". Khi gõ lệnh, cũng giống như tên lệnh, tham số khóa phải được viết chính xác như trình bày trong mô tả lệnh. Một lệnh có thể có một số hoặc rất nhiều tham số khóa. Phụ thuộc vào yêu cầu cụ thể của mình, người dùng có thể chọn một hoặc một số các tham số khóa khi gõ lệnh. Trong mô tả lệnh, thường xuất hiện thuật ngữ tùy-chọn. Tùy chọn lệnh (thực chất là tham số khóa) cho phép điều chỉnh hoạt động của lệnh trong Linux, làm cho lệnh có tính phổ dụng cao. Tuỳ chọn lệnh cho phép lệnh có thể đáp ứng ý muốn của người dùng đối với hầu hết (tuy không phải lúc nào cũng vậy) các tình huống đặt ra cho thao tác ứng với lệnh. . Ký hiệu "" biểu thị việc gõ phím hết dòng . Để kết thúc một yêu cầu, người dùng nhất thiết phải gõ phím "". Ví dụ, khi người dùng gõ lệnh xem thông tin về các file: # ls -l g¿ trong lệnh này: 14
- . ls là tên lệnh thực hiện việc đưa danh sách các tên file/ thư mục con trong một thư mục, . -l là tham số khóa, cho biết yêu cầu xem đầy đủ thông tin về các đối tượng hiện ra. Chú ý, trong tham số khóa chữ cái (chữ "l") phải đi ngay sau dấu trừ "-". Tương ứng với lệnh ls còn có các tham số khóa -a, -L, và chúng cũng là các tùy chọn lệnh. Trong một số tham số khóa có nhiều chữ cái thay cho một dấu "-" là hai dấu " " ở đầu tham số. Ví dụ, như trường hợp tham số file của lệnh date. . g* là tham số vị trí chỉ rõ người dùng cần xem thông tin về các file có tên gọi bắt đầu là chữ cái "g". Trong tài liệu này, quy ước rằng khi viết một lệnh (trong mô tả lệnh và gõ lệnh) thì không cần phải viết dấu "" ở cuối dòng lệnh đó, song luôn ghi nhớ rằng phím ENTER ("") là bắt buộc khi gõ lệnh. Lưu ý: . Linux (và UNIX nói chung) được xây dựng trên ngôn ngữ lập trình C, vì vậy khi gõ lệnh phải phân biệt chữ thường với chữ hoa. Ngoại trừ một số ngoại lệ, trong Linux chúng ta thấy phổ biến là: Các tên lệnh là chữ thường, Một số tham số có thể là chữ thường hoặc chữ hoa (ví dụ, trong lệnh date về thời gian hệ thống thì hai tham số -r và -R có ý nghĩa hoàn toàn khác nhau). Tên các biến môi trường cũng thường dùng chữ hoa. . Trong tài liệu này, tại những dòng văn bản diễn giải, sử dụng cách viết tên lệnh, các tham số khóa bằng kiểu chữ không chân, đậm như date, -R, -r . Linux phân biệt siêu người dùng (tiếng Anh là superuser hoặc root, còn được gọi là người quản trị hay người dùng tối cao hoặc siêu người dùng) với người dùng thông thường. Trong tập hợp lệnh của Linux, có một số lệnh mà chỉ siêu người dùng mới được phép sử dụng còn người dùng thông thường thì không được phép (ví dụ như lệnh adduser thực hiện việc bổ sung thêm người dùng). Mặt khác trong một số lệnh, với một số tham số khóa thì chỉ siêu người dùng được phép dùng, còn với một số tham số khác thì mọi người dùng đều được phép (ví dụ như lệnh passwd thay đổi mật khẩu người dùng). . Một dòng lệnh có thể có nhiều hơn một lệnh, trong đó lệnh sau được ngăn cách bởi với lệnh đi ngay trước bằng dấu ";" hoặc dấu "|". Ví dụ về một số dòng lệnh dạng này: # ls -l; date # head Filetext | sort >temp . Sau khi người dùng gõ xong dòng lệnh, shell tiếp nhận dòng lệnh này và phân tích nội dung văn bản của lệnh. Nếu lệnh được gõ đúng thì nó được thực hiện; ngược lại, trong trường hợp có sai sót khi gõ lệnh thì shell thông báo về sai sót và dấu nhắc shell lại hiện ra để chờ lệnh tiếp theo của người dùng. Về phổ biến, nếu như sau khi người dùng gõ lệnh, không thấy thông báo sai sót hiện ra thì có nghĩa lệnh đã được thực hiện một cách bình thường. Trước khi đi vào nội dung chi tiết các lệnh thông dụng, chúng ta xem xét về một số quy định dùng trong mô tả lệnh được trình bày trong tài liệu này. 15
- 1.3.1. Các quy ước khi viết lệnh Trong tài liệu này, các lệnh được trình bày theo một bộ quy tắc cú pháp nhất quán. Bộ quy tắc này cho phép phân biệt trong mỗi lệnh các thành phần nào là bắt buộc phải có, các thành phần nào có thể có hoặc không Dưới đây là nội dung của các quy tắc trong bộ quy tắc đó. . Tên lệnh là bắt buộc, phải là từ đầu tiên trong bất kỳ lệnh nào, phải được gõ đúng như khi mô tả lệnh. . Tên khái niệm được nằm trong cặp dấu ngoặc quan hệ ( ) biểu thị cho một lớp đối tượng và là tham số bắt buộc phải có. Khi gõ lệnh thì tên khái niệm (có thể được coi là "tham số hình thức") phải được thay thế bằng một từ (thường là tên file, tên thư mục và có thể được coi là "tham số thực sự") để chỉ đối tượng liên quan đến thao tác của lệnh. Ví dụ, mô tả cú pháp của lệnh more xem nội dung file là # more thì từ more là tên lệnh, còn là tham số trong đó file là tên khái niệm và là tham số bắt buộc phải có. Lệnh này có tác động là hiện lên màn hình theo cách thức cuộn nội dung của file với tên đã chỉ trong lệnh. Để xem nội dung file có tên là temp, người dùng gõ lệnh: # more temp Như vậy, tên lệnh more được gõ đúng như mô tả cú pháp (cả nội dung và vị trí) còn "file" đã được thay thế bằng từ "temp" là tên file mà người dùng muốn xem nội dung. . Các bộ phận nằm giữa cặp dấu ngoặc vuông [ và ] là có thể gõ hoặc không gõ cũng được. Ví dụ, cú pháp của lệnh halt là # halt [tùy-chọn] Với các tùy chọn là -w, -n, -d, -f, -i mã mỗi tùy chọn cho một cách thức hoạt động khác nhau của lệnh halt. Lệnh halt có tác động chính là làm ngừng hoạt động của hệ điều hành, tuy nhiên khi người dùng muốn có một cách hoạt động nào đó của lệnh này thì sẽ chọn một (hoặc một số) tuỳ chọn lệnh tương ứng. Một số cách gõ lệnh halt của người dùng như sau đây là đúng cú pháp: # halt # halt -w # halt -n # halt -f . Các giá trị có trong cặp | và | trong đó các bộ phận cách nhau bằng dấu sổ đứng "|" cho biết cần chọn một và chỉ một trong các giá trị nằm giữa hai dấu ngoặc đó. Ví dụ, khi giới thiệu về tùy chọn lệnh của lệnh tail xem phần cuối nội dung của file, chúng ta thấy: -f, follow[={tên | đặc tả}] Như vậy, sau tham số khóa follow, nếu xuất hiện thêm dấu bằng "=" thì phải có hoặc tên hoặc đặc tả. Đây là trường hợp các chọn lựa "loại trừ nhau". 16
- . Dấu ba chấm thể hiện việc lặp lại thành phần cú pháp đi ngay trước dấu này, việc lặp lại đó có thể từ không đến nhiều lần (không kể chính thành phần cú pháp đó). Cách thức này thường được dùng với các tham số như tên file. Ví dụ, mô tả lệnh chown như sau: chown [tùy-chọn] [,[nhóm]] Như vậy trong lệnh chown có thể không có hoặc có một số tùy chọn lệnh và có từ một đến nhiều tên file. . Các bộ phận trong mô tả lệnh, nếu không nằm trong các cặp dấu [ ], có nghĩa là thay bằng tên file cần xem nội dung, nếu kết hợp thêm dấu ngoặc vuông [ và ], tức là có dạng sau (chính là dạng tổng quát của lệnh more): # more [ ] thì nói chung phải có trong lệnh more, tuy nhiên trong một số trường hợp có thể bỏ qua tham số file. Lưu ý: . Đối với nhiều lệnh, cho phép người dùng gõ tham số khóa kết hợp tương ứng với tùy_chọn trong mô tả lệnh. Tham số khóa kết hợp được viết theo cách - , trong đó xâu-kí-tự gồm các chữ cái trong tham số khóa. Ví dụ, trong mô tả lệnh in lịch cal: cal [tùy-chọn] [tháng [năm] ] có ba tham số khóa là -m, -j, -y. Khi gõ lệnh có thể gõ một tổ hợp nào đó từ ba tham số khóa này để được tình huống sử dụng lệnh theo ý muốn. Chẳng hạn, nếu gõ lệnh cal -mj 3 thì lệnh cal thực hiện theo điều khiển của hai tham số khóa -m (chọn Thứ Hai là ngày đầu tuần, thay vì cho ngầm định là Chủ Nhật) và -j (hiển thị ngày trong tháng dưới dạng số ngày trong năm kể từ đầu năm). Vì vậy, khi viết [tùy-chọn] trong mô tả lệnh biểu thị cả việc sử dụng từng tùy chọn, nhiều tùy chọn hoặc kết hợp các tuỳ chọn. . Trong một số lệnh, có hai tham số khóa cùng tương ứng với một tình huống thực hiện lệnh, trong đó một tham số gồm một kí tự còn tham số kia lại là một từ. Tham số dài một từ là tham số chuẩn của lệnh, còn tham số một kí tự là cách viết ngắn gọn. Tham số chuẩn dùng được trong mọi Linux và khi gõ phải có đủ kí tự trong từ. Ví dụ, khi mô tả lệnh date có tùy chọn: . -d, date=STRING như vậy hai tham số -d và date=STRING có cùng ý nghĩa. 17
- Ngoài những quy ước trên đây, người dùng đừng quên một quy định cơ bản là cần phân biệt chữ hoa với chữ thường khi gõ lệnh. 1.3.3. Làm đơn giản thao tác gõ lệnh Việc sử dụng bàn phím để nhập lệnh tuy không phải là một công việc nặng nề, song Linux còn cho phép người dùng sử dụng một số cách thức để thuận tiện hơn khi gõ lệnh. Một số trong những cách thức đó là: . Sử dụng việc khôi phục dòng lệnh, . Sử dụng các phím đặc biệt, . Sử dụng các kí hiệu thay thế và phím , . Sử dụng thay thế alias, . Sử dụng chương trình lệnh. Cách thức sử dụng chương trình lệnh (shell script) sẽ được giới thiệu chi tiết trong các chương sau. Dưới đây, chúng ta xem xét cách thức sử dụng việc khôi phục dòng lệnh, phím đặc biệt và kí hiệu thay thế. Cơ chế khôi phục dòng lệnh Linux cung cấp một cách thức đặc biệt là khả năng khôi phục lệnh. Tại dấu nhắc shell: Người dùng sử dụng các phím mũi tên lên/xuống (/) trên bàn phím để nhận lại các dòng lệnh đã được đưa vào trước đây tại dấu nhắc shell, chọn một trong các dòng lệnh đó và biên tập lại nội dung dòng lệnh theo đúng yêu cầu mới của mình. Ví dụ, người dùng vừa gõ xong dòng lệnh: # ls -l tenfile* sau đó muốn gõ lệnh ls -l tentaptin thì tại dấu nhắc của shell, người dùng sử dụng các phím di chuyển lên () hoặc xuống () để nhận được: # ls -l tenfile* dùng các phím tắt để di chuyển, xoá kí tự (xem phần sau) để có được: # ls -l ten và gõ tiếp các kí tự "taptin" để nhận được: # ls -l tentaptin chính là kết quả mong muốn. Trong trường hợp số lượng kí tự thay thế là rất ít so với số lượng kí tự của toàn dòng lệnh thì hiệu quả của cách thức này rất cao. Lưu ý: . Việc nhấn liên tiếp các phím di chuyển lên () hoặc xuống () cho phép người dùng nhận được các dòng lệnh đã gõ từ trước mà không chỉ dòng lệnh mới được gõ. Cách thức này tương tự với cách thức sử dụng tiện ích DOSKEY trong hệ điều hành MS-DOS. Một số phím đặc biệt khi gõ lệnh Khi người dùng gõ lệnh có thể xẩy ra một số tình huống như sau: 18
- . Dòng lệnh đang gõ có chỗ sai sót, không đúng theo yêu cầu của người dùng vì vậy cần phải sửa lại đôi chút nội dung trên dòng lệnh đó. Trong trường hợp đó cần sử dụng các phím đặc biệt (còn gọi là phím viết tắt hay phím tắt) để di chuyển, xoá bỏ, bổ sung vào nội dung dòng lệnh. . Sau khi sử dụng cách thức khôi phục dòng lệnh, chúng ta nhận được dòng lệnh tương tự với lệnh cần gõ và sau đó sử dụng các phím tắt để hoàn thiện lệnh. Dưới đây giới thiệu các phím tắt và ý nghĩa của việc sử dụng chúng: Nhấn phím để di chuyển con trỏ sang bên phải một vị trí Nhấn phím để di chuyển con trỏ sang bên trái một vị trí Nhấn phím để xoá một từ bên trái con trỏ Nhấn phím để xoá một từ bên phải con trỏ Nhấn phím để di chuyển con trỏ sang bên phải một từ Nhấn phím để di chuyển con trỏ sang bên trái một từ Nhấn phím để di chuyển con trỏ về đầu dòng lệnh Nhấn phím để di chuyển con trỏ về cuối dòng Nhấn phím để xóa dòng lệnh Có thể dùng phím thay cho phím . Các kí hiệu mô tả nhóm file và phím Khi gõ lệnh thực sự nhiều trường hợp người dùng mong muốn một tham số trong lệnh không chỉ xác định một file mà lại liên quan đến một nhóm các file mà tên gọi của các file trong nhóm có chung một tính chất nào đó. Trong những trường hợp như vậy, người dùng cần sử dụng các kí hiệu mô tả nhóm file (wildcards), chúng ta gọi là kí hiệu mô tả nhóm (còn được gọi là kí hiệu thay thế). Người ta sử dụng các kí tự *, ? và cặp hai dấu [ và ] để mô tả nhóm file. Các kí tự này mang ý nghĩa như sau khi viết vào tham số tên file thực sự: "*" : là ký tự mô tả nhóm gồm mọi xâu kí tự (thay thế mọi xâu). Mô tả này cho một nhóm lớn nhất trong ba mô tả. "?" : mô tả nhóm gồm mọi xâu với độ dài không quá 1 (thay thế một kí tự). Nhóm này là tập con của nhóm đầu tiên (theo kí tự "*"). [xâu-kí-tự] : mô tả nhóm gồm mọi xâu có độ dài 1 là mỗi kí tự thuộc xâu nói trên. Mô tả này cho một nhóm có lực lượng bé nhất trong ba mô tả. Nhóm này là tập con của nhóm thứ hai (theo kí tự "?"). Khi gõ lệnh phải gõ cả hai dấu [ và ]. Một dạng khác của mô tả nhóm này là [ - ] nghĩa là giữa cặp dấu ngoặc có ba kí tự trong đó kí tự ở giữa là dấu nối (dấu -) thì cách viết này tương đương với việc liệt kê mọi kí tự từ đến . Chẳng hạn, cách viết [a-d] tương đương với cách viết [abcd]. Ví dụ, giả sử khi muốn làm việc với tất cả các file trong một thư mục nào đó, người dùng gõ * thay thế tham số file thì xác định được các tên file sau (chúng ta viết bốn tên file trên một dòng): info-dir initlog.conf inittab lynx.cfg mail.rc mailcap minicom.users motd 19
- mtab mtools.conf services shadow shadow- shells smb.conf sysctl.conf syslog.conf temp termcap up2date.conf temp termcap Nếu người dùng gõ s* (để chỉ các tên có chữ cái đầu là s) thay thế tham số file thì xác định được các tên file sau: shadow shadow- shells sysctl.conf syslog.conf Nếu người dùng gõ [si]* (để chỉ các tên có chữ cái đầu là s hoặc i, chú ý dùng cả hai kí tự [ và ]) thay thế tham số file thì xác định các tên file sau: info-dir initlog.conf inittab services shadow shadow- shells smb.conf sysctl.conf syslog.conf Lưu ý: . Như vậy, Linux (và UNIX nói chung) không chỉ sử dụng hai kí tự mô tả nhóm * và ? mà còn có cách thức sử dụng cặp kí tự [ và ]. . Cần phân biệt cặp dấu [ và ] được sử dụng khi người dùng gõ lệnh có ý nghĩa hoàn toàn khác với ý nghĩa của chúng khi được sử dụng trong mô tả lệnh. Hơn thế nữa, Linux còn cung cấp cho người dùng cách thức sử dụng phím để hoàn thành nốt tên file (tên thư mục) trong lệnh. Ví dụ, khi chúng ta gõ dòng lệnh # ls /u local b thì nó cũng tương đương như gõ dòng lệnh (và đây chính là nội dung xuất hiện tại dấu nhắc shell): # ls /usr/local/bin với điều kiện trong thư mục /usr chỉ có thư mục local được bắt đầu bởi chữ "l" và trong thư mục local cũng chỉ có thư mục bin được bắt đầu bởi chữ "b". Trong trường hợp nếu như một kí tự chưa đủ xác định, người dùng cần gõ thêm kí tự tiếp theo trong tên file (tên thư mục) và nhấn phím để hoàn thành dòng lệnh. 1.3.4. Tiếp nối dòng lệnh Như đã lưu ý trên đây, một dòng lệnh có thể gồm một hoặc một số lệnh, mặt khác tham số của lệnh có thể là rất dài không thể trong khuôn khổ của một dòng văn bản được. Khi gõ lệnh, nếu dòng lệnh quá dài, Linux cho phép ngắt dòng lệnh xuống dòng dưới bằng cách thêm kí tự báo hiệu chuyển dòng "\" tại cuối dòng; trong trường hợp đó, kí tự "\" phải là ký tự cuối cùng thuộc dòng lệnh trước. Ví dụ, # cd vsd\ thumuc thì dòng thứ hai là phần tiếp theo của dòng thứ nhất và kết hợp cả hai dòng này thực chất là một dòng lệnh Linux. 20
- 1.4. Trang Man Chúng ta có thể nói rằng Linux là một hệ điều hành rất phức tạp với hàng nghìn lệnh và mỗi lệnh lại có thể có tới vài hoặc vài chục tình huống sử dụng do chúng cho phép có nhiều tùy chọn lệnh. Để thuộc hết được nội dung tất cả các lệnh của Linux là một điều hết sức khó khăn, có thể nói là không thể. Linux cho phép người dùng sử dụng cách thức gọi trang Man để có được các thông tin đầy đủ giới thiệu nội dung các lệnh. Dưới đây là một số nội dung về cách thức sử dụng trang Man. "Man" là từ viết tắt của "manual", được coi là tài liệu trực tuyến trong Linux đã lưu trữ toàn bộ các lệnh có sẵn với các thông tin tham khảo khá đầy đủ cho phép người dùng có thể mở ra để nhận được trợ giúp. Để mở trang Man của một lệnh, chúng ta sử dụng lệnh man của Linux và gõ: # man Nội dung của trang Man tuy không phải là quá khó hiểu, song để hiểu hết được nó cũng đòi hỏi không ít thời gian. Tuy vậy, nếu quên nội dung một lệnh nào đó thì cách tốt nhất là hãy sử dụng trang Man. Cấu trúc chung của một trang Man như sau: COMMAND(1) Linux Programmer's Manual COMMAND(1) NAME tên lệnh - khái quát tác dụng của lệnh SYNOPSIS cú pháp của lệnh DESCRIPTION mô tả cụ thể hơn về tác dụng của lệnh OPTIONS liệt kê các tùy chọn lệnh và tác dụng của chúng FILES liệt kê các file mà lệnh sử dụng hoặc tham chiếu đến SEE ALSO liệt kê các lệnh, các tài liệu, , có liên quan đến lệnh REPORTING BUGS địa chỉ liên hệ nếu gặp lỗi khi sử dụng lệnh AUTHOR tên tác giả của lệnh Người dùng thậm chí không nhớ chính xác tên lệnh. Linux còn có một cách thức hỗ trợ người dùng có thể nhanh chóng tìm được lệnh cần sử dụng trong trường hợp chỉ nhớ những chữ cái đầu của tên lệnh, đó là cách thức sử dụng phím TAB. Trong cách thức này, người dùng chỉ cần nhớ một số chữ cái đầu tiên của tên lệnh. Có thể trình bày cách thức đó theo cú pháp sau đây: # Trong đó dãy-chữ-cái có từ một đến một vài chữ cái thuộc phần đầu của tên lệnh. Chú ý rằng, các chữ cái và hai phím phải được gõ liên tiếp nhau. Kết hợp cách thức này với cách thức sử dụng lệnh man (với sự phong phú về tùy chọn của lệnh man) nhận được một cách thức khá tuyệt vời trợ giúp người dùng. 21
- Ví dụ, muốn sử dụng lệnh history nhưng lại không nhớ chính xác tên lệnh được viết ra như thế nào mà chỉ nhớ nó được bắt đầu bởi chữ h, hãy gõ chữ h đó tại dấu nhắc shell và nhấn phím TAB hai lần, sẽ thấy một danh sách các lệnh có chữ cái đầu tiên là h được hiện ra trên màn hình: # h h2ph hboot help hexdump history hostname htdigest h2xs hcc helpme hf77 hltest hoststat htpasswd halt hcp helptool hinotes host hpcdtoppm hash head hexbin hipstopgm hostid hpftodit Như vậy, tất cả các lệnh có tên bắt đầu với chữ h được hiển thị trên màn hình và cho phép người dùng có thể xác định được lệnh cần quan tâm. Trường hợp tồn tại một số lượng lớn các lệnh có cùng chữ cái đầu tiên mà người dùng đã gõ, thay vì hiện hết mọi tên lệnh, hệ điều hành cho ra một thông báo hỏi người dùng có muốn xem toàn bộ các lệnh đó hay không. Người dùng đáp ứng thông báo đó tuỳ theo ý muốn của mình. Ví dụ, khi người dùng gõ nội dung như sau: # p thì hệ thống đáp lại là: There are 289 possibilities. Do you really wish to see them all? (y or n) Người dùng gõ phím "y" nếu muốn xem, hoặc gõ "n" nếu bỏ qua. Người dùng có thể gõ nhiều hơn một chữ cái ở đầu tên lệnh và điều đó cho phép giảm bớt số tên lệnh mà hệ thống tìm được và hiển thị. Chẳng hạn, khi biết hai chữ cái đầu là "pw" và người dùng gõ: # pw thì hệ thống sẽ hiện ra danh sách các tên lệnh bắt đầu bởi "pw": pwck pwconv pwd pwdb_chkpwd pwunconv Trong trường hợp này, người dùng sẽ nhận biết được tên lệnh đang cần tìm thuận tiện hơn. 22
- CHƯƠNG 2. THAO TÁC VỚI HỆ THỐNG 2.1. Quá trình khởi động Linux Trong phần này, chúng ta xem xét sơ bộ quá trình khởi động hệ điều hành Linux. Một trong những cách thức khởi động Linux phổ biến nhất là cách thức do chương trình LILO (LInux LOader) thực hiện. Chương trình LILO được nạp lên đĩa của máy tính khi cài đặt hệ điều hành Linux. LILO được nạp vào Master Boot Record của đĩa cứng hoặc vào Boot Sector tại phân vùng khởi động (trên đĩa cứng hoặc đĩa mềm). Giả sử máy tính của chúng ta đã cài đặt Linux và sử dụng LILO để khởi động hệ điều hành. LILO thích hợp với việc trên máy tính được cài đặt một số hệ điều hành khác nhau và theo đó, LILO còn cho phép người dùng chọn lựa hệ điều hành để khởi động. Giai đoạn khởi động Linux tùy thuộc vào cấu hình LILO đã được lựa chọn trong quá trình cài đặt Linux. Trong tình huống đơn giản nhất, Linux được khởi động từ đĩa cứng hay đĩa mềm khởi động. Quá trình khởi động Linux có thể được mô tả theo sơ đồ sau: LILO Nhân init Theo sơ đồ này, LILO được tải vào máy để thực hiện mà việc đầu tiên là đưa nhân vào bộ nhớ trong và sau đó tải chương trình init để thực hiện việc khởi động Linux. Nếu cài đặt nhiều phiên bản Linux hay cài Linux cùng các hệ điều hành khác (trong các trường hợp như thế, mỗi phiên bản Linux hoặc hệ điều hành khác được gán nhãn - label để phân biệt), thì thông báo sau đây được LILO đưa ra: LILO boot: cho phép nhập xâu là nhãn của một trong những hệ điều hành hiện có trên máy để khởi động nó. Tại thời điểm đó, người dùng cần gõ nhãn của hệ điều hành cần khởi động vào, ví dụ, gõ LILO boot: linux nếu chọn khởi động để làm việc trong Linux, hoặc gõ LILO boot: dos nếu chọn khởi động để làm việc trong MS-DOS, Windows. Lưu ý: . Nếu chúng ta không nhớ được nhãn của hệ điều hành có trong máy để chọn, hãy gõ phím để được LILO cho biết nhãn của các hệ điều hành. LILO boot: sẽ hiện ra danh sách các nhãn (ví dụ như): linux dos và hiện lại thông báo nói trên để ta gõ nhãn của hệ điều hành. . LILO cũng cho phép đặt chế độ chọn ngầm định hệ điều hành để khởi động mà theo đó nếu chúng ta không có tác động gì sau thông báo chọn hệ điều hành thì LILO sẽ tự động chọn hệ điều hành ngầm định ra để khởi động. Nếu chúng ta không can thiệp vào các file tương ứng của trình LILO thì hệ điều hành Linux là hệ điều hành ngầm định. 23
- Giả sử Linux đã được chọn để khởi động. Khi init thực hiện, chúng ta sẽ thấy một chuỗi (khoảng vài chục) dòng thông báo cho biết hệ thống phần cứng được Linux nhận diện và thiết lập cấu hình cùng với tất cả trình điều khiển phần mềm được nạp khi khởi động. Quá trình init là quá trình khởi thủy, là cha của mọi quá trình. Tại thời điểm khởi động hệ thống init thực hiện vai trò đầu tiên của mình là chạy chương trình shell trong file /etc/inittab và các dòng thông báo trên đây chính là kết quả của việc chạy chương trình shell đó. Sau khi chương trình shell trên được thực hiện xong, bắt đầu quá trình người dùng đăng nhập (login) vào hệ thống. 2.2. Thủ tục đăng nhập và các lệnh thoát khỏi hệ thống 2.2.1. Đăng nhập Sau khi hệ thống Linux (lấy Red Hat 6.2 làm ví dụ) khởi động xong, trên màn hình xuất hiện những dòng sau: Ret Hat Linux release 6.2 (Zoot) Kernel 2.2.14-5.0 on an i686 May1 login: Dòng thứ nhất và dòng thứ hai cho biết loại phiên bản Linux, phiên bản của nhân và Chúng ta có thể thay đổi các dòng hiển thị như trình bày trên đây bằng cách sửa đổi file /etc/rc.d/rc.local như sau: Thay đoạn chương trình echo "" > /etc/issue echo "$R" >> /etc/issue echo "Kernel $(uname -r) on $a $SMP$(uname -m)" >> /etc/issue cp -f /etc/issue /etc/issue.net echo >> /etc/issue thành echo "" > /etc/issue echo "Thông báo muốn hiển thị" >> /etc/issue ví dụ sửa thành: echo "" > /etc/issue echo "This is my computer" >> /etc/issue thì trên màn hình đăng nhập sẽ có dạng sau: This is my computer hostname login: kiến trúc phần cứng có trên máy, dòng thứ ba là dấu nhắc đăng nhập để người dùng thực hiện việc đăng nhập. Chú ý là các dòng trên đây có thể thay đổi chút ít tùy thuộc vào phiên bản Linux. Tại dấu nhắc đăng nhập, hãy nhập tên người dùng (còn gọi là tên đăng nhập): đây là tên kí hiệu đã cung cấp cho Linux nhằm nhận diện một người dùng cụ thể. Tên đăng nhập ứng với mỗi người dùng trên hệ thống là duy nhất, kèm theo một mật khẩu đăng nhập. May1 login: root Password: 24
- Khi nhập xong tên đăng nhập, hệ thống sẽ hiện ra thông báo hỏi mật khẩu và di chuyển con trỏ xuống dòng tiếp theo để người dùng nhập mật khẩu. Mật khẩu khi được nhập sẽ không hiển thị trên màn hình và chính điều đó giúp tránh khỏi sự "nhòm ngó" của người khác. Nếu nhập sai tên đăng nhập hoặc mật khẩu, hệ thống sẽ đưa ra một thông báo lỗi: May1 login: root Password: Login incorrect Máy1 login: Nếu đăng nhập thành công, người dùng sẽ nhìn thấy một số thông tin về hệ thống, một vài tin tức cho người dùng Lúc đó, dấu nhắc shell xuất hiện để người dùng bắt đầu phiên làm việc của mình. May1 login: root Password: Last login: Fri Oct 27 14:16:09 on tty2 Root[may1 /root]# Dãy kí tự trong dòng cuối cùng chính là dấu nhắc shell. Trong dấu nhắc này, root là tên người dùng đăng nhập, may1 là tên máy và /root tên thư mục hiện thời (vì đây là người dùng root). Khi dấu nhắc shell xuất hiện trên màn hình thì điều đó có nghĩa là hệ điều hành đã sẵn sàng tiếp nhận một yêu cầu mới của người dùng. Dấu nhắc shell có thể khác với trình bày trên đây (Mục 2.7 cung cấp cách thay đổi dấu nhắc shell), nhưng có thể hiểu nó là chuỗi kí tự bắt đầu một dòng có chứa trỏ chuột và luôn xuất hiện mỗi khi hệ điều hành hoàn thành một công việc nào đó. 2.2.2. Ra khỏi hệ thống Để kết thúc phiên làm việc người dùng cần thực hiện thủ tục ra khỏi hệ thống. Có rất nhiều cách cho phép thoát khỏi hệ thống, ở đây chúng ta xem xét một số cách thông dụng nhất. . Cách đơn giản nhất để đảm bảo thoát khỏi hệ thống đúng đắn là nhấn tổ hợp phím CTRL+ALT+DEL. Khi đó, trên màn hình sẽ hiển thị một số thông báo của hệ thống và cuối cùng là thông báo thoát trước khi tắt máy. Cần chú ý là: Nếu đang làm việc trong môi trường X Window System, hãy nhấn tổ hợp phím CTRL+ALT+BACKSPACE trước rồi sau đó hãy nhấn CTRL+ALT+DEL. . Cách thứ hai là sử dụng lệnh shutdown với cú pháp như sau: shutdown [tùy-chọn] [cảnh-báo] Lệnh này cho phép dừng tất cả các dịch vụ đang chạy trên hệ thống. Các tùy-chọn của lệnh này như sau: . -k : không thực sự shutdown mà chỉ cảnh báo. . -r : khởi động lại ngay sau khi shutdown. . -h : tắt máy thực sự sau khi shutdown. . -f : khởi động lại nhanh và bỏ qua việc kiểm tra đĩa. 25
- . -F : khởi động lại và thực hiện việc kiểm tra đĩa. . -c : bỏ qua không chạy lệnh shutdown. Trong tùy chọn này không thể đưa ra tham số thời gian nhưng có thể đưa ra thông báo giải thích trên dòng lệnh gửi cho tất cả các người dùng. . -t số-giây : qui định init(8) chờ khoảng thời gian số-giây tạm dừng giữa quá trình gửi cảnh báo và tín hiệu kill, trước khi chuyển sang một mức chạy khác. và hai tham số vị trí còn lại: . time : đặt thời điểm shutdown. Tham số time có hai dạng. Dạng tuyệt đối là gg:pp (gg: giờ trong ngày, pp: phút) thì hệ thống sẽ shutdown khi đồng hồ máy trùng với giá trị tham số. Dạng tương đối là + là hẹn sau thời khoảng phút sẽ shutdown; coi shutdown lập tức tương đương với +0. . cảnh-báo : thông báo gửi đến tất cả người dùng trên hệ thống. Khi lệnh thực hiện tất cả các máy người dùng đều nhận được cảnh báo. Ví dụ, khi người dùng gõ lệnh: shutdown +1 Sau mot phut nua he thong se shutdown! trên màn hình của tất cả người dùng xuất hiện thông báo "Sau mot phut nua he thong se shutdown! " và sau một phút thì hệ thống shutdown thực sự. . Cách thứ ba là sử dụng lệnh halt với cú pháp như sau: halt [tùy-chọn] Lệnh này tắt hẳn máy. Các tuỳ chọn của lệnh halt: . -w : không thực sự tắt máy nhưng vẫn ghi các thông tin lên file /var/log/wtmp (đây là file lưu trữ danh sách các người dùng đăng nhập thành công vào hệ thống). . -d : không ghi thông tin lên file /var/log/wtmp. Tùy chọn -n có ý nghĩa tương tự song không tiến hành việc đồng bộ hóa. . -f : thực hiện tắt máy ngay mà không thực hiện lần lượt việc dừng các dịch vụ có trên hệ thống. . -i : chỉ thực hiện dừng tất cả các dịch vụ mạng trước khi tắt máy. Chúng ta cần nhớ rằng, nếu thoát khỏi hệ thống không đúng cách thì dẫn đến hậu quả là một số file hay toàn bộ hệ thống file có thể bị hư hỏng. Lưu ý: . Có thể sử dụng lệnh exit để trở về dấu nhắc đăng nhập hoặc kết thúc phiên làm việc bằng lệnh logout. 2.2.3. Khởi động lại hệ thống Ngoài việc thoát khỏi hệ thống nhờ các cách thức trên đây (ấn tổ hợp ba phím Ctrl+Alt+Del, dùng lệnh shutdown hoặc lệnh halt), khi cần thiết (chẳng hạn, gặp phải tình huống một trình ứng dụng chạy quẩn) có thể khởi động lại hệ thống nhờ lệnh reboot. Cú pháp lệnh reboot: reboot [tùy-chọn] 26
- Lệnh này cho phép khởi động lại hệ thống. Nói chung thì chỉ siêu người dùng mới được phép sử dụng lệnh reboot, tuy nhiên, nếu hệ thống chỉ có duy nhất một người dùng đang làm việc thì lệnh reboot vẫn được thực hiện song hệ thống đòi hỏi việc xác nhận mật khẩu. Các tùy chọn của lệnh reboot như sau là -w, -d, -n, -f, -i có ý nghĩa tương tự như trong lệnh halt. 2.2.4. Khởi động vào chế độ đồ hoạ Linux cho phép nhiều chế độ khởi động, những chế độ này được liệt kê trong file /etc/inittab. Dưới đây là nội dung của file này: # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) - Đây là chế độ dừng hoạt động của hệ thống # 1 - Single user mode - Đây là chế độ đơn người dùng, ta có thể đăng nhập vào chế độ này trong trường hợp muốn khắc phục một số sự cố. # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) - Đây là chế độ đa người dùng, giao diện text, không hỗ trợ kết nối mạng. # 3 - Full multiuser mode – Chế độ đa người dùng, giao diện text # 4 – unused – Không sử dụng chế độ này # 5 - X11 - Đây là chế độ đa người dùng, giao diện đồ hoạ # 6 - reboot (Do NOT set initdefault to this) – Chế độ khởi động lại máy tính # id:3:initdefault: - Đây là chế độ ngầm định hệ thống sẽ sử dụng để khởi động # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Things to run in every runlevel. ud::once:/sbin/update # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now #ca::ctrlaltdel:/bin/echo "You can't do that" 27
- # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 #3:2345:respawn:/sbin/mingetty tty3 #4:2345:respawn:/sbin/mingetty tty4 #5:2345:respawn:/sbin/mingetty tty5 #6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm –nodaemon Trong đó chế độ khởi động số 3 là chế độ khởi động vào chế độ Text, và chế độ 5 là khở động vào chế độ đồ hoạ. Như vậy để cho máy tính khởi động vào chế độ đồ hoạ ta sửa lại dòng cấu hình id:3:initdefault: thành id:5:initdefault: Trong Linux có một số loại giao diện đồ hoạ do một số tổ chức viểt ra. Hai tổ chức nổi tiếng là GNOME ( và KDE ( đã viểt ra các giao diện đồ hoạ mang tên trùng với tổ chức đó là GNOME và KDE. Cũng tuỳ vào việc được cài giao diện GNOME hay KDE mà khi khởi động vào chế độ đồ hoạ, máy tính có các giao diện tương ứng. Trên hình trên là giao diện GNOME mà khi 28
- khởi động vào chế độ đồ hoạ. Mặt khác, các giao diện này liên tục được phát triển, do đó ở mỗi phiên bản sẽ có sự khác nhau. Trong giao diện đăng nhập đồ họa, hệ thống hiển thị hộp thoại cho phép người dùng nhập vào tên tài khoản; sau khi người dùng nhập tên tài khoản của mình, hệ thống hỏi tiếp mật khẩu. Nếu cả tên tài khoản và mật khẩu đều chính xác thì người dùng được phép vào hệ thống và một giao diện làm việc mới sẽ hiện ra như hình dưới. 2.3. Lệnh thay đổi mật khẩu Mật khẩu là vấn đề rất quan trọng trong các hệ thống đa người dùng và để đảm bảo tính bảo mật tối đa, cần thiết phải chú ý tới việc thay đổi mật khẩu. Thậm chí trong trường hợp hệ thống chỉ có một người sử dụng thì việc thay đổi mật khẩu vẫn là rất cần thiết. Mật khẩu là một xâu kí tự đi kèm với tên người dùng để đảm bảo cho phép một người vào làm việc trong hệ thống với quyền hạn đã được quy định. Trong quá trình đăng nhập, người dùng phải gõ đúng tên và mật khẩu, trong đó gõ mật khẩu là công việc bắt buộc phải thực hiện. Tên người dùng có thể được công khai song mật khẩu thì tuyệt đối phải được đảm bảo bí mật. · Việc đăng ký tên và mật khẩu của siêu người dùng được tiến hành trong quá trình khởi tạo hệ điều hành Linux. · Việc đăng ký tên và mật khẩu của một người dùng thông thường được tiến hành khi một người dùng mới đăng ký tham gia sử dụng hệ thống. Thông thường siêu người dùng cung cấp tên và mật khẩu cho người dùng mới (có thể do người dùng đề nghị) 29
- và dùng lệnh adduser (hoặc lệnh useradd) để đăng ký tên và mật khẩu đó với hệ thống. Sau đó, người dùng mới nhất thiết cần thay đổi mật khẩu để bảo đảm việc giữ bí mật cá nhân tuyệt đối. Lệnh passwd cho phép thay đổi mật khẩu ứng với tên đăng nhập người dùng. Cú pháp lệnh passwd: passwd [tùy-chọn] [tên-người-dùng] với các tùy chọn như sau: . -k : thay đổi mật khẩu người dùng. Lệnh đòi hỏi phải xác nhận quyền bằng việc gõ mật khẩu đang dùng trước khi thay đổi mật khẩu. Cho phép người dùng thay đổi mật khẩu của mình độc lập với siêu người dùng. . -f : đặt mật khẩu mới cho người dùng song không cần tiến hành việc kiểm tra mật khẩu đang dùng. Chỉ siêu người dùng mới có quyền sử dụng tham số này. . -l : khóa một tài khoản người dùng. Việc khóa tài khoản thực chất là việc dịch bản mã hóa mật khẩu thành một xâu ký tự vô nghĩa bắt đầu bởi kí hiệu "!". Chỉ siêu người dùng mới có quyền sử dụng tham số này. . -stdin : việc nhập mật khẩu người dùng chỉ được tiến hành từ thiết bị vào chuẩn không thể tiến hành từ đường dẫn (pipe). Nếu không có tham số này cho phép nhập mật khẩu cả từ thiết bị vào chuẩn hoặc từ đường dẫn. . -u : mở khóa (tháo bỏ khóa) một tài khoản (đối ngẫu với tham số -l). Chỉ siêu người dùng mới có quyền sử dụng tham số này. . -d : xóa bỏ mật khẩu của người dùng. Chỉ siêu người dùng mới có quyền sử dụng tham số này. . -S : hiển thị thông tin ngắn gọn về trạng thái mật khẩu của người dùng được đưa ra. Chỉ siêu người dùng mới có quyền sử dụng tham số này. Nếu tên-người-dùng không có trong lệnh thì ngầm định là chính người dùng đã gõ lệnh này. Ví dụ khi người dùng user1 gõ lệnh: # passwd user1 hệ thống thông báo: Changing password for user user1 New UNIX password: để người dùng nhập mật khẩu mới của mình vào. Sau khi người dùng gõ xong mật khẩu mới, hệ thống cho ra thông báo: BAD PASSWORD: it is derived from your password entry Retype new UNIX password: để người dùng khẳng định một lần nữa mật khẩu vừa gõ dòng trên (nhớ phải gõ lại đúng hệt như lần trước). Chớ nên quá phân vân vì thông báo ở dòng phía trên vì hầu hết khi gõ mật khẩu mới luôn gặp những thông báo kiểu đại loại như vậy, chẳng hạn như: BAD PASSWORD: it is too simplistic/systematic Và sau khi chúng ta khẳng định lại mật khẩu mới, hệ thống cho ra thông báo: Passwd: all authentication tokens updated successfully. cho biết việc thay đổi mật khẩu thành công và dấu nhắc shell lại hiện ra. Khi siêu người dùng gõ lệnh: 30
- # passwd -S root sẽ hiện ra thông báo Changing password for user root Password set, MD5 encryption cho biết thuật toán mã hóa mật khẩu mà Linux sử dụng là một thuật toán hàm băm có tên là MD5. Lưu ý: . Có một lời khuyên đối với người dùng là nên chọn mật khẩu không quá đơn giản quá (nhằm tránh người khác dễ dò tìm ra) hoặc không quá phức tạp (tránh khó khăn cho chính người dùng khi phải ghi nhớ và gõ mật khẩu). Đặc biệt không nên sử dụng họ tên, ngày sinh, số điện thoại của bản thân hoặc người thân làm mật khẩu vì đây là một trong những trường hợp mật khẩu đơn giản nhất. . Nếu thông báo mật khẩu quá đơn giản được lặp đi lặp lại một vài lần và không có thông báo mật khẩu mới thành công đã quay về dấu nhắc shell thì nên gõ lại lệnh và chọn một mật khẩu mới phức tạp hơn đôi chút. 2.4. Lệnh xem, thiết đặt ngày, giờ hiện tại và xem lịch trên hệ thống 2.4.1 Lệnh xem, thiết đặt ngày, giờ Lệnh date cho phép có thể xem hoặc thiết đặt lại ngày giờ trên hệ thống. Cú pháp của lệnh gồm hai dạng, dạng xem thông tin về ngày, giờ: date [tùy-chọn] [+định-dạng] và dạng thiết đặt lại ngày giờ cho hệ thống: date [tùy-chọn] [MMDDhhmm[ [CC[YY] ]-ss]] Các tùy-chọn như sau: . -d, date=xâu-văn-bản : hiển thị thời gian dưới dạng xâu-văn-bản, mà không lấy "thời gian hiện tại của hệ thống” như theo ngầm định; xâu-văn-bản được đặt trong hai dấu nháy đơn hoặc hai dấu nháy kép. . -f, file=file-văn-bản : giống như một tham số date nhưng ứng với nhiều ngày cần xem: mỗi dòng của file-văn-bản có vai trò như một xâu-văn-bản trong trường hợp tham số date. . -I, iso-8601[=mô-tả] : hiển thị ngày giờ theo chuẩn ISO-8601 (ví dụ: 2000-11-8). -I tương đương với tham số iso-8601='date' Với iso-8601: nếu mô-tả là 'date' (hoặc không có) thì hiển thị ngày, nếu mô-tả là 'hours' hiển thị ngày+giờ, nếu mô-tả là 'minutes': ngày+giờ+phút; nếu mô-tả là 'seconds': ngày + giờ + phút + giây. . -r, reference= file : hiển thị thời gian sửa đổi file lần gần đây nhất. . -R, rfc-822 : hiển thị ngày theo RFC-822 (ví dụ: Wed, 8 Nov 2000 09:21:46 -0500). . -s, set=xâu-văn-bản : thiết đặt lại thời gian theo kiểu xâu-văn-bản. . -u, utc, universal : hiển thị hoặc thiết đặt thời gian theo UTC (ví dụ: Wed Nov 8 14:29:12 UTC 2000). . help : hiển thị thông tin trợ giúp và thoát. 31
- Trong dạng lệnh date cho xem thông tin ngày, giờ thì tham số định-dạng điều khiển cách hiển thị thông tin kết quả. Định-dạng là dãy có từ một đến nhiều cặp gồm hai kí tự, trong mỗi cặp kí tự đầu tiên là % còn kí tự thứ hai mô tả định dạng. Do số lượng định dạng là rất nhiều vì vậy chúng ta chỉ xem xét một số định dạng điển hình (để xem đầy đủ các định dạng, sử dụng lệnh man date). Dưới đây là một số định dạng điển hình: . %% : Hiện ra chính kí tự %. . %a : Hiện ra thông tin tên ngày trong tuần viết tắt theo ngôn ngữ bản địa. . %A : Hiện ra thông tin tên ngày trong tuần viết đầy đủ theo ngôn ngữ bản địa. . %b : Hiện ra thông tin tên tháng viết tắt theo ngôn ngữ bản địa. . %B : Hiện ra thông tin tên tháng viết đầy đủ theo ngôn ngữ bản địa. Trong dạng lệnh date cho phép thiết đặt lại ngày giờ cho hệ thống thì tham số [MMDDhhmm[ [CC[YY] [.ss]] mô tả ngày, giờ mới cần thiết đặt, trong đó: MM: hai số chỉ tháng, DD: hai số chỉ ngày trong tháng, hh: hai số chỉ giờ trong ngày, mm: hai số chỉ phút, CC: hai số chỉ thế kỉ, YY: hai số chỉ năm trong thế kỉ. Các dòng ngay dưới đây trình bày một số ví dụ sử dụng lệnh date, mỗi ví dụ được cho tương ứng với một cặp hai dòng, trong đó dòng trên mô tả lệnh được gõ còn dòng dưới là thông báo của Linux. # date Wed Jan 3 23:58:50 ICT 2001 # date -d='01/01/2000' Sat Jan 1 00:00:00 ICT 2000 # date -iso-8601='seconds' 2000-12-01T00:36:41-0500 # date -d='01/01/2001' Mon Jan 1 00:00:00 ICT 2001 # date 010323502001.50 Wed Jan 3 23:50:50 ICT 2001 # date +%a%A Wed Wednesday # date +%a%A%b%B Wed Wednesday Jan January # date +%D%%%j 01/05/01%005 2.4.2. Lệnh xem lịch Lệnh cal cho phép xem lịch trên hệ thống với cú pháp như sau: cal [tùy-chọn] [ [ ]] 32
- nếu không có tham số, lịch của tháng hiện thời sẽ được hiển thị. Các tuỳ-chọn là: . -m : chọn ngày Thứ hai là ngày đầu tiên trong tuần (mặc định là ngày Chủ nhật). . -j : hiển thị số ngày trong tháng dưới dạng số ngày trong năm (ví dụ: ngày 1/11/2000 sẽ được hiển thị dưới dạng là ngày thứ 306 trong năm 2000, số ngày bắt đầu được tính từ ngày 1/1). . -y : hiển thị lịch của năm hiện thời. Ví dụ: # cal 1 2001 January 2001 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Khi nhập dòng lệnh trên, trên màn hình sẽ hiển thị lịch của tháng 1 năm 2001, mặc định chọn ngày chủ nhật là ngày bắt đầu của tuần. Dưới đây là ví dụ hiển thị số ngày trong tháng 3 dưới dạng số ngày trong năm 2001. # cal -j 3 2001 March 2001 Su Mo Tu We Th Fr Sa 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 2.5. Xem thông tin hệ thống Lệnh uname cho phép xem thông tin hệ thống với cú pháp là: uname [tùy-chọn] Nếu không có tuỳ chọn thì hiện tên hệ điều hành. Lệnh có các tùy chọn là: . -a, all : hiện tất cả các thông tin. . -m, machine : kiểu kiến trúc của bộ xử lý (i386, i486, i586, i686 ). . -n, nodename : hiện tên của máy. . -r, release : hiện nhân của hệ điều hành. . -s, sysname : hiện tên hệ điều hành. . -p, processor : hiện kiểu bộ xử lý của máy chủ. Ví dụ, nếu gõ lệnh # uname -a 33
- thì màn hình sẽ hiện ra như sau: Linux linuxsrv.linuxvn.net 2.2.14-5.0 #1 Tue Mar 7 21:07:39 EST 2000 i686 unknown # Thông tin hiện ra có tất cả 6 trường là: Tên hệ điều hành: Linux Tên máy: linuxsrv.linuxvn.net Tên nhân của hệ điều hành: 2.2.14-5.0 Ngày sản xuất: #1 Tue Mar 7 21:07:39 EST 2000 Kiểu kiến trúc bộ xử lý: i686 Kiểu bộ xử lý của máy chủ: unknown Ví dụ nếu gõ lệnh: # uname -spr thì màn hình sẽ hiện ra như sau: Linux 2.2.14-5.0 unknown là tên hệ điều hành, tên nhân và kiểu bộ xử lý của máy chủ. Lưu ý: . Chúng ta làm rõ thêm nội dung lưu ý trong mục 1.3.1 về tham số khóa kết hợp: Trong ví dụ trên đây khi viết tham số -spr là yêu cầu thực hiện lệnh usame với nghĩa kết hợp tình huống theo cả ba tham số khóa -s, -p, -r. Chú ý rằng, không thể viết -s -p -r thay cho -spr được. Như đã lưu ý ở mục 1.3.1 trong nhiều lệnh của Linux cho phép viết kết hợp các tham số khóa theo cách thức như trên miễn là các tham số đó không xung khắc với nhau. 2.6. Thay đổi nội dung dấu nhắc shell Trong Linux có hai loại dấu nhắc: dấu nhắc cấp một (dấu nhắc shell) xuất hiện khi nhập lệnh và dấu nhắc cấp hai (dấu nhắc nhập liệu) xuất hiện khi lệnh cần có dữ liệu được nhập từ bàn phím và tương ứng với hai biến nhắc tên là PS1 và PS2. PS1 là biến hệ thống tương ứng với dấu nhắc cấp 1: Giá trị của PS1 chính là nội dung hiển thị của dấu nhắc shell. Để nhận biết thông tin hệ thống hiện tại, một nhu cầu đặt ra là cần thay đổi giá trị của các biến hệ thống PS1 và PS2. Linux cho phép thay đổi giá trị của biến hệ thống PS1 bằng lệnh gán trị mới cho nó. Lệnh này có dạng: # PS1=' ' Năm (5) kí tự đầu tiên của lệnh gán trên đây (PS1=') phải được viết liên tiếp nhau. Dãy kí tự nằm giữa cặp hai dấu nháy đơn (có thể sử dụng cặp hai dấu kép ") và không được phép chứa dấu nháy. Dãy kí tự này bao gồm các cặp kí tự điều khiển và các kí tự khác, cho phép có thể có dấu cách. Cặp kí tự điều khiển gồm hai kí tự, kí tự đầu tiên là dấu sổ xuôi "\" còn kí tự thứ hai nhận một trong các trường hợp liệt kê trong bảng dưới đây. Bảng dưới đây giới thiệu một số cặp ký tự điều khiển có thể được sử dụng khi muốn thay đổi dấu nhắc lệnh: Cặp ký tự điều khiển Ý nghĩa 34
- \! Hiển thị thứ tự của lệnh trong lịch sử \# Hiển thị thứ tự của lệnh \$ Hiển thị dấu đô-la ($). Đối với siêu người dùng (super user), thì hiển thị dấu số hiệu (#) \\ Hiển thị dấu sổ (\) \d Hiển thị ngày hiện tại \h Hiển thị tên máy (hostname) \n Ký hiệu xuống dòng \s Hiển thị tên hệ shell \t Hiển thị giờ hiện tại \u Hiển thị tên người dùng \W Hiển thị tên thực sự của thư mục hiện thời (ví dụ thư mục hiện thời là /mnt/hda1 thì tên thực sự của nó là /hda1) \w Hiển thị tên đầy đủ của thư mục hiện thời (ví dụ /mnt/hda1) Ví dụ, hiện thời dấu nhắc shell có dạng: root[may1 /hda1]# Sau khi gõ lệnh root@may1 /hda1]# PS1='[\h@\u \w : \d]\$' thì dấu nhắc shell được thay đổi là: [may1@root /mnt/hda1 : Fri Oct 27 ]# ngoài việc đổi thứ tự giữa tên người dùng và máy còn cho chúng ta biết thêm về ngày hệ thống quản lý và tên đầy đủ của thư mục hiện thời. Linux cung cấp cách thức hoàn toàn tương tự như đối với biến PS1 để thay đổi giá trị biến hệ thống PS2 tương ứng với dấu nhắc cấp hai. 2.7. Lệnh gọi ngôn ngữ tính toán số học Linux cung cấp một ngôn ngữ tính toán với độ chính xác tùy ý thông qua lệnh bc. Khi yêu cầu lệnh này, người dùng được cung cấp một ngôn ngữ tính toán (và cho phép lập trình tính toán có dạng ngôn ngữ lập trình C) hoạt động theo thông dịch. Trong ngôn ngữ lập trình được cung cấp (tạm thời gọi là ngôn ngữ bc), tồn tại rất nhiều công cụ hỗ trợ tính toán và lập trình tính toán: kiểu phép toán số học phong phú, phép toán so sánh, một số hàm chuẩn, biến chuẩn, cấu trúc điều khiển, cách thức định nghĩa hàm, cách thức thay đổi độ chính xác, đặt lời chú thích Chỉ cần sử dụng một phần nhỏ tác động của lệnh bc, chúng ta đã có một "máy tính số bấm tay" hiệu quả. Cú pháp lệnh bc: bc [tùy-chọn] [file ] với các tuỳ chọn sau đây: . -l, mathlib : thực hiện phép tính theo chuẩn thư viện toán học (ví dụ: 5/5=1.00000000000000000000). . -w, warn : khi thực hiện phép tính không tuân theo chuẩn POSIX (POSIX là một chuẩn trong Linux) thì một cảnh báo xuất hiện. 35
- . -s, standard : thực hiện phép tính chính xác theo chuẩn của ngôn ngữ POSIX bc. . -q, quiet : không hiện ra lời giới thiệu về phần mềm GNU khi dùng bc. Tham số file là tên file chứa chương trình viết trên ngôn ngữ bc, khi lệnh bc thực hiện sẽ tự động chạy các file chương trình này (Nếu có nhiều tham số thì có nghĩa sẽ chạy nhiều chương trình liên tiếp nhau). Dưới đây là một ví dụ sử dụng lệnh bc ở dạng đơn giản nhất. Khi gõ lệnh tại dấu nhắc: # bc -l màn hình xuất hiện lời giới thiệu về GNU khi dùng bc và ngôn ngữ bc được kích hoạt để phục vụ người dùng. bc 1.05 Copyright 1991, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 5^3 125 12+12+78*7-62/4 554.50000000000000000000 a=4 a^a 256 a*78 312 b=45 a*b 180 a/b .08888888888888888888 a%b .00000000000000000040 ở đây * là phép nhân, ^ là phép tính luỹ thừa, / là phép chia lấy thương, % là chia lấy phần dư. Lưu ý: . Ngôn ngữ lập trình tính toán bc là một ngôn ngữ rất mạnh có nội dung hết sức phong phú cho nên trong khuôn khổ của tài liệu này không thể mô tả hết các nội dung của ngôn ngữ đó được. Chúng ta cần sử dụng lệnh man bc để nhận được thông tin đầy đủ về lệnh bc và ngôn ngữ tính toán bc. .Ở đây trình bày sơ bộ một số yếu tố cơ bản nhất của ngôn ngữ đó (bt là viết tắt của biểu thức, b là viết tắt của biến): Các phép tính: - bt: lấy đối; ++ b, b, b ++, b : phép toán tăng, giảm b; các phép toán hai ngôi cộng +, trừ -, nhân *, chia /, lấy phần dư %, lũy thừa nguyên 36
- bậc ^; gán =; gán sau khi thao tác =; các phép toán so sánh , >=, bằng ==, khác != Phép so sánh cho 1 nếu đúng, cho 0 nếu sai. Bốn biến chuẩn là scale số lượng chữ số phần thập phân; last giá trị tính toán cuối cùng; ibase cơ số hệ đếm đối với input và obase là cơ số hệ đếm với output (ngầm định hai biến này có giá trị 10). Các hàm chuẩn sin s (bt); cosin c (bt); arctg a (bt); lôgarit tự nhiên l (bt); mũ cơ số tự nhiên e (bt); hàm Bessel bậc nguyên n của bt là j (n, bt). 37
- CHƯƠNG 3. HỆ THỐNG FILE 3.1 Tổng quan về hệ thống file 3.1.1. Một số khái niệm Người dùng đã từng làm việc với hệ điều hành DOS/Windows thì rất quen biết với các khái niệm: file (tập tin), thư mục, thư mục hiện thời Để đảm bảo tính hệ thống và thuận tiện cho người dùng chưa từng làm việc thành thạo với một hệ điều hành nào khác, chương này vẫn giới thiệu về các khái niệm này một cách sơ bộ. 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ý theo yêu cầu của người dùng. Cách tổ chức dữ liệu trong file thuộc về chủ của nó là 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, một tập hợp dữ liệu 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 (chẳng hạn đĩa từ) và đảm bảo các thao tác lên file. Chính vì có 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 cách nào đọc/ghi lên các vùng của đĩa từ mà vẫn thực hiện được yê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. Trước khi giới thiệu một số nội dung liên quan đến tên file và tên thư mục, chúng ta giới thiệu sơ bộ về khái niệm thư mục. Để làm việc được với các 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, hay nói theo một cách khác, thư mục chứa 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, theo nghĩa này, thư mục cũng được coi là file song trong một số trường hợp để phân biệt với "file" thư mục, chúng ta dùng thuật ngữ file thông thường. Khác với file thông thường, hệ điều hành lại quan tâm đến nội dung của thư mục. Một số nội dung sau đây liên quan đến tên file (bao gồm cả tên thư mục): Tên file trong Linux có thể dài tới 256 ký tự, bao 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, ví dụ: This_is.a.VERY_long.filename. Nếu trong tên file có dấu chấm "." thì 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 (hoặc file). Ví dụ, tên file trên đây có phần mở rộng là .filename. Chú ý rằng khái niệm 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). Lưu ý: . Chúng ta nên lưu ý rằng, không phải ký tự nào cũng có nghĩa. Nếu có hai file chỉ khác nhau ở ký tự cuối cùng, thì đối với Linux, đó là hai file có thể trùng tên. Bởi lẽ, Linux chỉ lấy 32 hay 64 ký tự đầu tiên trong tên file mà thôi (tùy theo phiên bản Linux), phần tên file còn lại dành cho chủ của file, Linux theo dõi thông tin, nhưng thường không xem các ký tự đứng sau ký tự thứ 33 hay 65 là quan trọng đối với nó. Xin nhắc lại lưu ý về phân biệt chữ hoa và chữ thường đối với tên thư mục/file, ví dụ hai file FILENAME.tar.gz và filename.tar.gz là hai file khác nhau. 38
- Nếu trong tên thư mục/file có chứa khoảng trống, sẽ phải đặt tên thư mục/file vào trong cặp dấu nháy kép để sử dụng thư mục/file đó. Ví dụ, để tạo thư mục có tên là “My document” chẳng hạn, hãy đánh dòng lệnh sau: # mkdir "My document" Một số ký tự sau không được sử dụng trong tên thư mục/file: !, *, $, &, # Khi sử dụng chương trình mc (Midnight Commander), việc hiển thị tên file sẽ bổ sung một kí tự theo nghĩa: dấu "*" cho file khả thi trong Linux, dấu "~" cho file sao lưu, dấu "." cho file ẩn, dấu "@" cho file liên kết Tập hợp tất cả các file có trong hệ điều hành được gọi là hệ thống file là một hệ thống thống nhất. Bởi chính từ cách thức sử dụng thư mục, hệ thống file được tổ chức lôgic theo dạng hình cây: Hệ thống file được xuất phát từ một thư mục gốc (được kí hiệu là "/") và cho phép tạo ra thư mục con trong một thư mục bất kỳ. Thông thường, khi khởi tạo Linux đã có ngay hệ thống file của nó. Hình 3.1. cho minh họa một phần trong cây lôgic của hệ thống file. Để chỉ một file hay một thư mục, chúng ta cần đưa ra một đường dẫn, ví dụ để đường dẫn xác định file Xclients trong hình 3.1. chúng ta viết như sau: /etc/X11/xinit/Xclients / root bin etc usr home dev peng office52 sh date who X11 src bin user1 user2 tty00 tty01 xinit Xclients Xmodmap Hình 3.1. Một phần cấu trúc lôgic dạng cây của hệ thống File 39
- Đường dẫn này cho biết Xclients nằm trong xinit, xinit nằm trong X11, X11 nằm trong etc và etc nằm trong gốc /. Tên file thường là tham số thực sự khi gõ lệnh và công việc gõ lệnh trở nên rất nặng nề đối với người dùng nếu như trong lệnh phải gõ một đường dẫn dài theo dạng trên (được biết với tên gọi là đường dẫn tuyệt đối). Vì vậy, Linux (cũng như nhiều hệ điều hành khác) sử dụng khái niệm thư mục hiện thời của mỗi người dùng làm việc trong hệ thống. Thư mục hiện thời là một thư mục trong hệ thống file mà hiện thời "người dùng đang ở đó". Qua thư mục hiện thời, Linux cho phép người dùng chỉ một file trong lệnh ngắn gọn hơn nhiều. Ví dụ, nếu thư mục hiện thời là thư mục xinit thì để chỉ file đã nói, người dùng chỉ cần viết Xclients hoặc ./Xclients trong đó kí hiệu "." để chỉ thư mục hiện thời. Đường dẫn được xác định qua thư mục hiện thời được gọi là đường dẫn tương đối. Khi một người dùng đăng nhập vào hệ thống, Linux luôn chuyển người dùng vào thư mục riêng, và tại thời điểm đó thư mục riêng là thư mục hiện thời của người dùng. Thư mục riêng của siêu người dùng là /root, thư mục riêng của người dùng có tên là user1 là /home/user1 Linux cho phép dùng lệnh cd để chuyển sang thư mục khác (lấy thư mục khác làm thư mục hiện thời). Hai dấu chấm " " được dùng để chỉ thư mục ngay trên thư mục hiện thời (cha của thư mục hiện thời). Linux còn cho phép ghép một hệ thống file trên một thiết bị nhớ (đĩa mềm, vùng đĩa cứng chưa được đưa vào hệ thống file) thành một thư mục con trong hệ thống file của hệ thống bằng lệnh mount. Các hệ thống file được ghép thuộc vào các kiểu khác nhau. Hai mục tiếp theo (3.1.2 và 3.1.3.) giới thiệu những nội dung sâu hơn về hệ thống file Linux. 3.1.2. Sơ bộ kiến trúc nội tại của hệ thống file Trên đĩa từ, hệ thống file được coi 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 là cố định trong một hệ thống file. Trong hệ thống file, 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 của hệ thống file bao 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. Dưới đây, chúng ta xem xét sơ lược nội dung các thành phần cấu trúc nội tại một hệ thống file. Siêu khối Siêu khối chứa nhiều thông tin liên quan đến trạng thái của hệ thống file. Trong siêu khối có các trường sau đây: . Kích thước của danh sách inode (khái niệm inode sẽ được giải thích trong mục sau): định kích cỡ vùng không gian trên Hệ thống file quản lý các inode. . Kích thước của hệ thống file. Hai kích thước trên đây tính theo đơn vị dung lượng bộ nhớ ngoài, 40
- . Một danh sách chỉ số các khối rỗi (thường trực trên siêu khối) trong hệ thống file. Chỉ số các khối rỗi thường trực trên siêu khối được dùng để đáp ứng nhu cầu phân phối mới. Chú ý rằng, danh sách chỉ số các khối rỗi có trên siêu khối chỉ là một bộ phận của tập tất cả các khối rỗi có trên hệ thống file. . Chỉ số của khối rỗi tiếp theo trong danh sách các khối rỗi. Chỉ số khối rỗi tiếp theo dùng để hỗ trợ việc tìm kiếm tiếp các khối rỗi: bắt đầu tìm từ khối có chỉ số này trở đi. Điều đó có nghĩa là mọi khối có chỉ số không lớn hơn chỉ số này hoặc có trong danh sách các khối rỗi thường trực hoặc đã được cấp phát cho một file nào đó. Nhiều thao tác tạo file mới, xoá file, thay đổi nội dung file v.v. cập nhật các thông tin này. . Một danh sách các inode rỗi (thường trực trên siêu khối) trong hệ thống file. 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. Thông thường, danh sách này chỉ chứa một bộ phận các inode rỗi trên hệ thống file. . Chỉ số inode rỗi tiếp theo trong danh sách các inode rỗi. Chỉ số inode rỗi tiếp theo định vị việc tìm kiếm tiếp thêm inode rỗi: bắt đầu tìm từ inode có chỉ số này trở đi. Điều đó có nghĩa là mọi inode có chỉ số không lớn hơn chỉ số này hoặc có trong danh sách các inode rỗi thường trực hoặc đã được tương ứng với một file nào đó. Hai tham số trên đây tạo thành cặp xác định được danh sách các inode rỗi trên hệ thống file các thao tác tạo file mới, xoá file cập nhật thông tin này. . Các trường khóa (lock) danh sách các khối rỗi và danh sách inode rỗi: Trong một số trường hợp, chẳng hạn khi hệ thống đang làm việc thực sự với đĩa từ để cập nhật các danh sách này, hệ thống không cho phép cập nhật tới hai danh sách nói trên. . Cờ chỉ dẫn về việc siêu khối đã được biến đổi: Định kỳ thời gian siêu khối ở bộ nhớ trong được cập nhật lại vào siêu khối ở đĩa từ và vì vậy cần có thông tin về việc siêu khối ở bộ nhớ trong khác với nội dung ở bộ nhớ ngoài: nếu hai bản không giống nhau thì cần phải biến đổi để chúng được đồng nhất. . Cờ chỉ dẫn rằng hệ thống file chỉ có thể đọc (cấm ghi): Trong một số trường hợp, hệ thống đang cập nhật thông tin từ bộ nhớ ngoài thì chỉ cho phép đọc đối với hệ thống file, . 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 (đơn vị phân phối dữ liệu) của hệ thống file. Hiện tại kích thước phổ biến của khối là 1KB. Trong thời gian máy hoạt động, theo từng giai đoạn, nhân sẽ đưa siêu khối lên đĩa nếu nó đã được biến đổi để phù hợp với dữ liệu trên hệ thống file. Một trong khái niệm cốt lõi xuất hiện trong hệ thống file đó là inode. Các đối tượng liên quan đến khái niệm này sẽ được trình bày trong các mục tiếp theo. 41
- Inode Mỗi khi một quá trình khởi tạo một file mới, nhân hệ thống sẽ gán cho nó một inode chưa sử dụng. Để hiểu rõ hơn về inode, chúng ta xem xét sơ lược mối quan hệ liên quan giữa file dữ liệu và việc lưu trữ trên vật dẫn ngoài đối với Linux. Nội dung của file được chứa trong vùng dữ liệu của hệ thống file và được phân chia các khối dữ liệu (chứa nội dung file) và hình ảnh phân bố nội dung file có trong một inode tương ứng. Liên kết đến tập hợp các khối dữ liệu này là một inode, chỉ thông qua inode mới có thể làm việc với dữ liệu tại các khối dữ liệu: Inode chứa dựng thông tin về tập hợp các khối dữ liệu nội dung file. Có thể quan niệm rằng, tổ hợp gồm inode và tập các khối dữ liệu như vậy là một file vật lý: inode có thông tin về file vật lý, trong đó có địa chỉ của các khối nhớ chứa nội dung của file vật lý. Thuật ngữ inode là sự kết hợp của hai từ index với node và được sử dụng phổ dụng trong Linux. Các inode được phân biệt nhau theo chỉ số của inode: đó chính là số thứ tự của inode trong danh sách inode trên hệ thống file. Thông thường, hệ thống dùng 2 bytes để lưu trữ chỉ số của inode. Với cách lưu trữ chỉ số như thế, không có nhiều hơn 65535 inode trong một hệ thống file. Như vậy, một file chỉ có một inode song một file lại có 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 (tên file và chỉ số inode là hai trường của một phần tử của một thư mục). Một inode có thể tương ứng với một hoặc nhiều tên file, mỗi tương ứng như vậy được gọi là một liên kết. Inode được lưu trữ tại vùng danh sách các inode. Trong quá trình làm việc, Linux dùng một vùng bộ nhớ, được gọi là bảng inode (trong một số trường hợp, nó còn được gọi tường minh là bảng sao in-core inode) với chức năng tương ứng với vùng danh sách các inode có trong hệ thống file, hỗ trợ cho quá trình truy nhập dữ liệu trong hệ thống file. Nội dung của một in-core inode không chỉ chứa các thông tin trong inode tương ứng mà còn được bổ sung các thông tin mới giúp cho quá trình xử lý inode. Chúng ta xem xét cấu trúc nội tại của một inode để thấy được sự trình bày nội tại của một file. Inode bao gồm các trường thông tin sau đây: . Kiểu file. Trong Linux phân loại các kiểu file: file thông thường (regular), thư mục, đặc tả kí tự, đặc tả khối và ống dẫn FIFO (pipes). Linux quy định trường kiểu file có giá trị 0 tương ứng đó là inode chưa được sử dụng. . Quyền truy nhập file. Trong Linux, file là một tài nguyên chung của hệ thống vì vậy quyền truy nhập file được đặc biệt quan tâm để tránh những trường hợp truy nhập không hợp lệ. Đối với một inode, có 3 mức quyền truy nhập liên quan đến các đối tượng: mức chủ của file (đối tượng này được ký hiệu là u: từ chữ user), mức nhóm người dùng của chủ nhân của file (đối tượng này được ký hiệu là g: từ chữ group), mức người dùng khác (đối tượng này được ký hiệu là a: từ chữ all). Quyền truy nhập là đọc, ghi, thực hiện hoặc một tổ hợp nào đó từ nhóm gồm 3 quyền trên. Chú ý rằng, 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 đó. . Số lượng liên kết đối với inode: Đây chính là số lượng các tên file trên các thư mục được liên kết với inode này, 42
- . Định danh chủ nhân của inode, . Định danh nhóm chủ nhân: xác định tên nhóm người dùng mà chủ file là một thành viên của nhóm này, . Độ 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, Bảng địa chỉ chứa các địa chỉ khối nhớ chứa nội dung file. Bảng này có 13 phần tử địa chỉ, trong đó có 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 và một phần tử gián tiếp bậc 3 (chi tiết có trong phần sau). Nội dung của file thay đổi khi có thao tác ghi lên nó; nội dung của một inode thay đổi khi nội dung của file thay đổi hoặc thay đổi chủ hoặc thay đổi quyền hoặc thay đổi số liên kết. Ví dụ về nội dung một inode như sau: 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 Bản sao in-core inode còn bổ sung thêm trường trạng thái của in-core inode. Trường trạng thái của in-core inode có các thông tin sau: inode đã bị khoá, một quá trình đang chờ đợi khi inode tháo khóa, in-core inode khác với inode do sự thay đổi dữ liệu trong inode, in-core inode khác với inode do sự thay đổi dữ liệu trong file, số lượng các tên file nối với file đang được mở, số hiệu thiết bị lôgic của hệ thống file chứa file nói trên chỉ số inode: dùng để liên kết với inode trên đĩa, các móc nối tới các in-core inode khác. Trong bộ nhớ trong, các in-core inode được liên kết theo một hàng băm và một danh sách tự do. Trong danh sách hàng băm các in-core inode hòa hợp theo số hiệu thiết bị lôgic và số hiệu inode. Trong quá trình hệ thống làm việc, nảy sinh khái niệm inode tích cực nếu như có một quá trình đang làm việc với inode đó (như mở file). Một inode thuộc vào danh sách các inode rỗi khi không có file vật lý nào tương ứng với inode đó. 43
- Bảng chứa địa chỉ khối dữ liệu của File trong UNIX Bảng chứa địa chỉ khối dữ liệu của file gồm 13 phần tử với 10 phần tử trực tiếp và 3 phần tử gián tiếp: Mỗi phần tử có độ dài 4 bytes, chứa một số hiệu của một khối nhớ trên đĩa. Mỗi phần tử trực tiếp trỏ tới 1 khối dữ liệu thực sự chứa nội dung file. Phần tử gián tiếp bậc 1 (single indirect) trỏ tới 1 khối nhớ ngoài. Khác với phần tử trực tiếp, khối nhớ ngoài này không dùng để chứa dữ liệu của file mà lại chứa danh sách chỉ số các khối nhớ ngoài và chính các khối nhớ ngoài này mới thực sự chứa nội dung file. Như vậy, nếu khối có độ dài 1KB và một chỉ số khối ngoài có độ dài 4 bytes thì địa chỉ gián tiếp cho phép định vị không gian trên đĩa lưu trữ dữ liệu của file tới 256KB (Không gian bộ nhớ ngoài trong vùng dữ liệu phải dùng tới là 257KB). Tương tự đối với các phần tử gián tiếp mức cao hơn. Cơ chế quản lý địa chỉ file như trên cho thấy có sự phân biệt giữa file nhỏ với file lớn. File nhỏ có độ dài bé hơn và theo cách tổ chức như trên, phương pháp truy nhập sẽ cho phép tốc độ nhanh hơn, đơn giản hơn do chỉ phải làm việc với các phần tử trực tiếp. Khi xử lý, thuật toán đọc File tiến hành theo các cách khác nhau đối với các phần tử trực tiếp và gián tiếp. Cơ chế tổ chức lưu trữ nội dung Fle như đã trình bày cho phép độ dài file có thể lên tới (224+216 + 28+10) khối. Vùng dữ liệu bao gồm các khối dữ liệu, mỗi khối dữ liệu được đánh chỉ số để phân biệt. Khối trên vùng dữ liệu được dùng để chứa nội dung các file, nội dung các thư mục và nội dung các khối định vị địa chỉ của các file. Chú ý rằng, chỉ số của khối dữ liệu được chứa trong 32 bit và thông tin này xác định dung lượng lớn nhất của hệ thống file. 3.1.3. Một số thuật toán làm việc với inode Hệ thống lời gọi hệ thống file Khi làm việc với file thường thông qua lời gọi hệ thống. Một số lời gọi hệ thống thường gặp như mở file open, đóng file close, đọc nội dung file read, ghi nội dung file write v.v. Bảng dưới đây thống kê các lời gọi hệ thống làm việc với hệ thống file và phân loại theo chức năng của mỗi lời gọi hệ thống (một lời gọi có thể được nhắc tới một số lần): Thời điểm Sử dụng namei gán inode thuộc Vào-ra Cấu trúc hệ Quản sử dụng file tính file file thống file lý cây open open stat creat chown read mont chdir creat creat link mknod chmod write umount chown dup chdir unlink link stat cseek pipe chroot mknod unlink close chown mount chmod umount Thuật toán hệ thống file mức thấp Namei iget iput Ialloc ifree alloc free bmap Thuật toán định vị buffer getblk brelse Bread breada bwrite Hình 3.2. Tổng thể về lời gọi hệ thống File 44
- Chúng ta xem xét một số thuật toán làm việc với inode. Thuật toán truy nhập tới inode (iget) Nhiều tình huống đòi hỏi thuật toán iget, chẳng hạn như, một quá trình mở một file mới hoặc tạo một file mới v.v Thuật toán iget cấp phát một bản in-core inode đối với một số hiệu inode. Tuy nhiên, trong trường hợp chưa có bản sao in-core inode thì dể có nội dung của nó cần phải đọc được nội dung của inode đó và cần định vị khối dữ liệu chứa inode đã cho. Công thức liên quan đến khối đĩa từ chứa inode để có thể đọc vào bộ nhớ trong như sau: Chỉ số khối chứa inode = (số hiệu inode - 1) / (số lượng inode trong một khối nhớ) + chỉ số khối nhớ đầu tiên chứa danh sách inode trên đĩa. Sau khi đã đọc khối đĩa chứa inode vào bộ nhớ trong, để xác định chính xác vị trí của inode, chúng ta có công thức sau: Byte vị trí đầu tiên = ((số hiệu inode - 1) mod (số lượng inode trong một khối nhớ))*độ dài một inode Ví dụ, nếu như 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. Để ý rằng, khi làm việc với một hệ thống file thì super block của nó luôn có mặt trong bộ nhớ trong để hệ thống có những thông tin làm việc. Chú ý rằng, trong super block có một danh sách các inode rỗi (trên nó) và một danh sách các khối rỗi. Thuật toán iget nhận một inode để cho nó tích cực và điều đó tùy thuộc vào một số tình huống sau đây: - Nếu inode không tồn tại trong vùng đệm mà lại không thuộc danh sách các inode rỗi trên super block thì hệ thống phải thông báo một lỗi đã đưọc gặp. Lỗi này xảy ra do yêu cầu một inode không còn đủ vùng đệm làm việc với file nữa (tương ứng với trường hợp trong MS-DOS thông báo: too many files opened), - inode đã có trong vùng đệm các inode trên hệ thống file (đã có in-core inode). Trong trường hợp này xử lý theo hai bước: + inode tương ứng đã bị khóa bởi một quá trình khác: lúc đó phải đợi cho đến khi quá trình trước đây không khóa inode nữa. Sau khi được tháo khóa inode có thể trở thành tích cực hoặc rỗi, + Nếu inode ở danh sách các inode rỗi thì loại bỏ nó khỏi danh sách này bằng cách đặt inode sang tích cực. - inode không tồn tại trên vùng đệm tuy nhiên danh sách các inode rỗi khác rỗng. Khi danh sách các inode này khác rỗng, có nghĩa là có những inode không có giá trị: loại bỏ nó và đặt inode mới vào thay thế. Thuật toán iput loại bỏ inode Thuật toán iput có chức năng đối ngẫu với thuật toán iget: cần tháo bớt sự xuất hiện của một inode, chẳng hạn khi chương trình thực hiện thao tác đóng file. Khác với trường hợp thuật toán iget, thuật toán iput không nảy sinh tình huống sai sót. Trong thuật toán này, khi một quá trình không làm việc với một file được liên kết với một inode nữa thì một số tình huống xẩy ra: - Hệ thống giảm số lượng file tích cực đi 1, - Nếu số lượng file tích cực là 0 thì: 45
- + Nếu đó là lệnh xoá file thì trước đó hệ thống đã thực hiện thao tác giảm số liên kết với inode đi 1 và vì vậy có thể số lượng liên kết trở thành 0, có nghĩa là sự tồn tại của file vật lý không còn. Khi đó, chúng ta thực hiện việc xoá thức sự file nói trên bằng một số thao tác: giải phóng các khối dữ liệu, đặt kiểu file của inode là 0 và giải phóng inode. + khi số liên kết >0 thi cần cập nhật sự thay đổi của inode lên đĩa từ. - Trong trường hợp số lượng file tích cực vẫn dương thì không thực hiện thao tác gì. Chú ý là trong thuật toán này có sử dụng thuật toán ifree. Thuật toán ialloc gán inode cho một file mới Khi một file mới được xuất hiện, chẳng hạn khởi tạo file creat, phải cung cấp một inode cho file và thuật toán ialloc đáp ứng đòi hỏi trên. Hoạt động của thuật toán ialloc được giải thích như sau: - kiểm tra danh sách inode rỗi trên super block, xảy ra một trong hai trường hợp hoặc danh sách rỗng hoặc không rỗng, - Nếu danh sách không rỗng thì lấy một inode tiếp theo cho file, khởi tạo các giá trị ban đầu của inode đó và giảm số inode rỗi trên super trên super block. - Nếu danh sách các inode rỗi trên super block là rỗng: tìm kiếm trên hệ thống file những inode rỗi để tải vào danh sách các inode rỗi trên super block. Nếu danh sách đó đầy hoặc không tìm thấy được nữa thì gán một inode cho file. Nếu danh sách inode rỗi trên super block là rỗng và không tìm thấy inode rỗi trên đĩa thì sẽ có thông báo lỗi. Trên danh sách các inode rỗi, nhân lưu giữ một inode được gọi là inode nhớ, chính là inode cuối cùng được tìm thấy để sau này thuận lợi cho tìm kiếm. Thuật toán ifree tải một inode rỗi trên đĩa vào danh sách các inode rỗi trên super block Thuật toán namei tìm chỉ số một inode theo tên file Thuật toán namei là một thuật toán phổ dụng, nhiều thuật toán làm việc với file phải sử dụng namei. Từ tên một đường dẫn file/thư mục, thuật toán namei cho inode tương ứng. Thuật toán cấp phát dữ liệu trên đĩa Khi nhân muốn cấp phát một khối dữ liệu, nó sẽ cấp phát khối rỗi tiếp theo đã được ghi nhận trong super block. Khi một khối dữ liệu đã được cấp cho một file thì nó chỉ được cấp phát lại khi nó trở thành rỗi. Nếu không còn khối rỗng nào trên hệ thống file mà lại có nhu cầu cung cấp khối thì nhân sẽ thông báo lỗi. 3.1.4. Hỗ trợ nhiều hệ thống File Các phiên bản đầu tiên của Linux chỉ hỗ trợ một hệ thống file duy nhất đó là hệ thống file minix. Sau đó, với sự mở rộng nhân, cộng đồng Linux đã thêm vào nó rất nhiều kiểu hệ thống file khác nhau và Linux trở thành một hệ điều hành hỗ trợ rất nhiều hệ thống file. Dưới đây là một số hệ thống file thông dụng trong các hệ điều hành khác nhau được Linux hỗ trợ. 46
- Hệ thống file ADFS: ADFS viết tắt của Acorn Disc Filing System là hệ thống file chuẩn trên hệ điều hành RiscOS. Với sự hỗ trợ này, Linux có thể truy cập vào các phân vùng đĩa định dạng theo hệ thống file ADFS. Hệ thống file AFFS: AFFS (The Amiga Fast File System) là một hệ thống file phổ biến của hệ điều hành AmigaOS phiên bản 1.3 chạy trên các máy Amiga. Hệ thống file CODA: CODA là một hệ thống file mạng cho phép người dùng có thể kết gán các hệ thống file từ xa và truy cập chúng như các hệ thống file cục bộ (local). Hệ thống file DEVPTS: Hệ thống file cho Unix98 PTYs. Hệ thống file EFS: Đây là một dạng hệ thống file sử dụng cho CDROM. Hệ thống file EXT2: Hệ thống file EXT2 (The second extended filesystem) là hệ thống được dùng chủ yếu trên các phiên bản của hệ điều hành Linux. Chúng ta sẽ trở lại ngiên cứu hệ thống file này trong các phần sau. Hệ thống file HFS: Đây là hệ thống file chạy trên các máy Apple Macintosh. Hệ thống file HPFS: HPFS là hệ thống file được sử dụng trong hệ điều hành OS/2. Linux hỗ trợ hệ thống file này ở mức chỉ đọc (read only). Hệ thống file ISOFS: Đây là hệ thống file được sử dụng cho các đĩa CD. Hệ thống thông dụng nhất cho các đĩa CD hiện nay là ISO 9660. Với sự hỗ trợ này, hệ thống Linux có thể truy cập dữ liệu trên các đĩa CD. Hệ thống file MINIX: MINIX là hệ thống file đầu tiên mà Linux hỗ trợ. Hệ thống file này được sử dụng trong hệ điều hành Minix và một số hệ thống Linux cũ. Hệ thống file MSDOS: Với sự hỗ trợ này, hệ thống Linux có thể truy cập được các phân vùng của hệ điều hành MSDOS. Linux cũng có thể sử dụng kiểu MSDOS để truy cập các phân vùng của Window 95/98 tuy nhiên khi đó, các ưu điểm của hệ điều hành Window sẽ không còn giá trị ví dụ như tên file chỉ tối đa 13 ký tự (kể cả mỏ rộng). Hệ thống file NFS: NFS (Network File System) là một hệ thống file trên mạng hỗ trợ việc truy cập dữ liệu từ xa giống như hệ thống file CODA. Với NFS, các máy chạy Linux có thể chia sẻ các phân vùng đĩa trên mạng để sử dụng như là các phân vùng cục bộ của chính máy mình. Hệ thống file NTFS: Với sự hỗ trợ này, hệ thống Linux có thể truy cập vào các phân vùng của hệ điều hành Microsoft Window NT. Hệ thống file PROC: Đây là một hệ thống file đặc biệt được Linux hỗ trợ. Hệ thống file PROC không chiếm một phân vùng nào của hệ thống và cũng không quản lý các dữ liệu lưu trữ trên đĩa. PROC hiển thị nội dung của chính nhân hệ thống. Các file trong hệ thống file PROC lưu trữ các thông tin về trạng thái hiện hành của nhân. Thông tin về mỗi một tiến trình đang thực hiện trong hệ thống được lưu trong một thư mục mang tên ứng với chỉ số process ID của tiến trình đó. Người dùng có thể sử dụng hệ thống file PROC để lấy các thông tin về nhân cũng như sửa đổi một số giá trị của nhân thông qua sửa đổi nội dung của các file trong hệ thống file này. Tuy nhiên, việc sửa đổi trực tiếp như trên tương đối nguy hiểm, dễ gây đổ vỡ hệ thống. Hệ thống file QNX4: Đây là hệ thống file được sử dụng trong hệ điều hành QNX 4. 47