Cơ bản về chứng chỉ LPI

pdf 79 trang hoanguyen 3180
Bạn đang xem 20 trang mẫu của tài liệu "Cơ bản về chứng chỉ LPI", để 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:

  • pdfco_ban_ve_chung_chi_lpi.pdf

Nội dung text: Cơ bản về chứng chỉ LPI

  1. Cơ bản về chứng chỉ LPI Tài liệu về chứng chỉ LPI được biên soạn dựa trên hệ thống tài liệu của IBM Phiên bản 1.0.0, Ngày 29 tháng 10 năm 2004 Biên soạn: Thành viên VnOSS
  2. ii Bản quyền ©2004-2006 thuộc về Cộng đồng nguồn mở Việt Nam - VNOSS và những người đóng góp cho tài liệu “Cơ bản về chứng chỉ LPI” - “All rights reserved”. Đây là một tài liệu miễn phí. Bạn hoàn toàn có thể phân phối lại tài liệu cho những người sử dụng khác, hoặc có thể chỉnh sửa cho phù hợp nhưng phải tuân theo những yêu cầu trong giấy phép bản quyền GNU (General Public License của Free Software Foundation; phiên bản 2 hay các phiên bản khác). Tài liệu này được phát hành đến tay các bạn với hy vọng rằng nó sẽ trở nên hữu ích, nhưng nó KHÔNG KÈM THEO BẤT KỲ SỰ BẢO ĐẢM NÀO, ngay cả những đảm bảo ngầm hiểu về việc thương mại hoá hay phải phù hợp với một mục đích cụ thể nào đó (vấn đề này bạn có thể tham khảo giấy phép GNU General Public License để biết thêm chi tiết). Thông thường, bạn sẽ nhận được một bản sao của giấy phép GNU General Public License kèm theo tài liệu này; nếu chưa có, bạn có thể viết thư đến địa chỉ sau Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. để có một bản giấy phép.
  3. Mục lục 1 Trước khi bắt đầu 1 1.1 Về tài liệu này 1 1.2 Về tác giả 1 2 Cơ bản về Linux 3 2.1 Giới thiệu về bash 3 2.1.1 Hệ vỏ (shell) 3 2.1.2 Có phải bạn đang chạy bash không? 3 2.1.3 Về bash 4 2.1.4 Sử dụng cd 4 2.1.5 Đường dẫn 4 2.1.6 Đường dẫn tuyệt đối 4 2.1.7 Sử dụng 5 2.1.8 Ví dụ đường dẫn tương đối 6 2.1.9 Thế còn . là gì? 6 2.1.10 cd và thư mục nhà 6 2.1.11 Thư mục nhà của những người dùng khác 7 2.2 Sử dụng các câu lệnh 7 2.2.1 Giới thiệu ls 7 2.2.2 Liệt kê chi tiết 7 2.2.3 Xem thư mục 8 2.2.4 liệt kê inode và liệt kê đệ qui (recursive) 8 2.2.5 Inode là gì? 9 2.2.6 mkdir 10 2.2.7 mkdir -p 10 2.2.8 touch 11 2.2.9 echo 11 2.2.10 echo và sự chuyển hướng 11 2.2.11 cat và cp 12 2.2.12 mv 12 2.3 Tạo liên kết và xóa tệp tin 13 2.3.1 Liên kết cứng 13 2.3.2 Liên kết tượng trưng 13 2.3.3 Sâu hơn về liên kết tượng trưng 14 2.3.4 rm 16 2.3.5 rmdir 17 2.3.6 rm và thư mục 17
  4. iv MỤC LỤC 2.4 Sử dụng các ký tự đại diện (wildcard) 17 2.4.1 Giới thiệu về ký tự đại diện 17 2.4.2 Hiểu về không tương ứng 18 2.4.3 Cú pháp đại diện: * 19 2.4.4 Cú pháp đại diện: ? 19 2.4.5 Cú pháp đại diện: [] 19 2.4.6 Cú pháp đại diện: [!] 20 2.4.7 Sâu hơn về cú pháp đại diện 20 2.4.8 Ngoặc đơn "gặp" ngoặc kép 20 2.5 Tổng kết và các nguồn tham khảo 21 2.5.1 Tổng kết 21 2.5.2 Các nguồn tham khảo 21 2.5.3 Ý kiến độc giả 21 2.5.4 Thay cho lời kết cuốn 1 21 3 Cơ bản về quản trị Linux 23 3.1 Biểu thức chính quy 23 3.1.1 Biểu thức chính quy là gì? 23 3.1.2 So sánh với ký tự đại diện (glob) 23 3.1.3 Chuỗi con đơn giản 23 3.1.4 Hiểu về chuỗi con đơn giản 24 3.1.5 Ký tự mêta 24 3.1.6 Sử dụng [] 24 3.1.7 Sử dụng [ˆ] 25 3.1.8 Cú pháp khác 25 3.1.9 Ký tự mêta "*" 25 3.1.10 Đầu và cuối dòng 26 3.1.11 Regex cho cả dòng 26 3.2 FHS và tìm tệp tin 27 3.2.1 FHS - Tiêu chuẩn hệ thống tập tin dạng cây 27 3.2.2 Hai cấp bậc FHS độc lập 27 3.2.3 Hệ thống bậc hai tại /usr 28 3.2.4 Tìm tệp tin 28 3.2.5 Đường dẫn 28 3.2.6 Sửa đổi PATH 28 3.2.7 Tất cả về "which" 29 3.2.8 "which -a" 29 3.2.9 whereis 29 3.2.10 find 30 3.2.11 find và ký tự đại diện 30 3.2.12 Lờ đi kiểu chữ với find 30 3.2.13 find và biểu thức chính quy 31 3.2.14 find và kiểu 31 3.2.15 find và mtimes 31 3.2.16 Tùy chọn -daystart 32 3.2.17 Tùy chọn -size 32 3.2.18 Gia công tệp tin tìm thấy 32
  5. MỤC LỤC v 3.2.19 locate 33 3.2.20 Sử dụng updatedb 33 3.2.21 slocate 34 3.3 Quản lý tiến trình 34 3.3.1 Khởi động xeyes 34 3.3.2 Dừng một tiến trình 34 3.3.3 fg và bg 35 3.3.4 Sử dụng "&" 35 3.3.5 Nhiều tiến trình nền sau 35 3.3.6 Giới thiệu tín hiệu 36 3.3.7 SIGTERM và SIGINT 36 3.3.8 "Diệt tận gốc" 36 3.3.9 nohup 37 3.3.10 Sử dụng ps liệt kê tiến trình 37 3.3.11 Hiển thị cây và rừng 37 3.3.12 Tùy chọn "u" và "l" 38 3.3.13 Sử dụng "top" 38 3.3.14 nice 38 3.3.15 renice 39 3.4 Gia công văn bản 39 3.4.1 Ôn lại chuyển hướng 39 3.4.2 Một ví dụ ống 39 3.4.3 Ống giải nén 40 3.4.4 Một ống dài hơn 40 3.4.5 Gió lốc gia công văn bản bắt đầu 41 3.4.6 cat, sort, và uniq 41 3.4.7 wc, head, và tail 41 3.4.8 tac, expand, và unexpand 42 3.4.9 cut, nl, và pr 42 3.4.10 tr, awk, và sed 42 3.4.11 od, split, và fmt 43 3.4.12 Paste, join, và tee 43 3.4.13 Gió lốc kết thúc! Chuyển hướng 43 3.4.14 Sử dụng » 44 3.5 Môđun nhân 44 3.5.1 Làm quen với "uname" 44 3.5.2 Thêm về đầu ra uname 44 3.5.3 Bản phát hành nhân 45 3.5.4 Nhân 45 3.5.5 Giới thiệu môđun nhân 45 3.5.6 Bản tóm tắt môđun nhân 45 3.5.7 lsmod 45 3.5.8 Liệt kê môđun 46 3.5.9 Môđun third-party 46 3.5.10 depmod 46 3.5.11 Làm thế nào để lấy môđun 46 3.5.12 Sử dụng depmod 47
  6. vi MỤC LỤC 3.5.13 Định vị môđun nhân 47 3.5.14 insmod và modprobe 47 3.5.15 Thực thi rmmod và modprobe 48 3.5.16 Túi khôn: modinfo và modules.conf 48 3.5.17 modules.conf 48 3.6 Tổng kết và các nguồn tham khảo 48 3.6.1 Tổng kết 48 3.6.2 Tham khảo 49 3.6.3 Ý kiến độc giả 50 3.6.4 Thay cho lời kết 50 4 Quản trị hệ thống Linux 51 5 Quản trị hệ thống linux nâng cao 52 5.1 Hệ thống tập tin, phân vùng, và các thiết bị khối 52 5.1.1 Giới thiệu về thiết bị khối 52 5.1.2 Các lớp trừu tượng 52 5.1.3 Phân vùng 52 5.1.4 Giới thiệu về công cụ fdisk 53 5.1.5 Sử dụng fdisk 53 5.1.6 Thiết bị khối và tổng quan về việc chia phân vùng 54 5.1.7 Loại phân vùng 54 5.1.8 Sử dụng fdisk để thiết lập các phân vùng 54 5.1.9 Đĩa cứng sau khi được phân vùng sẽ thế nào 54 5.2 Khởi động hệ thống 57 5.2.1 About this sectin 57 5.2.2 Bảng ghi khởi động chính - MBR 57 5.2.3 Qúa trình khởi động của hạt nhân 58 5.2.4 Chương trình /sbin/init 58 5.2.5 Digging in: LILO 59 5.2.6 Digging in: GRUB 59 5.2.7 Thông tin dmesg 59 5.2.8 Thông tin trong /var/log/messages 59 5.2.9 Các thông tin khác 59 5.2.10 Cấp thựnc tin 59 5.2.11 Single-user mode 59 5.2.12 Understanding single-user mode 59 5.2.13 Các cấp thực thi - Runlevels 59 5.2.14 Công cụ telinit 59 5.2.15 Runlevel etiquette 59 5.2.16 "Now" và halt 59 5.2.17 Cấp độ thực thi ngầm định 59 5.2.18 Tham khảo 59 5.3 Cấp phép sử dụng hệ thống tập tin. 60 5.3.1 Giới thiệu về cấp phép 60 5.3.2 Hỗ trợ của hạt nhân 60 5.3.3 Hỗ trợ của hệ thống tập tin 60 5.3.4 Cấu hình hệ thống giấy phép 60
  7. MỤC LỤC vii 5.3.5 Lệnh "quota" 60 5.3.6 Viewing quota 60 5.3.7 edquota 60 5.3.8 Understanding edquota 60 5.3.9 Making changes 60 5.3.10 Copying quotas 60 5.3.11 Group restrictions 60 5.3.12 The repquota command 60 5.3.13 Repquota options 60 5.3.14 Monitoring quotas 60 5.3.15 Modifying the grace period 60 5.3.16 Kiểm tra qouta khi khởi động 60 5.4 Giới thiệu về syslogd 60 5.4.1 Đọc thông tin nhật ký 60 5.4.2 Tailing log files 60 5.4.3 Grepping logs 60 5.4.4 Ghi nhớ bảo mật 61 5.4.5 Chủ đề nâng cao - klogd 62 5.4.6 Chủ đề nâng cao - các chương trình ghi nhật ký khác 62 5.5 Tóm lược 62 5.6 Tham khảo 63 6 Biên dịch mã nguồn và quản lý gói phần mềm trong linux 65 7 Cấu hình và biên dịch hạt nhân 66 7.1 Giới thiệu hề hạt nhân Linux 67 7.1.1 Hạt nhân là Linux 67 7.1.2 Giao tiếp với phần cứng 67 7.1.3 Điều quản CPU 67 7.1.4 Điều quản vào ra I/O 67 7.1.5 Trung tâm của hệ thống mạng 67 7.1.6 Ôn lại về quá trình khởi động linux 67 7.1.7 Giới thiệu về mô đun 67 7.1.8 Vị trí của tập tin mô đun 67 7.1.9 Modules – not for every process! 67 7.2 Tải mã nguồn của hạt nhân 67 7.2.1 Kernel version history 67 7.2.2 Getting new kernel sources 67 7.2.3 Unpacking the kernel 67 7.3 Cấu hình hạt nhân 67 7.3.1 Let’s talk configuration 67 7.3.2 The new way to configure 67 7.3.3 Các mẹo khi cấu hình 67 7.3.4 Code maturity level options 67 7.3.5 Modules and CPU-related options 67 7.3.6 General and parallel port options 67 7.3.7 RAID and LVM 67 7.3.8 Hệ thống mạng và các thiết bị liên quan 67
  8. viii MỤC LỤC 7.3.9 IDE support 67 7.3.10 SCSI support 67 7.3.11 Miscellaneous character devices 67 7.3.12 File systems and console drivers 67 7.3.13 Biên dịch và cài đặt hạt nhân 67 7.3.14 make dep 67 7.3.15 make bzImage 67 7.3.16 biên dịch mô đun 67 7.4 Cấu hình khởi động 67 7.4.1 Giới thiệu về Lilo 67 7.4.2 Cấu hình Lilo 67 7.5 Thiết bị PCI 67 7.5.1 Thiết bị PCI 101 67 7.5.2 Các kía cạnh của thiết bị PCI 67 7.5.3 PCI device resources 67 7.6 Linux USB 67 7.6.1 Introducing Linux USB 67 7.6.2 Enabling USB 67 7.6.3 UHCI, OHCI, EHCI – oh my! 67 7.6.4 The last few steps 67 7.6.5 Mounting usbdevfs 67 7.7 Tóm lược 67 7.7.1 Tóm lược 67 7.7.2 Tài nguyên 67 8 Hệ thống mạng 68 9 USB bảo mật hệ vỏ và chia sẻ tập tin 69
  9. Chương 1 Trước khi bắt đầu 1.1 Về tài liệu này Chào mừng đến với "Linux những điều cơ bản," cuốn thứ nhất trong bốn cuốn sách hướng dẫn giúp bạn chuẩn bị cho bài thi 101 của LPI (Linux Professional Institute). Trong cuốn sách hướng dẫn này, chúng tôi sẽ giới thiệu với bạn bash (vỏ, shell, tiêu chuẩn của Linux), chỉ cho bạn cách sử dụng thành thạo các câu lệnh cơ bản của Linux như ls, cp và mv, giải thích về inode, liên kết "cứng" và liên kết "tượng trưng" (hard link và symbolic links) và nhiều thứ khác. Khi kết thúc cuốn sách hướng dẫn này bạn sẽ có kiến thức vững vàng về những điều cơ bản khi sử dụng Linux, và thậm chí còn sẵn sàng bắt đầu học cơ bản về nhiệm vụ quản trị mạng Linux. Khi kết thúc chuỗi sách hướng dẫn này (tám cuốn tất cả), bạn sẽ có kiến thức cần thiết để trở thành Quản trị viên hệ thống Linux và sẵn sàng đạt tới chứng chỉ LPIC bậc I của Linux Professional Institute nếu bạn đã dự định như vậy. Cuốn sách hướng dẫn này (Phần I) nói riêng là lý tưởng với những "người mới" với Linux, hoặc với những người muốn xem lại hoặc cải tiến sự hiểu biết của mình về những khái niệm cơ bản của Linux như sao chép (copying) và di chuyển (moving) tập tin, tạo đường dẫn "cứng" và "tượng trưng", và sử dụng các câu lệnh "chế biến" văn bản cơ bản song song với "băng chuyền" (pipeline) và "chuyển hướng" (redirection). Dọc theo cuốn hướng dẫn này, chúng tôi sẽ chia sẻ với các bạn những lời gợi ý, lời mách nước và mánh lới để giữ cho cuốn hướng dẫn thêm phong phú ("ngon ăn") và có tính thực dụng, thậm chí cho cả những ai có kinh nghiệm sử dụng Linux đáng kể. Với những "người bắt đầu", nhiều tài liệu của cuốn hướng dẫn này sẽ mới, nhưng với những người sử dụng Linux kinh nghiệm có thể tìm thấy cuốn hướng dẫn này như một cách tuyệt vời để "làm béo thêm" kỹ năng Linux cơ bản. Với những ai đã qua phát hành (release) 1 của cuốn hướng dẫn này với mục đích khác hơn là chuẩn bị thi LPI, bạn có khả năng không cần phát hành 2. Tuy nhiên, nếu bạn có dự tính vượt qua kỳ thi LPI, bạn nên lưu ý đọc bản đã chỉnh sửa này. 1.2 Về tác giả Cư trú tại Albuquerque, New Mexico, Daniel Robbins là kiến trúc trưởng của Gentoo Linux, một bản phân phối Linux cao cấp. Tác giả còn viết các bài báo, sách hướng dẫn, những lời mách nước cho IBM developerWorks và Intel Developer Services và là tác giả đóng góp
  10. 2 Trước khi bắt đầu của vài cuốn sách, gồm có Samba Unleashed và SuSE Linux Unleashed. Daniel thích thú sử dụng thời gian với vợ, Mary, và con gái, Hadassah. Bạn có thể liên hệ với Daniel qua tại drobbins@gentoo.org. Với những câu hỏi kỹ thuật về nội dung của cuốn hướng dẫn này, liên hệ với tác giả, Daniel Robbins, tại drobbins@gentoo.org.
  11. Chương 2 Cơ bản về Linux 2.1 Giới thiệu về bash 2.1.1 Hệ vỏ (shell) Nếu bạn đã từng sử dụng hệ điều hành Linux, thì biết rằng sau khi đăng nhập xong, chúng ta sẽ được đón chào bởi dấu nhắc như sau: $ Dấu nhắc bạn thấy trên máy của mình có thể trông khác một chút. Nó có thể chứa tên máy, tên của thư mục hiện thời, hoặc cả hai. Tuy nhiên, bất kể là giấu nhắc của bạn trông như thế nào, chắc chắn nó chứa ký hiệu nói trên1. Chương trình, mà in dấu nhắc nói trên ra gọi, là "hệ vỏ" (shell). Và rất có thể hệ vỏ shell của bạn là bash - một hệ vỏ shell thông dụng trong thế giới hệ điều hành chim cánh cụt. 2.1.2 Có phải bạn đang chạy bash không? Bạn muốn biết mình đang chạy bash hay không bằng hãy gõ: $ echo $SHELL /bin/bash Nếu dòng trên cho ra một thông báo lỗi hoặc kết quả không giống với ví dụ, thì tức là bạn đang chạy một hệ vỏ shell khác. Trong trường hợp đó, phần lớn ví dụ của cuốn hướng dẫn này vẫn có thể được áp dụng. Nhưng chúng tôi khuyên bạn nên dùng bash, vì rất có lợi và nhất là nếu bạn có mục đích trả thi LPI 101. (Cuốn hướng dẫn thứ hai, về quản trị cơ bản, chúng tôi sẽ hướng dẫn cách thay đổi hệ vỏ shell cho người dùng bằng câu lệnh chsh.2) 1trừ khi bạn đăng nhập với quyền người dùng root. Nếu bạn không biết người dùng root là gì hãy cứ tạm biết như thế ;). Chúng tôi sẽ nói đến vấn đề này ở các phần tiêp theo 2nếu bạn là người thích khám phá thì hãy thử làm quen với câu lệnh trên ngay bây giờ! Cú pháp của nó cũng không quá phức tạp so với các câu lệnh khác của Linux. Tự khám phá luôn là một cách học tốt trong mọi lĩnh vực! Chúng tôi rất khuyến khích bạn
  12. 4 Cơ bản về Linux 2.1.3 Về bash Bash là từ viết tắt của "Bourne-again shell"3. Bash là hệ vỏ shell theo mặc định trên hầu hết các hệ thống Linux. Công việc của hệ vỏ shell là tuân theo các câu lệnh của người dùng. Nhờ có hệ vỏ shell bạn có thể tác động qua lại với hệ điều hành. Khi làm xong các công việc cần thiết, có thể chỉ thị cho hệ vỏ shell thoát ra (exit) hay đăng xuất (logout). Tại thời điểm này bạn sẽ được đưa trở lại dấu nhắc đăng nhập4. Nhân tiện, bạn có thể đăng xuất bằng cách gõ control-D tại dấu nhắc nói trên. 2.1.4 Sử dụng cd Như bạn biết và có thể sẽ biết :), nhìn chằm chằm vào dấu nhắc bash không phải là điều thích thú nhất trên thế gian. Vì vậy, hãy thử sử dụng bash để "đi dạo" một vòng, quanh hệ thống tệp tin. Tại dấu nhắc, gõ câu lệnh sau (không gõ dấu $5: $ cd / Chúng ta vừa yêu cầu chuyển sang làm việc tại bash thư mục /. / còn được người dùng Linux biết đến dưới cái tên root6. Trên hệ thống Linux tất cả các thư mục tạo thành một cây thư mục, và / là thư mục cao nhất của cây này, hay là gốc rễ (root) của nó. cd thiết lập thư mục mà bạn đang làm việc với nó, còn gọi là "thư mục hiện thời". Để biết thư mục hiện thời của bash, hãy gõ: $ pwd 2.1.5 Đường dẫn Trong ví dụ phía trên, đối số / cho cd gọi là đường dẫn (path). Đối số cho cd biết nơi chúng ta muốn chuyển đến. Trong trường hợp này, đối số / là đường dẫn tuyệt đối, có nghĩa là nó chỉ rõ một vị trí trong cây thư mục đối với thư mục gốc (root). 2.1.6 Đường dẫn tuyệt đối Dưới đây là một số đường dẫn tuyệt đối khác: /dev /usr /usr/bin /usr/local/bin 3người dịch: Bourne-again shell là một cách chơi chữ tiếng Anh. "Bourne" đọc giống như borne (sinh ra, đẻ ra). 4thường có dạng login: 5Trong các ví dụ $ ở đầu dòng chỉ để chỉ dấu nhắc của người dùng, nó không phải là thành phần của một câu lệnh 6Xin hãy nhớ cái tên này!!! Vì tiếp theo chúng tôi sẽ gọi như vậy trong suốt cuốn sách này
  13. 2.1 Giới thiệu về bash 5 Như bạn thấy, mọi đường dẫn tuyệt đối có một điểm chung - bắt đầu với /. Với đường dẫn /usr/local/bin, ta muốn cd chuyển vào thư mục /, sau đó thư mục usr dưới nó, và sau đó local và cuối cùng là bin. Đường dẫn tuyệt đối luôn luôn được nhận ra bởi sự có mặt của / ở đầu. Có thể bạn đã đoán ra rằng nếu đã có tuyệt đối thì phải có tượng đối. Vâng đúng là có đường dẫn tương đối. Bash, cd, và các câu lệnh khác luôn luôn biên dịch những đường dẫn này tương đối với thư mục hiện thời7. Đường dẫn tương đối không bao giờ bắt đầu với một /. Vì thế, nếu chúng ta đang trong thư mục /usr. $ cd /usr Thì có thể dùng đường dẫn tương đối để chuyển tới thư mục /usr/local/bin: $ cd local/bin $ pwd /usr/local/bin 2.1.7 Sử dụng Đường dẫn tương đối có thể chứa một hay nhiều thư mục " ". Thư mục là thư mục đặc biệt chỉ tới thư mục "bố"8. Tiếp tục ví dụ ở trên: $ pwd /usr/local/bin $ cd $ pwd /usr/local Bạn thấy không, thư mục hiện thời của chúng ta bây giờ là /usr/local. Chúng ta đã "quay ngược trở lại" một thư mục về phía thư mục root, nếu so với thư mục hiện thời lúc đầu (/usr/local/bin). Thêm vào đó, chúng ta có thể thêm vào đường dẫn tương đối đã có, để đi tới một thư mục nằm "kế bên"9 thư mục hiện thời, ví dụ: $ pwd /usr/local $ cd /share $ pwd /usr/share 7hãy chú ý sự khác nhau giữa hai cách biên dịch 8thường gọi là thư mục mẹ hơn 9gọi nôm na là "hàng xóm"
  14. 6 Cơ bản về Linux 2.1.8 Ví dụ đường dẫn tương đối Đường dẫn tương đối có thể khá phức tạp. Sau đây là một số ví dụ, chúng tôi không cho biết các thư mục thu được. Hãy thử tự hình dung xem bạn sẽ đi tới đâu sau khi gõ những câu lệnh sau: $ cd /bin $ cd /usr/share/zoneinfo $ cd /usr/X11R6/bin $ cd /lib/X11 $ cd /usr/bin $ cd /bin/ /bin Bây giờ, hãy gõ chúng và xem bạn hình dung có đúng không :) 2.1.9 Thế còn . là gì? Trước khi kết thúc bài giảng của chúng ta về cd, có một vài điều chúng tôi muốn đề cập đến. Đầu tiên, có một thư mục đặc biệt khác gọi là ., có ý nghĩa "thư mục hiện thời". Thư mục này thường không sử dụng như đối số cho câu lệnh cd, mà thường được sử dụng để thực thi một số chương trình trong thư mục hiện thời. Ví dụ: $ ./chuongtrinh Tệp tin thực thi chuongtrinh nằm tại thư mục hiện thời sẽ được chạy. 2.1.10 cd và thư mục nhà Bây giờ, chúng ta muốn chuyển tới thư mục nhà (home directory), ta gõ: $ cd Không có đối số , cd sẽ chyển tới thư mục nhà của người dùng. Thư mục nhà sẽ là /root cho người dùng cao cấp (superuser) và điển hình là /home/username cho người dùng bình thường. Nhưng nếu muốn chỉ rõ một tệp tin trong thư mục nhà thì sao? Ví dụ chúng ta muốn dùng tệp tin làm đối số cho câu lệnh chuongtrinh. Nếu tệp tin "trú ngụ" trong thư mục nhà, có thể gõ10: $ ./chuongtrinh /home/teppi82/tepcuatoi.txt 10trong ví dụ này người dùng có tên là teppi82
  15. 2.2 Sử dụng các câu lệnh 7 Tuy nhiên, việc sử dụng đường dẫn tuyệt đối như vậy không phải lúc nào cũng tiện lợi, bạn có để ý là chúng ta sẽ phải gõ rất nhiều ký tự không? Hãy thương các ngón tay của mình!! Rất may, ta có thể sử dụng ký tự ∼ (dấu ngã) để làm công việc tương tự: $ ./chuongtrinh ~/tepcuatoi.txt Bạn thấy không, nhanh hơn rất nhiều và rất tiện lợi! 2.1.11 Thư mục nhà của những người dùng khác Bash sẽ khai triển ký tự ∼ đứng một mình để chỉ thư mục nhà của bạn, nhưng cũng có thể sử dụng ký tự này để chỉ thư mục nhà của những người dùng khác11. Ví dụ, nếu chúng ta muốn chỉ đến tệp tin girls.txt trong thư mục nhà của James, ta gõ: $ ./chuongtrinh ~james/girls.txt 2.2 Sử dụng các câu lệnh 2.2.1 Giới thiệu ls Bây giờ, chúng ta sẽ xem xét qua câu lệnh ls. Rất có thể ls là câu lệnh quen thuộc của bạn, và bạn biết rằng nếu chỉ gõ câu lệnh này (không có tham số) thì nội dung của thư mục hiện thời sẽ được liệt kê: $ cd /usr $ ls bin doc games include info lib local sbin share src X11R6 Khi tùy chọn -a được chỉ rõ, bạn sẽ "nhìn thấy" tất cả mọi tệp tin của một thư mục, bao gồm cả các tệp tin ẩn (hidden files), những tệp tin mà tên bắt đầu với Trong ví dụ sau, bạn sẽ thấy trong đầu ra của ls -a có cả các thư mục liên kết đặc biệt . và : $ ls -a . bin doc games include info lib local sbin share src X11R6 2.2.2 Liệt kê chi tiết Linux12 cho phép chỉ rõ một hay nhiều tệp tin hay thư mục trên dòng lệnh ls. Nếu bạn chỉ rõ một tệp tin, thì ls sẽ chỉ hiện ở đầu ra tệp tin đó mà thôi. Nếu bạn chỉ rõ một thư mục, thì ls sẽ hiển thị nội dung của thư mục, tức là các tệp tin và thư mục con của nó. Câu lệnh ls có tùy chọn -l rất thuận tiện khi cần xem các thông tin như quyền hạn (permissions), quyền sở hữu (ownership), thời gian sửa đổi (modification time), và kích thước (size) của các mục. Trong ví dụ dưới đây, chúng ta sử dụng tùy chọn -l để liệt kê chi tiết thư mục /usr: 11tất nhiên nếu họ có trong hệ thống 12hay nói đúng hơn là bash
  16. 8 Cơ bản về Linux $ ls -l /usr total 122 drwxr-xr-x 2 root root 53104 2004-08-29 02:17 bin drwxr-xr-x 2 root root 2336 2004-06-22 19:51 doc drwxr-xr-x 2 root root 3088 2004-06-01 15:44 games drwxr-xr-x 46 root root 5528 2004-06-13 16:33 include lrwxrwxrwx 1 root root 10 2004-05-31 22:29 info -> share/info drwxr-xr-x 138 root root 43384 2004-08-29 00:28 lib drwxrwsr-x 11 root staff 272 2004-06-05 04:06 local drwxr-xr-x 2 root root 6760 2004-08-29 00:28 sbin drwxr-xr-x 236 root root 6360 2004-06-22 19:31 share drwxrwsr-x 5 teppi82 src 136 2004-08-28 21:58 src drwxr-xr-x 6 root root 144 2004-05-31 22:53 X11R6 Cột thứ nhất trong bảng trên là thông tin về quyền hạn cho từng mục trong danh sách13. Chúng tôi sẽ giải thích một cách cụ thể cách dịch thông tin này trong các phẩn tiếp theo. Cột tiếp theo hiển thị số liên kết (links) cho mỗi mục đó, chúng ta cũng tạm thời dừng lại nhưng sẽ trở lại sau. Cột thứ ba và cột thứ tư cho biết, tương ứng, chủ sở hữu (owner) và nhóm sở hữu (group). Cột thứ năm liệt kê kích thước của mục. Cột thứ sáu là "thời gian sửa đổi gần nhất" ("last modified" time) hay còn gọi tắt là "mtime" của mục. Cột cuối cùng là tên gọi của chúng. Hãy để ý tệp info! Nếu tệp tin là liên kết tượng trưng (symbolic link), bạn sẽ thấy dấu -> và đường dẫn tới nơi mà liên kết chỉ đến. Trong ví dụ trên info là một trường hợp như vậy. 2.2.3 Xem thư mục Đôi khi bạn chỉ muốn xem thông tin của thư mục, mà không quan tâm tới nội dung của nó ở bên trong. Cho những trường hợp này, chúng ta cần chỉ rõ tùy chọn -d, để "ra lệnh" cho ls chỉ hiển thị thông tin của thư mục quan tâm: $ ls -dl /usr /usr/bin /usr/X11R6/bin /share drwxr-xr-x 241 root root 6488 2004-09-02 18:21 /share drwxr-xr-x 12 root root 312 2004-05-31 22:29 /usr drwxr-xr-x 2 root root 53208 2004-09-02 18:21 /usr/bin drwxr-xr-x 2 root root 3984 2004-06-22 19:30 /usr/X11R6/bin 2.2.4 liệt kê inode và liệt kê đệ qui (recursive) Như vậy là có thể sử dụng tùy chọn -d để chỉ xem thông tin của thư mục. Nhưng đồng thời chúng ta cũng có thể dùng tùy chọn -R để thực hiện điều ngược lại, tức là không chỉ xem nội dung của thư mục, mà còn xem tất cả các tệp và thư mục bên trong của thư mục đó (Xem toàn bộ14)! Chúng tôi không đưa ra ví dụ nào cho tùy chọn này (vì danh sách thu được thường rất dài), tuy nhiên bạn nên thử một vài lần câu lệnh ls -R và ls -Rl để biết chúng làm việc như thế nào. 13Bạn nên biết r (readable) - có thể đọc, w (writable) - có thể viết, x (executable) - có thể thực thi, dấu gạch ngang (-) cho biết không có một trong ba quyền hạn nói trên, như thế sẽ dễ nhớ hơn. Bạn sẽ hỏi vậy hai chữ cái d và l ở đây là gì? d và l ở đây không liên quan gì đến quyền hạn, mà là chữ viết tắt chỉ phân loại của mục, cụ thể là d (directory) - thư mục, l (link) - liên kết. Tạm biết vậy đã, như thế tối nay bạn sẽ ngủ ngon hơn 14Nói nôm na là xem tất tần tật
  17. 2.2 Sử dụng các câu lệnh 9 Và cuối cùng vâng rất may là cuối cùng, tùy chọn -i của ls sử dụng để hiển thị số inode của các đối tượng15 trong hệ thống tập tin: $ ls -i /usr 685 bin 917 include 9352 local 920 src 915 doc 918 info 706 sbin 12522 X11R6 916 games 919 lib 708 share 2.2.5 Inode là gì? Mọi đối tượng trên một hệ thống tập tin được xác định bởi một chỉ mục (index) duy nhất, gọi là chỉ mục inode. Cái này nghe có vẻ tầm thường, nhưng rất cần am hiểu inode để có thể nắm được thực chất của nhiều thao tác với hệ thống tập tin. Trong ví dụ này chúng ta sẽ xem xét các liên kết . và mà xuất hiện trong mọi thư mục. Để biết thực chất thư mục là gì, đầu tiên chúng ta xem chỉ mục inode của /usr/local: $ ls -id /usr/local 9352 /usr/local Thư mục /usr/local có chỉ mục inode là 9352. Còn bây giờ, hãy xem chỉ mục inode của mbox/usr/local/bin/ : $ ls -id /usr/local/bin/ 9352 /usr/local/bin/ Ối! Cũng là 9352. Như bạn thấy đấy, /usr/local/bin/ có cùng chỉ mục inode với /usr/local! Như vậy chúng ta hiểu thực chất cũng là một mục trên hệ thống tập tin mà có cùng inode với thư mục mẹ. Đây là một khám phá gây sốc! Trước đây, chúng ta cho rằng /usr/local là thư mục. Bây giờ, chúng ta khám phá ra inode 9352 trên thực tế mới là thư mục, và tìm thấy hai mục (còn gọi là "liên kết") chỉ tới inode này. Đó là /usr/local và /usr/local/bin/ , chúng đều là liên kết tới inode 9352. Mặc dù inode 9352 chỉ tồn tại ở một nơi trên đĩa, nhưng cho phép nhiều mục có thể liên kết tới nó. Inode 9352 là đối tượng thật sự nằm trên đĩa. Trong khi thực hành, nếu muốn chúng ta có thể thấy tổng số lần mà inode 9352 được liên kết đến, dùng câu lệnh ls -dl: $ ls -dl /usr/local drwxrwsr-x 11 root staff 272 2004-06-05 04:06 /usr/local Chúng tôi muốn bạn chú ý vào cột thứ hai từ bên trái. Vâng với những cái đầu nhanh nhạy như của các bạn, thì thấy rằng thư mục /usr/local (hay nói đúng hơn là inode 9352) được liên kết đến mười một lần. Có thật sự nhiều như vậy không? Để đánh tan mọi hoài nghi dưới đây là các mục khác nhau, liên kết đến inode này trên hệ điều hành của tôi: 15object
  18. 10 Cơ bản về Linux /usr/local /usr/local/. /usr/local/bin/ /usr/local/games/ /usr/local/lib/ /usr/local/sbin/ /usr/local/share/ /usr/local/src/ /usr/local/j2sdk1.4.2/ /usr/local/man/ /usr/local/include/ 2.2.6 mkdir Còn bây giờ sau khi đã có một cái nhìn khái quát về thư mục, chúng ta xem xét nhanh câu lệnh mkdir, lệnh sử dụng để tạo một (các) thư mục mới. Ví dụ dưới đây tạo 3 thư mục mới, co, ca, ro, tất cả dưới /tmp: $ cd /tmp $ mkdir co ca ro Theo mặc định, câu lệnh mkdir không tạo thư mục mẹ; tất cả đường dẫn từ thành phần đầu tiên đến thành phần gần cuối cùng phải tồn tại. Để giải thích rõ vấn đề này chúng tôi xin lấy ví dụ sau: trong thư mục nhà cần tạo thư mục project/vnoss/docs và các thư mục project, project/vnoss chưa có sẵn. Thử gõ: $ mkdir project/vnoss/docs mkdir: cannot create directory ‘project/vnoss/docs’: No such file or directory Ối! Lỗi thiếu thư mục mẹ! Chúng ta cần đưa ra ba câu lệnh mkdir riêng biệt như sau: $ mkdir project $ mkdir project/vnoss $ mkdir project/vnoss/docs 2.2.7 mkdir -p Sử dụng 3 câu lệnh riêng biệt như trên thật là bất tiện và mất thời gian. Rất may, tùy chọn -p của mkdir xóa bỏ sự bất tiện này16. Lệnh mkdir với tùy chọn -p sẽ tạo tất cả các thư mục mẹ nếu chúng không tồi tại, như ở đây: 16Trong thế giới Linux bạn sẽ thấy có rất nhiều công cụ như vậy, chỉ cần bỏ chút ít thời gian tìm hiểu thì các công việc hàng ngày sẽ trở nên đơn giản và tốn ít sức lực cũng như trí óc. Ngoài ra rất có thể nó còn đem lại cho bạn sự sảng khoái
  19. 2.2 Sử dụng các câu lệnh 11 $ mkdir -p project2/vnoss/docs Nói chung, sự đơn giản luôn đẹp mắt. Để học thêm về câu lệnh mkdir, gõ man mkdir và đọc trang hướng dẫn sử dụng17 (man page). Bạn cũng có thể đọc trang HDSD của tất cả các câu lệnh đã nói đến (ví dụ, man ls), trừ cd, vì cd là lệnh nội trú (built-in) trong bash18. 2.2.8 touch Bây giờ, chúng ta sẽ xem xét nhanh các câu lệnh cp và mv. Chúng được sử dụng để sao chép, đổi tên, và di chuyển tệp tin (thư mục). Để bắt đầu, chúng ta sử dụng câu lệnh touch tạo một tệp tin trong /tmp: $ cd /tmp $ touch saochepem Câu lệnh touch cập nhật "mtime"19 của một tệp tin nếu tệp tin đó đã có trên hệ thống (cột thứ sáu trong kết quả của ls -l). Nếu tệp tin không tồn tại, thì một tệp tin mới, trống rỗng sẽ được tạo ra. Bây giờ chúng ta đã có tệp tin /tmp/saochepem với kích thước bằng không. 2.2.9 echo Hãy thêm vào tệp tin này một số dữ liệu. Trên hệ thống Linux có rất nhiều cách để làm việc này, tuy nhiên tại thời điểm này chúng ta sẽ dùng câu lệnh echo. Lệnh này lấy đối số và theo mặc định in chúng ở đầu ra tiêu chuẩn20(standard output). Đầu tiên, hãy thử dùng echo như sau: $ echo "tepdautien" tepdautien 2.2.10 echo và sự chuyển hướng Bây giờ, vẫn câu lệnh echo nói trên nhưng với sự chuyển hướng đầu ra (output redirection): $ echo "tepdautien" > saochepem Khi có dấu lớn hơn theo sau là tên tệp tin, hệ vỏ shell sẽ viết đầu ra của echo vào tệp tin đó, tức là saochepem. Tệp tin này sẽ được tạo ra nếu chưa có, hoặc nội dung đã có sẽ bị viết đè lên. Sau đó, nếu kiểm tra tệp tin bằng ls -l, chúng ta có thể thấy saochepem "dài" 11 byte. Đó là vì nó chứa từ tepdautien và ký tự dòng mới: 17xin viết tắt là HDSD 18trong trường hợp này mở HDSD của bash (man bash) rồi tìm đến mục con cd trong mục lớn SHELL BUILTIN COMMAND 19thời gian sửa đổi cuối cùng 20thông thường là màn hình
  20. 12 Cơ bản về Linux $ ls -l saochepem -rw-r r 1 teppi82 thang 11 2004-09-02 18:56 saochepem 2.2.11 cat và cp Để hiển thị nội dung tệp tin trên thiết bị đầu cuối21 (terminal), có thể sử dụng câu lệnh cat: $ cat saochepem tepdautien Bây giờ khi đã có tệp tin để thực hành, chúng ta có thể sử dụng "câu thần chú" cp để tạo tệp tin embansao từ tệp tin gốc saochepem: $ cp saochepem embansao Nếu dùng ls -i nghiên cứu, chúng ta thấy đây là những tệp tin riêng rẽ thật sự: chỉ mục inode của chúng khác nhau! $ ls -i saochepem embansao 471627 embansao 471620 saochepem 2.2.12 mv Lệnh mv lại là một câu thần chú khác. Lần này dùng để đổi tên "embansao" thành "em- bichuyen". Bạn sẽ thấy, trong ví dụ dưới, chỉ mục inode không thay đổi; tuy nhiên, tên tệp tin chỉ đến inode đó thì sẽ khác. $ mv embansao embichuyen $ ls -i embichuyen 471627 embichuyen Số inode của tệp tin bị chuyển vẫn như cũ, và tệp tin thu được nằm trên cùng hệ thống tập tin như tệp tin nguồn (đã không còn nữa). Chúng ta sẽ có cái nhìn gần hơn về hệ thống tập tin tại Phần 3 của cuốn sách này. Chúng tôi muốn nhân việc nói về mv, để xem một cách sử dụng khác của câu lệnh này. mv, ngoài việc đổi tên tệp tin, còn cho phép di chuyển một hay nhiều tệp tin tới vị trí khác trong hệ thống. Ví dụ, để chuyển /var/tmp/teptin.txt tới /home/teppi82 (tệp tin nhà của teppi82) gõ22: $ mv /var/tmp/teptin.txt /home/teppi82 21chúng tôi sẽ dùng từ terminal để thay thế cho thuật ngữ này 22bạn cần tạo teptin.txt trước, dùng lệnh touch
  21. 2.3 Tạo liên kết và xóa tệp tin 13 Sau khi gõ câu lệnh này, teptin.txt sẽ được chuyển đến vị trí mới /home/teppi82/teptin.txt. Và nếu /home/teppi82 nằm trên hệ thống tập tin khác23 với /var/tmp, thì câu lệnh mv sẽ sao chép teptin.txt tới hệ thống tập tin mới và xóa cái trên hệ thống cũ. Rất có thể bạn đã đoán ra rằng, khi di chuyển teptin.txt giữa các hệ thống tập tin, teptin.txt tại vị trí mới sẽ có chỉ mục inode mới. Đó là vì mỗi hệ thống tập tin có một bộ các chỉ mục inode độc lập. mv cũng là một công cụ khá mạnh, chúng ta có thể sử dụng câu lệnh này để di chuyển nhiều tệp tin tới một thư mục đích. Ví dụ, để di chuyển teptin1.txt và baibao3.txt tới /home/teppi82, chúng ta gõ: $ mv /var/tmp/teptin1.txt /var/tmp/baibao3.txt /home/teppi82 2.3 Tạo liên kết và xóa tệp tin 2.3.1 Liên kết cứng Nếu bạn còn nhớ thì chúng ta đã đề cập đến thuật ngữ "liên kết", khi nói đến quan hệ giữa tên hai thư mục và inode của chúng. Thực tế là có hai kiểu liên kết trên Linux. Kiểu mà chúng ta đã nói đến gọi là liên kết cứng. Số liên kết cứng của mỗi inode là không giới hạn, và inode sẽ vẫn còn trên hệ thống tập tin cho đến khi tất cả liên kết cứng của nó bị xóa hết. Khi liên kết cứng cuối cùng bị xóa, và không có chương trình nào mở tệp tin đó, Linux sẽ tự động xóa tệp tin. Nếu bạn muốn tạo liên kết cứng mới, hãy tham khảo câu lệnh ln: $ cd /tmp $ touch lienketdau $ ln lienketdau lienkethai $ ls -i lienketdau lienkethai 10662 lienketdau 10662 lienkethai Chúng ta đã thấy, liên kết cứng làm việc trên cấp độ chỉ mục inode để chỉ tới một tệp tin nói riêng. Trên hệ điều hành Linux, liên kết cứng có một vài hạn chế. Thứ nhất, bạn chỉ có thể tạo liên kết cứng tới tệp tin, tạo liên kết cứng tới thư mục là không thể. Điều này đúng; chỉ có . và là các liên kết cứng tới thư mục do hệ thống tạo ra. Nhưng người dùng (dù là "root") không có quyền tạo một cái cho riêng mình. Hạn chế thứ hai của liên kết cứng là chúng không thể liên kết "xuyên" hệ thống tập tin. Có nghĩa là không thể tạo một liên kết cứng từ /usr/bin/bash tới /bin/bash nếu các thư mục / và /usr nằm trên hai hệ thống tập tin riêng biệt. 2.3.2 Liên kết tượng trưng Rất có thể vì các lý do trên, liên kết tượng trưng(hay symlink) được sử dụng thường xuyên hơn liên kết cứng. Liên kết tượng trưng là một loại tệp tin đặc biệt, mà chỉ tới tệp tin khác bằng tên chứ không chỉ trực tiếp tới inode. Liên kết tượng trưng không ngăn ngừa việc xóa bỏ tệp tin mà nó chỉ tới: nếu tệp tin đích bị xóa bỏ, thì liên kết tượng trưng sẽ không có giá trị sử dụng, hay nó cách khác là bị hỏng. 23trong đa số các trường hợp là một phân vùng khác trên đĩa cứng
  22. 14 Cơ bản về Linux Việc tạo liên kết tượng trưng cũng không có gì phức tạp, chỉ cần đưa tùy chọn -s vào lệnh ln: $ ln -s lienkethai lienketba $ ls -l lienketdau lienkethai lienketba lrwxrwxrwx 1 teppi82 thang 10 2004-09-02 23:04 lienketba -> lienkethai -rw-r r 2 teppi82 thang 0 2004-09-02 19:19 lienketdau -rw-r r 2 teppi82 thang 0 2004-09-02 19:19 lienkethai Trong đầu ra của ls -l, có thể phân biệt liên kết tượng trưng với các tệp tin thông thường bằng 3 cách. Thứ nhất, cột đầu tiên của liên kết tượng trưng chứa ký tự l (link). Thứ hai, kích thước của tệp tin liên kết tượng trưng là số ký tự của tên tệp tin đích (lienkethai, trong trường hợp này). Thứ ba, cột cuối cùng hiển thị tên tệp tin đích có dấu mũi tên -> ở phía trước. 2.3.3 Sâu hơn về liên kết tượng trưng Liên kết tượng trưng nói chung linh hoạt hơn liên kết cứng. Chúng ta có thể tạo liên kết tượng trưng tới bất kỳ đối tượng nào của hệ thống tập tin, bao gồm cả thư mục. Và bởi vì liên kết tượng làm việc trên cơ sở đường dẫn, chứ không phải inode, việc tạo liên kết tượng trưng tới đối tượng trên hệ thống tập tin khác là hoàn toàn có thể. Tuy nhiên, cũng có thể thực tế này lại làm cho việc hiểu liên kết tượng trưng thêm phức tạp. Xem xét thêm trường hợp chúng ta muốn tạo một liên kết trong /tmp mà chỉ đến /usr/local/bin. Cần gõ như sau: $ ln -s /usr/local/bin bin1 $ ls -l bin1 lrwxrwxrwx 1 teppi82 thang Hay một cách tương đương: $ ln -s /usr/local/bin bin2 $ ls -l bin2 lrwxrwxrwx 1 teppi82 thang 16 2004-09-02 23:05 bin2 -> /usr/local/bin Như bạn có thể thấy, cả hai liên kết tượng trưng cùng chỉ tới một thư mục. Tuy nhiên, nếu liên kết tượng trưng thứ hai của chúng ta bị chuyển tới một thư mục khác, nó sẽ bị "vỡ" vì đường dẫn dùng để tạo liên kết này là tương đối: $ mkdir thumucmoi $ mv bin2 thumucmoi $ cd thumucmoi $ cd bin2 bash: cd: bin2: No such file or director
  23. 2.3 Tạo liên kết và xóa tệp tin 15 Nói cụ thể hơn, thư mục /tmp/usr/local/bin trên thực tế không tồn tại. Nhưng vì đường dẫn là tương đối nên sau khi di chuyển bin2, thay vì chỉ tới /usr/local/bin sẽ chỉ tới thư mục không tồn tại nói trên. Vì vậy, chúng ta không thể dùng cd để chuyển tới thư mục bin2; nói cách khác, liên kết bin2 bị vỡ. Vì lý do này, đôi lúc nên tránh việc tạo liên kết tượng trưng với đường dẫn tương đối. Tuy nhiên, có nhiều trường hợp liên kết tượng trưng với đường dẫn tương đối lại thuận tiện. Ví dụ khi bạn muốn tạo tên thứ hai cho một chương trình trong /usr/bin: # ls -l /usr/bin/unicode_start -rwxr-xr-x 1 root root 1061 2004-04-22 22:30 /usr/bin/unicode_start Nếu là người dùng "root"24, bạn có thể tạo một tên tương đương cho "unicode_start", ví dụ "u_s". Trong ví dụ này, dấu nhắc bash chứa "#" là dấu hiệu của người dùng root. Ở đây cần quyền root vì người dùng bình thường không thể tạo tệp tin trong /usr/bin/. Việc tạo một tên tương đương cho unicode_start không có gì phức tạp: # cd /usr/bin # ln -s /usr/bin/unicode_start u_s # ls -l unicode_start -rwxr-xr-x 1 root root 1061 2004-04-22 22:30 unicode_start # ls -l u_s lrwxrwxrwx 1 root root 22 2004-09-02 23:14 u_s -> /usr/bin/unicode_start Ở đây, đã tạo ra liên kết tượng trưng u_s chỉ tới tệp tin /usr/bin/unicode_start. Hãy thử gõ u_s bạn sẽ thấy kết quả thu được! Tuy nhiên, giải pháp này sẽ tạo ra vấn đề nếu chúng ta chuyển cả hai tệp /usr/bin/unicode_start và /usr/bin/u_s tới một thư mục khác, ví dụ /usr/local/bin: # mv /usr/bin/unicode_start /usr/bin/u_s /usr/local/bin # ls -l /usr/local/bin/unicode_start -rwxr-xr-x 1 root root 1061 2004-04-22 22:30 /usr/local/bin/unicode_start # ls -l /usr/local/bin/u_s lrwxrwxrwx 1 root root 22 2004-09-02 23:14 /usr/local/bin/u_s -> /usr/bin/unicode_start Vì chúng ta đã sử dụng đường dẫn tuyệt đối trong khi tạo liên kết tượng trưng nói trên, nên u_s sẽ vẫn chỉ tới /usr/bin/unicode_start. Trong khi đó /usr/bin/unicode_start không còn tồn tại nữa vì đã bị chuyển. Có nghĩa là bây giờ u_s trở thành một liên kết bị vỡ. Cả đường dẫn tuyệt đối và đường dẫn tương đối trong liên kết tượng trưng đều có mặt mạnh riêng của mình, và bạn có thể chọn một loại đường dẫn thích hợp với nhu cầu của mình. Thường thì cả đường dẫn tương đối và đường dẫn tuyệt đối đều làm việc tốt. Trong ví dụ sau, liên kết sẽ làm việc thậm chí sau khi di chuyển cả hai tệp tin25: # cd /usr/bin # ln -s unicode_start u_s 24người có quyền ghi vào thư mục /usr/bin theo mặc định 25chúng tôi ngầm hiểu là bạn đã đặt các tệp tin unicode_start và u_s về lại chỗ cũ của nó
  24. 16 Cơ bản về Linux # ls -l u_s lrwxrwxrwx 1 root root 13 2004-09-02 23:27 u_s -> unicode_start # mv unicode_start u_s /usr/local/bin # ls -l /usr/local/bin/unicode_start -rwxr-xr-x 1 root staff 1061 2004-09-02 23:29 /usr/local/bin/unicode_start # ls -l /usr/local/u_s lrwxrwxrwx 1 root root 13 2004-09-02 23:27 /usr/local/bin/u_s -> unicode_start Bây giờ, chúng ta có thể chạy chương trình unicode_start bằng cách gõ một lệnh ngắn hơn /usr/local/bin/u_s. Lần này /usr/local/bin/u_s chỉ tới chương trình unicode_start trong cùng thư mục với nó. 2.3.4 rm Xin chúc mừng, hơn một nửa chặng đường đã qua, và các bạn đã biết cách sử dụng cp, mv, và ln, giờ là thời gian học cách xóa đối tượng. Thông thường, việc này được thực hiện bởi câu lệnh rm. Để xóa một (các) tệp tin nào đó hãy chỉ rõ chúng trên dòng lệnh: $ cd /tmp $ touch tep1 tep2 $ ls -l tep1 tep2 -rw-r r 1 teppi82 thang 0 2004-09-04 17:53 tep1 -rw-r r 1 teppi82 thang 0 2004-09-04 17:53 tep2 $ rm tep1 tep2 $ ls -l tep1 tep2 ls: tep1: No such file or directory ls: tep2: No such file or directory Chú ý rằng dưới Linux, một khi tệp tin đã bị xoá, nó "ra đi" mãi mãi hay nói đúng hơn là việc khôi phục lại tệp tin đã xóa không đơn giản chút nào. Vì lý do này, nhiều nhà quản trị mới vào nghề thường sử dụng tùy chọn -i khi xóa tệp tin. Với tùy chọn -i rm xóa các tệp tin trong chế độ "hội thoại với người dùng" (interactive mode), tức là, có hỏi ý kiến người dùng trước khi thực sự xóa tệp tin. Ví dụ: $ rm -i tep1 tep2 rm: remove regular empty file ‘tep1’? y rm: remove regular empty file ‘tep2’? y Câu lệnh rm hỏi có "thực sự" muốn xóa tệp tin đã chỉ rõ (tep1 và tep2) hay không. Để xóa chúng, hãy gõ "y" và Enter. Nếu gõ "n", tệp tin sẽ không bị xóa. Hoặc, nếu đã thao tác sai, có thể gõ Control-C để hủy bỏ toàn bộ lệnh rm -i, vì những gì đã làm có thể gây thiệt hại lớn cho hệ điều hành. Nếu bạn vẫn muốn sử dụng câu lệnh rm, thì sẽ rất có ích nếu thêm dòng sau vào tệp tin ∼/.bashrc. Sau khi thêm xong, hãy nhớ đăng xuất và đăng nhập lại26. Sau này, mỗi khi bạn gõ rm, hệ vỏ bash sẽ tự động biến đổi nó thành câu lệnh rm -i. Và như thế, rm sẽ luôn luôn làm việc trong chế độ "hội thoại với người dùng": 26nếu chạy ∼/.bashrc thì không phải đăng xuất/nhập
  25. 2.4 Sử dụng các ký tự đại diện (wildcard) 17 alias rm="rm -i" Hãy tạo các alias khác cho các câu lệnh đã nói đến! Ví dụ mv, cp, Rất có thể sau một thời gian bạn sẽ thấy chán ngán với chế độ hội thoại này, vì nó gây phiền phức, nhất là khi xóa nhiều tệp tin một lúc. Chỉ cần xóa dòng nói trên đi hoặc thêm vào đầu dòng đó ký tự #, chế độ hội thoại sẽ tự động biến mất. 2.3.5 rmdir Để xóa thư mục, bạn có hai lựa chọn. Lựa chọn thứ nhất: xóa tất cả các vật thể bên trong thư mục và cuối cùng sử dụng rmdir để xóa bản thân thư mục đó như ví dụ sau: $ mkdir thumuccuatoi $ touch thumuccuatoi/tep1 $ rm thumuccuatoi/tep1 $ rmdir thumuccuatoi Phương pháp này thường được ám chỉ là cách xóa thư mục cho "trẻ còn bú sữa". Tất cả những người dùng và quản trị có kinh nghiệm dùng dòng lệnh thuận tiện hơn nhiều - rm -rf. Sẽ nói đến dòng lệnh này ở ngay phần sau. 2.3.6 rm và thư mục Cách tốt nhất để xóa một thư mục là sử dụng câu lệnh rm với tùy chọn bắt buộc xóa toàn bộ (recursive force). Với tùy chọn này, rm xóa thư mục đã chỉ ra, cũng như tất cả đối tượng chứa trong thư mục đó: $ rm -rf thumuccuatoi Nói chung, sử dụng dòng lệnh rm -rf là phương pháp được ưa chuộng hơn. Cần rất cẩn thận khi sử dụng rm -rf. Như người ta thường nói bất kỳ huy chương nào cũng có hai mặt, sức mạnh của dòng lệnh này có thể đem đến cả điều có lợi và tai họa. Và nên nhớ đừng bao giờ thử rm -rf /! 2.4 Sử dụng các ký tự đại diện (wildcard) 2.4.1 Giới thiệu về ký tự đại diện Trong quá trình làm quen cũng như sử dụng Linux để làm việc từ ngày này qua ngày khác, chắc chắn có nhiều lần bạn muốn thực hiện một thao tác nào đó (ví dụ xóa rm) trên nhiều đối tượng cùng một lúc. Trong những trường hợp này, gõ nhiều tệp tin trên một dòng lệnh thông thường gây vướng và không được đẹp mắt: $ rm tep1 tep2 tep3 tep4 tep5 tep6 tep7 tep8
  26. 18 Cơ bản về Linux Để giải quyết vấn đề này, chúng ta có thể lợi dụng sự hỗ trợ ký tự đại diện có sẵn trên Linux. Sự hỗ trợ này, còn gọi là "globbing" (vì lý do lịch sử), cho phép người dùng chỉ rõ nhiều tệp tin một lúc, dùng một mẫu đại diện27 nào đó. Bash và các câu lệnh Linux khác sẽ biên dịch mẫu này, và tìm trên hệ thống28 tất cả các tệp tin tương ứng nó. Nhờ vậy, nếu có các tệp tin tep1, tep2, i tep8 trong thư mục hiện thời, bạn có thể xóa những tệp này mà chỉ cần gõ: rm tep[1-8] Hoặc nếu bạn muốn xóa tất cả các tệp tin mà bắt đầu bằng tep cũng như tệp tin nào có tên tep, hãy gõ: $ rm tep* Ký tự đại diện * tương ứng bất kỳ ký tự hay chuỗi ký tự nào, và thậm thí "không có ký tự" cũng tương ứng. Tất nhiên, có thể sử dụng đại diện "toàn cầu" (glob wildcards) để xóa tệp tin một cách đơn giản hơn, như chúng ta sẽ thấy trong các phần tiếp theo. 2.4.2 Hiểu về không tương ứng Nếu muốn liệt kê tất cả đối tượng của hệ thống tập tin trong /etc bắt đầu bằng g cũng như mọi tệp tin có tên là g, bạn cần gõ: $ ls -d /etc/g* /etc/gaim /etc/gnome /etc/group- /etc/gtk /etc/gateways /etc/gnome-vfs-2.0 /etc/group.org /etc/gtk-2.0 /etc/gconf /etc/gnome-vfs-mime-magic /etc/gs-gpl /etc/gdm /etc/groff /etc/gshadow /etc/gimp /etc/group /etc/gshadow- Bây giờ, điều gì sẽ xảy ra nếu bạn dùng một mẫu mà không có đối tượng nào tương ứng? Không có cách kiểm ra nào tốt hơn là một ví dụ: chúng ta thử liệt kê tất cả các tệp tin trong /usr/bin bắt đầu bằng asdf và kết thúc bằng jkl,, gồm cả tệp tin có thể có là asdfjkl: $ ls -d /usr/bin/asdf*jkl ls: /usr/bin/asdf*jkl: No such file or directory Đó là cái đã xảy ra! Thường thì, khi chúng ta chỉ rõ một mẫu, mẫu đó tương ứng một hay nhiều tệp tin trên hệ thống, và bash thay thế mẫu bởi một danh sách các vật thể tìm thấy, cách nhau bởi khoảng trống. Tuy nhiên, khi mẫu không đưa ra không có một đối tượng nào phù hợp, thì bash coi ký tự đại diện như một ký tự bình thường. Kết quả là ls không thể tìm thấy tệp tin /usr/bin/asdf*jkl, và đưa ra thông báo lỗi. Quy luật ở đây là mẫu toàn cầu chỉ được khai triển nếu có đối tượng tương ứng trong hệ thống tập tin. Trong trường hợp ngược lại chúng được đưa nguyên văn vào câu lệnh29. 27wildcard pattern 28nói chính xác hơn là trong đường dẫn chỉ ra trong dòng lệnh 29trong trường hợp này /usr/bin/asdf*jkl sẽ được đưa vào câu lệnh ls
  27. 2.4 Sử dụng các ký tự đại diện (wildcard) 19 2.4.3 Cú pháp đại diện: * Bây giờ, khi đã thấy cơ chế làm việc của globbing trong các trường hợp khác nhau, chúng ta có thể xem xét đến cú pháp của nó. Ở trên đã có một vài ví dụ với *. Ở đây chúng ta tiếp tục tìm hiểu sâu hơn về ký tự này. Xin được nhắc lại * sẽ tương ứng không hoặc nhiều ký tự. Nó có nghĩa "bất kỳ thứ gì có thể vào đây, gồm cả không có gì". Tốt hơn hết chúng ta xem xét các ví dụ sau, hy vộng chúng sẽ giúp bạn hiểu rõ hơn những điều chúng tôi muốn nói: • /etc/g* tương ứng tất cả tệp tin trong /etc mà bắt đầu bằng g, hoặc một tệp tin hay thư mục có tên g. • /tmp/my*l tương ứng tất cả tệp tin trong /tmp mà bắt đầu bằng my và kết thúc bằng l, bao gồm cả tệp tin myl 2.4.4 Cú pháp đại diện: ? Khác với *, ? phù hợp bất kỳ ký tự đơn nào. Ví dụ: • tepcuatoi? tương ứng bất kỳ tệp tin nào mà tên của nó là tepcuatoi theo sau là một ký tự đơn30. • /tmp/note?txt tương ứng cả /tmp/notes.txt và emph/tmp/notes_txt, tất nhiên nếu chúng tồn tại. 2.4.5 Cú pháp đại diện: [] Cú pháp đại diện này giống một ? ở chỗ cũng chỉ tương ứng với một ký tự đơn, nhưng đặc trưng hơn, rồi bạn sẽ thấy tại sao lại đặc trưng hơn. Để sử dụng cú pháp này, đặt các ký tự mà bạn muốn tìm tương ứng vào trong []. Biểu thức thu được sẽ tìm sự tương ứng với mỗi ký tự nằm trong dấu ngoặc vuông này. Bạn có thể sử dụng - để chỉ rõ một chuỗi ký tự liên tiếp, và thậm chí liên hợp các chuỗi này. Phù! Tốt hơn hết là xem xét các ví dụ. Hãy đọc kỹ các ví dụ sau và động não một chút, nhất định bạn sẽ nắm chắc vấn đề: • tepcuatoi[12] sẽ tương ứng tepcuatoi1 và tepcuatoi2. Cũng như * cú pháp đại diện sẽ được khai triển nếu ít nhất một trong những tệp tin này tồn tại trong thư mục hiện thời. • [Cc]hange[Ll]og sẽ tương ứng Changelog, ChangeLog, changeLog, và changelog. Bây giờ thì chắc bạn đã rõ sự đặc trưng của cú pháp này. Ngoài ra, cú pháp này làm phong phú thêm sự tương ứng: • ls /etc/[0-9]* sẽ liệt kê tất cả các tệp tin trong /etc bắt đầu bằng một chữ số. • ls /tmp/[A-Za-z]* sẽ liệt kê tất cả các tệp tin trong /tmp bắt đầu bằng một chữ cái hoa hay chữ cái thường. 30ví dụ tepcuatoi1 tepcuatoi2 tepcuatoia tepcuatoix
  28. 20 Cơ bản về Linux 2.4.6 Cú pháp đại diện: [!] Cấu trúc [!] giống với cấu trúc [], nhưng nó sẽ tương ứng bất kỳ ký tự nào, mà không được liệt kê giữa [! và ]. Ví dụ: • rm tepcuatoi[!9] sẽ xóa tất cả các tệp tin có tên tepcuatoi cộng với một ký tự đơn, ngoại trừ tepcuatoi9. 2.4.7 Sâu hơn về cú pháp đại diện Đây là một số điều cần để ý khi sử dụng các cú pháp đại diện. Đầu tiên, bash "đối xử" các ký tự đại diện, ?, [, ], và *, một cách đặc biệt, bạn cần rất cẩn thận khi gõ trong đối số của một câu lệnh những ký tự này. Ví dụ, nếu muốn tạo một tệp tin có chứa dòng [fo]*, thì câu lệnh sau sẽ không làm cái bạn muốn: $ echo [fo]* > /tmp/teptinmoi.txt Vì mẫu [fo]* tương ứng (hoặc không tương ứng) với (các) tệp tin nào đó trong thư mục hiện thời, nên bạn sẽ thấy tên của chúng, nếu có, trong /tmp/teptinmoi.txt, chứ không phải là dòng [fo]* như bạn mong đợi. Giải pháp? Một cách giải quyết là đưa các ký tự đó vào dấu ngoặc đơn, chúng (dấu ngoặc) ngăn chặn không cho bash thực hiện sự khai triển trên ký tự: $ echo ’[fo]*’ > /tmp/teptinmoi.txt Sử dụng cách này, tệp tin mới của bạn sẽ chứa dòng chữ [fo]* như mong muốn. Một giải pháp khác: sử dụng ký tự thoát (escape character) gạch ngược. Khi đó bash coi [, ], và * là các ký tự thường chứ không phải ký tự đại diện: echo \[fo\]\* > /tmp/teptinmoi.txt Cả hai cách (ngoặc đơn và ký tự thoát) có cùng một tác dụng. Nhân khi đang nói về ký tự gạch ngược, giờ là thời điểm tốt để nói rằng, nếu muốn dùng \ như một ký tự bình thường, cần hoặc đưa nó vào ngoặc đơn, hoặc gõ \\, 31. Kết qủa là bash sẽ khai triển hai biểu thức đó thành \. 2.4.8 Ngoặc đơn "gặp" ngoặc kép Chú ý rằng ngoặc kép có tác dụng tương tự như ngoặc đơn, nhưng vẫn cho phép bash thực hiện một số khai triển giới hạn nào đó. Ví dụ, ký tự thoát gạch ngược trong một vài trường hợp vẫn có tác dụng dù nằm trong ngoặc kép. Hãy thử echo "\"! Bởi vậy, ngoặc đơn là tốt nhất khi bạn thực sự muốn đưa nguyên văn đối số cho các câu lệnh. Để thêm thông tin về sự khai triển globbing, gõ man 7 glob. Xem thêm thông tin về trích dẫn (quote), bằng các dấu ngoặc, gõ man 8 glob rồi đọc phần QUOTING. Nếu bạn có dự định trả thi LPI, coi như đây là bài tập về nhà. 31ngoặc đơn hay ký tự gạch ngược sẽ là dấu thoát cho \
  29. 2.5 Tổng kết và các nguồn tham khảo 21 2.5 Tổng kết và các nguồn tham khảo 2.5.1 Tổng kết Đầu tiên xin chúc mừng: bạn tới điểm cuối cuốn ôn tập Linux - những điều cơ bản của chúng tôi! Rất hy vọng nó giúp bạn nắm chắc những kiến thức sơ đẳng nhất về Linux. Các chủ đề bạn đã học ở cuốn này, bao gồm cơ sở về bash, những câu lệnh Linux cơ bản, liên kết, và đại diện, là nền móng cho cuốn hướng dẫn tiếp theo, quản trị cơ sở, trong đó chúng tôi sẽ đưa các chủ đề như biểu thức chính quy (regular expression), quyền sở hữu, quyền hạn, quản lý tài khoản người dùng, và nhiều chủ để khác nữa. Tiếp tục cuốn hướng dẫn này, bạn sẽ sớm chuẩn bị đạt tới chứng chỉ LPIC bậc 1 từ Linux Professional Institute. Nói đến chứng chỉ LPIC, nếu đây là cái bạn quan tâm, thì chúng tôi khuyên bạn nên đầu tư thời gian học các các tài liệu tham khảo ngay sau đây. Chúng tôi đã lựa chọn cẩn thận để bổ sung thêm cho cuốn hướng dẫn này. 2.5.2 Các nguồn tham khảo Trong các bài báo "Bash qua ví dụ" ("Bash by example") trên developerWorks, Daniel cho bạn biết cách sử dụng cấu trúc lập trình bash để viết script của mình. Ba bài báo này, và nhất là phần 1 và phần 2, là cần thiết cho kỳ thi LPIC bậc 1: • Bash qua ví dụ, Phần 1: Lập trình cơ sở trong hệ vỏ Bourne-again shell • Bash qua ví dụ, Phần 2: Lập trình bash nâng cao • Bash qua ví dụ, Phần 3: Khám phá hệ thống ebuild Nếu bạn là người dùng Linux mới hay trung bình, bạn thật sự không thể không xem Những câu hỏi kỹ thuật thường đặt - dành cho người dùng Linux (Technical FAQ for Linux users). FAQ này là danh sách 50 trang, đi sâu về những câu hỏi mà người dùng Linux thường đặt ra, với các câu trả lời chi tiết. Bản thân FAQ này ở dạng PDF (Acrobat). Nếu bạn cảm thấy không quen thuộc lắm với trình soạn thảo vi, hãy xem cuốn hướng dẫn vi vỡ lòng (Intro to vi). Cuốn hướng dẫn này là khóa mở đầu cấp tốc về trình soạn thảo mạnh này. Coi như đây là tài liệu phải đọc thêm nếu bạn không biết cách sử dụng vi. 2.5.3 Ý kiến độc giả Hãy cho chúng tôi biết cuốn hướng dẫn này có giúp ích cho bạn không. Và chúng tôi có thể làm nó tốt hơn như thế nào. Đồng thời, chúng tôi cũng muốn nghe về những chủ đề khác mà bạn có thể muốn xem trong dự án tài liệu hướng dẫn của developerWorks Để đặt câu hỏi về nội dung của cuốn hướng dẫn thứ nhất này, liên hệ tác giả, Daniel Robbins, tại drobbins@gentoo.org. 2.5.4 Thay cho lời kết cuốn 1 Cuốn hướng dẫn này được viết hoàn toàn trên XML, sử dụng chương trình tạo sách hướng dẫn Toot-O-Matic của developerWorks32. Công cụ mã nguồn mở Toot-O-Matic một XSLT 32 người dịch: bản dịch được viết trên mã TEX sử dụng trình soạn thảo gedit
  30. 22 Cơ bản về Linux stylesheet và vài chức năng XSLT mở rộng biến đổi tệp XML thành các trang HTML, một tệp zip, ảnh tiêu đề JPEG và hai tệp PDF. Khả năng xuất ra cả dạng văn bản và dạng nhị nguyên từ một tệp nguồn đơn cho thấy khả năng và sự linh hoạt của XML. (XML đồng thời tiết kiệm rất nhiều thời gian và sức lực của nhóm chúng tôi). Bạn có thể lấy mã nguồn của công cụ Toot-O-Matic tại Cuốn hướng dẫn Xây dựng hướng dẫn với Toot-O-Matic (Bulding tutorials with the Toot-O-Matic) cho thấy cách sử dụng Toot-O-Matic để tạo hướng dẫn của chính bạn. developerWorks còn làm chủ một diễn đàn dành cho Toot-O-Matic, tại địa chỉ: late?OpenForm&RestrictToCategory=11. Chúng tôi rất muốn biết bạn nghĩ gì về công cụ này.
  31. Chương 3 Cơ bản về quản trị Linux 3.1 Biểu thức chính quy 3.1.1 Biểu thức chính quy là gì? Một biểu thức chính quy, regular expression, (hay còn gọi là một "regex" hay "regexp") là một cú pháp đặc biệt được sử dụng để mô tả các mẫu văn bản. Trên hệ thống Linux, biểu thức chính quy thường dùng để tìm một mẫu văn bản nào đó, cũng như thao tác tìm và thay thế trong văn bản 3.1.2 So sánh với ký tự đại diện (glob) Khi xem xét biểu thức chính quy, bạn có thể thấy rằng cú pháp biểu thức chính quy trông giống với cú pháp của "globbing" mà chúng ta đã xét đến tại Phần 1. Tuy nhiên, đừng để điều này làm bạn ngu muội, sự giống nhau của chúng chỉ là vỏ bên ngoài. Biểu thức chính quy và mẫu ký tự đại diện, trong khi nhìn có vẻ giống nhau, là những con thú dữ khác nhau. 3.1.3 Chuỗi con đơn giản Với chú ý trên, hãy xem xét những điều cơ bản nhất của biểu thức chính quy, chuỗi con đơn giản (simple substring). Chúng ta sẽ sử dụng grep, câu lệnh quét nội dung của một tệp cho một biểu thức chính quy nói riêng. grep in ra mọi dòng mà tương ứng với biểu thức chính quy, và lờ đi mọi dòng khác: $ grep bash /etc/passwd operator:x:11:0:operator:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/bash Ở trên, tham số đầu tiên cho grep là regex; thứ hai là tên tệp tin. grep đọc từng dòng trong /etc/passwd và áp dụng simple substring regex bash tới nó (dòng), tìm sự tương ứng. Nếu có tương ứng, grep in cả dòng đó; nếu không, dòng sẽ bị bỏ qua.
  32. 24 Cơ bản về quản trị Linux 3.1.4 Hiểu về chuỗi con đơn giản Nói chung, nếu bạn đang tìm một chuỗi con, bạn có thể chỉ cần văn bản nguyên dạng không cần thêm các ký tự "đặc biệt". Bạn cần phải làm một cái gì đó đặc biệt khi chuỗi con của bạn chứa một +, ., *, [, ],, trong trường hợp này những ký tự trên phải đưa vào ngoặc kép và đặt sau gạch ngược (\). Dưới đây là một vài ví dụ chuỗi con đơn giản: • /tmp (quét tìm dòng văn bản /tmp) • "$\backslash$[box$\backslash$]" (quét tìm dòng văn bản [box]) • "$\backslash$*funny$\backslash$*" (quét tìm dòng văn bản *funny*) • "ld$\backslash$.so" (quét tìm dòng văn bản ld.so) 3.1.5 Ký tự mêta Với biểu thức chính quy, sau đây bạn có thể thực hiện những tìm kiếm phức tạp hơn ví dụ nêu trên lợi dụng ký tự mêta1. Một trong số các ký tự mêta là . (dấu chấm câu), mà tương ứng bất kỳ ký tự đơn nào: $ grep dev.hda /etc/fstab /dev/hda3 / reiserfs noatime,ro 1 1 /dev/hda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/hda2 swap swap sw 0 0 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1 Trong ví dụ này văn bản dev.hda không có trên bất kỳ dòng nào trong /etc/fstab. Tuy nhiên, grep không quét tìm chuỗi văn bản dev.hda, mà tìm mẫu dev.hda. Nhớ rằng . sẽ tương ứng bất kỳ ký tự đơn nào. Như bạn có thể thấy, ký tự mêta . có chức năng tương đương với ký tự ? trong "glob". 3.1.6 Sử dụng [] Nếu chúng ta muốn tìm tương ứng một ký tự đặc biệt hơn ., chúng ta có thể sử dụng [ và ] (dấu ngoặc vuông) để chỉ rõ một tổ hợp các ký tự cần tìm tương ứng: $ grep dev.hda[12] /etc/fstab /dev/hda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/hda2 swap swap sw 0 0 Như bạn có thể thấy, tính năng này nói riêng trùng với [] trong sự mở rộng "glob". Nhắc lại lần nữa, đây là một trong những rắc rối khi học regex – cú pháp là giống nhau nhưng không đồng nhất với sự mở rộng "glob", thường làm regex rối rắm khi học. 1Ký tự mêta là ký tự dùng để mô tả các ký tự khác - người dịch
  33. 3.1 Biểu thức chính quy 25 3.1.7 Sử dụng [ˆ] Bạn có thể đảo ngược ý nghĩa của dấu ngoặc vuông bằng cách đặt một \^{} ngay sau [. Trong trường hợp này, dấu ngoặc đơn sẽ tìm tương ứng bất kỳ ký tự nào mà không được liệt kê trong chúng. Nhắc lại lần nữa, chú ý rằng chúng ta dùng [\^{}] với biểu thức chính quy, nhưng [!] với "glob": $ grep dev.hda[^{}12] /etc/fstab /dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1 3.1.8 Cú pháp khác Cần biết rằng cú pháp bên trong ngoặc vuông khác cơ bản với những phần khác của biểu thức chính quy. Ví dụ, nếu bạn đặt một . bên trong ngoặc vuông, nó cho phép ngoặc vuông tìm tương ứng một ký tự thường ., giống như 1 và 2 trong ví dụ trên. Để so sánh, một ký tự . ngoài ngoặc vuông được biên dịch như một ký tự mêta trừ khi đặt sau một $\backslash$. Chúng ta có thể lợi dụng điều này để in ra danh sách tất cả những dòng trong /etc/fstab mà chứa dòng văn bản dev.hda bằng cách gõ: $ grep dev[.]hda /etc/fstab Một cách tương tự, có thể gõ: $ grep "dev\.hda" /etc/fstab} Có thể không biểu thức chính quy nào tìm thấy tương ứng trong /etc/fstab của bạn. 3.1.9 Ký tự mêta "*" Một vài ký tự mêta tự chúng không tương ứng với bất kỳ thứ gì, nhưng thay đổi ý nghĩa của ký tự đứng trước. Một ký tự mêta như vậy là * (dấu sao), mà được sử dụng để tìm tương ứng không (0) hay nhiều lần lặp lại của ký tự đứng trước. Lưu ý điều đó có nghĩa rằng * có một ý nghĩa khác trong regex so với trong glob. Đây là một số ví dụ, và cần quan tâm tới những trường hợp cá biệt khi regex khác với glob: • ab*c tương ứng abbbbc nhưng không tương ứng abqc (Nếu là glob, nó sẽ tương ứng cả hai chuỗi – bạn có thể đoán ra tại sao không?) • ab*c tương ứng abc nhưng không tương ứng abbqbbc (nhắc lại, nếu một glob, nó sẽ tương ứng cả hai) • ab*c tương ứng ac nhưng không tương ứng cba (nếu một glob, nó sẽ không tương ứng cả ac và ba|) • b[cq]*e tương ứng bqe và be (nếu một glob, nó sẽ tương ứng bqe nhưng be thì không)
  34. 26 Cơ bản về quản trị Linux • b[cq]*e tương ứng bccqqe nhưng không tương ứng bccc (nếu một glob, nó cũng tương ứng cái thứ nhất, nhưng cái thứ hai thì không) • b[cq]*e tương ứng bqqcce nhưng không tương ứng cqe (nếu một glob, nó cũng tương ứng cái thứ nhất, nhưng cái thứ hai thì không) • b[cq]*e tương ứng bbbeee (với glob thì không) • .* sẽ tương ứng bất kỳ chuỗi nào. (nếu một glob, nó sẽ tương ứng bất kỳ chuỗi nào bắt đầu với .) • foo.* sẽ tương ứng bất kỳ chuỗi nào mà bắt đầu với foo (nếu một glob, nó sẽ tương ứng bất kỳ chuỗi nào bắt đầu với bốn ký tự văn bản foo ) Bây giờ, cho sự xem lại nhanh: dòng ac tương ứng regex ab*c vì dấu sao cho phép biểu thức đứng trước (c) xuất hiện không lần. Nhắc lại, cần chú ý rằng ký tự mêta regex * được biên dịch một cách khác cơ bản với ký tự * của glob. 3.1.10 Đầu và cuối dòng Hai ký tự mêta cuối cùng chúng ta đề cập chi tiết ở đây là \^{} và \$, mà sử dụng để tìm tương ứng đầu và cuối một dòng. Sử dụng \^{} tại đầu regex của bạn, bạn có thể khiến mẫu "thả neo" tới đầu dòng. Trong ví dụ dưới đây, chúng ta sử dụng regex \^{}\# để tìm bất kỳ dòng nào bắt đầu với ký tự \#: $ grep ^{}# /etc/fstab # /etc/fstab: static file system information. # 3.1.11 Regex cho cả dòng \^{} và \$ có thể phối hợp để tương ứng một dòng trọn vẹn. Ví dụ, regex tới đây sẽ tương ứng một dòng mà bắt đầu với ký tự \# và kết thúc bằng ký tự ., với bất kỳ số ký tự khác giữa chúng: $ grep ’^{}#.*\.$’ /etc/fstab # /etc/fstab: static file system information. Trong ví dụ trên, chúng ta bao quanh biểu thức chính quy dùng ngoặc đơn để ngăn ngừa việc shell biên dịch \$}. Không có ngoặc đơn, \verb$| sẽ biến mất khỏi regex trước khi grep có cơ hội thấy nó.
  35. 3.2 FHS và tìm tệp tin 27 3.2 FHS và tìm tệp tin 3.2.1 FHS - Tiêu chuẩn hệ thống tập tin dạng cây Tiêu Chuẩn Hệ Thống Tập Tin Dạng Cây (Filesystem Hierarchy Standard) là một tài liệu chỉ rõ cách sắp đặt các thư mục trên một hệ thống Linux. FHS được đặt ra để cung cấp một cách sắp đặt chung làm đơn giản việc phát triển các phần mềm /textitkhông phụ thuộc bản phân phối. FHS định rõ cây thư mục sau (lấy thẳng từ tài liệu FHS ra): • / (thư mục gốc, root) • /boot (các tệp tin tĩnh của trình khởi động) • /dev (tệp thiết bị) • /etc (cấu hình hệ thống của host) • /lib (các thư viện chia sẻ cốt yếu và môđun nhân) • /mnt (điểm gắn cho các hệ thống tập tin tạm thời) • /opt (các gói chương trình thêm vào, add-on) • /sbin (tệp tin nhị nguyên cốt yếu) • /tmp (tệp tin tạm thời) • /usr (cây thư mục phụ) • /var (dữ liệu động - biến thiên) 3.2.2 Hai cấp bậc FHS độc lập FHS đặt cơ sở xác định sự sắp đặt thư mục dựa trên ý tưởng, có hai cấp bậc tệp tin độc lập: có thể chia sẻ với không thể chia sẻ, và tĩnh với động. Dữ liệu chia sẻ có thể chia sẻ giữa các máy; dữ liệu không chia sẻ là của riêng một hệ thống (ví dụ các tệp tin cấu hình). Dữ liệu động có thể thay đổi; dữ liệu tĩnh không thay đổi (trừ khi cài đặt và bảo trì). Bảng sau đây tổng kết bốn khả năng kết hợp, với ví dụ các thư mục rơi vào các hạng mục này. Xin nhắc lại, bảng này lấy trực tiếp từ tài liệu FHS: + + + + | | chia sẻ | không chia sẻ | + + + + | Tĩnh | /usr | /etc | | | /opt | /boot | + + + + | Động | /var/mail | /var/run | | | /var/spool/news | /var/lock | + + + +
  36. 28 Cơ bản về quản trị Linux 3.2.3 Hệ thống bậc hai tại /usr Dưới /usr bạn sẽ tìm thấy một hệ thống bậc hai mà có vẻ rất giống hệ thống tập tin gốc (root). Không nhất thiết phải tồn tại /usr khi máy khởi động, vì thế nó có thể được chia sẻ trong một mạng (có thể chia sẻ), hay gắn (mount) từ một CD-ROM (tĩnh). Thông thường trình cài đặt Linux không chia sẻ /usr, nhưng tìm hiểu mặt có ích của sự khác nhau giữa hệ thống chính tại thư mục gốc và hệ thống bậc hai tại /usr là có giá trị lớn. Đây là tất cả những gì chúng ta sẽ nói về FHS. Tài liệu dễ đọc, vì vậy bạn nên xem nó. Bạn sẽ hiểu nhiều về hệ thống tập tin Linux nếu bạn đọc nó. Tìm tài liệu tại 3.2.4 Tìm tệp tin Hệ thống Linux thường chứa hàng trăm nghìn tệp tin. Có thể bạn đủ hiểu biết để không bao giờ mất dấu một tệp nào trong chúng, nhưng bạn thỉnh thoảng bạn sẽ cần giúp đỡ tìm kiếm. Có một vài công cụ khác nhau trên LInux để tìm tệp tin. Sự giới thiệu này giúp bạn chọn đúng công cụ. 3.2.5 Đường dẫn Khi bạn chạy một chương trình tại dòng lệnh, bash thực chất tìm chương trình bạn yêu cầu trong các thư mục của một danh sách. Ví dụ, khi bạn gõ ls, bash theo bản chất không biết rằng chương trình ls nằm trong /usr/bin. Thay vào đó, bash xem biến môi trường PATH, mà là một danh sách thư mục, phân cách nhau bởi dấu hai chấm. Chúng ta có thể kiểm tra giá trị của PATH: $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin Nhận được giá trị này của PATH (của bạn có thể khác), bash đầu tiên sẽ kiểm tra /usr/local/bin, sau đó /usr/bin tìm chương trình ls. Rất có thể, ls nằm tại /usr/bin, nếu vậy bash sẽ dừng việc tìm kiếm tại đó. 3.2.6 Sửa đổi PATH Bạn có thể thêm đường dẫn vào PATH tại dòng lệnh: $ PATH=$PATH:~/bin $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/home/agriffis/bin Đồng thời bạn có thể xóa bỏ một phần tử từ PATH, mặc dù không dễ dàng như trên vì bạn không thể dùng \$PATH đã có trước. Cách tốt nhất là gõ lại PATH mới mà bạn muốn:
  37. 3.2 FHS và tìm tệp tin 29 $ PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:~/bin $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/agriffis/bin Để các quá trình mà bạn sẽ chạy từ shell này có thể sử dụng PATH của bạn, xuất nó dùng câu lệnh export: $ export PATH 3.2.7 Tất cả về "which" Bạn có thể kiểm tra chương trình có trong PATH không bằng which. Ví dụ, ở đây chúng ta thấy hệ điều hành Linux không có (nói chung) sense: $ which sense which: no sense in (/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin) Trong ví dụ này, định vị ls thành công: $ which ls /usr/bin/ls 3.2.8 "which -a" Cuối cùng, bạn cần biết cờ (flag) -a, mà khiến which đưa ra tất cả trường hợp chương trình trong PATH: $ which -a ls /usr/bin/ls /bin/ls 3.2.9 whereis Nếu bạn thích thú với việc tìm nhiều thông tin hơn là vị trí nghèo nàn của chương trình, bạn nên thử whereis: $ whereis ls ls: /bin/ls /usr/bin/ls /usr/share/man/man1/ls.1.gz Ở đây chúng ta thấy ls xuất hiện tại hai vị trí,/bin và /usr/bin. Thêm vào đó, có một trang hướng dẫn sử dụng (man) tại /usr/share/man. Bạn sẽ thấy trang man này nếu gõ man ls. Chương trình whereis đồng thời có khả năng tìm nguồn, chỉ rõ đường dẫn tìm kiếm khác, và tìm kiếm những mục ít dùng. Xem trang man của whereis để biết thêm thông tin.
  38. 30 Cơ bản về quản trị Linux 3.2.10 find Câu lệnh find là công cụ thuận tiện khác. Với find bạn không bị hạn chế; bạn có thể tìm bất kỳ tệp nào bạn muốn, sử dụng muôn màu muôn vẻ của các tiêu chuẩn tìm kiếm. Ví dụ, để tìm một tệp có tên README, bắt đầu trong /usr/share/doc: $ find /usr/share/doc -name README /usr/share/doc/ion-20010523/README /usr/share/doc/bind-9.1.3-r6/dhcp-dynamic-dns-examples/README /usr/share/doc/sane-1.0.5/README 3.2.11 find và ký tự đại diện Bạn có thể sử dụng ký tự đại diện "glob" trong đối số cho -name, đặt trong ngoặc kép hoặc dùng ký tự thoát - gạch ngược (như vậy chúng sẽ đưa vào find nguyên vẹn mà không bị khai triển bởi bash). Ví dụ, chúng ta muốn tìm tệp tin README có phần mở rộng: $ find /usr/share/doc -name README\* /usr/share/doc/iproute2-2.4.7/README.gz /usr/share/doc/iproute2-2.4.7/README.iproute2+tc.gz /usr/share/doc/iproute2-2.4.7/README.decnet.gz /usr/share/doc/iproute2-2.4.7/examples/diffserv/README.gz /usr/share/doc/pilot-link-0.9.6-r2/README.gz /usr/share/doc/gnome-pilot-conduits-0.8/README.gz /usr/share/doc/gimp-1.2.2/README.i18n.gz /usr/share/doc/gimp-1.2.2/README.win32.gz /usr/share/doc/gimp-1.2.2/README.gz /usr/share/doc/gimp-1.2.2/README.perl.gz [578 dòng bị cắt đi] 3.2.12 Lờ đi kiểu chữ với find Tất nhiên, có thể bạn muốn bỏ qua kiểu chữ khi tìm kiếm: $ find /usr/share/doc -name ’[Rr][Ee][Aa][Dd][Mm][Ee]*’ Hay đơn giản hơn: $ find /usr/share/doc -iname readme\* Như bạn đã thấy, bạn có thể dùng -iname để việc tìm kiếm không nhạy cảm với kiểu chữ.
  39. 3.2 FHS và tìm tệp tin 31 3.2.13 find và biểu thức chính quy Nếu dùng thạo biểu thức chính quy, bạn có thể dùng tùy chọn -regex để giới hạn dữ liệu ra. Tương tự như tùy chọn -iname, có tùy chọn tương ứng là -iregex cho phép lờ đi kiểu chữ trong mẫu. Ví dụ: $ find /etc -iregex ’.*xt.*’ /etc/X11/xkb/types/extra /etc/X11/xkb/semantics/xtest /etc/X11/xkb/compat/xtest /etc/X11/app-defaults/XTerm /etc/X11/app-defaults/XTerm-color Chú ý rằng không giống như nhiều chương trình, find yêu cầu regex chỉ rõ đường dẫn đầy đủ, mà không phải chỉ có một phần. Vì lý do này, chỉ rõ đầu và đuôi .* là cần thiết; chỉ dùng regex xt sẽ không đủ. 3.2.14 find và kiểu Tùy chọn -type cho phép tìm vật thể hệ thống tập tin của một kiểu nào đó. Các argumen có thể đưa vào -type là b (block device - thiết bị khối), c (character device - thiết bị ký tự), d (directory - thư mục), p (named pipe - "ống"), f (regular file - tệp tin thường), l (symbolic link - liên kết tượng trưng), và s (socket). Ví dụ, để tìm liên kết tượng trưng trong /usr/bin mà chứa chuỗi vim: $ find /usr/bin -name ’*vim*’ -type l /usr/bin/rvim /usr/bin/vimdiff /usr/bin/gvimdiff 3.2.15 find và mtimes Tùy chọn -mtime cho phép bạn chọn tệp dựa trên thời gian sửa đổi cuối cùng. Argumen cho mtime là một kỳ hạn của 24 giờ, và có ích khi sử dụng với dấu cộng (có nghĩa "sau") hay dấu trừ (có nghĩa "trước"). Ví dụ, xem xét bối cảnh sau: $ ls -l ? -rw 1 root root 0 Jan 7 18:00 a rw 1 root root 0 Jan 6 18:00 b -rw 1 root root 0 Jan 5 18:00 c -rw 1 root root 0 Jan 4 18:00 d $ date Mon May 7 18:14:52 EST 2003 Bạn có thể tìm tệp tin được tạo ra trong 24 giờ trước:
  40. 32 Cơ bản về quản trị Linux $ find . -name \? -mtime -1 ./a Hay có thể tìm tệp tin được tạo ra trong 24 giờ hiện thời: \$ find . -name \? -mtime +0 ./b ./c ./d 3.2.16 Tùy chọn -daystart Nếu bạn chỉ rõ tùy chọn -daystart, thì thời gian sẽ tính từ lúc ngày bắt đầu chứ không phải là 24 giờ trước. Ví dụ, đây là những tệp tin được tạo ra hôm qua và ngày hôm kia: $ find . -name \? -daystart -mtime +0 -mtime -3 ./b ./c $ ls -l b c -rw 1 root root 0 May 6 18:00 b -rw 1 root root 0 May 5 18:00 c 3.2.17 Tùy chọn -size Tùy chọn -size cho phép bạn tìm tệp tin dựa trên kích thước. Theo mặc định, argumen cho -size là một khối 512 byte, nhưng có thể đơn giản hóa bằng thêm hậu tố. Hậu tố có thể dùng là b (block - khối 512 byte), c (character - byte), k (kilôbyte), và w (word - từ 2 byte). Thêm vào đó, bạn có thể đặt dấu cộng ("lớn hơn") hay dấu trừ ("nhỏ hơn"). Ví dụ, tìm tệp tin thường trong /usr/bin mà nhỏ hơn 50 byte: $ find /usr/bin -type f -size -50c /usr/bin/krdb /usr/bin/run-nautilus /usr/bin/sgmlwhich /usr/bin/muttbug 3.2.18 Gia công tệp tin tìm thấy Có thể bạn tự hỏi rằng bạn có thể làm gì với tất cả những tệp tin mà bạn tìm thấy! find có khả năng thực hiện trên những tệp tin này dùng tùy chọn -exec. Tùy chọn này chấp nhận một dòng lệnh như là argumen để thực hiện, kết thúc với ;, và sẽ thay bất kỳ sự có mặt nào của \{\} với tên tệp. Thí dụ sau sẽ giúp hiểu rõ hơn:
  41. 3.2 FHS và tìm tệp tin 33 $ find /usr/bin -type f -size -50c -exec ls -l ’\{\}’ ’;’ -rwxr-xr-x 1 root root 27 Oct 28 07:13 /usr/bin/krdb -rwxr-xr-x 1 root root 35 Nov 28 18:26 /usr/bin/run-nautilus -rwxr-xr-x 1 root root 25 Oct 21 17:51 /usr/bin/sgmlwhich -rwxr-xr-x 1 root root 26 Sep 26 08:00 /usr/bin/muttbug Như bạn có thể thấy, find là một câu lệnh mạnh. Nó đã trưởng thành trong những năm phát triển của UNIX và Linux. Có nhiều tùy chọn có ích khác. Có thể học trong trang man của find. 3.2.19 locate Chúng ta vừa xem xong which, whereis và find. Có thể bạn đã nhận ra rằng find cần một chút thời gian khi thi hành, vì nó cần đọc từng thư mục đang tìm. Câu lệnh locate có thể tăng tốc độ dựa trên cơ sở dữ liệu ngoài mà tạo ra bởi updatedb (chúng ta sẽ đề cập ở mục tới). Câu lệnh locate tìm bất kỳ phần nào của tên, không chỉ tên đầy đủ của tệp tin. Ví dụ: $ locate bin/ls /var/ftp/bin/ls /bin/ls /sbin/lsmod /sbin/lspci /usr/bin/lsattr /usr/bin/lspgpot /usr/sbin/lsof 3.2.20 Sử dụng updatedb Hầu hết hệ thống Linux có một "công việc cron" để cập nhật cơ sở dữ liệu định kỳ. Nếu locate của bạn trả lại lỗi như sau, thì cần chạy updatedb với quyền root để tạo cơ sở dữ liệu tìm kiếm: $ locate bin/ls locate: /var/spool/locate/locatedb: No such file or directory $ su Password: # updatedb Câu lệnh updatedb có thể chạy khá lâu.
  42. 34 Cơ bản về quản trị Linux 3.2.21 slocate Trên nhiều bản phân phối Linux, câu lệnh locate được thay thế bởi slocate. Thường có một liên kết tượng trưng đến "locate" vì thế bạn không cần nhớ là có gì. slocate được hiểu là "secure locate" - locate an toàn. Nó ghi thông tin quyền trong cơ sở dữ liệu vì thế người sử dụng bình thường không thể nhìn vào thư mục mà họ không có quyền đọc. Thông tin sử dụng cho slocate là giống với cho locate, mặc dù dữ liệu ra có thể khác phụ thuộc vào người dùng chạy câu lệnh. 3.3 Quản lý tiến trình 3.3.1 Khởi động xeyes Để học về quản lý tiến trình, đầu tiên chúng ta cần khởi động một chương trình. Cần chắc là X đang chạy và thực hiện câu lệnh sau: $ xeyes -center red Bạn sẽ thấy một cửa sổ xeyes hiện lên, và cầu mắt đỏ nhìn theo trỏ chuột quanh màn hình. Đồng thời không còn dấu nhắc trong thiết bị đầu cuối. 3.3.2 Dừng một tiến trình Để lấy lại dấu nhắc, cần gõ Control-C (thường viết là Ctrl-C hay C):ˆ ^C $ Lấy lại dấu nhắc bash mới, nhưng cửa sổ xeyes biết mất. Trên thực tế, tiến trình bị diệt. Thay vì diệt với Control-C, chỉ dừng nó với Control-Z: $ xeyes -center red ^Z [1]+ Stopped xeyes -center red $ Lần này bạn lấy lại dấu nhắc bash mới, và cửa sổ xeyes vẫn còn. Nếu bạn thử một chút với nó, bạn sẽ thấy cầu mắt không cử động. Nếu cửa sổ xeyes bị che khuất bởi cửa sổ khác và sau đó bỏ che đi, thì sẽ không còn thấy đôi mắt. Tiến trình không làm bất kì cái gì. Trên thực tế, nó bị "dừng" ("Stopped").
  43. 3.3 Quản lý tiến trình 35 3.3.3 fg và bg Để một tiến trình được "khai thông" ("un-stopped") và chạy trở lại, có thể đưa nó ra mặt trước (foreground) với fg gắn trong bash: $ fg xeyes -center red $ Bây giờ tiếp tục tiến trình trong nền sau (background) với bg gắn trong bash: $ bg [1]+ xeyes -center red & $ Tuyệt! Tiến trình xeyes tiếp tục chạy trong nền sau, và chúng ta có một dấu nhắc bash mới để làm việc. 3.3.4 Sử dụng "&" Nếu muốn chạy xeyes trong nền sau ngay từ đầu (thay vì sử dụng Control-Z và bg), chỉ cần thêm ký hiệu "&" và cuối dòng lệnh xeyes: $ xeyes -center blue & [2] 16224 3.3.5 Nhiều tiến trình nền sau Bây giờ có cả xeyes đỏ và xanh da trời chạy trong nền sau. Có thể liệt kê các công việc này với jobs gắn trong bash: $ jobs -l [1]- 16217 Running xeyes -center red & [2]+ 16224 Running xeyes -center blue & Số trong cột bên trái là số của công việc mà bash định cho chúng khi vừa mới chạy. Công việc thứ 2 có một + (cộng) để chỉ nó là "công việc hiện thời", mà nếu gõ fb sẽ đưa nó ra mặt trước. Có thể đưa một công việc ra nền trước nếu chỉ rõ số của nó; ví dụ, fg 1 sẽ đưa xeyes đỏ ra nền trước. Cột tiếp theo là id của tiến trình hay pid, bao gồm trong danh sách của tùy chọn -l. Cuối cùng cả hai công việc hiện thời "đang chạy" ("Running"), và dòng lệnh của chúng liệt kê ở bên phải.
  44. 36 Cơ bản về quản trị Linux 3.3.6 Giới thiệu tín hiệu Để diệt, dừng hay tiếp tục tiến trình, Linux sử dụng một hình thức thông tin đặc biệt, gọi là "tín hiệu" ("signal"). Bằng việc gửi tín hiệu tới một tiến trình, gạn có thể kết thúc, dừng, hay làm những thứ khác. Đây là những gì xảy ra khi gõ Control-C, Control-Z, hay sử dụng bg, fg – sử dụng bash để gửi tín hiệu riêng tới tiến trình. Những tín hiệu này có thể gửi qua câu lệnh kill, chỉ rõ pid (id tiến trình) trên dòng lệnh: $ kill -s SIGSTOP 16224 $ jobs -l [1]- 16217 Running xeyes -center red & [2]+ 16224 Stopped (signal) xeyes -center blue Như bạn đã thấy, kill không nhất định "giết" một tiến trình, mặc dù có thể. Sử dụng tùy chọn "-s", kill có thể gửi bất kỳ tín hiệu nào tới một tiến trình. Linux diệt, dừng, hay tiếp tục tiến trình khi gửi các tín hiệu SIGINT, SIGSTOP, hay SIGCONT tương ứng. Có thể gửi các tín hiệu khác nữa; một vài trong số chúng biên dịch phụ thuộc vào ứng dụng. Có thể biết một tiến trình chấp nhận tín hiệu gì tại phần SIGNALS trang man của nó. 3.3.7 SIGTERM và SIGINT Nếu muốn diệt một tiến trình, có thể có vài tùy chọn. Theo mặc định, kill gửi tín hiệu SIGTERM, mà không đồng nhất với SIGINT hay Control-C, nhưng thường có cùng kết quả: $ kill 16217 $ jobs -l [1]- 16217 Terminated xeyes -center red [2]+ 16224 Stopped (signal) xeyes -center blue 3.3.8 "Diệt tận gốc" Tiến trình có thể lờ đi cả SIGTERM và SIGINT, hoặc một trong chúng hoặc chúng đã dừng, hoặc ở vào "thế bí". Trong những trường hợp này cần giải pháp mạnh, tín hiệu SIGKILL. Một tiến trình không thể lờ đi SIGKILL: $ kill 16224 $ jobs -l [2]+ 16224 Stopped (signal) xeyes -center blue $ kill -s SIGKILL \$ jobs -l [2]+ 16224 Interrupt xeyes -center blue
  45. 3.3 Quản lý tiến trình 37 3.3.9 nohup Thiết bị đầu cuối mà từ đó chạy một công việc gọi là thiết bị đầu cuối điều khiển. Một số vỏ shell sẽ gửi tín hiệu SIGHUP tới các công việc nền sau khi bạn đăng xuất2, khiến chúng ngừng hoạt động. Để bảo vệ tiến trình khỏi hành động này, sử dụng nohup khi khởi động: $ nohup make & $ exit 3.3.10 Sử dụng ps liệt kê tiến trình Câu lệnh jobs vừa dùng chỉ liệt kê tiến trình khởi động từ bash hiện thời. Để xem tất cả tiến trình trên hệ thống, sử dụng ps với tùy chọn a và x cùng nhau: $ ps ax PID TTY STAT TIME COMMAND 1? S 0:04 init [3] 2? SW 0:11 [keventd] 3? SWN 0:13 [ksoftirqd_CPU0] 4? SW 2:33 [kswapd] 5? SW 0:00 [bdflush] Chỉ liệt kê vài cái đầu tiên vì thường là một danh sách rất dài. Danh sách cho bạn một "ảnh chụp nhanh" những gì mà máy đang làm, nhưng có rất nhiều thông tin để phân tích. Nếu bỏ qua ax, sẽ chỉ thấy tiến trình mà bạn sở hữu, và có một thiết bị đầu cuối điều khiển. Câu lệnh ps x sẽ cho thấy tất cả tiến trình của bạn, dù có hay không thiết bị đầu cuối điều khiển. Nếu sử dụng ps a, sẽ nhận một sách tiến trình của tất cả người dùng mà gắn tới một thiết bị đầu cuối. 3.3.11 Hiển thị cây và rừng Có thể liệt kê thông tin khác về từng tiến trình. Tùy chọn forest cho phép dễ dàng thấy hệ thống cấp bậc, mà cho biết quan hệ giữa các tiến trình. Khi một tiến trình chạy một tiến trình mới, tiến trình mới gọi là "con". Trong danh sách forest, "bố mẹ" xuất hiện bên trái, và "con" như một nhánh cây ở bên phải $ ps x forest PID TTY STAT TIME COMMAND 927 pts/1 S 0:00 bash 6690 pts/1 S 0:00 \_ bash 26909 pts/1 R 0:00 \_ ps x forest 19930 pts/4 S 0:01 bash 25740 pts/4 S 0:04 \_ vi processes.txt 2người dịch: ví dụ xterm
  46. 38 Cơ bản về quản trị Linux 3.3.12 Tùy chọn "u" và "l" Tùy chọn "u" hay "l" có thể thêm vào bất kỳ kết hợp nào với "a" và "x" để bao hàm thông tin về từng tiến trình: $ ps au USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND agriffis 403 0.0 0.0 2484 72 tty1 S 2001 0:00 -bash chouser 404 0.0 0.0 2508 92 tty2 S 2001 0:00 -bash root 408 0.0 0.0 1308 248 tty6 S 2001 0:00 /sbin/agetty 3 agriffis 434 0.0 0.0 1008 4 tty1 S 2001 0:00 /bin/sh /usr/X chouser 927 0.0 0.0 2540 96 pts/1 S 2001 0:00 bash $ ps al F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 100 1001 403 1 9 0 2484 72 wait4 S tty1 0:00 -bash 100 1000 404 1 9 0 2508 92 wait4 S tty2 0:00 -bash 000 0 408 1 9 0 1308 248 read_c S tty6 0:00 /sbin/ag 000 1001 434 403 9 0 1008 4 wait4 S tty1 0:00 /bin/sh 000 1000 927 652 9 0 2540 96 wait4 S pts/1 0:00 bash 3.3.13 Sử dụng "top" Nếu chạy ps vài lần để xem có gì thay đổi, thì cái bạn cần có thể là top. top hiển thị một danh sách tiến trình mà được cập nhật liên tục, cùng với một vài thông tin tóm tắt có ích: $ top 10:02pm up 19 days, 6:24, 8 users, load average: 0.04, 0.05, 0.00 75 processes: 74 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 1.3\% user, 2.5\% system, 0.0\% nice, 96.0\% idle Mem: 256020K av, 226580K used, 29440K free, 0K shrd, 3804K buff Swap: 136544K av, 80256K used, 56288K free 101760K cached PID USER PRI NI SIZE RSS SHARE STAT LIB \%CPU \%MEM TIME COMMAND 628 root 16 0 213M 31M 2304 S 0 1.9 12.5 91:43 X 26934 chouser 17 0 1272 1272 1076 R 0 1.1 0.4 0:00 top 652 chouser 11 0 12016 8840 1604 S 0 0.5 3.4 3:52 gnome-termin 641 chouser 9 0 2936 2808 1416 S 0 0.1 1.0 2:13 sawfish 3.3.14 nice Mỗi tiến trình có một thiết lập quyền ưu tiên mà Linux dùng để xác định chia sẻ bao nhiêu thời gian bộ xử lý trung tâm (CPU). Có thể đặt quyền ưu tiên của một tiến trình bằng chạy nó với câu lệnh nice: $ nice -n 10 oggenc /tmp/song.wav Vì thiết lập quyền ưu tiên gọi là nice, nên dễ nhớ rằng một giá trị cao hơn sẽ tốt (nice) cho các tiến trình khác, cho phép chúng quyền ưu tiên tới CPU. Theo mặc định, các tiến trình bắt đầu với giá trị 0, vì thế giá trị 10 bên trên có nghĩa oggenc sẵn lòng dành CPU
  47. 3.4 Gia công văn bản 39 cho các tiến trình khác. Nói chung, điều này có nghĩa rằng oggenc sẽ cho phép các tiến trình khác chạy với tốc độ bình thường, bất chấp oggenc cần CPU như thế nào. Bạn có thể thấy cấp bậc nice này dưới cột NI trong danh sách ps và top ở trên. 3.3.15 renice Câu lệnh nice chỉ có thể thay đổi quyền ưu tiên của một tiến trình khi bắt đầu chạy. Nếu muốn thay đổi thiết lập nice của một tiến trình đang chạy, dùng renice: $ ps l 641 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 000 1000 641 1 9 0 5876 2808 do_sel S ? 2:14 sawfish $ renice 10 641 641: old priority 0, new priority 10 $ ps l 641 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 000 1000 641 1 9 10 5876 2808 do_sel S ? 2:14 sawfish 3.4 Gia công văn bản 3.4.1 Ôn lại chuyển hướng Trong phần đầu của sêri sách hướng dẫn này, chúng ta đã xem một ví dụ sử dụng > để chuyển hướng dữ liệu ra của một câu lệnh vào một tệp, giống như sau: $ echo "firstfile" > copyme Ngoài việc chuyển dữ liệu ra vào một tệp, chúng ta có thể lợi dụng một tính năng mạng của vỏ shell, gọi là ống (pipe). Sử dụng ống, có thể truyền đầu ra của một câu lệnh tới đầu vào của câu lệnh khác. Xem xét ví dụ sau: $ echo "hi there" | wc 1 2 9 Ký tự | dùng để kết nối đầu ra của câu lệnh bên trái tới đầu vào của câu lệnh bên phải. Trong ví dụ trên, câu lệnh echo in ra dòng hi there với một ký tự xuống dòng. Dữ liệu ra đó thông thường xuất hiện trên thiết bị đầu cuối, nhưng ống chuyển nó vào câu lệnh wc, mà hiển thị số dòng, số từ, và số ký tự trong đầu vào của nó. 3.4.2 Một ví dụ ống Đây là một ví dụ đơn giản khác: $ ls -s | sort -n
  48. 40 Cơ bản về quản trị Linux Trong trường hợp này, ls -s thường in ra danh sách của thư mục hiện thời trên thiết bị đầu cuối, với kích thước mỗi tệp ở đầu. Nhưng thay vì như thế chúng ta dẫn đầu ra vào sort -n, mà sắp xếp đầu ra theo số. Đây là một cách có ích để tìm tệp tin lớn trong thư mục nhà của bạn! Các ví dụ sau có phức tạp hơn, nhưng chúng cho thấy sức mạnh của việc sử dụng thạo ống. Chúng tôi sẽ sử dụng một vài câu lệnh mà chưa đề cập đến, nhưng đừng để nó làm bạn chậm lại. Tập trung chú ý hiểu cách ống làm việc, bạn có thể dùng chúng trong tác vụ Linux hàng ngày. 3.4.3 Ống giải nén Thông thường để giải nén và bung ra một tệp, có thể làm như sau: $ bzip2 -d linux-2.4.16.tar.bz2 $ tar xvf linux-2.4.16.tar Mặt kém của phương pháp này là đòi hỏi phải tạo ra một tệp tin không bị nén trên đĩa. Vì tar có khả năng đọc trực tiếp từ đầu vào của nó (thay vì chỉ ra một tệp), ta có thể cho ra một kết quả tương tự sử dụng ống: $ bzip2 -dc linux-2.4.16.tar.bz2 | tar xvf - Ô hô! "Quả bóng" nén đã được bung ra mà không cần thiết một tệp tin trung gian. 3.4.4 Một ống dài hơn Đây là một ví dụ khác: $ cat myfile.txt | sort | uniq | wc -l Chúng ta dùng cat để cung cấp nội dung của myfile.txt cho câu lệnh sort. Khi sort nhận được đầu vào, nó sắp xếp một dòng vào theo thứ tự bảng chữ cái, và gửi đầu ra tới uniq. uniq xóa bỏ mọi dòng trùng nhau (nhân tiện, nó yêu cầu đầu vào phải được sắp xếp) gửi dữ liệu ra đã lọc tới wc -l. Chúng ta đã thấy câu lệnh wc ở trên, nhưng không có tùy chọn nào. Khi đưa tùy chọn -l nó chỉ in ra số dòng của đầu vào, thay vì in cả số từ và ký tự. Bạn sẽ thấy rằng ống này sẽ in ra số các dòng "có một không hai" (không có bản sao) trong một tệp văn bản. Thử tạo ra vài tệp thử nghiệm với trình soạn thảo ưa thích và dùng ống này để xem kết quả thu được.
  49. 3.4 Gia công văn bản 41 3.4.5 Gió lốc gia công văn bản bắt đầu Bây giờ chúng ta bắt tay vào cuộc tham quan gió lốc các câu lệnh gia công văn bản Linux cơ bản. Vì chúng tôi đề cập rất nhiều vấn đề trong cuốn hướng dẫn này, nên không có đủ chỗ để đưa ví dụ cho mọi câu lệnh. Thay vào đó, khuyến khích đọc trang man của của chúng (ví dụ, bằng gõ man echo) học câu lệnh và các tùy chọn làm việc như thế nào bằng cách thử với từng cái. Như đã thành luật, các câu lệnh này in kết quả của bất kỳ gia công văn bản nào ra thiết bị đầu cuối mà không thay đổi tệp tin. Sau khi kết thúc cuộc du ngoạn này, chúng ta sẽ nhìn gần hơn về chuyển hướng đầu ra và đầu vào. Vâng, có một đốm sáng ở cuối đường ngầm :) echo echo in argumen ra thiết bị đầu cuối. Sử dụng tùy chọn -e nếu bạn muốn gắn chuỗi thoát gạch ngược; ví dụ echo -e "foo$\backslash$nfoo" sẽ in foo, sau đó là một dòng mới, và foo nữa. Sử dụng tùy chọn -n để echo bỏ đi dấu dòng mới mà thêm vào đầu ra theo mặc định.3 3.4.6 cat, sort, và uniq cat cat in nội dung của tệp tin như argumen ra thiết bị đầu cuối. Có ích khi là câu lệnh đầu tiên của ống, ví dụ, +cat foo.txt \ blah+| sort sort sẽ in ra nội dung của tệp tin theo thứ tự bảng chữ cái. Tất nhiên, sort chấp nhận đầu vào từ ống. Gõ man sort để tự làm quen với tùy chọn điều khiển sự sắp xếp uniq uniq lấy một tệp tin hoặc dòng dữ liệu đã-sắp-xếp (qua ống) và xóa bỏ những dòng lặp lại. 3.4.7 wc, head, và tail wc wc in ra số dòng, từ, và byte trong một tệp tin hay trong dòng dữ liệu vào (từ một ống). Gõ man wc để biết cách chính quy dữ liệu đếm được hiển thị. head head in ra mười dòng đầu tiên của một tệp tin hay dòng dữ liệu. Sử dụng tùy chọn -n để chỉ rõ bao nhiêu dòng sẽ hiển thị. tail tail in ra mười dòng cuối cùng của một tệp tin hay dòng dữ liệu. Sử dụng tùy chọn -n để chỉ rõ bao nhiêu dòng sẽ hiển thị. 3người dịch: thử echo chao | wc -c và echo -n chao | wc -c sẽ thấy rõ tác dụng của tùy chọn -n
  50. 42 Cơ bản về quản trị Linux 3.4.8 tac, expand, và unexpand tac tac giống như cat, nhưng in tất cả mọi dòng theo thứ tự ngược lại; nói cách khác, dòng cuối cùng được in đầu tiên.4 expand expand biến đổi tab thành khoảng trắng. Dùng tùy chọn -t để chỉ rõ số ký tự của tab (tapstop) unexpand unexpand biến bổi khoảng trắng thành tab. Dùng tùy chọn -t để chỉ rõ số ký tự của tab (tapstop) 3.4.9 cut, nl, và pr cut cut sử dụng để trích ra một vùng ký tự giới hạn từ từng dòng của một tệp tin hay dòng dữ liệu vào. nl nl thêm số thứ tự của dòng vào đầu ra. Có ích cho in ấn. pr pr dùng để chia tệp thành nhiều trang của đầu ra; thường dùng cho in. 3.4.10 tr, awk, và sed tr tr là công cụ chuyển đổi ký tự; dùng để chuyển đổi ký tự nào đó trong đầu vào thành ký tự khác trong đầu ra. sed sed là trình soạn thảo định hướng dòng (stream-oriented) mạnh. Có thể học thêm về sed trong các bài báo sau của IBM developerWorks: Sed qua ví dụ, Phần 1 Sed qua ví dụ, Phần 2 Sed qua ví dụ, Phần 3 Nếu bạn dự định trả thi LPI, bạn cần đọc hai bài báo đầu tiên của sêri này. awk awk là ngôn ngữ gia công văn bản định hướng dòng (line-oriented). Có thể học thêm về awk trong những bài báo sau của IBM developerWorks: Awk qua ví dụ, Phần 1 Awk qua ví dụ, Phần 2 Awk qua ví dụ, Phần 3 4người dịch: để ý thứ tự chữ cái trong hai từ cat và tac
  51. 3.4 Gia công văn bản 43 3.4.11 od, split, và fmt od od được chỉ định thay đổi đầu vào thành dạng hệ tám (octal) hay mười sáu (hex). split split lá câu lệnh dùng để chia một tệp tin lớn thành nhiều tệp tin nhỏ hơn. fmt fmt sẽ định dạng lại các đoạn văn để việc chuyển dòng được thực hiện ở lể trang. Ngày nay không còn hữu dụng vì khả năng này đã được đưa vào hầu hết các trình soạn thảo, nhưng vẫn nên biết. 3.4.12 Paste, join, và tee paste paste dùng hai hay nhiều tệp tin như là đầu vào, nối từng dòng liên tiếp từ các tệp đầu vào, và in ra các dòng kết quả. Có ích để tạo bảng hay cột văn bản. join join tương tự paste, nhưng dùng một trường5, field, (theo mặc định là trường đầu tiên) trong mỗi dòng đầu vào để nối dòng. tee tee sẽ in đầu ra tới cả tệp tin và màn hình. Điều này có lợi khi bạn muốn tạo log, và đồng thời muốn xem nó trên màn hình. 3.4.13 Gió lốc kết thúc! Chuyển hướng Tương tự như dùng > trên dòng lệnh bash, bạn có thể dùng < để đưa một tệp tin vào một câu lệnh. Với rất nhiều câu lệnh, bạn có thể đơn giản là chỉ rõ tên tệp tin trên dòng lệnh, tuy nhiên một số câu lệnh chỉ làm việc từ đầu vào tiêu chuẩn (standard input). bash và các vỏ shell khác hỗ trợ khái niệm "tệp tin đây". Điều này cho phép bạn chỉ rõ đầu vào cho một câu lệnh, rồi kết thúc câu lệnh với một giá trị nào đó. Ví dụ là cách minh họa tốt nhất: $ sort <<END apple cranberry banana END apple banana cranberry Trong ví dụ trên, ta đã gõ các từ apple, cranberry và banana, theo sau bởi "END" để thông báo kết thúc việc nhập vào. Chương trình sort sau đó trả lại những từ đó trong thứ tự bảng chữ cái. 5trường thường là cụm ký tự mà kết thúc bởi dấu trắng
  52. 44 Cơ bản về quản trị Linux 3.4.14 Sử dụng » Có thể bạn cho rằng >> có gì đó giống với . Ví dụ: $ echo Hi > myfile $ echo there. > myfile $ cat myfile there. A lê hấp! Chúng ta để mất phần "Hi"! Thứ mà chúng ta muốn như sau: $ echo Hi > myfile $ echo there. >> myfile $ cat myfile Hi there. Đã tốt hơn rất nhiều! 3.5 Môđun nhân 3.5.1 Làm quen với "uname" Câu lệnh uname cho biết nhiều thông tin thú vị về hệ thống. Đây là cái thu được trên trạm làm việc của tôi khi gõ "uname -a" mà nói "uname" in ra tất cả thông tin của nó luôn một lần: $ uname -a Linux inventor 2.4.20-gaming-r1 #1 Fri Apr 11 18:33:35 MDT 2003 i686 AMD Athlon(tm) XP 2 3.5.2 Thêm về đầu ra uname Bây giờ, hãy xem thông tin mà "uname" cung cấp, ở dạng bảng: info. option arg example kernel name -s "Linux" hostname -n "inventor" kernel release -r "2.4.20-gaming-r1" kernel version -v "#1 Fri Apr 11 18:33:35 MDT 2003" machine -m "i686" processor -p "AMD Athlon(tm) XP 2100+" hardware platform -i "AuthenticAMD" operating system -o "GNU/Linux" Thật là hấp dẫn! Câu lệnh "uname -a" của bạn in ra gì?
  53. 3.5 Môđun nhân 45 3.5.3 Bản phát hành nhân Đây là một mẹo kỳ diệu. Đầu tiên, gõ "uname -r" để uname in ra bản phát hành của nhân Linux mà đang chạy. Bây giờ, xem trong thư mục /lib/modules và a lê hấp! Đánh cuộc là bạn sẽ tìm thấy một thư mục với tên như vậy! OK, không quá kỳ diệu, nhưng bây giờ là thời điểm tốt để nói về sự quan trọng của các thư mục trong /lib/modules và giải thích môđun nhân là gì. 3.5.4 Nhân Nhân là trái tim của Linux – đó là mẩu mã (code) mà truy cập thẳng tới phần cứng và hỗ trợ một giao diện chung để các chương trình cũ có thể thực thi được. Nhờ có nhân, trình soạn thảo của bạn không cần quan tâm viết tới một ổ đĩa SCSI hay IDE hay thậm chí là một đĩa RAM. Nó chỉ ghi tới một hệ thống tập tin, và nhân lo phần còn lại. 3.5.5 Giới thiệu môđun nhân Vậy, môđun nhân là gì? Chúng là những phần của nhân mà ghi ở dạng đặc biệt trên ổ đĩa. Trên câu lệnh của bạn, chúng có thể được nap vào nhân đang chạy và cung cấp những tính năng bổ trợ. Vì môđun nhân được nạp theo nhu cầu, có thể tạo một nhân hỗ trợ nhiều tính năng bổ trợ mà thông thường không muốn có. Nhưng một khi đã quen, môđun nhân rất dễ sử dụng và có thể nạp, thường là tự động, để hỗ trợ hệ thống tập tin hay thiết bị phần cứng mà ít khi sử dụng. 3.5.6 Bản tóm tắt môđun nhân Nói tóm lại, môđun nhân cho phép thêm vào nhân đang chạy một số khả năng dựa trên cơ sở nhu cầu. Không có môđun nhân, phải biên dịch một nhân mới và khởi động lại để hỗ trợ một cái gì đó mới. 3.5.7 lsmod Để xem môđun đã được nạp, sử dụng câu lệnh "lsmod": # lsmod Module Size Used by Tainted: PF vmnet 20520 5 vmmon 22484 11 nvidia 1547648 10 mousedev 3860 2 hid 16772 0 (unused) usbmouse 1848 0 (unused) input 3136 0 [mousedev hid usbmouse] usb-ohci 15976 0 (unused) ehci-hcd 13288 0 (unused) emu10k1 64264 2
  54. 46 Cơ bản về quản trị Linux ac97_codec 9000 0 [emu10k1] sound 51508 0 [emu10k1] usbcore 55168 1 [hid usbmouse usb-ohci ehci-hcd] 3.5.8 Liệt kê môđun Như bạn có thể thấy, hệ thống của tôi có vài môđun được nạp. Môđun vmnet và vmmon cung cấp chức năng cần thiết cho chương trình VMWare, mà cho phép chạy một máy tính ảo (virtual PC). Môđun "nvidia" lấy từ NVIDIA corporation và cho phép sử dụng cạc màn hình 3D hiệu suất cao dưới Linux mà tận dụng hết tính năng của nó. Sau đó là chuỗi môđun dùng để hỗ trợ thiết bị vào USB: "mousedev", "hid", "usbmouse", "input", "usb-ohci", ehci-hcd" và "usbcore". Thường cấu hình nhân để hỗ trợ USB ở dạng môđun. Vì sao? Vì thiết bị USB là "cắm và chạy". Nếu hỗ trợ USB trong môđun, thì có thể mua một thiết bị USB mới, cắm vào và hệ thống tự động nạp môđun thích hợp để có thể dùng thiết bị đó. Đây là cách thuận tiện. 3.5.9 Môđun third-party Ba môđun "emu10k1", "ac97_codec" và "sound" hỗ trợ cạc âm thanh SoundBlaster Audigy. Cần chú ý rằng một vài môđun nhân lấy từ mã nguồn nhân. Ví dụ, tất cả môđun USD đã nói đến đều biên dịch từ mã nguồn nhân Linux. Tuy nhiên, các môđun nvidia, emu10k1 và môđun VMWare lấy từ những nguồn khác. Đây lại là một lợi ích chính khác của môđun nhân - cho phép "công ty thứ ba" cung cấp chức năng cần thiết cho nhân và cho phép những chức năng này "gắn vào" nhân đang chạy. Khởi động lại là không cần thiết. 3.5.10 depmod Trong thư mục /lib/modules/2.4.20-gaming-r1/ có một số tệp tin mà tên bắt đầu với "mod- ules.": $ ls /lib/modules/2.4.20-gaming-r1/modules.* /lib/modules/2.4.20-gaming-r1/modules.dep /lib/modules/2.4.20-gaming-r1/modules.generic_string /lib/modules/2.4.20-gaming-r1/modules.ieee1394map /lib/modules/2.4.20-gaming-r1/modules.isapnpmap /lib/modules/2.4.20-gaming-r1/modules.parportmap /lib/modules/2.4.20-gaming-r1/modules.pcimap /lib/modules/2.4.20-gaming-r1/modules.pnpbiosmap /lib/modules/2.4.20-gaming-r1/modules.usbmap Những tệp tin này chứa nhiều thông tin về sự phụ thuộc. Trong đó có thông tin về sự phụ thuộc của môđun - một vài môđun chỉ nạp khi các môđun khác đã được nạp. 3.5.11 Làm thế nào để lấy môđun Một vài môđun nhân được thiết kế để làm việc với thiết bị phần cứng riêng, ví dụ môđun "emu10k1" là cho cạc SoundBlaster Audigy. Đối với loại môđun này, các tệp tin môđun
  55. 3.5 Môđun nhân 47 đồng thời ghi PCI ID6 và các dấu nhận dạng tương tự của thiết bị phần cứng mà chúng hỗ trợ. Thông tin này có thể sử dụng bởi một vài thứ như script cho việc cắm nóng ("hotplug"), mà sẽ xem đến ở các cuốn hướng dẫn tiếp theo, để tự động nhận ra và tự động nạp môđun thích hợp để hỗ trợ phần cứng đó. 3.5.12 Sử dụng depmod Nếu bạn đã cài thêm một môđun mới, thông tin về sự phụ thuộc trở thành lỗi thời. Để cập nhật, gõ "depmod -a". depmod sẽ quét tất cả môđun trong các thư mục của /lib/modules và làm mới thông tin về sự phụ thuộc. Nó quét tệp tin môđun và tìm cái gọi là "biểu tượng" ("symbols") ở trong các môđun đó: # depmod -a 3.5.13 Định vị môđun nhân Vậy, môđun nhân nhìn như thế nào? Với nhân 2.4, chúng thường là những tệp tin trong /lib/modules mà kết thúc với ".o". Để xem tất cả môđun có trong /lib/modules, gõ: # find /lib/modules -name ’*.o’ /lib/modules/2.4.20-gaming-r1/misc/vmmon.o /lib/modules/2.4.20-gaming-r1/misc/vmnet.o /lib/modules/2.4.20-gaming-r1/video/nvidia.o /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o /lib/modules/2.4.20-gaming-r1/kernel/fs/vfat/vfat.o /lib/modules/2.4.20-gaming-r1/kernel/fs/minix/minix.o [listing "snipped" for brevity] 3.5.14 insmod và modprobe Vậy, làm thế nào để nạp môđun vào nhân đang chạy? Cách thứ nhất là sử dụng câu lệnh "insmod" và đưa đầy đủ đường dẫn tới môđun muốn nạp: # insmod /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o # lsmod | grep fat fat 29272 0 (unused) Tuy nhiên, thường dùng câu lệnh "modprobe" để nạp môđun. Một mặt tốt của "mod- probe" là nó tự động nạp các môđun lệ thuộc. Đồng thời, không cần phải chỉ rõ đường dẫn tới môđun muốn nạp, và không phải chỉ rõ đuôi ".o" 6identification
  56. 48 Cơ bản về quản trị Linux 3.5.15 Thực thi rmmod và modprobe Hãy thử huỷ nạp môđun "fat.o" và nạp lại dùng "modprobe": # rmmod fat # lsmod | grep fat # modprobe fat # lsmod | grep fat fat 29272 0 (unused) Như bạn thấy, câu lệnh "rmmod" làm việc tương tự như modprobe, nhưng có tác dụng ngược lại, nó hủy nạp môđun mà bạn chỉ ra. 3.5.16 Túi khôn: modinfo và modules.conf Có thể dùng câu lệnh "modinfo" để biết nhiều điều thú vị về môđun ưa thích: # modinfo fat filename: /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o description: author: license: "GPL" Và đặc biệt chú ý đến tệp tin /etc/modules.conf. Tệp tin này chứa thông tin cấu hình cho modprob. Tệp tin cho phép tinh chỉnh hoạt động của modprobe, nói modprobe nạp môđun trước/sau khi nạp những môđun khác, chạy script trước/sau khi nạp môđun, và nhiều nữa. 3.5.17 modules.conf Cú pháp và chức năng của modules.conf khá phức tạp. Chúng ta sẽ không đi vào cú pháp ngay bây giờ (gõ man modules.conf để xem chi tiết), nhưng đây là một vài điều bạn *nên* biết về tệp tin này. Nhiều bản phân phối tạo tệp tin này một cách tự động từ các tệp tin trong thư mục khác, như /etc/modules.d/. Ví dụ, Gentoo Linux có thư mục /etc/modules.d/. Nếu chạy câu lệnh update-modules, thì tất cả các tệp tin trong đó sẽ được kết nối vào nhau và cho ra /etc/modules.conf mới. Vì thế, thay đổi tệp tin trong /etc/modules.d/ và chạy update-modules nếu bạn dùng Gentoo. Nếu bạn sử dụng Debian, các bước sẽ tương tự, trừ thư mục là /etc/modutils. 3.6 Tổng kết và các nguồn tham khảo 3.6.1 Tổng kết Xin chúc mừng: bạn tới điểm cuối cuốn hướng dẫn quản trị Linux cơ sở của chúng tôi! Tôi hy vọng nó giúp bạn nắm chắc kiến thức Linux cơ bản. Cuốn hướng dẫn tiếp theo sẽ đề cập
  57. 3.6 Tổng kết và các nguồn tham khảo 49 quản trị nâng cao, trong đó chúng tôi đề cập các chủ đề như quyền truy cập, và mô hình quyền sở hữu, quản lý tài khoản người dùng, tạo và gắn kết hệ thống tập tin, và nhiều nữa. Và nhớ, tiếp tục sêri sách hướng dẫn, bạn sẽ sớm chuẩn bị để đạt được chứng chỉ LPIC cấp bậc I từ Linux Professional Institude. 3.6.2 Tham khảo Đề cập đến chứng chỉ LPIC, nếu đây là cái bạn quan tâm, thì chúng tôi khuyên bạn học các nguồn tham khảo sau, mà đã được lựa chọn cẩn thận để bổ sung thêm cho kiến thức trong cuốn hướng dẫn này: Có một số nguồn tham khảo tốt về biểu thức chính quy trên mạng. Đây là một cặp mà chúng tôi tìm thấy: • Biểu thức chính quy - Tài liệu Tra cứu • Biểu thức chính quy - Sự giải thích Ngoài ra cần đọc về FHS tại Trong bài báo nhiều kỳ "Bash qua ví dụ" ("Bash by example") trên developerWorks, Daniel chỉ bạn cách sử dụng cấu trúc lập trình bash để viết script của mình. Chuỗi này (Phần 1 và 2 nói riêng) là sự chuẩn bị tốt cho kỳ thi LPIC bậc 1: • Bash qua ví dụ, Phần 1: Lập trình cơ sở trong hệ vỏ Bourne-again shell • Bash qua ví dụ, Phần 2: Lập trình bash cơ sở nâng cao • Bash qua ví dụ, Phần 3: Khám phá hệ thống ebuild Có thể học thêm về sed trong các bài báo sau của IBM developerWorks: Sed qua ví dụ, Phần 1 Sed qua ví dụ, Phần 2 Sed qua ví dụ, Phần 3 Nếu bạn dự định trả thi LPI, bạn cần đọc hai bài báo đầu tiên của sêri này. Có thể học thêm về awk trong những bài báo sau của IBM developerWorks: Awk qua ví dụ, Phần 1 Awk qua ví dụ, Phần 2 Awk qua ví dụ, Phần 3 Chúng tôi xin khuyến khích xem Những câu hỏi chuyên môn thường đặt cho người dùng Linux (Technical FAQ for Linux users), danh sách 50 trang đi sâu về những câu hỏi Linux thường đặt, với các câu trả lời chi tiết. Bản thân FAQ này ở dạng PDF (Acrobat). Nếu bạn không quen thuộc lắm với trình soạn thảo vi, hãy xem cuốn hướng dẫn Vi - hướng dẫn học qua phương pháp túi khôn. Cuốn hướng dẫn này khóa mở đầu cấp tốc về trình soạn thảo mạnh này. Coi như đây là tài liệu phải đọc thêm nếu bạn không biết cách sử dụng vi.
  58. 50 Cơ bản về quản trị Linux 3.6.3 Ý kiến độc giả Xin hãy cho chúng tôi biết cuốn hướng dẫn này có giúp ích cho bạn không và chúng tôi có thể làm nó tốt hơn như thế nào. Đồng thời, chúng tôi cũng muốn nghe về những chủ đề khác mà bạn có thể muốn xem trong hướng dẫn của developerWorks Để hỏi về nội dung của cuốn hướng dẫn này, liên hệ với các tác giả: • Daniel Robbins, tại drobbins@gentoo.org. • Chris Houser, tại chouser@gentoo.org. • Aron Griffis, tại agriffis@gentoo.org. 3.6.4 Thay cho lời kết Cuốn hướng dẫn này được viết hoàn toàn trên XML, sử dụng chương trình tạo sách hướng dẫn Toot-O-Matic của developerWorks7. Công cụ mã nguồn mở Toot-O-Matic một XSLT stylesheet và vài chức năng XSLT mở rộng biến đổi tệp XML thành các trang HTML, một tệp zip, ảnh tiêu đề JPEG và hai tệp PDF. Khả năng xuất ra cả dạng văn bản và dạng nhị nguyên từ một tệp nguồn đơn cho thấy khả năng và sự linh hoạt của XML. (XML đồng thời tiết kiệm rất nhiều thời gian và sức lực của nhóm chúng tôi). Bạn có thể lấy mã nguồn của công cụ Toot-O-Matic tại Cuốn hướng dẫn Xây dựng hướng dẫn với Toot-O-Matic (Bulding tutorials with the Toot-O-Matic) cho thấy cách sử dụng Toot-O-Matic để tạo hướng dẫn của chính bạn. developerWorks còn làm chủ một diễn đàn dành cho Toot-O-Matic, tại địa chỉ: late?OpenForm&RestrictToCategory=11. Chúng tôi rất muốn biết bạn nghĩ gì về công cụ này. 7 người dịch: bản dịch được viết trên mã TEX sử dụng trình soạn thảo gedit
  59. Chương 4 Quản trị hệ thống Linux
  60. Chương 5 Quản trị hệ thống linux nâng cao 5.1 Hệ thống tập tin, phân vùng, và các thiết bị khối 5.1.1 Giới thiệu về thiết bị khối Trong phần này, chúng ta sẽ xem xét tới cách thức quản lý ổ cưng của Linux, bao gồm hệ thống tập tin, các phân vùng, và các thiết bị khối. Sau khi bạn đã quen với các tác vụ vào ra dữ liệu của ổ cứng cũng như là hệ thống tập tin, chúnh ta sẽ tiến hành quá trình thiết lập phân vùng và hệ thống tập tin trong Linux. Để khởi đầu, phần nhỏ này sẽ giới thiệu tới bạn khái niệm "thiết bị khối". Thiết bị khối được biết đến nhiều nhất trong môi trường Linux có lẽ là thiết bị ổ cứng IDE đầu tiên trong hệ thống. /dev/hda Nếu hệ thống của bạn sử dụng SCSI, khi đó ổ cứng đầu tiên sẽ là /dev/sda 5.1.2 Các lớp trừu tượng Thiết bị khối đem tới cho người dùng một giao diện giao tác với ổ cứng, Các chương trình người dùng có thể sử dụng ổ cứng mà không cần bận tâm tới thiết bị là IDE hay SCSI. Các chương trình này đơn giản chỉ cần đánh địa chỉ thiết bị lưu trữ như là một nhóm các khối liên tục truy cập ngẫu nhiên 512 byte The block devices above represent an abstract interface to the disk. User programs can use these block devices to interact with your disk without worrying about whether your drivers are IDE, SCSI, or something else. The program can simply address the storage on the disk as a bunch of contiguous, randomly-accessible 512- byte blocks. 5.1.3 Phân vùng Trong môi trường Linux, để xây dựng một hệ thống tập tin, chúng ta sử dụng một lệnh chuyện dụng là mkfs ( thực chất là một họ lệnh mke2fs, mkreiserfs, vv) với tham số đầu vào là một thiết bị khối.
  61. 5.1 Hệ thống tập tin, phân vùng, và các thiết bị khối 53 Mặc dù là về mặt lý thuyết, chúng ta có thể sử dụng thiết bị khối tổng thể (dùng để chỉ toàn bộ ổ cứng) như /dev/hda hoặc /dev/sda để xây dựng một hệ thống tập tin, Tuy nhiên, trong thực tế sử dụng, cách làm này gần như không được dùng. Thay vào đó, Thiết bị khối tổng thể sẽ được chia thành các thiết bị khối nhỏ hơn, dễ quản lý hơn và được gọi là các phân vùng. Phân vùng được tạo ra bằng cách sử dụng công cụ fdisk, fdisk được sử dụng để tạo, sửa chữa bảng phần vùng nằm trên đĩa cứng, Bảng phân vùng này được dùng để xác định các thức chia một thiết bị khối tổng thể thành các phần vùng. 5.1.4 Giới thiệu về công cụ fdisk Chúng ta có thể thao tác với bảng phân vùng ổ cứng bằng các chạy lệnh fdisk với tham sô đầu vào là thiết bị khối tổng thể. Ghi nhớ: ngoài fdisk, trong môi trường linux còn có một số công cụ cho phép chỉnh sửa bảng phân vùng như: cfdisk, parted, partimage. # fdisk /dev/hda hoặc # fdisk /dev/sda Quan trọng: Bạn không nên lưu hoặc thay đổi bảng phân vùng nếu trong một phân vùng có chứa các thông tin quan trọng. Bạn chỉ nên làm khi bạn biết rõ mình đang làm gì 5.1.5 Sử dụng fdisk Sau khi gọi công cụ fdisk, bạn sẽ được chuyển tới một dâu nhắc dòng lệnh như sau: Command (m for help): nhấn ’p’ để in ra cấu hình phân vùng hiện tại của bạn, dưới đây là một ví dụ: Command (m for help): p Disk /dev/hda: 40.0 GB, 40007761920 bytes 255 heads, 63 sectors/track, 4864 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 898 7213153+ 7 HPFS/NTFS /dev/hda2 899 924 208845 83 Linux /dev/hda3 925 1541 4956052+ a9 NetBSD /dev/hda4 1542 4864 26691997+ 5 Extended /dev/hda5 1542 1627 690763+ 82 Linux swap /dev/hda6 1628 2272 5180931 83 Linux /dev/hda7 2273 2688 3341488+ 83 Linux