㈠ 如何在虛擬機中運行 YOCTO LINUX 操作系統
本文將為大家介紹如何創建 Yocto* 的可運行映像,如何在基礎軟體模擬器 QEMU 中測試該映像,以及如何在管理程序(比如 Windows 上的 Microsoft Hyper-V)中運行該映像。
操作本教程的前提條件
Debian/Ubuntu(已經過 Debian 8.2 amd64 的測試)互聯網連接磁碟提供至少 100 GB 可用空間
構建機器的前期准備工作
以根身份(或通過 "sudo")運行以下命令
1 # apt-get install wget git-core unzip make gcc g++ build-essential subversion sed autoconf automake texi2html texinfo coreutils diffstat python-pysqlite2 docbook-utils libsdl1.2-dev libxml-parser-perl libgl1-mesa-dev libglu1-mesa-dev xsltproc desktop-file-utils chrpath groff libtool xterm gawk fop
注 1:上述命令是否成功運行取決於大家使用的 Ubuntu/Debian 版本。 最後,如欲解決程序包的依賴關系,可以運行 "aptitude",強行安裝正確版本的程序包(比如,"aptitude install libsdl1.2-dev")。
注 2:對於其他 Linux-distribution 來說,比如 RadHat、CentOS、Fedora、SuSe、Gentoo 等......建議通過正確的 package-manager(例如 zypper、yum 等)檢查上述程序包的相應版本。
第一步: 設置工作文件夾
以沒有特權的普通用戶(沒有根身份)
1 # cd
2 # mkdir yocto-2.0
3 # cd yocto-2.0
4 # wget http://downloads.yoctoproject.org/releases/yocto/yocto-2.0/poky-jethro-14.0.0.tar.bz2
5 # tar xvjf poky-jethro-14.0.0.tar.bz2
6 # cd poky-jethro-14.0.0/
注 3:可以點擊以下鏈接 https://www.yoctoproject.org/downloads,選擇 Yocto 版本的其他開發分支。 本教程將使用當前最新版本 "Jocto Poky 2.0.14.0.0 codename Jethro"。
注 4:如欲獲取最新版 Yocto 資源,可以獲得主開發分支,需要將 wget 操作替換為以下內容:
1 # git clone git://git.yoctoproject.org/poky.git
2 # cd poky
注 5: 還可以通過代號選擇特定的開發分支。 例如:
1 # git clone -b jethro git://git.yoctoproject.org/poky.git
第二步: 設置系統 shell 的環境變數
Yocto 開發人員提供了一個非常易用的腳本。
1 # . ./oe-init-build-env
腳本運行後,如果正常,您的位置將變成一個構建子目錄,它將成為您的新工作區。 類似於 /home/<your user>/yocto-2.0/poky-jethro-14.0.0/build/。
第三步: 設置 bitbake
執行之前的腳本,會創建一個 conf/local.conf 文件。
該配置文件需要設置 Yocto 的構建引擎 bitbake(Yocto 項目的核心組件)。
採用首選文本編輯器編輯 bitbake 配置文件。 本教程將使用 nano — 面向類似 Unix 的環境的簡單命令-行-界面文本編輯器,如下所示:
1 # cd conf/
2 # nano local.conf
取消下列行的注釋
1 DL_DIR ?= "${TOPDIR}/downloads"
2 SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
3 TMPDIR ?= "${TOPDIR}/tmp"
4 SDKMACHINE ?= "i686"
建議為該映像構建所有其他的可用特性。 最終的映像將特別大(每個大約 8GB),但絕對完整,可滿足所有開發需求。
1 EXTRA_IMAGE_FEATURES = "dbg-pkgs dev-pkgs ptest-pkgs tools-sdk tools-debug eclipse-debug tools-profile tools-testapps debug-tweaks"
現在,通過 CTRL+X 鍵組合保存對文件 local.conf 作出的所有更改。
然後:
1 # cd ..
2 # hob
現在,Hob 實例(面向 BitBake、基於 GTK2 的圖形用戶界面)將啟動,檢查構建系統的准確程度。
現在在下拉菜單中選擇 qemux86 機器。
等 Hob 完成 BitBake 方案解析並生成依賴關系樹。 然後選擇目標映像,以從上述菜單的 "select an image recipe" 開始構建。 在本示例中,我們選擇不包含 GUI 的完整核心映像: core-image-full-cmdline。
現在點擊 "Advanced Configuration"。
如欲構建最新的穩定版,在 "Image types" 面板中保留 "Distro" 菜單中的 poky。 然後在 "Image types" 欄位中選擇所需的格式:通常我選擇 ".iso"、".vdi" 和 ".vmdk",它們最好用。
請在 "Output" 面板中選擇能夠滿足要求的最佳選項。 建議為映像增加 4GB 可用存儲,以放置面向 i686 架構的 SDK(如果您使用 Edison 開發板)。 另外,我認為將 "deb" 設置為面向根文件系統的打包格式非常有用。 因此,如下所示:
好的,保存。 現在,您已准備好構建映像! 點擊 "Build image" 按鈕!
Hob 將啟動 bitbake core-image-full-cmdline 示例,以及您鍾愛的設置。
注 7:這一流程將花費很長時間構建最終映像。 不過,根據您主機功能的不同,可以更改用於在 "BitBake parallel threads" 和 "Make parallel threads" 上執行構建操作的處理器內核的數量。 可從 Hob settings 窗口更改這些變數:
注 8:您可以藉助 Hob 確定將要構建的映像包含哪些包。 為此,可以在開始構建映像之前選擇 "Edit image recipe"。
㈡ yocto中編譯指定版本的bb
如果一個bb有多個版本,在編譯的時候,希望編譯自己指定的版本,需要使用下面這個變數
使用的時候,必須在這個變數的後面加上包名{PN}作為後綴,然後再給他設置你希望的版本號{PV}。
可以使用 % 作為通配符,忽略後面的小版本號。
舉例如下:
變數的賦值語句放到conf文件裡面,比如,local.conf
如果一個功能,有多個bb,在編譯的時候,希望編譯自己指定的版本,需要用到下面這兩個變數中的一個。
這種情況,大多發生在 virtual/* 命空間中,比如:virtual/kernel, virtual/bootloader, virtual/libc等。
這個語句一般也是放在conf文件,或者在inc文件中提供給別人包含。
上面的PREFERRED_PROVIDER等價於下面的寫法
㈢ Yocto編譯傑發或MTK的linux或android時的幾個問題
編譯問題1(audiomanager_7.0.bb的do_configure報錯):
錯誤:CMake Error at Plugins/PluginCommandInterfaceCAPI/cmake/CommonAPI.cmake:352 (message):
| Failed to generate files from FIDL:
手動執行一下:
$ commonapi-generator-linux-x86 -ll verbose -sk Default -d . /data/linux/hz_rs28_bm/sources/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/audiomanager/7.0-r1/audiomanager-7.0/Plugins/PluginCommandInterfaceCAPI/fidl/CommandInterface.fidl
-bash: /data/linux/hz_rs28_bm/sources/src/build/tools/commonapi_tool/commonapi-generator/commonapi-generator-linux-x86: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解決(需要安裝32位的glibc庫和32位java jre環境):
$ sudo yum install glibc.i686
$ sudo yum install java-1.8.0-openjdk.i686
$ sudo ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.i386/jre/bin/java /bin/java
$ java -version (保證是32位的java)
編譯問題2(perl_5.20.0.bb的do_package報錯):
錯誤:ERROR: obj failed with exit code 256 (cmd was 『arm-poky-linux-gnueabi-obj』 –only-keep-debug
… generate_uudmap: File format not recognized
解決(tar在1.29版本之後需要exclude在路徑的前面):
sources/meta/poky/bitbake/lib/bb/fetch2/bzr.py
tar_flags = 「–exclude 『.bzr』 –exclude 『.bzrtags'」
修改成:
tar_flags = 「–exclude=』.bzr』 –exclude=』.bzrtags'」
sources/meta/poky/bitbake/lib/bb/fetch2/cvs.py
tar_flags = 「–exclude 『CVS'」
修改成:
tar_flags = 「–exclude=』CVS'」
sources/meta/poky/bitbake/lib/bb/fetch2/repo.py
tar_flags = 「–exclude 『.repo』 –exclude 『.git'」
修改成:
tar_flags = 「–exclude=』.repo』 –exclude=』.git'」
sources/meta/poky/bitbake/lib/bb/fetch2/svn.py
tar_flags = 「–exclude 『.svn'」
修改成:
tar_flags = 「–exclude=』.svn'」
sources/meta/poky/meta/recipes-devtools/quilt/quilt-0.63.inc
tar -cf – bin/ –exclude \*.in | ( cd ${D}${PTEST_PATH} && tar -xf – )
tar -cf – compat/ –exclude \*.in | ( cd ${D}${PTEST_PATH} && tar -xf – )
tar -cf – quilt/ –exclude \*.in | ( cd ${D}${PTEST_PATH} && tar -xf – )
tar -cf – test/ –exclude mail.test –exclude delete.test | ( cd ${D}${PTEST_PATH} && tar -xf – )
修改成:
tar -c –exclude=\*.in bin/ | ( cd ${D}${PTEST_PATH} && tar -xf – )
tar -c –exclude=\*.in compat/ | ( cd ${D}${PTEST_PATH} && tar -xf – )
tar -c –exclude=\*.in quilt/ | ( cd ${D}${PTEST_PATH} && tar -xf – )
tar -c –exclude=mail.test –exclude=delete.test test/ | ( cd ${D}${PTEST_PATH} && tar -xf – && chmod 777 test)
sources/meta/poky/meta/recipes-extended/sed/sed-4.2.2/sed-add-ptest.patch
+ cd $(BUILDDIR); tar -cf – $(TESTDIR) –exclude *.o | ( cd $(DESTDIR) && tar -xf – )
修改成:
+ cd $(BUILDDIR); tar -c –exclude=*.o $(TESTDIR) | ( cd $(DESTDIR) && tar -xf – )
sources/meta/poky/meta/recipes-support/attr/acl.inc
tar -cf – test/ –exclude nfs | ( cd ${D}${PTEST_PATH} && tar -xf – )
修改成:
tar -c –exclude=nfs test/ | ( cd ${D}${PTEST_PATH} && tar -xf – )
sources/meta/poky/meta/recipes-support/attr/attr.inc
tar -cf – test/ –exclude ext | ( cd ${D}${PTEST_PATH} && tar -xf – )
修改成:
tar -c –exclude=ext test/ | ( cd ${D}${PTEST_PATH} && tar -xf – )
sources/meta/poky/meta/recipes-devtools/perl/perl-ptest.inc
tar -cf – * –exclude \*.o –exclude libperl.so –exclude Makefile –exclude makefile –exclude hostperl \
–exclude miniperl –exclude generate_uudmap –exclude patches | ( cd ${D}${PTEST_PATH} && tar -xf – )
修改成:
tar -c –exclude=\*.o –exclude=libperl.so –exclude=Makefile –exclude=makefile –exclude=hostperl \
–exclude=miniperl –exclude=generate_uudmap –exclude=patches * | ( cd ${D}${PTEST_PATH} && tar -x )
編譯問題3(libunwind_1.1.bb的do_compile報錯):
錯誤:make[1]: latex2man: Command not found
解決:
$ sudo yum install texlive-tetex
$ sudo rpm -ivh ~/latex2man-1.18-2.noarch.rpm
編譯問題3(qt5-app_1.0.bb的do_compile報錯):
錯誤(有一批類似的錯誤):ld: cannot find -lgtest
解決:
$ vi atc_linux/application/btate/btate.pro
equals(MY_BUILD_SYSTEM, atc) {
LIBS += -L $(DA_LIBDIR)/lib -lgtest -lpthread -lbluetoothclient -lglobalbus -lappobj -lapputils
} else {
LIBS += -L$(DA_TOP)/application/lib -L$(DA_TOP)/../../sources/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/atc-binarys/1.0-r0/image/usr/lib -lgtest -lpthread -lbluetoothclient -l
globalbus -lappobj -lapputils
}
$ vi atc_linux/application/gps/gps_bin.pro
equals(MY_BUILD_SYSTEM, atc) {
LIBS += -L $(DA_LIBDIR)/lib -lapputils -lglobalbus -lappobj -lgps
} else {
LIBS += -L$(DA_TOP)/application/lib -L$(DA_TOP)/../../sources/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/gpsd/3.10-r0/gpsd-3.10/ -lapputils -lglobalbus -lappobj -lgps
}
$ vi atc_linux/application/dvr/dvr_bin.pro
equals(MY_BUILD_SYSTEM, atc) {
LIBS += -L${DA_TOP}/lib/lib/ -ldvr -ludev -lsurface_atc -lglobalbus -lappobj -lapputils -lstorage_atc -lgps
} else {
LIBS += -L${DA_TOP}/application/lib -L$(DA_TOP)/../../sources/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/gpsd/3.10-r0/gpsd-3.10/ -ldvr -ludev -lsurface_atc -lglobalbus –
lappobj -lapputils -lstorage_atc -lgps
}
$ vi atc_linux/application/dvr/dvr_bin.pro
INCLUDEPATH += ${DA_TOP}/kernel/kernel-3.18/drivers/ \
../common/ \
../utils/ \
../appobj/include/ \
../globalbus/include/ \
../appcommon/include/ \
../storage_atc/ \
../dvr/gps/ \
../gps/include/ \
../gps/includeex/ \
編譯問題4(makall報錯):
報錯:./makall: line 169: mkisofs: command not found
解決:$ sudo yum install mkisofs
編譯問題5(修改ac83xx_systemd_defconfig再編譯時報錯):
報錯:Applying patch remove-selinux-android.patch
patching file system/extras/ext4_utils/make_ext4fs.c
Hunk #1 FAILED at 62.
1 out of 1 hunk FAILED — rejects in file system/extras/ext4_utils/make_ext4fs.c
解決:
$ vi sources/meta/meta-atc/recipes-devtools/android-tools/android-tools_5.1.1.r37.bb
在裡面做個假的do_patch(),bitbake會優先使用本bb文件的do_patch()函數。
do_patch(){
}
編譯問題6(修改ac83xx_systemd_defconfig再編譯時報錯):
報錯:sources/build/tmp/work/armv7a-vfp-neon-poky-linux-gnueabi/qtbase/5.5.0+gitAUTOINC+c619d2daac-r0/git/src/corelib/tools/qregexp.cpp:3947:1: internal compiler error: in add_stores, at var-tracking.c:6000
解決:
$ cd sources/meta/poky/meta/recipes-devtools/gcc/gcc-4.9/
$ wget http://openlinux.windriver.com/overc/sources/core2_64/gcc-4.9.2-r0.1/0062-gcc-var-tracking.c-backport-from-gcc-trunk-r212178.patch
$ vi sources/meta/poky/meta/recipes-devtools/gcc/gcc-4.9.inc
file://0058-gcc-r212171.patch \
file://0059-gcc-PR-rtl-optimization-63348.patch \
file://target-gcc-includedir.patch \
file://0062-gcc-var-tracking.c-backport-from-gcc-trunk-r212178.patch \
其實就是這個文件:
$ cat 0062-gcc-var-tracking.c-backport-from-gcc-trunk-r212178.patch
From Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20M=C3=BCller-Klieser?= <[email protected]>
Date: Tue, 7 Apr 2015 16:15:11 +0200
Subject: [PATCH] gcc/var-tracking.c: backport from gcc trunk r212178
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
resolves a bug seen on cortexa8 building qt5 libraries.
2014-06-30 Joseph Myers <[email protected]>
* var-tracking.c (add_stores): Return instead of asserting if old
and new values for conditional store are the same.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212178 138bc75d-0d04-0410-961f-82ee72b054a4
Signed-off-by: Stefan Müller-Klieser <[email protected]>
---
gcc/var-tracking.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 65d8285..7c38910 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -5997,7 +5997,8 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
{
cselib_val *oval = cselib_lookup (oloc, GET_MODE (oloc), 0, VOIDmode);
- gcc_assert (oval != v);
+ if (oval == v)
+ return;
gcc_assert (REG_P (oloc) || MEM_P (oloc));
if (oval && !cselib_preserved_value_p (oval))
--
1.9.1
編譯問題7(修改ac83xx_systemd_defconfig再編譯時報錯):
報錯:libevdev/1.2.2-r0/libevdev-1.2.2/test/test-main.c:24:19: fatal error: check.h: No such file or directory
解決:
$ vi meta/poky/meta/recipes-support/libevdev/libevdev_1.2.2.bb
LIC_FILES_CHKSUM = 「file://COPYING;md5= \
file://libevdev/libevdev.h;endline=21;md5=″
DEPENDS += 「libcheck」
SRC_URI = 「 http://www.freedesktop.org/software/libevdev/ ${BP}.tar.xz」
編譯問題8(修改ac83xx_systemd_defconfig再編譯時報錯):
報錯:python報錯: 『do_rootfs』, lineno: 17, function
Exception: CalledProcessError: Command 『[『』, 『-ks』, …
解決: 沒有實際問題,重新編譯一次即可,可能是機器太忙導致超時,或者某個命令執行不成功。
編譯問題9(preuboot編譯工具問題):
報錯:make: armv7a-mediatek451_001_vfp-linux-gnueabi-gcc: Command not found
解決:
$ vi atc_linux/bootloader/preuboot/Makefile
#CROSS_COMPILE :=armv7a-mediatek451_001_vfp-linux-gnueabi-
CROSS_COMPILE :=arm-poky-linux-gnueabi-
$ vi ../../atc_linux/bootloader/preuboot/driver/mmc/include/linux/list.h
#ifndef NULL
#define NULL 0
#endif
㈣ yocto怎麼安裝deb文件
DEB安裝包通常是採用unix內核(或linux內核)的電腦所使用的一種軟體安裝包。和Windows下的MSI安裝包類似,不過沒有想windows那樣有個自動安裝的程序。需要手動安裝。
首先,你得將手機越獄,沒越獄的iPhone理論上只能安裝由APPStore提供的軟體的。
2
在越獄後,必須安裝CYDIA這個軟體,這是越獄後所有BED軟體安裝的來源。
3
通過網站下載軟體 iFunBox並完成安裝
4
將手機連接至電腦,打開iFunBox。
打開文件系統,依次找到/var/root/Media/Cydia/AutoInstall/這個路徑。將需要安裝的DEB文件拖入右邊即可。
重啟手機,Cydia會自動安裝好DEB文件的。
詳細教程
㈤ 如何在yocto下安裝deb文件
開始搭建環境
(1)$source poky/oe-init-build-env xxx
xxx$cd conf
xxx/conf$ vim bblayers.conf
# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "4"
BBFILES ?= ""
BBLAYERS ?= " \
/hda5/hmi/x86/yocto/poky/meta \
/hda5/hmi/x86/yocto/poky/meta-yocto \
/hda5/hmi/x86/yocto/poky/meta-intel \
/hda5/hmi/x86/yocto/poky/meta-intel/meta-crownbay \
(2)修改local.conf
xxx/conf$ vim local.conf
#MACHINE ??= "qemux86"
MACHINE ??= "crownbay"
4.開始編譯
註:(官方下載的只是腳本,yocto一邊下載一邊編譯所以很慢而且還受資源下載限制和電腦配置,下載的文件在工作目錄中的downloads中,第一次下載後保存好downloads以後就方便了)
(1)配置內核
xxx$ bitbake linux_yocto -c menuconfig
(2)定製微型yocto
xxx$ bitbake core-image-minimal
(3)定製桌面型yocto
xxx$ bitbake coure-image-sato
(4) hob config
xxx$ hob
可以在圖形化界面中方便的定製系統。