Anaconda

準備程序

CAKE 的光碟安裝程序是由 anaconda 所完成。相關說明,請參考 Anaconda wiki

若要進行開發,建議先閱讀 GTK+ Reference 以及 Source Overview

安裝好 CentOS 7 之後,anaconda source code 就已安裝至系統中。可執行

repoquery --list anaconda

來列出 anaconda 的程式所在。

pyanaconda 會被安裝至 /usr/lib64/python2.7/site-packages 底下。而 glade 檔則是安裝在 /usr/share/anaconda/ui 底下。

準備好一個文字編輯器,以及 glade 編輯器之後,就可以開始進行開發了。

yum install glade anaconda-widgets anaconda-widgets-devel

關於 glade 的相關文件,請參考 glade網站。
 

執行程式

"由於 Anaconda 需 root 的執行權限,因此以下所有的操作請用 root 來執行。"

Anaconda 的主程式為 ”/usr/sbin/anaconda”,該程式為一支 python script。根據 wiki 的說明
 
This is the main anaconda program that gets called via systemd at the end of system bootup.
It handles lots of environment setup, enables updates if they exist, reads any kickstart file, sets up VNC, and other tasks.
When all this is done, it hands control over to the UI which in turn drives the rest of installation.
 
為了方便開發,我們可以直接執行此程式。不過請記得不要按程式中的「退出」鍵,而是用 kill -9 process 的方式來終止程式。否則系統將會被重開機。

”/usr/sbin/anaconda” 除了設定系統,並收集一些參數之外,主要利用

from pyanaconda import Anaconda
anaconda = Anaconda()
...
anaconda._intf.setup(ksdata) // 利用 kickstart 檔的設定
anaconda._intf.run()         // 啟動程式

來開始程式主幹。

在 ”/usr/lib64/python2.7/site-packages/pyanaconda/init.py” 中會再依據環境,如果可執行圖形界面的話,就執行

from pyanaconda.ui.gui import GraphicalUserInterface
self._intf = GraphicalUserInterface( self.storage, self.payload, self.instClass )

來啟動圖形界面。

如果是執行文字界可的話,就執行

from pyanaconda.ui.tui import TextUserInterface
self._intf = TextUserInterface( self.storage, self.payload, self.instClass )

來啟動文字界面。
 

圖形界面執行步驟與順序

GraphicalUserInterface 為 UserInterface (定義在 ui/init.py )的子類別。

它的 _actions 為一個 list, 存所有 spokes。在 GraphicalUserInterface.setup() 被呼叫時會被設定。設定時會呼叫 GraphicalUserInterface.getActionClasses(hubs),該方法會

Grab all relevant standalone spokes, add them to the passed list of hubs and order the list according to the relationship between hubs and standalones.

做法則是透過 UserInterface 的 _collectActionClasses( module_pattern_w_path, standlone_class ) 以及 _orderActionClasses( spokes, hubs ) 來完成。

_collectActionClasses 會呼叫 ui/common.py 裡的 collect( module_pattern, path, pred ) 來挑出 StandaloneSpoke 的子類別中有 preForHub 屬性的類別,或者有 postForHub 屬性的類別。

collect 的說明如下:

Traverse the directory (given by path), import all files as a module module_pattern % filename and find all classes within that match the given predicate. This is then returned as a list of classes.

:param module_pattern: the full name pattern (pyanaconda.ui.gui.spokes.%s) we want to assign to import modules
:type module_pattern: string

:type path: string

:param pred: function which marks classes as good to import
:type pred: function with one argument returning True of False

_orderActionClasses( spokes, hubs ) 的排序方法為,先挑出 spokes.preForHub 為 hub 的 spokes,並依照 spokes.priority 排序。接著放 hub。之後再挑出 spokes.postForHub 為 hub 的 spokes, 同時也依 spokes.priority 來排序。

除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-ShareAlike 3.0 License