# Qualcomm Linux功能

Qualcomm Linux功能包括：

- 元数据layer
- 元数据layer中的配方和配置
- 增强QualcommLinux的软件功能
- Qualcomm推出的工具
- 有关如何构建QualcommLinux映像和元数据layer
的说明

Note

Qualcomm Linux基于Yocto Kirkstone版本。

有关Yocto Project Kirkstone版本的综合文档，请参阅 [Yocto 项目文档](https://docs.yoctoproject.org/4.0.20/singleindex.html)。

Note

当您阅读本文档时，Yocto项目可能已经发布了其他 Kirkstone LTS单点版本。
本文档是指此版本发布时的最新版本。

如果您是Yocto项目的新手，请参阅 [Yocto 项目文档](https://docs.yoctoproject.org/4.0.20/singleindex.html#document-brief-yoctoprojectqs/index)。

Qualcomm Linux环境由多个社区维护的元数据layer组成，可提供配方、软件包组、映像和配置。Qualcomm Linux元数据layer堆叠在社区layer上，以提供Qualcomm参考终端所需的
其他软件组件。

## Qualcomm Linux元数据layer概述

元数据layer引入了所包含的layer在  [Qualcomm manifest](https://github.com/quic-yocto/qcom-manifest) 中。 此清单包括重现参考构建所需的所有layer。由Yocto项目维护的layer会在后续章节中进行介绍。Qualcomm维护着Qualcomm参考终端的专用layer，这些终端依赖于社区layer来实现全部功能。

下图显示了Qualcomm Linux发行版本中包含的layer：

![../../_images/qualcomm_linux_metadata_layers.png](data:image/png;base64,UklGRs4mAABXRUJQVlA4TMEmAAAvKYOoAGJh3EhSnKn8wwZfA/gdEROQJc3LskMPS3Irv9uKiRyUKgmRbgTbW9LYFsQK/dJtWFWZy7IkKduhCtMr3DB+5nKmMyI3do42168og+Cdj9F3QOWTUwqUnZiK/X+u3cZQUFDwQUFBQUFBtwV4CYFmCYtZsoN4CYG9wEDDsASaxSxmOUe68///585o7uj3f3pjw3TlnaDeG+2ou1wqnKb04rqCm15QRZO2CKcXXmGOUXovrrATJ9a2WQnxj3/84h8ncodIJBKJLGF2AA0aRBos4OYONBon2jTanOY0XNDaZDfBxeDg4OLi4I/B4GIwGIwllliDtRaLxVqDtQ72kRfWuta19l8WbatS2Jyboa6quc+uDKaA8Itn/f95biT1w+qH4Yfh0A9F4T6ECRUq3LBChQ4rVKiwM8Pv+/l+fr8qy+3avxZGlRgUqBpKyMsaF2KooEAYNyixskUI85/DVeOde0RfloK51FmD9qo9tGdmF6vRn2lRNkh7H2L/iTe6d5VuVNlc/gYS+oHwXNpL0ADD2h4xV5dUnKUMFmcZwR+LFz+8OBj8MFgMflgM1sIkgNtAkzVJkzMZL+FlDBYGBgYeS/8lQZIkt03DorwUAFVDHu+B0XL5Pf36HzLuDmwbJdHBfXfa/3f8/doSPqhrlUQDvjtsOewfKvCHkmheUyT/Sf6T/Cf5T/KfDi8Uxcf+kqBvi0x0TYGZ6W9A16PumetPMJcXzA0nkMsT5oQTxJX8J6XPeImcs5aQ67rOxdNl5SBLY4xpBqdLswRU13JVkqVxGOl0Ygqni2kWcC2SR127VUmWxtHAzNyfOCZe+zpeHdmJaRZwLRJH6arkGlYsMGY29uIUci2SNGVqYMvXkCIU+qc8GiwsxDSjQFlw2xCsePg8FOWwSzlDpOgDrkWGLuhlwRMuCDLZL02zTDekGBLg8MaXCoQUifweFHamkDQfUhHaYLuBLoh+7ucTG/y8x0l74dcCbeDoHDcIJSA2Yir7xZimGW9IZUKDOFQqEKIi8npQ2KkgIQf1wWhD7Ya6IE8jGvPCr4WyAfDcIJSQf9Xwz39zoSP/puPuWoFZjxhegrSw1oGQ04GiIGJnbWFzXYLK76HArO3GNAKscOx2Fjq7ygfQdoA20G6Yi81dps4uml7fXHA4Kb8Wysa6c5F6DEYk0fCvFzsDM2lUxVOTboiKoWJisg06MY2XH8hPS+IP6Mxeq3rGwBzp5o7g3Iw7WMXE3QWjPqqMNtSu34VQ2WigwnBdmV7XXui1QCowth49BjOUGEacqvpHsWMYUhBeA1PbzRgXtEaDGHeNbFL/0JBSNKeq9lnX5FXxcUJo12Kw3UAXA1RHmdZeOvRaINVNxPEZzGjCbKD/We/sqMiTABiMBp3NE8AoMKzeENKdmwsLEiCnMaXTWQnyYGHHTEmQd6qnA1sAG4AL/nZjCXaZi4F24VFVKr/OZnXQ8V4LHbheg3VGE6dR/RRVC2whxk2kiHEgnzx9kWonyrZjNoh0hsQ1MztxPFUVU2vYOIvxprJxEhXVzRhuN8iFRxJ/pxEHCui1QA06seM1iCdOYoqVzZq01UilYdFJeBZiitIDZKkCMiFQAQOk0PfBgu6upClC6T4TRFCwXWaDuvBrsB7FTcauhQh40ug1iCcWRAsQcI7E6RRCYWc0kG3HzJiyR6K43ul0TszM8eG2qyKWBQ6U9Y0XDZWliBNsl9mgLjxaMOFbi5Eqc1IVl98gusDGmpHNJwe2W2VA66RfEgdmJ1zsZj6aOUEthAowmQ1wEaI0npCBOypN5TMIOUYDKhiMY4pMFir5KKMikXnEQdH2ZkwOdWJ2Eknnh+tUhrnU09L+k00N0hkXNhfhbymDiDslidkILWBva03QdwLFLBBmnAqGGv/y9doHeKPHswvp8gMQakFzxN3IoHbFVriIDe7CUwCHYJmpJmEXCDHgLkk1wjaMAJaqwTSXrqtwE96OYfV3aiDCsbuwoCEU1Vq4yIm4C88ua7t6QC5S14KEXSDEwDuOJ+6w04G5P3HThGcwGmBFMhp01qCbwm9R7uI9yoGBFLktnDAbg9PqDvZfghVyx3NgPplVC8zmTTM75deCIPMLzA8jjPWB6Q0+IQZEA26+0V+oRnDbUdrU3FWPjcF6aSIu1jS0RwMCz64FDbdALGFGPBY+vwaggUoQW9cJmDcBZ31HD3VtDjDsEJR66Axg4HhBB3XnBAKlitynpihiGm7XE/BrA8wL3TFbjwoUkj8lltc918JcRn6YWSCUIjMfzmSWSYz4T5yCyPjXLsFZ73QiBEYEnDT6QkABRToUFncdCLPTQYo0K8VuiAsEUqBiJeRakPk37AIfBhIPF7Mh6XTHjICosCA4yKAIJAJ5CDA0IgWo7RCKrBS7IS5SACK/Phl4LaicTn6BKIJNdSdS3gmICguCoxmQJxOwkn6PGMA4t6YoyW6Iiwzssd/aD7oWpCt+gdFMPHz6cgrKEw7KxAApbtltl+damN74BUY/8fNJrfU68FOFC2O72uSjyQ89ylIcPZsM0SPo3j+a3BDv3k+mvBbYx/3XRGxUpVNQXes+F+dyz//Lga7/NWVGieQ/yX86YHHKZxvKs0EfAdZwmS91EXMsXI8tYEidAqxepjWgo1/8lgCrlxl2BDh/H3iEtyYM8ghunbHkP8l/kv9gAJ87zixneegl1750XVfS8qCLWo/2hPhTLnsJqDK90RUA61+Yv3D6CmuFNuApNE9LjbEEEHA3ocC6qcft+aEZZUKojEy5wlZurli0UgKiIs2HSxgyxhfghv2Nk2UZtwfQPpeaMhFUlka9sXcDoFiUYgQQ2jTz4RKGlPGFuCGBzcmQQtuj0OQSaL8JoLI0Fqy2f+l0kZgVO5dMsWBcUa3YDEESIEJgRWU6NoHwSnMJinFopkhMSFSkCa6wtqebNixFx1AAPasV5AtTMcZhS1E1qxWU6eh3o4Az5ikOnTEJy0tneraq7Q1PbH+ryNqwTF2m8cs95TchVK0HEVLHcISqBRCGKKKmaYJU9Zy2FKuTYnAE372l+agbDpwyTzEWUeS70rlgYnrcM9unLhVCfz6mWSIoqHGaEDWzEmcSXc/jkw+tP6+bYw+l8tkQKOw5Ae0BnG81IkN8uCoAD+aFrz/vccOAqSf51L8007MDUpiFqJynLrd64mt4pp0c6vYXoA22iqHC4qVWxS5+UC/muxBjGEEKTsOgkwA3kbPPsoqqP6+Uig5iGplLcDKtvpBESjfijMjBbRSFkDjdQ6CtnsQUCPYDOIRJIf78UrzUk8Q3tgeJgCKlLuOsIA7T88mp0lhEzSasbNUnn8s0XpouEnk64SyoppcOxEJnPqig5S0U0fACRwC+xz3B4wpwid2vhFIwGPY8xkunHrbnWSA+iHHYMNsnuzTpLk2yC2BsCF+AkJd6gu7QLIChPSXucqv9HHGSSpHiPnb2a1XWDiMnuof8oHs9JCDA/S8ESJ2IevquGtSrVbW9gAJQJpkFdQfTHrsOfPxuEUC8xU+a1Yappu2zO5cbt8zuD1nkHHD3E+54MuAwAS9BwxPK7vvanqq0UuYybtTRUZolhlk0KT8OURCEJsV4smEU2xYojQF4QW682TdeMmqM+yZ2k8PMzIwfhygI4k20VB8al5w9AC/EjT+j00tGjHnYiKMEMdufO+5hPu6ekTBB+wSZtydZjSBLgHXGLEwQ9w/f/H0KBal0kY07HxWpCVO881GR6knFOx9NqTOW/Cf5z4QYVKVTUF3pPrftuaPpw2/nXqIWJMDqIbP4+8Ecf5z4vJ3wGAOsRUY1ZZqP5D/JfzpusPmyGV4SYPWBl9igJhlkipKVrCiVLjSlelLHKrIsyxJk5Zyz73MXJJ/ypIcKX1oZSTwVgr5csjQWUVnjW5olpSp/Vgn3o0oIEPVUq8bUBwhMHMwq4X5UCQZUeDOz3rbwBnGJi1kl3I8qEaOHTWIQljiZVcLRqBJhvIU3IoOoxMmsEuWPKiH1ayI2mDMecTGrhJtRJYJ4CcQG6wxHHMwq4WJUCalfArHBLXVGIw5mlXA3gEFE4CEEeC25jfhIgMXoX10l4K20UZjpIUoaVQLTGy5mlXA0qkQIrwW43MXJrBJuRpUI4LUBlydyM6uEk1ElQnjtAGUUjbtZJRTaFiiNAXTMYoJ5C354g8CMDXAxq4STUSXCeUf9SAzCMtrfwawSbkaVKI1XYBDT+ftME4sXj3iWV+zQb+KtgK7VVeRN0oUdmqvH+4vQZ+Qb4+/1WFtCusvY/puM3b9JROX9kVBTlYirTpKQK0vjkw/hdoz8u1yJuLP4uy+JubZ6IIvvciXgJsvKslImpPQmwxAkSc1L5oJw+SSnT2plWZqSAHgSLBGJsail/WXcgkdwetRiWZqSoNCkfYXEWCS/X5xm2gXlYtKnRy5ZGmdt/8knzfrPIzBs3bIHZGZKCcgnt8zae07qV8BeeIuuYtkUh9gBAhdf7sHElxqXKD7EU6KXxz3APIiKYZ/OTEl+/9gjws4qldR7iNGfJ7haTbPVBPgBAuwTEleKYZ7OTBmbOGGFX1cZNS9IgfWH4ifaBFdrVn3Al1pVTYQkOvDNTEkmQfLI/P1BjJQgIvG0Z+4k1DCiPkBMU840qxp6EHRAgQx+GafI5DA9u96sHDdMzyt0JexBTTooHhYJPI3iD/35ZLkAojNTBhTOXU7Ab5ANzkEKSfPTeLztR1Wv8Zkp+RSUEmaCKpYQi2SX9nOEp7iMIwk+TA9FE231EKUPM+jpFyoir1nEVLGMBSs5EQHuzxNcJSG6/YUE+D5ObQj+rMlYWaqUspkppX66ZXYfXvxOI5BVLMmcl86hmNioIw3BVYKQ3k+CVdWpLzxzxs8Q05ISbtAgo+G4PPkGwbuwdEohZfNXejI3S0riRH+MhuPyhE4Iw1L4H6lv4GfISvzFAOVDcXlwGd4jEDMJMieM7hNNhsyepPpEkyLzjKmOy+uGVKWn1vboPo3DqxH0pJ/8Xk6X2KApM0ok/0n+03GDzbsCrJNeD9Bxey9RCxJg9VC6Wk0yyBQlK1lRKl1oSl9h6QayLMuSdHnQy+HkgEp7UMUkwatRBLxml8MMWV0bgeO0DCWAQLAYDON/HUgIR//q2jQIMxH6SpOEQLAYCON/beEI4YUgSjFqEOIiC331YkIgWQyAydJYsNq+vKR9fzo+7Nnj5xBeD3EZbWTNYHGjSAwX1pYpWkFtTzf5WtwiW7ebZDEZxNT0kinM9HJdAOGAqGmaIIWOk2eVFVt6lRVs3W7kYmi/OcMX60O1VTvABblIeD2PTz60/rwqxIdu/7ghUKrj1GSrcUGG+HA10nW7CRZj3mChl4uLXbncu6V4P6TCctZqVbVLypcE6l1fm9kDEte3W4AZ4gYLypBl7RA5uI1fERKnewD0HbZqsMJ+o97MBqogtP0i2g6rM7ZJZalTkxLyte50JH57PqSgxW4U0QS9EIuo7BKfPmzPs0h8EOOwYbavd2nSXa4ydqH7dvML1bvooiA0oa3GCvpE9ww3uhc3wm//CwEiTgRmyPrb2Ora4ifNautNENJu3DK7v9djenGj/IYJxVE0NX2cQ/Gvro2RZJRWna3eInAXZAbGkZmZPs6hkAxLf6ZlxmnJ2QXuQszgONqfO+6Rf8ltbEVunJYo8+5CzIA/f58J5hlkXqRiKgiPVM9HQ8CeT5t+nTEfv30l1/LyliixLnj5aza4WTPJsUuWxiIKGf1w01+fSDfQiWRNfG8SqCdoKkrGooS/FQDHnbt8S21R+xLehExFmTEWj1QT0Kb2ZUY3IVNRphlh4Q8Kxa72ZcY2WRpnbX/rlj2IZArLNCVzV6IKVnBVqwqEXe3LOuObxz2DGS8wEA9ibJqKyRDZ1b4cWTW6gTibp1NYsrkrPQUIV8valyPLhjcHMVVRCLOGsamUQnYRVF+iDQOcWtVpq2ekrafmriyTCMOgp4iaTWaIjkDj3JVlLlClKhFOSqew1HNXUsmZgkUaBvkbVtyP/kKq5rQMFWUY5W9yTZWiTNXclURGTUsplGG44qzSi2EAICgC4YNzQh9HG0Z4ZGY2DQAERSB8cE7o42jD4OZhNmY/yzgC4YNxYpjlXWlKTZiJQqhKp6DK0n1u23NH0y3gkwBrJ+h4bTDHoI8Aa89SFzVlmo/kP8l/Om7wPyHWZtDxsf/vH1qQAKuHjJ7kWipK/r6i1ITRlDpjyX+S/6QMwPUjKAm4JhGo4tW3ntI/23BxO0jFo289Ttquun3GyAtQKf1bzwRTrZrgKluMSZCq5bNlBI7TMpQAggAzXglaKQtFwiXZZkwCrZSAZEG09H0ZEIIAM57lISIaP86DnVFJthqTQClGDeKQQ2hD3pdBTEPMUCm0gOOI3YxJcm01JgFZJH7Ub7OAhZqgtqebtqrWNlkryG5BrfHLdbPa/ekYYiYj+qtPmvWdlSYY2uqR5YTSd2cASuzGJCBqmiZIseO0pVFXyXpZV+N3b2k8asbHO2sE7Z6gynH9eTjU8+4MMInlmARqJdL0bRZAxwlgD+B8qxEZ4sNVAXgwL3j9eY8Zwgu6PQ0kQr0fAa0KjUHfuzOAJJZjEqhdUvY2C6JG6M+rJpti0zBoJMCMbMoMWeW0Y4P668Ch9uepXVRi0/w9UZaSt1lwD3mgHkpBsB+wIUwKMRYgBcw1a3aw1btdYG3fcawSu9gllYV+T0AB8Kztb1j/H3t2kMiKt+5Q+DYLQgpa3kIRLVMBAPsF1la3erUCcZQUD5a7WI5JoCKRvc0CPSLQpLs0yS6AsSF4PhFen2ax4iqiBoZ8784ApOj2lyA0IYhYQY8y3zPYQPd6SEB4+1/wSvP6BJz9eTjdQUyZXVi+sRyTQL2dgkjeZgG5dblxy+z+npwD7n7CHU/G65Xi9eu7LvAfyH8IkNjseXcGwIyiqenjEAVBvFkxmlmhbYHSGEAXZCbApGJPSfIONwdJHpZESCIKgvgzLTNOS84eQOcxQ3l99jStAqPmMIlF1D2C8G8gUJzWhHMpWQblV7Y8fSZuF4l4kg9GoSA1YbJx56Mi1ZOKdz4qUmeseOejKbUrk/8k/5nQgqp0Cqor3ee2P3c03cu2H1WAdT7oWGLDZIh16DRoyjQfyX+S/7T1oycxzAuGfhmXsDAZYi0yyrBmMsR6cVyWF9MSnln5eXUZXg0oN8kweeNUgLWiinMtZ+ZbgPU7y8L5csRNw6splqkPAqxqZm48BVcijtg0tJIQ3ivXrWrmJFNgJeSoTcMqEcG9cs24jqO2e0glI7RXbrpzBl23KQndutsaFaFbz93WbfSAhhNFqecjW70/Fl9bYVmGKfDTrfu2LkNRciyapJvoq1vPfVu9S1BQAlAnUMCnqedjUftaYWtcmI13CvFG9owFV6o23ozmSDgKgTUPHZJstUK+PB91f8eApN6An9oMBOKJDsftngHCqB7RDdME3cKHgz2wxw2z2qgmLzpmxZpcYnY0J3/Zs/H2iD9VyBebhZg8H/UIlPHhYM/tkXh5ProDx0JEqrCcttoy7gJfQSjy7ZSAwvYMWmLK9/5pvACSr/0OcWqlIN8bz5pdFwS3ohKoAm4oidmx9o+uA4Uudu3g0KRIe2/KLnlhz+J4+UfbcrJcVCzle8XAPbwe7VLGeOtCL09fuMpcx267zkgXBeEGNPJY4XXoRN3yxVsXGq/j7R/pyrgS13HLbcfXF9Xzl2PJjFksSj9yIOOJ2f+OxMv3DsxqRc0N+5pqnwWEpo7xVk7Bcd9016/y1nHrwvCHtt86fr3Poqnz41TziGbPEJCJnBvgX/Ao5wBEou0e3rn1cCluRhBvHOsNCSiL1jEB8eAylgCCADdjOjKzy49DFARR34DmbXqLh8GjhEMT8Icf5cwEv/L06scaxy29IQFEF4KgBOBYo4XhEoZjxhfgZixH+3uO4/+tq2/AqhF/8S94lJERbM/T1AStx3mNHmcctwpW2780XCRm/UumVsHo2eMhSKJLCKw97ZBkq1VbraErqQHJMcEV1vZ001ZbjuGTPasV5AuXWq3Wl4uqWe3+dCvETaXn7/sVPIqwe8UIkhFGz0PRcVYOzP53OcceIoyfnP2O/fFk0cHIpYg2aj34l1BUVThKDQYIQxRR0zTBsaK9NKJYnRSDI/jlIqv5Qtz8W+X4FzxaVyDj7R8xRo+0leWcSgbml4GjkpP1odqqHbSGLyTOJLqGoNZ/fWj9t1WhVTDa024HgcKeE9AewPlWW8jQergqAA/eFr7+23431Y5/waNYIe0VPePlHzHGER+P7PYhmODKf8dsvF1wz9idiq5w+4Kp1RoagViDiFRh+atWq6pdoI+jeTRD/204frWl4DQMOvG7qXb8Ch7VCP976FgoYyHH97CMTB7lN7ACrCClG3FG5OD+piiExOkDBPrXngCBYD+AQ5hjiO3KQj4Gj07LmYrSjwhjmeQodT5d5arjVhE1u05IH3atycfg0bzg+g5US1dDdlZJirfuQBB63347qKDlLRTRCVZw8WlXjvsmwFl6GE+gglfBo2yTLtWoHmPZK0G1ZZRAxRncs2JUq4jKLq1LQwWj/TYLxAet1rBhtk92adJdmmQXwPgb4ZtIKvPTjsdXWVIYu+HHah8TR/4Fj+YvxiujOTnEIWMc8QkVnB7OeyYIdwSjkpQuCkIThpZZgZzoA4MN9EEPCQhw/wsTVSWHXZfGazeYkN4a9LFRZuJjwsi74NG6InPXjzEGPyiw2omdbeMoHn65QpS6g2mPh+m3HchnId5anzSrrTdJoMnYQpE1uz9kkXPA3U+448mAry11656MRIgvx1uawjIYGTPzMVHkWfAowP7TiVltrPQjyhgsF83jqtlY+XAsamdIM232tcpEJcYp8+MQBUH8STHHHlw4m1AF4AW58RCSDFPXGYnehEbgIscJlBbhZJk0nNnjw8PdNE6iaPwKHg3OouGAQSYqoSya8nJf+HGC4k2wZCQ+XHJ2P16QGw/pqlxDlpfoT2gELnpcnSB6Mxg1FRFyIY+Pu9t4xjRzcdBXgFtqOjwzkwMGmaiEMjN9j87Xukaz/bt1+v+9B0GPTqlqwoPEn2bEhArlqSkC3DUO8Cl4NDjb31cnh5roUppfYKsrsQZdi703dQ6JpCS67gButWV6D4PlNvKH7Z7qkDOqsSi/KyIZkCdmtT84zHm2YwOZmjCq53PNPsBwq8o61IozFqgbGiZQhMqnfPt9DcSyHUdfAIPq+Vy7ktj7Gt7P0III0gmNVCy3kUu2afNQeZ6WeD36kQNyECzbcQRc1hmz3YQ4ZLqTk11ogfWbfLs4KBWqeKxHjkFOg/xsxBealFqEsCM6924hOreRxUFI4Gkqv17MAD/YSXoFIeSev1MGOS4LkrrRKFQJsUotFhMXhiWotozSuY0cqlmXA1V4QSCS00JpRayBfDI+s+ioRJ3byKFCOKdUyEx3OcvzfxKgxFeYd3jHq64R0EhEJYYXXsyosWhGpZgXQSrvUVK+kl5Nd108Sfj4ZQY0sqxEndsoZZllPirmkRjpP/EcycRX73brmOPCzzQaUyUIfeEEIgt8Yq5AiHqdG8Psc1u6KoPRl3bYCMIpOYHIAp/s0Q+hLFFjqH3Ckcpg9KYdCkL0OYHIAs989EMoSyyvEe1diLitdNHhElXpFFRVus9ta+ho+qFephYkwOohs5qhX+yAcgO+hFd9oB0MO354OMC6rHr5Y1eItYm7cmt2hVjLGJbtCrFe05S5V5L/JP+ZSMdrQzlgo/eNEPggX7L5unaVQTboY0G3R41WGMlvw0Ue4Cs2X/efumLPB6jRioCniV7okC5mRBLcK+aWBjFiCOwVc800XsQS1CvWQYli2zBKQvFRUSpCYzx+EOp4NH0FwPFp+gp849X0FRGI37/0iUH8mr4iznHBV65BnwjEv+krmiay6UrwlWvQJ/7wavoK80YpqunWIfhKRpt77WOqmHZ/Kj55OH3FyFIjmm49b4y9KSrukpeINqaYmcCVszNVCYpoFIiJ7H3uWaK7zLFKRb+a2fgbd81L/OxEPsrVmapIVeh9btyDmc0xlaszVTEWoKGHKvY+F7cbXV9TTFN0/erC8wwtoEwcvBvqRGFefnx0JCFPHVYM8mn6ikjdpduV0MKmGEMBjC6XwMjzKv6EQGvK7LWvjkw7QDa/E4KTH5lZA2OeOKwQ5NP0FTF6Iggkd0HrvCmmKHIXkVoKDZ4HOgeUa4DLj8ysmde1A0WsnOi/KSNEyMYcVgbybPqKyPwfTxVpjVz2O2ov5yT4GudHjcuP87zOJDDLeb7YyHOMs8VFVx2BlpwchHbQPmpALC+fL2k08HXeQCNKEO/gsA0OK6Msmq5xnLg/f6ZN/9gEIs3M8raZqpBwCA22QTuvE+VNM1uaw2DElt6UwhxAWTlYAuTzHOGncqjVtJMl5NcQeYM67MZAZKZf01dEKBiBKlBsTgWf3s5zLYxhGDNoghSlhDiGns/B0sBM/ZFmod6aOXN1RHhU2EdAtL9X01dEKiqUIKQaOX4MmkcQScu50jKGUW5Qb6lhNlRT+LTMTIfgAJwsKidHjfYUYCyxhwYYBIdzTlGZvx+zTOVYyTTzvK0w8jnh0JpS4TtHv4EuY+NOaS7PF8kXWTV4Lk7ACH06n5Mz5UJuiammdPdmKscY1G21KaWmmZ0LTBvqHV5uIxJ3MKUajIsgjGbRlHDRw+qq8zuVpOpId3mMhIv6dqgp7AJ1NRwrk1qNj84dIQrGMTgZHMk2MDOmrihfbDQaCaymQGY25Zexqqspx/KyIIULa0MjGxVwLc8hT5Ks5kDVXdiSm/OXy6kjWpDDKkXhKJylKdKf2HaEbQzMDDUgOmqYpy0YUn63BKluEbk7R4TMSxXi0124eVMiFOUT244ceP+/XdIu+Ry5y7PkNPCVS5TaBWcvcTRUauShElS3Dv/5dUuEIv2JbcfViZbyfImf6FwrN9KpYd0lnb5cspbgm8HWACxVhQFWZXiibj2fttuHzlgo1MueneX1hrQgdhY3eO9TqhrGbG5uAPFT12o7DUBzoLaIVUMlCZ1MucPm8B5QG30eAfRR49ysMlStkK8EvZgBkRYkzqKJKcPtXLRoZFskwlhsQutQR5ROXy5ZzAlt7QFiQ8Fczwt85f2UIYzGh8OISPF5UIloC4yzuOIIom6g6qfFOd2w0wG7lMsAmY67KVXW6csgnni2pIWAzMmgCTiLA6wN87byd/1Wl7+bC8oQSCOzo2avVKJ8FEGLtMA6iyvyvNFo5DrUHAViSBTyN63ChtkapDxQPw9OloMFDUCcXH5EcBbRVp4DTT0HyxUL+VGRnytlCKSR2VEkKMrnQUBxBN5ZVIFBokOtXs8Rg/zH2KXfIDf1q5UqTUb9PDQZGevUAMxJTnCULWWwC0OrlUgA1N6fnpjV/uAQYuxrLw/M/nc0J9eTUnKa5bxO2ZEUshSNpoDaw1fPX75v1hwNiyiCyFlUUceAVC1misGb5PKBGf+e9GXFS5vclFk78VhRDMqgcL17fZSfaft9gJJ6yCnOAMQdNiklRN5MwFyVH0gKWU6b2u5wPjZvzBlFEDqLKVyQlOVWs2hK9YlY+nKZHIoVTuE1eJ3WDbNi6Uf5P5nMUzENkfZLwqAmpVQ0tw8D5qoUFLJEPqT28jUgCM84gshZBEFbbuXlHDhOiO6jJflcQc2x7/8MMYK/mq96OHtv2u2REJuUEmhC5qoUJPNT6m/SOS3ZXDFnFOEDmTP/qKiXhgwLlLXy05xkyKBy04sZmHKSxSJEa200rRpiPpH2mQxKvUz50BiIInwgcBZD6DCrd8vN6cteSsRFwqx7FTg9vZsKryBttaACbgGFosrYwC24IHAWS7xb/iibgFF5nd/lLJddvparXaYdA52Ukou0I4CMOPj49t4k4wQUQeisABSfmhdShO1/v+lE2nQE52s5F2lHRpxBag/f76CVEzujCEJncIQ1RVafLJzi+9EKlF+RRSlpSDtCnnz5PlJ73LxwMH9weMPOcooQRgZHJK6KMk9W9EDbKR4nsMMfJ4m24aiKj+AEkzXQfGZxQ8RdGgiKUhaPE9gRHCd46jdHVXwEJ5gMnE/3FsTr80UpjeN4O/xxkqwAjqr4NE4wGUqfg0/hyxVLtFeM0HSNWxQFYdq4B1IOQhVn0ahZp6CQEU14r9iF+tXR9K4VsNGnRb5bEWJt1JQZJZL/JP/pVM0NKypd72OFT9f8UeHadUPyn+Q/yX+S/0xo5wBdD/pwpS+vwjt94EEZPnGkPra7AM+wP17nSC1IyYz0WRlZpSo7cflgXjn25bvJl/51Ihsu+lpZWXn1uFeyE1NPP/p88qc5yeRAFlzpefVerxznitcu931lrI8+P3FkZiEyswRYd1eGxpjZUO4fnLuYlJi50v8ra0nNBtpeWXkmYHKm3bOL6zieId9eBOMQjHj3lbGH7rOycvH401VH/AbSiA2kEVRHKaZ+PWnV9sobWHUpXe6BrymQ9NX7vLV7JtH0htR22yuH9vQH5xTBjEBwYoD5wTk8II1I0eyeCcLQumfP0tXEVvQB9fRP3sJaztyX3OmkfhMMgiAiEJxYwYCERusZ+oPtB+fJb8HF5d2rIyQOkdB49YbYSWL1u1+DXQ4lgNJV0DZKznTRz1sqLMulba+cJaHxSDya3V1JYAvSLINTyfcdWveJi7+VV499BhKQZ67WgbZcOYTEHt11xEDDZXfhOXCZYMpGMixwbeYGJLIys49vJFTGMOtJXgzkuWOFK132mqZUukj+k/wn+U/yH+zw4qQr7VjqIt75dGblpxzph12A58IPHOlhzNN1ItjTOBDwmS5dSsfdlTfKglaemV/3IZWnsq6dcksW4lLOxe3AGHgx+rvPrGSJrg4heNk9k6+Vtn4d9eL1PzhXK9O5uzKyZnVlxe330edT93wZF7dDmPmDbm4HqWxjW6zE9esoqZXpqAKu0OWZlXFxO6QZsrkdtFLqqlyUCAlbss6htNnKu7gds7sKsrkdpHJ35dlVkz39k4trffR5K9vidhiM5naQiU2rehfHT9evI7SQrvr0J29JcEt0l21xOwxmcztg3TDp7P/JWyWuXwfXvMN1VyAxvMq3uB0aprkdiMcGyNGTIvlm2GpLrHOYJzTkxWxc4UybNKXSRfKf5D9t2PQrO5jLDRWujcNlhhXW7Kp0rZahFUr+k/wn+U+SgU8nlUQbXz31971ATXTyewUA)

**Qualcomm Linux 元数据layer**

Qualcomm Linux metadata layers and descriptions

| 元数据layer | 说明 |
| --- | --- |
| `meta-qcom-hwe` | 包含为Qualcomm设备支持构建软件组件的配方，并提供适用于 Qualcomm SoC的增值软件功能。 |
| `meta-qcom-distro` | 提供Qualcomm产品的参考分布配置。镜像配方和软件包组都在这一layer中进行定义。 |
| `meta-qcom-extras` | 注册用户的可选元数据layer。该layer支持对选定组件进行源代码编译，除此以外，这些组件将以二进制形式存在于 `meta-qcom-hwe` 中。 |
| `meta-qcom-qim-product-sdk` | 提供基于GStreamer框架的Qualcomm^®^ Intelligent Multimedia SDK（IM SDK）和AI SDK。这包括<br>一组GStreamer插件、多媒体示例应用程序和AI用例。 |
| `meta-qcom-realtime` | 为Linux内核提供补丁和配置，以便启用实时操作。 |
| `meta-qcom` | 包含Qualcomm终端支持和上游开放源码软件组件。 |
| `meta-virtualization`<br><br><br>相关详细信息，请参阅 [meta-virtualization](https://git.yoctoproject.org/meta-virtualization)。 | 包含用于构建OpenEmbedded虚拟化解决方案和虚拟化堆栈（如，dockerd和Kubernetes）的软件包。 |
| `meta-selinux`<br><br><br>相关更多信息，请参阅 [meta-selinux](https://git.yoctoproject.org/meta-selinux)。 | 启用SELinux支持。该layer包括参考SEPolicies，并提供必要的工具。要为QualcommLinux启用SELinux，请在 `meta-qcom-distro/conf/distro/include/qcom-base.inc` 中，将变量 `DEFAULT_ENFORCING` 设置为 `enforcing`。 |
| `poky/meta`<br><br><br>相关更多信息，请参阅 [poky/meta](https://git.yoctoproject.org/poky)。 | 提供构建工具和recipe文件，提供嵌入式操作系统发行版所需的各种软件组件。 |
| `meta-openembedded`<br><br><br>相关更多信息，请参阅 [meta-openembedded](https://git.openembedded.org/meta-openembedded)。 | OpenEmbedded构建系统的layer集合。 |

有关机器人layer的信息，请参阅 [QIRP layer](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-265/architecture.html#component-layers-of-the-qirp-sdk)。

## Qualcomm Linux元数据layer

以下layer表示 Qualcomm BSP元数据：

- [meta-qcom](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#meta-qcom-section)
- [meta-qcom-hwe](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#meta-qcom-hwe-section)
- [meta-qcom-realtime](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#meta-qcom-realtime-section)

`qcom-wayland` 参考分布在以下layer中得到定义：

- [meta-qcom-distro](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#meta-qcom-distro-section)

以下layer定义了QIM SDK：

- [meta-qcom-qim-product-sdk](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#meta-qcom-qim-product-sdk-section)

可选的BSP由以下元数据layer定义：

- [meta-qcom-extras](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#meta-qcom-extras-section)

### 在 Qualcomm Linux 元数据layer中使用 BitBake OVERRIDES

Qualcomm Linux 元数据layer使用 BitBake 的 OVERRIDES 机制来实现两个不同的BSP Build： `custom` 和 `base`.

启动 Qualcomm Linux 版本时，将 `QCOM_SELECTED_BSP` 变量设置为
`custom` 或 `base`。此变量定义在 `conf/machine/include/qcom-base.inc` 并默认设置为 `custom` ：

QCOM_SELECTED_BSP ??= "custom"
    Copy to clipboard

设置的 `QCOM_SELECTED_BSP` 值转换为两个 BitBake 覆盖。
下面是对应BitBake OVERRIDE的 `QCOM_SELECTED_BSP` 映射表：

| `QCOM_SELECTED_BSP` 价值 | 对应的 BitBake OVERRIDE |
| --- | --- |
| `custom` | `qcom-custom-bsp` |
| `base` | `qcom-base-bsp` |

BitBake OVERRIDE的有效值有选择地设置变量，
导致在映像中包含软件包。

Note

要熟悉 BitBake OVERRIDES，请参阅
[条件语法（覆盖）](https://docs.yoctoproject.org/bitbake/2.8/bitbake-user-manual/bitbake-user-manual-metadata.html#conditional-syntax-overrides)
和 [Yocto 项目文档](https://docs.yoctoproject.org/singleindex.html#term-OVERRIDES) 。

要试验 `base` BSP 的变体以及如何在编译时进行设置 `QCOM_SELECTED_BSP` ，
请参阅 [生成base镜像](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/github_workflow_unregistered_users.html#build-base-image) 。

Note

在此版本中， `base` BSP 支持编译时仅用 `qcs9100-ride-sx.conf` 。

最终的图像合成取决于您是为 QCOM\_SELECTED\_BSP 变量选择自定义还是 base，如下表所述：

| `QCOM_SELECTED_BSP` 变体 | 说明 |
| --- | --- |
| `custom` | 该映像包括 Qualcomm BSP 软件组件，例如 Qualcomm Adreno^™^ 图形库。 |
| `base` | 该映像包含上游软件组件，例如 Mesa 3-D 图形库。 |

查找这些 OVERRIDES 如何选择要构建的软件组件的示例，
请使用 `qcom-base-bsp` 和 `qcom-custom-bsp` 搜索代码库 `meta-qcom-hwe` 重写

### meta-qcom

`meta-qcom` 元数据layer托管在 [git.yoctoproject.org](http://git.yoctoproject.org) 和提供编译 Qualcomm OSS 的recipe。软件映像是使用
该layer的以下recipe `meta-qcom` ：

| `recipes-devtools/qdl/qdl_git.bb` | Qualcomm downloader (QDL) 刷写工具。QDL 通信<br>使用显示 ID 05c6：9008 的 USB 设备上传闪存<br>加载器并使用它来刷新图像。 |
| --- | --- |
| `recipes-support/pd-mapper/pd-mapper_git.bb` | <ul class="simple"><br><li><p>Qualcomm 保护域映射器 （pd-mapper） 应用程序<br>是保护域映射器服务的实现。</p></li><br><li><p>保护域映射器服务允许用户空间应用程序<br>访问 Qualcomm 硬件 SoC 上的远程处理器。</p></li><br></ul> |
| `recipes-support/qrtr/qrtr_git.bb` | Qualcomm QRTR 应用程序和库。 |
| `recipes-support/initrdscripts/initramfs-module-copy-modules_1.0.bb` | `initramfs-framework` 用于从中复制内核模块的模块<br>`initramfs` 更改为 `rootfs`. |

### meta-qcom-hwe

`meta-qcom-hwe` BSP 元数据层，详见 [meta-qcom-hwe GitHub](https://github.com/quic-yocto/meta-qcom-hwe)。
它为启用 Qualcomm 设备提供了额外的软件支持。

> 
> 
> - **BitBake 类**
> 
> 
>     有关BitBake课程的介绍，
> 请参阅 [类](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/classes)。
> 
> 
> 
> 
> 
> 
>     | `classes/qimage_types.bbclass` | 用于生成 VFAT 映像的实现 `oe_mkvfatfs()`<br>使用该 `mkfs.vfat` 工具。 |
>     | --- | --- |
>     | `classes/qprebuilt.bbclass` | 实现逻辑以使用预构建的包，而不是获取和编译源代码。对于任何继承 **qprebuilt** 的recipe，此类解压缩打包在 *tar.gz*  中的二进制文件并提供这些二进制文件，以供 BitBake 任务进行打包。 |
>     | `classes/qmodule.bbclass` | 默认情况下，Qualcomm BSP 通过在内核中启用 `CONFIG_MODULE_SIG_FORCE` 来对内核模块进行强制签名 。但是，某些树外模块可能未正确签名。为避免模块加载问题， `qmodule.bbclass` 检查所有提供内核模块的软件包，并对未签名的软件包进行签名。 |
> - **机器配置**
> 
> 
>     Qualcomm Linux 设备配置文件详见  [machine GitHub](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/conf/machine)。
> 
> 
>     位于目录中的 `meta-qcom-hwe/conf/machine/include` 文件定义和
> 设置所需的 BitBake 变量，机器可以常用
> 由 Qualcomm BSP 定义的配置。下表提供了
> 这些文件的概述：
> 
> 
> 
> 
> 
> 
>     | 文件 | 说明 |
>     | --- | --- |
>     | `meta-qcom/conf/machine/include/qcom-common.inc` | 此文件使用 `qcom` OVERRIDE 设置SOC\_FAMILY，允许recipe<br>实施特定于 Qualcomm BSP 的更改。 |
>     | `meta-qcom-hwe/conf/machine/include/qcom-base.inc` | 这包括文件设置 BitBake 变量，这些变量通常是<br>由 Qualcomm BSP 中定义的所有设备配置共享。<br>例如， `PREFERRED_PROVIDER` 和 `IMAGE_FSTYPES`. |
> 
> 
> 
>     **基于QCS6490的开发套件的机器配置文件**
> 
> 
> Note
> 
> 
> 对于 Qualcomm Linux 1.2 和未来版本，您必须使用新的设备配置下表中列出的文件。上一个设备配置文件， `qcm6490.conf` Qualcomm Linux 1.1 已替换为 Qualcomm Linux 1.2 的机器配置文件。
> 
> 
> 
> 
> 
> 
>     | 配置文件 | 说明 |
>     | --- | --- |
>     | `conf/machine/qcm6490-idp.conf` | 此文件用于<br>集成开发平台 （IDP） 与 QCM6490。 |
>     | `conf/machine/qcs6490-rb3gen2-core-kit.conf` | 此文件适用于基于 QCS6490<br>Qualcomm^®^ RB3 Gen 2 开发套件。 |
>     | `conf/machine/qcs6490-rb3gen2-vision-kit.conf` | 此文件适用于基于 QCS6490<br>具有低/高分辨率的 Qualcomm RB3 Gen 2 开发套件 CSI 摄像机。 |
>     | `conf/machine/include/qcom-qcs6490.inc` | 此文件定义由所有基于 QCS6490 的Qualcomm参考设备。 |
> 
> 
> 
>     **基于QCS9075的开发套件的机器配置文件**
> 
> 
> 
> 
> 
> 
>     | 配置文件 | 说明 |
>     | --- | --- |
>     | `conf/machine/qcs9100-ride-sx.conf` | 此文件适用于基于QCS9075<br>Qualcomm^®^ IQ-9100 Beta 评估套件 （EVK）。 |
>     | `conf/machine/include/qcom-qcs9100.inc` | 此文件定义的配置变量是<br>由所有基于QCS9075的开发工具包共享。 |
> 
> 
> 
>     **在** `meta-qcom-hwe` **使用Overrrides**
> 
> 
>     Qualcomm BSP 使用 BitBake OVERRIDES 来定义编译 BSP 的两种不同方法。
> 
> 
>     元数据layer派生 `MACHINEOVERRIDES` 自 `QCOM_SELECTED_BSP`
> 在文件中， `meta-qcom-hwe/conf/machine/include/qcom-base.inc` 如下所示：
> 
> 
> MACHINEOVERRIDES =. "qcom-${QCOM_SELECTED_BSP}-bsp:"
>         Copy to clipboard
> 
> 
>     在 `meta-qcom-hwe` 中的两个 MACHINEOVERRIDES 是 `qcom-custom-bsp` 和 `qcom-base-bsp`。这些overrides由设备配置文件、recipe和其他配置文件在 `meta-qcom-hwe` BSP layer 中使用。配置文件和recipe使用这些 OVERRIDE 参数来有条件地设置变量并根据需要追加任务。
> 
> 
>     在recipe和配置文件中使用 MACHINEOVERRIDES 确定最终镜像是否包括Qualcomm BSP软件组件或上游组件，基于编译时的有效OVERRIDE。
> 
> 
>     例如，PREFERRED\_PROVIDER 表示 `egl`、 `libgl`、 `libgles1`、 和 `libgles2` 设置如下：
> 
> 
> 
> 
> 
> 
>     | 有效Override | `egl`、 `libgl`、 `libgles1`、 `libgles2` 的PREFERRED\_PROVIDER |
>     | --- | --- |
>     | `qcom-custom-bsp` | `adreno` |
>     | `qcom-base-bsp` | `mesa` |
> 
> 
> 
>     在 BitBake 代码片段中，OVERRIDES 有条件地设置变量，如下所示：
> 
> 
> # Provider for Graphics Library.
>         # qcom-base-bsp uses 'mesa' as GL provider
>         GL_PROVIDER ?= "adreno"
>         GL_PROVIDER:qcom-base-bsp ?= "mesa"
>         
>         PREFERRED_PROVIDER_virtual/egl      = "${GL_PROVIDER}"
>         PREFERRED_PROVIDER_virtual/libgl    = "${GL_PROVIDER}"
>         PREFERRED_PROVIDER_virtual/libgles1 = "${GL_PROVIDER}"
>         PREFERRED_PROVIDER_virtual/libgles2 = "${GL_PROVIDER}"
>         
>         PREFERRED_PROVIDER_virtual/egl-native      = "mesa-native"
>         PREFERRED_PROVIDER_virtual/libgl-native    = "mesa-native"
>         PREFERRED_PROVIDER_virtual/libgles1-native = "mesa-native"
>         PREFERRED_PROVIDER_virtual/libgles2-native = "mesa-native"
>         Copy to clipboard
> 
> 
> Note
> 
> 
> 在此版本中， `qcom-base-bsp` OVERRIDE 仅针对 `qcs9100-ride-sx.conf`。
> 
>     - **内核命令行**
> 
> 
>         `meta-qcom-hwe/conf/machine/include/qcom-qcs6490.inc` 和 `meta-qcom-hwe/conf/machine/include/qcom-qcs9100.inc` 包含文件
> 使用变量 `KERNEL_CMDLINE_EXTRA` 设置内核命令行参数，如下所示：
> 
> 
> Tab qcom-qcs6490.inc
> Tab qcom-qcs9100.inc
> 
> 以下代码片段来自该 `qcom-qcs6490.inc` 文件：
> 
> 
> DBG_CMDLINE = "${@oe.utils.conditional（'DEBUG_BUILD'，'1'，'reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP，zs_handle，zspage;FZPU'，''，d）}"
>             
>             # Additional Kernel cmdline parameters for performance optimizations
>             CONSOLE_CMDLINE = "${@oe.utils.conditional（'PERFORMANCE_BUILD'，'1'，'console='，'console=ttyMSM0,115200n8 earlycon'，d）}"
>             
>             KERNEL_CMDLINE_EXTRA ?= "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 no-steal-acc vfio_iommu_type1.allow_unsafe_interrupts=1"
>             Copy to clipboard
> 
> 以下代码片段来自该 `qcom-qcs9100.inc` 文件：
> 
> 
> DBG_CMDLINE = "${@oe.utils.conditional（'DEBUG_BUILD'，'1'，'reboot=panic_warm page_owner=on qcom_scm.download_mode=1 slub_debug=FZP，zs_handle，zspage;FZPU'，''，d）}"
>             
>             # Additional Kernel cmdline parameters for performance optimizations
>             CONSOLE_CMDLINE = "${@oe.utils.conditional（'PERFORMANCE_BUILD'，'1'，'console='，'console=ttyMSM0,115200n8 earlycon'，d）}"
>             
>             KERNEL_CMDLINE_EXTRA ?= "root=/dev/disk/by-partlabel/system rw rootwait ${CONSOLE_CMDLINE} pcie_pme=nomsi net.ifnames=0 pci=noaer kpti=off kasan=off kasan.stacktrace=off swiotlb=128 ${DBG_CMDLINE} mitigations=auto kernel.sched_pelt_multiplier=4 rcupdate.rcu_expedited=1 rcu_nocbs=0-7 no-steal-acc vfio_iommu_type1.allow_unsafe_interrupts=1"
>             Copy to clipboard
>     - **包含 DTB**
> 
> 
>         为确保包含正确的设备树二进制文件 （DTB），请 `KERNEL_DEVICETREE` 变量是有条件地使用 OVERRIDES 机制。这是在每个人内部管理的中的 `meta-qcom-hwe/conf/machine` 设备配置文件。
> 
> 
>         在机器配置文件中， `KERNEL_DEVICETREE` 设置了
> 自定义变体与基本变体不同。以下示例提供
> 有关设备配置文件如何选择 DTB 的信息：
> 
> 
> Tab linux-qcom-base
> Tab linux-qcom-custom
> 
> 以下代码块演示如何显式设置
> KERNEL\_DEVICETREE 为 `linux-qcom-base`，这会导致
> 使用上游 DTB 的基本变体：
> 
> 
> KERNEL_DEVICETREE：pn-linux-qcom-base = " \
>                                  qcom/qcs6490-rb3gen2.dtb \
>                                  "
>             Copy to clipboard
> 
> 以下代码块显示了如何 `KERNEL_DEVICETREE`
> 否则设置：
> 
> 
> KERNEL_DEVICETREE = " \
>                                  qcom/qcs6490-addons-rb3gen2.dtb \
>                                  qcom/qcs5430-fp1-addons-rb3gen2.dtb \
>                                  qcom/qcs5430-fp2-addons-rb3gen2.dtb \
>                                  "
>             Copy to clipboard
>     - **包含其他的 DTBO**
> 
> 
>         包括要覆盖的其他设备树覆盖 （DTBO）
> 在内核设备树上，使用 `KERNEL_TECH_DTBOS` 变量
> 列出 DTBO 名称。
> 
> 
> Note
> 
> 
> 只有 `custom` build 变体支持 DTBO 叠加。
> 
> 
>         以下示例来自 `qcs6490-rb3gen2-core-kit.conf` shows
> 如何使用 DTBO。
> 
> 
> KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
>                qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
>                qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
>                qcm6490-video.dtbo \
>                "
>             KERNEL_TECH_DTBOS[qcs5430-fp1-addons-rb3gen2] = " \
>                qcs5430-graphics.dtbo qcm5430-camera-rb3.dtbo \
>                qcs5430-wlan-rb3.dtbo qcm6490-bt.dtbo \
>                qcm6490-display-rb3.dtbo qcm6490-video.dtbo \
>                "
>             KERNEL_TECH_DTBOS[qcs5430-fp2-addons-rb3gen2] = " \
>                qcs5430-graphics.dtbo qcm5430-camera-rb3.dtbo \
>                qcs5430-wlan-rb3.dtbo qcm6490-bt.dtbo \
>                qcm6490-display-rb3.dtbo qcm6490-video.dtbo \
>                "
>             
>             KERNEL_TECH_DTBO_PROVIDERS = "\
>                btdevicetree \
>                cameradtb \
>                displaydevicetree \
>                graphicsdevicetree \
>                videodtb \
>                wlan-devicetree \
>                "
>             Copy to clipboard
> - **固件recipe**
> 
> 
>     Qualcomm Linux 固件recipe， 详见 [recipe-firmware GitHub](https://github.com/quic-yocto/meta-qcom-hwe/tree/kirkstone/recipes-firmware) 。
> 同步 Qualcomm Linux 源代码后，固件recipe在以下目录中可用：
> `<workspace>/layers/meta-qcom-hwe/recipes-firmware/firmware`
> 
>     - **关键启动二进制文件**
> 
> 
>         需要关键的引导固件映像才能引导内核
> 装置。以下固件recipe提供特定于硬件的 SoC
> 启动固件：
> 
> 
> 
> 
> 
> 
>         | `firmware-qcom-bootbins_1.0.bb` | 处理关键问题的获取、解压缩和部署<br>启动兼容目标的固件二进制文件。<br>QCS6490和QCS9075所需的启动固件<br>基于机器的机器由 `QCM6490_bootbinaries.zip`<br>和 `QCS9100_bootbinaries.zip` 文件。 |
>         | --- | --- |
> 
> 
> 
>         生成生成后，这些固件二进制文件.zip文件
> 可用于在以下目录中刷新：
> 
> 
>         `<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/<machine-name>/<image-name>/`
>     - **子系统固件二进制文件**
> 
> 
>         Qualcomm Linux 包含加载和运行的固件二进制文件
> 相应的子系统。作为 Qualcomm 硬件 SoC 的启动，单独的
> 子系统在复位时执行固件：
> 
> 
> 
> 
> 
> 
>         | `firmware-qcom-hlosfw_1.0.bb` | 处理子系统的获取、解压缩和安装<br>固件二进制文件，例如 aDSP、cDSP、调制解调器和 WLAN。<br>基于 QCM6490 和 QCS9075 的设备固件文件<br>被打包成 `QCM6490_MSL.zip` 和 `QCS9100_HSP.zip` 。 |
>         | --- | --- |
> 
> 
> 
>         该 `firmware-qcom-hlosfw_1.0.bb` recipe执行以下操作：
> 
> 
> 
> > 
> > 
> > 1. 根据SRC\_URI从远程服务器获取子系统固件二进制文件。
> >         2. 解压缩 .zip 文件。
> >         3. 在 中 `rootfs` 安装固件。
>     - **DSP 库**
> 
> 
>         用户空间实用程序是指 DSP 库，这些库必须
> 在图像中 `rootfs` 可用。
> 以下固件recipe提供特定于硬件 SoC 的 DSP 库：
> 
> 
> 
> 
> 
> 
>         | `firmware-qcom-dspso_1.0.bb` | 处理对 DSP 库的获取、解包和安装。<br>基于 QCS6490 和 QCS9075 的机器的库已打包<br>in `QCM6490_dspso.zip` 和 `QCS9100_dspso.zip` files。 |
>         | --- | --- |
> 
> 
> 
>         该 `firmware-qcom-dspso_1.0.bb` recipe执行以下操作：
> 
> 
> 
> > 
> > 
> > 1. 根据SRC\_URI从远程服务器获取 DSP 库。
> >         2. 解压缩 .zip 文件。
> >         3. 在 中 `rootfs` 安装 DSP 库。
>     - **安装 boot、subsystem 和 dspso**
> 
> 
>         当 Qualcomm Linux 编译完成时，编译系统使用固件recipe根据 <cite>MACHINE_EXTRA_RDEPENDS</cite> 的配置来部署预编译固件。这是在设备的配置文件中设置的。例如，在 `qcom-qcs6490.inc` 中，下面的例子将 `packagegroup-firmware-qcm6490` 包含在变量 `MACHINE_EXTRA_RDEPENDS` 中：
> 
> 
> MACHINE_EXTRA_RDEPENDS += " \
>                packagegroup-firmware-qcm6490 \
>                "
>             Copy to clipboard
> 
> 
> Note
> 
> 
> 该 `packagegroup-firmware-qcm6490` recipe存在于
> `<workspace>/layers/meta-qcom-hwe/recipes-firmware/packagegroups/` 目录。
> 它将固件recipe分组以生成映像。
> 
> 
>         构建 Qualcomm Linux 时，基于机器中的配置
> 配置和软件包组recipe文件，相应的固件
> recipe来自 `<workspace>/layers/meta-qcom-hwe/recipes-firmware/firmware`
> 目录已构建。
> - **内核recipe**
> 
> 
>     Qualcomm Linux 使用的 Linux 内核recipe在
> `<workspace>/layers/meta-qcom-hwe/recipes-kernel/linux`.
> 
> 
>     Qualcomm Linux 支持长期支持 （LTS） Linux 内核 v6.6.x。
> 在该 `meta-qcom-hwe` layer中，有两个不同的内核recipe：
> 
>     - `linux-qcom-custom_6.6.bb` recipe支持自定义 BSP 并从 `qcom.git` ， `git.codelinaro.org` 获取内核源代码 。
>     - `linux-qcom-base_6.6.bb` recipe支持基础 BSP 并检索
> 内核源代码来自 `linux.git` 托管在 `git.kernel.org`.
> 
> 
> 
> Tab linux-qcom-custom\_6.6.bb
> Tab linux-qcom-base\_6.6.bb
> 
> inherit kernel
>         
>         COMPATIBLE_MACHINE = "(qcom)"
>         
>         SRC_URI = "git://git.codelinaro.org/clo/la/kernel/qcom.git;protocol=https;rev=350dfd604d2ffbe0cac99bf3459b49114aad11f4;branch=kernel.qclinux.1.0.r1-rel \
>                  ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', ' file://selinux.cfg', '', d)} \
>                  ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', ' file://selinux_debug.cfg', '', d)} \
>                  "
>         
>         S = "${WORKDIR}/kernel"
>         
>         KERNEL_CONFIG ??= "qcom_defconfig"
>         Copy to clipboard
> 
> inherit kernel
>         
>         COMPATIBLE_MACHINE = "(qcom)"
>         
>         SRC_URI = " git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git;protocol=https;branch=linux-6.6.y \
>                     file://qcom.cfg \
>                  "
>         # Apply qcom patches
>         require ${BPN}-${PV}/configs.inc
>         require ${BPN}-${PV}/devicetree.inc
>         require ${BPN}-${PV}/drivers.inc
>         require ${BPN}-${PV}/dt-bindings.inc
>         require ${BPN}-${PV}/tools.inc
>         
>         KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom.cfg"
>         
>         S = "${WORKDIR}/git"
>         Copy to clipboard
> 
> 
>     设备配置文件使用 OVERRIDES 选择适当的内核recipe变体。例如， 当您选择 <cite>base</cite> 变体时，<cite>qcom-qcs9100.inc</cite> 文件选择 `linux-qcom-base` 。如果你选择 <cite>custom</cite> 变体，内核是使用 `linux-qcom-custom` recipe，如以下代码片段所示：
> 
> 
> PREFERRED_PROVIDER_virtual/kernel ?= "linux-qcom-custom"
>         PREFERRED_PROVIDER_virtual/kernel:qcom-base-bsp ?= "linux-qcom-base"
>         Copy to clipboard
> 
> 
>     **内核配置**
> 
> 
>     Qualcomm Linux 内核recipe使用一组不同的内核和 `base` 变体的配置和片段 `custom` 。
> 
> 
> 
> 
> 
> 
>     | 变体 | 配置和片段文件 |
>     | --- | --- |
>     | `base` | `defconfig`, `qcom.cfg` |
>     | `custom` | `qcom_defconfig`, `qcom_addons.config`, `selinux.cfg`,<br>`qcom_debug.config`, `qcom_addons_debug.config`, `selinux_debug.cfg` |
> 
> 
> 
>     用于 `custom` 变体的 `defconfig` 和 `fragments` 在下表中说明：
> 
> 
> 
> 
> 
> 
>     | 内核配置文件 | 说明 |
>     | --- | --- |
>     | `<kernel_src>/arch/arm64/configs/qcom_defconfig` | 符合产品/性能需求的基本配置 |
>     | `<kernel_src>/arch/arm64/configs/qcom_debug.config` | 调试配置片段 |
>     | `<kernel_src>/arch/arm64/configs/qcom_addons.config` | 在与上游一致的基本配置之上增加的 Qualcomm 下游配置 |
>     | `<kernel_src>/arch/arm64/configs/qcom_addons_debug.config` | 启用 Qualcomm 下游调试 |
> 
> 
> 
>     Qualcomm Linux `custom` 变体recipe `linux-qcom-custom_6.6.bb` 进一步支持 `perf` 和 `debug` 变体。使用 `linux-qcom-custom_6.6.bb` 编译kernel的默认方法是 `perf`。
> 
> 
> 
> 
> 
> 
>     | 编译版本 | Defconfig/config 文件 |
>     | --- | --- |
>     | `Perf` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_defconfig</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_addons.config</span></code></p></li><br></ul> |
>     | `Debug` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_defconfig</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_debug.config</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_addons.config</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">arch/arm64/configs/qcom_addons_debug.config</span></code></p></li><br></ul> |
> 
> 
> 
>     要使用 `linux-qcom-custom_6.6.bb` 编译调试内核映像，请使用在 shell 中将 DEBUG\_BUILD 设置为 1。
> 
> 
>     此选择在以下代码中有效：
> 
> 
> KERNEL_CONFIG ??= "qcom_defconfig"
>         
>         KERNEL_CONFIG_FRAGMENTS:append = " ${S}/arch/arm64/configs/qcom_addons.config"
>         KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_debug.config', '', d)}"
>         KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_addons_debug.config', '', d)}"
>         
>         # Enable selinux support
>         SELINUX_CFG = "${@oe.utils.vartrue('DEBUG_BUILD', 'selinux_debug.cfg', 'selinux.cfg', d)}"
>         KERNEL_CONFIG_FRAGMENTS:append = " ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', '${WORKDIR}/${SELINUX_CFG}', '', d)}"
>         Copy to clipboard
> 
> 
>     要自动加载 Qualcomm 平台的内核模块，请更新 KERNEL\_MODULE\_AUTOLOAD Qualcomm Linux 内核recipe中的变量。
> 例如，CoreSight 和 STM 模块按如下方式自动加载：
> 
> 
> KERNEL_MODULE_AUTOLOAD += "coresight coresight-tmc coresight-funnel"
>         KERNEL_MODULE_AUTOLOAD += "coresight-replicator coresight-etm4x coresight-stm"
>         KERNEL_MODULE_AUTOLOAD += "coresight-cti coresight-tpdm coresight-tpda coresight-dummy"
>         KERNEL_MODULE_AUTOLOAD += "coresight-remote-etm coresight-tgu"
>         KERNEL_MODULE_AUTOLOAD += "stm_core stm_p_ost stm_console stm_heartbeat stm_ftrace "
>         Copy to clipboard
> - **许可证**
> 
> 
> 
> > 
> > 
> > `meta-qcom-hwe` 中的recipe的许可证列在 `<workspace>/meta-qcom-hwe/files/common-licenses`。
> 
> 
> 
> common-licenses/
>         ├── BSD-3-Clause-Clear
>         ├── GPLv2.0-with-linux-syscall-note
>         └── Qualcomm-Technologies-Inc.-Proprietary
>         Copy to clipboard
> 
> 
>     Yocto 可以根据图像创建自动创建 SPDX SBOM 文档。
> 若要启用此功能，请按 `local.conf` 如下方式继承 `create-spdx` 类：
> 
> 
> INHERIT += "create-spdx"
>         Copy to clipboard
> 
> 
>     继承类后，可以使用
> BitBake 命令：
> 
> 
> bitbake qcom-multimedia-image
>         Copy to clipboard
> 
> 
>     可以在以下目录中找到 SPDX 输出：
> 
>     - 对于每个recipe，生成的文件可在
> `tmp/deploy/spdx/<machine>` 目录。
>     - 顶级 SPDX 输出文件位于目录中 `tmp/deploy/images/MACHINE/<image-recipe>-<MACHINE>.spdx.json` 。

### meta-qcom-distro

此layer提供 Qualcomm 的参考分布配置
产品。镜像recipe和软件包组在该layer定义。

- **BitBake 类**

    下表介绍了 BitBake 类，
可在以下位置获得：
[类](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/classes)。

    Qualcomm Linux 支持用于设备访问的 SSH 和 UART 串行 shell。您可以选择 SSH 或 UART 来访问设备。您还可以使用 ADB 用于在 IP 接口关闭时调试问题或传输大文件。

    | `image-adbd.bbclass` | `image-adbd.bbclass` 安装 adbd 中的 `meta-qti-distro` 类<br>在图像中。adbd 守护程序保持禁用状态，除非<br>`IMAGE_FEATURES` 包含该 `enable-adbd` 功能。<br>您可以通过手动删除来禁用 adbd `/var/usb-debugging-enabled`<br>从 `rootfs`. |
    | --- | --- |
    | `image-qcom-deploy.bbclass` | 部署<br>`<workspace>/build-<distro>/tmp-glibc/deploy/images/<machine>/<image-name>`.<br>生成的映像部署在子目录中 `<image-name>` 。 |
- **Distro 配置**

    下表提供了distro配置的介绍，详见 [Distro GitHub](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/conf/distro)。

    | `conf/distro/qcom-wayland.conf` | 此发行版配置文件定义 `qcom-wayland` distro。<br>您可以在以下示例命令中使用此文件。<br><br><br><br>> <br>> <br>> MACHINE=qcs6490-rb3gen2-core-kit DISTRO=qcom-wayland QCOM_SELECTED_BSP=base source setup-environment<br>>         Copy to clipboard<br><br><br><br>`meta-qcom-distro/conf/distro/include/qcom-base.inc` 配置<br>定义通用DISTRO\_FEATURES并添加以下功能：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">wayland</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">vulkan</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">opengl</span></code></p></li><br>> </ul><br><br><br><br>Yocto 项目文档定义了这些distro功能，网址为<br>[Distro功能](https://docs.yoctoproject.org/4.0.20/singleindex.html#distro-features)。 |
    | --- | --- |
    | `conf/distro/include/qcom-base.inc` | INIT\_MANAGER设置为 `systemd`。<br>有关 INIT\_MANAGER 的 Yocto 项目文档，<br>见 [INIT_MANAGER](https://docs.yoctoproject.org/4.0.20/singleindex.html#term-INIT_MANAGER)。<br>启用的其他 DISTRO\_FEATURES 包括：<br><br><br>DISTRO_FEATURES:append = " pam overlayfs acl xattr selinux ptest security virtualization"<br>        Copy to clipboard<br><br><br>要了解这些DISTRO\_FEATURES的目的，请参阅<br>[Distro功能](https://docs.yoctoproject.org/4.0.20/singleindex.html#distro-features)。<br><br><br>此文件选择 `systemd` 为INIT\_MANAGER和 `udev` 设备管理器。 |
    | `conf/distro/include/qcom-security_flags.inc` | 此文件包含<br>[安全标志](https://git.yoctoproject.org/poky/tree/meta/conf/distro/include/security_flags.inc?h=kirkstone)。 |
- **软件包组**

    包组在 和 `meta-qcom-distro` 中 `meta-qcom-hwe` 定义。
这些软件包组可帮助你了解这些功能
由Qualcomm BSP 定义。

    | `packagegroup-qcom.bb` | 包含所有基本软件包的软件包组 |
    | --- | --- |
    | `packagegroup-qcom-multimedia.bb` | 包含用于启用多媒体支持的软件包的软件包组：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-container</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-audio</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-bluetooth</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-camera</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-display</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-fastcv</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-graphics</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-k8s</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-opencv</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-sensors</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-video</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">python3-docker-compose</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">camera-server</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-test-pkgs.bb` | 包含测试包的包组 |
- **镜像recipe**

    `meta-qcom-distro` Qualcomm Linux 元数据layer定义了镜像recipe，见 [recipes-products GitHub](https://github.com/quic-yocto/meta-qcom-distro/tree/kirkstone/recipes-products/images) 。
下表列出了各种图像、它们的 `IMAGE_FEATURES` 和图像提供的功能：

    | 镜像recipe | 镜像说明 |
    | --- | --- |
    | `qcom-minimal-image.bb` | 定义要引导到 shell 的小型 `rootfs` 。<br><br><br>启用如下 `IMAGE_FEATURES` ：<br><br><br>IMAGE_FEATURES += "splash tools-debug debug-tweaks enable-adbd read-only-rootfs"<br>        Copy to clipboard<br><br><br>`IMAGE_FEATURES` 有关 的更多信息，请参阅 [镜像特性](https://docs.yoctoproject.org/4.0.20/singleindex.html#image-features)。 |
    | `qcom-console-image.bb` | 通过添加更多包进行扩展 `qcom-minimal-image`<br>并启用更多 `IMAGE_FEATURES`：<br><br><br>IMAGE_FEATURES += "package-management ssh-server-openssh"<br>        Copy to clipboard |
    | `qcom-multimedia-image.bb` | 需要DISTRO\_FEATURE Wayland，它包括中 `rootfs` 的所有多媒体包。 |
    | `qcom-multimedia-test-image.bb` | 包括要测试 `qcom-multimedia-image` 的  `rootfs` 测试包。 |
    | `qcom-multimedia-crossesdk-image.bb` | 生成 eSDK `qcom-multimedia-image`。 |
    | `qcom-guestvm-image.bb` | 基于内核的最小虚拟机 （KVM） 映像，支持启动到 shell。 |
- **QDL 刷写工具**

    QDL 是一种用于通信的闪烁工具
使用 ID `05c6:9008` 的 USB 设备将闪存加载程序上传到
装置。闪存加载程序将映像闪存到通用闪存 （UFS）
或设备内置的嵌入式多媒体卡 （eMMC）。

    有两种方法可以在主机上设置 QDL 工具：

    - **默认情况下，QDL 工具是在 Qualcomm Linux 工作区中编译的**

        为方便起见，QDL 工具已集成到构建工作流中。
QDL recipe可在 `<workspace>/meta-qcom/recipes-devtools/qdl/qdl_git.bb` 中找到。
此recipe获取并编译 QDL 工具，之后您可以
BitBake recipe。

        默认 `image-qcom-deploy.bbclass` 集成 QDL 工具，使用此类来确保
QDL 是在构建映像时生成的：

DEPENDS:append = " \
               python3-native \
               qdl-native \
               "
            Copy to clipboard

        构建映像时，QDL 二进制文件将在
`<workspace>/build-<distro>/tmp-glibc/deploy/image/<MACHINE>/<IMAGE>` 目录。
此 QDL 二进制文件适用于主机体系结构。

    - **将 QDL 工具构建为独立项目**

        克隆源项目，安装开发依赖项，然后编译
QDL 中。

        在主机上，运行以下命令：

sudo apt-get install git libxml2-dev libusb-1.0-0-dev pkg-config
            git clone --depth 1 --branch master https://github.com/linux-msm/qdl
            CD QDL
            make
            Copy to clipboard

        以这种方式编译的 QDL 可以复制并四处移动
您的主机，因为它链接到动态链接器，网址为
`/lib64/ld-linux-x86-64.so.2`，这是主机的本机
你正在使用。

    **运行 QDL 的前提条件**

    - 使用 QDL 需要在主机上满足一次性先决条件
闪光。

        确保主机正确枚举
QDL 闪烁，执行以下操作：

        1. 将目录更改为 `/etc/udev/rules.d`。
        2. 创建在此目录中命名 `51-qcom-usb.rules` 的文件。
        3. 在 `51-qcom-usb.rules` 文件中添加以下行：

SUBSYSTEMS=="usb"， ATTRS{idVendor}=="05c6"， ATTRS{idProduct}=="9008"， MODE="0666"， GROUP="plugdev"
                Copy to clipboard
    - 验证主机是否正在运行 `ModemManager`。

Note

每次使用 QDL 时都要验证这一点。

        一些 Linux 发行版附带 `ModemManager` 了 ，它是用来配置移动宽带的工具。当基于Qualcomm硬件SoC的设备以 USB 模式连接，它将被标识为Qualcomm调制解调器并且 `ModemManager` 会尝试配置设备。

        干扰 `ModemManager` QDL 闪烁。因此，如果你正在 `ModemManager` 运行，您必须在之前禁用它连接您的测试设备。您可以在 Linux 发行版上停止 `ModemManager` 通过 `systemd` 使用 `systemctl` 。确定如何使用 `ModemManager`
QDL 闪烁，请参阅 [QDL 和 ModemManager](https://docs.qualcomm.com/doc/80-70015-27SC/topic/debug.html#qdl-and-modemmanager)。

    **使用QDL刷写**

    若要运行 QDL 工具，请使用以下通用命令：

QDL <flash-programmer-binary> [<rawprogram xml=""> <patch xml="">]</patch></rawprogram>
        Copy to clipboard

    此示例泛型输入显示 QDL 工具需要三个
输入文件的类型。所有这些输入文件都是在
`<workspace>/build-<distro>/tmp-glibc/deploy/image/<MACHINE>/<IMAGE>` 目录。当
映像recipe成功完成，您必须执行以下步骤
刷新设备。

    如果要使用生成的 QDL 作为
build，将目录更改为
`<workspace>/build-qcom-wayland/tmp-glibc/deploy/image/<MACHINE>/<IMAGE>`，作为 Qualcomm Linux
工作流在此路径上生成和部署 QDL。例如：

cd <workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-multimedia-image/
        Copy to clipboard

    运行如下刷写命令：

./qdl prog_firehose_ddr.elf rawprogram*.xml patch*.xml
        Copy to clipboard

    **不要将 QDL 复制到其他位置**

    不要复制或移动 QDL 二进制文件
`<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-multimedia-image/`,
它是作为 Qualcomm Linux 构建工作流程的一部分构建的。由于其依赖性，请确保从其当前位置使用它。
如需了解这些依赖项，可运行以下命令：

file QDL
        Copy to clipboard

    输出如下：

qdl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter
&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/sysroots-uninative/x86\_64-linux/lib/ldu0002linux-x86-64.so.2,
BuildID[sha1]=430c23d51190ef6c225586c5d63d2a7c9cd50430, for GNU/Linux
3.2.0, stripped

    此输出显示存在对
`<workspace>/build-test-distro/tmp-glibc/sysroots-uninative/x86_64-linux/lib/ld-linux-x86-64.so.2`,
这是由于 Qualcomm Linux 构建 QDL 的方式。若要独立运行 [QDL，请参阅独立 QDL](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#qdl-as-standalone)。
- **QDL 高级选项**

    QDL 支持作为可选标志传递给的高级选项
QDL 从命令行。这些高级选项在
下表：

    | 选项 | 说明 |
    | --- | --- |
    | `--debug` | 在刷写映像时打印调试日志。 |
    | `--storage <emmc|nand|ufs>` | 该选项用于定义存储类型。如果未提供该选项，QDL 将检测存储类型。 |
    | `--finalize-provisioning` | 关于 UFS 存储不可撤销的一次性配置 (OTP)。使用以下安全机制来防止意外的设备锁定：<br><ul class="simple"><br><li><p>除非您打算锁定设备，否则请在 XML 中设置 <code class="docutils literal notranslate"><span class="pre">bConfigDescrLock</span> <span class="pre">=</span> <span class="pre">0</span></code> ，并且不要使用命令行参数 <code class="docutils literal notranslate"><span class="pre">--finalize-provisioning</span></code>。</p></li><br><li><p>如果要执行 OTP，请确保 XML 包含该 <code class="docutils literal notranslate"><span class="pre">bConfigDescrLock</span> <span class="pre">=</span> <span class="pre">1</span></code> 属性并提供命令行参数 <code class="docutils literal notranslate"><span class="pre">--finalize-provisioning</span></code>。</p></li><br></ul><br><br>Note<br><br><br>如果命令行参数与 XML 不匹配，则不执行预配。 |
    | `--include` | 指向镜像所在的路径。默认情况下，它为 NULL，即图像存在于同一位置。这很有用<br>当 QDL 构建为独立时， `--include` 用于指向存在图像的路径。 |

    标志的使用示例：

<Path-to-QDL-dir>/qdl --storage ufs --include <AN images="" dir="">/qcm6490_images/qcom-multimedia-image  <AN images="" dir="">/qcm6490_images/qcom-multimedia-image/prog_firehose_ddr.elf  <AN images="" dir="">/qcm6490_images/qcom-multimedia-image/rawprogram*.xml  <AN images="" dir="">/qcm6490_images/qcom-multimedia-image/patch*.xml</AN></AN></AN></AN></Path-to-QDL-dir>
        Copy to clipboard

### 编译 Qualcomm Linux

`meta-qcom` ， `meta-qcom-hwe` 和 `meta-qcom-distro` 部分说明了设备配置、distro配置、镜像recipe和 OVERRIDES。

[下表](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#qcom-selected-bsp) 列出了可以为 `MACHINE`、 `DISTRO` 和 `QCOM_SELECTED_BSP` 设置的值。
若要配置环境，请使用这些值并运行以下命令：

MACHINE=<machine configuration name> DISTRO=<Distro name> QCOM_SELECTED_BSP=<variant name> source setup-environment
    Copy to clipboard

下表列出了根据所选的 `MACHINE`、 `DISTRO` 和 `QCOM_SELECTED_BSP` 来选择和生成镜像时可能产生的镜像recipes。
运行以下命令：

bitbake <image recipe name>
    Copy to clipboard

| `QCOM_SELECTED_BSP`<br><br>（由您选择） | 有效的 BitBake Override<br><br>（由 `QCOM_SELECTED_BSP` 产生） | 设备配置<br><br>（由您选择） | 参考 DISTRO 配置<br><br>（由您选择） | 镜像recipe<br><br>（由您选择） |
| --- | --- | --- | --- | --- |
| `custom` | `qcom-custom-bsp` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-core-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-wayland</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-robotics-ros2-humble</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-minimal-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-console-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-test-image</span></code></p></li><br></ul> |
| `base` | `qcom-base-bsp` | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-core-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcs6490-rb3gen2-vision-kit.conf</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-wayland</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-robotics-ros2-humble</span></code></p></li><br></ul> | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-minimal-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-console-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-image</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">qcom-multimedia-test-image</span></code></p></li><br></ul> |
|  |  |  |  |  |

要了解有关构建 Qualcomm Linux 的支持组合的更多信息，请参阅 Qualcomm Linux。
[Qualcomm Linux 发行说明](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-240929204440)。

有关详细的构建说明，请参阅
[适用于未注册用户的 GitHub 工作流](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/github_workflow_unregistered_users.html)。

### meta-qcom-realtime

`meta-qcom-realtime` 元数据layer， 详见 [meta-qualcomm-realtime GitHub](https://github.com/quic-yocto/meta-qcom-realtime)。该layer提供
用于为 Qualcomm 设备构建实时内核的附加软件支持。

- **内核recipes**

    Qualcomm Linux 支持 LTS Linux 内核 v6.6.x 和实时扩展。它通过 `linux-qcom-custom-rt_6.6.bb` 和 `linux-qcom-base-rt_6.6.bb` Yocto recipe进行维护，这2个文件在 `recipes-kernel/linux` layer下的 `meta-qcom-realtime` 。
可以在 [实时](https://wiki.linuxfoundation.org/realtime/start) 找到待处理的抢占式 RT 补丁。
这些补丁被获取并应用于 `linux-qcom-custom-rt_6.6.bb`，它在 [Kernel](https://git.codelinaro.org/clo/la/kernel/qcom.git) 上公开托管。

    要为 Qualcomm 机器编译实时内核，请执行以下操作：

> 
> 
> - 如果选择了 `custom` OVERRIDE， `conf/layer.conf` 则选择 `linux-qcom-custom-rt` 。
>     - 如果选择了 `base` OVERRIDE， `conf/layer.conf` 则选择 `linux-qcom-base-rt` 。

    **内核配置**

    两种recipe都按如下方式附加 `qcom_rt.cfg` 片段：

KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"
        Copy to clipboard
- **在build中启用** `meta-qcom-realtime`

    要包含在 `meta-qcom-realtime` 构建中，请导出
`meta-qcom-realtime` layer 到 EXTRALAYERS 中 `bblayers.conf`，作为
在以下步骤中描述：

    1. 用source命令设置环境。

        以下是为基于QCS6490的设备和 `qcom-wayland` distro配置环境的示例：

MACHINE=qcs6490-rb3gen2-core-kit DISTRO=qcom-wayland source setup-environment
            Copy to clipboard
    2. 打开 `build-qcom-wayland/conf/bblayers.conf` 文件并更新 EXTRALAYERS 变量如下：

EXTRALAYERS ?= " \
               ${WORKSPACE}/layers/meta-qcom-realtime \
               "
            Copy to clipboard
    3. 运行 build 命令以使用 `meta-qcom-realtime` 进行重新编译：

bitbake qcom-multimedia-image
            Copy to clipboard

### meta-qcom-extras

该layer是已注册用户可选的元数据层。这layer启用所选组件的源代码编译，这些组件是否则在 `meta-qcom-hwe` 中显示为二进制文件。如果您有权限接收到此元数据layer，您可以使用 [Qualcomm Linux 版本
指南](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-254/build_addn_info.html) 中提供的clone 步骤。

- **固件recipe**

    layer中的 `meta-qcom-extras` 固件recipe集成了固件.zip文件
这是在编译其他子系统时生成的。

    | |<br>        ├── recipes-firmware<br>        |   └── firmware<br>        |        ├── firmware-qcom-bootbins_1.0.bbappend<br>        |        ├── firmware-qcom-dspso_1.0.bbappend<br>        |        └── firmware-qcom-hlosfw_1.0.bb<br>        └──packagegroups<br>           └── packagegroup-firmware-qcm6490.bb<br>        Copy to clipboard | 中的 `meta-qcom-extras` recipe将覆盖 中的recipe `meta-qcom-hwe`。<br>默认情况下，该 `meta-qcom-hwe` layer使用预构建的固件二进制文件，而<br>该 `meta-qcom-extras` layer从 Qualcomm 专有存储库构建固件。<br><br><br>该 `meta-qcom-extras` layer将忽略<br>.zip文件。这些recipe会搜索用户提供的.zip文件集<br>FWZIP\_PATH如下：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">firmware-qcom-bootbins_1.0.bbappend</span></code>: 在 FWZIP_PATH 变量中搜索 <code class="docutils literal notranslate"><span class="pre">QCM6490_bootbinaries.zip</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">firmware-qcom-hlosfw_1.0.bbappend</span></code>: 在 FWZIP_PATH 变量中搜索 <code class="docutils literal notranslate"><span class="pre">QCM6490_fw.zip</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">firmware-qcom-dspso_1.0.bbappend</span></code>: 在 FWZIP_PATH 变量中搜索 <code class="docutils literal notranslate"><span class="pre">QCM6490_dspso.zip</span></code></p></li><br>> </ul> |
    | --- | --- |

### meta-qcom-qim-product-sdk

- **BitBake 类**

    下表列出了
`meta-qcom-qim-product-sdk` 元数据layer：

    | BitBake 类 | 说明 |
    | --- | --- |
    | `qim-prod-sdk-pkg.bbclass` | <ul class="simple"><br><li><p>提供打包任务以打包 Qualcomm Intelligent Multimedia Product （QIMP） SDK 工件<br>到存档中。它由 <code class="docutils literal notranslate"><span class="pre">qim-product-sdk</span></code> recipe调用。</p></li><br><li><p>易于安装的工件存档位于<br><code class="docutils literal notranslate"><span class="pre">&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/deploy/qim_prod_sdk_artifacts</span></code><br>recipe构建完成后的目录。</p></li><br></ul> |
    | `qimsdk-pkg.bbclass` | <ul class="simple"><br><li><p>提供将 Qualcomm Multimedia SDK 软件包打包到存档以及易于使用的安装脚本。档案是使用包生成，以便单独开发、部署和调试。</p></li><br><li><p>易于安装的工件存档位于<br><code class="docutils literal notranslate"><span class="pre">&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/deploy/qimsdk_artifacts</span></code> 目录。</p></li><br><li><p>在build过程中由 <code class="docutils literal notranslate"><span class="pre">qim-sdk</span></code> recipe调用。</p></li><br></ul> |
    | `tflitesdk-pkg.bbclass` | <ul class="simple"><br><li><p>提供打包任务，用于将 TensorFlow Lite SDK artifcats打包成多个用于开发、部署和调试的压缩包。它在编译时由 <code class="docutils literal notranslate"><span class="pre">tflite-sdk</span></code> recipe调用。</p></li><br><li><p>在recipe编译完成后，易于安装的artifact存档位于 <code class="docutils literal notranslate"><span class="pre">&lt;workspace&gt;/build-qcom-wayland/tmp-glibc/deploy/qim_prod_sdk_artifacts</span></code> 目录。</p></li><br></ul> |
- **Distro 配置**

    | `layer.conf` | 使用以下信息配置项目layer：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>recipe文件路径信息</p></li><br>> <li><p>支持的 Yocto 版本</p></li><br>> <li><p>支持的 Qualcomm<sup>®</sup> Hexagon<sup>™</sup> 处理器版本</p></li><br>> <li><p>支持的 Qualcomm<sup>®</sup> 神经处理 SDK 版本</p></li><br>> <li><p>支持的Qualcomm神经网络 （QNN） SDK 版本</p></li><br>> </ul> |
    | --- | --- |
- **镜像recipe**

    | recipe | 说明 |
    | --- | --- |
    | `recipes-gst` | 由上游 GStreamer recipe更改 （`.bbapend`） 以及 Qualcomm recipe组成：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-good_1.20%.bbappend</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-base.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-batch.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-metamux.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mldemux.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlmeta.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlmuxer.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlqnn.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlsnpe.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mltflite.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvclassification.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvconverter.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvdetection.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvpose.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvsegmentation.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-overlay.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-qmmfsrc.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-socket.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-tools.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vcomposer.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vsplit.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vtransform.bb</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-qcom-oss-sample-apps.bb</span></code></p></li><br>> </ul> |
    | `recipes-qcom-ml` | 包含两个recipe：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">qnn.bb</span></code>: 用于打包 QNN SDK</p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">snpe.bb</span></code>: 用于打包 Qualcomm Neural Processing SDK</p></li><br>> </ul> |
    | `recipes-qim-product-sdk` | 用于安装包含 QIM、Qualcomm Neural Processing、QNN 和 TensorFlow Lite SDK 的 QIM product SDK 的recipe |
    | `recipes-tensorflow-lite` | TensorFlow Lite recipe编译并安装以下版本的 TensorFlow Lite：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p>2.12.1、2.13.1、2.14.1 和 2.15.0</p></li><br>> <li><p>默认版本：2.15.0</p></li><br>> </ul> |
- **软件包组**

    | 软件包组 | 说明 |
    | --- | --- |
    | `packagegroup-qcom-gstrecipes-gst` | 用于启用上游基本 GStreamer 以及 Qualcomm 插件的软件包组：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-base</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-tools</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-batch</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-metamux</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mldemux</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlmeta</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvconverter</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvclassification</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvdetection</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvpose</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlvsegmentation</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-overlay</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-qmmfsrc</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-socket</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vcomposer</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vsplit</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-vtransform</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-qcom-oss-sample-apps</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlsnpe</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mlqnn</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-qcom-oss-mltflite</span></code></p></li><br>> </ul><br><br><br><br>该软件包组还用于打包上游 GStreamer 软件包：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">cairo</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gdk-pixbuf</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">liba52</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libdaemon</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libgudev</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">lame</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libpsl</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">librsvg</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libsoup-2.4</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libtheora</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libwebp</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">mpg123</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">orc</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">sbc</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">speex</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">taglib</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-gst-basic` | 用于启用上游 GStreamer 的包组：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-base</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-good</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-plugins-bad</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">gstreamer1.0-rtsp-server</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-qim-product` | 用于将以下软件包与安装脚本一起打包的软件包组：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-gst</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">packagegroup-qcom-ml</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">install.sh</span></code></p></li><br>> </ul> |
    | `packagegroup-qcom-ml` | 用于打包 Qualcomm ML 框架的包组：<br><br><br><br>> <br>> <br>> <ul class="simple"><br>> <li><p><code class="docutils literal notranslate"><span class="pre">tensorflow-lite</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">qnn</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">snpe</span></code></p></li><br>> <li><p><code class="docutils literal notranslate"><span class="pre">libgomp-dev</span></code></p></li><br>> </ul> |

## QualcommLinux软件组件

本节介绍关键软件组件，如覆盖文件系统、初始化脚本、调试工具、
用于引导管理的systemd-boot、分区工具以及对容器化和 Kubernetes的支持。
还介绍了日志记录和辅助虚拟机等功能。

## 文件系统Overlay

Qualcomm Linux使用overlay文件系统在特定挂载点上创建overlay。建议使用只读的 rootfs，但很多应用程序可能需要对文件系统的某些部分进行读写访问。这是使用 `overlayfs` bbclass 实现的，同时保留基础rootfs 只读。

`overlayfs-qcom-paths` 创建recipe `/var`、 `/etc` 和 `/opt` 作为overlay挂载点，其继承了 `overlayfs` bbclass。在recipe中， `overlayfs_mount_point` 变量定义为 `mnt-overlay`，这意味着 `mnt-overlay.mount` systemd单元在BSP中进行定义，并安装到镜像中。
在启动时, `mnt-overlay.mount` systemd单元挂载 `/dev/disk/by-partlabel/overlay` 磁盘分区至所有的挂载
点。

变量 `overlayfs_writable_paths` 指定了运行时使用的可写路径，即 `/opt`、 `/etc` 和 `/var`。

要包含 `overlayfs` 支持，必须将其添加到 DISTRO\_FEATURES。

- `/var` 的overlay

> 
> 
> 要查看 `/var` overlayfs 挂载点，请运行以下挂载
> 命令:
> 
> 
> sh-5.1# mount | grep var
>     overlay on /var type overlay (rw,relatime,seclabel,lowerdir=/var,upperdir=/mnt/overlay/upper/var,workdir=/mnt/overlay/workdir/var)
>     Copy to clipboard

- `/etc` 的overlay

sh-5.1# mount | grep etc
        /dev/sda11 on /mnt/overlay type ext4 (rw,relatime,rootcontext=system_u:object_r:etc_t:s0,seclabel,stripe=128,inlinecrypt)
        overlay on /etc type overlay (rw,relatime,seclabel,lowerdir=/etc,upperdir=/mnt/overlay/upper/etc,workdir=/mnt/overlay/workdir/etc)
        Copy to clipboard
- `/opt` 的overlay

sh-5.1# mount | grep opt
        overlay on /opt type overlay (rw,relatime,seclabel,lowerdir=/opt,upperdir=/mnt/overlay/upper/opt,workdir=/mnt/overlay/workdir/opt)
        Copy to clipboard
- `/home` 的overlay

sh-5.1# mount | GREP home
        overlay on /home type overlay (rw,relatime,seclabel,lowerdir=/home,upperdir=/mnt/overlay/upper/home,workdir=/mnt/overlay/workdir/home)
        Copy to clipboard
- 要调整覆盖分区的大小，请使用
`resize-partitions.bb` 类和 `resize-partition.service.in` recipe文件。
调整分区大小服务在设备启动时运行，以根据分区大小创建和设置
文件系统。在
调整分区大小的服务中，运行命令以调整覆盖分区的大小，
执行以下操作：

    - `/sbin/e2fsck -n /dev/disk/by-partlabel/%i` 根据分区标签
验证指定的文件系统是否有错误，而不会做出
任何更改。
    - `/sbin/mkfs.ext4 /dev/disk/by-partlabel/%i` 调用
`mkfs.ext4` 实用程序并使用ext4格式化分区
进行读写访问。
    - `/sbin/resize2fs /dev/disk/by-partlabel/%i` 尝试增加
分区的大小。
    - `/sbin/tune2fs -O encrypt,stable_inodes /dev/disk/by-partlabel/overlay`
修改各种参数。例如， `encrypt` 允许您
加密存储在文件系统上的数据，并且 `stable_inodes`
选项可确保 inode 编号在文件系统中保持稳定
操作。

## 系统初始化脚本

添加到映像 `meta-qcom-hwe` 中的系统初始脚本如下：

| 系统初始化脚本 | 说明 |
| --- | --- |
| `mnt-overlay.mount` | 将磁盘分区挂载 `/dev/disk/by-partlabel/overlay` 到该用户 `overlayfs` 的所有挂载点。 |
| `var-persist.mount` | 将 `/dev/disk/by-partlabel/persist` 磁盘分区挂载至 `/var/persist`。 |
| `android-tools-adbd.service` | 在设备上提供adbd守护程序。 |
| `logrotate.service` | 对旧日志进行保存。有关此服务的更多信息，请参阅 [syslog（） 的日志填充码](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#logging-shim-for-syslog)。<br><br><br>`logrotate.service` 是上游系统单元。<br>`rsyslog.logrotate` 配置文件在Qualcomm Linux中进行修改，用于管理设备上的日志。修改后的 `rsyslog.logrotate` 文件在 `meta-qcom-hwe/dynamic-layers/openembedded-layer/recipes-devtools/rsyslog/rsyslog/rsyslog.logrotate` 目录中。此文件将覆盖上游提供的默认配置文件，该默认文件位于 `meta-openembedded/meta-oe/recipes-extended/rsyslog/rsyslog/rsyslog.logrotate` 目录中。 |
| `pd-mapper.service` | 配置和管理保护域。<br>该 `pd-mapper.service.in` 文件将更新为以系统用户身份运行服务，而不是作为Qualcomm Linux BSP layer的root用户 `pd-mapper_git.bbappend` 。<br><br><br>do_install：prepend（） {<br>     # convert the service from root user to system user<br>     sed -i "/ExecStart=/i\User=system\nGroup=system" pd-mapper.service.in<br>     }<br>    Copy to clipboard |
| `property-vault.service` | 提供 `property_get` 和 `property_set` 功能。<br>有关此服务的更多信息，请参阅 [属性](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#properties-section) 。 |
| `persist-property-vault.service` | 运行 `set-persist-prop.sh`，将<br>`le.persistprop.enable` 标志设置为 <cite>true</cite> 。将此标志设置为使用<br>persist属性。 |
| `resize-partition@.service` | 在启动时根据分区大小<br>调整文件系统大小。<br><br><br>ExecStart=/bin/sh -c "/sbin/e2fsck -n /dev/disk/by-partlabel/%i; \<br>    if [ $? -gt 1 ]; \<br>    then /sbin/mkfs.ext4 /dev/disk/by-partlabel/%i; \<br>    /sbin/resize2fs /dev/disk/by-partlabel/%i; #COMMAND# fi;"<br>    Copy to clipboard |
| `rsyslog.service` | 根据指定的配置重新定向日志。<br>有关此服务的更多信息，请参阅 [syslog（） 的日志填充码](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#logging-shim-for-syslog)。 |
| `sys-kernel-debug.mount` | 掩蔽 `sys-kernel-debug.mount` 构建时 `perf` 的点。 |

## 调试工具

`<workspace>/layers/poky/meta` 目录中定义的软件包 `packagegroup-core-tools-debug` 会添加调试工具，作为 `rootfs` 的一部分。此recipe由 `<workspace>/layers/meta-qcom-hwe/recipes-devtools/` 添加为 `packagegroup-core-tools-debug.bbappend`。此追加文件添加了 `ltrace`、 `perf`、 `sysstat` 和 `valgrind`。
有关详细信息，请参阅 [调试Linux用户空间](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-12/using_open_source_debug_tools.html)。

## systemd-boot

systemd-boot统一可扩展固件接口（UEFI）启动管理器提供控制启动流程的选项，并加载用户选择的启动加载器。
配置文件、内核、initrds 和其他EFI镜像必须驻留在 EFI分区上。

要将Linux内核直接作为EFI镜像执行，请使用 `CONFIG_EFI_STUB`.systemd-boot支持两种配置：

> 
> 
> - Type1：
> 
> 
>     Type1配置使用引导加载程序规范（BLS）描述文件。您可以在EFI系统分区（ESP）的目录中找到 `/loader/entries/` 这些文件。
> - Type2：
> 
> 
>     Type2配置使用统一内核镜像（UKI）。这些镜像将内核、initrd和内核命令行合并到单个EFI可执行文件中。
> Type2提供了更好的安全性，因为UKI包含设备启动所需的所有信息。对UKI镜像进行签名可保护所有包含的实体。
> 如果启用了UEFI安全启动，则系统仅加载已签名的镜像，因此需要签名。

有关详细信息，请参阅 [systemd-boot](https://www.freedesktop.org/software/systemd/man/latest/systemd-boot.html)。

Note

在开发阶段，签名不是强制性的。

- **UKI**

    UKI是UEFI启动存根程序、Linux内核镜像、
initrd和其他资源在单个UEFI可移植可执行
（PE）文件中的组合。UEFI启动存根查找各种资源
用于UEFI PE二进制文件中的内核调用。这就允许
将各种资源组合到单个PE二进制镜像中，
然后可以使用OpenSSL实用程序对其进行签名。

    有关UKI的更多详细信息，请参阅 [unified_kernel_image](https://uapi-group.org/specifications/specs/unified_kernel_image/)。
`uki.efi` 内容如下表所示：

    | uki.efi 文件的组件 | 内容 |
    | --- | --- |
    | Initrd = Init ramdisk | `initramfs-qcom-image-qcm6490.cpio.gz` |
    | Linux = Kernel Image | 镜像 |
    | Efi-arch = Architecture | `aa64` |
    | Stub = System-boot efi stub | `linuxx64.efi.stub` |
    | Cmdline = Command-line parameters | `root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,1150200n8 pcie_pme=nomsi earlycon kernel.sched_pelt_multiplier=4` |
    | OS-release = OS-release | <ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">ID</span> <span class="pre">=</span> <span class="pre">qcom-wayland</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">Name</span> <span class="pre">=</span> <span class="pre">"QCOM</span> <span class="pre">Reference</span> <span class="pre">Distro</span> <span class="pre">with</span> <span class="pre">Wayland"</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">VERSION</span> <span class="pre">=</span> <span class="pre">"1.0"</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">VERSION_ID</span> <span class="pre">=</span> <span class="pre">1.0</span></code></p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">PRETTY_NAME</span> <span class="pre">=</span> <span class="pre">"QCOM</span> <span class="pre">Reference</span> <span class="pre">Distro</span> <span class="pre">with</span> <span class="pre">Wayland</span> <span class="pre">1.0"</span></code></p></li><br></ul> |

    **镜像Recipe**

    `meta-qcom-hwe/recipes-kernel/images` 包含以下recipes：

    - `linux-qcom-uki.bb` 生成 `uki.efi` 。
    - `esp-qcom-image.bb` `efi.bin` 使用 `uki.efi` 生成 。

> 
> 
> `meta-qcom-distro/classes/image-qcom-deploy.bbclass` 调用 `esp-qcom-image`。

- **EFI镜像**

    ESP镜像包含 `efi.bin` vfat文件。这个文件包含 UEFI启用
systemd-boot所需的所有详细信息。UEFI挂载ESP分区并执行systemd-boot
管理器 （ `bootaa64.efi` ）。systemd-boot管理器解析UKI
镜像，加载内核镜像，然后将控件传输给它。

    有关ESP结构的更多信息，请参阅 [EFI 系统
分区](https://wiki.archlinux.org/title/EFI_system_partition) 。

    ESP 分区的示例结构如下表
所示。它包含systemd-boot（`bootaa64.efi`） 和UKI
（`uki.efi`）。

> 
> 
> ![../../_images/efi-bin.png](data:image/png;base64,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)
> 
> **efi.bin 文件**
- **签名**

    安全启动功能可以在UEFI标准中找到，但未在开发设备上启用。它增加了一层保护，通过维护加密签名列表来预启动过程，授权或禁止在启动时运行的二进制文件。它确保设备启动固件和HLOS启动组件（启动管理器、内核和initramfs）未被篡改。

    UEFI安全启动使用数字签名来验证
其加载代码的真实性和完整性。所有密钥都
存储在UEFI安全变量中。UEFI 安全启动通过以下方式实现：
使用PK、KEK、DB和DBX键。

    要使用安全启动，需要密钥PK、KEK和DB。虽然
可以添加多个KEK、DB和DBX证书，但只能添加一个
平台密钥。

    仅当在系统中注册PK时，才会启用UEFI安全启动。
建议在安全启动的最后一步配置PK密钥
使能过程。有关Qualcomm如何实现UEFI安全启动功能
的更多信息，请参阅 [安全启动](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-11/secure-boot.html) 。

    **用于对HLOS镜像进行签名的主机工具**

    启用UEFI安全启动后，EFI和DTB镜像必须进行签名。为简化此过程，可以使用主机签名工具。该命令行Python脚本在Linux可主机上运行（最好是Ubuntu 18.04或更高版本）。它通过两个独立的操作自动签署EFI和DTB镜像，并在生成后进行调用。该工具还能合并DTB文件。

    主机签名工具可在 [GitHub](https://github.com/quic/host-signing-tool) 上下载。

    **主机签名工具概述**

    主机签名工具在安装了Python3的Linux主机上运行。它可以在单次操作中签署EFI镜像或DTB镜像。若要对EFI和DTB镜像进行签名，必须使用不同的输入调用两次该工具。

![../../_images/host_tool_design_wbg.png](data:image/png;base64,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)

    **具备OpenSSL和sbsign的Linux设备**

    主机工具需要将未签名的EFI或DTB文件，以及
证书和密钥，作为输入。调用后，该工具将解压缩
未签名的镜像，使用提供的密钥和证书对可用项目进行签名，
然后重新打包镜像，用签名版本替换
未签名版本。

    要合并DTB文件，必须遵循不同与签名流程的过程。使用该工具将一个新的DTB文件与一个旧的DTB文件合并（在 `dtb.bin` 下）或者从可用的DTB文件列表中创建一个新的合并DTB文件。

    **主机签名工具的使用方法**

    - **运行该工具的前提条件**

        若要运行此工具，请在Linux主机上安装以下内容：

        - OpenSSL、sbsign和mtools实用程序
        - Python3
        - pip、subprocess、shlex、socket、glob和shutil Python模块
    - **主机签名工具配置**

        您必须先配置主机签名工具，然后才能启动
镜像。

        - `config.ini` **文件**

            主机工具希望您在
`config.ini` 配置文件中提供必要的信息。启动后，脚本
读取此文件并相应地对镜像进行签名。以下
变量列在配置文件中：

![../../_images/config_file.png](data:image/png;base64,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)

            **config.ini 文件**

Variables in config.ini file

            | config.ini 中的变量 | 值 | 说明 |
            | --- | --- | --- |
            | `operation` | `sign_image/combine_dtb` | 使用此配置可以选择对镜像进行签名或合并DTB文件。 |
            | `image_type` | `efi/dtb` | 如配置 `operation == sign_image`，请使用此配置单独选择 `efi` 或 `dtb` 签名。 |
            | `combine_dtb_type` | `combine_with_old_dtb/combine_without_old_dtb` | 如配置 `operation == combine_dtb`，请使用此配置选择要执行的合并DTB操作类型。<br><ul class="simple"><br><li><p><code class="docutils literal notranslate"><span class="pre">combine_with_old_dtb</span></code>：与旧的 <code class="docutils literal notranslate"><span class="pre">dtb.bin</span></code> DTB结合使用</p></li><br><li><p><code class="docutils literal notranslate"><span class="pre">combine_without_old_dtb</span></code>：合并一组 DTB 文件</p></li><br></ul> |
            | `file_path` | `local/remote` | <ul class="simple"><br><li><p>本地：密钥和efi.bin/dtb.bin与脚本位于同一路径中。</p></li><br><li><p>远程: 将 efi.bin/dtb.bin 和密钥从远程 Linux 设备复制到当前路径。</p></li><br></ul> |
            | `local_machine_private_key_path` | `<path of id_rsa file in local machine>` | 如果 `file_path = remote`，此文件将与远程设备建立SSH 连接。 |
            | `loader_conf_timeout` | `<timeout in seconds>` | systemd-boot等待时间，让您选择对二进制文件进行身份验证。此选项是签名 `efi.bin` 所必需的。 |
            | `efi/keys/dtb/combine-dtb_remote_hostname` | `<ip or hostname of the remote Linux machine>` | 如果 `file_path = remote`，则主机工具选择远程设备的名称，使用 SCP 从远程设备复制 `efi/keys/dtb/combine-dtb` 文件。 |
            | `efi/keys/dtb/combine-dtb_remote_username` | `<username_on_remote_machine>` | 如果 `file_path = remote`，则主机工具选择远程设备的用户名称，使用SCP从远程机器复制 `efi/keys/dtb/combine-dtb` 文件，<br>前提是该用户名是在本地机器上创建的。 |
            | `efi/keys/dtb/combine-dtb_remote_filepath` | `<full_path_of_file_on_remote_machine>` | 如果 `file_path = remote`，则主机工具选择远程设备上的 `efi/key/dtb/combine-dtb` 文件路径，使用SCP从远程设备<br>复制该文件。 |
        - **使用 config.ini 文件进行配置**

            1. 操作选择：通过设置 `operation` 变量指定必须执行的操作。选项为 `sign_image` 或 `combine_dtb`。
            2. 镜像选择：如果选择 `operation == sign_image`，则通过设置 `image_type` 变量来指定要签名的图像。选项为 `efi` 或 `dtb`。
            3. 文件位置：使用 `file_path` 变量指示未签名的 EFI/DTB 镜像、密钥和证书的位置。

                如果在配置文件中进行选择 `local` ，请手动将 EFI/DTB 镜像、密钥和证书文件复制到本地工作目录。

                1. 在脚本所在的路径中创建一个 `unsigned_binaries` 目录，然后将 `efi.bin` / `dtb.bin` 镜像复制到该目录中。
                2. 在脚本所在的路径中创建一个 `keys` 目录，然后将 `db.auth`、 `db.crt`、 `db.key` 、 `KEK.auth` 和 `PK.auth` 文件复制到该目录中。

                如果希望脚本从同一网络上的远程 Linux 设备自动复制所需的文件，请在配置文件中选择 `remote` 。

                在配置文件中，提供以下变量的信息：

> 
> 
> - `local_machine_private_key_path` （必填）
>                 - `[efi_config]` 节（如果 `operation` 是 `sign_image` 和如果 `image_type` 是 `efi`）
>                 - `[keys_config]` 节（如果 `operation` 是 `sign_image`）
>                 - `[dtb_config]` 节（如果 `operation` 是 `sign_image` 和如果 `image_type` 是 `dtb`）
>                 - `[combine_dtb_config]` 节（如果 `operation` 是 `combine_dtb`）
> 
> 
> 
> Note
> 
> 
> 该脚本支持在同一网络内通过 SCP 从另一台 Linux主机复制文件。
            4. Loader 配置超时：如果 `image_type` 在配置文件中设置为 `efi` ，请更新 `loader_conf_timeout` 变量。
            5. 结合 DTB 选择：如果选择 `operation == combine_dtb`，则通过设置 `combine_dtb_type` 变量来指定必须执行的 DTB 组合操作类型。选项为 `combine_with_old_dtb` 或 `combine_without_old_dtb`。

                1. 如果选择 `combine_dtb_type == combine_with_old_dtb`，则在与脚本相同的路径中创建一个 `unsigned_binaries` 目录， `dtb.bin` 并将镜像复制到该目录。
                2. 对于这两个选项，请在与脚本相同的路径中创建一个 `dtb_files` 目录，并将必须合并到该目录中的所有 DTB 文件复制（与旧的合并 DTB 一起 `dtb.bin` 复制，或者仅与彼此合并）。
            6. 处理缺失的配置：如果缺少任何配置信息，脚本将运行，并通过命令行提示您输入缺少的详细信息。
        - **运行主机签名工具**

            1. 启动主机工具：完成代码构建过程并获取未签名的 `efi.bin` 和 `dtb.bin` 映像后，启动主机签名工具。
            2. 准备好主机：将主机签名工具文件（`signing_tool.py` 和 `config.ini`）存储在Linux设备上。确保两个文件位于同一工作目录中。
            3. 配置工具：根据配置说明对主机签名工具进行配置。
            4. 运行工具：运行以下命令以从命令行启动主机工具：`$python3 signing_tool.py`
            5. 交互过程：主机签名工具会在屏幕上显示您的选择和操作命令。它还会在命令行中显示错误。
            6. 已签名的镜像：该工具完成其过程后，它会创建一个在同一工作目录中调用 `signed_binaries` 的目录。签名d  `efi.bin` 或 `dtb.bin` 镜像存储在目录中。该工具会在签名后删除用户创建的其他目录。
            7. 对两个镜像重复执行上述步骤：按照此过程操作两次，一次为 `efi.bin` ，一次为 `dtb.bin`。每次签名操作后，请先删除 `signed_binaries` 目录，然后再开始新操作。
    - **主机签名工具工作流程**

> 
> 
> 下图显示了主机签名工具的工作流：
> 
> ![../../_images/host_tool_workflow.png](data:image/png;base64,UklGRg5PAABXRUJQVlA4TAFPAAAvPgKYAFUL47ZtJEnpv+v13DP7jogJYHvjJVj3SncQQ1VVUscMFRs4Aj1MV4Z17PD6zjPUmJ10ngGJ2ztBz5jrFi9XUJfY7lPtYg8Cv9zRSVEuz7f6/0fWXTkTwphjXnNMmDBhwoR5TZgwj3nM0Ypaa61gwjwmTJjHPB5HDzVHXH0v5at2V/27qvemeKnJCP5eUcXRV61NZW6/DSRBqw1YTIBmUeQAs6n89sasKGj+smgDKdA9WFxIgW6NiqOofmkUVRztUPnXoqoRefRao2e+/jVrzXpzoGZFcendfxRUcRwYJ44X1GQE8GoE4ih8ubDaYwpVI0yqCJoiBi2KmkyANJsih2PW2hk0lVsmI5BxHFAEwAheCiTABOo6jSTbVvoqTghI5JPkHwUS+eSTyOHvNJJtK2o+VYxEIpHkHw1yJSFct/2fAE35/+mxbTd36KGHhmBIgWAoGQZChoFgCBkGgod3GADvaXWvXmufF+9wKSZiIiZiIiZiUkj+LDaSZiImGoVGMRETMRETMSkmfxRG0kzEpJjo+eYNRjEREzERk2JSoBYTMdET0f8JwHL9/2LLcq5suWXJkiVLlixZsmTJkiVLliy5ZcmSJUuWLFmyZMmSJUuWLHfE3nPO6d6zzumjp9dYnnbDPBNmZmoXpl51VJgTeV2YOakThlcwV/ZaYU7UrGDLMLQK1lpXh5mZmTlxzDlhcpwMh44KMzMzMzPHMjMNz6ig22Fo2Tn3hJkZFDO57B1mxuFRYaYTBjugwpxXQK3imaG/oWF4Bb3DcG4YO8xoGYbpBYSTiy5MLe+qARVm7uvCzPgqmJmZmZnTl8a1TYIkK6w+q88mMDAwsf4/XUyMa4Fx7WuLa1YEsBEkSRJrsRFbszU0DDj/RwMT+piPeZmXaVn/J+C35jflV+fX5Obm+jdcfjC/GV/Ee7jJ+eJX4ldf3stXOL6Cm5u/Ey/x3fi1lpz8mo+bmuRL+p78Wuufy/YrPm5qyu/01D7sy37rDc3H+bL/ciPz9+QN5ui1FKAyNxW4dgJUvsLOuXkvimsmqBwpr/EBfvV8J+bgL5/38yo/FN4LrpWgXxHKB2nfxbvJ52JU5wdHwbWS0K3ewXv1Ct+XHzrk9/C34EOs3kleUXB9BKHLp5hzdIjqgYLrIuhW2ndm4Fx1eZ1QcF0kjNOSM1S9p/pJ0sxfhmP2MnJUXAtB+UPzbq34+N7Nj8g/OL0Tjf0c/Vfx6/A8bSjXRMLzu0z1BPPf/tuH/nUl2NgC9ZAf2Tf5Stv+IYlW10j7pTzJOYGAKIAo0rxrFUQBVBVQ01m9UZV7bkD1jqoUiCpoWLN8gOvoa6m4JmpWvIppb8uryjDVMnd/+fswMW+K7s6YBh3+5t25jOyrcelenM31bxTImzFlC/hhdXN23393RflAOVWU6yDoUd6j4kqqcx3iUgrRaDLvPh6MV2ZyY+OWQ+rzdFWW7RqbNaSi8nSxfFWQ12vc124mm3Wqpzy+unL8yFAP10jrq3kdsHWewSntOQFjn7EKXA7KINAuE0hXFrnOwxqE+pxBgyEtDbem5MNDdo3UXM2wKhx9Kphf+x1Izd45cEFhf1fTtJ/mzgDURsX1ClRd1vXaM0jv5Cdchtl8zEcX3bu8U3+7ahhi89C+ihoHsC0WO3Sm+Z8CpjvxmrMP7t77EFXhTgTqVcX1CgxdBpLrvISfbK8H+kRclfldF0nvwC4O1i7D/BoBkY+wvWewoUQVmldLv/58iybDERLRKLYP1SFjyIxnNZVvB/tZjla2Lk5bORetN6NR8tqNYx88KY57b5TtHEb9eeaHFppawY+WaRdIpTmYR0XGNR77DtRmyDA558ZcIHsDzLVA3txaWdDaucqCVmaTn2dfXfhk4ck3CH7Up6ZTKz/ljjo/Q+v5B9jL/DNOYpee4bvheXnWZ23B/ozDJnmGJPu8ZmmfNZqfbaneLeiNNvU+TZaUddot4C0kK03tb+So92myN959x8mCzOPuC/I0NnLT/2Tbg1s3Ye8tuezL5d3NuBivs0+o2ZDoquu8DtDYl917OW7q16/X0qCxM6GbgDkE063255vtKtQLe7BsSytNt4v0r13bxaF9BeX3Zn0IQn3OMne13Mj4mlSoulk1Li3+clnbzslPt3y5DBSsl6JmR00UGIyK2aA0CnXIxEURN1I4nTPYZQDyWVGfCRhP/7PrC09GE8KYi7blyHU3o2YDRlcgZRRoTML1i3jsn8cP618ztMsESBcZQgaac/7Z1RRPht8Wkwv24MprFNRUj5V34rpZTit5gv0D09k+p74mshA2qyuA/VdzI65KR4LntfvhvOEjH2LPCPhzZHy3QNXZp5R1dX20yuVJbGO1es03bF05jpPe2VaVvkKcE5j6hEW6LIp+fNj5PdoscZk0mcuSOuPzdFawPaFo3L1eF5XvaoYnKnsTdmEylv0qqxhcFjcCdamyjkiMAs068jAtV/usSR4iQxcadLjM1bfA3AdzVQr1+iGJThTYayG9dU37JOS58YBafFcDzbvBKqAWrELOgFqO9Ynk+Y3+IZR2VpDUzMptno8EoFY+cphe1XWRhfCVpPGTPNq+olVbXYknV8+XiUtO0+ZhXzeZVhTYayI93q/S8spkDy6uZubphyxv8+hMjydRNF4fWQhln67dFYE9miPzick5Pif0+LmOKgrsdZGFUIqpWQ+JPlUA0U8UkuI8nAzxMm1/i1Bgr48shBxWWRa58qvnzdLreZRl7QcklC+xXy9pJ2RSHr5800z9B3Lw+vnfF1IusNdJFgo50o/FsqMfpVPY6yULCxXv/ye+l5aO4n2Fwl43WWvh/f/1/zn9OMdO4XkLex3l/YfsIvip/57676n/nvrvBoP8Tl8slo4CeyMDKmSxFMoFNzEg90Pb1unyfYpFcCODSbrb7XZvx7yRYSFcP5B393pTY6x3u9dLCuxNDAvhr5/dbinUmxtj/XpJgb2RAb1seWqEP1SK6wxcYVCAdsLXkqUx2SmCAK4w/OFBVXl8VQWAAADtyA+/K7/vaToJZe4BgKrK46sCQIgDoCoi23s+4e1RRBXAnIN25DpdOR7S9mspwBwDoCJyvOUT3h5FRAGEMVhARY4kb5997b8ff7IoVvtVURSHzeiE5FFEAYv5BRW6Nu2F5CaLBopiPsECKnJLUlxS9kVx2u9Pnyz68jW5juStiAJAyIJCRUhxw2HVZA82eZPnURZldbT8+GYUcisCxbyCHll9oS750CSfzvwamwDzB1CI3JMuORfLKMuyLMqbJv9CFmV1lp/OP8WR9yKqQIgCtJM7cjx/pzRZ1ha//igT9xVGHj5uDsU+q5s2ToSUTjGfIHf8YOom4SPdKl0L5YJ5A9VOSDesl1HdnNbx4OSRrorXq6aOlsXgyGOnCoQl6EVI2ZyiOj+VI6/SDes2i/ZnR8oFFvMHQvl4und83D59Ob+FKBdgrkA7IZPD8l2K9odEeIWSxKuofl/6ijx2qghFgHZHslzWUbHhLF8bfV43B8c7gWK+ABC6vytd8wnLuqkoF8UcwUXIpIiyNnacoTvvs+xUkdIpEH6gKmS5rPPYceabfd0chNIp5glUhUkznfnEVVOX3HaKeQHIHb+vTllWJJx5so7enVVFChQhB9Dunt837bQshZ4cVnW+IQWYH9DuyM1bUcUrdG3ak51iPkCF0tfZOqEnxz6q1x2lU4QaqArduo7OQs+mdlolFMW8gHbkIW1HXqms01VHAeYB5I6bZjol9Oy4/mhUkhJqoN2R1XszrUd6WeKsLkkB5gEAoZzSQnjV5ylPKArjAUIp0uVAT1dtenIUIMQIGb9TTUWvj/u0EMoF5oOqMMmnmDOsojc33AoMh4swWU4HocclnvKfQlGEFQilSE+OPuzT5UgxH7Q7csiygTMdl+mBFBgNF+Emiwb6cIjqkscLEEYAodtPMf25eTNKKDActCPjdDlyxlKkJ0eBwXA58jy1I33p9umBdxdF+IAKx2W9oV+TJhsoMBoglCJdCWcfT98yUgAYCpctD+lJ6NciXfOuU4QNaMcxzwb6d1zWAwUwFy7Cr23TAz05vJUNlIvCSNAt+7Sgj/u0IEMHVOh+XFbRz67NKorCVLgIq6je0KNJPn2Yd53CQFDhp9I1fR2na24VoQLaUT5TD/S3y6OEncJMkDuepzyhZ90pLYQCGEh4Tgv6vE9jSsi4bHmaNvT7GOWOncJEEMo6fVmOXj6k7Ui5AIaBcJhO9H0xlRSECuEhjen/ql7xeDEPAKH7H9OeHi/rqKJcFEaBcIxaGnBfJxSEBwiHqaAJz9OBcoFhoBfhT2nqkp5P8vrMu05hEFyO0majCdwXm1zuLggLULooFyOwmAaKYaDdluX/GVX0odunv7pIMQhUuE43NOIwnSiKsCA8TQnN6PLcUWESaEf2aTvSn326dxTAENCO/35a0JCH9INipwgFEL6a9EBTDlNPMQkglL/rO2ot9Ot5yhPKBYa43EneiCmk/YJjpwgBuNzJFysXY7CoKwpMAagwyaeYPq6auuRWYAKo8JCWNOYwrSmwwQ8qPEwDzanZXo4KM0Bly8143jwHKrrepgdSAN9BOybZigYt6oSCwAft6KITTRpPA8UM0I48TJs3BRUuRbp6RrkAPrMQFnVlkjH6XDgQHurKKBKtzABchO6UFpg7GE/Lv4hyUfgLwr8oO9Go6/qzFAQ8aEcX7cUoPNQ/hQLfQS/Cv2iZxpy7OETZh8Rtp/BbXydmGbPPBz8LYVwPNKuLThSFz6DdkUNWb2jIcTnFpPgKShe9PGjYIksoCHa4bKVdimFYZI6dwlfQjozfoTzhFccPsiGOcnpHTqTAT8KyHkyT1O9X0IN2rLKepq3qV/AbIGTxfOX46PixTazDNsX70wwrTmAErSGOPKS/70gBfHS/asQ0XLayVQQ5C2H/icQ4smwpvoIKXZv2fMyQJ/tQIA3OrkxE82tuaWcLTK+iZbavNornZ3BxU0d/MEXhEwjH96SnceO6ogQ6KN1yT/MesoSdwi+AHllFdcnHLUaTS2v0bjZtSKEExA/q9RzQc0mm1wFgpno9L9lgvQ+xnZLNdPgd9bxMb70OoMn+yzBTvdY8Jnn9CvwmAfzyo+rEPC7rg56wymIDVVnsI6h8DTxPecLHTcRsunNJKA2xCpcl+bVeipblAp7M2+7b01uxgMSO48MMzIubqvuQvEHLQ5cVoQig0/ITbdn1j2uKGnyeGDJElTOD2OGPmkdZpWuhXOCT/ZIG3i8l8P2oujKQy08Uv0A7yjrdOz6+EVMgpU5vlQPPL/jyLcOocxlarcz1syRzmQh8eV9OaS51P5ooVsH1oQhhwthTsafp2PGx1LAoWqs+ACH2LmTpmBTsH5o34fkSx4RCGWpmxpebiobNI/t07ygXwHPQY9cUJuqjkYrgBj3K90ouBuIp79gp/AAI3T5d80k7i3EkTa7UUSDBjI+wcCrRZP+q2ZQq7L+MM2P8Eoz4SMnpTHI5h9YL13J+zFTUv4As0fLjKrYXpVkDiJ9h/cR+8GKJhFQV6wdGNoHYz5awrKOKx4vCc8KhLk1UZSUl0NE1K5r4FZNV/gAuwqqpz7xC1634Fmi+c0H7RBiF1ebJdgyXtAr6b+PbMX5FouZHLEVRAjaP9qP2+WMu+3iafgCQFuNjO86yDEKcwZNhyY4gxHm550OmjE7AiiEZbmWLWDV1ybtOv+y3eq+vRxNJsw52wiTrjTREP4oC63mobFnWUcWrNaIHkUaVFh+1+F3dfFWa0TJ1GzljvjqRT1NiUTr3q3oCexXg2Bj5Zjm2s9wMgg+70gTdlnKU6F2AFX1U3o2W0e3TnhQfrHIx0n4f9DZZaaSxKfwA7cg+bUdeYWw/ADzvQQGt6p+pjaACpRPG/DyK2ZQiqL8BIHqPP812LQnp6N73ZjrLPRoBWreQ8nn8/s7nRab0ztairNPVMwoAr8Ba6FG+ZWUkrht3f0GQi7PfwswuH9M07S3kY5qmKeFQysxc/ndR8KCXAKGc0kJ4hdG7UlJemQsdWDsz2vkIzcSxU9bAhjWc0Wz6Dz9DMPcTvi8dx6os0SLmabSa/v/PzCm4lIqZ5NiDa5j5FSBV4ayGAXC8SUK96QJFbgEW5nfuxhJJvRIwswmGW9ka5HnKE4rql/1Wb0AB7eiynjOVedobL0Ca9qmZ9qlFj2mf9bPi+k9mpwhwRSSza87bKEyv8zzPidjpp3H/PuROVeQrrLDwqIUKk3yK2aqplh74w10Vm14L8LgSllkfOmdhTeRmLsvwW4DrK2InURC/sluIH+txjHl2fsNRIMJKsX8odYYjAJ26748yFtKKBxRV7vmxIXMSsGP+0+tsHQ5RtuG2+4oPeFKOItoxqc+zsd3rXHrTwHier/d5nhXN+1yufp9RG1Kg+8myyjn7/T1ZnzLU78Z6r/zD8gWKZmQnpADqUciWmzobeNWReXS4aABA5+7ufh/QW88B9O7u7vcBwCyj+wDEDwIgWuQoDYHRfVkfZqo3gJnqsf20Et0y/ctJgXqxE1Ke8dVkm9n4c7B+Xs+J7G31nqzP7O9J03oOs/HmHymwAQ16lH3rhZensH55bsvuC/RNQjL5xrNI51EhD2k+cm5KkZ4cpfPg7fiNZ+E9y2yY0VIDak4L7K8WYH/N0C7xbKyZAl6795b9OocoYdLXbxf0rpz+s5NwnsbpMqEnXf3tp2UpPEfVrEaA47UD9b0Wmm4zm7zuge722XLlgem9DnHLsL/2eW71a8RReajf/na8XbjRq9V+OnDObqJmM3rx+6be7V4sN32UeCJ3UR55V812bZytrmOgu3f5yRNLuJyF/X2Zfk1fo5yev73b7XZTnr83nszz9PWSc9dNL5r8v5953ry+2+12L6Zm9IR27pHp3cf+LJNZbYHu1hv768g5C+yvKbVJv8a5brPdbvf2Mo4P3ow/N+3d3Omnffypw8zjPt3tdq8vl5E3bBd5YH9NNs/dUmY0Brpj91L2nkgU1i/L7ZeIo5/i+nq3W9O7mzoa5otrP3agJ5/VuzeWpcRR4onp1Tw2A9WLYSZ5rYOdvJzWE/5eKohfoY8SclzXax7Fq0z+++k8T6qoLrkVD3LM81LIc1bNqgZy3+XHWiDOyuwBb7X0wnc9z3MS6neRO7/AuvmTKeSYyFf8wKtC9xema3nUnmi0I1VcavoZq9pgKOsmoSg8KK7qeCcss2FGZznPk+lmbr7ngu9tnsfXnjO1pglwFsJT5IGje53nq1SmyxcM4QuccsdOhPcK61UI+fF07x6xKjpYnBpyEhtrjfpbpcn+EfN4VSS2Xp/uHQWwHoRwK9pxqMvZ2PA6F1O23DZXe3Ms53n2o5tN6ueA12dudprmeT485CQFNvHpsmy5vQCisN6FbFlOTVWu0yNDI+IHQJIB6M3LbDArk9SzLCup95eLnxW8+ZvhMAOQ1PNm1BvANftQDiT1LMuQ5EBfM9w+7UmB9SZEoR3H+jAbSfM/zpli9Xqj7XzMmRnPwbNTBLhX9DdWs/shXfOdRIG1gPUyLsIqqseV2ROVWAksP4Vp74q8YzOUu6v5soSo9BSIH1tuCTeZXxqKGuD4PNkCF7hAVdkNnyvThyMJN5gDWJ0aS8DEklsWFf1wOCJusqCwpLyMz5Pj/kQUnFJi+OkbNbicJ1vgAheoTjSOQoFss8x9Yq31luWS/P98BW479YoFLPT+WVPM5sfd+xzwquhspCrqH+J1XIRje5LrKAnYhcPnR/HsNE6u+XCCX4GaTlgW7Sia73rLCCPxZFFbvAFpsiswguFJE4aZjS0s9I7aBXBcoWMdt3zoVieA+LHlQ/Pokbq0NvJ7omBh9MMijzSeZg7gHfg4fjStvnZHKfctq9ftxQx8yxZyPjuidWZW9DRBZqiICoc0q/1qJZs6qni8KKyXIdy3YqTNyVZhA9wYrY1U1qUvLCCUqzrJkXVgT8hDvQra6dcyK/PoHSqWnvoM6PmRS6czfYYaorcZP6Uq/1xmIqpfsE5Pt3dQ86OVYRH7zMYJXd0AUslbvNWNCMvmbFM0RPwcn8NMLQmAH0Nx1fsApPx3vN4w43zfcJaw85tumXi0f9Fu1lLhLKO6DQDXPbUj5UvsgPVaETkTifsXBDa46Vba1kh9lrBTeM9aCDHT1HMZjcDnDPUqFHMoVDCBfea5cj3AyY82W1XotHgqbnNIQO6X29nM0pwM7KQcRhGMUiGbGn3nRMVM8VbxlgCWePjizUi/MC/ST78FQM8mLb8aQJccu6vyyJPydON+ptuJ78rMjjt5yW36DJjRFMKvBOSzjGU4RPa2J1kIBbAeh/CcvYaJ/mO//6GzEPbRaCDZt/fHC6wvIfsIz7CM8XN8KXlU4k9gTzieXA9wsg/droxwIocV7+hZSOcS+l3vAW7J733A/+RdfH7fUFyMHDnyBmolYszVrggjSLdxE8A/v5bXCQCdj7jHpOk0pxfOzqN7xMAHfNq/8f7juuf7L+8/+er9Jl+6fu/0fMVxjMspJjuF9cFvkexgojJ7lcBX1hsDjdGaAutT9GSYsnnTaZzjMaqa40QfulNh558/dG6hyf7PpaV5DfkMt+EJo84V6BTz4zq7AUyPEtGbr9ePgEvHylVAcmOn894AshypcIaZbPoX4tmfGaacfr4dHvV9i3zEuzwfPPp/s4FHUVjv6fE2X5moiJ5tNeB9X6LCQJtsw07hE1utZsiuioQHge8F9cxr7TwOguVK9wG3S4LOjd+4vhlGadxB9D/1G/kRwAeI5nPRFG+JAyIBudMRbEAD7NGWAkjlGGJTX3lirxpDbGgdzp7OvhatMgfg+RVBa2Hbcb4PGg9Wwk0NM+MPQX/A0/8Df+tv0cn//4vmfPV2k9/p+n2Hud7xONuRooD1IYRF9EMxUL6iwAY5Pd6ucmeeopH7C6xvqz0NwIT/kJeitRnLWQYj7Mleql2AG80Bmxo/p8ZN5UzikgWKk/129FR1qO0tZDVKZS01/Di7sTTEm5xRDgBruvZdVSv7Q1pO08Ak2nTvKwKAgCemaXiSWLyVVM6VVLV5H6ra1Oz+0D/upf351j/rE/8D5Z9743uVUADrSwhfzTtHaZ7XqD+YgGchfIV6Y5zfYkQFBdbH1Z7GK8EBlrFAF979GpLAHJiACL6zYYgfXM7VhcuA2LYd5ePkfgDk+JiqcAQE8LirO3mUD+hxgZgj8ehx3grlt8ohri4SkKxp93f0xKR5AF/a3nfsz7/8x1Tf+kN5ib/mU6TA+hR66/KVeYpopAY6aMcxOhmnrF+FncJHw6s9n/tKCAznMt4xo+X7zMWyk+7AN5tu2n2BNQyZ+8zlMqq9W/f/9ee8vN/fSlZR/aHwa+jUNxbCdeZMI184UWCDnIUKT9FoGGnz26PC+rpa/dwM9ZEneVVZi+D6CfTYZTCgKr0lhlSPK7ivbBl/xstd/yn5CnWeUC4K66fXUsemKetN4LMQDm/GhhmmmALr92o1Q7aOk5xYbxE2eGfrmbClGHI3eGfr+ewtZZ2uHAWA9ZFupW3EMG3uqIHvcuRLapxZVo27Vf8NH17N9hHjxr/s6BZVpNunPSmw/obwJ02xWTZTTIENetpx+ObYKMn0l1NgTVjtyXD9zzh+XOUlTV1y26nvdCvt+4yYRNrGhQALFbaRM8k++lqqGYZXqxnql3yS66i0sm4qiiqs3yH8uVNsknKKKbCBz0JYTb1B2immwBqy2tMApj3JS65X1DrS1lEAWP9dttJGzhwuX8rdJQxYCNdTYgxdl3Knxhhe7WlsNWaaei6jKycbeZKfFHYKa0Box6QuzHGYBnYaDvTeRa0x9mugwJqz2vO5r4T1LHD8qEqZci5Td5sUhTUiVPiN9WCKpD5RFDYMWAjL6WCIdI0UWJNWq5+boT7xJK+7MkYtY4Fz4NgprCGhW8lzZwZpI8cuLFgIi2kwgq5O2ClMMnx4tSdDdlUn+bb1CtjtqZs3BZkqrDk6VvXJDOt0Q1HY8OCWkTPBqv4sRWENC+3IeFqOXpNTWtxSAFhzQoXxx84mKNOeAtiwYCFM6peM+K9PSwpgjQtV4RBlg7fGNj2QAmtW6JGnafBfVX+GdwobIi7CzTevxG9x2lMusAYGIBzzKfbSEGUbSqemsVDKsq789n1HlDt2ocLiIjynhc/OacHjBdbQEMopLbxznvKEclFY40Lomijxl2uikaKwYcLiIjyka1+d05XcXWCNDSEPUzt6ZJ2uHOUCWANDmERR4qcxzyoKYMOFxUV4SE8+itOVfJPCGhyy5SaLKi+4fdrfUgBrZgiTKKr8kzRZRYENpP6y0CPjaS8+kXVaCAXW6FBhktfn2VXNmyXvBNbYEI55vfHLEDUJBTaEWOiRZZ1XvnD7tCc7NZwFhG6VrmVGZd0kFIU1OISunQ7ii7hejhTYUGKhwqqpYx8MUf1t3HYKa3wI2ad7N5M+3TsKYI2mHaVI96P33Ck9CQU2pFhA2K0+tko85vopTygXhZ2DkC3Luqmuzq3SNSmwhofKPc91VHpt09QxKbChxUI78pxlB/HSJn/nWAsFgJ2LuAirpi6vKsnrkttOjWehnTBpp33ipXE1LSseOw0zFtoJk9WUl57x/zItB7JT2HmJi9D9j2l/NZssqigXhTU/9CJk/Il67b6K69966yAUVdgwY6EXITfvy7QsPZGGYGKhdAo7P6FC+eWVnuQK4qkdKRfAzkMAcsexqKM6fwXXR9MqIQWADTcW0O5IV7ZTfhhlNnoM1zplfpNAYecpIHc818vxSeSUFkIB7NzERcjPFn0/JvkcGYqs3g2kdAobaM1gLVTlnrLZ19m+TORJktvNhLJREIWFnbPQI4co2zzeuJxiUmDnKSBC2toEt3t9lvo+r6NPJrc8ChQ2DFkAKlsy6Zd11I6tt/qQZJv2Yb3W0QuIAHYOQ4VjO32geZwhigYeBXbOAiKgc2WCq5pk9TG1/thcyPalI0UUFjYcWWsBFSFvq0Mb1XXUnvrDIS7jw6Ev9vknsmi53nTkURSw8xkQ3hZpIY84T8uRorDzFxC5Jcfy1GR1lq/Wh8OhPB8Ov/5Yr5ZRFjWr80jeigCwwdck1gJQEZLu5x6KfRNFWf18yv7GKGqLvhxJbkUUsPMbcsd4ep/GB6RIT0IB7FwGVIQkq3i9eq+iKKvT9K0s+hvz1a+fuLolKaKADcRmsdYC2onwQfe1SVLWhyQZ3T1JinQKwM51XI4csmggXTsdyE5h5zWgXSdbkhQ3JlW+TJLRCUluRToFbEA2jrVQaNd1ciTJ5D3TzyXJrXRdp1DYuY+LMMnrMmne+rncdgo7x6EK7ToRPrhf8UHpuk4BhQ3MBrKwUFVo1z1jFZ0pXXeBqsLCBkBA6E5TukwoF4Wd64CFKrTrujtp9/fbrutUVWEtbJiz1gKwUO0epgoLwAZFCO8PxUi5AHb+Axaq+jBVBQAbrA31UDwKsIES2h3JewFsUAQeBdjgPR9swISqiMIGyMex1yIWD9obHMHTeDAUrssAhZkVuBaDyvErrGY+/mTBNRiEFGPfKq67AGGyWrZmfilteSu43sJFmET13lD7dC9bxXUWLsLkb4wSmnrfXnPhIkyyKKG59tddwiSLEt7UgDDJooQ3NSBMsijhTQ0IkyxKeEMDECZZlPCGBi7CJItG3tDARZhkUcIbGrgIkywa+bj/yWx5ZaXLu/O8I02YZFHCx/71zz9JEUqVtUTm88/0d5xBmGTRyMd/eXtpRTCqrJT9LKg6ziD8bBaNfMLvtL2sIpiA7TYsfFuVJ688CZavBGrKFQGeW7PdPGU5F4AAsy0TJ8rGL68lNlcGvtNp5WUSj7ctm6cu/RW2SnfO6XAlujgRjgBcwLNIG+6YOxZVHWYQJlk08irUswQkjIUFTdAW57LAVZALpSoPfPZy8hfRNLOxTHg+rJuXNoeMK6y0zobuPVY0SbgrXXte4nN4Hi980Vaxm2FrT+gPpIUg88DuCZO3Ac+XcTPiAnndMUpTHWUQJlk08krUM3NtuOHkkn50xzJ71fgoxcfu8+k08Bs7UayHI2EmwxH+mRUewIumAOOfzFP1NK0MOkpC2Fs0/QA3P5I06+0o/R015XZkZn4E6NxMX5JW+ROZzSbcYlcHGYRJFv0W8GrUHNpqe/GlLE6tl8OKppZ2FeLHHvy387wgpQt69lu6E7ur5DCKjR3Q8v9jHaZZ9ClYbmoJOl34bzXMHuj1LoD+oEwBXgwZvNCQx3mrN4GUOyeoOsagty6PRl4VjdpehH89UKzKYXvTS+fm6m55srQWcAVKmQc7hgbYlWB3ZXpnruVHwPxKBM5FAGSLQCoJsZLv5Hs/rAK0CWVGkCH71gyst3YTSLnPHWPQjlVd8soWvzFc3UDxVol7yzrfH5od/atj0/I8yDmCwjI8rT8E9Pyo1c9jbib7RC7tivxL6aDW7wLmpUzlJXvCRsv1gCb7hz0nzOs4i66IHW0WlLNl1Kocj0aLe2GcPxfvVvSaPgVS6Qcle8XyUjW/rSPlvg/lFvsF4iyenS1EYoma3935N7oM78Wf4AXQB0pnjhFfYt2KH5wDqXRL11iMGeQQuzq2gJl9Ugto4eZC7hvc5p/d3uXsJqz46D1huDk87tD1ycSMZe0Yec9o6LFXBAA+l3PTyz97vwJjE0L4Xb6lxKxCwOV9vvfHReFopck2G4L4HIIIZuXT7rKGo3BMNXS6Zn8FXMC4cIULsMyX4Yse8EP7zKe/JRaSyPa52H4rQoC7tFdbfbRA2QA2AXPlL10gWGUO8edABDtAKALXaOGW8kxH4RnzNho0iGPuQEgBZtPq4d/QcVJXuIgMHpdOy5X9qMwgBO2CuGLOQLpNRfkSO/yQGDEMzQl/wsDi6ofQfhEG8a1irkDv3b4dKRf4APDoRRkGy9RAuwUibgzgIgrPP+BLpSuK9/NTKP6o7OAD5bBs8sDdFO7+op5/hE/5XxWbYf1ZyuJB+EumPg7c7Zsj5eh5Srsnjz6lK0pu1gllAdE3DN7nTyR85n3p2lbkmU9lPH0w5GadUBYRLnjF6XdiXfgxigr/ntqB5GadUGb2aQYUCYMrsf1Uo7lRG9oXlRs//sTNptz4tSwrIcnNOuHMtLP37JUGl+VD0W8pK5c0tK8VzuvN+rMz03PHDK5EzNnhs8WQu7BaurnFzTpJZnYr8P008nSQ2rwioC1uFO/yaqcDdFqwO8KaNPiQrVENQJfBpbGUYl9dBVIbWzSrpq3N0WWR3tLmvoI/6lDjpv+2mfmtkDt/VhmMujT22GfkeezyLkcQDu1mDs+HpHfM47Du2/twtXUbAKL3VE6BKKyWYE1Gr1XvXeaF8W+pT+TnwyQ+dCq7sjs61jic6s1sKNabCmeZzR2G7f29RmW+zyvh+zX9/hWyua4VQcuP2txhJfszzxL1HADug4/hq4bBiC6A2mQsRHYvSSqe5WPmTyisztn6OthYTuVMjNzVTDp5X0Ly3qSkSat/FSGGUm5MP01aLDPlcsWu/CC/V+kIRiibbt/+9nddFNu1JGAECZxg/AyTlvvlGKzXUtLP6ktou0/+DKTymQO9lJ95Wd4sK5YUeNPuDQdomjbqoVf3+z/KpKpi/ZR0CdFHcrar47KFznh+gIBzFur8PsTrVrs63Fy8jmYzYbItcDF851YnSjY9ucx6vS9DImWLHU9NW4b1F4AdVXNuYKfKbN+RnG3XRbFdSwLc6NH//jHX/ZD9HWyuP1cz0nMIz71bFUErN2u2N0EWq851x32zJ9RgRT8Naf6nvPNfjv1k7WgS/vcyV8JVnS3esgBpU+d6J2I2rVjtx9Dpbxk618rccn0s35cZTSAZy4QWH7m80LQY8wjcYLufWOuoYYDJnca0U+gqxm6IM0+SKsJROa5fN1Yn5REUJx/qlVmTOJ+jVSuHzi1H50sR52N5iPtFsbCakc8zwQ9Bl0E/LRIXq61VyLQYBiTiWXorHAEhrQdUwByuCKXJg9hSDnSa4VMumn4C6LJod5UPlatP68KPq1Xh39NfNpJ0fSzbmbU85ByteitH5S6u4s2H4v1N2fxDm83P9enm3Jak62O5f+Y5I5swOZXoeIhG+vLlrOhfKUq69ycWdp3nPN6iGkMf/unf268kVh7J+TGrX0LbJE9I2InnvwZp9/db8SldsZE+ljtV71V4UGtnKUitfOjf1QJH6Ef9IvNoadf5AdmiFNmtRcuadrSflV1w/jkKj+vDFL5U/tAU53Msd4rFSOzsjfYlH16DkvvVW/kiQ5eYr+ORaO4cZ432FfUyQ5s+Y+sOq8+ynn4c60Mo3aot5e5L7FiQHOd0M5/Nx3IGf058WbXCHB4aVorFKmoq1Ar05WeshifOoaNb97y7wC5I8uUEqLoM0oy1B7zXelebsPG91umwgMy2KNXjpOQjA9p45BjHQyC3WpSbcUw3pTbVAWhrC3Krur+68chHBvSwRdJsYws6Ld02/+5ZqDo5XmA9lfrmcNkKETzH5rePqBYPOUTQ2Me+b2EzcTF2W7Vd/vIKTRiAozsKduPKpVTbbcC0zFL15XqOMAVfYJ2JfXdAdcV+OUdIYS84Qqv993sZ0jUCe9cW5Ni5/qrJ7vu9bL9/FnorF1hvnRnr95B5y6wYknqRdtJ87jB3DWzXLNb0me27TF4qozKdldWhsxA7W3AcKtNrwl0ZKYPK1IoOZ2K67uxebN8r1btKPp4t6Spqrhl/GW/FXRlxQW+kWhq11TljQ5/yHwALBazHVmUQzkYr+LRG/VA7SYwTqqDo5UTZ3ontskC1KuncoT0nbKi4/S8AdqmYzhl/jRQ2r4YpFBVWi2XoFey54UPREVoIDpjOGd+N3NquBPISwRieOI8s7EM9sjojfFVLicT0X54JSF3sVZ2nbjRMJ+/RjsVX3q0uhUPgAhzwLfEv7uoaddoQPwnANZp2VzXtFj9tf/uEsbPSD2C7pSzLEDzbKnfaswYxK0c3FyBNLM17Q7tI0yXIeyzDa37Eb2W5XJnBAboMH5ACDQNT5wtStwN6rTf6x+CR3ogwYtx4YS01lvmlR6tV5qkWM1YQTvDxucmgoeZSkKhjzSTAt/wJLI6ItLsS8RxtWiGLO2B+Ihjhmng/bsjbFRzEchNr7ZS0NKlr4Z8Wl9q2tbAZfYy6y5XRAhmu8ajPDWLIcQU1/T4Pr+OBdJXNbDr7OVTBlo6ipS5wf8zM/JZ/3+jd0pBNJeaF56fpYr3Mj2F8tXqZkj1oVaz8EDea9FP7wY4mPOxOiGcGmWasO97z+Q2o8TGTgaJXzWalB0A7RVZXrQLaOYo/5q/BjBTabgN/VtB2dV/Dcc4wPbR1CrGzVMFCOuuPXAVtt4W9yC4OsGf1x8z1JmmpwxdzbJhOz4jnZ2HjVv78tN8GEjmHVcb1g4P/NWkKR0F6nFgifMupVoTw7+gDuSt/7wcNpV41mp04y/YK++s9AozLmHxzCFV/M/TK/B4BGd5XKtLeJD/8pQJZz8tCWirfmu+DvfPM3cF+TrZZFkv1y82tuSzp2tF+oOlmxHRzUnDvkIukOkc/r5eFvv/jlZi+B0EvlYlw9aV0ekZE7wqxtCQvOByrCFqpdJa1ivsHB/9r0rwywjleFe0vDDDH8rzciqaMgvhTJ7mJ/W05PHh19ursjYyXMaEWxvJmLJV07QDz9ypFHFdfVn0N7MsAMHZrHPqZZrW0ZkZj54Zy/StjrEwIM/i1Qd3IvCZoQxczTN+Ru7pdJqwtULpPAAIK8JWaL0HMGFu/i1YF14d1FCfO/X/CIVLpLLvVLG4rEjHApOV505+DsDGtvn7aHG04iIjMgJQoTkeTBP5qAbIFTfkmLTX3fTNLzoCmfENqklhFvaBeQebGihWs0jYWEK9gM+oF8EcC5uW4B6k5FMB7niYiCCYe7Un4GDpHqopt6OPnhxNNuj9yHQYwZ39zFnFiiXC25F3kedPvArt6gi20FqfThvChfMmHI2UGX7C67AO/lWXQRz73Adny3gk8PE/MXJbmzP/3IU5n9DYdV6zCAM+PGq6Qg2lAnYwW0pkJq0ST/W/R4jzY/hU8zjrhvmNVb4nAj847oNyI74AffWkMzJqciTaDH+9/KKvT9xXpn7/2Fb+1Nox8JXKzfyUUL8+RCDbdKvyifhPP+bdz4Z5Y6C5n2V3tNGm6S5d3500/IF2eIyHg6dTpwKbvvIbnNOnZY1shT60MF1PW9HDire42wQdFnza7qUj4fvwi/0F/czTJFxrlIy/p9Td6enw/L5qZvDet/IwsK35DrZaJ1rwC0qHdbMQPfF8mVq5q+qEtkP3y+VBKX75CvdvtpvUf7pff9/g9ifcvdru3V5vS283cwamsnRPl9bXRpKaotUqXEnMzqz7uy+dNc6EN8FOmF/Xkx3p6fffg3xfEzunz3YPP68nL9fQf7Dlv4NNFQl381Zxo5c5fHqmANx0JaAtU2frVbHxZZrvdLv38KojF2aF9sdu9sRo23s7393On8udEtKFPo910qhgHssixfB+v73p6fL+wOFM6H9661aoi2QezhJRzG7Pz8p20iwz1oXwJjjyKcXJ+VjvmO3OMXqzga/tjdaQ4US8vOOBH4VbUOBqcPGlcUlG6TJ2G4Gmu9gfr5E7g5YWH9SFUAePIuD/tvDMuHqYt/wYoFNbDiygLWM8p2AzYlIusBQXRGxUQBRGsBdTbImulXnxBjl3KiEITbnKyBeoT8R7s3BrmxyrYWOs5Gae9i8i+mr4BtOpCPW1KO2Tw7kDqEabxCH1mdms/KrBf3RaLtHp/L1HnQYsat/a7QFuueew9O7em1XluZm3IcKerdsZunIeuQaozbuWrV5rg4fgeEbfC9uqrUecuzmNXwXS6LZ5dgTTXK05SX7Zg6rZ563Zs744+lqD0tXlaz83n6/tjmMCdCXy3AaYnvSqwXS80xsL8qpFYwvieQM0KjEvWYEDKpQCqS6Hub5JcA+AuSecEeReELFQlGTZzc/gtJJ+GDQ/iInC8y72uu4vmfYC48LGtz2C7sNf1enq7bEB9b+jsA/a17uMeFlV3jSM9PNcsvsQunKf3ChsuBJr3OlZV1dC8btZnmAx+ucaqqmqxSwWMz/Gvfqyqahfydk2HgGSh3TxV2PBxvHdEgObd3Av+AxbsEhEBPsW+RkQozM2LKiBZ6DyFNZyFsIo+GB4/PU/8Uiqoks5SpT17oT1r0ep7R0oHW29B12BBM2qCxff3YkGwNFeSsCpoRjOc3tiYTSjtnj9dTGAxT63poGQS/VxSMB/WUoCmW8dqbaB+ucqdRhC3DKXrdsQ5qG5IIYzjOgrz0leuD+nOYmG86Vrmy4zbupPKaqyXznTcr0i5wADz12AQF69PafuN//comAvNcUMbyzhakN0NswsCuXKjPVpoGpgnBbBVGasEzGXZ2MkWHaNCuyt+t5CGstwsupfl2tFkn5Zhvc7erY+vPyKfXiBA72S/ezBy9xfMgSevN7+3PoCw/A92u93ujTMFiwML4eZ/3e12b8QU2Dml5o+R3rv8gcZRFwV44LLlarfbNbLVBzCPZKr/8MBaC+FPen23e72kwFqL0AdAAUA7Ds93b5wpqgAUFnOHFAYZwEIBaHcny90uf0ZVAAoLhDdYqGonIrIluXo7vyfvjyLSKRQW82YeewdQhXYiciS5efF6SXIrIp1CFSENUGjXCR8UN/5FcbpOxtHxwaN0CgUWA4Bq18kdSd67cayirBpHJyR5J12ngEX4gmonQvLZ903ZF/9jnkfZ8zrK8/bUx4MjuZVOFYsAqHZCkuPmA1mvlnkTpWmU59+yWh/KREiKXKAIW9BOSCbnIo+irGlXxXrdr9fFad9kWdas4oGkdAqEPUC7I+k2fdtEn4iWq9N63ffr9Wm1jLIsWvalI++kU4QqQIT82riN6nx1GBLHx5VxiE/L7G9c9gl5FAXCHCByy/uheG9TR+26rEbhY4qrynUbZc3pI0KKAKEJECFfyyl7d7PsNyOv1g3xPqvbkjyKIrQBKqQ75HVzKhNecVIWTd30X0uKAmEIgAhZraZoPTjOUqpDPi1L4VGAcAaVe7pDVP/j5ciZjuWqztYjKYrwA70Imazq5gNm5OxduXxXlh8hRRHGIEfKIapXlXDmkhR11jtuBQg50E7ovrGOYkdvyua9mlYJ7wShCxByk0+rih5NiikqhXIBwo2QZTMVjt6VOMsOQgFCFXARjqspH+jhapnuR8pFEWIglHW6rOjt8ZTuR8oFIQp62XKI6gM9HmfRhnedIrRAOLbT19P75zoaKBeEJmh3x798yhN6flymPdkpQgqEVZRt6Mcqn848KkKTkJ9PC0cfSpGuhBJSINzUeUJ/ulV64FYxm1yC1/mKIJT9FNOn5+l9chSEEQjLunX0qxTpmneKWfyStOgD97K+Egjd71uX9O1QNwkFoQMQltNK6ONDuuZRMYMhqrN3J1hn9bRyVwChW9YDfVxFzV9EQcjARThMK6GvD+mBcsEVWYg8cwFcRBX28SGUth7o6yTKHQUhQ1jVraPP+28+Uy64IgvZ3gbvewFgHx+XO1lNA31e1a3cKcIEhGOUO/q+mAaK4oosNIjDPikg7NOSvh+mz/OoCA/QO9nXCf0vy2hkp7giiyBunxQqLNMDDRinZwoQHoS/JC1pwiRr5e5yZSEQ2jF5s6URT1NFUYQECIepoBnL9EAJMZftfftnj2ZweePYKUIBdCt5Lobgqf4pFIQUqPCQfsjQkMO0poQDqLBPB5rSRfv7rSKUQDsmb65ozPVHK3aK4AftmNQFzXlOz5SwIlxliTnGqJXjJRQI95EzCNvG3StCCLTjpj7QoOeppAQ/aMfq/zzQpNX0YUo42cpnGmcSWf6+cqcIfBfh90rkjMK2ka0ihAiHjx5o1LIuKUEP2jGp1zTrZiop4QN6lFXjzCJNK3eKoCcsssQwsmwpitAhTOqeho3rgRLsoB1ds6Jp4zphpwgfhzoxjYuKoGchLOuzccbs4xTYcAk9yrKlcVeNoyLIQY88Nc44smrkThEyhFV9Ns9Q/yRKsBOOzYnmLeuBnSJs9JEzjzSn4LfJSgMlWR9Glnsa+NTIURHsfkmWGMi1ex4voQJ6P2a9ic5ZQglw0K20S5q4j0Z2ijAhLOvBRGN2CHbCMSqMVGYbCmy4KDJnIslXQa/KYiNV0SF87JdiIp6WclQEuTIbZieac84KojnnLBQ3u7E5hQvoVv6hP4iz1Zy1QHLOmnNW0Jz10/rIsVMEuD5zs2tdCOHahNaFEMKZ61ZmJsuWW0VogHYc68NscgyhrxqFPYTehBBG0hqC2/OMznUS8L6XIs5+/+5j6Xah/jaxLDfMX7iZcZU7Srio6nI2/uxiLJc105Qx/MXEcmL/ZWJcVjebISsDHPQoq9wLL09h/bLctqkH1s3IThEWLISbbJjRUgPNuSqwvxLA/mphP8+zSaKYAhvg9q23fMHSC32UhI3zu8erY1YjwPaeC9qiGVIXz+ZPjPpAt5V274km2yxf7BBVYSOOEk+kpQLqewd5MONsxmYd6G7d8uSB6X0uS+9hf7shVpU34mwIG/+3R7Rz8sD07uP1rjlb1xQB78cVHtjf1bQ3+mevj0Y/DNNedodZnQLecuWFV6Kwfnluw9khSjzRniMP7K8ZZJ3GGRWB7ijt3lCHqAobcVR5onqnDzG+vpnJ2PQBb996K32dvknCxjkbZlVD3s9BPuS7epxJEh0C3ir3wndYjamU8V2Uv/DAuhnDBLTjJtvM6LWs69oNws33XPDrWk0fSs4oDnAWwiKS2aXKObeOQlvlgvgks1stOypsmEjq82x0K11Zt8Jt2uyNH5xzteVsN/WGnSLAHbJxdsgtgPBlJd/zGDJc1s8GRIQPi4jw2XGdBLxNtPHAjzhGBQU2PEK3kp9kRj/qOnIBL4kORhqyOFxYCFdLM+2XclTYwKZ0zclI53oIH33kTCTRiQIb4I6yWoqJisixU4SLTTaYqKp/VKCzEMZ1YiCXrygKGyb03kVrEx2yJPANWWygKjuwCxcWws8sTbTK5aiBTunylYHi7Ps2YSSuR/O4aE2BDXAWwiJKjCP7JY8KGzaSNw/mKesh4EE7DnVsnKSOKbAhEyJtbp79j3O3GvTun+U/3ziHemSnCB2M68o0Y9ZTYIOchQr7ejCMNHuKwoaPMStM02dJCOg4Rv+EYeJpoMCGTgiLejSLa05y1IBncRH2WWKWpqXAhpKkLsxyyCoKbNDTjv/Vm4VRynoIJxbCok5MMjbfKxQNfBYqXE+VQSTay1HDCLRjUhcm6euKXQiw0Fv3xWkNsp4GCmwYhQr7/30wR5UVFIUNfhbCMj0bI6kLCmxI6fhzmqUYY/+JkV04sBCuMmcIaaMxtFiocDMdTFGmZ4rChoUxaw3RpyUFNqwCwqKuzJBke24vsOHAQlhOvRE+khY8XsKLxWUreeNMIHnk2Gl4UOH6YxsDjNG3yN0FNsRox6RemaD42EBR2LBgIZS2rnznltnITsOMhQrP6dp/h/RTFMCGBwuha6LEZ9LWA0VhQy0g/L/Tg9/OaUFR2DBhIRyjZvSVrKYNBbAhF7plkcb+KqcV7xQ2XFgIq6xJfOT2U0mBDb9Q8pTGfjpPe2EXPiyEr01RVvnGLaeSAhuKOrJIe/80H1sJRWFDh4VwzOuNT5KmHiiwoRgqd+zTk/hknf7yE9kpbAixELrPTL0vznVUUTQkWeByZDwtEz+M7XTgtlPYUGIhlH5qR89Jke5HygU2NONy5PCF+uy9Mos23F4UNqRYyDdxE2UHj23y+nBLucCGaFyE4yrdJ94aT9P/OFIugA0tFioc//BpOXhoXE1txa0ANlQDQjlH7xq9847EWRYL5QIbXE1gASE3+bQaxBvJus5ioShs6IZsORZTc3becOd8Wv2DvBPAhhtrIUI5RPV+42YmVZHVxcitADaEQ4Uc2qmJk9mNcT4tN6QobKA1hAVkS4mbaXmoZpLEbZ2t/yJSFDacAyLksK+jU+lmIWURfbTdkCKADUPWQuWO8kqzz6L2sHFXIkP850f18v3NSIoANrQDIuRQNH9sXvyRydUkZZHX0WkgRQAbdM1hARWS1aGN6mZfxIOTrzh5mLik7E/LN7O8GISUTmFDPbQT0pWrps7aU78ZRR4mMm4ORRu92bysf+lrSekUNvgaxFpo1x1JqV6hyKMsy6KmfTCPsiyK8lM8OPJOOlXYkA/VTkiOm76NsiyLomXbtu0yyrIo+pFtvxlJSqcKG64sVLWTO5IuGc59UZzyF9GqKNbxRxJHkiIKBWzoB1Q7OZKUsSoPRfH5fZruT0XRl9UoJI/SqQI2bFkAChURPlyG6Cx8+FGkU8DCLgQBhYrIHR/u2r3c86F3IqJQwAZjw1hrYQFA5aH8KVHJozyoCijsAhEWAFQeytvP7PnT5aEKABY2KJvn4XhQO1bRmYKHWwu7eMRD9U7a/f1W8VAbrE314OPYRefj2AD+1H9P/ffUf0/995Rfz252XOSeSVSScllw4HIk9ytSFIsE6MVJFf1L4p4pFhzqxH1mL+IuiwTorTs10Yu6acf7CxYZEH5b0zx/3kTnW8Ei4Sinb8eDSznqomN4fbfb7V7fcLHQcax3u93zP5gCu9DQI08PrLjVoAezqrB/Y7fbU2DWoACjCpN0t0srCow6j6Bi1o5jvXvxqiiGRSAAxKxHfn63+8O5FbMCcwfa0biH79CcaFxBAMBFaNpxShOaVi6YO5+W5F+KPxyb9Nynp/OHY6OeKxEEAHGbD8dGPZ//xux8jo36ozZO5o4eefqi0Rg2b/LGsGn+Q6d7xbyDcJiyvDFq/t40eWPUPEsHCubNVtrm+2LaMTHtPnLsFPOvrMvEsOOYGLZMy/nUMuium4Dwk6KEATep59Qy8BRB4edmVdAZnvrvqf+uVlv9vGSQq9OkX6uqrl3sFqsWfJyeNvft521rfl7TtV9K8kiuWZLpyt54Uhifd82fYfcMVP0nTK/5a0XTdUvsPNJaELkReUr7iDwgBc17vjEFck8eac4CeYY8hU19zSImCLdyJJCmGrZqws86xVrvhPmIg7+xYxyOgrmKo4XWfK9VW9RWcUuAHlXc/I3dyma6yfswzEDb2qrSG523YfOAP3SKtd7Mcdhcu7C9R7mxYUPGUJW/Xps0XbmapdSCtjOrWYIHb0Jcl1GQultjCImm++5MUzB1ZujDDHsfq6u3YM1p1uvVktd+c1cDY3Bh9TeTidXVe5i6cjVLqdB0l2leRNctuXyZRsCaDXtuEJ3SvKOV+j0XvYwnLVHEBQ/bOTOflWAvIzSvQ4TKqO2ikk3ItC2ks0aGpcWvr5bq8jBcmfp7yCo3bQt+2aB5Ryvje8Z2a5bzi+y6BZ36t7NkM5LeE9QmM10JbGgK5msGyk7tuQH5rKhOC4ynp3nNcDO9PDC9Z0Cs7wY0rEBzthpWm/z4mhkvy32x/oowXR58aDjeE7Cpr11At+9YoGH1RzcIU/CQzZ3QArHLbdcAukSJRoHpbGleR9F2ZaB5NejonHlv6OUKUr6WsizN6hlNvqO1c+Y9wNRbsKbheE0g1zJIuOTGOlf2MVNkP5bO/eYciFcG9jPRvOaicbE375nYNWleqgfa3LlsrVUeGpbJz12EKfiHeO2iVkCvnpujb71XPrZsIL2RfDpgPifG9wxShkzzvtO8G6BarFwD2BsTBLZXK72h+AENEfIH2vcG43Td4l3c97hM2FBhwxKH2Ah7l8CGqejVjfNwHrAtWzt1q2JDaNrhnCAt7kgMIevaNe22jIi75hR/VTC94jxer5lmiW1b70IVbJGU3ZyGXxH27iY0aHnuR/siCwVqBdAsz1NVLRC9i6jqHzFp+mUJDeQ44U2sx6obOUoLOc4FaZjKPuyA1L0J0QLehb6fAPYrTOyDYmNvQi2Q1r6syx2kDn1shhaa3piwwx61CO/6si5rOEoLOc5gy8sU/SoE6G6MO2Dq5qcl1wc3zkAyoV9NH6Ica9/HwwUuUO8VQIV4AfS9iAKoFIiiyVKYW0+xT0qh9YIqgG8zt5I8ogA2CSqAppQBVe5L8oiCKIAKIMmSjsFvW+JYDsrh0tOm774s13MTUizX7865TeK3G9y5CmAPD6/J+/3a+UMY4OwSASvcVbknD5wJ8vYaAXI3ApSXIi4dA12uTOnMLv/M488bwFceUlz7PjQyTWm9Kr3XApguA7bbCroM9VQFOsR6b/mDGOAkvke9OboZH8p5+NUnGV5uiGf8wH4eN8sdL35tJdgFygBHLl9hVziumfr04EaI5yzEJT/Wnvsj8e3KZSl5AwBm93aZOczsi0dMhUQHNL39jHPcx74ebgTA+D0WpKU8yq69ETjMB/ZzfqS8MvjnS7kZoO9YMLkxxpY7zUf6Sx/qLNBMLqzJPx/4GZjfdUFl2mTlGQly9dp56FKYX28lXORckFv9vGmUopTkT97cm3XtXOboZtqzc87UIqW5CXe+w7qabqeoKvg26xqiiqFC3VCwn8fnDb0WSB/0T57MZd9vCn60jOvctuPZ0OxAGrXAx9XEPVGo43FzlKtxk2PIuEyB3+3nVaaIppE/eSCq3Aq6RMCeNQiAUCyiwn2hUFQFPwacsBaICirYpIBkAbKiVgCrRava1gKqoEpuc4FtkwKqeC9Zb1T/7Dwq5VXPk3OW3/Bg1K4tW7X3rzWBdS3oOtJeOxx9W7CZ3byvA8YoTHFyZzhAa2OCSbDHvetTWQHeTH+e0LqMZZX5s3d0B8PbTXtnlBQOyN2AlEvWEKXove6T6TyDEfa32SezeOyw+zkYZXz3daNDZ2F/zX+iAOE3PhjNYWboPIydx/dzEbaLVbAUVl2CdI5Uq7CfDczLgQDsr0R9HsD8mhBn9M/Vb35wiqVAY9JDNOd5cGcVyFcs6i1404DM42bOxNgroL3DdjU/55zC8ZH59Z4f0Jvhji/S2FdjvyRGkwHGLk+X/5nmPtLchOZONuVq9E6vYLuqKNxplkaoz8TYF9iuLkt+ppmcbWa+ZuJ60yfy5VS37wrZOp/OTQq2d6W6nS2DEeqCvmE/W8nrK7GFAuLSNT/T1u9lOdcid4f6NGvsN9quhmFJBVVY3XpuMKwPWdNVQ+gSY190fnty12gyb9tW7eQm084C9lCgGXZNibQr5L2obXM9TALtDL5R0MOCHavDNpl0SMGYtrxGM3H8vLzRIVEmNzv6DW90ePmp/55Ool2YRIGnmle5iDOpiBNnVJFTFBDKehBnVBERZ1T5q6d5dLxdvWhMGzWmTfNnwWBIs7wJtHn2fDN/ILfVJ0+fM2qxf7EsPv85k56Kza0o7LyHuL/8dPqcSYvPT3VRfM6kp9PBCeycsdB73tOk96yikma9JwWw8x9C3tOo8j/+XTSuwM4dCzEtq+jbeBTDwgZCiGEp7Z4/XQwLO4cszKodq+hMgWFtQIRZ9U7a/f1WYVY7l8z6OHbR+Tg2gD/131P/PfXfU/899QZCGbAwAhRhXBULIqh2Esa7ToFFELQ7MqTLRbH4wUXIZFOG8MHxrlMsfoTVso7+ofwfCtl5k2Vr4eIHwiqLDpshhJendCVHxWIHev9zltHIkB6nZ8qiR1jVPUN73t4vgMpsE95OkWwVi55zNoS5biG0eeq/390FwENp189qJy1Q/bFU7kjTPkP0K9jdFsk+TKqKHMfnYUEDVTxJGe1NW9mPjYv/rOHKNxrX/CO1XX1HzSAfk8HYL9Ccc1G9xKk1G+KcfBYECxnIPUWeoH/PN3uXPradD80xPyF2BTJWP5QvG2gGKeAJdZW/wqtIryjYYfoKIhQsSJ5QXDKST3B4tzdTSCCQtUgz43KjOQOyvVsVQLMWqTJcBYiCCJIFJEuB5lykOasKoFmLRAUQuRFQQeNiFVkrVB+QrIAogGZVFQRUiyTnIs1ynAWSlkoFFaQsbzRrgeQsHxDyTx4FD11o/EuUJ72TVfSjHJ/g9YAdfR1Cc9OEUA+LR5tyNaNSn786M8NcrqYBZL/C7u40ozKPKXbR5upyHrQpVzMqkOLa9+GAuVzXoyCXDWhVA/VI3maq1/flPGt1rGGXIj+s7oBmU6Rxa98bK+Pc9GESwA+rGRVoTbeNRSl8n/3B2NxJcTW7gK1WN8kjQiZFVlIevsjY8Arb3Rv52W2uKHUmRrMc0CwmludiaV3VVMtGE97r0NJ0QxO7CfZzje4dioY+M50mlp1xsexWpXVVUy0j+KtsyndoabqqGbrmRnsn+O+gSOfw18jevV3lWRc3rOdYkI2Zxh2qYGm6rTFvlzVc5bCeE/hgmrEbhLYLseyKfPm+YiuhKmpD2VTdKOL6qd71gYbJJ+vd2z+Xj/kX7m8XE9Of2V9httvt3sjbbLiaxSnS96KhF9SdnpyB4VL200IOESiD5K6E3F9FlclMrxHqXxU0XUu2QLyU8cyI29EwAGtQgG2xNK9upr0OfF9D1QFiLg+r0Zv5nLjdTGYNkMxMDiEjoYQYBKbTi+syDEXkZQM1W9G6AtVidRl5ePzoatrtdm/s+0d/49Ry4WCht6796FtPnGUvdrvd7u30qsIBVKfaswLqxQO2mcyVqc8E6XTTPvWLptcODA/twcL+StCGA7BNY65coKYivdy0T9eSb+alkcqZkTHkomFRkLUCxjXf5PXa8x0ToL0acl8DQynaX9M+De9ZQwkcd+xSPYAu/bRP6ztJ2dX2oT/++W63272dZtlbD83q+kCBXTBYXMQl1RMnyXK3ezv6UYds86i+qPnAcjMuHq3WslyCFrVnqIYhjtKeN/EZLcxhRitTlmfItEs5rV1L++qrYYi13EgY8npsTlyUjwjUrgBbdX1zYxnPbb9MJvcjUEXRcFbDEKtc1DzHLlc1DHHL5O26Jrm3RcMp3e3eOCT/X/XIxAnswsFCeKXtLvrU17J8nMN7vtk6SwoNMJxqz3v7udscr0x9emhfo6oKFA0f8A/t52RzvDL7OsbYQnqNqioUV+thdO/n0PCE8Q6kdbFsJjPErawsjxlVVdDggOM5+YyqKtx695of+JFkdXr+RsnHlcsiwkK6Jz+6X9KPJM+Pk3RORfy1Kul0igaHhl7J5rRUl0XNzTuBvZyACLZzir2eMcN8zQxXRs2VGdbWW4HclQIiRfPSl3hjjAUfbs4MYgrWAlXY3y1bn8UMyWe5N5RC2VlAENdZNL6K/PmI0PcKKKLQfE8PRB3JodjcS/dohV1EWOgVXoQUeTzuZ+/cFRKkrivr9WqhOd1Yhs5zLGVTnVem7cw203Rur90O9VmOruttwdBn9stD/b7pDo6lbKozWOazc27dhaZzU+0mKdDrV424X6XcjHCcbkxihhtT0MZx741SBcv4Cm51MzkUKT6Eei8rpV36MfbdUfQaQEOFOCe0l9n3chQbx8n0/qGtHElR6KNhFxMWV/kVVhE8CbMLfZWB1O/1GluAZnW7ry00rtyPUeFYXQtt6dzggX11TdpzQVMr7ZihjRb85qFZy70ZVTbXpnY7D5hL5wZP8V56mN0M5HEGJhM9dQPMu97o6NyW4ahV3ZDa2XVexhloJgFbra48gNatta9TQa4a0PFA9glI0bnYIrtzleUxVZFPw+LRdlFxpQCe7MEUDp4pfFD4qgKg5wCkcwcQvrpQfLwPoH61fFD4gkKx8GgBABsG55K1dgZtNz3lxxZ31c2+unzz4/pgpqbuN/3ID1tkw2HgsFv6zSHXZSw3yw/uqxjLXfnpQaGJdXQ04Dg6GnOhFY6f/mq42fGT3izD26qR4+IneesU2iQ6UWAXOyosptiFs3FfVwsfC6Xbp8vTaRW6T6uoPlNgFz4d7+M2D+WrigK76LHQbku6MN6RArv4sVCVI0O5dLoQsgC0C+WqsAshay00lAN2YWQRym24nHfXwE/9dzPghuYDv+aS86fLTc07tn/nr77k5P1NTbL97vz6y//a3uR8/kvzg/iN+bX4tbm5+U/9hvzmAAA=)
> 
> **主机签名工具工作流程**
> 
>         - 主机工具需要 `efi.bin` 和 `dtb.bin` 路径（绝对路径或网络路径）。
> 
>             - `efi.bin` 包含 `uki.efi` （Linux 内核镜像）和 `bootaa64.efi` （引导加载程序镜像）。
>             - `dtb.bin` 包含 `combined-dtb.dtb` 。
>         - 主机工具需要 `certificate` 和 `key` 的路径（绝对路径或网络路径）来对镜像进行签名。
>         - 主机工具将 `dtb.bin` / `efi.bin` 装载到 FAT 分区上，该分区提供以下目录结构并遵循其单独的签名过程：
> 
> 
> 
> > 
> > 
> > ![../../_images/1_efi_bin.png](data:image/png;base64,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)
> > ![../../_images/1_dtb_bin.png](data:image/png;base64,UklGRkAEAABXRUJQVlA4TDMEAAAvVkEoAAXdbNvq6NFbwlcCJRA6dEgJCh0qdKhwQ0qgBEpQSAmEG1ICHXBdv/gOGs942ONE9B+2JLlxm4Ffbu8C1AE5wQeMj7FRljH+1MAyxo9lxv2xgPHTxPexgNE+/vM/E0RQW1ICUJaUA9SW9eGP/3z85+M/f1WIiP88QEgyfQvloVSg3hBkMHiTDZvF028caOYKEB5KAcrDBOF2FgOCxdP7oBHSc5FAD4eQ3gZqPBcReDhA/KeHshNoKzPnRoA/2gyh9uhAe/uStwH+lIgO4GoJSZSJjZ8E9OgheRpMlIhN0IY5gmJQT9YGuDhTwaLM9J2uVL06GXPk6QyNiaDMXCaadfQ4C4qMwzO1fJEymW6WWSeqg6yuMRm7iCZIQzOoZncK7w1IqaqvTQF8HT2CvtiBo42eCagzQOx9Bwi+jOqBLuhpo3igMiSZIxPctPbdtFnVjZUvAGlcqmQUQcod3aCarDbaBpjugPLsvb80ntku/soFE12B/YKvTgf4Picrcz1cn0Zm5bg2/cQzGrANyVXzMoogBd2gUn+aHCUbVJmk/Mo0iKe6O9AFBTMHM4M+lLodPK/OJIfttD1PwbwJHlz8KaMIUtANSnRBjjchHHf2J+MhMbkXUmvqlRJQ5yxxhkYUXNrkzEAM2VWRUQQp2AzqwoOESdKLIq9/YWGJCfv1NBFvIbHD42+EJwmJ8bRUadGM8XbJQBHw8p326xkyd+68Kar8kg0kKHDjFuKhyt/BwcvsXPz5hVWQgm5QKUe8/5IOHC/9Y49jZ1/VTZtM4kWOd0Hmp2R3OOSySa4qXdwTlKYDjW7QlKwdDMKhflAEykuTgHC1IYRp0SHObYjrt0Hs4yRQv0MjUGxj1OTSXATKo6ttiE1QAfbRTpPBAM8WwNau/oYTriKejbchoycgvPhPk7vY2FbPRLg67iF0pjiHGbbsedcsyiDljlHQZD8YDUJO1nYwTrFpzphdtFf/xTcHgPY5jz2FK5GpD+WqdAKp13LafB2lqnIS11GlSzwIzNRo7NqLQ+X5tQq6TLmoGFS/I3vA55GxjfnmgXBtkXDT1uOOvqx/n/Dxn78y0PcFjG8WFjGWllWNj/98amHDppFAj5vVtzQEBI0IGAGiTAHCClGB+mAaIa0QBSiPQI1/ZLkx+U4Y8QIw6qSpM+7N6qsg9q/g/X1jnXxnIjNNnXFrVl8BMs0q3/jNOPnOdAf+HD0CG0ef1acAypPK/X3vym2T7yzwBb8BjWGe1SePcQlw7xvj5DsTnW9Imd3RZ/UpnPwIuwj3y523Gc45zGO6ZL3lX4Q0IN5/yQmcDH1W32pwa/JdBU71gwKoM/RZfYuCcfLdVcSeeRtSRttZ2SKo6bP6FgXj5LtDapoD0+TZTh9Fn9W3KFgn30UHuiQk7OO8NKXB6kzNPKtPvuxeQeP/7WIAAA==)
>         - 对镜像进行签名后，主机工具会将 *Auth* 文件复制到 `efi.bin` 和 `dtb.bin` 的目录 `/loader/keys/authkeys` 中。 **Auth**  文件必须与密钥和证书一同位于目标或安全团队托管的路径下。
>         - 主机工具必须在加载程序配置中 `systemdboot` 配置等待时间。此等待时间将停止内核加载，并允许您查看和选择 `systemdboot` 菜单选项。该 `loader.conf` 文件必须在更新的 `efi.bin` 文件中可用。
> 
> 
> 
> > 
> > 
> > Note
> > 
> > 
> > `dtb.bin` 文件不遵循该签名流程。
> 
> 
>             - 主机工具将配置 `/loader/loader.conf`。
>             - `loader.conf` 的句法是 `timeout x` ，其中 x = 超时（以秒为单位）。
>         - 对镜像进行签名后，主机工具必须从 FAT 分区中卸载。 `efi.bin/dtb.bin` 将已签名 `efi.bin/dtb.bin` 的主机存储在与目录中的主机工具 `signed_binaries` 类似的路径上。
>         - 以下是已签名的 `efi.bin` 和 `dtb.bin` 的目录结构：
> 
> ![../../_images/efi-bin_and_dtb-bin.png](data:image/png;base64,UklGRjpaAABXRUJQVlA4TC5aAAAvY0OgAP8nJEjw/3jrBEzA/Ce2e/jj/3910/7/HkmbtD1JJYUihWLFtUhxH+4ydLi7DDZkuA234W4Dhltxd5fiToHSIuekcT3n/sc5SUvpIG3er/ci+j8B+M////n/v/o67B5wR7qfZePEiZM83RP+MqX3aespFEpPt6LY53S/muQBj0z/q00kY1QebEZOVPCbe3nowEFP84E7/L9O6N5jhz3WR/cVTAuWZwvL4mkOG2T/1wk3w4NtjU4LZpMHuoPt38fiybKlCfPkJFMHepDVCqIu/0ImT5Ylrcj015ZNHuMtaytlVMjDwoMs/JJRIfcHT5K5/X/++89//88t867tn7xfEiI0V7xfPpbId+P/PWHjdN4vwubQGulS7LGj0tfsgOH0Uen7gO3yUa0HbiUVS5daTS4LfAIOkMu6wP0cdMwDt4ai0qUmUpaOPbp169Zlmg5YJle36dGtW7duS4Hz4RTjNTKVKiU67Xa71c4DqyjfM6fdbrfxwMWcdNiLpEoSXK+i/G/hMv3Lyumd7tkMjlRl5ox8yggGzpoMQc9Zvw6v42zJ4HWc/TvhVppS+Ytbka/Sz9aE1n/klm5O7RXm1DQmtGt8ymibhy4S3PtcP3Tl13lbMXR7Ml6VDt33feVMHVWS3Mofl342m0pdd+tBFar2IDX1oPovUuZ9RRpvA2DV6pwSb0rRDMdXeZSHlvIALFoDL3EvO60XvgfKaIYumuNy7qypc1J87uzJc1J+dqwblT+D550uIl+C53khXWwulXPvY6fgAVxq6k2NU6oaTRStyFHpoVQ5mvmVCtBy0ZSsjeOlctOG74KKlBYucyO8/4jhw4fO0ol8gnuNGD582Khb6XCCkTUhLZlKOW+ksgFU4vX3RZnQgTNS55/zZ3zF+25IB74S+ZP0inS4VP/1Ziry3UtlQ+Vl4r8vihd4gbRzKhVcuXXr1q0xFpE868KtW7du3fE2HcaSxCVZXVl0HKe3STmSdIAtidPZAQhGTmty4xbMWk7nkDJxJgC8XuuEQ8dpzW449FouyeKGRcsl2dE3BQSjljMICdVFRm6cIvcZjjPyollw6jitKXm8QcsZ8bSgyMD1kZe8y3EmQbQRdh2ntfzLlch3I02pzsP1KirIwWU6i/VYl5yqHH0vOkS2090KqNQlR16yi64VqxYbNzKXutD0VzD+U1MV2vyUQ6r8nbttM6uLzIkT2YaHDrYBzxpGnmRnFVZlbX9dkBBezYgKVOXpedop4bjeK6sq1wRTv+QZdjYMVlXY/qgGTbSjt0pJsgCVqtsH0ZzPC4uqQlsdtyeDXV89UFXn4K3CtBxorFKQnFGpRupEmz5MyqfK2vWS8ANR+Ytbka88fvlOnzyeao/ccWVfwMj9GcYv1yYB4MYyPgFMgNIn2ywHgJPBhQbkV6n9SNH2znCVmvGRha8XJCr2zatmAmTKZk8B6DtRex1wJypwcD21mpHLyp4VAAinyvn5BzD+vlnXOQHwq7L7KBgmoGmZZOn7+8v9GYZpXkTUi1GQzJ9hukoMqa9WMQpZ4EqnW4ltlD4BDMO0DRc1YnxJHsAwIyTGVFAzjK8s224+o4pMmYoVLVwI2/2o/g32xVDfOlo45vpSu5vshw1RlHUDgFM5fXzD53x+1IoCwvwa32R3lKWG7yR8lJV3J76dEEw9zYC+K3USVZL7Zh775vOyXNT2PYD7NWX1Did8vthClusogIulKTqGfTowRJ6sRYHU6Ql7vpZSRhNtMLLjFLlPs6yBx5to8lX9fp89VZ7CjrsjjFHQ0Dg2poxSRst56Nne8pJ3WNYk4F5eUmhmPGX3FqLI2z8OVZLSF+SqVKz+2cXrxlTjPQDr4j5GXIqkTiYA/Lni1MoKnIqgPNscwJUyRJ0/AcJcWe5DErK6DwGY+lHkSXcqU9AiG+AcSYXPA8JkWZOXAPClOf1mhzBUluMQAMva3MmJr03NnwP4NNBPBMxS5LsH8ZtoUi62Ajiah0bp3XhajLonAnjTXgIYJi8TD/G9vBS81QFgWwjNs/4wVIy3WSwWsz29oASbmvUuTikDF0LsNAlYQHkOQHIaFT0PnMoum8IDMA+kWi8A4HAmZq1EkRMQ78ksW+jeMAcAbA3S7AU+NKVJSUlaLknXj5q9wdu61CsJAPgOyTmYW74C4kflpKYr8t6UKke/GQFAqEf1XrmxPtTnIMSX80gNlpd+LZWb5tgAgC9O7b/8IEykTC3at23b9uehL4HllO+lq/PhFOORK41vcQNFHpMAYB1NNT5I7ZBnWgucyua3HAAsw6iZVnQkLGCNRPQtidgq9Id70yC+Xkq1B7geTf5qlUqlUsvpp6e4XJqWQrKPSDBwYq0dC/zCL0h8qJ4Sc3gRxvgUvu/GKJ/CTySeFEyJzZDsLqsU/4OwjlxqrgK7Kec7V3dy0AmPXNS3YJ9K5Z66etuaGtulzmbzWyTyXyoyD6GmX0SHMzNrJcpdl3hQg8a6N0XiVhnVXiAmkhSMZJBmAIuLpWi5VG+RobVKrInBPEXEJYn31VJipkNivE9Bd36TF38q8ahASmwQJPrKKvwoJF28IH3LBOgu3rS7sty6oEs3mUKV4lzFtaTGNjcWf0M3S4t256SpHCttEnAxKjmtGHFIapnwA/cj/QODZZT/hCv9UKqVKPWPPHzH14m+JRFbmcal3NWytADuXoqipVJ9RYKeFXN2zPcLvyiRUD0lZvMSY3wKP3Djd3lhqacFU2IzJLvLKv2LJebOfDWDQYw8aKEEbxKE6VTssoQwnio+/DpFT0j8zShWpdzrutSZc+dZdRpsFtnbidzdml2+VeJBOVd5brv63Shy1qJW791YFOhzXuJiHjfiXM21ibSFqbf230vbv/uzDAZPqlLNDwBsa7t9xuEA2UALAOF8UerLfx1ZvUcA2K4UfTvl+EGUfbdd5NBZAEcnKnQGgHVCQHJio6njOwDxLeRSi9SaC4Ag4E00Kf+yAtidk+bbAd7AWQFczENDWABPqsik/lDmeQLwAu7lpZDtDoBfFSjbwv97eWx/ZPi5PvTzTe7F78rqCdANpYCet7iEjaWp3BV8HV/fSoe5V31ksj/4lMPZKMo79Rn38dKsgisB7MtDDS9y93qH+MoaucePlsmGvGZP1vZ3cTQPDX73+CQr8lGNevdlb0EqeR/A3dqhs82AszP5TY7/uL+sn4u/NTQl4e4Zo8hXMysxYWNWqv4eGYjwebAf+avU/jk38sDLNkqfAJXKX1HsgADgZCb5XxIDqaFETLDvagCzqX5/hlExMkXrdwD0nai9qDxNkiqu3AOA31/c1ydApVarmK0AnNOC5X4qtarjQEUt95DYViFn1GpmZm0aJ9K3U8gYVdcPeFOK/qjOqFVKWdBmAcC+TNTtM4CXP/n4MGp16OKitFSUUMtHplL/moR74TSjGKNWKWTZjiFDEdi1tTRMrqHnHQDwcV2LcCak2sxHPABcjYr4W+ScqOliFJ0vlmcXgNWaQZa9VRim8ooEALAN0wy2Ac+aav6SeFwn8iQA8C+mR6mZ7BWHnrMCgHlf0xCm9BJ9TN72793Dx0VRTGC9/Y4xmnkCALyeEMFELtDjcx3N1cTR2ZiIHpedAHA3WjPbDABx0wozmtannV00WyF+OCwLU3y9Fa9K5XrxrH8ok3/wPSGDEXgDx2qtkOaNWpYzOCDpSOJsIphZgyByaDkbACtrBPQsq3dC0sQaAfB61iLh1GntIsCuY1mt3gqXRo7VOeHgDHwy4NSxrBEwsxZI2rRsklWAoGN52LSs1gxJPom1QNKexHImwMjaJGDlWJ0N4LVawMKxSVZ89Yw3P+YZNlZSsfQC2/kzSanIeT1Gl56ySVM9vSAxb9jVVKSvQbfSUWBlk9ILPhbPeyMVGRrQ3fQUD2saVyJfqmr4/3YyPrh79+7d2NdOdz4+uXv3yUf3Eh7dvfv4k4T+rruxrLfEdn8S5xv7ysXTWTWURP41Z7129XBmJSJS1ln4HsA+cnuJt8QcYmo0bVTZhyrHSRyIIopuUr8EUeVLUvuKkrJCowaFieo8BK43btCwSS1SVmjSsEGzGG+J+VTkgcX4dnE4zXAAuJyNymx+bdY9WpCNKsSJLmSninvijLq7c7NTzU8QTHqD+RmFHzcb9Hqr90SJdwDQnerpAF0bKnEbkv/4y8cCMP5E5Z5Cck0ozYXkJ8p5Fd+FGVzupSnFX4tGUGUOOKymf+CyD1WKB45Qpp2Qdrak0jaJeMpxMQPc/TRoMLU3AlOpTLyrAxRyBJhAFXQusFKhup2Rbur2ja43rVu/aWMKb1q7ZM2mjSm8YcNdN0pxAGLL+W4HrD2op9HVfRWthaMhtYfri2E+ezLONSb35fRtjnEj95qDB1dVDhhnBd79RDPg+k0JmgdrVprqxsu8tDrjXCNq29/d0cP7f4sDjrghHTiTA97XoWluvC5O82HN5taLPLQm41xDikPaOZ+yjZk9+8+emantJ7yrTX+6EVeK5sCahWa48TovrcxIdzdNidIBsB3KQ/Ogb0MDLa4eBPtvhb0cdXfjQpjymLdG8dcQD6IoHkOp7mdX+yjnRfCdqRbvaqk86IWXxzQKs2IpMRdd8IOpzmdgEeW+6qot1bZ6a5R4J9GdStpxpwB1MUgdCZYvBnAvhLpYpP7JLPsH3hrFXoIXuK05aaYAzCQaGmuA7d3aAtSIBeCYQjTkgRmO56sjqJnRS2MOhXb9dcjQVnJqmgggaZiM8nYa3qcaUf2bECd2J8rfffiAUkT1H8FV+AWvinUkXfb3eIgtK5uoicjnp9nvIa1bUi+IiNR1FnyCG8GXvCo+7tshPvQMrj9d2L1j15n3cPfDxV07dl2Mh5vWvTFar4rv/AwWiZFZr6YifU267ZXBtmnyMBWZBkY99crw2P7nv/8VYj1zQpuKHFf261IRf+VIordAYp7MV1ORvjrdSkX2aj57vQU+lsh3IxUZGtLd1NRAc8gbJtTTZ+N03i/C5tAaGSy+xFv+3Yzx8Trh+2slFctgUZvZntZoH9y69fSLG/G3bn35GhdaElWLxdPbhu+rNRSVwaIErUpbzJtbERHT/IGLZ5WIFnyFV8WpbIPqp1/lp20Z20rTmtRzYtmDr6cfSoom/QY0LLVPyj6EZDRRSLk5VCABnOlqEK3yFuAb06SvN5nC/zYBhjsfpU6F1qlAk79CNxoBAMat8+I8FlZO73TPZnCkKjNn5FNGMHDWZAh6zvrVBIuJ94DhZ5rw1Z6G+a2B27p6fsd7fZX2NF3kvsdhTWj9R27p5tReYU5NY0K7xqeMtnnoIsG9z/VDV361F31anBZ+rGLSlHWAzWZ3x26zOd1x2GwOCbulJf1hs9kFAILdZrO74u02m0NqBlV1uLeY2js7J4+32ewSDls7Gme1OQC7TfBYzKZS1916UIWqPUhNPaj+i5R5X5HG2wBYtTqnxJtSNMPxtXZoaEjSj9WRNGXz+99yZy41M17CeXZgkUxhdTbopO5NLZs5c/lZrwFTM42C/DWapglIXNgur0ZTavwr0at5TXNrQsvPfAeAr0Oz4PazzBFX0S45tqNtsmvyDb4OmAZolOSv0YzGl59y3/VYzKVy7n3sFDyAS029qXFKVaOJohU5Kj2UKkczv9q14sFrHT9SjZmhm9e5XjN/7bqUX712XYqvviVIlZF1Ka7MkZWo8ScA9j99KTQii4wavhX9k5mCwrP7U4lrMHcvGkRhRYt2/yJMoMwFixYKpOrvAPSgrAWKFvSjxhyQUEB+2vTs5o3YLxJ8N5qNZJlHy0ILFM3vG7gZlrFFgymsaNEZeJuHznhKBCNrQloylXLeSD3OJNaOH6nalGoV9BV/h3Q0UeT857HjlLJxADYofXqci7s7L5R+sQA3slCDQ8+fbClG0fEA2tBkABD2DD9uAr87u3weIKwde9EE+/pA/y3Aq0jF1M5BRNR0l2i/vDyXvIW+ZQ+ZoZvomyMOwC80BQDeFqJznpJU//VmKvLdSz3f7veac83QIYNT6YThg1P+qItyVP42APSm0p/BlaPODgBYQVnOA52o3EcAuBji+xeAn2miyPVg6gk3G9Jo4HURonwdB/WqQME7AbYyHUayPpXzewZxE1oNoCNN+tGyJHFJVlcWHcfpbVKOJB1gS+J0dgCCkdOa3LgFs5bTOaRMnAkAr9c64dBxWrMbDr2WS7K4YdFySXb0TQHBqOUMQkJ1kZEbp8h9huOMvGgWnDpOa0oWb9JyepuI13E2CadBy0mahR+ZNLY0LYH4GOW5jrMav8sQc/llf+JzHloGsfMX6syDb00T3JtIfd3pTOOA1wVoxF0Ar2pTNQNmyrsDQAeaBjcPhAb0Gzp06NDhJWgQgA40Ufihsh7rklOVo+9Fh8h2ulsBlbrkyEt20bVi1WLjRuZSF5r+CsZ/aqpCm59ySJW/c7dtZnWROXEi2/DQwTbgWcPIk+yswqqs7a8LEsKrGVGBqjw9TzslHNd7ZVXlmmDqlzzDzobBqgrbH9WgiXb0VilJFqBSdfsgmvN5YVFVaKvjdve49Q1DVcV/eygAceVD/xF9XFA+UBWoCQ1WTzF6UNZLvKTw89ikzKSX0NelgbiVXXFZwjGGGpncsu4Z175pk0jqJ9LvHtm2adNw2XjgdT6fOxDvojzPHkYGHnn74sWHxjT0aaKrTf7ketT3Xb7TJ4+n2iN3XNkXMHJ/hvHLtUkAuLGMTwAToPTJNssB4GRwoQH5VWo/UrS9M1ylZnxk4esFiYp986qZAJmy2VMA+k7UXgfciQocXE+tZuSysmcFAMKpcn7+AYy/b9Z1TgD8quw+CoYJaFomWfr+/nJ/hmGaFxH1YhQk82eYrhJD6qtVjEIWuNLpjrlPgB/DMAGDvgAPc9FyHnhXy1fBML5EPsxkT8oaiUQKv4DFFGaR0NWmgTiT2e+qhH0UNTK486hBiA+J+wO4XS1YRkQkmyCSxUicpex3dhDlypUzZx6GgnI0+exis6LQseuSNz5+38mUqVjRwoWw3Y/q32BfDPWto4Vjri+1u8l+2BBFWTcAOJXTxzd8zudHrSggzK/xTXZHWWr4TsJHWXl34tsJwdTTDOi7UidRJblv5rFvPi/LRW3fA7hfU1bvcMLniy1kuY4CuFiaomPYpwND5MlaFEidnrDnayllNNEGIztOkfs0yxp4vIkmX9Xv99lT5SnsuDtHcvjMTGDvjh6fCDzMTyt5YJg8YOFHdn9xWddXZsGDskniMuW8hL2qwDcS+vI0G89yyg9K8IOpiyCaKNLXp7Lbnr19PYD6Al+iqfL+p2/fNqVxQFJxWipxgnI9OVEkPDREowlRkr/mJ87F38oQLdz9jpOrUrH6ZxevG1ON9wCsi/sYcSmSOpkA8OeKUysrcCqC8mxzAFfKEHX+BAhzZbkPScjqPgRg6keRJ92pTEGLbIBzJBU+DwiTZU1eAsCX5vSbHcJQWY5DACxrcycnvjY1fw7g00A/ETBLke8exG+iSbnYCuBoHhqld2M0NfoAwGbmXRmK0wQTgO2Zg14hlXoEytBoq2gKRcXjfnb5OonTspBjMJSmYRLxuWk2wLekyaIPFHYGAEaJbvpleQgAbUToSI0E0TiK1vEW6Z9pvNkKOB/cMQPXctHBH4MSbGrWuzilDFwIsdMkYAHlOQDJaVT0PHAqu2wKD8A8kGq9AIDDmZi1EkVOQLwns2yhe8McALA1SLMX+NCUJiUlabkkXT9q9gZv61KvJADgOyTnYG75CogflZOarsh7U6oc/WYEAKEe1XvlxjRFpuNOSIsEPMpNGwEgNoLueVDKEw177LQcy0rDAGdbijzBQX+pJjXVAzNJsy6Bt8T2pqKPAaEddTRYPzg+ykK3AfzFUtQPuOunOQU4j0fQBAB75MwCFtotYTQZrjvQVAA4o1EcAkzNqdI90fMztu+70vgWN1DkMQkA1tFU44PUDnmmtcCpbH7LAcAyjJppRUfCAtZIRN+SiK1Cf7g3DeLrpVR7gOvR5K9WqVQqtZx+eorLpWkpJPuIBAMn1tqxwC/8gsSH6ikxhxdhjE/h+27cLEGFliRY3OCRWJRmWQGsC1E+8qCU8S1PhQf0zESVngC4U4yUrYd1UFO5mwA+NiGqP7B7JGXZCQBzSdWpR+cP1uaUd+rCvlkzibRVqej0hb38w3zHATB2IGo9/GcfavPRjbY0SQAwmWg+gHP5qdDvC+cOKu7LAmhPE0RxBens91bUt2CfSuWeunrbmhrbpc5m81sk8l8qMg+hpl9EhzMzayXKXZd4UIPGujdF4lYZ1V4gJpIUjGSQZgCLi6VouVRvkaG1SqyJwTxFxCWJ99VSYqZDYrxPQXeEk8UVisw9L9jdwFCFeuEn7kAR+vmTB6UInZ6dh0jd8R7EV7tlJaKc/WIhjhtegIgC2x2HOL69jOgXLR63Z4gChq6jngBut1IQBQ5ZRKMBIG5wLiIq8UcC3PyZJgLAQV/aCQBXOmclIio33gagLU0AgPicdOFHaApVinMV15Ia29xY/A3dLC3anZOmcqy0ScDFqOS0YsQhqWWCe8CrBcUVstDlNje2hvn4q1T+vqWuCx6Uc/stiN23+4IO0uZrh3bH3LLDZezR3fsvJUGaO747Jh5A0oU9u68Kzt2xAMCe3b3nOowHnorA39q7O+Yx3L69+7nIeuJgkgjGm/t37z33BuI7u5+JbCf2aH+AsIzyn3ClH0q1EqX+kYfv+DrRtyRiK9O4lLtalhbA3UtRtFSqr0jQs2LOjvl+4RclEqqnxGxeYoxP4QduwaE7UpYCT7v6UF01sWUgU3LMA6Raj8D3549MjDxooQRvEoTpVOyyhDCeKj78OkVPSPzNKFal3Ou61Jlz51l1GmwW2duJ3N2aXb5V4kE5V3luu/rdKHLWolbv3QNwOR8t4yUEHMhU6IXDaLQI+D5IzJf1airS16Tb6V9PqlLNDwBsa7t9xuEA2UALAOF8UerLfx1ZvUcA2K4UfTvl+EGUfbdd5NBZAEcnKnQGgHVCQHJio6njOwDxLeRSi9SaC4Ag4E00Kf+yAtidk+bbAd7AWQEYzKIHBWi5G2GKNTqTyWK1fh+w7Zo/SkWmIeWepX/xc33o55vci9+V1ROgG0oBPW9xCRtLU7kr+Dq+vpUOc6/6yGR/8CmHs1GUd+oz7uOlWQVXAtiXhxpe5O71DvGVNXKPHy2TDXnNnqzt7+JoHhr87vFJVuSjGvXuy96CVPI+gLu1Q2ebgeY/H/nIPWhP/tchwSOxpkypUqny1+21W/894LH9kcHnwX7kr1L759zIAy/bKH0CVCp/RbEDAoCTmeR/SQykhhIxwb6rAcym+v0ZRsXIFK3fAdB3ovai8jRJqrhyDwB+f3FfnwCVWq1itgJwTguW+6nUqo4DFbXcQ2JbhZxRq5mZtWmcSN9OIWNUXT/gTSn6ozqjVillQZsFAPsyUbfPQG0lo1KpfJmZVuBhblrOQ1gSIg9gGJVawfT9lCEJ7NpaGibX0PMOAPi4rkU4E1Jt5iMeAK5GRfwtck7UdDGKzhfLswvAas0gy94qDFN5RQIA2IZpBtuAZ001f0k8rhN5EgD4F9Oj1Ez2ikPPWQHAvK9pCFN6iT4mb/v37uHjoigmsN5+xxjNPAEAXk+IYCIX6PG5juZq4uhsTESPy04AuButmW0Gbv0RHcjk7njQDCAuWrMduFLYf8oHln1zpqvcZ0/GJPAGjtVaIc0btSxncEDSkcTZRDCzBkHk0HI2AFbWCOhZVu+EpIk1AuD1rEXCqdPaRYBdx7JavRUujRyrc8LBGfhkwKljWSNgZi2QtGnZJKsAQcfysGlZrRmSfBJrAQCbnmW1Zoj5JNYGdKUOnyBmC9I6IWPSj2AZ6stJ3M5FmzO2rKRiP27diZl++wv3ZEdJyv0EGVo2aar/uD2p4usXoFIxAcr8e4QMLbCyST9ueDm7RWaGCau5+ImA7wDryaNcKnJc2p2UnvKD7zBxLMsZnEi1aVti7sxXU5G+Gt3KMJX607aPJfLdSEWGhnT3P+xorz+0ufhy/bm3yjoqFifF/0Y1DV4qc6noaxfdKUrrpTKfirvAg4UHBe+X7/EMLrFpk8NkA+A0OwCbycxLCGaLIBLMFh42o1nKZMwQdz9tWh0+AMDu/NNNG6ODIwY/ED2OLP9B9DFfxVgcz5fvgmhxWLsMcRM2rnZzxcrVKb58/rLVKb1q1a2UmEqNAKzwafQLZcvlS8UfALgmC3smekdhF2FqTNU44Fp22pvxTV+V0sLRKTGDmgNYoyLfnlderc5MgwFcD8j5XPSecl4CnuSi6dA3oN+Q8c26ZsRwtyeOGf4t/nriK/gGLgCAMVTZlDz8RdkerFNGJ2aAS2NTgkpCfIDKJqRAUiMqX9jvMLxAykgcoXIfUwA38xANdnqDlJaIcfVCFO8iNjvRUIe3yVV/qU9Slh5UOrvfcS+MEu++yh1/zTnRMcolWkulY4dR5U/eF8VeCA6Hw55SSfmo40t8XJ6d8l4CHuekTXhclMZ5W8yhkI4D+/bt2+s0ZlAzAKspSuIQlU0EMJ2o8qC6VDxr7osw/0JtLMByRcAxL4v15HI8ZlITAGupuMQRKsYC4MblJso06lb5TFewjrLeB2BqS1EG74rPR/ZLv8Lr/bcBxO+/JPFl/wUHxLcP7L8NXD6pQ+yeaxC/23/Y6l3xnZ/BIjFvlqveL1yn1o+9Xzy2//nvf4VYj8VwacGDHY+8GhJzZ7qSFoyi8V4NH0vku5EWTJJPT4+wcTrvF2FzaA0vmJVULKOE6U1ianG8f/Pe6mFYQ1EZJbYrq7phvXfVlHJfRmsoYDZeXU70xlhDxdw4HkKnU8w+mrI1r/ubvj6Nc3phrKNSbuwmOpxiz6JoPQRtfHka5vD4WDmDkIp4I2dJZ9JuXf4pxU6FZn4BgD+zJBYen8WhTbhUFNc+dGo601c9oSoUh3/VHxn7RIp+l4qe1KRBHrQZaYjDYJZwGszuOA1JPHiTUXBPMBsMVpHTsFeV957BJMBqcHh+JlPlVFWHhqbL7M3WWOJi1kY6V6Z+IQ11uF8x4oNbT38vEKCuskYHHA1QkswvoFgC+mXdkXFtMjVdv9zNefNXLE/xZctTftkxq9QaKiJxkEp+dGGdSDlOCLicjd64cyavskDZMlmonRYXy+aX+xUr2/yLvRkty7g2hlKtD33FBlqpdVRKIobKSZSEbRJFXgRwJTfFufG0WPCMD8C5KFroAM6o878DYG5NKz1JNj3HJVlc2QxJHKe3uxKMHKcXXtR1JRiTOK2Rl7An6QE9p3N4lk6N+v23VDp9zG8pv82SUuUd06jQRSRvJk2AeL+6EgccU0e+8Dg5H48trVJF9D6kFzmu/1Y1pyqw1PhYQcK4s06gqtz2O/Vc6P+un1UVVmedTnQsX+PHMWUDCx/0LKWtyZIXmRdQ+hKSp21Jtfr16dOnT8uAgLfAUXXkc09EvtMnj6faI3eSZVudz9efYfx8A3olArhW2i+AYQJ8fKPPij4P85f5M4y6arTUmx7+SoYJ8PEblARgh7JMnxw+vj7T0k0UIaWoD1LgfR1ynTPeU7GSSJmKFS2SIxwIp2oHP3062Zp8RgjApTp9Yl6x7/7MTN0BCEt9qcNL9kxDhVzC9qs897zX7JPfQ3wm8MDOzL7ynJOPLjqTbiKLWq8M2ZgC8fVozr27ks+dnopNmhBVKlb/nJy41lT1BQC87kDl7gMOvQUAjEOo7kfgWT1qFA/g0zCpkznDdkE8lao+BnaGUdYtdjid6RdrXJyQonIYQ7nPJy+xAS2Hux4JWNnUrU/OcX/5BEju82EWws11VPISsE/tOx/iWxUkJlPDVzotp9VvDgzbC+wMlU3h8Z39o7WJ8n4GIMyl8hKloG1Dld+6E3cpHrD1pQ4WT8e36mIbRR6XulGU+kvYDFpOu4iKnweWU/ELEs/qiky9SaFWif0o6G9gZ7D6H6Rv3GL8xifyzybKqaILxBalDkZX+lbU1QxsU/ou0gH4dPqlR8o+iUrfk3rdgjoBsFwZVU6jUvlRiQvAUoq6LPGkjujDz+QTwIjVIZUviQLTOywdiBr2KUE1KDoRWEslARwLpnFWXM4lii1GZT4D2hEk/3nSzLF1aB6AI6p8Eq1ohadoApW+66I5dQYSBquVDMMwSollyXndlJq9YqV1Tont6RyI65uJqNjih1SMBTZQMQBY6UP7cD2LSNuY2psAJM2rQkRUoPNdAMd8Il4AsDWjVR4irKICJ6VuFJH9DmGtr6z16USWXeiixEWJ53VFxl70swHupofAej3m2HPg6CUnkBBzRYQzB59Df/aoBcCTmJeQjDsfE3P6mQkA2BMXzABwNybeU7RfHrxEaocs+3YkDaQGXwBgvcQ2WdAqiRsVRBhNxc+nt3wX/wA9rEJ1PojedKCf4vGhAzV3ADCMlLhRmlppAbxpL5P4R02/WkS8wSh4IBLzhl3NmMCv9KW6pz99PtWawtYAjkmUdW7C5+MtFBLOKfKAYS++HG3k5yvxuTspu1/6zD1bW6mvxQPBdWn7OKPBRIp+B0A7NkAeoFIFKMNm2AHcrq7wUanVIXmUBc4DeN9FKQ9Qq7MNaUuDAOB1R6XcX6UOVPkNEIAdjP82j4LH9kcGizSNWQAwxXTPz6iKDT9vBwDh1Zh8THCDo8eKVb4LAIlLyjDBjQ9ap2mmiJC0pX4WRl38l01fABwtmP+wl4OF1QsiwJzEsjorXNq0LGcEkpKcIjh1LGcELKxZAoKBY1mdWQAAu1Zr93L4Uf//Q9lv3zB4vyQWyH7N++Vj8bw3vGBK5PtfRBa9PbVY9VavDUfv7CtTy7isE7027PVpamrpQb29N5rQjNTSh/r/f21u/hv1zXh3Jw26/nuFyPxt9ttEnzZ2L5s3X435HyS+LK+fv9Q0dqCL+8PK5C3R57roUf3exm1R+acbM6SVDpt1cJfL3Tu27Erx3TvX7/qKr5LhXKimgKAAUvzyBcBo36CwbFl8qP5HAGwbGanVPlUqyAeItoYGhGXLolQtAXAhrMhExj+g0fuMaAmFKS1cnYwt/tT2yOOLYwNooB1Y03tfAm9aEyRfDeAPCph85/qwUKJBAE5kDl2ayCfNUwbeBC7llVODIxditBnRdBN/6dA+dXbs2aF9yp93T1eOOlgA4E/KdROu21E/4H1xGgcAMXloIGBvSbsgHkojgEt5qMEXfD9nsEhbpU4HBVyCOCGnz2I3htEAYHeg4rkIvag/8KgQDZk2bdq06c2pJnApgq7Be2K9T3aTBFeDRgJwnp01uEePQjQIWEYlkiT6is7nIde1gUs56ZMXxVzKyUuwVelXIK5tdpIcDKyQ19C5czGCth6Vfijx3otim1/mBAkumubD0pwiV1998KAtDQRWybN9cedSTnoEN70srmdS7pI446s5judZlGcAYIDoRGa6KPpUjQYA70rQEq8NawOKummC+U5daqLDizC/owBiS9FgILEiNY6D/VETokEAelOh66KP9/TeFI1pOoDzuSik15Q+majkZcD4ExX9a8sfWYJ8BwJY40OV/xiSWVVW0R/AvQqUd8KGLTNqZjoPXMzhLVGXpgLA0WZBRBTW6ToA3GzqS0Q/z6ceAGwLihJR1Z0rqQcA3OkUTkSUv9s74HKQl4Rwes0DEbgTG1dtOWeB5KdDq1YdtVo2X4X4ztZV29/h9bprIliubFm1al+sBcCX7evNXhE/1P/57z///Vg8PZPoBdOFNnjB9KIt6VlWzpA+0Dtdy7kitKkXzDyqkv5kSzKnNyykmulPazINM3m/zKL2Ou+XudQpncjCGQWvF356aAe914tlGP30ydP0d1rkFJIhuCOkj4yg+h6nbWmO7tfIPhyAx6OLRuTtecEJzCvUSeqfQsN5WDbWiijQ7rgzY92Q3Tvc3Lp9R4rvXL9+546U3nrZPcdkCjvghLA5c0DWnNkYvykO7CXNHZGuBo2GtZM8KGeOTFnvZ6TrS+4r6dus746Vn0I5jwG4GhKy4COSVoaEHUZSKZogukERN7AzIMtp2M4NfZYOIuhYg4RgSuK0Rh6AU89ZXJg4MwDeqOV0No9HH6rSyd3BvTulfOfOnVL+Lze66WZRzuMAbH0UKyGeS0MF/EmV9QBmUVMHJlNjfEf/2PE7ioROFRm2N8qmylx7tRaIax/6u1PibduQeYB+Y70sqvy/PRI8HL1pH9LOudR+pKLoSQD4kJXpOmnSxEmTf6bmLGL9Q/YDutLKlcAx/0zLOA9aqfMnjqfaww+Ssy+Mqt4F8K6vv5JhAnz9+nKwDqBKDyT+VtJKmEb6KxiG8e+t93hsSVMq+lJfiN/IyXVTDrZ2NBQ4TbkSAcsfcqo56paHbB6RMhUrurv1BVeiqeY9APZR8pyzX7HPxmTyGc1jO6NcJhJGUN2XiMnhP/Ed+2DQONaj9vMI34hjojjKuuSk9BMB2E5lX2MA9QQAy+HORHnG6D1iyzXBqlSs7uVOA+OtilTrHgCcyx26HeLZVOEBXtanTiYAz+vSr8BUahIPwGoWPGo9P3Wm8s8lgo/D3dclfLYLheQnRYDx4W8+8jWeMFjY1G10p/mpBj4170E8i+o812k5rf6fkEw7IEyi4hcAbPHLvheYS7n3OfF9/UPQ2R5XgVobgM8laLJb/ATqvzmoqE0KwHAaYPOEfauWERTVUFYxFmLzIFKoVWI/Uq8HjuWWzwWEEdQiAbhagfIvfm/xtHUy4ExWGmaHYyIVOyNi734CgAtM8ZI0CwCePgbgGE6/2tM1suSiGq8kEjuQTwAjVodUOA98/oXacnj+k2w6AP5ElFKRqct5mydtDv2iAzYHylY68Lws5Rq1bsOURpm2idjmREH3RY0iRm7Y0FepOop0jUYLssp7m0VxrajhS1Za5wCwRB55FFsUeU8CgPBqaVmlPMs8qwdtJrXRA/ZppLwCPO6dl4goostTEVYqqI1FtKAoEVHlNbb0jSbvZ8j9pvEATAOpmQ5u3yonm8b/Sp3MIsCpO16dsu/xoD1ed9kJwLBrxSsAztt/r1u377YZkvcK0UaInQ8PrVu3/zW+k3/c6us/d6bcewBgIhU+5Z5tMLU/XlM2H26eK0WTPWhf92Bw5vsS39k/cJ9xvRxVfwBgbxANNIt4g1EAgG1+hRv5FbsIQDCZRLcq0BQPRxfa8O8gjKAuxnSVTxC2ZKY2HMD2lik6XfjEvVhftbtZ9KKeTE69nQCSBjc7Gs897UIRMR6O8YUP/Ds8LkarkX4yjH76BDj/lNHvDuBtFz+Zv0odqPLrxYuECUTMSgDQ91QwKpVKEfCHw8Pxr7mBssWmn/DTNO31ANj+QXUeAtBtb5SVURfruOETJI/mo2oPRcKDceUCmZxt9lmRPhDTbSOffgIzaxAAwMJq7QAgGDmW1Zl5SN+rIhsmiACbnmW1JnxP/9h8t/+offW1ijxH8N2eYSq+FTVL8HrZHUxz4fUyK6Tefe8XE2sQPC2PTyakplcnX2cE+M7/l+pMG1LTWJrondGLtqSmibLp3hm9U9ck+f9qsrJGt6ys0StlpaabW6s0XbxSZlB9t/6kul4lMWvfScyixm7NpoZeJUVogxdMGVqdoW9G2iIIggtBcCEAEIQytEoQBFeCkBze7kIQJHjeleCUEIQMXn+mIR/X/FIsPLzijDjRrwU2SMws+CfetwhXUEh4eF8DZlELx4bKEaWmx7uj7ZOnhx3A6+nlwyOa7rECewo2eSdxskwNC+z7m4SHN95qyrg1mdrs2eZ665q121J+89ZtKf73BZvUGB9NjtwRSqr1AUBDmiLRi3og/ufcSsqUO/dAI2ZRxQFyjYao3gdX1jGU+7QAXCigzJY7ItinpwXXc9IBEd+V2jgdU31VuXNnDd+ZcWsMpdoA+opNkqQ2DYr5DNuWTLQMQHOaIdGf+gJAGVoD8SwZ+fe8dG+SP82VaADzWCpwBcCboj7jXsB6OB8th70b9bIBeFGMYnArPHg9cHfqyYxbB3v26NY9dY7o1T3lV5qlXHaiXilRltZKUeZlANCF2jpELR3jqPA1AJhAwyDeKSsnYBOT+RmAzQEFviCGKnNIQzPkpMkjqE9KlKHVLupDvJoaG0S1FyqjrwOAqRa1GvfHH3+M6ymPiEdiGVoJWLrTNCce5gwY+9yLwH5yau+OHQtQ/6/TVGIjNTGKsheiyRB/qkyu88cBo6iOE/ciAy4B9i2hVKrvUYeXwJtWWUhygMSfKdVYYr2LOjMp12nR50o04+wZydsO4EKo/w0slzXVAhAujwiizN1fewVYm1HBDbeePfuF+gJo6mKQqzUp1NLelqKfAWAr0ga466hN02xdaAUk7XF/hdBQwRvgRXbfswAwSKIV9RYZm1I/URStT6GGeFmRWhsAoTl1dgtrqcyp7PlipQBspToGb4DX2RQHANwuSQMATKbsp+3OB52JBoiiaZTd9MWZIjiRmcbwwFry22oHkHT3nehzjpBG1McG4N0dK4CV1NDsDWBuRAXmrPk9U7CiH4B7+SjboCFZFUUUfUX9KdPgbiNYzKRGEuuosQGYRQ0ArJT5rxGQ9AspByxe82er0DkiDCBSbQeAqSG9l675XS1bDG8AxLbxJ5J1WOLbDQB2VieiGtuXUnfRo3pENNiEP6mui58swEz6CQBGUdAVIHFCCSKi7C1uSVxSUdUE0bHyRESlZhm8A8Cd2rLltN2++6YIcfu27P+A+O23RHi7b8veBODZlosScVvOC8CzLRdElh1/vwSAxwe2bDlwWwtJXXkaCslXJ7dtOfAEaWXGrzT2WaagPVJpbEaRLrThx2AFlf2SgWlisUM/BLYK1A8ZmH4ULxId8X653neKxfsl7f6veg+OfkgLPh6/60h3sXBGD1pnWp8W7KJmSekt9jmhnT1ovWhLWrBP0VaX7jKRmnjQeqcRynbpL1Oo5f+VZf/M8YDzyxfHN2L/zPJeEGdzVXgLPCha6O43ciF39BuPnpEzu+fUc7Z0iUPK3M+BG6EhV7+RI34RTz155p6hY51u3a0duj1d4rAq/wvgZtawa6ns/oprEsfU+Z554OxJSQ4Jrin1Nrl1vgitSE+aRt15D97ByCInpVpSP/culKRV6UmzqZfgwdusVO3xZLU3pC1OJ3DM1Q3A6RSSxTudvJTg5CUEJw/wzj+pp9XplHgJOJ0etu1qzUGPlikN4WM6RGRvceOIWirrjfvds+eos8PuzpeNvQplyVJi/AtRTL6+dtHFfN1Y/JpFTQFZshR6gePqAs8ut82ep+c1wcNkN+k4TmeVsifpnRIWzsDDwq1UhWzhOINTwiYYOM6YHCvH2SXseo7TWUUWLskp5UhKcgKw6TitkfdEBFRYvW2Ly79Xrvp7S4pv2rglxTft1Uo5/1JTYBZVWH11IVH2bP3DA7OoyXey042FFBoRGclQlWcA1lFtg+ggVXqPsZGZKChfZNlXOB6Ut78mOIsvRZz0KPGPxzfMp1LnH3LZIToWWStWYkFoqxeYpfKTyfxVqoaPRYPYLeVUQT/FON362D+o0i0A/JMJxdXq/AMu88D63LnPSW3IW+khcH9UEVXoTxv0nof9IZRq5ZTyQU+kLmSn1mdf/B1NVFQUQVT57+enWpD/GTcOdjn4CdiTl6YLwEZqKBFDNd8CmEO9BQA4FkpUe9+zzQWpvcFTUeXy8dR7+ImLVy2UDMME+PpE/C0A2OFb6rbEH1QpFjMZJcn8GKaBRMdf1GrGl7Jvcrph6kk0yQIIB4r6+TMB/j65dvK4GEl/CiK+MTV4jWvl/PwYhvE/5oFQ5evaO3UOGdE75cd+lHCMpcqJABK6UhFRTmrzEUBcORpqc+VyCvVwpMBsVxpZn88AlvllfuuZmEjkp0y9imEuXrRvuvsZ+3FtJLX6CGAnU+6OxHiqFgszu0IVspll9U6Rr1/Xx+yhslT2hiv7RB+fqWYA16JlLU98+ni6DhW8DGdzqvdSdKc4LeH5LlT78JeEmGonPA/7FF2QZn6oTjMhPqksIMqmugLxCPqJS9YS6p0Ss6iXQyIw6zMAuBxBLzwTszXBqlSsHunCaTACAD9ZVvZmCgDb1ZpDEHMtyWeUHsByNW2VWu+YpPSZYgEgDKGO8QDwvgbN4LE02OeAaFFgpot4F01rAcBg90Ao2+nSjFf5lTsljqjzi7JmvSGxVB792Q3Hybld2rQpSX2+ijr/C9HNSHrpkYCZTd0mF64PBAdtS5Etas1eVx0+AcDVKFoitWWtv2KKBQBeV6elSUkcl6RrTZ0T8TSafjcCfFPq9hGfq1DvBKTlHoLXBZkYKZVU2DWJjT7RX1y965LFl8RfKd8z0fV8nopv2G5M4rgtwaotX22AVfSpiauGUTTBBvGZohSgVqlUKjVRi7cQesoqPwTulJBtFCCM9ZV1Oq91eLqKy1ZJHGekMt+RmEKVXen7Uf5Fj1++HEW9HcAGamQUHfeQ2e5NqJVNpfKXhf791fqZRGwzV3k0NBOS23OQkpEM0ozRA3sifLYAi1RF7wIwDVUp/KNnv/Nsca1ooEiYSoVE4f7/iGzNqJ8ZSIxlgbiC9A8ALJDYQtHvRYulZlJfeLJM0zTKAIZh/FxF3/1aX5q6mj5EluWAxLrMtIJ1aQbA1qYBSUJTGqwFAOupnll8FNXvCZ4sfj5l225E3FQZFRPlotDln6Cd7y87CHxuSqPtiCvitxbAnXrUxwFcUfj/yeLdFBXVEs2mBu+E93aP1aFw+mnXO5bdHKwW7WDK3JaYkBo2fahKFW+KThamv+H+H/LiD58Vkx+CtCVuooa6ffBkIa4cZer6azRVyJ7/BXAjW/aC1HDkz77UhQOuZqLmLAx9KN+kZb/l8VX0cgDa1qRoNaIClVRVjwOwh+TNhtZ5gmOqvBLX8nqWJlGVOwBwSGpncMhOkTDUVci+lFuNnbmo20cAj8rTYKN7lwrJti9UVnjiAnAMpfx3PFq40dqPKN+sqyXCXgK3/KqcH+RLFDEkAcC7itTPCjzroCaibgsVHXgAjzoyRJHzTwSXeQ+AHc4QlXyP45Rd4mYWeuFBcg6ln14AsMygYNHZQjTaAdh2FJLak0WxCRCElFkF50Rf+VQbwLenvCccIrvOJuKbUYfSNMoIwG60A8B4ef67ni1oT27ffh/O40dMgO7AWVjPbN95ww7xne3PAMBwbsf201bsvwGx8dT2XfdhPXDGCgCmU9t3PgA+7T1qFOkO7zB5kLBMrhr5irveRUmhoo8dKGQm92Z0mFJWVXSrHLV89vrE+5TCl1+I2cgDhwpRkTmvuYRzU/LvEuEvja9MfQwAYlpPuscl7itEfT97uL4rPQ9v2yvljEqtypfFfwsAnCpFMlWguv4AVVmRY4QfBagaPALXlHpLNaTFAM4XoRUAnteigucB59b8Pr6MSq1igo9IPC1P1PC16Ehhf0alClAUuCL8SHShDWnBLmqelE6GDwtLMqrym683zXVIxF9uE8YUmc0dzdP4BQB8XFiYCR+bCHMPzRinyNRZsxnA3Vqa7QAQExUySwD4R+OLq5gcVX67YpcQeshotiAy7OmSnWHKjn8u4EdicqmYtOB0ud+N6WVw6FhWL8DA2UWAiWOTHHByel4ERxKrtQiAgTVB0sBaATh1rE3E674YIbbpWFart8HlVEXm85AUzFqW1dmQZv9LeTo9EWm0sSH146TS/Ix8m7PKN8LbxdmaKj/yenn9U8hsq9eLI4m1wuvlX/Vf6t1dLi3Q3Xvj9GroSZvTgr3yn3VeML5tvBt605a0YJ+y3f/I4u1OLwPnlwSrhCnhIw9Bm+DSAvBcgknCmpBgT10bco/zMnhaXnVIpO/g84sBb+ur5CS5A/jYQLVMZB+uqJuQuv6kznbvghvZ6B8AjgmU6ThwIxvljo6KiooqdQJ4U5RmipYpmC1Ilc5rRxMk5lAPL4ObEbQTwLbAwA0AbkbQGl1iYmJivAWIK0mzAZzOrviTTx3GyrTGq+FWXvrDJrUXrqXeFKduOqSS6vRXxjJ9mrIL7ytTBy2kdiZH15J++oBU6qglW+mKzwjWwZym7EMnqhQHF7vcm4+RVPAO3Db8M6Jm6dJNlrKiPZXGSJyuNEpI+rmkmnKWLj3CjDnUx3SwZZlaq7UZuvyr7Tl51OWx3XuOHU3pY4cOHjua0ofP6d3Yv5YK3IGrPe4tOewXegJu87P8GRUTQD6tvwCYSTUk1lNNCxfN+JCSYToYMYda9AtWykjR6XMGrv3BlFp9Aynlsz91o3OegDNwY9DOjRs3bHoq1TJath3JWNtq4zvj52Uq35UA5lJ9iU3U0CCYP1aVzTcarcAcIv9WMZcGK2lNRi519joNUmfrjg1Svnu8G7ll2WPdkZ4mlSNAdSIZLvk+1DtZgLWmbDnEcyh0hh0w/EJ9LRm39ik6Ie28GUHzG1ODL27U6y8+JzW2D5V+kyKYTH1SwFBDtsRFOxsALKBWXzJwKdvp05Qj9zLRH24cg+u4krTsdT7qYU3OpdXjRgyPpn5fp5dTtIp+ZjN06dKUPZhHgTtd7XRvDrYqFX+5975XLpLs/3V62EUrvAl2wvgLlYhNmdngf6UcZ90x/kJ55py+fLET9QUwhxpIbPWKwIuS1F4rtTs5+FKLar0V6RMsQAKF7geAcRLzqIpDNE+qumy5VwN2MTTJKbErWbgQRv0swMcGqnkCPlCWwwCeVKV+AA5S1u02fFrMUGNRLfqD5/W8F8L1cNoBQJjiG7JXwPVw6rhwxowZM6ZeA94Uo1kAsIZRrnDgJlFXB/Q1qPSm/VMLqiUSy5Jm6J/VqCA10gP2wZRr3NhROsym7hLLqbWXQGw4bQeAL42pwBc8zEMufwPiS9F0kak3hTzG80w0lAeu1iQiajubugHAhVpElHvCMapqBnCrPBF1N2MGdXCKllBjzjvAsGPuSxHuzZ2ng3nfXJc3AOuhuXdEeLlwRjzsR+beA4D47fPm7rVY5p4R4cOWucuuQz93Hw8Az1fOXfUauDv3FMQP5x6xewd8Z2YU6UYb04Ld1Mq74bfw3WnB0dz99F4NNpMzLXCabYJXg6fzP/95dcTdYtOCpNuvnOkuFs7oQetBm9KCPdRal95inxPa2YPWizanBXt926a/TKQmHrTetCUt2Kdsl/4yhVr+H2kOq9OrQfv+/fv38ZxdwvnpvUXC8D7BmbpmRPzl2eINnAUAb+As35Rg4CyeuQ9N/IlIVua3m6In5fwPinTtZB0NqYofSGM9Wy9bhc4D8LxF6MJvKqlV6HzBI3cjG+WtFB0VQJHHBOBGdvoHgGMchZ1CqrSePcpKDKUJnq37lWk0gHsVaNy3YNPqnBIfqtAYm0fuZgSt1X+J3xZFxV4ANyNoJ4C/1UGbkDrf5fOJ8ZBVpz9EVWjit7ApV9kbUjVpnMduLwAcykL/uLqRm8bbUksR5d50kAWysLOeGX2aslOUUJMmO0W78LYidUpCKk0s5n8oHWSJX/hlj0wHc9rzoQbNFET70YGqvIXbn9b1r1CiRPP1RgCmIVUOiawzo7fjVc3CfrLcJUpMBYbSFMPGeqXq/23yOAlGjjPgsRuT4NRxWnOybMYkjtPZpMycSRAJRs4CmLiZftkOcZyRF43neT2nNXlEAqrtOhbj8siOnUdiUvrwgX2HY1L64Gm9G7tFF/LSNkispkL34LZluEIdFKQiZV8ToIumxSJ9e5qKp/nVcgoIChou6tYuwM+H/AcbPUz6bbXUqvJ7btR0NcWyqIgqrN1Ju1vO27/XjVCpi/12zykaHzraItJ3CJ3B41eVkmQBKlX7N6JJX1aUUGmanuE9H7so1cpVlPJZn7qxC3A8bExl3kr8kjvgHNy3zu+457Mlcbp/0H5AV022TKIrzYRgeVbE/x+LxQ5+KFFgr7MXuvhQjMeiyuXjqffwE1eJ/f1l/gyjrlHGVeeeahWjkGdZ5nTnYW0lwzABvr4FDov60CCz6ONPNNyC4YySZH4M006ibzO1mvGhPAd5j8e1js2bpNJ2nZukfO8PbnSYP+O3ApR5GyTyyLPfTYZLfQuamSzgQzH/AwBE4esAfK5LE5yeCrmfMvUqhrng5/pQt9fsydoKuSvfLMMes8eqUOQRd2Kbtj/wmv2wKDv1TgLQn4ZJ1aeRFpjYP/2yHWRZAy/y9R/8kt1RiGo99nikrTcjSJy56V5ILWhC9T6nCPrR7BR4W9R/r4sREA+nfmZPha8qFatHunhUi1omAkjo50bgAiuA3RE0XHDDqTcBgHMQ1XqSAsBSvxyXIRbNNAPCND/FCU9b1/nzF582wMWR+2E0RkiG8/iSkUP7F/lakyXG0gCLp6Ixm5pNLrYzymUQXynjarADAJLaU7P3brhex2Q5niKL/MLPuRqYBAAn8tNuT9sxuHkzgvZgAan/ce9Bq6wk+ZUmSIz2YLTGtziPylyVeFjD1WRIjqVq992zGbQct5jJdOSrTXCI3lb2vO1Mxk6YulDxu+4k1KUyyy9dP9tEoqpsucjcw/PS8puYQ+VvSNyv7mqi1LhkWK+NqhqmUvlR+NGvNs4miq/q+cPLKGrLAhC+vLUCdyj/FQDoIVGTJokSm0gV8Tvo0Zr7VarGupE0MlAZwDCM0tVwy9d6XyUdAHvVNN4BPIn22wLcpgLXAP5iUZFtCFV5LDiedCSp4rRMsOs8WWWvSTyq4Wqy1Fiq/sCNjRpqfugDyy5iMov60VCT6HODdIPr4bTDnevhtAOAMF0RvJvHbqKxwPviVGPr7hE5A2kWgGMBFDVhRFa/SPoTgL4NFZswfLKAITReYhT19yitl4VslLhUxtVgh+hjC2r32ZXQjxo+BYANUv2p4UvRy2qusl/w8MXmoO3uxOag7QDANqXIT7jE0FwAxyoTkWrgOJoOwLqkCBFV3TyNpgLAyZJENFZAPxot8Sv1tHqSLpegjnoAL1rKXAUtsgPClkyy6QLAGzgLYOlArT8AMI2grKJJFH4IADfCX2pNiPoIIAgePMPuha/cMexe+EqE+wsX6mDeu/AVALz+e+HCE/i88C7Et1cs3BKP2IV3RYhdvvDvRODSwpsS1xde5D1JzrEy1W+vP8fUUfpKVZbJQ8fEfdlcnKrdA3CjZuh0AcJE0kx+x11sqaRw0YlCVPEwd70R4yN1tjD1jHt28pMH7zvT84C4dko5o1ZnH9GCxohKB/WqGqBSKeRhmwUAW1TUwwQ8bajwYdRqVcEQzREAzumBpFAHMqPr0nCRuYeCGFW7N/hQlcZKladdPzLdaGPGCsQvLMlomh2xjtPMBfC8ftHzH4ZlZXL2vuEAgAsVNNMEAK//LMSoq+++ULPQRQCwriunVtfaYRurmcYDwLtp+ZjcMzhoW2rmCSKuseboj8zvEXsyWMChYzkTYGYtAHidlodVy2otkHTqWAvE9iSWNQB6rUMEXseyBsDMmiFp17JaqwBBz1ogFvSs/UfGYXVmtPje/5fydP7ITKSmXjCzNZ28X2BmDV4wP+z/4+n19S9eMN1poxdML9rsBdObtvwPIofJnlqcJpuQljjNJnsGuvXhI82p5ER4189pyLNuWdR1n2Wcm0XtdKlkJ9V4l3bE16FspfIfzTg3lzqllt1U933asY0K3MDrL94t/HjqgjTcW8A5ggZkhPr732hvWoJR1D8j1LY06O3SpsWK1Vv5RZS0Z0TFIkVqzPsgdaRTqWLD4va7+LKsdpEivxyyATD2bh53v0WxLu/dMKxvVixq9COJJ3NqFiv28zaD6FaZMTjXqVjJic8BDCmciUKKFJnnyOg0MubgAZcHd+87eCClD23bfuhASu+9mZxTJUnu50eyGrEAFvkGBmk0Mmr0FoBzoYp8/ZVFOlE90b3K/oEaTYB/byOgLZFtSkm5Muy6qzdt5OSnpILnAOHvrOTjpyCfFu8BHKbKfwYE+BOVvwt00fiTn0YzyZ6xqRO5z9C32TgZ90tRydW3b8yLoJ/ige1Nt8XZrOuy0EIBOBFErU/dmxtBEvE1lf3v2mw789JSHtrqclmu5dc3vHdh6U3Zp966NCCgh4BzGqqz89alaSH0ixk4qpQpqm+/uyiU+vBwGIdTL5vNiYxNK39u2cLdHh1bfJOz3bOPp2L3AeBgJtoC12OorxPWftTgE4B79UXCWuoL8SFZ48/Q1qCIs3D3TDCzBQBWzhEcLaj2JwDY4BsSAxz19e/NAZhDld8Dwu/UH2l4RpG0VeJ9ZZoNsaMT9ba4WkgDnEiMkC+CeK/I1Iaazp87d+68YT4FYqGtKpsMt5dS/U8iCHih9t8CMVuNJgJHqeg7ALhMxWMB+0jqmwHvYWb/gxIYSrWSAFxe/euAARVooBNxlOWUxB6q+x5cFXKdJxbayvINbjlHU1+nBHDKL/yxhLEn9eZxlMp8Ft2jEg8y7N2i4GNSg6laEhIH5PYh8UAn3lKe6+5oq8gG75e+bBGtdsvcj/q72inP9VLC0I16OnGUSieK7mTkexLh84/UIOrqMA2hiOlXb90aSAOceCsL3COxX6KqbC7cTBY/kbpZXVzwC7spYfyFRgveAR/r0u8S8VVoHuLy03YAmCP6XIwmi4SJVO89LH2obcrwCXF2YBWVeCxinwnvwnz+knicVbYB3gGYR1m3chDejKRMt/Eqv7/oUSMa6IRtOJU8xyN+Komwg4I3WACY739w70J+1UngRiYa8h543aYzj15U9JwR9ue9qcLLjH9z6Bcd8LoGUetpY0tRyAYB2o5UYvGOaYV8fPs7gTsRlHf01PJUwv+n9wDbgVT9t+1Y3kM5BdBWkq2Smk20FHD+SVRt0vjCNJHH/cKk7jFlWEHKuhfAESqdIFX8PmAfQX0y1s2kn/UAYrvnJCJFjX8A4E4DBRG1mUydeAAxNYko17zDftHxAD78XpiIKLjuKUAbRSukdsjoHwDslGJElH9MPIBrLUOJSNU0BgCOUuQn0S3K8xBwDKHuGevuLznrAAD+4rolKw6+g+Tn/cuW7DPZ152D+N22JauuQ7/+oAXiu38vWbLh7BcA9gMrnkklbV/xCeK7G5asvANJw8l1S1Yd0UL8YclOm4hdslMHCNeXXMpY9yP6n//+85qFM3q/2OeEdvaCmUhNvGCmUMv/55WJMwleAVZO75Tgk1gTIJg411YA9qQkh5SBNX4LfUMHffYKWBPa8JFI2JUv02LgU9fQYJX0WgAHI4uclLhcXTPemWocOs4u1YTavPcKmE1R10VnS1GVu0BsRZIz0msAbFaq9oie1qfcR5Bqr1YKPSLVnNp7B8ylaNGbVlTkqADcrUy/s9JWAFvUmr0AdL0pZI0z9RzLQ/94JZgHysI28wDuVaEpcFfKOUnuM9uB1Hu6IO31RnDOkPvPdUJqYvKEjRr63Qz3HWYdx+ksUjatgZcwcUYB1qQ9kbSB43QOiUQYtZxByPh3E38H0kADUmofzpSidm/htvB8Vpt8KlX+rifsok3hP7+RGB7aOwFrIvzl5K9Slbwh6vj+QI2gwJo7LBnGqlw+nnoPP3Gn/OMbJalrElxNSc7RxPrU5AncN7ZTMiqGUcrVq3gAC+inlxLtqekbrM7hJyM/hil+A2hBrdtlVTMKYpY6MorJ/ZSpVzHMnSo7O/k2egY3RnFirU0qbMPv8qhzSKahY42NL9lP+0pS7ccAFskbvJL4hVq+gZXbnY/Ws2ySQ+SrbH+NPVuJQi9lFPNVpWL1SHeiqsgKn4Q7SpU4898SgVkrqJUbkVzBYOABYDGT9UQKAGcK0j5ItiD5oEQAe3LRmoxijdnUbHKrEmXa6JaCEavWuigfSDOE5Li+Uky2LkWOF6Cdrho8A4C30TTTkUGsNb7JuVRlc2sqc96d31lJq4Q6bMNAWej2FHCYkjjuSFFa/ZWaU4cEkdCQ/swo1vJbKf/4bCS1eO/GFLi7Ra059ro6Vb6ZHPuT2Y3CVaoAOa35au3fi9CYZmbwi74tLPSVDbe7mpicfdiRk7p8co9fnNMvQMUw/q4avv5qjTL+XYe5P6lWCim1F85JMvkkp1uXoqji5ncsG1NUYqG83kuJTt4NiK1BpS+kHD61ppAdbs2hvKcEANeKSyzyy3FBxLd0Y7dXAnZnp1bxUlNSAJejqcotAIKJMwH4jUpeB2BdkVliRzZawgOmlTmkLhellYAgfGcleJIsHgvnNLlshA24W5lGcdJWd4T1majrR+DtL6EDOGBLZur9jLvTO0Qm8bIWZV/LPekTopS1EL2vRtVvxR96/32VJ8mThE4eh9kUJYK2BylWCoitSHKV9F8ANivVewDAMZJoshPXilGt54C2h1IeoFKrioTRKgDC9kjyUQWqfu7m20AkTGLIX13iBtCE2kjVpxnfO8GDRo/yGI8eUcTjsFrT4JEIj5sGDbLhUxdNICO9GMDBfIVOipDQLaj9O7xrqenPAfiyIlrFlF7+pL3mHwBwHmmkYcouN27O1jUBAIxLS6my9X4D9NEM+izRXbMC3zmeZw+DldU7JWBk9QIEI+vaAsCu1dolYGZ1TggG1iQAgFPHsjonjKxNBBg5Vu+EnTXwIjh1rNbMA0bWKEgYWet3zUzyQLfzLHz/pw3rixb2PI+y/5hMpKaeG+3LFy89zS8+4sdktqaT5yb9998DZtbgBfPD/p///vPff/77z3//J8rDWb17jD7K43KfnseTwe/tOfplsl7+1nOt0/tC2FiYiCjyCv8LUW2He/b+5BOTrD+Iir32vrgSQpTnp8ish/kmROXs7tmGUtChZPUjKvTE64KfRtQ53vjplhZbChdYg2QMo+CYZF2oUmCk0+vC2J58d0JaEJAKAAGewYwVbGUKPeoi+SnlKcxYgZoUetH75PM/I3v0GHvcKrGpxy9Zya9ejx4DY4Gr/XteSoHDsO0e2bP/ojcu4of03CLi9/VcYAG747eegzdzXgfrygcSEWWtf0pUj1yvBZYT/Zm8kDMPGgYRkU/J7VLXZNRYZB9ARV/urxRIRIGVznsX8GNURNkbVc1MlPckgIV1awaTT+lGP7W4DKxSpES2YdFEgcEKopDtUpmomcQwKjs4K8mCgmRE+Z95FWxVUOhKzmR4NlBGlRMBh/FdJQrZYzKaeGC1gmYmz0dGtXbHf9pUnKjgO9H1TNRCYjgpiKrv+fLuzyxEE70J4mtQ4DaIHS1lioUAoK9GmuOQTBmiXiwAXMpDPguSRbKebwFgioKKm70IthG1N0vgVCC1cABgq5Lm8NeQdeMgOcyHGiSvwxeIY4tQ6DPvAecYoi2QtodT1aTUwByD9F4NFfiYHL/9kNRXp5BL3gP6zkQDli4W/zU/mEo9TQ0hh13cz0P5niYn+JCUoylprngPcG3I/cjbqSE4xsWrAhT5PDlBB6TQ1rNl4YzpK9p2RP5qlyGadoZU9fKr/OzRss8J7Zz+so1104TUEHLYxbNIj91EapK+Yu5DtA/J/WqBJ10cyUwFPnvmplDL9BUsIvo1tflM4aV+96EG8I64EEK5LqSGu1MmXXFBIQslHuUl+RIvCX1vopInJGw3d75IMWdjouYWF6T69TFwrjZRkffpeU4dZ/eY4GUtoqx1h44Z26pi7ogDElUoJMaNP0VvcxKV/SwVUVFOhX6qlZOI2QIXzdNH7FqO4zit3ibFGziLlIXTOb+B65VDD3lO8Ko1Qy5znZUoT8xhqRVE00X6EkS1dKKBVOrquAASh6/lJa4FUGOJQaTc76IZ+V9Of9iVUxOoUgWVGHnbIXreInShxLvuwT+/ST1mzshLnMhHWz0osJweUzd//vyNB/4V6xAZhxRq+FDqQKlCu0RYXShqjwDAOb9Qf4fzSOdChSpNvgvpZxUKTRA5FxaqedPFqEI1n6Y/zCVSMkyAr0/YfDuAexVonMg4hGi2M/X8Ftrzg8TJQrTdk+I5/v6ZQ6VPsuy7pQUpaK0A3KtCEwHwixjZrwak3k7U6JVXw1wqfweA80A+apXoxt7c1J1FKu5OLd55OURfBwBhCJW84OpmFWr2Cu4LFr2WSzLxUkbOKuHUczYIBq4DNbzLcWaJf2BP4pIs3gmYSWHbXMS3pRKn4D67qVOJIFW2JhtZkbFL6HqJOzVCd0HfSuVLPoxKNdEq2qmbGKGO6PM0o1qVy8dT7+EnKTCdChyVmOYcSrn3CcmY7BfAMIy/3H+IHsDn+rRU4mwhWgN9S8aXfAIYZoLEyMaBqgCZvM79DGkTifyUqVcxLHlf2lONxxIT/2bUS3kk849SC69/Ym82oaD9osa0QuJccVoHQc+2p4a3WdYMkSLX3IT4aaE0TJsRbbYmWJWK1SPdKX8HgOOfrDSAlyhfjobySK5J5wSAC6VogZA8AD2oxXuITxai7P84AHtbqvIoAxrMbOo2uVPmFMe9/jMXRZ+HRHRZ6qRLlktjcxpsSZGu1OyVq8U8AMxW5r6WEe2bnUvyAJVKpVRUOMNLTVrj4zvGmTzBouO4141ogPmr7YT4SK4cXgb+DJOpzsKXEN+rQtMcPSlwo5AM4ePGzpEqlcqHBn697RLH83oZlD7JspzBAVcT8bAORV9JxukK/v4MwwS4sfKrHcvjZVD+DtyVwP4IapfoFtuO8kx6wrIvG7paJnHBeyL6egrw4+XysU53zhamxQ4A5hYSXxrTr1bRwUhXzd94X+BLRwraLACwcHonsCsrrQfguBIt4WhP9R4CeNVSJjWQajwGeMHLAjcqU/krgGNSaI1bQGwVqnOWi5sTKZfAfD9Z20fc3rL+PlJ/MfJp3KVLFq+F2RSVjAo0XoRtWahNAnStKeQAwM/V+Pip1Kqi4dRPxHbzpYDAwLDfq9Aa0Ys6MrmKmWDFiXy0VeJojixXvQhWaxo8cut5c80CCef04OJnwP+mqXELgOVQCw2Tc2jCZM0fTgD4MCu/KuyXi1xHzU4R7vcOY4rsEHC9kuaQxJWyZWO9CKys3ukWr2ctErCxrA0wsXonxEaO1VphY02QdCSxnBkwsDYJmDk2yQ44kli7hCMpyelF8P3/n//+S4nFk2XLOGD2ZFkzDITuO37EY318f8GMAjKV2oOtkmcIqEke8Mj0v3oKD3jRdD/Lhgme7/GLTel9cNg84Hb85////P+f///z/3/+/8///w97p54z8Cnh0HMG/qs4dJyR9564WT208fOUuFgptOmTr3I0KrRjnPfE0axU/HJK7Amlsre+yjoV1XycAg6TmfdOCKeoSymxO4wqfp21IVQnBWxrmrc7xnsl5KCoyxJOA6d3utqT5WutS5mLUSTrEO/dcLduaKXz39i5QkRNXns3xGShwA3fWMIvmizLnd4NB7NRyLpvTDCynB3eDcfCSbP5G/M+tOu1XJLVDYeO256VQpZyHMdZ3XHotZzO+jUceo7T21wJJo6zSdh1nAWATcdxekeGPefTiRWzhEQOu+48IXW2dIhKTjImJCQkZJGLe8KbeRVDNcV+PW1NmbrP+Wczymg0UaMv2aV0PUNDd0nsKho6B7YLvxUM0ZSb8YrPmGdenEdB4vAl2yMkDoWRm2OkKl/bU1ROROQTPE6XIvXubo6UERH5ZvrTLPGxDtEaifl+NO71iBASK0sdzZDHL/cnCijbrlwAMQXCJGL7NS2vJN+ols0adb0gVbxpZgos3y4qgEgxjU+Jsg1DKKhyu6L+RMplvER9onVSaurdWkaamo0i5EQNn2fEu1yMKP+6JJPufDMimQRvNu7KRiErjEaDmZfyIWp5XWfS7ShBVORMSviQrNM9vUm7MT9RuRvJWaAmP/Lt81hveDnQn+R/CRnvhOlEubbzABA/2JckABwJJ80muNyThUg+mAMA4e8sJBsmpAD5jtUDAL80hGRTheSRYqYJAD7WJGr9NuPdq8Yk68RD8lMPuatD2Umz3i3f/jpIJnUkqvMsBXxHmyD5qSFRq7fJU8ywQnKCggpey3h3OheFrYfLmOwpV+4aXM6SUZ4jKVDjAVz+JqMiF5LX6CWkj0RS5JWMdxtkVPy8q+M5U67SXVfbQinTrhSo99TVskAKP5a8VnEuThak/Fcz3q0lqvLE1dEcKVfxlquYXCRbngJ1Hrvamo18tyevxWsXxwtkyFtHVDcxdd2qQLKZX+VcCZKt9jZYSxR9J3WdLkyZ/vkq+/NQ9iPeBuuJip1zdTxnylW662p7Jsq6NwXqPXW1IohynfQ2iNFQ2AZXh7K7OpiNNBvcKnfN1UwZlbmWAjUfuPpNRtXuexvciSZZXxfvfpG7OpyTQta75TtAJ5XQkqjtZ5Fg4IyCK8UYk9Sb2kR9krwNkvoTlTgt8aaLjFzdr0GymW6RzxBO5JihINlcQXSucmjDWFekGGcQ2Uf5kHwDvA2wO4Dklc7rzfqTdUmmcPWmKVGdWJPh6SspH5K1vqE3a2dqiKreAwBLTyKa78qH5F1iDeYv49VEDZ95HxhH+BIFlWsfHUBZutWnqEsS/Hg5yfM1q6KeJgqjSnXlFFyxfWkFkWajINK1JqIZEmtDqHY1GWmqti/mS5Rlv5Cc+W4dy6CHT7+qSCyLOhjbgIpflkBcByWJJUKpw+uJahIr861xQGzpRkTzJdapqP+rEQEk9iu8zQmJOkRrpPyoiavjeSn3lYx4sB7rUigkqOK8p9AP1DR6LoU3s8uGBEeOeQ7gYgXNSKftaLc8QaEV57x0QvrvPJoGsRJHSmqmwbqvQ86gTNWWvOUhqeup0eyU2FlE0yvBRWx1TdV7GfIAcxLL6h0ATKyedwGHjmW1NgBw6FgTALOWZXUOuLZrWYMgYU9izQBMWpbVO+FSMLKsTcKmZY28C6eO1Tkz6P3n///8/5///60B)
> 
>             **efi.bin 和 dtb.bin 文件的目录结构**
> 
> 
> 
> `efi.bin` **签名流程**
> 
> 
> 
> > 
> > 
> > - 主机工具使用 `sbsign` 实用程序对 `uki.efi` 和 `bootaa64.efi` 镜像进行单独签名。
> >         - `sbsign` 需要 `certificate` 和 `key` 用于签名过程。验证以下句法，其中 `dsk1.key` 为密钥、 `dsk1.crt` 为证书，输出文件名与输入文件相同：
> > 
> > 
> > sbsign --key <key file=""> --cert <cert file=""> <efi file=""> <o/p file name></efi></cert></key>
> >                 Copy to clipboard
> > 
> > 
> > 
> > - 示例：
> >     - - sbsign –key dsk1.key –cert dsk1.crt bootaa64.efi bootaa64.efi
> >                     Copy to clipboard
> >             - sbsign --key dsk1.key --cert dsk1.crt uki.efi uki.efi
> >                     Copy to clipboard
> 
> 
> 
> `dtb.bin` **签名流程**
> 
> 
> 
> > 
> > 
> > - 主机工具需要文件 `dtb.bin` 的路径。
> >         - 主机工具需要 `key` 和 `certificate` 的路径（绝对路径或网络路径）来对镜像进行签名。
> >         - UEFI 安全启动需要使用 PE 格式的文件进行验证。无法使用 `sbsign` 非PE文件（如 `dtb`）进行签名，因为此签名工具需要 PE 格式文件作为输入。
> >         - 主机工具使用实用程序 `openssl` 对 `dtb` 文件进行签名。验证以下语法，其中 `dsk1.key` 为密钥和 `dsk1.crt` 为证书：
> > 
> > 
> > 
> > > 
> > > 
> > > openssl cms -sign -inkey <.key file=""> -signer <.crt file=""> -binary -in <dtb file=""> --out <O .dtb.sig="" file=""> -outform DER</O></dtb></.crt></.key>
> > >                 Copy to clipboard
> > 
> > 
> > 
> > 
> > - 示例：
> >     - openssl cms -sign -inkey dsk1.key -signer dsk1.crt -binary -in <foo.dtb file=""> --out <foo.dtb.sig file=""> -outform DER</foo.dtb.sig></foo.dtb>
> >                 Copy to clipboard
> > 
> > 
> > 
> > 
> >             此命令将 DTB 文件的签名添加到单独的文件（ `foo.dtb.sig` ），并且不修改原始文件（ `foo.dtb` ）。因此，主机工具必须保留这两个文件 `*.dtb.sig` 在 UEFI 安全启动期间使用文件的位置验证。
    - **用于合并 DTB 的主机签名工具工作流程**

> 
> 
> 要使用主机工具合并 DTB 文件，请执行以下操作：
> 
>         1. 准备 DTB 文件：将要合并的新 DTB 文件放在目录中 `dtb_files` 。
>         2. 选择操作：将 `operation=combine_dtb` 设置在 `config.ini` 中。
>         3. 与旧 DTB 结合使用：
> 
>             1. 要将新的 DTB 文件与现有的 `combined-dtb.dtb` ， `dtb.bin` DTB 文件合并，请设置 `combine_dtb_type=combine_with_old_dtb` 。
>             2. 确保旧的 `dtb.bin` 在 `unsigned_binaries/` 目录中。
>             3. 主机工具从旧 `dtb.bin` 文件中获取 `combined-dtb.dtb` 并从 `dtb_files` 目录中附加所有 DTB 文件。
>             4. 然后，主机工具创建一个 `dtb.bin` （vfat），从旧 `dtb.bin` 文件/目录复制所有旧文件/目录，并将新创建的 `combined-dtb.dtb` 文件与附加的 DTB 文件一起包括在内。
>             5. 主机工具将更新后的 `dtb.bin` 放在 `unsigned_combined_dtb_bi` 目录中。
>         4. 在没有旧 DTB 的情况下进行组合：
> 
>             1. 若要仅合并目录中 `dtb_files` 的新 DTB 文件，请设置 `combine_dtb_type=combine_without_old_dtb`。
>             2. 主机工具从 `dtb_files` 目录中获取所有 DTB 文件并创建一个 `combined-dtb.dtb` 文件。
>             3. 然后，主机工具创建一个 `dtb.bin` （vfat） 并包含新创建的 `combined-dtb.dtb` 。
>             4. 主机工具将更新后的 `dtb.bin` 放在 `unsigned_combined_dtb_bin` 目录中。
- **Multi-DTB 支持**

    Qualcomm支持基于同一硬件 SoC 的多个Qualcomm参考终端。例如，QCS6490参考设备包括 RB3 Gen 2 核心套件和 RB3 Gen 2 视觉套件。

    每个Qualcomm参考终端变量在内核中都有自己的 DTB。
在启动期间，UEFI 会根据特定的 DTB 选择适当的 DTB
Qualcomm参考终端变量。为此，所有用于Qualcomm参考终端的DTB共享
相同的硬件 SoC 组合并存储在 DTB 分区中。

    **生成组合 DTB**

    要启用多 DTB 支持，所有支持的 DTB 都会附加一个
在另一个之后，生成一个组合的 DTB。

![../../_images/combined_dtb.png](data:image/png;base64,UklGRhIEAABXRUJQVlA4TAYEAAAvz0IPAI/iqrZtVVlHnmsEf2gS+kISlxAMPr2Gq9q2VWUdea4RFCcBNCXQS4BDCAaf7qq2bVVZR55rAncgwYtAer69AgUYzH8A//+/NE1FUURViQhVZWZEhJlxd2VZUlVmRkSIiCAIiAhVJSJEhIiI49jz2WAEnKxZsAHcscbrdROGdyzBFEvABHDBDXCid/X9/jweX03TqetaXdfMjIhwd3Vdc/9gwABgdgfcJwPghjvgihtPHAGTDYI94MAIuNj9wR1wwoARbLcLmLF+OC6vmGJ/BUewB+sDO0CibdtpGz11sMzMTZkhndB4HCgFZ+b//yZ+evLTulpLg4novwO3kRQpfYyV6cWDDxi5bi4DrKvLEOv6MsiK2Zaa/HXxaTnA+jAZoOr02HKA9X48Yls6cZqf8x0TYI1fBqh6/dEEWEtnEdvSs7OR/4z8Z+Q/v6156BOvuc6XjGKfxFovCcEaqzWB+z2iZlkNlmvx+EdKRKs1NViuj0eWqxa4lpqXNAtVjji+kVCbpSyHTLMsB1kvcQ5T8gKU62sqxNQC5doSh1sHVEulma0ZidBaOcfCyxGszW4dEPkByrVFQiVKUF3bOnBaalGgGGQjW6vvpzRMYC+chCUVoz2MckBWlh7RW9cLUK6v9WxL4YkvpHVAubYamet9n7mqgGopXwM2diMQu4XUqObFytIsZ6xVTM8LSK529TyA6PqaqkFT7Q2TFCIQaRW7oUKaoDwB5CpQ8ACQq4MNowJMtZUFiEGkCOsl3co4MV4BcnWcbBgdeK7FZ7ZE14GjagdJTCQirG5zYVXjq/ELmqv9PokSGFdHkLWq0YGlWsiCRiSmp4W2Kn7BcXWeK8FxFWlsV5RAqb6mw3AxTdbe8BD9CixECDA9R5B2APBUPaYYxVfaxvrEbMPrFTjXArEtaC1442vuBkxXdQVJtWUliuKHSLF8PgTJVTyqQRtfOxq1VQ9BUi24vraMQApsismJtGzz+UJgri1+1IM0vt72FpbOkFQdNKrR+D0O0AmWaytlRw94HV+cEyTVVlyePB5pvww2j13vNwO5CtOhD5Bci/3VWmmYYo+UH04uncG1FOJmQbCRsJatVdhP1zZL3Lptv5L1Br4AUwXH8ducfDhXvj3xB0I6gFwdqtTWgeRa7BMvdl0FUEtRcH+hWmCtKva52WuaOVmvZMfwBJpqKGyWjJJG1bjY0AHk6mJDB6jrZkkHUEuRSUIkCRbxt+ydkjEOnMHYet/rCZRrwd8J1vg+730f8jP7IkkHjqqDdbArZYgrYKq/n//nNfKfkf+M/Oe3OCuXAdbn0wBVT95dBlhTOxHb0h0Ft8sh1sx8gKqLs0EO70yIrtMLIbZ0ajnEujR/U5cB)

    对于 RB3 Gen 2 视觉套件，将以下 DTB 组合在一起以生成
合并后的 `combined-dtb.dtb` DTB。以下代码片段来自
文件 `conf/machine/qcs6490-rb3gen2-vision-kit.conf` ：

KERNEL_DEVICETREE = " \
                        qcom/qcs6490-addons-rb3gen2-video-mezz.dtb \
                        qcom/qcs6490-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs6490-addons-rb3gen2-ptz-mezz.dtb \
                        qcom/qcs6490-addons-rb3gen2-ia-mezz.dtb \
                        qcom/qcs5430-fp1-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs5430-fp2-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs5430-fp2p5-addons-rb3gen2-vision-mezz.dtb \
                        qcom/qcs5430-fp3-addons-rb3gen2-vision-mezz.dtb \
                        "
        Copy to clipboard

    **DTB 分区**

    - 生成一个名为 `dtb.bin` 的镜像 `vfat` ，包含
组合DTB镜像。创建一个名为 `dtb` 的专用分区，
`dtb.bin` 在此分区上进行刷新。
    - UEFI分析分区 `dtb` 中存在的组合DTB
并为硬件选择匹配的DTB。

![../../_images/Create_sign_DTB.png](data:image/png;base64,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)

        **创建/签名 DTB**

## 分区

本节介绍如何添加、删除、修改和重命名分区。

Qualcomm Linux版本提供了一个预生成的 `partition.xml` 文件，
您可以直接使用该文件。预生成文件作为 `QCM6490_bootbinaries.zip` 文件的一部分交付。启动构建时，
使用 `QCM6490_bootbinaries.zip` 中的文件 `partition.xml` ，步骤
3到5是从 [Ptool 工作流程](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#ptool-workflow) 图中运行的。

若要添加、删除、修改和重命名分区，请更改 UFS 磁盘的分区布局。 Qualcomm Linux提供配置文件，用于定义UFS设备的分区。配置文件位于 `meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/` 中。

通过修改这些配置文件并将其集成到构建中，
您可以生成分区布局。当使用
`meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/` 中的配置文件进行
Qualcomm Linux构建时，工作流程跨越 [了 Ptool 工作流程](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#ptool-workflow) 图中的所有步骤。

下表列出了用于分区的文件和工具：

| 文件或工具 | 说明 |
| --- | --- |
| 分区布局文件（可选） | 以 JSON 格式定义所有存储分区。 |
| gen\_partition工具（可选） | 读取分区布局文件并生成由Qualcomm Ptool处理的内部XML格式。 |
| 分区 XML（必需） | 定义 Qualcomm 内部 XML 格式。 |
| Ptool（必填） | 将分区 XML 中的信息转换为 GPT 二进制文件的 Qualcomm Ptool。 |

JSON格式的分区定义（由.conf文件使用）， 现有分区，以及生成 GUID 分区的工具
Qualcomm参考设备的表格如下：

Note

以下分区布局和示例为 UFS 特定。

- **分区布局文件**

    设备上的 UFS 进行分区以存储各种
引导链和高级操作系统的镜像。配置文件包含有关
为特定 Qualcomm参考终端配置的分区。对于
RB3 Gen 2 Qualcomm参考终端，UFS闪存分区
在工作区的以下配置文件中得到定义：
`meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs/qcm6490-partitions.conf`.

    - **分区布局文件句法**

        文件中的以下示例 `qcm6490-partitions.conf` 显示了分区布局文件的句法。

        配置文件中的第一个条目定义了磁盘类型、磁盘大小、LBA 大小（扇区大小）、
以及最后一个分区是否应该增长到最后一个可用的 LBA。

# select disk type emmc | nand | ufs mandatory
            # disk size in bytes is mandatory
            
            --disk --type=ufs --size=137438953472 --write-protect-boundary=0 --sector-size-in-bytes=4096 --grow-last-partition
            Copy to clipboard

        文件 `qcm6490-partitions.conf` 中指定了以下分区示例。
LUN0 中定义了几个分区，每行表示一个单独的分区。

Note

在以下示例中，recipe `firmware-qcom-bootbins_1.0.bb` 将下载
来自 [Qualcomm 软件中心的](https://softwarecenter.qualcomm.com/) 文件 `partition.xml` ，并从中获取 GUID。

        - 示例 1： `ssd` 为 LUN0 定义了 8 KB 的分区。这个
分区不需要烧录的文件即可烧录。

--partition --lun=0 --name=ssd --size=8KB --type-guid=2C86E742-745E-4FDD-BFD8-B6A7AC638772
                Copy to clipboard
        - 示例 2： `misc` 为 LUN0 定义了 1024 KB 的分区。
此分区不需要刷写文件。

--partition --lun=0 --name=misc --size=1024KB --type-guid=82ACC91F-357C-4A68-9C8F-689E1B1A23A1
                Copy to clipboard

        LUN1 中定义了多个分区。每行定义一个
单独分区：

        - 示例 3： `xbl_a` 为 LUN1 定义了 3604 KB 的分区。
该 `xbl.elf` 文件将刷新到此分区。

#This is LUN 1 - Boot LUN A
                --partition --lun=1 --name=xbl_a --size=3604KB --type-guid=DEA0BA2C-CBDD-4805-B4F9-F428251C3E98 --filename=xbl.elf
                Copy to clipboard
        - 示例 4： `xbl_config_a` 300 KB 的分区定义为
LUN1。该 `xbl_config.elf` 文件将刷新到此分区。

#This is LUN 1 - Boot LUN A
                --partition --lun=1 --name=xbl_config_a --size=512KB --type-guid=5A325AE4-4276-B66D-0ADD-3494DF27706A --filename=xbl_config.elf
                Copy to clipboard

        LUN4 中定义一个分区：

        - 示例 5： `aop_a` 为 LUN4 定义了512KB 的分区。
该 `=aop.mbn` 文件将刷新到此分区。

--partition --lun=4 --name=aop_a --size=512KB --type-guid=D69E90A5-4CAB-0071-F6DF-AB977F141A7F --filename=aop.mbn
                Copy to clipboard

        每个分区条目使用的选项如下：

        - 必选选项：

--lun (mandatory for UFS, optional for emmc. Expressed as number)
                --name (name for the partition, a string)
                --size (size of the partition, generally expressed in KB)
                --type-guid (GUID for the partition)
                Copy to clipboard
        - 可选选项：

--attributes  (Optional 64 bit attribute, e.g., 1000000000000004)
                --filename    (Name of the file that is flashed to the partition)
                --readonly    (whether the partition should be read-only, values true or false)
                --sparse      (whether the partition is for a sparsed image, values true or false)
                Copy to clipboard
- **Linux HLOS 分区**

    | 分区 | 说明 |
    | --- | --- |
    | EFI 分区 | ESP 包含 `Esp.bin` 和文件 `vfat`。它包含所有UEFI 启用 systemd-boot 所需的详细信息。有关此图像的更多信息，请参阅 [EFI 镜像](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html#efi-image-section)。 |
    | Rootfs 分区 | 此分区用于刷写 `system.img` 映像文件。此图像包含所有用户空间库和二进制文件。 |
    | Overlay分区 | 该分区留空。在启动时，文件系统被植入到此分区中，该分区用作覆盖在几个 `/var` 挂载点上。此文件系统中的映像用作可写对象存储文件系统。与此图像关联的IMAGE\_FEATURES是 `overlay-etc` 。 |
- **分区工具 (Ptool)**

    若要对设备上的存储进行分区，请使用命令 `gen_partition` 生成 `partitions.xml` 文件，然后处理
文件与Ptool。Ptool 生成 GUID 分区表二进制文件，QDL 工具使用该二进制文件对闪存进行分区。

    Ptool 工作流程如下图所示：

![../../_images/ptool.png](data:image/png;base64,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)

    **Ptool 工作流程**

    `qcm6490-partitions.conf` 目录中 `/layers/meta-qcom-hwe/recipes-devtools/partition-utils/qcom-partition-confs` 存在的文件
定义所有分区。该 `gen_partition.py` 工具处理并生成 `partition.xml` ，这是
`ptool.py` 的强制性输入。作为最后一步，Ptool 生成 `rawprogram.xml`、 `patch.xml`、 `gpt_main*.bin` 和 `gpt_backup*.bin` 文件，QDL 工具刷新设备所需的文件。

    要添加分区，请在配置文件中创建一个分区条目;例如 `qcm6490-partitions.conf` ，使用通用唯一
标识符（UUID）。

    更新 conf 文件后，切换 virtual/partconf 的首选提供程序
至 `qcom-partition-confs_1.0.bb`，将以下行添加到 `local.conf` 。

PREFERRED_PROVIDER_virtual/partconf = "qcom-partition-confs"
        Copy to clipboard

    添加条目后，执行BitBake命令生成所有必要的文件：

bitbake <image-name>
        Copy to clipboard

    镜像构建完成后，执行以下命令，刷写镜像。

cd <workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcs6490-rb3gen2-core-kit/qcom-console-image
        ./qdl prog_firehose_ddr.elf rawprogram*.xml patch*.xml
        Copy to clipboard

## 容器化

Docker容器可在Qualcomm Linux中启用。若要使用Docker，请确保
在Qualcomm BSP中启用了容器化功能，并进行了
集成和测试。要在Qualcomm Linux Embedded设备上使用容器化功能，
请确保将 `meta-virtualization` layer添加为工作空间的一部分。

- **Docker**

    Docker在以下位置 `qcom-multimedia-image` 启用：

    1. `qcom-multimedia-image` 对于镜像 recipe，通过使用 `meta-qcom-distro/recipes-products/packagegroups/packagegroup-qcom-multimedia.bb` 将 `packagegroup-container` 包含在内.
    2. 编译并刷新镜像后，Docker就可以在设备上使用了。
    3. 若要验证内核兼容性，请在设备上运行脚本 `check-config.sh` 。要验证配置，请启用所需的内核
配置并重建镜像。相关更多信息，请参阅 [内核兼容性](https://docs.docker.com/engine/install/troubleshoot/#:~:text=Kernel%20compatibility,check%2Dconfig.sh%20script.&amp;text=The%20script%20only%20works%20on%20Linux)。
    4. 若要验证Docker守护程序的状态，请运行以下命令并验证输出：

        | 命令 | 说明 | 输出 |
        | --- | --- | --- |
        | `systemctl status docker` | 启动后是否至少运行过一次Docker命令 | 激活（运行中） |
        | `systemctl status docker` | 如果设备在启动后未运行任何Docker命令 | 未激活（死锁） |
        |  |  |  |

    从 `linux/arm64` 平台的Docker存储库中提取并经过测试、在设备上成功运行的镜像如下所示：

> 
> 
> - `busybox`
>     - `python`
>     - `alpine`
>     - `ubuntu`
>     - `postgres`
>     - `mongo`
>     - `nginx`
>     - `redis`

    以下用例已在启用Docker的情况下经过验证：

    - 使用Docker加载实用工具通过tar文件加载Docker镜像。
    - 通过Docker文件编译Docker镜像。
    - 保存拉取/编译到 `.tar` 文件中的Docker镜像。
    - 加载Docker镜像，这些镜像保存为 `.tar` 文件。
    - 运行拉取/编译的多个镜像的多个容器实例。
    - 验证设备上加载的Docker镜像列表。
    - 验证设备上活动容器和总容器列表。
    - 使用Docker inspect实用程序检查Docker镜像。
    - 使用Docker logs实用程序从容器中获取日志。
    - 使用Docker stop和Docker kill实用程序停止并终止容器。
    - 从设备中删除容器和Docker镜像。
- **从Docker访问硬件节点**

    在Docker容器中运行的应用程序需要访问
设备节点和设备中的文件（目标主机）。在容器内运行的应用程序
可以访问设备节点。这可以通过
使用Docker的run命令将相应的设备节点作为选项传递来实现：

docker run -it --rm --device=<device-1> --device=<device-2> <docker-image-name>
        Copy to clipboard

    要传递的设备节点位于设备上的 `/dev/` 目录。根据用例，例如，在图形场景中， `/dev/kgsl-3d0` 是要使用
`--device=/dev/kgsl-3d0` 传递到Docker的节点之一。

    从设备（目标主机）访问Docker文件/目录的存储分区也可以暴露在容器内部。若要将文件/目录暴露为绑定挂载，请运行以下命令：

docker run -it --rm --mount type=bind，source=<source-path-on-device>，target=<destination-path-inside-container> <docker-image-name>
        Copy to clipboard

    使用以下命令，运行一个docker容器，可将多个目录、文件和设备节点
暴露在容器内部，
命令:

docker run -it --rm --device=<device-1> --device=<device-2> --mount type=bind，source=<source-path-on-device-1>，target=<destination-path-inside-container-1>  --mount type=bind，source=<source-path-on-device-2>，target=<destination-path-inside-container-2> <docker-image-name></destination-path-inside-container-2></source-path-on-device-2></destination-path-inside-container-1></source-path-on-device-1></device-2></device-1>
        Copy to clipboard
- **Docker-compose**

    Docker-compose是一款用于定义和运行多容器应用程序的工具。它允许用户在一个易于理解的YAML配置文件中定义服务、网络和卷，从而简化了整个应用程序堆栈的管理。默认情况下，Qualcomm Linux版本的镜像中包含
Docker-compose。

    该 `python3-docker-compose` 软件包将添加到 `meta-qcom-distro` 元数据层中的 `packagegroup-qcom-multimedia` layer包组。

    **要在设备上运行docker-compose，请执行以下操作：**

    1. 在设备上的可写路径
例如 `/var` （如 `/var/docker-compose-yaml`）下创建或复制Docker-compose的YAML文件，
以便与设备上的Docker-compose配合使用。
    2. 确保Docker-compose YAML文件中列出的Docker镜像
在设备上可用。由
Docker-compose实用程序启动的容器需要这些镜像。
    3. 若要对多个YAML文件运行Docker-compose，请运行以下命令:

docker-compose -f <docker-compose-file-1>.yml -f <docker-compose\u0002file-2>.yml up</docker-compose\u0002file-2></docker-compose-file-1>
            Copy to clipboard

    Docker-compose会按照Docker-compose YAML文件中的配置
运行和启动Docker容器。在Docker-compose命令
返回后，运行 `docker ps -a` 和docker日志 `<conatiner-id>` 以验证Docker容器是否按预期运行。

    要了解有关Docker-compose的更多信息，请参阅 [Docker-compose 概述](https://docs.docker.com/compose)。

## Kubernetes概述

Kubernetes是一个开源平台，用于自动化部署，
扩展和管理在容器中运行的应用程序。它有助于
跨多个设备组织容器，确保应用程序的高效
资源利用率、高可用性和
可扩展性。有关Kubernetes的更多信息，请参阅
[https://kubernetes.io/](https://kubernetes.io/)。

- **启用Kubernetes**

    - Qualcomm Linux版本默认在 `qcom-multimedia-image` 中启用 Kubernetes，通过以下更改：

        - `packagegroup-qcom-k8s` 在 `meta-qcom-hwe` 中进行定义。
        - `packagegroup-qcom-k8s` 包含在
`recipes-products/packagegroups/packagegroup-qcom-multimedia.bb` 。
    - Qualcomm Linux内核在 `arch/arm64/configs/qcom_defconfig` 中启用了以下内核配置，以支持
Kubernetes runtime：

        - CONFIG_CGROUP_FAVOR_DYNMODS=y
                Copy to clipboard
        - CONFIG_CFS_BANDWIDTH=y
                Copy to clipboard
        - CONFIG_CGROUP_HUGETLB=y
                Copy to clipboard
        - CONFIG_NETFILTER_XT_MATCH_COMMENT=m
                Copy to clipboard
        - CONFIG_IP_NF_TARGET_REDIRECT=m
                Copy to clipboard
        - CONFIG_HUGETLBFS=y
                Copy to clipboard
    - 要验证kubelet的状态，请运行以下命令并验证输出：

        | 命令 | 说明 | 输出 |
        | --- | --- | --- |
        | `systemctl status kubelet` | 如果设备在启动后使用kubeadm作为Kubernetes节点，至少设置过一次 | 激活（运行中） |
        | `systemctl status kubelet` | 如果设备在启动后尚未使用kubeadm设置为Kubernetes节点 | 未激活（死锁） |
        |  |  |  |

    Kubernetes使用以pod形式运行的容器进行操作，这可以
将应用程序连同其依赖项打包
（库和配置文件）到一个单元中。这样
可以简化部署，并确保不同环境和集群节点
之间的一致性。在Kubernetes中，
节点指的是设备或设备。Kubernetes架构
有两种类型的资源：

    - **主节点/控制平面：** 主节点是
充当Kubernetes的控制平面的设备。它做出有关集群的
全局决策（如调度），并检测和
响应群集事件（例如，在未满足部署副本字段时
启动新容器）。
    - **工作节点：** 这些节点是包含
运行容器所需服务的设备，由主节点管理。
每个工作节点都运行 `Kubelet`，这是一个负责
Kubernetes主节点和worker节点之间通信的
进程，它管理着机器上运行的Pod。

    Pod是Kubernetes中最小的执行单元。它代表
集群中正在运行进程的单个实例，是
Kubernetes运行的容器的抽象。
- **Kubernetes节点示例**

    以下是两个设备作为节点连接到
公共接入点的示例：

    - **主节点**：其中一个设备被指定为主设备
节点。
    - **工作节点**：另一个设备充当工作节点。
从主节点创建的部署和Pod在
worker节点上运行。

    部署和Pod使用YAML文件创建。这些文件定义了
创建时部署和Pod的首选状态。
用户可以进入这些 Pod/容器的shell进行调试、
监控，并从主节点和工作节点执行其他任务。

    - **将设备设为主节点**

        要将设备设置为主节点，请执行以下操作：

        1. 将设备连接至Wi-Fi。
        2. 要初始化Kubernetes控制平面，请运行以下命令：

kubeadm init --ignore-preflight-errors=SystemVerification
                             --apiserver-advertise-address=<ip-address>
                Copy to clipboard

Note

`<ip-address>` 是接口 `wlan0` 的IP 地址，是将设备连接到Wi-Fi 后运行 `ifconfig` 的输出。
        3. 要开始使用集群，请以root 用户运行以下命令

mount -o remount, rw /
                mkdir -p $HOME/.kube
                cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
                chown $(id -u):$(id -g) $HOME/.kube/config
                Copy to clipboard

        使用 `kubeadm init` 将设备初始化为主
节点/控制平面后， `kubeadm` 打印出命令，
任何设备要作为工作节点加入群集，
都必须使用该命令。
    - **将设备设为工作节点**

        要将设备设置为工作节点并加入集群，请运行
`kubeadm join` 命令，其中初始化主节点之后， `kubeadm` 进行
打印。

Note

要禁止显示Kubernetes在使用vfs图形驱动程序运行Docker时报告的错误，请运行
`--ignore-preflight-errors=SystemVerification flag` 和 `kubeadm join` 命令。

Note

群集中的每个节点都应具有不同的主机名。添加具有相同主机名的多个设备
到群集，如有必要，请使用命令 `hostname <new-name>` 更改其主机名。
    - **从主节点创建部署和Pod**

        要在主节点上创建部署和Pod，请运行以下
命令:

kubectl apply -f <path-to-podnetwork-yaml-config-file>
            Copy to clipboard

        在 `/var` 等位置创建自己的YAML文件。关于YAML文件的示例，如下所示：

        - 用于针对Ubuntu镜像创建部署的YAML文件：

            **ubuntu-deployment.yaml**

apiVersion: apps/v1
                kind: Deployment
                metadata:
                  labels:
                    app: ubuntu-deployment
                  name: ubuntu-deployment
                spec:
                  replicas: 2
                  selector:
                    matchLabels:
                      app: ubuntu-deployment
                  template:
                    metadata:
                      labels:
                        app: ubuntu-deployment
                    spec:
                      containers:
                        - name: ubuntu-depl-pod
                          image: ubuntu:latest
                          command: ["sleep", "3650d"]
                Copy to clipboard
        - 用于针对 Ubuntu 镜像创建容器组的 YAML 文件：

            **ubuntu-pod.yaml**

apiVersion: v1
                kind: Pod
                metadata:
                  name: ubuntu-pod
                  labels:
                    app: ubuntu-pod
                spec:
                  containers:
                    - name: ubuntu
                      image: ubuntu:latest
                      command: ["sleep", "604800"]
                      imagePullPolicy：IfNotPresent
                  restartPolicy：Always
                Copy to clipboard
    - **使用Kubernetes Pod与** `kubectl`

        - **使用** `kubectl` **获取集群中的节点**

            若要列出群集中的节点，请在
主节点运行以下命令：

kubectl get nodes
                Copy to clipboard
        - **使用** `kubectl` **获取群集中存在的部署**

            要列出群集中存在的部署，请运行
主节点上的以下命令：

kubectl get deployment
                Copy to clipboard
        - **使用** `kubectl` **获取集群中存在的Pod**

            要列出集群中存在的Pod，请运行以下命令
主节点上的命令：

kubectl get pods
                Copy to clipboard
        - **从主节点访问容器组的shell**

            要从主节点访问Pod的shell实例，请运行
主节点上的以下命令：

kubectl exec -it <pod-name> -- <command>
                Copy to clipboard
        - **从工作节点访问容器组的shell**

            要使用Docker访问pod（容器）的shell实例，
请在Worker节点上运行以下命令：

docker exec -it <container-id> <command>
                Copy to clipboard

Note

`<container-id>` 通过使用命令 `docker ps -a` 列出所有容器来获取。

**Docker和Kubernetes与上游解决方案相比所做的变更**

- recipe `meta-qcom-hwe`/ `recipes-containers`/ `docker`/ `docker-ce_git.bbappend`
更改 `/lib/systemd/system/docker.service`。在此更改期间， `--exec-opt native.cgroupdriver=systemd` 传递给 `dockerd` 命令，
该命令是作为服务的一部分 `ExecStart` 运行的命令。执行该命令是为了保持Docker和Kubernetes上的 `cgroupdriver` 设置相同。
- recipe `meta-qcom-hwe`/ `recipes-containers`/ `kubernetes`/ `kubernetes_git.bbappend` 的更改 `/lib/systemd/system/kubelet.service.d/10-kubeadm.conf`。在此更改期间， `--fail-swap-on=false` 作为
`KUBELET_EXTRA_ARGS` 的一部分进行传递。之所以执行此操作，是因为Kubernetes预期 Swap 为 **OFF** 。由于 Qualcomm 的平台软件有zram
启用，Swap 设置为 **ON** 。
- 上游 `kubelet.service` 尝试在设备启动时进行自动启动时，即使设备未配置为Kubernetes节点也可以。但是，此行为会消耗资源并影响电源效率。为了解决这个问题， `kubelet.service` 进行了修改，删除了 `meta-qcom-hwe/recipes-containers/kubernetes/kubernetes_git.bbappend`
文件中的 `WantedBy=multi-user.target`。删除 `WantedBy=multi-user.target` 后，上游 `kubelet.service`
在设备设置为Kubernetes节点时, 使用 `kubeadm` 启动，而不是自动进入 `multi-user.target` 的一部分进行传递。

## 属性

属性（`property-vault`） 提供了在系统中存储和共享
以字符串形式存储的键值对的功能。任何软件
组件都可以共享特定键的任何值，
任何其他进程都可以使用相同的键访问该值。`property-vault` 允许您
在重新启动后定义持久属性。组件可以使用
`property-vault` 共享特定信息，该信息可以
与设备上的任何其他模块相关。这些键值对可以通过
使用命令行界面（CLI）访问。

Note

`property-vault` 仅与 `qcom-custom-bsp` 兼容。

- **使用 CLI 配置属性**

    要使用 CLI 设置属性，应使用以下命令：

setprop "my-key" "my-value"
        Copy to clipboard

    要使用 CLI 访问属性，应使用以下命令：

getprop "my-key"
        Copy to clipboard

命令结果 `the getprop "my-key"` ：my-value

    要使用 CLI 设置属性并在重新启动后保留它，请使用
以下命令：

setprop "persist.my-key" "my-value"
        Copy to clipboard
- **在 C/C++ 源文件中使用属性**

    若要使用 C/C++ 源文件中的属性，请执行以下操作：

    1. 要使用recipe中 `property-vault` 等的属性，例如， `example-recipe.bb` 添加对 `property-vault` 的依赖项:

DEPENDS = "glib-2.0 property-vault"
            RDEPENDS:${PN} = "property-vault"
            Copy to clipboard
    2. 更改 `make` 文件：

        1. 如果您正在使用 `automake`：

            `configure.ac`

...
                
                PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes, AC_MSG_ERROR(GLib >= 2.16 is required))
                GLIB_CFLAGS="$GLIB_CFLAGS"
                GLIB_LIBS="$GLIB_LIBS"
                AC_SUBST(GLIB_CFLAGS)
                AC_SUBST(GLIB_LIBS)
                
                AC_CONFIG_FILES([Makefile])
                ...
                Copy to clipboard

            `Makefile.am`

root_sbindir       = "/sbin"
                root_sbin_PROGRAMS = property-test
                
                property_test_SOURCES = source.c
                property_test_CFLAGS = @GLIB_CFLAGS@
                property_test_LDFLAGS = @GLIB_LIBS@ -lpropertyvault
                Copy to clipboard
        2. 如果您正在使用 `cmake` ：

            `CMakeList.txt`

set（CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -lpthread -lrt -lm -lglib-2.0 -ldl -latomic"）
                target_link_libraries （techteamlocalibname propertyvault）
                Copy to clipboard
    3. 修改源文件来 `get` 和 `set` 属性：

        `source.c`

#include "properties.h"
            
            int main() {
               // setting a property
               property_set("my-key", "my-value");
            
               // getting a property
               char paramstr[PROPERTY_VALUE_MAX];
               property_get("my-key", paramstr, ""); // value gets stored in paramstr
            
               // setting a property and persisting it across reboot
               property_set("persist.my-key", "my-value");
            
               return 0;
            }
            Copy to clipboard

## syslog（）的日志填充码

来自 Qualcomm 专有项目和开源项目的日志被记录到 `syslog` 。

`syslog()` 用于在设备上写入日志。 `rsyslog` 用作日志记录系统，根据指定的规则处理日志。
`rsyslog` 不仅可以接受来自系统和内核消息的输入，还可以接受使用 `syslog protocol` 进行日志记录的应用程序的输入。

当应用程序进行 `syslog` 调用时， `rsyslog` 会根据配置重新定向这些日志。该 `rsyslog` 配置位于 `/etc/rsyslog.conf` 或 `/etc/ryslog.d` 目录。

使用该 `logrotate` 服务存档旧日志。

Note

日志填充码仅与 `custom` 变体兼容。

## Persist分区

为UFS定义的持久性分区用于存储
BSP 软件组件在重新启动时所需的持久性数据。在设备生命周期内，用户请求
的操作不得删除这些数据。

- **persist 挂载点**

    该 `/var/persist` 目录用作
文件系统的挂载点，在名为 persist 的分区上创建。此
`overlayfs-qcom-paths_1.0.bb` recipe负责创建
rootfs 上的目录，并将
`var-persist.mount` systemd 单元安装至 `local-fs.target`。

    启动时， `var-persist.mount` systemd 单元将 `/dev/disk/by-partlabel/persist` 挂载至 `/var/persist` 上。若要显示持久性
mount 点，则运行 mount 命令，如下所示：

sh-5.1# mount | grep persist
        /dev/sda10 on /var/persist type ext4 (rw,relatime,rootcontext=system_u:object_r:qcom_persist_t:s0,seclabel,stripe=128)
        Copy to clipboard
- **调整 persist 分区的大小**

    调整覆盖分区的大小，要使用
`resize-partitions.bb` recipe和 `resize-partition.service.in` 文件。
调整覆盖分区的服务在设备启动以根据分区大小
创建和设置文件系统。

## 辅助虚拟机

本节介绍创建Qualcomm Linux主机和
客户机虚拟机（VM）映像的步骤，包括
基本的虚拟机管理工具，例如 `crosvm` 和 `qemu`，
以及用于启动客户机虚拟机的命令。

以下小节将介绍如何为映像启用虚拟机支持。

1. **设置主机** 。

    若要在主机上安装clang，请运行以下命令：

sudo apt install clang-11
        Copy to clipboard
2. **启用meta-rust layer** 。

    Meta-rust layer提供Rust编译器（rustc）和软件包
管理器（cargo）来编译crosvm，crosvm是在Rust中实现的
语言。

    将meta-rust layer添加到
`meta-qcom-distro/conf/bblayers.conf` 目录中的EXTRALAYERS。

    `vi conf/bblayers.conf`

EXTRALAYERS ?= " \
         ${WORKSPACE}/layers/meta-rust \
        "
        Copy to clipboard
3. **升级Rust版本** 。

    创建 `meta-qcom-distro/conf/distro/include/rust_version.inc` 文件
内容如下：

    `vi meta-qcom-distro/conf/distro/include/rust_version.inc`

# include this in your distribution to easily switch between versions
        # just by changing RUST_VERSION variable
        
        RUST_VERSION ?= "1.73.0"
        
        PREFERRED_VERSION_cargo ?= "${RUST_VERSION}"
        PREFERRED_VERSION_cargo-native ?= "${RUST_VERSION}"
        PREFERRED_VERSION_libstd-rs ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-cross-${TARGET_ARCH} ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-llvm ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-llvm-native ?= "${RUST_VERSION}"
        PREFERRED_VERSION_rust-native ?= "${RUST_VERSION}"
        Copy to clipboard

    将 `rust_version.inc` 文件包含在 `meta-qcom-distro/conf/distro/qcom-wayland.conf` 目录中。

    `conf/distro/qcom-wayland.conf`

require conf/distro/include/rust_version.inc
        Copy to clipboard
4. **将crosvm添加到虚拟包** 。

    若要将crosvm添加到主机虚拟机包组，请运行以下命令：

    `vi meta-qcom-distro/recipes-products/packagegroups/packagegroup-qcom-vm-host.bb`

RDEPENDS：packagegroup-qcom-vm-host：append：qcom-custom-bsp = "\
           crosvm \
           "
        Copy to clipboard
5. **生成主机虚拟机和客户机虚拟机映像** 。

    - 若要生成主机虚拟机映像，请运行以下命令：

bitbake qcom-console-image
            Copy to clipboard
    - 若要生成客户机虚拟机映像，请运行以下命令：

bitbake multiconfig:qcom-guestvm:qcom-guestvm-image
            Copy to clipboard

        **Guest 虚拟机 artifacts**

> 
> 
> 1. 客户机虚拟机生成命令创建以客户机虚拟机映像命名 `tmp-qcom-guestvm-glibc` 的文件夹。
>         2. 客户机虚拟机内核和rootfs映像在 `tmp-qcom-guestvm-glibc/deploy/images/<machine-name>` 目录中生成。
>         3. 将该 `tmp-qcom-guestvm-glibc/deploy/images/<machine-name>/Image` 文件用作客户机虚拟机内核映像。
>         4. 使用该 `tmp-qcom-guestvm-glibc/deploy/images/<machine-name>/qcom-guestvm-image-<machine-name>.ext4` 文件作为rootfs。
>         5. 加载主机内部版本后，将这两个映像复制到磁盘。
6. **启动客户机虚拟机** 。

    若要启动客户机虚拟机，请使用crosvm虚拟机管理器（VMM）和Gunyah虚拟机监控程序。

    确保客户机虚拟机内核和根文件系统位于 `/var/gunyah` 设备上的目录中，然后运行以下命令：

crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor gunyah --protected-vm-without-firmware \
        --serial=type=stdout，hardware=virtio-console，console，stdin，num=1 --serial=type=stdout，hardware=serial，earlycon，num=1 \
        --root /var/gunyah/qcom-guestvm-image-qcs9100-ride-sx.ext4 --no-balloon --no-rng --params \
        "earlyprintk=serial panic=0" /var/gunyah/Image
        Copy to clipboard

    - `--root /var/gunyah/qcom-guestvm-image-qcs9100-ride-sx.ext4` 指定了客户机虚拟机的根文件系统路径。
    - `/var/gunyah/Image` 指定了内核映像的路径。

    相关详细信息，请参阅 [虚拟化](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/features.html#virtualization) 。

## 使用recipe处理树外内核模块和设备树

要编译树外内核模块，请参阅 [添加内核模块](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/customize.html#add-kernel-module)。

Note

只有 `custom` build支持核外的设备树。

有关设备树/设备树blob管理，请参阅 [平台支持](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-3/customize.html#platform-support)。

Last Published: Dec 15, 2024

[Previous Topic
概述](https://docs.qualcomm.com/bundle/publicresource/80-70015-27SC/topics/intro_yocto_linux_qualcomm.md) [Next Topic
用户定制](https://docs.qualcomm.com/bundle/publicresource/80-70015-27SC/topics/user_customizations.md)

Source: [https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html](https://docs.qualcomm.com/doc/80-70015-27SC/topic/platform_software_features.html)