閱讀962 返回首頁    go 技術社區[雲棲]


LXD 2.0 係列(十二):調試,及給 LXD 做貢獻

介紹

終於要結束了!這個大約一年前開始的這係列文章的最後一篇博文。

  1. LXD 入門
  2. 安裝與配置
  3. 你的第一個 LXD 容器
  4. 資源控製
  5. 鏡像管理
  6. 遠程主機及容器遷移
  7. LXD 中的 Docker
  8. LXD 中的 LXD
  9. 實時遷移
  10. LXD 和 Juju
  11. LXD 和 OpenStack
  12. 調試,及給 LXD 做貢獻

如果你從一開始就關注了這個係列,你應該已經使用了 LXD 相當長的時間了,並且非常熟悉它的日常操作和功能。

但如果出現問題怎麼辦?你可以做什麼來自己跟蹤問題?如果你不能,你應該記錄什麼信息,以便上遊可以跟蹤問題?

如果你想自己解決問題或通過實現你需要的功能來幫助改善LXD怎麼辦?如何構建,測試和貢獻 LXD 代碼庫?

調試 LXD 並填寫 bug 報告

LXD 日誌文件

/var/log/lxd/lxd.log

這是 LXD 日誌的主文件。為了避免它快速充滿你的磁盤,默認隻會記錄 INFOWARNING 或者 ERROR 級別的日誌。你可以在 LXD 守護進程中使用 –debug 改變其行為。

/var/log/lxd/CONTAINER/lxc.conf

每當你啟動容器時,此文件將更新為傳遞給 LXC 的配置。

這裏會展示容器將如何配置,包括其所有的設備、綁定掛載等等。

/var/log/lxd/CONTAINER/forkexec.log

這個文件包含 LXC 命令執行失敗時產生的錯誤。這個情況是非常罕見的,因為 LXD 通常會在發生之前處理大多數錯誤。

/var/log/lxd/CONTAINER/forkstart.log

這個文件包含 LXC 在啟動容器時的錯誤信息。含 LXC 命令執行失敗時產生的錯誤。

CRIU 日誌 (對於實時遷移)

如果使用 CRIU 進行容器實時遷移或實時快照,則每次生成 CRIU 轉儲或恢複轉儲時都會記錄額外的日誌文件。

這些日誌也可以在 /var/log/lxd/CONTAINER/ 中找到,並且有時間戳,以便你可以找到與你最近的操作所匹配的那些日誌。它們包含 CRIU 轉儲和恢複的所有內容的詳細記錄,並且比典型的遷移/快照錯誤消息更容器理解。

LXD 調試消息

如上所述,你可以使用 -debug 選項將守護進程切換為執行調試日誌記錄。另一種方法是連接到守護進程的事件接口,它將顯示所有日誌條目,而不管配置的日誌級別(即使是遠程工作)。

舉例說,對於 lxc init ubuntu:16.04 xen 來說,

lxd.log 會是這樣:


  1. INFO[02-24|18:14:09] Starting container action=start created=2017-02-24T23:11:45+0000 ephemeral=false name=xen stateful=false used=1970-01-01T00:00:00+0000
  2. INFO[02-24|18:14:10] Started container action=start created=2017-02-24T23:11:45+0000 ephemeral=false name=xen stateful=false used=1970-01-01T00:00:00+0000

而 lxc monitor –type=logging 會是:


  1. metadata:
  2. context: {}
  3. level: dbug
  4. message: 'New events listener: 9b725741-ffe7-4bfc-8d3e-fe620fc6e00a'
  5. timestamp: 2017-02-24T18:14:01.025989062-05:00
  6. type: logging
  7. metadata:
  8. context:
  9. ip: '@'
  10. method: GET
  11. url: /1.0
  12. level: dbug
  13. message: handling
  14. timestamp: 2017-02-24T18:14:09.341283344-05:00
  15. type: logging
  16. metadata:
  17. context:
  18. driver: storage/zfs
  19. level: dbug
  20. message: StorageCoreInit
  21. timestamp: 2017-02-24T18:14:09.341536477-05:00
  22. type: logging
  23. metadata:
  24. context:
  25. ip: '@'
  26. method: GET
  27. url: /1.0/containers/xen
  28. level: dbug
  29. message: handling
  30. timestamp: 2017-02-24T18:14:09.347709394-05:00
  31. type: logging
  32. metadata:
  33. context:
  34. ip: '@'
  35. method: PUT
  36. url: /1.0/containers/xen/state
  37. level: dbug
  38. message: handling
  39. timestamp: 2017-02-24T18:14:09.357046302-05:00
  40. type: logging
  41. metadata:
  42. context: {}
  43. level: dbug
  44. message: 'New task operation: 2e2cf904-c4c4-4693-881f-57897d602ad3'
  45. timestamp: 2017-02-24T18:14:09.358387853-05:00
  46. type: logging
  47. metadata:
  48. context: {}
  49. level: dbug
  50. message: 'Started task operation: 2e2cf904-c4c4-4693-881f-57897d602ad3'
  51. timestamp: 2017-02-24T18:14:09.358578599-05:00
  52. type: logging
  53. metadata:
  54. context:
  55. ip: '@'
  56. method: GET
  57. url: /1.0/operations/2e2cf904-c4c4-4693-881f-57897d602ad3/wait
  58. level: dbug
  59. message: handling
  60. timestamp: 2017-02-24T18:14:09.366213106-05:00
  61. type: logging
  62. metadata:
  63. context:
  64. driver: storage/zfs
  65. level: dbug
  66. message: StoragePoolInit
  67. timestamp: 2017-02-24T18:14:09.369636451-05:00
  68. type: logging
  69. metadata:
  70. context:
  71. driver: storage/zfs
  72. level: dbug
  73. message: StoragePoolCheck
  74. timestamp: 2017-02-24T18:14:09.369771164-05:00
  75. type: logging
  76. metadata:
  77. context:
  78. container: xen
  79. driver: storage/zfs
  80. level: dbug
  81. message: ContainerMount
  82. timestamp: 2017-02-24T18:14:09.424696767-05:00
  83. type: logging
  84. metadata:
  85. context:
  86. driver: storage/zfs
  87. name: xen
  88. level: dbug
  89. message: ContainerUmount
  90. timestamp: 2017-02-24T18:14:09.432723719-05:00
  91. type: logging
  92. metadata:
  93. context:
  94. container: xen
  95. driver: storage/zfs
  96. level: dbug
  97. message: ContainerMount
  98. timestamp: 2017-02-24T18:14:09.721067917-05:00
  99. type: logging
  100. metadata:
  101. context:
  102. action: start
  103. created: 2017-02-24 23:11:45 +0000 UTC
  104. ephemeral: "false"
  105. name: xen
  106. stateful: "false"
  107. used: 1970-01-01 00:00:00 +0000 UTC
  108. level: info
  109. message: Starting container
  110. timestamp: 2017-02-24T18:14:09.749808518-05:00
  111. type: logging
  112. metadata:
  113. context:
  114. ip: '@'
  115. method: GET
  116. url: /1.0
  117. level: dbug
  118. message: handling
  119. timestamp: 2017-02-24T18:14:09.792551375-05:00
  120. type: logging
  121. metadata:
  122. context:
  123. driver: storage/zfs
  124. level: dbug
  125. message: StorageCoreInit
  126. timestamp: 2017-02-24T18:14:09.792961032-05:00
  127. type: logging
  128. metadata:
  129. context:
  130. ip: '@'
  131. method: GET
  132. url: /internal/containers/23/onstart
  133. level: dbug
  134. message: handling
  135. timestamp: 2017-02-24T18:14:09.800803501-05:00
  136. type: logging
  137. metadata:
  138. context:
  139. driver: storage/zfs
  140. level: dbug
  141. message: StoragePoolInit
  142. timestamp: 2017-02-24T18:14:09.803190248-05:00
  143. type: logging
  144. metadata:
  145. context:
  146. driver: storage/zfs
  147. level: dbug
  148. message: StoragePoolCheck
  149. timestamp: 2017-02-24T18:14:09.803251188-05:00
  150. type: logging
  151. metadata:
  152. context:
  153. container: xen
  154. driver: storage/zfs
  155. level: dbug
  156. message: ContainerMount
  157. timestamp: 2017-02-24T18:14:09.803306055-05:00
  158. type: logging
  159. metadata:
  160. context: {}
  161. level: dbug
  162. message: 'Scheduler: container xen started: re-balancing'
  163. timestamp: 2017-02-24T18:14:09.965080432-05:00
  164. type: logging
  165. metadata:
  166. context:
  167. action: start
  168. created: 2017-02-24 23:11:45 +0000 UTC
  169. ephemeral: "false"
  170. name: xen
  171. stateful: "false"
  172. used: 1970-01-01 00:00:00 +0000 UTC
  173. level: info
  174. message: Started container
  175. timestamp: 2017-02-24T18:14:10.162965059-05:00
  176. type: logging
  177. metadata:
  178. context: {}
  179. level: dbug
  180. message: 'Success for task operation: 2e2cf904-c4c4-4693-881f-57897d602ad3'
  181. timestamp: 2017-02-24T18:14:10.163072893-05:00
  182. type: logging

lxc monitor 的格式有點不同於每個條目都縮合成一行的日誌文件,但更重要的是,你可以看到所有 level:dbug 條目。

如何報告 bug

LXD 的 bug

最好報告 bug 的地方是 https://github.com/lxc/lxd/issues。確保完整填寫了 bug 報告模板中的內容,這些信息可以節省我們我們時間來複現環境。

Ubuntu 的 bug

如果你發現 Ubuntu 包本身有問題,無法安裝、升級或刪除。或者遇到 LXD init 腳本的問題。報告此類錯誤的最好是在 Launchpad 上。

在 Ubuntu 係統上,你可以使用:ubuntu-bug lxd ,它將自動包括一些日誌文件和包信息供我們查看。

CRIU 的 bug

與 CRIU 相關的 Bug,你可以通過 CRIU 的錯誤輸出發現,你應該在 Launchpad 上報告這些:ubuntu-bug criu

請注意,通過 LXD 使用 CRIU 屬於測試版功能,除非你願意通過 Canonical 的支持合同付費支持,要麼可能需要一段時間才能查看你的錯誤報告。

貢獻給 LXD

LXD 用 Go 寫成並托管在 Github。我們歡迎任外部的貢獻。為 LXD 貢獻不需要 CLA 或類似的法律協議簽署,隻是通常的開發者所有權證書(Signed-off-by: 行)。

在我們的問題追蹤器工具中,我們列有許多潛在的功能需求,新的貢獻者可以以此作為良好的起點。通常最好在開始處理代碼先發出 issue,這樣每個人都知道你正在做這項工作,以便我們可以提供一些早期反饋。

從源碼源碼構建 LXD

這裏有上遊的維護說明:https://github.com/lxc/lxd#building-from-source

你需要在 Github 上 fork 上遊倉庫,然後將你的更改推送到你的分支。我們建議每天 rebase 上遊的 LXD,因為我們傾向於定期合並更改。

運行測試套件

LXD 維護了兩套測試集,單元測試和集成測試。你可以用下麵的命令測試所有:


  1. sudo -E make check

要隻運行單元測試,使用:


  1. sudo -E go test ./...

要運行集成測試,使用:


  1. cd test
  2. sudo -E ./main.sh

後者支持相當多的環境變量來測試各種存儲後端、禁用網絡測試、使用 ramdisk 或隻是調整日誌輸出。其中一些是:

  • LXD_BACKENDbtrfsdirlvm 或 zfs” 之一(默認為 dir)   
    運行 LXD 存儲驅動程序相關的所有測試。
  • LXD_CONCURRENTtrue 或 false(默認為 false)   
    這啟用一些額外的並發測試。
  • LXD_DEBUGtrue 或 false(默認為 false)   
    記錄所有 shell 命令,並在調試模式下運行所有​​ LXD 命令。
  • LXD_INSPECTtrue 或 false(默認為 false)   
    測試程序會在故障時掛起,以便你可以檢查環境。
  • LXD_LOGS:將所有 LXD 日誌文件轉儲到的目錄(默認為 “”)   
    所有生成的 LXD 守護進程的 logs 目錄將被複製到此路徑。
  • LXD_OFFLINEtrue 或 false(默認為 false)   
    禁用任何依賴於外部網絡連接的測試。
  • LXD_TEST_IMAGE: unified 格式的 LXD 鏡像的路徑(默認為 “”)   
    可以使用自定義測試鏡像,而不是默認的最小 busybox 鏡像。
  • LXD_TMPFStrue 或 false(默認為 false)   
    在 tmpfs 安裝中運行整個測試套件,這會使用相當多的內存,但會使測試速度明顯更快。
  • LXD_VERBOSEtrue 或 false(默認為 false)   
    不太極端的 LXD_DEBUG 版本。shell 命令仍然會記錄,但 -debug 不會傳遞給 LXC 命令,LXD 守護進程隻能使用 -verbose 運行。

測試程序將在實際運行之前提醒你任何缺失的依賴項。在相當快的機器上運行該測試可在 10 分鍾內完成。

原文發布時間為:2017-03-09

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-24 16:31:57

  上一篇:go  LXD 2.0 係列(十一):LXD 和 OpenStack
  下一篇:go  如何在 Debian 和 Ubuntu 上安裝 MariaDB 10