Thứ Bảy, 10 tháng 8, 2013

Services

Service

Hầu hết mọi hệ điều hành đều có một cơ chế để start processes tại system startup time để cung cấp services không phụ thuộc vào một interactive user. Trong Windows, những processes như vậy được gọi là services hoặc Windows services , bởi vì chúng dựa trên Windows API để tương tác với hệ thống. Services tương tự như Unix daemon processes và thường implement server side của các ứng dụng client/server. Một ví dụ của một Windows service có thể là một Web server bởi vì nó phải running mà không quan tâm đến có hay không một ai đó được logged on vào máy tính và nó phải start running khi hệ thống starts vì vậy một nhà quản trị không phải nhớ để start nó.

Windows services bao gồm 3 thành phần: một ứng dụng dịch vụ, một chương trình điều khiển ứng dụng (a service control program) SCP, và một trình quản lý điều khiển ứng dụng (the service control manager) SCM. Thứ nhất, chúng ta sẽ mô tả service applications, service accounts, và các hoạt động của SCM. Sau đó chúng tôi sẽ giải thích cách auto-start services được started trong suốt system boot.
Hầu hết mọi OS có một cơ chế để start các processes tại thời điểm hệ thống khởi động để cung cấp services mà không bị bó buộc vào một người dùng tương tác. Trong Windows, những processes như vậy được gọi là services hoặc Windows services , bởi vì chúng dựa trên Windows API để tương tác với hệ thống. Services trong Windows tương tự như UNIX daemon processes và thường implement phía bên server của các ứng dụng client/server. Một ví dụ của Windows service có thể là Web server, lí do là vì nó phải running bất kể khi có hay không một ai đó đăng nhập vào máy tính và nó phải running khi hệ thống khởi động vì vậy người quản trị viên không phải nhớ là mình phải khởi động nó. 

Windows services bao gồm 3 thành phần: một ứng dụng dịch vụ (a service application), một chương trình điều khiển ứng dụng (a service control program), và một trình quản lý điều khiển ứng dụng (the service control manager). Đầu tiên, chúng ta sẽ mô tả service applications, service accounts, và các hoạt động của SCM. Sau đó, chúng tôi sẽ giải thích cách auto-start services được khởi động trong suốt system boot. Chúng tôi sẽ còn cover các bước SCM thực hiện khi một service bị lỗi trong quá trình khởi động của nó và cách SCM shuts down services. 

Service Applications

Service applications, ví dụ như Web servers, gồm ít nhất một excutable để run như là một Windows service. Một người dùng muốn start, stop, hoặc cấu hình (configure) một service sử dụng một SCP. Mặc dù Windows cung cấp built-in SCPs phục vụ cho việc start, stop, pause, hoặc tiếp tục chức năng, một vài service applications có những SCP của riêng họ để cho phép các nhà quản trị để xác định các thiết lập cấu hình đến riêng dịch vụ chúng quản lý. 

Service applications đơn giản là Windows executables (GUI hoặc console) thêm vào đó là đoạn mã bổ sung để nhận commands từ SCM cũng như là giao tiếp với SCM thông qua các trạng thái ứng dụng. Bởi vì hầu hết dịch vụ không có một user interface, chúng được xây dựng như là console programs. 

Khi bạn install một ứng dụng bao gồm một service, chương trình cài đặt ứng dụng phải register service với hệ thống. Để register service, setup program gọi hàm CreateService, một hàm liên quan đến các dịch vụ được implemented trond Advapi32.dll (\Windows\System32\Advapi32.dll). Advapi32 , the "Advance API" DLL, implement tất cả SCM APIs phía client. 

Khi một setup program registers một service thông qua việc gọi CreateService, một message được gửi tới SCM trên máy đặt service. SCM sau đó tạo một registry key cho service dưới HKLM\SYSTEM\CurrentControlSet\Service. Từng keys cho mỗi dịch vụ định nghĩa path đến excutable image chứa service cũng như là parameters và configuration options. 

Sau khi tạo một service, các ứng dụng cài đặt hoặc quản lý có thể start service thông qua hàm StartService . Bởi vì một vài ứng dụng dựa trên dịch vụ còn phải khởi tạo trong suốt boot process đến function, ta không thường thấy một setup program register một service như là một auto-start service, yêu cầu user reboot hệ thống để hoàn tất việc cài đặt, và để cho SCM start service như là system boots. 

Khi một chương trình gọi CreateService , nó phải xác định một số lượng parameters mô tả các đặc tính của service. Các thuộc tính bao gồm kiểu service (có phải service đó run trong process của riêng nó hay là run trong một process được chia sẻ giữa nhiều services), vị trí của service's excutable image file, một optional display name, một optional account name và password được sử dụng để start service khi trong một account's security context, một start type chỉ ra rằng service starts tự động khi hệ thống boot hay là thực hiện thủ công dưới sự điều hướng của một SCP, một error code ám chỉ cách hệ thống phản ứng nếu service phát hiện một lỗi khi starting, và, nếu service starts tự động , optional information sẽ xác định khi nào service starts liên quan đến services khác.


SCM lưu mỗi thuộc tính như là một giá trị trong registry key của dịch vụ. Figure 4-8 shows một ví dụ của một service registry key. 

 Nếu một service cần lưu thông tin cấu hình có tính chất riêng tư với service, theo quy tắc thì ta tạo ra một subkey có tên là Parameter dưới service key của nó và sau đó lưu thông tin cấu hình trong các giá trị dưới subkey đó. Service sau đó có thể lấy được các giá trị này bằng cách sử dụng các hàm registry chuẩn. 


Note: SCM không access đến Parameters subkey của service cho đến khi service được xóa đi, tại thời điểm mà SCM xóa đi trọn vẹn key của service, bao gồm cả subkeys giống như Parameters.

Chúng ta cùng nhau phân tích một vài thông số :

Start :
- SERVICE_BOOT_START (0): Ntldr hoặc Osloader nạp trước driver vì vậy nó nằm trong bộ nhớ trong suốt quá trình boot. Các driver này được khởi tạo trước SERVICE_SYSTEM_START drivers.
- SERVICE_SYSTEM_START (1): drivers nạp và được khởi tạo trong suốt quá trình khởi tạo kernel sau khi SERVICE_BOOT_START được khởi tạo. 
- SERVICE_AUTO_START (2) : SCM starts driver hoặc service sau SCM process, Service.exe, starts. 
- SERVICE_DEMAND_START (3) : SCM starts driver hoặc service theo nhu cầu.
- SERVICE_DISABLED (4) : driver hoặc service không được nạp hoặc khởi tạo

Type:
- SERVICE_KERNEL_DRIVER (1) : Device driver
- SERVICE_FILE_SYSTEM_DRIVER (2) : Kernel-mode file system driver
- SERVICE_ADAPTER (4) : Lỗi thời
- SERVICE_RECOGNIZER_DRIVER (8) : File system recognizer driver
- SERVICE_WIN32_OWN_PROCESS (16): Service runs trong một process mà hosts chỉ một service
- SERVICE_WIN32_SHARE_PROCESS (32): Service runs trong một process mà hosts nhiều services. 
- SERVICE_INTERACTIVE_PROCESS (256) : Service được phép hiển thị windows trên console và nhận user input. 

Để ý vào Type values có 3 giá trị được áp dụng cho device drivers: device driver, file system driver, và file system recognizer. Các giá trị này được sử dụng bởi Windows device drivers, những gì còn lưu các parameters của chúng như là registry data trong Service registry key. SCM chịu trách nhiệm starting drivers với Start value là SERVICE_AUTO_START hoặc SERVICE_DEMAND_START, vì vậy SCM database có bao gồm drivers. Service sử dụng các kiểu khác, SERVICE_WIN32_OWN_PROCESS và SERVICE_WIN32_SHARE_PROCESS. Một excutable mà hosts nhiều hơn một service xác định SERVICE_WIN32_SHARE_PROCESS . Một lợi thế khi có một process run nhiều hơn một service đó là system resources có thể được tiết kiệm so với việc run chúng trong nhiều process. Một bất lợi tiềm ẩn đó là nếu một trong các services đang running trong cùng một process bị lỗi mà kết thúc process, tất cả services của process cũng kết thúc. Còn nữa, tất cả services phải run dưới cùng một account. 

Khi SCM starts một service process , process ngây lập tức gọi StartServiceCtrlDispatcher function . StartServiceCtrlDispatcher accepts một danh sách entry points bên trong services, một entry point cho mỗi service trong process. Mỗi entry point được nhận dạng bởi tên của service mà entry point tương ứng với. Sau khi tạo ra một kết nối đến SCM, StartServiceCtrlDispatcher  đứng trong một loop đợi commands thông qua kết nối đến từ SCM. SCM gửi một service-start command mỗi lần nó start một service process sở hữu. Đối với mỗi lần nhận start command, StartServiceCtrlDispatcher function tạo một thread, được gọi là service thread, để gọi starting service's entry point và implement command loop cho service. StartServiceCtrlDispatcher chờ vô thời hạn cho commands từ SCM và trả quyền điều khiển đến process's main function chỉ khi process's services dừng lại, cho phép service process dọn dẹp resources trước khi thoát. 

Hành động đầu tiên của một service entry point đó là gọi hàm RegisterServiceHandler . Hàm này nhận và lưu một con trỏ đến một hàm, được gọi là control handler, những gì mà service implements nhiều commands nó nhận tử SCM. RegisterServiceHandler không giao tiếp với SCM, nhưng nó lưu hàm trong local process memory cho hàm StartServiceCtrlDispatcher . Service entry point tiếp tục khởi tạo service, những gì bao gồm cấp phát bộ nhớ, tạo ra các điểm đầu cuối giao tiếp, và đọc các thông tin cấu hình cá nhân tử registry. Một quy tắc mà hầu hết services tuân theo là lưu parameters của chúng dưới một subkey của service registry key của chúng , có tên là Parameters. Trong khi entry point đang khởi tạo service , nó có thể gửi status messages một cách định kỳ , sử dụng hàm SetServiceStatus , để SCM chỉ ra cách khởi động service. Sau khi entry point hoàn thành việc khởi tạo, một service thread thường đứng trong loop chờ cho requests từ client applications. Cho ví dụ, một Web server có thể khởi tạo một TCP listen socket và chờ inbound HTTP connection requests. 

Một service process's main thread, những gì thực thi trong hàm StartServiceCtrlDispatcher , nhận SCM commands trực tiếp tại services trong process và gọi target service's control handler function (được lưu trong RegisterServiceHandler). SCM commands bao gồm stop, pause, resume, interrogate, và shutdown , hoặc application-defined commands. 

Không có nhận xét nào:

Đăng nhận xét