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中國”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux用ping命令測試網速,linux下面使用命令測試網速

大家都知道在speedtest是市面上最準確最全面的測速工具,但在linux命令行不能直接使用,所以我們就借助腳本調用speedtest的接口來利用他測試網速。1.下載speedtest-cli腳本:下載地址:https://raw.githubusercontent.com/sivel/spee…

Java ArrayList isEmpty()方法與示例

ArrayList類isEmpty()方法 (ArrayList Class isEmpty() method) isEmpty() method is available in java.util package. isEmpty()方法在java.util包中可用。 isEmpty() method is used to check whether this Arraylist is "empty" or "not empty". isEmp…

linux家用系統版本,查看linux系統版本

篇一:linux下如何查看系統和內核版本linux下如何查看系統和內核版本 1. 查看內核版本命令:1) [rootq1test01 ~]# cat /proc/versionLinux version 2.6.9-22.ELsmp (bhcompilecrowe.devel.redhat.com) (gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)) #1…

python中locked_Python鎖類| 帶示例的locked()方法

python中lockedPython Lock.locked()方法 (Python Lock.locked() Method) locked() is an inbuilt method of the Lock class of the threading module in Python. Locked()是Python中線程模塊的Lock類的內置方法。 This method returns True if the lock is acquired by a th…

rocksdb ubuntu c++源碼編譯測試

2019獨角獸企業重金招聘Python工程師標準>>> 環境: ubuntu16.4 需要安裝 snappy gflage bz2 zstd 以及g 其中zstd是facebook開放源代碼里的壓縮的庫 git clone https://github.com/facebook/rocksdb.git cd rocksdb make static_lib 成功生成 librocksd…

vs生成linux服務器程序,從Visual Studio到Linux上調試C++代碼

從Visual Studio到Linux上調試C代碼04/30/20155 分鐘可看完本文內容[原文發表時間] 2015/4/29 10:00 PM正如您可能已經聽說的那樣,Visual Studio 2015新推出了對Android開發的GDB支持。有趣的是,因為這項功能依賴GDB調試,我們完全可能稍加改動…

java clock計時_Java Clock類| 實例的Instant()方法

java clock計時Clock Class Instant()方法 (Clock Class instant() method) instant() method is available in java.time package. Instant()方法在java.time包中可用。 instant() method is used to get the current instant that is used with this Clock. Instant()方法用于…

使用國內DOCKER鏡像源

在國內,通過Docker的pull和push命令訪問hub.docker時,網絡十分慢,而且會出現各種各樣的網絡連接問題。因此這里介紹下如何使用國內的鏡像源,這里以DaoCloud為例。注冊DaoCloud用戶;注冊完成后,會進入dashboard頁面&…

linux命令top查看進程,linux 查看進程的命令(top)

標簽:top操作系統支持多任務并不是計算機同時做很多事情,而是快速的輪換著執行這些任務。linux安排不同的程序等待使用CPU。進程的工作方式:當系統啟動的時候,內核先把自己的程序初始化為進程,然后運行一個init的程序&…

stl vector 函數_vector :: back()函數以及C ++ STL中的示例

stl vector 函數C vector :: back()函數 (C vector::back() function) vector::back() is a library function of "vector" header, it is used to access the last element from the vector, it returns a reference to the last element of the vector. vector ::…

linux udp 端口 抓包,tcpdump之UDP抓包

摘要使用tcpdump抓UDP包,過濾過濾IP和port,并且自動拆分片段。安裝tcpdumpyum install -y tcpdump使用方法tcpdump -i bond0 udp port xxxx and host xxx.x.xx.xxx -s0 -G 600 -w %Y_%m%d_%H%M_%S.pcap參數說明-i 指定監聽的網卡udp 監聽UDP協議port 指定…

Vue版本過渡變化

到了2.0以后&#xff0c;有哪些變化&#xff1a; 在每個組件模板&#xff0c;不在支持片段代碼之前: <template id”aaa”><h3>我是組件</h3><strong>我是加粗標簽</strong></template> 現在: 必須有根元素&#xff0c;包裹住所有的代碼 …

NABARD的完整形式是什么?

NABARD&#xff1a;國家農業和農村發展銀行 (NABARD: National Bank for Agriculture and Rural Development) NABARD is an abbreviation of National Bank for Agriculture and Rural Development. NABARD是國家農業和農村發展銀行的縮寫 。 On 12 July 1982, it was establ…

基于opencv+Dlib的面部合成(Face Morph)

引自&#xff1a;http://blog.csdn.net/wangxing233/article/details/51549880 零、前言 前段時間看到文章【1】和【2】&#xff0c;大概了解了面部合成的基本原理。這兩天空下來了&#xff0c;于是參考【3】自己實現了下。雖然【1】和【2】已經講的很清楚了&#xff0c;但是有…

大腦應對危機的模式_危機的完整形式是什么?

大腦應對危機的模式危機&#xff1a;印度信用評級信息服務有限公司 (CRISIL: Credit Rating Information Services of India Limited) CRISIL is an abbreviation of Credit Rating Information Services of India Limited. It is an international analytic company which off…

linux網絡延遲命令,2. Linux使用ping命令查看網絡延遲

ping命令持續發送少量互聯網流量到遠程地址并報告收到回應的總時間。如果流量因為網絡故障或者錯誤配置而被丟棄&#xff0c;它也會報告。ping命令是最基本和初級的診斷網絡問題的工具之一。ping常被用來測試網絡延遲&#xff0c;但是有時ping的延遲并不是網絡引起的&#xff0…

一、簡單工廠模式

# public class Operation //基類{private double _numberA 0;private double _numberB 0;public double NumberA{get{ return _numberA; }set{_numberA value;}}public double NumberB{get{ return _numberB; }set{_numberB value;}}public virtual double GetResult(){d…

軟件生命周期模型及其類型

A life cycle model is also known as a process model. As the name suggests, the software life cycle model (or the software process model) gives us a pictorial representation of the entire software development process. 生命周期模型也稱為過程模型 。 顧名思義&…

linux查看磁盤io帶寬,[Linux] 磁盤IO性能查看和優化以及iostat命令

iostat命令:%user&#xff1a;CPU處在用戶模式下的時間百分比。%nice&#xff1a;CPU處在帶NICE值的用戶模式下的時間百分比。%system&#xff1a;CPU處在系統模式下的時間百分比。%iowait&#xff1a;CPU等待輸入輸出完成時間的百分比。%steal&#xff1a;管理程序維護另一個虛…

Jsoup 數據修改

2019獨角獸企業重金招聘Python工程師標準>>> 1 設置屬性的值 在解析一個Document之后可能想修改其中的某些屬性值&#xff0c;然后再保存到磁盤或都輸出到前臺頁面。 可以使用屬性設置方法 Element.attr(String key, String value), 和 Elements.attr(String key, S…