2020年10月16日 星期五

Yocto基本概念及介紹

Yocto詳解

參考:http://www.yoctoproject.org/docs/2.1/mega-manual/mega-manual.html#creating-a-general-layer-using-the-yocto-layer-script這篇文章第五章不錯

1.名詞解釋

  • Yocto:Yocto是這個開源項目的名稱,該項目旨在幫助我們自定義Linux系統
  • Poky:Poky有兩個含義。第一個含義是用來構建Linux的構建系統,值得注意的該Poky僅僅是一個概念,而非一個實體:它包含了BitBake工具、編譯工具鏈、BSP、諸多程序包或層,可以認為Poky即是Yocto的本質;此外Poky還有另外一層意思,使用Poky系統得到的默認參考Linux 發行版也叫Poky(當然,我們可以對此發行版隨意命名)。Poky的兩個含義千萬不能混淆
  • Metadata:元數據集,所謂元數據集就是發行版內各基本元素的描述與來源
    • Recipes:.bb/.bbappend文件,配方文件,描述了從哪獲取軟件源碼,如何配置,如何編譯。bbappend和bb的區別主要在於bbappend是基於bb的,功能是對相應的bb文件作補充和覆蓋,有點類似於“重寫”的概念
    • Class:.bbclass文件
    • Configuration:.conf文件,即配置文件,我們可以用它來改變構建方式
  • Layers:即各種meta-xxx目錄,將Metadata按層進行分類,有助於項目的維護
  • Bitbake:一個任務執行引擎,用來解析並執行Metadata
  • Output:即各種輸出image

  • 總結:假如用烹飪一桌酒席來形容構建發行版,則Yocto就是飯店名,Poky就是廚房(以及提供作為參考的菜的搭配套餐),Metadata就是烹飪資源(.bb/.bbappend表示配方/配方上的貼士,.conf表示廚房裡的管事的小組長),Layers就是菜譜的分類(如川菜譜、粵菜譜),Bitbake就是廚師,Output就是得到的一桌酒席

    2.Yocto的架構

    假設現在有一個已經構建好的Yocto環境。有關Yocto的具體操作和環境構建詳見Yocto的使用實例

  1. 注意:该目录省略了很多不必要的细节,只把重要的文件显示了出来
  2. imx6_avi_super
  3. |__Makefile
  4. |__build
  5. | |__cache
  6. | |__conf
  7. | |__bblayers.conf
  8. | |__local.conf
  9. |
  10. |__sources
  11. |__base
  12. |__cache
  13. | |__conf
  14. | |__bblayers.conf(和build目录中的一样)
  15. | |__local.conf(和build目录中的一样)
  16. |
  17. |
  18. |__meta-avi(放硬件无关的内容,主要和文件系统相关的东西)
  19. | |__classes
  20. | |__conf
  21. | | |__distro
  22. | | | |__imx6.conf
  23. | | |__layer.conf
  24. | |
  25. | |__recipes-core
  26. | | |__busybox
  27. | | |__images
  28. | | | |__avi-common-package.inc
  29. | | | |__avi-image-core.inc
  30. | | | |__avi-image-core.bb
  31. | | | |__avi-image.inc
  32. | | |__ifupdown
  33. | | |__openssh-keys
  34. | |
  35. | |__recipes-qt
  36. | |__recipes-graphics
  37. | |__recipes-devtools
  38. |
  39. |
  40. |__meta-imx6-avi
  41. | |__conf
  42. | | |__machine
  43. | | |__layer.conf
  44. | | |__include
  45. | | |__imx6-avi-super.conf
  46. | | |__imx6-avi_mini.conf
  47. | |
  48. | |__recipes-bsp
  49. | | |__u-boot
  50. | | |__u-boot-imx6-avi.bb
  51. | |
  52. | |__recipes-core
  53. | | |__images
  54. | | |__avi-image-core.bbappend
  55. | |
  56. | |__recipes-kernel
  57. | |__linux
  58. | |__linux-imx6-avi/
  59. | | |__defconfig
  60. | |__linux-imx6-avi.bb
  61. |
  62. |
  63. |__meta-Exynos-avi
  64. |__meta-qt5-avi
  65. |__meta-fsl-arm
  66. |__meta-openembedded
  67. |__meta-qt5
  68. |__poky
  69. |__meta-skeketon
  70. |__meta-yocto
  71. |__meta
  72. |__classes
  73. |__conf
  74. |__recipes-bsp
  75. |
  76. |__recipes-connectivity
  77. | |__dhcp
  78. | |__nfs-utils
  79. |
  80. |__recipes-devtools
  81. |__recipes-core
  • 假設我們的項目名稱叫imx6_avi,那麼進入我們的項目目錄,查看,其結構
  • 首先來分析一下目錄結構,不難發現主要有三級構成:meta-xxx->recipes-yyy->zzz/ttt.bb。比如:meta-avi-> recipes-core->openssh-keys
  • meta-xxx就是layer(菜譜的分類如川菜譜、粵菜譜),recipes-yyy就是Metadata(具體某一本菜譜),zzz就是菜譜上具體的一個配方
  • 從目錄中不難看出,主要有這麼幾個layer

    • meta-avi:由我們創建並維護。和avi有關的項目需要的配方。可以認為這個目錄中的配方都是通用的、與平台無關的內容
    • meta-imx6-avi:由我們創建並維護。imx6平台avi項目需要的配方
    • meta-Exynos-avi:由我們創建並維護。Exynos平台avi項目需要的配方
    • meta-qt5-avi:由我們創建並維護。avi項目中qt5需要的配方
    • meta-fsl-arm:飛思卡爾官方推出的配方大全
    • meta-openembedded:openembedded推出的配方大全
    • meta-qt5:qt5官方推出的qt5配方大全
    • poky中的一堆meta:yocto官方推出的參考配方。雖然這些meta被放在了poky裡面,但是還是不影響使用的,他們具有和上面那些meta相同的地位,如下圖

    不難看出,這裡面很多的layer只是我們照搬過來的,目的是為了借用裡面現成的配方(可以認為這些layer充當了“庫”),而真正由我們維護的僅僅是幾個名字中帶有avi的layer,而且它們是依賴於那些充當“庫”的layer的。如下圖
    【圖二】

  • 介紹完了layer,那麼問題來了,那麼是否可以認為,這些layer全部被enable了呢?答案固然是否定的,我們的項目是imx6_avi_super,顯然不可能去包含meta-Exynos-avi這個三星平台專用的layer
  • 具體的layer選擇由imx6_avi_super/sources/conf/bblayers.conf負責,直觀位置在前面目錄中可以體現。仔細觀察該文件,重點在BBLAYERS這個變量,裡面有一些layer,這些layer就被enable了。不難發現這裡面並沒有meta-Exynos-avi,這也恰好印證了我們建立開發環境(repo sync)時,從git倉庫中拉的是imx6_avi_super這個項目對應的Poky。
  1. LCONF_VERSION = "6"
  2. BBPATH = "${TOPDIR}"
  3. BSPDIR := "/home/username/yocto/imx6_avi_super"
  4. BBFILES ?= ""
  5. BBLAYERS = " \
  6. ${BSPDIR}/sources/poky/meta \
  7. ${BSPDIR}/sources/poky/meta-yocto \
  8. \
  9. ${BSPDIR}/sources/meta-openembedded/meta-oe \
  10. ${BSPDIR}/sources/meta-openembedded/meta-multimedia \
  11. ${BSPDIR}/sources/meta-qt5 \
  12. ${BSPDIR}/sources/meta-qt5-avi \
  13. \
  14. ${BSPDIR}/sources/meta-fsl-arm \
  15. \
  16. ${BSPDIR}/sources/meta-avi \
  17. ${BSPDIR}/sources/meta-imx6-avi \
  18. ---------------------
  19. 本文来自 杨YX 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yanghanxing110/article/details/77737471?utm_source=copy

 

 

  • 這些layer目前是被enable了,那麼是否可以認為,這些layer中的配方也全部被使能了呢?答案固然是否定的,我們的發行版中不可能把所有的軟件包放進去。在Yocto中,這個選擇配置操作是由好多個conf、bb文件協同完成的,並不存在一個總的大綱,這也是和buildroot最大的不同之處(buildroot是由menuconfig來進行大綱式的配置)。可以理解為Yocto是“分封制”,皇帝說的不一定能落實,具體還是各種大小地方官說了算;而buildroot是“中央集權制”,皇帝一人說了算
  • 如何理解Yocto的配置方法?這要從發行版的定制流程說起。我們的目的很簡單,是要得到uboot、kernel、rootfs這三個image;Yocto的目的也很簡單,它要經過一級一級配置,逐步縮小配方,直至得到uboot、kernel、rootfs這三個image 。每一級需要哪些配方,由該級對應的配置文件(conf/bb)決定。越上級的配置是越籠統的,越下級的配置越細緻。如果下級的配置項相對於上級有補充或者衝突,則以下級的內容為準,可以認為下級會對上級進行“重寫”。這其實有點類似交通法規
    這裡寫圖片描述
    這裡寫圖片描述
  • 有關構建的路線和流程:對於整個發行版構建,雖然每一級的配方由(conf/bb)決定,但是每一級路線和方向的選擇,是由我們最終bitbake的對象決定的,比如我們最終bitbake avi-image-core,我們想要獲得rootfs.img,那麼:

    • 第一步Poky就會從local.conf開始,一路向下,一級一級配置,直到配置到和rootfs有關的那一堆bb,最終形成完整完全的配方
    • 然後獲取配方需要的資源,比如各種軟件包,比如kernel的源碼
    • 最後把所有的資源編譯出我們需要的鏡像

  • 最後說一下bitbake,比如我們要選擇編譯rootfs.img,那麼使用bitbake avi-image-core即可,但是很多時候並不直接採用這種做法。大多數情況下我們會在項目目錄下寫一個Makefile,裡麵包含各種各樣的功能,內部以bitbake指令實現

3.配置文件詳解

上一節簡單介紹了Yocto是如何配置我們的項目,這一節開始分析具體的配置文件

  • local.conf

 


沒有留言: