Bài giảng Hệ điều hành mã nguồn mở
MỤC LỤC
Chƣơng 1. GIỚI THIỆU CHUNG VỀ LINUX . 6
1.1. Giới thiệu chung . 6
1.1.1. Tổng quan về Linux . 6
1.1.2. Vấn đề bản quyền . 6
1.1.3. Các thành phần tích hợp Hệ điều hành Linux . 7
1.1.4. Một số đặc điểm chính của Linux . 7
1.2. Các thành phần cơ bản của Linux . 8
1.2.1. Nhân hệ thống (kernel) . 8
1.2.2. Hệ vỏ (shell) . 9
1.3. Sử dụng lệnh trong Linux . 9
1.3.1. Dạng tổng quát của lệnh Linux . 10
1.3.2. Các ký hiệu đại diện . 11
1.3.3. Trợ giúp lệnh . 11
Chƣơng 2. THAO TÁC VỚI HỆ THỐNG. 12
2.1. Tiến trình khởi động Linux . 12
2.2. Thủ tục đăng nhập và các lệnh thoát khỏi hệ thống . 12
2.2.1. Đăng nhập . 12
2.2.2. Ra khỏi hệ thống . 12
2.2.3. Khởi động lại hệ thống . 13
2.2.4. Khởi động vào chế độ đồ hoạ . 13
2.3. Một số liên quan đến hệ thống . 15
2.3.1. Lệnh thay đổi mật khẩu . 15
2.3.2. Lệnh xem, thiết lập ngày, giờ . 15
2.3.3. Lệnh kiểm tra những ai đang sử sụng hệ thống . 15
2.3.4. Thay đổi nội dung dấu nhắc shell . 15
2.3.5. Lệnh gọi ngôn ngữ tính toán số học . 16
Chƣơng 3. HỆ THỐNG FILE . 17
3.1 Tổng quan về hệ thống file . 17
3.1.1. Một số khái niệm . 17
3.1.2. Sơ bộ kiến trúc nội tại của hệ thống file . 18
3.1.3. Hỗ trợ nhiều hệ thống File . 20
3.1.4. Liên kết tƣợng trƣng (lệnh ln) . 21
3.2 Quyền truy nhập thƣ mục và file . 22
3.2.1 Quyền truy nhập . 22
3.2.2. Các lệnh cơ bản . 23
3.3 Thao tác với thƣ mục . 25
3.3.1 Một số thƣ mục đặc biệt . 25
3.3.2 Các lệnh cơ bản về thƣ mục . 26
3.4. Các lệnh làm việc với file . 28
3.4.1 Các kiểu file có trong Linux . 28
3.4.2. Các lệnh tạo file . 29
- 2 -3.4.3 Các lệnh thao tác trên file . 30
3.4.4 Các lệnh thao tác theo nội dung file . 32
3.4.5 Các lệnh tìm file . 35
3.5 Nén và sao lƣu các file . 37
3.5.1 Sao lƣu các file (lệnh tar) . 37
3.5.2 Nén dữ liệu . 38
CHƢƠNG 4. QUẢN TRỊ HỆ THỐNG VÀ NGƢỜI DÙNG . 41
4.1. Quản trị ngƣời dùng . 41
4.1.1. Tài khoản ngƣời dùng . 41
4.1.2. Các lệnh cơ bản quản lý ngƣời dùng . 41
4.2. Các lệnh cơ bản liên quan đến nhóm ngƣời dùng . 44
4.2.1. Nhóm ngƣời dùng và file /etc/group . 45
4.2.2. Các lệnh cơ bản khác có liên quan đến ngƣời dùng . 46
4.3. Quản trị hệ thống . 47
4.3.1. Quản lý tiến trình . 47
4.3.2 Quản trị phần mềm . 51
4.3.3. Quản trị hệ thống Linux . 51
Chƣơng 5. TRUYỀN THÔNG VÀ MẠNG UNIX-LINUX . 53
5.1. Lệnh truyền thông . 53
5.1.1. Lệnh write . 53
5.1.2. Lệnh mail . 53
5.1.3. Lệnh talk . 54
5.2 Cấu hình Card giao tiếp mạng . 54
5.3. Các dịch vụ mạng . 55
5.3.1 Hệ thông tin mạng NIS . 55
5.3.2. Cài đặt và cấu hình cho máy chủ NIS . 56
5.3.3. Cài đặt các máy trạm NIS . 56
5.3.4. Lựa chọn các file map . 57
5.3.5. Sử dụng các file map passwd và group . 58
5.4 Hệ thống file trên mạng . 59
5.4.1 Cài đặt NFS . 59
5.4.2 Khởi động và dừng NFS . 59
5.4.3 Cấu hình NFS server và Client . 60
5.4.4 Sử dụng mount . 60
5.4.5 Unmount . 61
5.4.6 Mount tự động qua tệp cấu hình . 61
Chƣơng 6. LẬP TRÌNH SHELL VÀ LẬP TRÌNH C TRÊN LINUX . 62
6.1. Cách thức pipes và các yếu tố cơ bản lập trình trên shell . 62
6.1.1. Cách thức pipes . 62
6.1.2. Các yếu tố cơ bản để lập trình trong shell . 62
6.2. Một số lệnh lập trình trên shell . 65
6.2.1. Sử dụng các toán tử bash . 65
6.2.2. Điều khiển luồng . 67
- 3 -6.2.3 Các hàm shell . 75
6.2.4. Các toán tử định hƣớng vào ra . 75
6.2.5. Hiện dòng văn bản . 76
6.2.5. Lệnh read đọc dữ liệu cho biến ngƣời dùng . 76
6.2.6. Lệnh set . 77
6.2.7. Tính toán trên các biến . 77
6.2.8. Chƣơng trình ví dụ . 77
6.3. Lập trình C trên UNIX . 78
6.3.1. Trình biên dịch gcc . 78
6.3.2. Công cụ GNU make . 80
6.3.3. Làm việc với file . 81
6.3.4. Thƣ viện liên kết . 83
6.3.5 Các công cụ cho thƣ viện . 89
chia sẻ Để truy cập một đối tƣợng chia sẻ, dùng hàm dlopen() có đặc tả nhƣ sau: void *dlopen(const char *filename, int flag); - 88 - dlopen() truy cập đối tƣợng chia sẻ bằng filename và bằng cờ. Filename có thể là đƣờng dẫn đầy đủ, tên file rút gọn hay NULL. Nếu là NULL dlopen() mở chƣơng trình đang chạy, đó là chƣơng trình của bạn, nếu filename là đƣờng dẫn dlopen() mở file đó, nếu là tên rút gọn dlopen() sẽ tìm trong vị trí sau để tìm file: $LD_ELF_LiBRARY_PATH, $LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib, và /lib. Cờ có thể là RTLD_LAZY, có nghĩa là các ký hiệu (symbol) hay tên hàm từ đối tƣợng truy cập sẽ đƣợc tìm mỗi khi chúng đƣợc gọi, hoặc cờ có thể là RTLD_NOW, có nghĩa tất cả ký hiệu từ đối tƣợng truy cập sẽ đƣợc tìm trƣớc khi hàm dlopen() trả về. dlopen() trả điều khiển tới đối tƣợng truy nhâp nếu nó tìm thấy từ filename hay trả về giá trị NULL nếu không tìm thấy. Sử dụng đối tƣợng chia sẻ Trƣớc khi có thể sử dụng mã nguồn trong thƣ viện ta phải biết đang tìm cái gì và tìm ở đâu. Hàm dlsym() sẽ giúp điều đó: void *dlsym(void *handle, char *symbol); dlsym() tìm ký hiệu hay tên hàm trong truy cập và trả lại con trỏ kiểu void tới đối tƣợng hay NULL nếu không thành công. Kiểm tra lỗi Hàm dlerror() sẽ giúp ta kiểm tra lỗi khi sử dụng đối tƣợng truy cập động: const char *dlerror(void); Nếu một trong các hàm lỗi, dlerror() trả về thông báo chi tiết lỗi và gán giá trị NULL cho phần bị lỗi. Giải phóng đối tƣợng chia sẻ Để bảo vệ tài nguyên hệ thống đặc biệt bộ nhớ, khi ta sử dụng xong module trong một đối tƣợng chia sẻ, thì giải phóng chúng. Hàm dlclose() sẽ đóng đối tƣợng chia sẻ: int dlclose(void *handle); Sử dụng giao diện dl Để minh hoạ cách sử dụng dl,chúng ta quay lại thƣ viện xử lí lỗi, sử dụng một chƣơng trình khác nhƣ sau: /* * Mã nguồn chương trình dltest.c * Dynamically load liberr.so and call err_ret() */ #include #include #include int main(void) { void *handle; void (*errfcn)(); const char *errmsg; FILE *pf; handle = dlopen("liberr.so", RTLD_NOW); if(handle == NULL) { fprintf(stderr, "Failed to load liberr.so: %s\n", dlerror()); exit(EXIT_FAILURE); } dlerror(); errfcn = dlsym(handle, "err_ret"); if((errmsg = dlerror()) != NULL) { - 89 - fprintf(stderr, "Didn't find err_ret(): %s\n", errmsg); exit(EXIT_FAILURE); } if((pf = fopen("foobar", "r")) == NULL) errfcn("couldn't open foobar"); dlclose(handle); return EXIT_SUCCESS; } Biên dịch ví dụ trên bằng lệnh: $ gcc -g -Wall dltest.c -o dltest -ldl Nhƣ ta có thể thấy, chúng ta không liên kết dựa vào liberr hay liberr.h trong mã nguồn. Tất cả truy cập tới liberr.so thông qua dl. Chạy chƣơng trình bằng cách sau: $ LD_LIBRARY_PATH=$(pwd) ./dltest Nếu thành công thì ta nhận đƣợc kết quả nhƣ sau: couldn‟t open foobar: No such file or directory 6.3.5 Các công cụ cho thư viện Công cụ nm Lệnh nm liệt kê toàn bộ các tên hàm (symbol) đƣợc mã hoá trong file đối tƣợng (object) và nhị phân (binary). Lệnh nm sử dụng cú pháp sau: nm [options] file L ệnh nm liệt kê những tên hàm chứa trong file. Tuỳ chọn Miêu tả -C| -demangle Chuyển tên ký tự vào tên mức ngƣời dùng để cho dễ đọc. -s|-print-armap Khi sử dụng các file lƣu trữ (phần mở rộng là “.a”), in ra các chỉ số của module chứa hàm đó. -u| -undefined-only Chỉ đƣa ra các hàm không đƣợc định nghĩa trong file này, tức là các hàm đƣợc định nghĩa ở một file khác. - l | -line-numbers Sử dụng thông tin gỡ rối để in ra số dòng nơi hàm đƣợc định nghĩa Công cụ ar Lệnh ar sử dụng cú pháp sau: ar {dmpqrtx} [thành viên] file Lệnh ar tạo, chỉnh sửa và trích các file lƣu trữ. Nó thƣờng đƣợc sử dụng để tạo các thƣ viện tĩnh- những file mà chứa một hoặc nhiều file đối tƣợng chứa các chƣơng trình con thƣờng đƣợc sử dụng (subrountine) ở định dạng tiền biên dịch (precompiled format), lệnh ar cũng tạo và duy trì một bảng mà tham chiếu qua tên ký tự tới các thành viên mà trong đó chúng đƣợc định nghĩa. Chi tiết của lệnh này đã đƣợc trình bày trong chƣơng trƣớc. Công cụ idd Lệnh nm liệt kê các hàm đƣợc định nghĩa trong một file đối tƣợng, nhƣng trừ khi ta biết những gì thƣ viện định nghĩa những hàm nào. Lệnh idd hữu ích hơn nhiều. idd liệt kê các thƣ viện đƣợc chia sẻ mà một chƣơng trình yêu cầu để mà chạy. Cú pháp của nó là: idd [options] file Lệnh idd in ra tên của thƣ viện chia sẻ mà file này sử dụng. Ví dụ: chƣơng trình thƣ “client mutt” cần 5 thƣ viện chia sẻ, nhƣ đƣợc minh hoạ sau đây: $ idd /usr/bin/mutt - 90 - libnsl.so.1 => /lib/libns1.so.1 (0x40019000) libslang.so.1 => /usr/lib/libslang.so.1 (0x4002e000) libm.so.6 => /lib/libm/so.6 (0x40072000) libc.so.6 => /lib/libc.so.6 (0x4008f000) /lib/id-linux.so.2 => /lib/id-Linux.so.2 (0x4000000) Tìm hiểu lệnh idconfig Lệnh idconfig sử dụng cú pháp sau: ldconfig [tuỳ chọn] [libs] Lệnh ldconfig xác định rõ các liên kết động (liên kết khi chạy) đƣợc yêu cầu bởi thƣ viện đƣợc chia sẻ nằm trong các thƣ mục /usr/lib và /lib. Dƣới đây là các tùy chọn của lệnh này: Các tuỳ chọn Các miêu tả -p Đơn thuần chỉ in ra nội dung của /etc/ld.so.cache, một danh sách hiện thời các thƣ viện đƣợc chia sẻ mà ld.so biết. -v Cập nhật /etc/ld.so.cache , liệt kê số phiên bản của mỗi thƣ viện, quét các thƣ mục và bất kỳ liên kết mà đƣợc tạo ra hoặc cập nhật. Các tuỳ chọn của hàm idconfig Biến môi trường và file cấu hình. Chƣơng trình tải (loader) và trình liên kết (linker) ld.so sử dụng 2 biến môi trƣờng. Biến thứ nhất là $LD_LIBRARY, chứa danh sách các thƣ mục chứa các file thƣ viện đƣợc phân cách bởi dấu hai chấm để tìm ra các thƣ viện cần thiết khi chạy. Nó giống nhƣ biến môi trƣờng $PATH. Biến môi trƣờng thứ hai là $LD_PRELOAD, một danh sách các thƣ viện đƣợc ngƣời dùng thêm vào đƣợc phân cách nhau bởi khoảng trống (space). ld.so cũng cho phép sử dụng 2 file cấu hình mà có cùng mục đích với biến môi trƣờng đƣợc đề cập ở trên. File /etc/ld.so.conf chứa một danh sách các thƣ mục mà chƣơng trình tải và trình liên kết (loader/linker) nên tìm kiếm các thƣ viện chia sẻ bên cạnh /usr/lib và /lib. /etc/ld.so.preload chứa danh sách các file thƣ viện đƣợc phân cách bằng một khoảng trống các thƣ viện này là thƣ viện ngƣời dùng tạo ra. CÂU HỎI VÀ BÀI TẬP 1. Trình bày các yếu tố cơ bản trong lập trình shell 2. Trình bày ý nghĩa, chức năng và tác dụng của trình biên dịch gcc. 3. Thực hành các lệnh trong lập trình shell 4. Thực hành các lệnh trong lập trình C - 91 - ĐỀ THI THAM KHẢO Đề 1: Câu 1: Trình bày khái niệm và cấu trúc siêu khối Câu 2: Trong thƣ mục ngƣời dùng /home/tuanpv có các thƣ mục con là vanban, bangtinh. Hãy viết các lệnh của Linux để: 1. Tạo tại thƣ mục vanban một thƣ mục con có tên là hopdong. Sao chép các tệp tin có 2 ký tự phần tên là HD trong thƣ mục vanban vào thƣ mục vừa tạo 2. Liệt kê các tệp tin có phần tên bắt đầu bởi ký tự “M” trong thƣ mục bangtinh lên màn hình (cho hiện các tệp tin có thuộc tính ẩn nếu có) 3. Xác lập quyền chỉ đọc cho các tệp trong thƣ mục bangtinh. 4. Xoá tất cả các tệp tin 2 ký tự “nh” thuộc phần tên trong thƣ mục vanban. Câu 3: Lập chƣơng trình liệt kê tên và sao chép các tệp tin trong thƣ mục /home/user1/vidu1 sang thƣ mục /home/user2/vidu Đề 2: Câu 1: Trình bày khái niệm và cấu trúc inode Câu 2: Trong thƣ mục ngƣời dùng /home/minhnd có các thƣ mục con là musics, games. Hãy viết các lệnh của Linux để: 1. Xoá đi các tệp tin có phần mở rộng là mp3 trong thƣ mục musics; Xoá thƣ mục lines trong thƣ mục games 2. Tạo ra tại thƣ mục ngƣời dùng một thƣ mục con có tên temp, trong thƣ mục này tạo hai thƣ mục con ngang cấp có tên vidu1 và vidu2. 3. Liệt kê các tiến trình đang chạy trong hệ thống. 4. Nén thƣ mục games thành tệp tin luugames.tar Câu 3: Lập chƣơng trình đọc và hiển thị nội dung của 1 file không cấu trúc Đề 3: Câu 1: Trình bày tên và tác dụng của các thƣ mục đặc biệt trong Linux Câu 2: Trong thƣ mục ngƣời dùng /home/cuongpv có các thƣ mục con là tailieu, tapchi. Hãy viết các lệnh của Linux để: 1. Nối nội dung các tệp sach1, sach2 trong thƣ mục tailieu thành tệp tapsach đặt tạo thƣ mục ngƣời dùng. 2. Liệt kê các tệp tin trong thƣ mục tapchi (kể cả tệp tin có thuộc tính ẩn) 3. Nén các tệp tin trong thƣ mục tailieu thành tệp luutl.zip đặt tại thƣ mục ngƣời dùng. 4. Xóa các tệp tin có ký tự “h” của phần tên trong thƣ mục tailieu Câu 3: Cho hai vector m chiều a = (a1, a2, a3,..., am) và b = (b1, b2, b3,..., bm). Hãy lập chƣơng trình để tính tích vô hƣớng của a và b theo công thức a.b = a1.b1 + a2.b2 + ... + am.bm. Đề 4: Câu 1: Trình bày cấu trúc thông tin lƣu trữ về tài khoản ngƣời của một dùng trong trong file /etc/passwd Câu 2: Trong thƣ mục ngƣời dùng /home/dungnv có các thƣ mục con là vanhoc và kythuat. Hãy viết các lệnh của Linux để: 1. Tìm tệp tin có chứa nội dung là “Happy Birthday” 2. Thiết lập quyền truy cập thƣ mục kythuat cho tất cả các ngƣời dùng. - 92 - 3. Tạo một thƣ mục có tên là nghethuat trong thƣ mục ngƣời dùng, sau đó chép tất cả các tệp có ký tự “01” ở cuối phần tên trong thƣ mục vanhoc vào thƣ mục vừa tạo. 4. Liệt kê cấu hình của máy hiện tại Câu 3: Cho số n, Hãy lập chƣơng trình để thực hiện tính giá trị của hàm cos(x) theo công thức: Cos(x) = 1- x2/2! + x4/4! - x6/6! + ... (-1)nx2x/(2n)! Đề 5: Câu 1: Trình bày các yếu tố cơ bản trong lập trình shell Câu 2: Trong thƣ mục ngƣời dùng /home/thanghv có các thƣ mục con là congvan, quyetdinh. Hãy viết các lệnh của Linux để: 1. Tạo ra tại thƣ mục ngƣời dung một thƣ mục con có tên là saoluu, 2. Sao chép tất cả các tệp tại thƣ mục quyetdinh vào thƣ mục vừa tạo 3. Thiết lập quyền truy cập thƣ mục congvan cho nhóm ngƣời dùng hanhchinh 4. Xóa các tệp có hai ký tự đầu phần tên là “GM” trong thƣ mục congvan Câu 3: Cho số thực a. Hãy lập sơ đồ thuật toán để thực hiện tìm số tự nhiên n nhỏ nhất sao cho 1+1/2 + 1/3 + ... + 1/n > a
File đính kèm:
- Bài giảng Hệ điều hành mã nguồn mở.pdf