MỤC LỤC
LỜI NÓI ĐẦU i
TÓM TẮT ĐỒ ÁN ii
ABSTRACT iii
LỜI CẢM ƠN iv
MỤC LỤC v
DANH SÁCH HÌNH VẼ ix
DANH MỤC BẢNG BIỂU xi
THUẬT NGỮ VIẾT TẮT xii
MỞ ĐẦU xiv
CHƯƠNG I. GIỚI THIỆU MẠNG AD-HOC. 1
1.1. Giới thiệu mạng Ad-hoc 1
1.2. Đặc điểm của mạng Ad-hoc 3
1.2.1. Đặc điểm chung của mạng wireless 3
1.2.2. Những ưu điểm của mạng Ad hoc 3
1.3. Sử dụng OLSR để định tuyến trên mạng Ad-hoc. 4
1.3.1. Khái niệm về định tuyến. 4
1.3.2. Định tuyến trên mạng Ad-hoc. 5
1.3.3. Giao thức định tuyến OLSR. 6
1.3.3.1. Giới thiệu về OLSR 6
1.3.3.2. Một số khái niệm cơ bản trong OLSR. 7
1.3.3.3. Nhận xét về giao thức định tuyến OLSR 8
CHƯƠNG 2. FIT-PC SLIM & ARMADILLO 300 10
2.1. Fit-pc Slim 10
2.1.1. Giới thiệu về fit-pc slim 10
2.1.2. Thông số kỹ thuật của fit-pc slim 10
2.1.2.1. Phần cứng 10
2.1.2.2. Phần mềm 12
2.1.2.3. Các thông số đo đạc và điều kiện làm việc 12
2.2. Armadillo 300 13
2.2.1. Giới thiệu về Armadillo 300. 13
2.2.2. Thông số kỹ thuật của Armadillo 300. 13
2.2.2.1. Phần cứng 13
2.2.2.2. Phần mềm 15
2.2.2.3. Môi trường phát triển 15
CHƯƠNG 3. HỆ ĐIỀU HÀNH GENTOO 16
3.1. Giới thiệu về hệ điều hành Gentoo 16
3.2. Sử dụng Gentoo 16
3.2.1. Portage 16
3.2.1.1. Giới thiệu Portage 17
3.2.1.2. Cây portage 17
3.2.1.3. Quản lý phần mềm 18
3.2.2. USE flag 27
3.2.2.1. Giới thiệu USE flag 27
3.2.2.2. Sử dụng USE flag 28
3.2.2.3. USE flag riêng cho mỗi gói 32
3.2.3. Init Script 33
3.2.3.1. Runlevel 33
3.2.3.2. Sử dụng rc-update 37
3.2.3.3. Cấu hình dịch vụ 38
3.2.3.4. Viết Init Script 39
3.2.4. Biến môi trường 44
3.2.4.1. Giới thiệu biến môi trường 44
3.2.4.2. Biến toàn cục 46
3.2.4.3. Biến cục bộ 48
CHƯƠNG 4 . BIÊN DỊCH CHÉO 50
4.1. Giới thiệu biên dịch chéo cho Linux 50
4.2. Các phương pháp biên dịch chéo 51
4.2.1. Phương pháp tạo môi trường phát triển: 51
4.2.2. Phương pháp biên dịch phân tán 52
4.3. Tìm hiểu về biên dịch chéo 53
4.3.1. Các bước của quá trình biên dịch chéo 53
4.3.2. Cấu hình một trình biên dịch chéo 53
4.3.3. Công cụ và thư viện cho một trình biên dịch chéo 54
4.3.4. Các tập tin tiêu đề 56
4.3.5. Thời gian thi hành 57
4.3.6. Xây dựng chéo 59
4.4. DISTCC 60
4.4.1. Giới thiệu về DISTCC 60
4.4.2. Cài đặt và cấu hình Distcc 61
4.4.2.1. Distcc trên Gentoo 61
4.4.2.2. Distcc trên Ubuntu 62
CHƯƠNG 5. TRIỂN KHAI DỰ ÁN VÀ KẾT QUẢ 63
5.1. Triển khai dự án 63
5.1.1. Thiết lập mode Ad-hoc trên fit-pc. 63
5.1.2. Cross compile cho fit-pc. 65
5.1.3. Triển khai dự án truyền video trên mạng Ad-hoc. 70
5.2. Kết quả 82
KẾT LUẬN 83
TÀI LIỆU THAM KHẢO 84
99 trang |
Chia sẻ: lethao | Lượt xem: 2178 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đồ án Nghiên cứu và phát triển nút mạng Ad-Hoc có tính di động cao, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
!!! Error: the mail-mta/postfix package conflicts with another package.
!!! both can't be installed on the same system together.
!!! Please use 'emerge --pretend' to determine blockers.
Ebuild chứa những thông tin cho phép Portage biết những gói phụ thuộc của ebuild đó. Có hai loại phụ thuộc: phụ thuộc khi dựng phần mềm, được khai báo trong DEPEND và phụ thuộc khi sử dụng phần mềm, khai báo trong RDEPEND. Khi một trong những phụ thuộc này đánh dấu một gói hoặc một gói ảo nào đó không tương thích, nó sẽ đánh dấu gói đó là blocked package nếu gói đó đã được cài đặt.
Để sửa lỗi này, ta có thể chọn không cài đặt phần mềm đó, hoặc xóa phần mềm bị block đi. Trong ví dụ trên, ta có thể chọn không cài đặt postfix hoặc xóa ssmtp trước.
Cũng có thể hai gói chưa được cài đặt lại block nhau. Trong trường hợp hiếm hoi này, ta nên tìm hiểu tại sao cần cài đặt cả hai. Hầu hết trường hợp, ta chỉ có thể làm việc với một trong hai gói mà thôi.
Masked Package
Portage cảnh báo về masked package:
!!! all ebuilds that could satisfy "bootsplash" have been masked.
Portage cảnh báo về nguyên nhân của masked package:
!!! possible candidates are:
- gnome-base/gnome-2.8.0_pre1 (masked by: ~x86 keyword)
- lm-sensors/lm-sensors-2.8.7 (masked by: -sparc keyword)
- sys-libs/glibc-2.3.4.20040808 (masked by: -* keyword)
- dev-util/cvsd-1.0.2 (masked by: missing keyword)
- media-video/ati-gatos-4.3.0 (masked by: package.mask)
- sys-libs/glibc-2.3.2-r11 (masked by: profile)
Khi ta muốn cài đặt một gói không sẵn sàng cho hệ thống, ta sẽ nhận được lỗi "masked package". Vì thế nên thử cài đặt một phiên bản khác của ứng dụng nếu có cho hệ thống, hoặc đợi đến khi gói đó có thể sử dụng. Gói bị đánh dấu là masked package có lý do của nó:
~arch keyword nghĩa là ứng dụng chưa được kiểm tra cẩn thận để có thể cho vào nhánh ổn định. Hãy chờ vài ngày hoặc vài tuần và thử lại.
-arch keyword hoặc -* keyword nghĩa là ứng dụng không hoạt động trên kiến trúc của hệ thống.
missing keyword nghĩa là ứng dụng chưa được kiểm tra trên kiến trúc của hệ thống. Hãy yêu cầu architecture porting team kiểm tra gói đó.
package.mask nghĩa là gói bị hỏng, không ổn định hoặc tệ hơn và được đánh dấu đừng-nên-sử-dụng.
profile nghĩa là gói đó không thích hợp với profile của của hệ thống. Ứng dụng đó có thể làm hỏng toàn hệ thống nếu bạn cài đặt nó hoặc đơn giản là nó không tương thích với profile bạn dùng.
Phụ thuộc bị thiếu
Portage cảnh báo thiếu phụ thuộc
emerge: there are no ebuilds to satisfy ">=sys-devel/gcc-3.4.2-r4".
!!! Problem with ebuild sys-devel/gcc-3.4.2-r2
!!! Possibly a DEPEND/*DEPEND problem.
Ứng dụng định cài cần những gói khác không sẵn sàng cho hệ thống. Kiểm tra bugzilla xem có thông báo về vấn đề này chưa. Nếu chưa, hãy đưa lên thông báo. Trừ khi ta đang trộn nhiều nhánh với nhau, điều này không được xảy ra, bởi vậy nó là lỗi.
Tên ebuild nhập nhằng
Portage cảnh báo về nhập nhằng tên ebuild
!!! The short ebuild name "aterm" is ambiguous. Please specify
!!! one of the following fully-qualified ebuild names instead:
dev-libs/aterm
x11-terms/aterm
Ứng dụng ta muốn cài đặt có cùng tên với một gói khác. Cần xác định nhóm ứng dụng của nó luôn. Portage sẽ cho biết những khả năng có thể có để chọn lựa.
Phụ thuộc vòng
Portage cảnh báo về phụ thuộc vòng
!!! Error: circular dependencies:
ebuild / net-print/cups-1.1.15-r2 depends on ebuild / app-text/ghostscript-7.05.3-r1
ebuild / app-text/ghostscript-7.05.3-r1 depends on ebuild / net-print/cups-1.1.15-r2
Hai gói (hoặc nhiều hơn) muốn cài phụ thuộc lẫn nhau và không thể được cài đặt. Điều này thường là lỗi trong cây Portage. Khi đó hãy rsync và thử lại. Cũng có thể kiểm bugzilla xem có thông báo chưa. Nếu chưa, hãy đưa lên thông báo lỗi.
Fetch failed
Portage cảnh báo lấy tập tin gặp lỗi
!!! Fetch failed for sys-libs/ncurses-5.4-r5, continuing...
(...)
!!! Some fetch errors were encountered. Please see above for details.
Portage không thể tải về mã nguồn cần thiết cho ứng dụng của hệ thống và sẽ tiếp tục cài đặt các ứng dụng khác (nếu có thể). Lỗi này thường do mirror chưa được đồng bộ, hoặc vì ebuild trỏ đến một địa chỉ sai. Server chứa mã nguồn có thể bị tắt vì lý do gì đó.
Bảo vệ profile hệ thống
Portage cảnh báo về gói được profile bảo vệ
!!! Trying to unmerge package(s) in system profile. 'sys-apps/portage'
!!! This could be damaging to your system.
Ta đã yêu cầu loại bỏ một gói thuộc những gói cốt lõi của hệ thống. Profile của ta đã chỉ rõ gói này là cần thiết và không được loại khỏi hệ thống.
USE flag
Giới thiệu USE flag
Những ý tưởng đằng sau USE flag
Khi ta cài đặt Gentoo (hoặc bất kỳ bản phân phối nào khác, hoặc thậm chi bất kỳ hệ điều hành nào), những lựa chọn của ta phụ thuộc vào môi trường bạn đang làm việc. Thiết lập cho server khác với thiết lập cho workstation. Máy dùng để chơi game khác với máy để kết xuất cảnh 3D.
Không những chọn những gói bạn muốn cài đặt, ta còn chọn những tính năng muốn gói phần mềm đó hỗ trợ. Nếu không cần OpenGL, tại sao phải cài đặt OpenGL và buộc hỗ trợ OpenGL trong phần mềm của ta? Nếu không dùng KDE, tại sao lại phải biên dịch với hỗ trợ KDE nếu các gói đó có thể hoạt động tốt không cần KDE?
Để giúp người sử dụng có thể quyết định cái gì nên cài/kích hoạt hoặc không nên, gentoo muốn người sử dụng ghi rõ môi trường của họ, theo một cách đơn giản. Điều này sẽ bắt buộc người sử dụng chọn ra những gì họ thật sự muốn, giúp cho Portage, hệ thống quản lý gói tin của chúng tôi, tiến hành một cách dễ dàng hơn nhằm đưa ra những quyết định có ích hơn.
Định nghĩa USE flag
USE flag là một từ khóa xác nhận sự hỗ trợ một tính năng nhất định cùng các thông tin ràng buộc liên quan. Nếu bạn định nghĩa một USE flag, Portage sẽ biết bạn muốn có hỗ trợ tương ứng. Dĩ nhiên nó cũng sẽ thay đổi các thông tin gói phụ thuộc của mỗi gói.
Hãy xem thử ví dụ sau: cờ kde. Nếu không đặt cờ này vào biến USE, mọi gói hỗ trợ KDE tùy chọn sẽ được biên dịch không có hỗ trợ KDE. Mọi gói có thể phụ thuộc vào KDE sẽ được cài đặt mà không cần các thư viện KDE. Nếu bạn định nghĩa cờ kde, những gói này sẽ được biên dịch với hỗ trợ KDE, và các thư viện KDE sẽ được cài đặt vào vì là những gói phụ thuộc của gói định cài đặt.
Bằng cách định nghĩa các cờ, ta sẽ có được hệ thống được cân chỉnh theo ý muốn.
Các loại USE flag:
Có hai loại USE flag: USE flag toàn cục và USE flag cục bộ.
USE flag toàn cục được dùng bởi nhiều gói phần mềm khác nhau trên toàn hệ thống. Đây là những USE flag thông dụng.
USE flag cục bộ chỉ được dùng bởi một gói phần mềm, đại diện cho những quyết định đặc trưng cho gói phần mềm đó.
Danh sách USE flag toàn cục nằm ở trên mạng hoặc nằm trong /usr/portage/profiles/use.desc.
Danh sách các USE flag cục bộ nằm trong /usr/portage/profiles/use.local.desc.
Sử dụng USE flag
Khai báo USE flag bền vững
Như đã đề cập, mọi USE flag được khai báo trong biến USE. Để tiện dụng cho người dùng khi tìm kiếm và chọn USE flag, hệ thống getnoo cung cấp thiết lập USE mặc định. Thiết lập này là tập hợp các USE flag thường được dùng. Thiết lập mặc định nằm trong những tập tin make.defaults của profile của hệ thống của ta.
Hệ thống profile ta dùng là tùy vào symlink /etc/make.profile. Mỗi profile nằm trên profile khác, một profile bao quát hơn. Kết quả cuối cùng là tổng của mọi profile. Profile trên cùng là profile base (/usr/portage/profiles/base).
Biến USE tổng hợp từ make.defaults của profile 2004.3
(Đây là ví dụ tổng hợp các thiết lập trong profile base, default-linux,
default-linux/x86 và default-linux/x86/2004.3)
USE="x86 oss apm arts avi berkdb bitmap-fonts crypt cups encode fortran f77
foomaticdb gdbm gif gpm gtk imlib jpeg kde gnome libg++ libwww mad
mikmod motif mpeg ncurses nls oggvorbis opengl pam pdflib png python qt
quicktime readline sdl spell ssl svga tcpd truetype X xml2 xmms xv zlib"
Như vậy biến này chứa nhiều cờ khác nhau. Không nên thay thế trong make.defaults: mọi thay đổi trong đó sẽ bị xóa mất mỗi khi cập nhật Portage!
Để thay đổi thiết lập mặc định, cần thêm hoặc xóa cờ trong biến USE. Điều này có thể thực hiện ở mức hệ thống bằng cách định nghĩa biến USE trong /etc/make.conf. Trong biến này ta có thể thêm những USE flag riêng , loại bớt những USE flag không muốn. Loại những USE flag bằng cách thêm dấu trừ vào trước tên cờ ("-").
Ví dụ, để loại bỏ hỗ trợ KDE và QT và muốn thêm hỗ trợ LDAP, định nghĩa biến USE trong /etc/make.conf như sau:
USE="-kde -qt ldap"
Khai báo USE flag riêng cho từng gói
Đôi khi ta muốn khai báo USE flag đặc biệt cho riêng một (hoặc một số) gói nhất định chứ không muốn khai báo cho toàn hệ thống. Để thực hiện điều này, cần tạo thư mục /etc/portage (nếu chưa có) và sửa /etc/portage/package.use.
Ví dụ, nếu không muốn hỗ trợ berkdb toàn cục nhưng muốn có hỗ trợ berkdb trong mysql, cần thêm:
dev-db/mysql berkdb
Cũng có thể xác định trực tiếp tắt USE flag cho một ứng dụng nhất định. Ví dụ, nếu không muốn có hỗ trợ java trong PHP:
dev-php/php –java
Khai báo USE flag tạm thời
Đôi khi bạn muốn đặt USE flag chỉ một lần. Thay vì phải sửa /etc/make.conf hai lần (một lần thêm USE flag và một lần xóa các thay đổi), bạn có thể chỉ cần khai báo biến môi trường USE. Nhớ rằng khi bạn emerge lại hoặc cập nhật ứng dụng (hoặc cập nhật trực tiếp hoặc gián tiếp do nó là gói phụ thuộc của gói khác), những thay đổi của bạn sẽ biến mất!
Ví dụ, Cần tạm thời loại bỏ cờ java khi cài đặt mozilla.
# USE="-java" emerge mozilla
USE flag tự động
Sau khi cài đặt một số gói nhất định, một số USE flag sẽ được bật tự động nếu bạn không tắt nó một cách tường minh. Để xem danh sách những gói cung cấp USE flag, hãy xem /etc/make.profile/use.defaults và use.defaults của các profile cha.
gnome gnome-base/gnome
gtk x11-libs/gtk+
qt x11-libs/qt
kde kde-base/kdebase
motif x11-libs/openmotif
Thứ tự ưu tiên
Dĩ nhiên các cách thiết lập USE flag sẽ có độ ưu tiên khac nhau. Bạn không muốn khai báo USE="-java" chỉ để xem java có được đặt với độ ưu tiên cao hay không. Thứ tự ưu tiên của thiết lập USE flag, sắp theo độ ưu tiên là (cái đầu tiên có ưu tiên thấp nhất):
Thiết lập USE mặc định được khai báo trong những tập tin make.defaults của profile của bạn
Thiết lập USE được kế thừa nếu một gói từ use.defaults của profile được cài đặt
Thiết lập USE do người dùng định nghĩa trong /etc/make.conf
Thiết lập USE do người dùng định nghĩa trong /etc/portage/package.use
Thiết lập USE do người dùng định nghĩa bằng biến môi trường
Để xem thiết lập USE cuối cùng được Portage sử dụng, hãy chạy emerge --info. Lệnh này sẽ liệt kê mọi biến liên quan (bao gồm biến USE) được dùng bởi Portage.
# emerge --info
Cập nhật lại toàn bộ hệ thống để sử dụng USE-flag mới
Nếu thay thế vài USE flag và muốn cập nhật lại toàn bộ hệ thống để dùng những USE flag này, hãy dùng tùy chọn --newuse của emerge:
# emerge --update --deep --newuse world
Kế tiếp hãy chạy depclean của Portage để loại bỏ những phụ thuộc theo điều kiện, đã được cài đặt trên hệ thống cũ, nhưng không còn được dùng bởi USE flag mới.
# emerge -p --depclean
Khi depclean hoàn tất, hãy chạy revdep-rebuild để điều chỉnh những ứng dụng được liên kết động với các thư viện đã bị loại bỏ. revdep-rebuild nằm trong gói gentoolkit; đừng quên emerge gói này.
# revdep-rebuild
Khi hoàn tất, hệ thống của bạn sẽ sử dụng những thiết lập USE flag mới.
USE flag riêng cho mỗi gói
Xem các USE flag hiện có
Hãy xem ví dụ về mozilla: những USE flag nào sẽ được dùng? Để biết, chúng ta dùng emerge với tùy chọn --pretend và --verbose:
# emerge --pretend --verbose mozilla
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] net-www/mozilla-1.5-r1 +java +crypt -ipv6 +ssl +ldap
+gnome -debug +mozcalendar -mozaccess -mozxmlterm -moznoirc -moznomail
-moznocompose -moznoxft
emerge không phải là công cụ duy nhất để thực hiện công việc này. Thực ra, một công cụ khác là equery nằm trong gentoolkit được tạo ra để cung cấp thông tin gói. Trước hết hãy cài đặt gentoolkit:
# emerge gentoolkit
Giờ hãy chạy equery với tham số uses để xem những USE flag của một gói nhất định. Ví dụ, với gói gnumeric:
# equery uses gnumeric
[ Colour Code : set unset ]
[ Legend : (U) Col 1 - Current USE flags ]
[ : (I) Col 2 - Installed With USE flags ]
U I [ Found these USE variables in : app-office/gnumeric-1.2.0 ]
- - libgda : Adds GNU Data Access (CORBA wrapper) support for gnumeric
- - gnomedb : unknown
+ + python : Adds support/bindings for the Python language
+ + bonobo : Adds support for gnome-base/bonobo (Gnome CORBA interfaces)
Init Script
Runlevel
Khởi động hệ thống
Khi bạn khởi động hệ thống, bạn sẽ để ý thấy rất nhiều dòng chữ trôi qua. Nếu bạn để ý kỹ hơn, bạn sẽ thấy những dòng này đều giống nhau mỗi lần khởi động hệ thống. Chuỗi những hoạt động này được gọi là chuỗi khởi động (boot sequence) và được định nghĩa cố định.
Trước hết boot loader của bạn sẽ nạp kernel image bạn định nghĩa trong phần cấu hình boot loader vào bộ nhớ. Sau đó nó yêu cầu CPU chạy kernel. Khi kernel được nạp và chạy, nó khởi động những cấu trúc và công việc đặc thù của kernel và khởi động tiến trình init.
Tiến trình này bảo đảm mọi hệ tập tin (định nghĩa trong /etc/fstab) được mount vào hệ thống để có thể dùng. Sau đó nó thực hiện một số script nằm trong /etc/init.d, để khởi động các dịch vụ theo thứ tự, nhằm khởi động toàn bộ hệ thống.
Cuối cùng, khi mọi script đã được thực hiện, init kích hoạt các terminal (trong hầu hết trước hợp, nó chỉ là virtual console, được kích hoạt bởi Alt-F1, Alt-F2, ...) và gắn mỗi terminal với một chương trình đặc biệt tên là agetty. Chương trình này sẽ bảo đảm bạn có thể đăng nhập vào những termminal này thông qua việc chạy login.
Init Script
Giờ init không đơn giản thực hiện các script trong /etc/init.d một cách ngẫu nhiên. Nó thậm chí không chạy mọi script trong /etc/init.d mà chỉ chạy những script được yêu cầu. Nó quyết định cần chạy những script nào bằng cách xem trong /etc/runlevels.
Trước hết, init chạy mọi script trong /etc/init.d có symbolic link bên trong /etc/runlevels/boot. Thông thường các script sẽ được chạy theo thứ tự bảng chữ cái, nhưng vài script có các thông tin script phụ thuộc bên trong, báo cho hệ thống biết cần phải chạy những script nào khác trước khi script này được chạy.
Khi mọi script trong /etc/runlevels/boot đã được chạy, init sẽ tiếp tục chạy các script có symbolic link trong /etc/runlevels/default. Tương tự như trên, các script sẽ được chạy theo thứ tự bảng chữ cái, trừ những script có thông tin phụ thuộc sẽ chạy những script phụ thuộc trước.
Cách init hoạt động
Dĩ nhiên init tự nó không quyết định tất cả. Nó cần tập tin cấu hình để cho biết những hành động nào cần thực hiện. Tập tin đó là /etc/inittab.
Nếu bạn còn nhớ chuỗi khởi động đã được mô tả, bạn sẽ nhớ rằng hành động đầu tiên của init là mount mọi hệ tập tin. Điều này được định nghĩa bởi động sau trong /etc/inittab:
si::sysinit:/sbin/rc sysinit
Dòng này cho init biết rằng nó phải chạy /sbin/rc sysinit để khởi động hệ thống. Script /sbin/rc sẽ đảm trách tiến trình khởi động này, vì thế bạn có thể nói rằng init không thực hiện gì nhiều -- nó chỉ việc giao công việc khởi động hệ thống cho chương trình khác.
init thực hiện mọi script có symbolic link trong /etc/runlevels/boot. Điều đó được mô tả bằng dòng sau:
rc::bootwait:/sbin/rc boot
Một lần nữa, script rc thực hiện những công việc cần thiết. Chú ý rằng tùy chọn cho rc (boot) là tên thư mục con trong /etc/runlevels cần dùng để khởi động.
Giờ init kiểm tra tập tin cấu hình của nó để xem cần chạy runlevel nào kế tiếp. Để quyết định, nó đọc dòng sau từ /etc/inittab:
id:3:initdefault:
Trong trường hợp này (cũng là trường hợp được dùng nhiều nhất), runlevel là 3. Dùng thông tin này, init sẽ kiểm tra xem nó cần chạy những gì trong runlevel 3:
l0:0:wait:/sbin/rc shutdown
l1:S1:wait:/sbin/rc single
l2:2:wait:/sbin/rc nonetwork
l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot
Dòng định nghĩa runlevel 3, một lần nữa lại dùng script rc để khởi động những dịch vụ (bây giờ lại dùng tham số default). Chú ý là tham số của rc cũng là tên thư mục con trong /etc/runlevels.
Khi rc chạy xong, init quyết định cần kích hoạt những virtual console nào và những lệnh gì cần chạy trên mỗi console:
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
Runlevel
Init dùng mô hình đánh số để quyết định runlevel nào cần kích hoạt. Runlevel là một trạng thái của hệ thống và chứa một tập các script (runlevel script hay initscript) cần được thực hiện để vào hoặc thoát một runlevel.
Trong Gentoo, có vài bảy runlevel được định nghĩa: ba runlevel nội bộ, và bốn runlevel do người dùng định nghĩa. Những runlevel nội bộ là sysinit, shutdown và reboot và thực hiện chính xác như tên của chúng: khởi động hệ thống, tắt máy, khởi động lại máy.
Những runlevel do người dùng định nghĩa là những cái đi kèm với thư mục con tương ứng trong /etc/runlevels: boot, default, nonetwork và single. Runlevel boot khởi động mọi dịch vụ cấp hệ thống mà những runlevel khác sử dụng. Ba runlevel còn lại khác nhau ở những dịch vụ được khởi động: default được dùng cho hoạt động hằng ngày, nonetwork được dùng trong trường hợp không cần mạng, và single được dùng khi bạn cần sửa chữa hệ thống.
Sử dụng Init Script
Các script được rc chạy gọi là init script. Mỗi script trong /etc/init.d có thể được chạy với tham số start, stop, restart, pause, zap, status, ineed, iuse, needsme, usesme hoặc broken.
Để chạy, ngừng hoặc khởi động lại một dịch vụ (và mọi dịch vụ liên quan), hãy dùng start, stop và restart:
# /etc/init.d/postfix start
Nếu muốn ngừng một dịch vụ, nhưng không muốn ngừng những dịch vụ phụ thuộc vào nó, có thể dùng tham số pause:
# /etc/init.d/postfix pause
Nếu muốn xem trạng thái của một dịch vụ (đã chạy, đã dừng, đang tạm dừng ...) ta có thể dùng tham số status:
# /etc/init.d/postfix status
Để biết những dịch vụ phụ thuộc, có thể dùng tham số iuse hoặc ineed. Với ineed, có thể thấy những dịch vụ thật sự cần để dịch vụ đang xét hoạt động đúng. Ngược lại, iuse cho biết những dịch vụ có thể được dùng bởi dịch vụ này, nhưng không bắt buộc cần thiết.
# /etc/init.d/postfix ineed
Tương tự, có thể xem những dịch vụ nào cần dịch vụ này (needsme) hoặc dùng dịch vụ này (usesme):
# /etc/init.d/postfix needsme
Cuối cùng, bạn có thể xem các dịch vụ mà dịch vụ này cần nhưng thiếu:
# /etc/init.d/postfix broken
Sử dụng rc-update
rc-update
Hệ thống khởi động của Gentoo dùng một cây phụ thuộc để quyết định dịch vụ nào cần được khởi động trước. Vì đây là một công việc tẻ nhạt nên chúng tôi không muốn người dùng tự làm bằng tay, chúng tôi tạo ra những công cụ để làm dễ dàng việc quản lý runlevel và init script.
Với rc-update, bạn có thể thêm vào và loại init script ra khỏi runlevel. rc-update sẽ tự động gọi depscan.sh để xây lại cây phụ thuộc.
Thêm và xóa các dịch vụ
Bạn đã thêm các init script vào runlevel "default" trong quá trình cài đặt Gentoo. Lúc đó có thể bạn không biết "default" là gì, nhưng bây giờ bạn đã biết. Script rc-update cần tham số định nghĩa hành động cần thực hiện: add, del hoặc show.
Để thêm hoặc bỏ một init script, chỉ cần dùng tham số add hoặc del cho rc-update, theo sau là init script và runlevel.
# rc-update del postfix default
Lệnh rc-update show sẽ hiện mọi init script hiện có và những runlevel sử dụng nó:
# rc-update show
Cấu hình dịch vụ
Cấu hình bổ sung
Init script có thể khá phức tạp. Tuy nhiên việc người dùng hiệu chỉnh trực tiếp init script là không cần thiết, vì làm thế rất dễ gây ra lỗi. Tuy nhiên thực sự cần có cách cấu hình một dịch vụ. Ví dụ, muốn đưa nhiều tùy chọn hơn cho dịch vụ đó.
Lý do thứ hai là để tách phần cấu hình ra khỏi init script là để có thể dễ dành cập nhật init script mà không sợ xóa mất phần cấu hình của hệ thống.
Thư mục /etc/conf.d
Gentoo cung cấp một cách dễ dàng để cấu hình một dịch vụ: mỗi init script cần được cấu hình sẽ có một tập tin trong /etc/conf.d. Ví dụ, initscript apache2 (tên là /etc/init.d/apache2) có tập tin cấu hình là /etc/conf.d/apache2, chứa các tùy chọn muốn đưa vào Apache 2 server khi khởi động:
APACHE2_OPTS="-D PHP4"
Tập tin cấu hình như thế chứa biến và chỉ biến (như /etc/make.conf), nên dễ dành cấu hình dịch vụ. Ngoài ra nó cũng giúp chúng tôi cung cấp nhiều thông tin hơn về các biến (thông qua phần ghi chú).
Viết Init Script
Viết init script thường là không cần thiết vì Gentoo cung cấp sẵn các init script để có thể dùng ngay cho từng dịch vụ. Tuy nhiên, có thể có một dịch vụ được cài đặt không dùng Portage, trong trường hợp này hầu như sẽ phải viết init script.
Không dùng những init script đi kèm với các dịch vụ vì nó không được viết cho Gentoo: Gentoo init script không tương thích với init script được dùng bởi các bản phân phối khác!
Bố cục
Bố cục cơ bản của init script như bên dưới.
#!/sbin/runscript
depend() {
(Thông tin phụ thuộc)
}
start() {
(Những lệnh cần thiết để khởi động dịch vụ)
}
stop() {
(Những lệnh cần thiết để dừng dịch vụ)
}
restart() {
(Những lệnh cần thiết để khởi động lại dịch vụ)
}
Mọi init script phải định nghĩa hàm start(). Những phần khác là tùy chọn.
Các phụ thuộc
Có hai loại phụ thuộc bạn có thể định nghĩa: use và need. Như đã đề cập, phụ thuộc need chặt hơn so với phụ thuộc use. Theo sau loại phụ thuộc này là tên dịch vụ phụ thuộc, hoặc phụ thuộc virtual.
Phụ thuộc virtual là phụ thuộc do một dịch vụ cung cấp, nhưng không phải chỉ có duy nhất một dịch vụ có thể cung cấp. Init script của hệ thống có thể phụ thuộc vào một system logger, nhưng có nhiều system logger (metalogd, syslog-ng, sysklogd ...). Vì bạn không thể need mọi system logger (không hệ thống nào cài đặt và chạy mọi system logger), gentoo bảo đảm rằng mọi dịch vụ loại này provide một phụ thuộc dạng virtual.
Hãy xem thông tin phụ thuộc của postfix.
depend() {
need net
use logger dns
provide mta
}
Như vậy, dịch vụ postfix:
cần phụ thuộc (virtual) net (cung cấp bởi, ví dụ, /etc/init.d/net.eth0)
dùng phụ thuộc (virtual) logger (cung cấp bởi, ví dụ, /etc/init.d/syslog-ng)
dùng phụ thuộc (virtual) dns (cung cấp bởi, ví dụ, /etc/init.d/named)
cung cấp phụ thuộc (virtual) mta (dành cho mọi mail server)
Điều khiển thứ tự
Đôi khi không cần một dịch vụ, nhưng muốn một dịch vụ khởi động trước (hoặc sau) một dịch vụ khác nếu dịch vụ đó có trên hệ thống (chú ý phần điều kiện - không phải là thông tin phụ thuộc nữa) và chạy trong cùng runlevel (chú ý phần điều kiện - chỉ những dịch vụ trong cùng runlevel là có liên quan). Có thể cung cấp thông tin này bằng thiết lập before hoặc after.
Ví dụ thiết lập của dịch vụ Portmap:
depend() {
need net
before inetd
before xinetd
}
Có thể dùng "*" để chọn mọi dịch vụ trong runlevel, mặc dù không nên làm như thế.
depend() {
before *
}
Hàm chuẩn
Sau hàm depend(), cần định nghĩa hàm start(). Hàm này chứa mọi lệnh cần thiết để khởi động hệ thống. Nó được khuyên dùng hàm ebegin và eend để thông báo cho người dùng biết điều gì đang xảy ra:
start() {
ebegin "Starting my_service"
start-stop-daemon --start --quiet --exec /path/to/my_service
eend $?
}
Nếu cần nhiều hàm start() ví dụ hơn, vui lòng đọc mã nguồn của các init script trong /etc/init.d. Với start-stop-daemon, có một man page xuất sắc chưa nhiều thông tin hơn cho bạn:
# man start-stop-daemon
Những hàm khác có thể định nghĩa là: stop() và restart(). Ta không bị buộc phải định nghĩa những hàm này! Hệ thống khởi động đủ thông minh để tự điền những hàm này nếu dùng start-stop-daemon.
Cú pháp init script của Gentoo dựa trên Bourne Again Shell (bash) vì thế có thể tự do dùng các khai báo của bash bên trong init script.
Thêm tùy chọn riêng
Nếu muốn init script của hỗ trợ nhiều tùy chọn hơn những cái đã thấy, ta nên thêm tùy chọn vào biến opts, và tạo một hàm cùng tên với tùy chọn. Ví dụ, để hỗ trợ tùy chọn restartdelay:
opts="${opts} restartdelay"
restartdelay() {
stop
sleep 3 # Chờ 3 giây trước khi khởi động lại
start
}
Biến cấu hình tùy chọn
Ta không phải làm bất cứ gì để hỗ trợ tập tin cấu hình trong /etc/conf.d: nếu init script được chạy, những dòng sau sẽ được gộp vào (thông qua lệnh source):
/etc/conf.d/
/etc/conf.d/basic
/etc/rc.conf
Ngoài ra, nếu ta cung cấp phụ thuộc virtual (như net), tập tin đi kèm với phụ thuộc đó (như /etc/conf.d/net) cũng được gộp vào luôn.
Thay đổi hành vi Runlevel
Giả sử khi ở nhà người dùng muốn khởi động net.eth0 nhưng khi đi ra đường ta không muốn khởi động dịch vụ này vì không có kết nối mạng. Với Gentoo, ta có thể thay đổi hành vi runlevel .
Ví dụ, bạn có thể tạo runlevel "default" thứ hai, dùng để khởi động những init script liên quan. Bạn có thể chọn default runlevel bạn muốn dùng lúc kh
Các file đính kèm theo tài liệu này:
- Do an tot nghiep _ Nguyen Dinh Nam.doc
- bia - Nguyen Dinh Nam.doc