請搭配任何 happy-*
指令使用 -h
旗標,查看該指令的說明和選項清單。
狀態檔案
Happy 會在 JSON 檔案中儲存及小心維護其拓樸狀態,且只會儲存單一記錄。使用這個狀態檔案,Happy 就能執行適當的指令,建立或移除拓樸。
預設狀態檔案位於 ~/.happy_state.json
。預設的狀態名稱為 happy
,如 happy-state
輸出內容所示:
happy-state
State Name: happy
平行狀態
Happy 支援多個並行狀態同時存在。目前狀態由 HAPPY_STATE_ID
環境變數決定。如果環境中沒有 HAPPY_STATE_ID
,系統會使用 happy
的預設狀態值。
「Happy」安裝期間未建立「HAPPY_STATE_ID
」。請建立值為 state
以外的值,立即切換至其他 Happy 狀態。
export HAPPY_STATE_ID="sunny"
接著,我們來查看 happy-state
在不同狀態下的結果:
happy-state
State Name: sunny
每個狀態都會保留在專屬的 ~/.${HAPPY_STATE_ID}_state.json
檔案中。如要切換狀態,請再次執行 export HAPPY_STATE_ID="<state-name>"
指令。
使用並行狀態解除安裝
如果您使用平行 Happy 狀態,並且想要解除安裝 Happy,請務必針對每個啟用的狀態執行 happy-state-delete
。這樣可確保 Happy 建立的所有網路命名空間都會從系統中移除,不會影響 Linux 主機網路設定。
例如,假設有兩個狀態是 happy
和 sunny
:
export HAPPY_STATE_ID="sunny"
happy-state-delete
export HAPPY_STATE_ID="happy"
happy-state-delete
視需要手動移除每個平行狀態檔案:
rm -f ~/.sunny_state.json
rm -f ~/.sunny_state.json.lock
rm -f ~/.happy_state.json
rm -f ~/.happy_state.json.lock
記錄
根據預設,Happy 會將記錄傳送至 syslog
。第二個記錄檔備份會傳送至 /tmp/${HAPPY_STATE_ID}_debug_log.txt
。
如要查看 Happy 記錄,請在獨立的終端機視窗中執行 happy-state -l
。輸入 Happy 指令時,記錄會顯示背景中執行的殼層指令 Happy 問題。如果您對 Linux 網路命名空間有興趣,這是瞭解 Happy 的運作方式的好方法。
舉例來說,happy-node-add node00
會建立快樂節點。這個指令的記錄輸出如下:
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 does not exist DEBUG [Driver:writeState():365] Happy: writing Happy state to file DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns add happy000 DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 exists DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ifconfig lo up
所有 Driver:CallCmd()
行都是 Happy 呼叫的殼層指令。請參考記錄中的每一行:
# Check to see if the target namespace (happy000) exists DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 does not exist # Write the link between node00 and happy000 in ~/.happy_state.json DEBUG [Driver:writeState():365] Happy: writing Happy state to file # Create the network namespace for the node DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns add happy000 # Check to see if the target namespace (happy000) exists DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 exists # Bring up the loopback interface within the happy000 namespace DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ifconfig lo up
範例拓撲
我們在 Happy 和 OpenWeave 存放區中都納入了可供測試的拓樸結構範例。還能透過這些指令學習指令,進而建構複雜的拓撲。
- 快樂:
/topologies
- OpenWeave:
/src/test-apps/happy/topologies/standalone
拓樸圖採用 JSON 和 Shell 指令碼格式。
JSON
系統會使用 happy-state-load
或 weave-state-load
指令載入 JSON 拓樸檔案。如果拓樸包含 Weave,您必須使用 weave-state-load
載入拓樸,否則會略過 Weave 專屬指令。
例如,不含 Weave 的拓撲:
happy-state-load thread_wifi_ap_internet.json
含有 Weave 的拓撲:
weave-state-load three_nodes_on_thread_weave.json
如要將目前的拓樸儲存為單獨的 JSON 檔案,以供日後使用 (例如 測試案例指令碼),請使用 happy-shell -s
:
happy-shell -s my_topology.json
這項操作會將拓撲狀態檔案儲存在 $HOME
目錄中。
殼層指令碼
殼層指令碼定格檔包含 Happy 和 Weave 指令組合,可在對應的 JSON 檔案中建立定格。根據預設,這些指令碼沒有可執行的權限。您可以透過兩種方式執行這些指令碼:
使用 bash
指令:
bash thread_wifi_ap_internet.sh
套用可執行權限:
chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh
設定
Happy 有三個設定檔:
Configuration File (設定檔) | 說明 |
---|---|
~/.happy_conf.json | 個人或外掛程式使用的組態變數。請使用 happy-configuration 指令設定這些值。 |
<path-to-happy>/happy/conf/main_config.json | 主要快樂設定變數。 |
<path-to-happy>/happy/conf/log_config.json | 記錄設定。 |
新增設定變數
建議您使用 happy-configuration
指令來設定任何個人或外掛程式變數,而不使用預設的 Happy 部署作業。
舉例來說,如要讓 Happy 知道在哪裡可以找到測試指令碼的 Weave test-apps
目錄,請設定 weave_path
變數:
happy-configuration weave_path <path-to-openweave-core>/build/x86_64-unknown-linux-gnu/src/test-apps
Happy 會在 ~/.happy_conf.json
中儲存設定變數。
節點中的程序
Happy 提供命令,可在模擬節點中啟動及停止程序。
如何啟動程序:
happy-process-start <node-name> <custom-process-name> <command>
舉例來說,如要在名為 ThreadNode 的節點中持續執行 ping 作業,請按照下列步驟操作:
happy-process-start ThreadNode ContinuousPing ping 8.8.8.8
在上述範例中,ContinuousPing 是使用者定義的程序名稱,Happy 會使用這個名稱來管理該程序。使用 happy-process-wait
可暫停程序執行作業,使用 happy-process-stop
則可終止程序。
程序輸出位於 /tmp
。舉例來說,啟動 ContinuousPing 程序後,請檢查 /tmp
目錄:
ls /tmp/happy*
/tmp/happy_018691_1524087014.192197_ContinuousPing.out
這個 .out
檔案包含 ContinuousPing 程序的輸出內容。
sudo
的用量
快樂地變更由 Linux 核心控管的網路設定。由於只有 root
可以變更核心設定,因此 Happy 會在作業期間提示您輸入 sudo
密碼。
Happy 會使用 $SUDO
系統環境變數呼叫 sudo
。如未定義 $SUDO
,Happy 會發出一般的 sudo
呼叫。
Python 指令碼
安裝完成後,您可以使用以下 import
陳述式,將 Happy Python 套件匯入至 Python 環境:
import happy
在 /happy
中找到的個別指令模組會匯入如下:
import happy.HappyNodeAdd
如要擷取模組選項,請呼叫 option()
函式。例如,如要擷取 HappyNodeAdd
模組選項:
module options import happy.HappyNodeAdd options = happy.HappyNodeAdd.option()