mirror of
https://git.yoctoproject.org/meta-arm
synced 2026-10-22 19:38:19 +00:00
Compare commits
34
Commits
3.3.4
..
yocto-3.2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e219ef606e | ||
|
|
fc4b2f8907 | ||
|
|
d8074cb6a0 | ||
|
|
48720822d6 | ||
|
|
7336830dab | ||
|
|
332410055a | ||
|
|
7c3a55f8ff | ||
|
|
ac9f59ca62 | ||
|
|
fb196bacd6 | ||
|
|
6e3e29857c | ||
|
|
d235d4b53e | ||
|
|
5207074884 | ||
|
|
7185d29de9 | ||
|
|
932d35bab0 | ||
|
|
d12eadacd0 | ||
|
|
e45752aa6f | ||
|
|
a365b3bd7e | ||
|
|
7b82307c0a | ||
|
|
a72b89ccd1 | ||
|
|
1cd14b33c1 | ||
|
|
27ed22b040 | ||
|
|
b97016fcfa | ||
|
|
eff9e62526 | ||
|
|
892c9686bf | ||
|
|
e8cc03775e | ||
|
|
4cae9fe87b | ||
|
|
784ef62cc4 | ||
|
|
1a0a9700f2 | ||
|
|
ba30bf591e | ||
|
|
0c59d1cf42 | ||
|
|
289982e1cb | ||
|
|
44e51aa5be | ||
|
|
b8bb75b4d3 | ||
|
|
0057143f4b |
No files matched your search
+25
-109
@@ -1,53 +1,37 @@
|
|||||||
image: ghcr.io/siemens/kas/kas:3.2
|
# Use our custom Crops-derived image
|
||||||
|
image: $CI_REGISTRY/$CI_PROJECT_NAMESPACE/yocto-builder:master
|
||||||
|
|
||||||
# First do a common bootstrap, and then build all the targets
|
# First do a common bootstrap, and then build all the targets
|
||||||
stages:
|
stages:
|
||||||
- prep
|
|
||||||
- bootstrap
|
- bootstrap
|
||||||
- build
|
- build
|
||||||
|
|
||||||
# Common job fragment to get a worker ready
|
# Common job fragment to get a worker ready
|
||||||
.setup:
|
.setup:
|
||||||
stage: build
|
stage: build
|
||||||
interruptible: true
|
|
||||||
variables:
|
variables:
|
||||||
KAS_WORK_DIR: $CI_PROJECT_DIR/work
|
KAS_WORK_DIR: $CI_PROJECT_DIR/work
|
||||||
KAS_REPO_REF_DIR: $CI_BUILDS_DIR/persist/repos
|
|
||||||
SSTATE_DIR: $CI_BUILDS_DIR/persist/sstate
|
SSTATE_DIR: $CI_BUILDS_DIR/persist/sstate
|
||||||
DL_DIR: $CI_BUILDS_DIR/persist/downloads
|
DL_DIR: $CI_BUILDS_DIR/persist/downloads
|
||||||
BB_LOGCONFIG: $CI_PROJECT_DIR/ci/logging.yml
|
BB_LOGCONFIG: $CI_PROJECT_DIR/kas/logging.yml
|
||||||
TOOLCHAIN_DIR: $CI_BUILDS_DIR/persist/toolchains
|
|
||||||
IMAGE_DIR: $CI_PROJECT_DIR/work/build/tmp/deploy/images
|
|
||||||
TOOLCHAIN_LINK_DIR: $CI_PROJECT_DIR/work/build/toolchains
|
|
||||||
before_script:
|
before_script:
|
||||||
- echo KAS_WORK_DIR = $KAS_WORK_DIR
|
- echo KAS_WORK_DIR = $KAS_WORK_DIR
|
||||||
- echo SSTATE_DIR = $SSTATE_DIR
|
- echo SSTATE_DIR = $SSTATE_DIR
|
||||||
- echo DL_DIR = $DL_DIR
|
- echo DL_DIR = $DL_DIR
|
||||||
- rm -rf $KAS_WORK_DIR
|
- mkdir --verbose --parents $KAS_WORK_DIR $SSTATE_DIR $DL_DIR
|
||||||
- mkdir --verbose --parents $KAS_WORK_DIR $KAS_REPO_REF_DIR $SSTATE_DIR $DL_DIR $TOOLCHAIN_DIR $TOOLCHAIN_LINK_DIR
|
|
||||||
# Must do this here, as it's the only way to make sure the toolchain is installed on the same builder
|
|
||||||
- ./ci/get-binary-toolchains $DL_DIR $TOOLCHAIN_DIR $TOOLCHAIN_LINK_DIR
|
|
||||||
|
|
||||||
# Generalised fragment to do a Kas build
|
# Generalised fragment to do a Kas build
|
||||||
.build:
|
.build:
|
||||||
extends: .setup
|
extends: .setup
|
||||||
script:
|
script:
|
||||||
- KASFILES=$(./ci/jobs-to-kas $CI_JOB_NAME)
|
- KASFILES=$(kas/jobs-to-kas $CI_JOB_NAME)
|
||||||
- kas shell --update --force-checkout $KASFILES -c 'cat conf/*.conf'
|
- kas shell --update --force-checkout $KASFILES -c 'cat conf/*.conf'
|
||||||
- kas build $KASFILES
|
- kas build $KASFILES
|
||||||
- ./ci/check-warnings $KAS_WORK_DIR/build/warnings.log
|
- ./kas/check-warnings $KAS_WORK_DIR/build/warnings.log
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Prep stage, update repositories once
|
# First phase, bootstrap and machine coverage
|
||||||
#
|
|
||||||
update-repos:
|
|
||||||
extends: .setup
|
|
||||||
stage: prep
|
|
||||||
script:
|
|
||||||
- flock --verbose --timeout 60 $KAS_REPO_REF_DIR ./ci/update-repos
|
|
||||||
|
|
||||||
#
|
|
||||||
# Bootstrap stage, bootstrap and machine coverage
|
|
||||||
#
|
#
|
||||||
|
|
||||||
# Build a number of native tools first to ensure the other builders don't race
|
# Build a number of native tools first to ensure the other builders don't race
|
||||||
@@ -59,25 +43,16 @@ n1sdp/bootstrap:
|
|||||||
# What percentage of machines in the layer do we build
|
# What percentage of machines in the layer do we build
|
||||||
machine-coverage:
|
machine-coverage:
|
||||||
stage: bootstrap
|
stage: bootstrap
|
||||||
interruptible: true
|
|
||||||
script:
|
script:
|
||||||
- ./ci/check-machine-coverage
|
- ./kas/check-machine-coverage
|
||||||
coverage: '/Coverage: \d+/'
|
coverage: '/Coverage: \d+/'
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build stage, the actual build jobs
|
# Second phase, the actual build jobs
|
||||||
#
|
#
|
||||||
|
|
||||||
# Validate layers are Yocto Project Compatible
|
a5ds:
|
||||||
check-layers:
|
|
||||||
extends: .setup
|
|
||||||
coverage: '/Coverage: \d+/'
|
|
||||||
script:
|
|
||||||
- kas shell --update --force-checkout ci/base.yml:ci/meta-python.yml --command \
|
|
||||||
"$CI_PROJECT_DIR/ci/check-layers.py $CI_PROJECT_DIR/ci/check-layers.yml $CI_PROJECT_DIR $KAS_WORK_DIR"
|
|
||||||
|
|
||||||
corstone500:
|
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
corstone700-fvp:
|
corstone700-fvp:
|
||||||
@@ -86,39 +61,24 @@ corstone700-fvp:
|
|||||||
corstone700-mps3:
|
corstone700-mps3:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
|
foundation-armv8:
|
||||||
|
extends: .build
|
||||||
|
|
||||||
fvp-base:
|
fvp-base:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
fvp-base-arm32:
|
fvp-base-arm32:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
fvp-base-arm32/external-gccarm:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
fvp-baser-aemv8r64:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
gem5-arm64:
|
gem5-arm64:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
gem5-arm64-xen:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
gem5-atp-arm64:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
generic-arm64:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
juno:
|
juno:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
juno/clang:
|
juno/clang:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
microbit-v1:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
musca-b1:
|
musca-b1:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
@@ -128,31 +88,16 @@ musca-s1:
|
|||||||
n1sdp:
|
n1sdp:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
n1sdp/armgcc:
|
qemuarm64-secureboot:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
qemu-cortex-a53:
|
qemuarm64-secureboot/clang:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
qemuarm/testimage:
|
qemuarm64-secureboot/clang/musl:
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
qemuarm64-sbsa:
|
qemuarm64-secureboot/musl:
|
||||||
extends: .build
|
|
||||||
|
|
||||||
qemuarm64-secureboot/testimage:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
qemuarm64-secureboot/clang/testimage:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
qemuarm64-secureboot/clang/musl/testimage:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
qemuarm64-secureboot/musl/testimage:
|
|
||||||
extends: .build
|
|
||||||
|
|
||||||
qemuarmv5/testimage:
|
|
||||||
extends: .build
|
extends: .build
|
||||||
|
|
||||||
sgi575:
|
sgi575:
|
||||||
@@ -166,47 +111,18 @@ tc0:
|
|||||||
# Utility tasks, not executed automatically
|
# Utility tasks, not executed automatically
|
||||||
#
|
#
|
||||||
|
|
||||||
delete-dl-dir:
|
# Report on disk usage
|
||||||
|
usage:
|
||||||
extends: .setup
|
extends: .setup
|
||||||
stage: prep
|
stage: bootstrap
|
||||||
when: manual
|
when: manual
|
||||||
script:
|
script:
|
||||||
- rm -rf $DL_DIR/*
|
- du -h -s $DL_DIR $SSTATE_DIR
|
||||||
|
|
||||||
delete-repo-dir:
|
|
||||||
extends: .setup
|
|
||||||
stage: prep
|
|
||||||
when: manual
|
|
||||||
script:
|
|
||||||
- rm -rf $KAS_REPO_REF_DIR/*
|
|
||||||
|
|
||||||
# Delete all sstate
|
|
||||||
delete-sstate:
|
|
||||||
extends: .setup
|
|
||||||
stage: prep
|
|
||||||
when: manual
|
|
||||||
script:
|
|
||||||
- rm -rf $SSTATE_DIR/*
|
|
||||||
|
|
||||||
delete-toolchains:
|
|
||||||
extends: .setup
|
|
||||||
stage: prep
|
|
||||||
when: manual
|
|
||||||
script:
|
|
||||||
- rm -rf $TOOLCHAIN_DIR/*
|
|
||||||
|
|
||||||
# Wipe out old sstate
|
# Wipe out old sstate
|
||||||
prune-sstate:
|
prune-sstate:
|
||||||
extends: .setup
|
extends: .setup
|
||||||
stage: prep
|
stage: bootstrap
|
||||||
when: manual
|
when: manual
|
||||||
script:
|
script:
|
||||||
- find $SSTATE_DIR -type f -atime +30 -delete
|
- find $SSTATE_DIR -type f -atime +30 -delete
|
||||||
|
|
||||||
# Report on disk usage
|
|
||||||
usage:
|
|
||||||
extends: .setup
|
|
||||||
stage: prep
|
|
||||||
when: manual
|
|
||||||
script:
|
|
||||||
- du -h -s $DL_DIR $SSTATE_DIR $KAS_REPO_REF_DIR $TOOLCHAIN_DIR
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
cc: |
|
|
||||||
GCCVERSION = "arm-10.2"
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#! /usr/bin/env python3
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import pathlib
|
|
||||||
import re
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument("config", type=argparse.FileType())
|
|
||||||
parser.add_argument("metaarm", type=pathlib.Path, help="Path to meta-arm")
|
|
||||||
parser.add_argument("others", type=pathlib.Path, help="Path to parent of dependencies")
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
config = yaml.safe_load(args.config)
|
|
||||||
layers = config["layers"]
|
|
||||||
dependencies = config["dependencies"]
|
|
||||||
|
|
||||||
found_layers = [p for p in args.metaarm.glob("meta-*") if p.is_dir()]
|
|
||||||
print(f"Testing {len(layers)} layers: {', '.join(layers)}.")
|
|
||||||
print(f"Found {len(found_layers)} layers in meta-arm.")
|
|
||||||
print()
|
|
||||||
|
|
||||||
cli = ["yocto-check-layer-wrapper",]
|
|
||||||
cli.extend([args.metaarm / layer for layer in layers])
|
|
||||||
cli.append("--dependency")
|
|
||||||
cli.extend([args.others / layer for layer in dependencies])
|
|
||||||
|
|
||||||
passed = 0
|
|
||||||
process = subprocess.Popen(cli, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
|
|
||||||
while True:
|
|
||||||
line = process.stdout.readline()
|
|
||||||
if process.poll() is not None:
|
|
||||||
break
|
|
||||||
print(line.strip())
|
|
||||||
if re.search(r"meta-.+ PASS", line):
|
|
||||||
passed += 1
|
|
||||||
|
|
||||||
print(f"Coverage: {int(passed / len(found_layers) * 100)}%")
|
|
||||||
sys.exit(process.returncode)
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
layers:
|
|
||||||
- meta-arm
|
|
||||||
- meta-arm-bsp
|
|
||||||
- meta-arm-toolchain
|
|
||||||
- meta-gem5
|
|
||||||
dependencies:
|
|
||||||
- meta-openembedded/meta-oe
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
|
|
||||||
machine: corstone500
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
cc: |
|
|
||||||
PNBLACKLIST[gcc-cross-arm] = "Using external toolchain"
|
|
||||||
TCMODE = "external-arm"
|
|
||||||
EXTERNAL_TOOLCHAIN = "${TOPDIR}/toolchains/${TARGET_ARCH}"
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
|
|
||||||
machine: fvp-baser-aemv8r64
|
|
||||||
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
|
|
||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
- meta-python.yml
|
|
||||||
|
|
||||||
repos:
|
|
||||||
meta-arm:
|
|
||||||
layers:
|
|
||||||
meta-gem5:
|
|
||||||
meta-openembedded:
|
|
||||||
url: https://git.openembedded.org/meta-openembedded
|
|
||||||
layers:
|
|
||||||
meta-oe:
|
|
||||||
meta-filesystems:
|
|
||||||
meta-networking:
|
|
||||||
meta-virtualization:
|
|
||||||
url: git://git.yoctoproject.org/meta-virtualization
|
|
||||||
|
|
||||||
machine: gem5-arm64
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
meta-virt:
|
|
||||||
DISTRO_FEATURES_append = " virtualization xen"
|
|
||||||
|
|
||||||
target:
|
|
||||||
- xen-image-minimal
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- gem5-arm64.yml
|
|
||||||
|
|
||||||
repos:
|
|
||||||
meta-arm:
|
|
||||||
layers:
|
|
||||||
meta-atp:
|
|
||||||
|
|
||||||
machine: gem5-atp-arm64
|
|
||||||
|
|
||||||
target:
|
|
||||||
- atp-native
|
|
||||||
- core-image-minimal
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -u
|
|
||||||
|
|
||||||
HOST_ARCH=$(uname -m)
|
|
||||||
VER="10.2-2020.11"
|
|
||||||
|
|
||||||
DOWNLOAD_DIR=$1
|
|
||||||
TOOLCHAIN_DIR=$2
|
|
||||||
TOOLCHAIN_LINK_DIR=$3
|
|
||||||
|
|
||||||
# These should be already created by .gitlab-ci.yml, but do here if run outside of that env
|
|
||||||
mkdir -p $DOWNLOAD_DIR $TOOLCHAIN_DIR $TOOLCHAIN_LINK_DIR
|
|
||||||
|
|
||||||
if [ $HOST_ARCH = "aarch64" ]; then
|
|
||||||
#AArch64 Linux hosted cross compilers
|
|
||||||
|
|
||||||
#AArch32 target with hard float (arm-none-linux-gnueabihf)
|
|
||||||
wget -P $DOWNLOAD_DIR -nc https://developer.arm.com/-/media/Files/downloads/gnu-a/$VER/binrel/gcc-arm-$VER-$HOST_ARCH-arm-none-linux-gnueabihf.tar.xz
|
|
||||||
elif [ $HOST_ARCH = "x86_64" ]; then
|
|
||||||
#x86_64 Linux hosted cross compilers
|
|
||||||
|
|
||||||
#AArch32 target with hard float (arm-linux-none-gnueabihf)
|
|
||||||
wget -P $DOWNLOAD_DIR -nc https://developer.arm.com/-/media/Files/downloads/gnu-a/$VER/binrel/gcc-arm-$VER-$HOST_ARCH-arm-none-linux-gnueabihf.tar.xz
|
|
||||||
|
|
||||||
#AArch64 GNU/Linux target (aarch64-none-linux-gnu)
|
|
||||||
wget -P $DOWNLOAD_DIR -nc https://developer.arm.com/-/media/Files/downloads/gnu-a/$VER/binrel/gcc-arm-$VER-$HOST_ARCH-aarch64-none-linux-gnu.tar.xz
|
|
||||||
|
|
||||||
#AArch64 GNU/Linux target (aarch64_be-none-linux-gnu)
|
|
||||||
wget -P $DOWNLOAD_DIR -nc https://developer.arm.com/-/media/Files/downloads/gnu-a/$VER/binrel/gcc-arm-$VER-$HOST_ARCH-aarch64_be-none-linux-gnu.tar.xz
|
|
||||||
else
|
|
||||||
echo "ERROR - Unknown build arch of $HOST_ARCH"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
for i in arm aarch64 aarch64_be; do
|
|
||||||
if [ ! -d $TOOLCHAIN_DIR/gcc-arm-$VER-$HOST_ARCH-$i-none-linux-gnu*/ ]; then
|
|
||||||
if [ ! -f $DOWNLOAD_DIR/gcc-arm-$VER-$HOST_ARCH-$i-none-linux-gnu*.tar.xz ]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
tar -C $TOOLCHAIN_DIR -axvf $DOWNLOAD_DIR/gcc-arm-$VER-$HOST_ARCH-$i-none-linux-gnu*.tar.xz
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Setup a link for the toolchain to use local to the building machine (e.g., not in a shared location)
|
|
||||||
ln -s $TOOLCHAIN_DIR/gcc-arm-$VER-$HOST_ARCH-$i-none-linux-gnu* $TOOLCHAIN_LINK_DIR/$i
|
|
||||||
done
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
- meta-zephyr.yml
|
|
||||||
|
|
||||||
machine: microbit-v1
|
|
||||||
|
|
||||||
target:
|
|
||||||
- zephyr-philosophers
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
- meta-zephyr.yml
|
|
||||||
|
|
||||||
machine: qemu-cortex-a53
|
|
||||||
|
|
||||||
target:
|
|
||||||
- zephyr-philosophers
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
|
|
||||||
machine: qemuarm64-secureboot
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
bugs: |
|
|
||||||
# Only ping until errors can be resolved
|
|
||||||
TEST_SUITES = "ping"
|
|
||||||
|
|
||||||
target:
|
|
||||||
- core-image-base
|
|
||||||
- perf
|
|
||||||
- optee-examples
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
includes:
|
|
||||||
- base.yml
|
|
||||||
|
|
||||||
machine: qemuarmv5
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
bugs: |
|
|
||||||
# Remove parselogs until errors can be resolved
|
|
||||||
TEST_SUITES_remove = "parselogs"
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
testimage: |
|
|
||||||
IMAGE_CLASSES += "testimage"
|
|
||||||
TESTIMAGE_AUTO = "1"
|
|
||||||
slirp: |
|
|
||||||
TEST_RUNQEMUPARAMS = "slirp"
|
|
||||||
TEST_SERVER_IP = "127.0.0.1"
|
|
||||||
QEMU_USE_SLIRP = "1"
|
|
||||||
packages: |
|
|
||||||
IMAGE_FEATURES_append = " ssh-server-dropbear"
|
|
||||||
|
|
||||||
# Multiple targets are available, put it down to just one
|
|
||||||
target:
|
|
||||||
- core-image-base
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#! /usr/bin/env python3
|
|
||||||
|
|
||||||
# Update clones of the repositories we need in KAS_REPO_REF_DIR to speed up fetches
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import pathlib
|
|
||||||
|
|
||||||
def repo_shortname(url):
|
|
||||||
# Taken from Kas (Repo.__getattr__) to ensure the logic is right
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
url = urlparse(url)
|
|
||||||
return ('{url.netloc}{url.path}'
|
|
||||||
.format(url=url)
|
|
||||||
.replace('@', '.')
|
|
||||||
.replace(':', '.')
|
|
||||||
.replace('/', '.')
|
|
||||||
.replace('*', '.'))
|
|
||||||
|
|
||||||
repositories = (
|
|
||||||
"https://git.yoctoproject.org/git/poky",
|
|
||||||
"https://git.openembedded.org/meta-openembedded",
|
|
||||||
"https://git.yoctoproject.org/git/meta-virtualization",
|
|
||||||
"https://git.yoctoproject.org/git/meta-zephyr",
|
|
||||||
"https://github.com/kraj/meta-clang",
|
|
||||||
)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if "KAS_REPO_REF_DIR" not in os.environ:
|
|
||||||
print("KAS_REPO_REF_DIR needs to be set")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
base_repodir = pathlib.Path(os.environ["KAS_REPO_REF_DIR"])
|
|
||||||
|
|
||||||
for repo in repositories:
|
|
||||||
repodir = base_repodir / repo_shortname(repo)
|
|
||||||
if repodir.exists():
|
|
||||||
print("Updating %s..." % repo)
|
|
||||||
subprocess.run(["git", "-C", repodir, "fetch"], check=True)
|
|
||||||
else:
|
|
||||||
print("Cloning %s..." % repo)
|
|
||||||
subprocess.run(["git", "clone", "--bare", repo, repodir], check=True)
|
|
||||||
@@ -3,4 +3,4 @@ header:
|
|||||||
includes:
|
includes:
|
||||||
- base.yml
|
- base.yml
|
||||||
|
|
||||||
machine: qemuarm
|
machine: a5ds
|
||||||
@@ -5,7 +5,7 @@ distro: poky
|
|||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
repos:
|
repos:
|
||||||
refspec: hardknott
|
refspec: gatesgarth
|
||||||
|
|
||||||
repos:
|
repos:
|
||||||
meta-arm:
|
meta-arm:
|
||||||
@@ -22,7 +22,6 @@ repos:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
BB_LOGCONFIG: ""
|
BB_LOGCONFIG: ""
|
||||||
TOOLCHAIN_DIR: ""
|
|
||||||
|
|
||||||
local_conf_header:
|
local_conf_header:
|
||||||
base: |
|
base: |
|
||||||
@@ -30,12 +29,12 @@ local_conf_header:
|
|||||||
PACKAGE_CLASSES = "package_ipk"
|
PACKAGE_CLASSES = "package_ipk"
|
||||||
LICENSE_FLAGS_WHITELIST += "armcompiler"
|
LICENSE_FLAGS_WHITELIST += "armcompiler"
|
||||||
PACKAGECONFIG_remove_pn-qemu-system-native = "gtk+ sdl"
|
PACKAGECONFIG_remove_pn-qemu-system-native = "gtk+ sdl"
|
||||||
EXTRA_IMAGE_FEATURES_append = " debug-tweaks"
|
|
||||||
BB_NUMBER_THREADS = "16"
|
BB_NUMBER_THREADS = "16"
|
||||||
PARALLEL_MAKE = "-j16"
|
PARALLEL_MAKE = "-j16"
|
||||||
INHERIT += "rm_work"
|
INHERIT += "rm_work"
|
||||||
PACKAGECONFIG_append_pn-perf = " coresight"
|
PACKAGECONFIG_append_pn-perf = " coresight"
|
||||||
noptest: |
|
ERROR_QA = "${WARN_QA}"
|
||||||
|
ptest: |
|
||||||
DISTRO_FEATURES_remove = "ptest"
|
DISTRO_FEATURES_remove = "ptest"
|
||||||
|
|
||||||
machine: unset
|
machine: unset
|
||||||
File renamed without changes.
@@ -14,7 +14,7 @@ machines = metaarm.glob("meta-*/conf/machine/*.conf")
|
|||||||
machines = set(p.stem for p in machines)
|
machines = set(p.stem for p in machines)
|
||||||
|
|
||||||
# All kas files
|
# All kas files
|
||||||
kas = metaarm.glob("ci/*.yml")
|
kas = metaarm.glob("kas/*.yml")
|
||||||
kas = set(p.stem for p in kas)
|
kas = set(p.stem for p in kas)
|
||||||
|
|
||||||
missing = machines - kas
|
missing = machines - kas
|
||||||
@@ -7,8 +7,7 @@ set -e -u
|
|||||||
|
|
||||||
LOGFILE=$1
|
LOGFILE=$1
|
||||||
|
|
||||||
LINES=$(grep --invert-match "attempting MIRRORS if available" $LOGFILE | wc -l)
|
if test -s $LOGFILE; then
|
||||||
if test "$LINES" -ne 0; then
|
|
||||||
echo ==============================
|
echo ==============================
|
||||||
echo The build had warnings/errors:
|
echo The build had warnings/errors:
|
||||||
echo ==============================
|
echo ==============================
|
||||||
@@ -4,6 +4,7 @@ header:
|
|||||||
repos:
|
repos:
|
||||||
meta-clang:
|
meta-clang:
|
||||||
url: https://github.com/kraj/meta-clang
|
url: https://github.com/kraj/meta-clang
|
||||||
|
refspec: gatesgarth
|
||||||
|
|
||||||
local_conf_header:
|
local_conf_header:
|
||||||
clang: |
|
clang: |
|
||||||
File renamed without changes.
File renamed without changes.
@@ -3,4 +3,4 @@ header:
|
|||||||
includes:
|
includes:
|
||||||
- base.yml
|
- base.yml
|
||||||
|
|
||||||
machine: generic-arm64
|
machine: foundation-armv8
|
||||||
File renamed without changes.
File renamed without changes.
@@ -1,32 +0,0 @@
|
|||||||
header:
|
|
||||||
version: 9
|
|
||||||
|
|
||||||
distro: poky
|
|
||||||
machine: fvp-baser-aemv8r64
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
repos:
|
|
||||||
refspec: hardknott
|
|
||||||
|
|
||||||
repos:
|
|
||||||
meta-arm:
|
|
||||||
layers:
|
|
||||||
meta-arm:
|
|
||||||
meta-arm-bsp:
|
|
||||||
meta-arm-toolchain:
|
|
||||||
|
|
||||||
poky:
|
|
||||||
url: https://git.yoctoproject.org/git/poky
|
|
||||||
layers:
|
|
||||||
meta:
|
|
||||||
meta-poky:
|
|
||||||
|
|
||||||
local_conf_header:
|
|
||||||
base: |
|
|
||||||
CONF_VERSION = "1"
|
|
||||||
PACKAGE_CLASSES = "package_ipk"
|
|
||||||
PACKAGECONFIG_remove_pn-qemu-system-native = "gtk+ sdl"
|
|
||||||
EXTRA_IMAGE_FEATURES_append = " debug-tweaks"
|
|
||||||
|
|
||||||
target:
|
|
||||||
- core-image-minimal
|
|
||||||
File renamed without changes.
@@ -8,8 +8,8 @@ set -e -u
|
|||||||
# Read Job namne from $1 and split on /
|
# Read Job namne from $1 and split on /
|
||||||
IFS=/ read -r -a PARTS<<<$1
|
IFS=/ read -r -a PARTS<<<$1
|
||||||
|
|
||||||
# Prefix each part with ci/
|
# Prefix each part with kas/
|
||||||
PARTS=("${PARTS[@]/#/ci/}")
|
PARTS=("${PARTS[@]/#/kas/}")
|
||||||
|
|
||||||
# Suffix each part with .yml
|
# Suffix each part with .yml
|
||||||
PARTS=("${PARTS[@]/%/.yml}")
|
PARTS=("${PARTS[@]/%/.yml}")
|
||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -3,9 +3,9 @@ header:
|
|||||||
includes:
|
includes:
|
||||||
- base.yml
|
- base.yml
|
||||||
|
|
||||||
machine: qemuarm64-sbsa
|
machine: qemuarm64-secureboot
|
||||||
|
|
||||||
target:
|
target:
|
||||||
- core-image-base
|
- core-image-base
|
||||||
- perf
|
- perf
|
||||||
- sbsa-acs
|
- optee-examples
|
||||||
File renamed without changes.
File renamed without changes.
+17
-18
@@ -4,8 +4,8 @@ meta-arm-autonomy Yocto Layer
|
|||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
This layer provides an hypervisor based solution (currently based on Xen) for
|
This layer provides an hypervisor based solution (currently based on Xen) for
|
||||||
autonomous system. It contains recipes and classes to build host and guest
|
autonomous system. It contains recipes and classes to build host and guests
|
||||||
images.
|
systems.
|
||||||
|
|
||||||
To start using this layer, please check the
|
To start using this layer, please check the
|
||||||
[Quick Start Guide](documentation/arm-autonomy-quickstart.md).
|
[Quick Start Guide](documentation/arm-autonomy-quickstart.md).
|
||||||
@@ -16,14 +16,13 @@ This layer depends on several other Yocto layers:
|
|||||||
* meta-openembedded (https://git.openembedded.org/meta-openembedded)
|
* meta-openembedded (https://git.openembedded.org/meta-openembedded)
|
||||||
* poky (https://git.yoctoproject.org/poky)
|
* poky (https://git.yoctoproject.org/poky)
|
||||||
* meta-virtualization (https://git.yoctoproject.org/meta-virtualization)
|
* meta-virtualization (https://git.yoctoproject.org/meta-virtualization)
|
||||||
* meta-networking (git://git.openembedded.org/meta-openembedded)
|
|
||||||
|
|
||||||
Distribution Features
|
Distribution Features
|
||||||
---------------------
|
---------------------
|
||||||
This layer adds the following Yocto DISTRO_FEATURES:
|
This layer is adding the following Yocto DISTRO_FEATURES:
|
||||||
|
|
||||||
* arm-autonomy-host: this feature activates functionalities required to build
|
* arm-autonomy-host: this feature activates functionalities required to build
|
||||||
an autonomy host system. It has the following effects:
|
an autonomy host system. It is doing the following:
|
||||||
- add 'xen' and 'ipv4' to DISTRO_FEATURES.
|
- add 'xen' and 'ipv4' to DISTRO_FEATURES.
|
||||||
- add xen backend drivers to linux kernel configuration.
|
- add xen backend drivers to linux kernel configuration.
|
||||||
- To reduce the root filesystem image size the kernel image is not installed.
|
- To reduce the root filesystem image size the kernel image is not installed.
|
||||||
@@ -44,40 +43,40 @@ its documentation.
|
|||||||
Those documentation files should be checked for variables:
|
Those documentation files should be checked for variables:
|
||||||
- [xen-devicetree](documentation/xen-devicetree.md)
|
- [xen-devicetree](documentation/xen-devicetree.md)
|
||||||
- [xenguest-manager](documentation/xenguest-manager.md)
|
- [xenguest-manager](documentation/xenguest-manager.md)
|
||||||
- [xenguest-network](documentation/xenguest-network.md)
|
- [xenguest-network-bridge](documentation/xenguest-network-bridge.md)
|
||||||
|
|
||||||
BSPs
|
BSPs
|
||||||
----
|
----
|
||||||
This layer adds the following machine:
|
This layer is adding the following machines:
|
||||||
|
|
||||||
* arm64-autonomy-guest: This machine creates a minimal BSP suitable to be used
|
* arm64-autonomy-guest: this machines creates a minimal BSP suitable to be used
|
||||||
as an autonomy guest. It is in fact only activating ARM64 architecture and
|
as an autonomy guest. It is in fact only activating ARM64 architecture and
|
||||||
SMP in the linux kernel and is enabling the DISTRO_FEATURE
|
SMP in the linux kernel and is enabling the DISTRO_FEATURE
|
||||||
'arm-autonomy-guest'.
|
arm-autonomy-guest.
|
||||||
|
|
||||||
Images
|
Images
|
||||||
------
|
------
|
||||||
This layer is adding the following images:
|
This layer is adding the following images:
|
||||||
|
|
||||||
* arm-autonomy-host-image-minimal: This image includes all elements required
|
* arm-autonomy-host-image-minimal: this image includes all elements required
|
||||||
to create a minimal arm-autonomy-host system. This includes xen, and tools to
|
to create a minimal arm-autonomy-host system. This includes xen and tools to
|
||||||
manage xen guests and xenguest images. This image depends on
|
manage xen guests. This image depends on 'arm-autonomy-host' distribution
|
||||||
'arm-autonomy-host' distribution feature.
|
feature.
|
||||||
|
|
||||||
Recipes and classes
|
Recipes and classes
|
||||||
-------------------
|
-------------------
|
||||||
This layer adds the following recipes and classes:
|
This layer is adding the following recipes and classes:
|
||||||
|
|
||||||
* [xen-devicetree](documentation/xen-devicetree.md): This is a recipe to modify
|
* [xen-devicetree](documentation/xen-devicetree.md): this is a recipe to modify
|
||||||
a device tree blob to add information required to boot xen and a Dom0 linux.
|
a device tree blob to add information required to boot xen and a Dom0 linux.
|
||||||
|
|
||||||
* [xenguest-mkimage](documentation/xenguest-mkimage.md): This is a tool used to
|
* [xenguest-mkimage](documentation/xenguest-mkimage.md): this is a tool to
|
||||||
create and modify images to be used as Xen guests.
|
create and modify images to be used as Xen guests.
|
||||||
|
|
||||||
* [xenguest-manager](documentation/xenguest-manager.md): This is a tool used to
|
* [xenguest-manager](documentation/xenguest-manager.md): this is a tool to
|
||||||
create/remove/start/stop xen guest generated using xenguest-mkimage.
|
create/remove/start/stop xen guest generated using xenguest-mkimage.
|
||||||
|
|
||||||
* [xenguest-network](documentation/xenguest-network.md): This
|
* [xenguest-network-bridge](documentation/xenguest-network-bridge.md): this
|
||||||
recipe add tools and init scripts to create a bridge connected to the
|
recipe add tools and init scripts to create a bridge connected to the
|
||||||
external network on the host and allow guests to be connected to it.
|
external network on the host and allow guests to be connected to it.
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
# This class is to be inherited by image recipes that want to build and install
|
|
||||||
# an alternate kernel (set via PREFERRED_PROVIDER_alternate/kernel).
|
|
||||||
#
|
|
||||||
# It is mandatory to also set the KERNEL_PACKAGE_NAME for the alternate kernel
|
|
||||||
# recipe via KERNEL_PACKAGE_NAME_pn-${PREFERRED_PROVIDER_alternate/kernel} and
|
|
||||||
# its value needs to be different from "kernel" since this is the default set
|
|
||||||
# for PREFERRED_PROVIDER_virtual/kernel.
|
|
||||||
#
|
|
||||||
# An example of these settings can be found at meta-arm-autonomy/dynamic-layers/meta-arm-bsp/conf/machine/n1sdp-extra-settings.inc
|
|
||||||
#
|
|
||||||
# When building and installing an alternate kernel, the kernel-modules packages
|
|
||||||
# for both virtual/kernel and alternate/kernel will be installed.
|
|
||||||
|
|
||||||
PREFERRED_PROVIDER_alternate/kernel ??= ""
|
|
||||||
|
|
||||||
python () {
|
|
||||||
alternate_kernel = d.getVar('PREFERRED_PROVIDER_alternate/kernel')
|
|
||||||
if alternate_kernel:
|
|
||||||
alternate_kernel_pkg_name = d.getVar('KERNEL_PACKAGE_NAME_pn-%s' % alternate_kernel)
|
|
||||||
if alternate_kernel_pkg_name:
|
|
||||||
d.appendVar('EXTRA_IMAGEDEPENDS', ' ' + alternate_kernel)
|
|
||||||
d.appendVar('IMAGE_INSTALL', ' kernel-modules')
|
|
||||||
d.appendVar('IMAGE_INSTALL', ' ' + alternate_kernel_pkg_name + '-modules')
|
|
||||||
else:
|
|
||||||
raise bb.parse.SkipRecipe("No KERNEL_PACKAGE_NAME_pn-%s set" % alternate_kernel )
|
|
||||||
}
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
# Docker Extern Containers
|
|
||||||
#
|
|
||||||
# This class allows docker image tarballs to be installed in the rootfs
|
|
||||||
#
|
|
||||||
# The images can be selected using the variable CONTAINER_IMAGE_FILES which
|
|
||||||
# should contain a space seperated list of absolute paths or yocto urls for
|
|
||||||
# docker images that have been exported using docker export:
|
|
||||||
# - https://docs.docker.com/engine/reference/commandline/export/
|
|
||||||
#
|
|
||||||
# src_uri_parse_var.bbclass is used to parse CONTAINER_IMAGE_FILES
|
|
||||||
#
|
|
||||||
# There are 4 supported formats for CONTAINER_IMAGE_FILES entries:
|
|
||||||
#
|
|
||||||
# - http/https url
|
|
||||||
# - CONTAINER_IMAGE_FILES = "https://[url]:[port]/alpine.tar;md5sum=..."
|
|
||||||
#
|
|
||||||
# - file:// absolute local path from root
|
|
||||||
# - CONTAINER_IMAGE_FILES = "file:///containers/alpine2.tar"
|
|
||||||
#
|
|
||||||
# - file:// path relative to FILESEXTRAPATHS
|
|
||||||
# - CONTAINER_IMAGE_FILES = "file://foo/alpine3.tar"
|
|
||||||
# FILESEXTRAPATHS .= "/containers:"
|
|
||||||
#
|
|
||||||
# - plain absolute local path from root
|
|
||||||
# - CONTAINER_IMAGE_FILES = "/containers/foo/bar/alpine4.tar"
|
|
||||||
#
|
|
||||||
# It is not recommended to use other yocto URL types, as they may result in
|
|
||||||
# undefined behaviour.
|
|
||||||
#
|
|
||||||
# A semicolon seperated list of install arguments can follow each image path:
|
|
||||||
# - conname : the name that will be attached when the image is imported
|
|
||||||
# (default: [filename, without extension])
|
|
||||||
# - contag : the tag that will be attached when the image is imported
|
|
||||||
# (default: local)
|
|
||||||
# - conkeep : Flag for whether the exported container image file should be
|
|
||||||
# kept once the import has been completed
|
|
||||||
# (default: 0)
|
|
||||||
#
|
|
||||||
# Any other arguments, for example an md5sum, will be assumed to be fetch
|
|
||||||
# arguments, and will be kept when the path is added to the SRC_URI
|
|
||||||
#
|
|
||||||
# e.g. CONTAINER_IMAGE_FILES = "\
|
|
||||||
# https://[url]:[port]/alpine.tar;md5sum=[checksum];conkeep=1 \
|
|
||||||
# file:///containers/alpine2.tar;contag=latest;conname=docker2 \
|
|
||||||
# file://foo/alpine3.tar \
|
|
||||||
# /containers/foo/bar/alpine4.tar;contag=1.0;conkeep=1 "
|
|
||||||
#
|
|
||||||
# Resulting Manifest:
|
|
||||||
# ARCHIVE NAME TAG KEEP
|
|
||||||
# alpine.tar alpine local 1
|
|
||||||
# alpine2.tar docker2 latest 0
|
|
||||||
# alpine3.tar alpine3 local 0
|
|
||||||
# alpine4.tar alpine4 1.0 1
|
|
||||||
#
|
|
||||||
# Other configurable variables:
|
|
||||||
# CONTAINERS_INSTALL_DIR : The folder underneath ${WORKDIR} where the docker
|
|
||||||
# images will be stored
|
|
||||||
# (default: "/usr/share/docker/images")
|
|
||||||
# CONTAINERS_MANIFEST : The name of the manifest file containing image
|
|
||||||
# parameters, also stored in CONTAINERS_INSTALL_DIR
|
|
||||||
# (default: "containers.manifest")
|
|
||||||
# CONTAINERS_TAG_DEFAULT : Use this to change the value that will be used as
|
|
||||||
# contag if no value is provided
|
|
||||||
# (default: "local")
|
|
||||||
# CONTAINERS_KEEP_DEFAULT : Use this to change the value that will be used for
|
|
||||||
# conkeep if no value is provided
|
|
||||||
# (default: "0")
|
|
||||||
#
|
|
||||||
|
|
||||||
inherit features_check
|
|
||||||
|
|
||||||
REQUIRED_DISTRO_FEATURES = "docker"
|
|
||||||
|
|
||||||
RDEPENDS_${PN} = "packagegroup-docker-runtime-minimal"
|
|
||||||
|
|
||||||
CONTAINER_IMAGE_FILES ??= ""
|
|
||||||
CONTAINERS_INSTALL_DIR ??= "${datadir}/docker/images"
|
|
||||||
CONTAINERS_MANIFEST ??= "containers.manifest"
|
|
||||||
CONTAINERS_TAG_DEFAULT ??= "local"
|
|
||||||
CONTAINERS_KEEP_DEFAULT ??= "0"
|
|
||||||
|
|
||||||
inherit set_src_uri_from_var
|
|
||||||
|
|
||||||
SRC_URI_FROM_VAR_NAME = "CONTAINER_IMAGE_FILES"
|
|
||||||
# Define installation params
|
|
||||||
SRC_URI_FROM_VAR_MANIFEST_PARAMS = "conname=[basename] \
|
|
||||||
contag=${CONTAINERS_TAG_DEFAULT} conkeep=${CONTAINERS_KEEP_DEFAULT}"
|
|
||||||
|
|
||||||
SRC_URI_FROM_VAR_UNPACK_DIR = "containers"
|
|
||||||
|
|
||||||
# Read manifest and install container images
|
|
||||||
do_install() {
|
|
||||||
local archive name tag keep
|
|
||||||
|
|
||||||
if [ -f "${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/manifest" ]; then
|
|
||||||
|
|
||||||
install -d "${D}${CONTAINERS_INSTALL_DIR}"
|
|
||||||
install -m 644 \
|
|
||||||
"${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/manifest" \
|
|
||||||
"${D}${CONTAINERS_INSTALL_DIR}/${CONTAINERS_MANIFEST}"
|
|
||||||
|
|
||||||
while read -r archive name tag keep _; do
|
|
||||||
[ -f "${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/${archive}" ] ||
|
|
||||||
bbfatal "${archive} does not exist"
|
|
||||||
|
|
||||||
install -m 644 \
|
|
||||||
"${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/${archive}" \
|
|
||||||
"${D}${CONTAINERS_INSTALL_DIR}/${archive}"
|
|
||||||
done < "${D}${CONTAINERS_INSTALL_DIR}/${CONTAINERS_MANIFEST}"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
do_install[vardeps] += "CONTAINER_IMAGE_FILES"
|
|
||||||
|
|
||||||
FILES_${PN} += "${CONTAINERS_INSTALL_DIR}"
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Create a xenguest image with kernel and filesystem produced by Yocto
|
# Create a xenguest image with kernel and filesystem produced by Yocto
|
||||||
# This will create a .xenguest file that the xenguest-manager can use.
|
# This will create a .xenguest file that the xenguest-manager can use.
|
||||||
|
|
||||||
inherit xenguest_image
|
inherit xenguest-image
|
||||||
|
|
||||||
# We are creating our guest in a local subdirectory
|
# We are creating our guest in a local subdirectory
|
||||||
# force the value so that we are not impacted if the user is changing it
|
# force the value so that we are not impacted if the user is changing it
|
||||||
@@ -63,67 +63,6 @@ IMAGE_TYPEDEP_xenguest ?= "tar"
|
|||||||
IMAGE_TYPES_MASKED += "xenguest"
|
IMAGE_TYPES_MASKED += "xenguest"
|
||||||
IMAGE_TYPES += "xenguest"
|
IMAGE_TYPES += "xenguest"
|
||||||
|
|
||||||
XENGUEST_IMAGE_RECIPE = "${PN}"
|
|
||||||
XENGUEST_IMAGE_VARS += "XENGUEST_IMAGE_RECIPE"
|
|
||||||
|
|
||||||
# Merge intermediate env files from all recipes into a single file
|
|
||||||
python do_merge_xenguestenv () {
|
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
# Open final merged file in DEPLOY_DIR_IMAGE for writing, or create
|
|
||||||
outdir = d.getVar('DEPLOY_DIR_IMAGE')
|
|
||||||
with open(os.path.join(outdir,'xenguest.env'), 'w') as merged_file:
|
|
||||||
|
|
||||||
# Adds vars from xenguest_image to list
|
|
||||||
merged_env = []
|
|
||||||
xenguest_vars = d.getVar('XENGUEST_IMAGE_VARS')
|
|
||||||
for var in xenguest_vars.split():
|
|
||||||
value = d.getVar(var)
|
|
||||||
if value:
|
|
||||||
merged_env.append(var + "=" + " ".join(value.split()) + "\n")
|
|
||||||
|
|
||||||
# Resolve dependencies for this task to find names of intermediate
|
|
||||||
# .xenguestenv files
|
|
||||||
taskdepdata = d.getVar('BB_TASKDEPDATA')
|
|
||||||
task_mc = d.getVar('BB_CURRENT_MC')
|
|
||||||
task_file = d.getVar('FILE')
|
|
||||||
|
|
||||||
# See runqueue.py function build_taskdepdata
|
|
||||||
DEPS_INDEX = 3
|
|
||||||
|
|
||||||
depdata_key = task_file + ":do_merge_xenguestenv"
|
|
||||||
|
|
||||||
# If in a multiconfig, need to add that to the key
|
|
||||||
if task_mc != "default":
|
|
||||||
depdata_key = "mc:" + task_mc + ":" + depdata_key
|
|
||||||
|
|
||||||
# Retrieve filename using regex
|
|
||||||
get_filename = re.compile(r'/([^/]+\.bb):do_deploy_xenguestenv$')
|
|
||||||
env_dir = d.getVar('XENGUEST_ENV_STAGING_DIR')
|
|
||||||
|
|
||||||
for task_dep in taskdepdata[depdata_key][DEPS_INDEX]:
|
|
||||||
if task_dep.endswith(":do_deploy_xenguestenv"):
|
|
||||||
filename = re.search(get_filename, task_dep).group(1) + ".xenguestenv"
|
|
||||||
bb.note("Merging: " + filename)
|
|
||||||
try:
|
|
||||||
with open(env_dir + "/" + filename, 'r') as f:
|
|
||||||
# Eliminate duplicates
|
|
||||||
merged_env = list(set(merged_env + f.readlines()))
|
|
||||||
except (FileNotFoundError, IOError):
|
|
||||||
bb.note(" " + filename + " has no extra vars")
|
|
||||||
|
|
||||||
# Sort Alphabetically and write
|
|
||||||
merged_env.sort()
|
|
||||||
merged_file.write("".join(merged_env))
|
|
||||||
}
|
|
||||||
do_merge_xenguestenv[dirs] = "${DEPLOY_DIR_IMAGE}"
|
|
||||||
do_merge_xenguestenv[vardeps] += "${XENGUEST_IMAGE_VARS}"
|
|
||||||
do_merge_xenguestenv[vardepsexclude] += "BB_TASKDEPDATA"
|
|
||||||
do_merge_xenguestenv[recrdeptask] += "do_deploy_xenguestenv"
|
|
||||||
|
|
||||||
addtask merge_xenguestenv before do_populate_lic_deploy after do_image_complete
|
|
||||||
|
|
||||||
python __anonymous() {
|
python __anonymous() {
|
||||||
# Do not do anything if we are not in the want FSTYPES
|
# Do not do anything if we are not in the want FSTYPES
|
||||||
if bb.utils.contains_any('IMAGE_FSTYPES', 'xenguest', '1', '0', d):
|
if bb.utils.contains_any('IMAGE_FSTYPES', 'xenguest', '1', '0', d):
|
||||||
|
|||||||
@@ -3,10 +3,7 @@
|
|||||||
# This is done using kernel-fitimage as model
|
# This is done using kernel-fitimage as model
|
||||||
# To activate this, kernel-xenguest must be added to KERNEL_CLASSES
|
# To activate this, kernel-xenguest must be added to KERNEL_CLASSES
|
||||||
|
|
||||||
# Add a variable name to XENGUEST_IMAGE_VARS_EXTRA if you want it to
|
inherit xenguest-image
|
||||||
# appear in xenguest.env when the image is deployed
|
|
||||||
|
|
||||||
inherit xenguest_image
|
|
||||||
|
|
||||||
# use a local copy to pack all together
|
# use a local copy to pack all together
|
||||||
XENGUEST_IMAGE_DEPLOY_DIR = "${WORKDIR}/tmp-xenguest"
|
XENGUEST_IMAGE_DEPLOY_DIR = "${WORKDIR}/tmp-xenguest"
|
||||||
@@ -27,7 +24,7 @@ do_assemble_xenguest_initramfs() {
|
|||||||
rm -f ${B}/${KERNEL_OUTPUT_DIR}/Image-initramfs.xenguest
|
rm -f ${B}/${KERNEL_OUTPUT_DIR}/Image-initramfs.xenguest
|
||||||
call_xenguest_mkimage pack ${B}/${KERNEL_OUTPUT_DIR}/Image-initramfs.xenguest
|
call_xenguest_mkimage pack ${B}/${KERNEL_OUTPUT_DIR}/Image-initramfs.xenguest
|
||||||
}
|
}
|
||||||
do_assemble_xenguest_initramfs[depends] += "${INITRAMFS_IMAGE}:do_merge_xenguestenv"
|
do_assemble_xenguest_initramfs[depends] += "${INITRAMFS_IMAGE}:do_image_complete"
|
||||||
|
|
||||||
kernel_do_deploy_append() {
|
kernel_do_deploy_append() {
|
||||||
if [ -f "${B}/${KERNEL_OUTPUT_DIR}/Image-initramfs.xenguest" ]; then
|
if [ -f "${B}/${KERNEL_OUTPUT_DIR}/Image-initramfs.xenguest" ]; then
|
||||||
|
|||||||
@@ -1,224 +0,0 @@
|
|||||||
# Set SRC_URI from Variable
|
|
||||||
|
|
||||||
# This class parses a variable named in SRC_URI_FROM_VAR_NAME for entries that
|
|
||||||
# should be added to the SRC_URI
|
|
||||||
#
|
|
||||||
# There are 4 supported formats for entries:
|
|
||||||
#
|
|
||||||
# - http/https url
|
|
||||||
# - Note that a checksum (md5sum or sha256sum) must be provided for http(s)
|
|
||||||
#
|
|
||||||
# - file:// absolute local path from root
|
|
||||||
# - In this case the filename will be added to SRC_URI and the path from '/'
|
|
||||||
# added to FILESEXTRAPATHS
|
|
||||||
#
|
|
||||||
# - file:// path relative to FILESEXTRAPATHS
|
|
||||||
# - In this case the filename will be added to SRC_URI and the preceding path
|
|
||||||
# added to FILESOVERRIDES, so that the full path to the file will
|
|
||||||
# be available in FILESPATH when it is generated by combining
|
|
||||||
# FILESEXTRAPATHS and FILESOVERRIDES.
|
|
||||||
#
|
|
||||||
# - plain absolute local path from root
|
|
||||||
# - This will be treated the same as an file:// path from root. Plain paths
|
|
||||||
# must be absolute, and cannot be relative to FILESEXTRAPATHS
|
|
||||||
#
|
|
||||||
# It is not recommended to use other yocto URL types, as they may result in
|
|
||||||
# undefined behaviour.
|
|
||||||
#
|
|
||||||
# These entries will be added to the SRC_URI so that the yocto fetcher can
|
|
||||||
# unpack a copy into ${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# A list of arguments can follow each entry in the input variable, seperated
|
|
||||||
# by semi-colons (;). Arguments may be FETCH arguments or MANIFEST arguments.
|
|
||||||
#
|
|
||||||
# FETCH arguments will be appended to the entry in SRC_URI, for example
|
|
||||||
# "downloadfilename" to specify the filename used when storing a
|
|
||||||
# downloaded file.
|
|
||||||
# Each SRC_URI entry will automatically have the arguments
|
|
||||||
# "unpack=0;subdir=${SRC_URI_FROM_VAR_UNPACK_DIR}" added to them, so do not
|
|
||||||
# attempt to set these options.
|
|
||||||
#
|
|
||||||
# MANIFEST arguments are defined in the variable
|
|
||||||
# SRC_URI_FROM_VAR_MANIFEST_PARAMS which should be a space seperated list of
|
|
||||||
# names, each optionally followed by an equals sign (=) and a default value.
|
|
||||||
#
|
|
||||||
# The values provided for the manifest arguments will be written to the manifest
|
|
||||||
# file in ${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR} as columns, in the same
|
|
||||||
# order as they appear in SRC_URI_FROM_VAR_MANIFEST_PARAMS.
|
|
||||||
#
|
|
||||||
# For entries that do not provide a value for a manifest argument, the default
|
|
||||||
# value will be used if possible.
|
|
||||||
# If no default is availale, omitting the parameter on any item will cause
|
|
||||||
# an error.
|
|
||||||
#
|
|
||||||
# "[basename]" is a special case default that will set the value to
|
|
||||||
# the filename without the path or file extension.
|
|
||||||
#
|
|
||||||
# e.g.
|
|
||||||
# SRC_URI_FROM_VAR_MANIFEST_PARAMS="conname=[basename] contag=local conkeep"
|
|
||||||
#
|
|
||||||
# Any arguments that follow an entry in SRC_URI_FROM_VAR_NAME, that are not
|
|
||||||
# named in SRC_URI_FROM_VAR_MANIFEST_PARAMS are assumed to be FETCH arguments,
|
|
||||||
# so are added to the corresponding entry in the SRC_URI.
|
|
||||||
|
|
||||||
SRC_URI_FROM_VAR_NAME ??= ""
|
|
||||||
SRC_URI_FROM_VAR_MANIFEST_PARAMS ??= ""
|
|
||||||
SRC_URI_FROM_VAR_UNPACK_DIR ??= "items"
|
|
||||||
|
|
||||||
python __anonymous() {
|
|
||||||
|
|
||||||
parse_var = d.getVar('SRC_URI_FROM_VAR_NAME')
|
|
||||||
|
|
||||||
if not parse_var:
|
|
||||||
return
|
|
||||||
|
|
||||||
parse_var_items = d.getVar(parse_var)
|
|
||||||
|
|
||||||
if parse_var_items:
|
|
||||||
for item in parse_var_items.split(' '):
|
|
||||||
if not item:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if item.startswith('/'):
|
|
||||||
# If not a Yocto URL, must be an absolute path
|
|
||||||
yocto_url = "file://" + item
|
|
||||||
else:
|
|
||||||
# Otherwise assume valid Yocto URL.
|
|
||||||
# Error case is caught later
|
|
||||||
yocto_url = item
|
|
||||||
|
|
||||||
fetcher = host = path = parm = None
|
|
||||||
try:
|
|
||||||
# Attempt to parse a Yocto URL
|
|
||||||
fetcher,host,path,_,_,parm = bb.fetch.decodeurl(yocto_url)
|
|
||||||
except:
|
|
||||||
# Something invalid is in the variable!
|
|
||||||
raise bb.parse.SkipRecipe(parse_var + \
|
|
||||||
" contains an invalid entry:\n'" + \
|
|
||||||
item + "'")
|
|
||||||
|
|
||||||
# This var is space seperated list of parameter names,
|
|
||||||
# with optional default value following an equals sign
|
|
||||||
# (name=default)
|
|
||||||
item_params_str = d.getVar('SRC_URI_FROM_VAR_MANIFEST_PARAMS')
|
|
||||||
|
|
||||||
# remove directories from path
|
|
||||||
filename = os.path.basename(path)
|
|
||||||
|
|
||||||
if "downloadfilename" in parm:
|
|
||||||
filename = parm["downloadfilename"]
|
|
||||||
|
|
||||||
item_manifest_args = {"filename": filename}
|
|
||||||
|
|
||||||
if item_params_str:
|
|
||||||
# required manifest arguments have been provided
|
|
||||||
|
|
||||||
# If no default is given add "=" for map parsing
|
|
||||||
item_params_list = [ arg + "=" if '=' not in arg
|
|
||||||
else arg
|
|
||||||
for arg in item_params_str.split(' ')
|
|
||||||
]
|
|
||||||
|
|
||||||
# Generate key value pairs of argument names and
|
|
||||||
# default values
|
|
||||||
item_params_map = dict( (name.strip(), val.strip())
|
|
||||||
for name, val in (arg.split('=')
|
|
||||||
for arg in item_params_list)
|
|
||||||
)
|
|
||||||
|
|
||||||
for argname in item_params_map:
|
|
||||||
# Iterate over required manifest arguments
|
|
||||||
|
|
||||||
argvalue = parm.pop(argname, None)
|
|
||||||
if argvalue:
|
|
||||||
# a value has been provided for this item
|
|
||||||
item_manifest_args[argname] = argvalue
|
|
||||||
|
|
||||||
else:
|
|
||||||
# No value provided, process default value
|
|
||||||
default = item_params_map[argname]
|
|
||||||
if default:
|
|
||||||
# A default value is provided
|
|
||||||
if default == "[basename]":
|
|
||||||
# use the filename without extension
|
|
||||||
default = os.path.splitext(filename)[0]
|
|
||||||
|
|
||||||
# store default value in dict
|
|
||||||
item_manifest_args[argname] = default
|
|
||||||
|
|
||||||
else:
|
|
||||||
# No default provided
|
|
||||||
raise bb.fatal(parse_var + \
|
|
||||||
" entry is missing a required parameter '" + \
|
|
||||||
argname + "':\n'" + item + "'")
|
|
||||||
|
|
||||||
# Write value to var flags to ensure data structure is preserved
|
|
||||||
# Each entry of parse_var will have a varflag where the value
|
|
||||||
# is a dictionary of argument names and values
|
|
||||||
d.setVarFlags(parse_var, {item: item_manifest_args})
|
|
||||||
|
|
||||||
src_uri_entry_suffix = ';'
|
|
||||||
|
|
||||||
# HTTP(S) fetcher must provide a checksum
|
|
||||||
if fetcher.startswith('http') and not \
|
|
||||||
( 'md5sum' in parm or 'sha256sum' in parm ):
|
|
||||||
# Ensure http/https fetchers get a checksum
|
|
||||||
raise bb.parse.SkipRecipe(parse_var + \
|
|
||||||
" entry is missing a checksum:\n'" + \
|
|
||||||
item + "'")
|
|
||||||
|
|
||||||
# add remaining fetch parameters including checksum
|
|
||||||
for arg in parm:
|
|
||||||
src_uri_entry_suffix += ";" + arg + "=" + parm[arg]
|
|
||||||
|
|
||||||
# Add default and extra parameters to SRC_URI entry
|
|
||||||
src_uri_entry_suffix += ';unpack=0;subdir=' + \
|
|
||||||
d.getVar('SRC_URI_FROM_VAR_UNPACK_DIR')
|
|
||||||
|
|
||||||
if fetcher == 'file':
|
|
||||||
# Prevent local fetcher from re-creating dir structure
|
|
||||||
filedir = os.path.split(path)[0]
|
|
||||||
if filedir.startswith('/'):
|
|
||||||
# Path is from the root
|
|
||||||
d.appendVar('FILESEXTRAPATHS', filedir + ':')
|
|
||||||
else:
|
|
||||||
# Path is relative to FILESEXTRAPATHS
|
|
||||||
d.appendVar('FILESOVERRIDES', ':' + filedir)
|
|
||||||
|
|
||||||
# Add filename without path to SRC_URI
|
|
||||||
d.appendVar('SRC_URI', ' file://' + \
|
|
||||||
filename + src_uri_entry_suffix)
|
|
||||||
else:
|
|
||||||
# Add full entry to SRC_URI
|
|
||||||
d.appendVar('SRC_URI', ' ' + fetcher + \
|
|
||||||
"://" + host + path + src_uri_entry_suffix)
|
|
||||||
}
|
|
||||||
|
|
||||||
python generate_manifest() {
|
|
||||||
|
|
||||||
parse_var = d.getVar('SRC_URI_FROM_VAR_NAME')
|
|
||||||
|
|
||||||
if not parse_var:
|
|
||||||
return
|
|
||||||
|
|
||||||
target_dir = os.path.join(d.getVar('WORKDIR'),
|
|
||||||
d.getVar('SRC_URI_FROM_VAR_UNPACK_DIR'))
|
|
||||||
|
|
||||||
# Write a manifest file containing the parameters so SRC_URI
|
|
||||||
# doesn't need to be parsed by do_install
|
|
||||||
with open (target_dir + "/manifest", 'w') as manifest_file:
|
|
||||||
manifest_args = d.getVarFlags(parse_var)
|
|
||||||
|
|
||||||
parse_var_items = d.getVar(parse_var)
|
|
||||||
|
|
||||||
if parse_var_items:
|
|
||||||
for item in parse_var_items.split():
|
|
||||||
|
|
||||||
manifest_file.write(" ".join(manifest_args[item].values())+"\n")
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
do_unpack[cleandirs] += "${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}"
|
|
||||||
do_unpack[postfuncs] += "generate_manifest"
|
|
||||||
do_unpack[vardeps] += "${SRC_URI_FROM_VAR_NAME}"
|
|
||||||
+11
-20
@@ -4,11 +4,8 @@
|
|||||||
# The class is extending deploy function so you recipe must inherit deploy and
|
# The class is extending deploy function so you recipe must inherit deploy and
|
||||||
# have a do_deploy function (even if it is empty)
|
# have a do_deploy function (even if it is empty)
|
||||||
|
|
||||||
# Add a variable name to XENGUEST_IMAGE_VARS_EXTRA if you want it to
|
# Use standard xenguest-image
|
||||||
# appear in xenguest.env when the image is deployed
|
inherit xenguest-image
|
||||||
|
|
||||||
# Use standard xenguest_image
|
|
||||||
inherit xenguest_image
|
|
||||||
|
|
||||||
# Add a DTB file for the guest
|
# Add a DTB file for the guest
|
||||||
# Only one file should be added, if this is set multiple times or in several
|
# Only one file should be added, if this is set multiple times or in several
|
||||||
@@ -42,12 +39,6 @@ XENGUEST_EXTRA_FILES ??= ""
|
|||||||
# dir1/file1 file in the disk content parameters).
|
# dir1/file1 file in the disk content parameters).
|
||||||
XENGUEST_EXTRA_DISK_FILES ??= ""
|
XENGUEST_EXTRA_DISK_FILES ??= ""
|
||||||
|
|
||||||
# Extra vars to be written to xenguest.env
|
|
||||||
XENGUEST_IMAGE_VARS_EXTRA += "\
|
|
||||||
XENGUEST_EXTRA_DTB XENGUEST_EXTRA_RAMDISK XENGUEST_EXTRA_XENCONFIG \
|
|
||||||
XENGUEST_EXTRA_INIT_PRE XENGUEST_EXTRA_INIT XENGUEST_EXTRA_INIT_POST \
|
|
||||||
XENGUEST_EXTRA_FILES XENGUEST_EXTRA_DISK_FILES"
|
|
||||||
|
|
||||||
do_deploy_append() {
|
do_deploy_append() {
|
||||||
if [ -z "${XENGUEST_IMAGE_DEPLOY_DIR}" -o \
|
if [ -z "${XENGUEST_IMAGE_DEPLOY_DIR}" -o \
|
||||||
-z "${XENGUEST_IMAGE_DEPLOY_SUBDIR}" ]; then
|
-z "${XENGUEST_IMAGE_DEPLOY_SUBDIR}" ]; then
|
||||||
@@ -58,14 +49,14 @@ do_deploy_append() {
|
|||||||
|
|
||||||
if [ -n "${XENGUEST_EXTRA_DTB}" ]; then
|
if [ -n "${XENGUEST_EXTRA_DTB}" ]; then
|
||||||
if [ ! -f ${XENGUEST_EXTRA_DTB} ]; then
|
if [ ! -f ${XENGUEST_EXTRA_DTB} ]; then
|
||||||
die "xenguest_image: DTB file ${XENGUEST_EXTRA_DTB} does not exist"
|
die "xenguest-image: DTB file ${XENGUEST_EXTRA_DTB} does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --xen-device-tree=${XENGUEST_EXTRA_DTB}
|
call_xenguest_mkimage partial --xen-device-tree=${XENGUEST_EXTRA_DTB}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${XENGUEST_EXTRA_RAMDISK}" ]; then
|
if [ -n "${XENGUEST_EXTRA_RAMDISK}" ]; then
|
||||||
if [ ! -f ${XENGUEST_EXTRA_RAMDISK} ]; then
|
if [ ! -f ${XENGUEST_EXTRA_RAMDISK} ]; then
|
||||||
die "xenguest_image: DTB file ${XENGUEST_EXTRA_RAMDISK} does not exist"
|
die "xenguest-image: DTB file ${XENGUEST_EXTRA_RAMDISK} does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --xen-ramdisk=${XENGUEST_EXTRA_RAMDISK}
|
call_xenguest_mkimage partial --xen-ramdisk=${XENGUEST_EXTRA_RAMDISK}
|
||||||
fi
|
fi
|
||||||
@@ -73,7 +64,7 @@ do_deploy_append() {
|
|||||||
if [ -n "${XENGUEST_EXTRA_XENCONFIG}" ]; then
|
if [ -n "${XENGUEST_EXTRA_XENCONFIG}" ]; then
|
||||||
for f in ${XENGUEST_EXTRA_XENCONFIG}; do
|
for f in ${XENGUEST_EXTRA_XENCONFIG}; do
|
||||||
if [ ! -f $f ]; then
|
if [ ! -f $f ]; then
|
||||||
die "xenguest_image: Xen config $f does not exist"
|
die "xenguest-image: Xen config $f does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --xen-append=$f
|
call_xenguest_mkimage partial --xen-append=$f
|
||||||
done
|
done
|
||||||
@@ -81,21 +72,21 @@ do_deploy_append() {
|
|||||||
|
|
||||||
if [ -n "${XENGUEST_EXTRA_INIT_PRE}" ]; then
|
if [ -n "${XENGUEST_EXTRA_INIT_PRE}" ]; then
|
||||||
if [ ! -f ${XENGUEST_EXTRA_INIT_PRE} ]; then
|
if [ ! -f ${XENGUEST_EXTRA_INIT_PRE} ]; then
|
||||||
die "xenguest_image: Init script ${XENGUEST_EXTRA_INIT_PRE} does not exist"
|
die "xenguest-image: Init script ${XENGUEST_EXTRA_INIT_PRE} does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --init-pre=${XENGUEST_EXTRA_INIT_PRE}
|
call_xenguest_mkimage partial --init-pre=${XENGUEST_EXTRA_INIT_PRE}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${XENGUEST_EXTRA_INIT}" ]; then
|
if [ -n "${XENGUEST_EXTRA_INIT}" ]; then
|
||||||
if [ ! -f ${XENGUEST_EXTRA_INIT} ]; then
|
if [ ! -f ${XENGUEST_EXTRA_INIT} ]; then
|
||||||
die "xenguest_image: Init script ${XENGUEST_EXTRA_INIT} does not exist"
|
die "xenguest-image: Init script ${XENGUEST_EXTRA_INIT} does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --init-script=${XENGUEST_EXTRA_INIT}
|
call_xenguest_mkimage partial --init-script=${XENGUEST_EXTRA_INIT}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${XENGUEST_EXTRA_INIT_POST}" ]; then
|
if [ -n "${XENGUEST_EXTRA_INIT_POST}" ]; then
|
||||||
if [ ! -f ${XENGUEST_EXTRA_INIT_POST} ]; then
|
if [ ! -f ${XENGUEST_EXTRA_INIT_POST} ]; then
|
||||||
die "xenguest_image: Init script ${XENGUEST_EXTRA_INIT_POST} does not exist"
|
die "xenguest-image: Init script ${XENGUEST_EXTRA_INIT_POST} does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --init-post=${XENGUEST_EXTRA_INIT_POST}
|
call_xenguest_mkimage partial --init-post=${XENGUEST_EXTRA_INIT_POST}
|
||||||
fi
|
fi
|
||||||
@@ -103,7 +94,7 @@ do_deploy_append() {
|
|||||||
if [ -n "${XENGUEST_EXTRA_FILES}" ]; then
|
if [ -n "${XENGUEST_EXTRA_FILES}" ]; then
|
||||||
for f in ${XENGUEST_EXTRA_FILES}; do
|
for f in ${XENGUEST_EXTRA_FILES}; do
|
||||||
if [ ! -f $f ]; then
|
if [ ! -f $f ]; then
|
||||||
die "xenguest_image: Xen file $f does not exist"
|
die "xenguest-image: Xen file $f does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --xen-add-file=$f
|
call_xenguest_mkimage partial --xen-add-file=$f
|
||||||
done
|
done
|
||||||
@@ -112,12 +103,12 @@ do_deploy_append() {
|
|||||||
if [ -n "${XENGUEST_EXTRA_DISK_FILES}" ]; then
|
if [ -n "${XENGUEST_EXTRA_DISK_FILES}" ]; then
|
||||||
for f in ${XENGUEST_EXTRA_DISK_FILES}; do
|
for f in ${XENGUEST_EXTRA_DISK_FILES}; do
|
||||||
if [ ! -f $f ]; then
|
if [ ! -f $f ]; then
|
||||||
die "xenguest_image: Disk file $f does not exist"
|
die "xenguest-image: Disk file $f does not exist"
|
||||||
fi
|
fi
|
||||||
call_xenguest_mkimage partial --disk-add-file=$f
|
call_xenguest_mkimage partial --disk-add-file=$f
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
# Need to have xenguest_image tool
|
# Need to have xenguest-image tool
|
||||||
do_deploy[depends] += "xenguest-base-image:do_deploy"
|
do_deploy[depends] += "xenguest-base-image:do_deploy"
|
||||||
|
|
||||||
+21
-73
@@ -30,7 +30,7 @@ XENGUEST_IMAGE_ROOT ??= "/dev/xvda1"
|
|||||||
# Guest kernel command line arguments
|
# Guest kernel command line arguments
|
||||||
XENGUEST_IMAGE_CMDLINE ??= "earlyprintk=xenboot console=hvc0 rw"
|
XENGUEST_IMAGE_CMDLINE ??= "earlyprintk=xenboot console=hvc0 rw"
|
||||||
|
|
||||||
# Extra commands to add to xenguest_image when creating the image
|
# Extra commands to add to xenguest-image when creating the image
|
||||||
XENGUEST_IMAGE_EXTRA_CMD ??= ""
|
XENGUEST_IMAGE_EXTRA_CMD ??= ""
|
||||||
|
|
||||||
# Kernel binary
|
# Kernel binary
|
||||||
@@ -43,17 +43,14 @@ XENGUEST_IMAGE_KERNEL ??= "Image"
|
|||||||
# be included in the xenguest image)
|
# be included in the xenguest image)
|
||||||
XENGUEST_IMAGE_DISK_SIZE ??= "${@ '4' if not d.getVar('INITRAMFS_IMAGE') else '0'}"
|
XENGUEST_IMAGE_DISK_SIZE ??= "${@ '4' if not d.getVar('INITRAMFS_IMAGE') else '0'}"
|
||||||
|
|
||||||
# set empty partition to be used by xenguest-manager for this image
|
|
||||||
XENGUEST_IMAGE_DISK_DEVICE ??= ""
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# XENGUEST_IMAGE_DISK_PARTITIONS is used to describe the partitions to setup
|
# XENGUEST_IMAGE_DISK PARTITIONS is used to describe the partitions to setup
|
||||||
# and their content.
|
# and their content.
|
||||||
# It must be set to a space separated list of entries with each entry having
|
# It must be set to a space separated list of entries with each entry having
|
||||||
# the format num:sz:[fs]:[file] where:
|
# the format num:sz:fs:[file] where:
|
||||||
# - num is a partition number
|
# - num is a partition number
|
||||||
# - sz is the partition size in MB or GB(default), e.g 1000M or 1[G]
|
# - sz is the partition size in Gigabit
|
||||||
# - fs is optional filesystem to use for the partition
|
# - fs is the filesystem to use for the partition
|
||||||
# - file is optionally pointing to a file to use as content of the partition
|
# - file is optionally pointing to a file to use as content of the partition
|
||||||
# Please check image_types_xenguest.bbclass for rootfs handling of files
|
# Please check image_types_xenguest.bbclass for rootfs handling of files
|
||||||
#
|
#
|
||||||
@@ -83,18 +80,6 @@ XENGUEST_IMAGE_DEPLOY_SUBDIR ?= "xenguest"
|
|||||||
# - something in ${WORKDIR} if you need to clone and manipulate an image
|
# - something in ${WORKDIR} if you need to clone and manipulate an image
|
||||||
XENGUEST_IMAGE_DEPLOY_DIR ??= "${DEPLOYDIR}"
|
XENGUEST_IMAGE_DEPLOY_DIR ??= "${DEPLOYDIR}"
|
||||||
|
|
||||||
# These vars are used by image_types_xenguest.bbclass to generate the
|
|
||||||
# xenguest.env file. In a recipe that inherits this class and extra variables
|
|
||||||
# that should be included in xenguest.env need to be added to
|
|
||||||
# XENGUEST_IMAGE_VARS_EXTRA
|
|
||||||
XENGUEST_IMAGE_VARS ?= "\
|
|
||||||
MACHINE DISTRO DISTRO_VERSION DISTRO_FEATURES TUNE_FEATURES TARGET_FPU \
|
|
||||||
IMAGE_FEATURES INITRAMFS_IMAGE_BUNDLE INITRAMFS_IMAGE \
|
|
||||||
XENGUEST_IMAGE_MEMORY_SIZE XENGUEST_IMAGE_NUM_VCPUS XENGUEST_IMAGE_AUTOBOOT \
|
|
||||||
XENGUEST_IMAGE_ROOT XENGUEST_IMAGE_CMDLINE XENGUEST_IMAGE_EXTRA_CMD \
|
|
||||||
XENGUEST_IMAGE_KERNEL XENGUEST_IMAGE_DISK_SIZE XENGUEST_IMAGE_DISK_DEVICE \
|
|
||||||
XENGUEST_IMAGE_DISK_PARTITIONS XENGUEST_IMAGE_NETWORK_TYPE"
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Wrapper to call xenguest-mkimage
|
# Wrapper to call xenguest-mkimage
|
||||||
# It is using XENGUEST_IMAGE_DEPLOY_DIR and XENGUEST_IMAGE_DEPLOY_SUBDIR
|
# It is using XENGUEST_IMAGE_DEPLOY_DIR and XENGUEST_IMAGE_DEPLOY_SUBDIR
|
||||||
@@ -144,27 +129,21 @@ xenguest_image_create() {
|
|||||||
|
|
||||||
# create disk if needed
|
# create disk if needed
|
||||||
disksize="${XENGUEST_IMAGE_DISK_SIZE}"
|
disksize="${XENGUEST_IMAGE_DISK_SIZE}"
|
||||||
case ${disksize:=0} in
|
if [ -z "$disksize" ]; then
|
||||||
0|0M|0G)
|
disksize="0"
|
||||||
;;
|
fi
|
||||||
*)
|
if [ $disksize -gt 0 ]; then
|
||||||
# setup disk size
|
# setup disk size
|
||||||
call_xenguest_mkimage update --disk-reset-config --disk-size=$disksize
|
call_xenguest_mkimage update --disk-reset-config --disk-size=$disksize
|
||||||
|
|
||||||
diskparts="${XENGUEST_IMAGE_DISK_PARTITIONS}"
|
|
||||||
if [ -n "$diskparts" ]; then
|
|
||||||
for arg in $diskparts; do
|
|
||||||
call_xenguest_mkimage update --disk-add-part=$arg
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
diskdevice="${XENGUEST_IMAGE_DISK_DEVICE}"
|
|
||||||
if [ -n "$diskdevice" ]; then
|
|
||||||
call_xenguest_mkimage update --disk-device="${diskdevice}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
diskparts="${XENGUEST_IMAGE_DISK_PARTITIONS}"
|
||||||
|
if [ -n "$diskparts" ]; then
|
||||||
|
for arg in $diskparts; do
|
||||||
|
call_xenguest_mkimage update --disk-add-part=$arg
|
||||||
|
partnum="$(expr $partnum + 1)"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "${XENGUEST_IMAGE_AUTOBOOT}" = "1" ]; then
|
if [ "${XENGUEST_IMAGE_AUTOBOOT}" = "1" ]; then
|
||||||
call_xenguest_mkimage update --set-param=GUEST_AUTOBOOT=1
|
call_xenguest_mkimage update --set-param=GUEST_AUTOBOOT=1
|
||||||
@@ -179,38 +158,7 @@ xenguest_image_create() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
XENGUEST_ENV_STAGING_DIR ??= "${STAGING_DIR}/${MACHINE}/xenguestenv"
|
#
|
||||||
|
|
||||||
# Create an intermediary file containing all variables used to by a
|
|
||||||
# particular recipe that inherits this class
|
|
||||||
|
|
||||||
# File will contain the values of all variables listed in:
|
|
||||||
# XENGUEST_IMAGE_VARS_EXTRA
|
|
||||||
python do_deploy_xenguestenv () {
|
|
||||||
xenguest_vars = d.getVar('XENGUEST_IMAGE_VARS_EXTRA')
|
|
||||||
if not xenguest_vars:
|
|
||||||
return
|
|
||||||
|
|
||||||
outdir = d.getVar('XENGUEST_ENV_STAGING_DIR')
|
|
||||||
|
|
||||||
# Writes file to tmp/sysroots/${MACHINE}/xenguestenv/ by default
|
|
||||||
filename = os.path.basename(d.getVar('FILE')) + '.xenguestenv'
|
|
||||||
with open(os.path.join(outdir, filename), 'w') as envf:
|
|
||||||
for var in xenguest_vars.split():
|
|
||||||
value = d.getVar(var)
|
|
||||||
if value:
|
|
||||||
# Write value only if set
|
|
||||||
envf.write('%s="%s"\n' % (var, " ".join(value.split())))
|
|
||||||
envf.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
# Since the intermediary file is deleted by do_merge_xenguestenv it
|
|
||||||
# must be re-created every time
|
|
||||||
do_deploy_xenguestenv[vardeps] += "${XENGUEST_IMAGE_VARS_EXTRA}"
|
|
||||||
do_deploy_xenguestenv[dirs] = "${XENGUEST_ENV_STAGING_DIR}"
|
|
||||||
|
|
||||||
addtask deploy_xenguestenv before do_populate_sysroot
|
|
||||||
|
|
||||||
# Clone the current xenguest from deploy to manipulate it locally
|
# Clone the current xenguest from deploy to manipulate it locally
|
||||||
# This is required if you need to change things before packing an image
|
# This is required if you need to change things before packing an image
|
||||||
# To set the local directory where to clone you must set
|
# To set the local directory where to clone you must set
|
||||||
@@ -224,7 +172,7 @@ xenguest_image_clone() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f ${DEPLOY_DIR_IMAGE}/${XENGUEST_IMAGE_DEPLOY_SUBDIR}/guest.cfg ]; then
|
if [ ! -f ${DEPLOY_DIR_IMAGE}/${XENGUEST_IMAGE_DEPLOY_SUBDIR}/guest.cfg ]; then
|
||||||
die "xenguest_image: ${DEPLOY_DIR_IMAGE}/${XENGUEST_IMAGE_DEPLOY_SUBDIR} does not contain a valid guest"
|
die "xenguest-image: ${DEPLOY_DIR_IMAGE}/${XENGUEST_IMAGE_DEPLOY_SUBDIR} does not contain a valid guest"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rm -rf ${XENGUEST_IMAGE_DEPLOY_DIR}/${XENGUEST_IMAGE_DEPLOY_SUBDIR}
|
rm -rf ${XENGUEST_IMAGE_DEPLOY_DIR}/${XENGUEST_IMAGE_DEPLOY_SUBDIR}
|
||||||
@@ -4,11 +4,6 @@
|
|||||||
DISTRO_FEATURES_append = " xen ipv4"
|
DISTRO_FEATURES_append = " xen ipv4"
|
||||||
DISTRO_FEATURES_NATIVE_append = " arm-autonomy-host"
|
DISTRO_FEATURES_NATIVE_append = " arm-autonomy-host"
|
||||||
|
|
||||||
# Since meta-virtualization master branch bumped to 4.15+stable we need to
|
|
||||||
# force the 4.14+stable selection until we validate the new version
|
|
||||||
PREFERRED_VERSION_xen = "4.14+stable%"
|
|
||||||
PREFERRED_VERSION_xen-tools = "4.14+stable%"
|
|
||||||
|
|
||||||
# Don't include kernels in standard images when building arm-autonomy-host
|
# Don't include kernels in standard images when building arm-autonomy-host
|
||||||
# If the kernel image is needed in the rootfs the following should be set from
|
# If the kernel image is needed in the rootfs the following should be set from
|
||||||
# a bbappend: RDEPENDS_${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-image"
|
# a bbappend: RDEPENDS_${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-image"
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ BBFILES += " \
|
|||||||
|
|
||||||
BBFILE_COLLECTIONS += "meta-arm-autonomy"
|
BBFILE_COLLECTIONS += "meta-arm-autonomy"
|
||||||
BBFILE_PATTERN_meta-arm-autonomy = "^${LAYERDIR}/"
|
BBFILE_PATTERN_meta-arm-autonomy = "^${LAYERDIR}/"
|
||||||
BBFILE_PRIORITY_meta-arm-autonomy = "5"
|
BBFILE_PRIORITY_meta-arm-autonomy = "6"
|
||||||
LAYERDEPENDS_meta-arm-autonomy = " \
|
LAYERDEPENDS_meta-arm-autonomy = " \
|
||||||
core \
|
core \
|
||||||
yocto \
|
yocto \
|
||||||
@@ -17,7 +17,7 @@ LAYERDEPENDS_meta-arm-autonomy = " \
|
|||||||
networking-layer \
|
networking-layer \
|
||||||
virtualization-layer \
|
virtualization-layer \
|
||||||
"
|
"
|
||||||
LAYERSERIES_COMPAT_meta-arm-autonomy = "hardknott"
|
LAYERSERIES_COMPAT_meta-arm-autonomy = "gatesgarth"
|
||||||
|
|
||||||
# We don't activate virtualization feature from meta-virtualization as it
|
# We don't activate virtualization feature from meta-virtualization as it
|
||||||
# brings in lots of stuff we don't need. We need to disable the sanity check
|
# brings in lots of stuff we don't need. We need to disable the sanity check
|
||||||
@@ -33,7 +33,7 @@ USER_CLASSES_append = " arm-autonomy-features"
|
|||||||
|
|
||||||
BBFILES_DYNAMIC += " \
|
BBFILES_DYNAMIC += " \
|
||||||
meta-arm-bsp:${LAYERDIR}/dynamic-layers/meta-arm-bsp/*/*/*.bbappend \
|
meta-arm-bsp:${LAYERDIR}/dynamic-layers/meta-arm-bsp/*/*/*.bbappend \
|
||||||
meta-arm-bsp:${LAYERDIR}/dynamic-layers/meta-arm-bsp/*/*/*.bb \
|
meta-gem5:${LAYERDIR}/dynamic-layers/meta-gem5/*/*/*.bbappend \
|
||||||
"
|
"
|
||||||
# Root directory for the meta-arm-autonomy/dynamic-layers/meta-arm-bsp
|
# Root directory for the meta-arm-autonomy/dynamic-layers/meta-arm-bsp
|
||||||
ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR = "${ARM_AUTONOMY_LAYERDIR}/dynamic-layers/meta-arm-bsp"
|
ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR = "${ARM_AUTONOMY_LAYERDIR}/dynamic-layers/meta-arm-bsp"
|
||||||
@@ -11,7 +11,7 @@ KERNEL_IMAGETYPE = "Image"
|
|||||||
IMAGE_FSTYPES += "tar.bz2"
|
IMAGE_FSTYPES += "tar.bz2"
|
||||||
|
|
||||||
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
|
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
|
||||||
PREFERRED_VERSION_linux-yocto ?= "5.10%"
|
PREFERRED_VERSION_linux-yocto ?= "5.4%"
|
||||||
|
|
||||||
DISTRO_FEATURES += "arm-autonomy-guest"
|
DISTRO_FEATURES += "arm-autonomy-guest"
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# This file will be required by different xenguest recipes to provide
|
|
||||||
# common variables, which can be configured in local.conf
|
|
||||||
|
|
||||||
# Xenguest image file install location
|
|
||||||
XENGUEST_MANAGER_GUEST_DIR ?= "${datadir}/guests/"
|
|
||||||
@@ -32,16 +32,16 @@ Ensure it has all the required layers in bblayers.conf as listed in
|
|||||||
Add multiconfig
|
Add multiconfig
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
The steps required to make the project build both the host and any
|
Here are the steps required to make the project build both the host and any
|
||||||
number of guests as required are:
|
number of guests as required.
|
||||||
|
|
||||||
1. Create a new directory under `conf/` named `multiconfig/`
|
1. Create a new directory under `conf/` named `multiconfig/`
|
||||||
|
|
||||||
2. Create two new files in this directory:
|
2. Create two new files in this directory:
|
||||||
`multiconfig/host.conf`
|
`multiconfig/host.conf`
|
||||||
`multiconfig/guest.conf`
|
`multiconfig/guest.conf`
|
||||||
These files will contain any configurations that are specific to either the
|
These files will contain any configurations that a specific to either the
|
||||||
host or the guest. The resulting directory tree should be:
|
host or the guest
|
||||||
|
|
||||||
```
|
```
|
||||||
-- conf
|
-- conf
|
||||||
@@ -73,12 +73,12 @@ MC_GUEST_INITRAMFS_IMAGE ?= ""
|
|||||||
#MC_GUEST_INITRAMFS_IMAGE_BUNDLE = "1"
|
#MC_GUEST_INITRAMFS_IMAGE_BUNDLE = "1"
|
||||||
#MC_GUEST_INITRAMFS_IMAGE = "${MC_GUEST_IMAGERECIPE}"
|
#MC_GUEST_INITRAMFS_IMAGE = "${MC_GUEST_IMAGERECIPE}"
|
||||||
|
|
||||||
# These variables are set automatically, don't override them!
|
# These variables are set automatically, don't edit them!
|
||||||
MC_GUEST_FILENAME_PREFIX = "${@ 'Image-initramfs' if d.getVar('MC_GUEST_INITRAMFS_IMAGE_BUNDLE',d) else '${MC_GUEST_IMAGERECIPE}' }"
|
MC_GUEST_FILENAME_PREFIX = "${@ 'Image-initramfs' if d.getVar('MC_GUEST_INITRAMFS_IMAGE_BUNDLE',d) else '${MC_GUEST_IMAGERECIPE}' }"
|
||||||
|
|
||||||
MC_GUEST_FILENAME = "${MC_GUEST_FILENAME_PREFIX}-${MC_GUEST_MACHINE}.xenguest"
|
MC_GUEST_FILENAME = "${MC_GUEST_FILENAME_PREFIX}-${MC_GUEST_MACHINE}.xenguest"
|
||||||
|
|
||||||
MC_GUEST_DEP = "${@ 'virtual/kernel:do_deploy' if d.getVar('MC_GUEST_INITRAMFS_IMAGE_BUNDLE',d) else '${MC_GUEST_IMAGERECIPE}:do_merge_xenguestenv'}"
|
MC_GUEST_DEP = "${@ 'virtual/kernel:do_deploy' if d.getVar('MC_GUEST_INITRAMFS_IMAGE_BUNDLE',d) else '${MC_GUEST_IMAGERECIPE}:do_image_complete'}"
|
||||||
|
|
||||||
MC_DOIMAGE_MCDEPENDS += "mc:${MC_HOST}:${MC_GUEST}:${MC_GUEST_DEP} "
|
MC_DOIMAGE_MCDEPENDS += "mc:${MC_HOST}:${MC_GUEST}:${MC_GUEST_DEP} "
|
||||||
|
|
||||||
@@ -114,10 +114,9 @@ IMAGE_FSTYPES += "${@ 'cpio' if d.getVar('MC_GUEST_INITRAMFS_IMAGE_BUNDLE',d) el
|
|||||||
# ANY OTHER GUEST CONFIG
|
# ANY OTHER GUEST CONFIG
|
||||||
```
|
```
|
||||||
|
|
||||||
To modify the MACHINE or INITRAMFS variables change the equivalent
|
This contents shouldn't be changed directly, rather change the equivalent
|
||||||
config in local.conf rather than modifying this file directly. You can also
|
config in local.conf. You can append any other config desired for the
|
||||||
append any other config desired for the guest after "ANY OTHER GUEST CONFIG",
|
guest at this point, for example `XENGUEST_IMAGE_DISK_SIZE`
|
||||||
for example `XENGUEST_IMAGE_DISK_SIZE`.
|
|
||||||
|
|
||||||
Make sure not to change `${DEPLOY_DIR_IMAGE}` to anything other than
|
Make sure not to change `${DEPLOY_DIR_IMAGE}` to anything other than
|
||||||
`${TMPDIR}/deploy/images`, as this is assumed by local.conf.
|
`${TMPDIR}/deploy/images`, as this is assumed by local.conf.
|
||||||
@@ -128,8 +127,6 @@ Make sure not to change `${DEPLOY_DIR_IMAGE}` to anything other than
|
|||||||
TMPDIR = "${TOPDIR}/${MC_HOST}"
|
TMPDIR = "${TOPDIR}/${MC_HOST}"
|
||||||
|
|
||||||
DISTRO_FEATURES += " arm-autonomy-host"
|
DISTRO_FEATURES += " arm-autonomy-host"
|
||||||
|
|
||||||
# ANY OTHER HOST CONFIG
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Building the image
|
Building the image
|
||||||
@@ -140,56 +137,29 @@ To build the multiconfig image the command is:
|
|||||||
bitbake mc:host:arm-autonomy-host-image-minimal
|
bitbake mc:host:arm-autonomy-host-image-minimal
|
||||||
```
|
```
|
||||||
|
|
||||||
The first time this is run you may see a warning related to the SRC_URI:
|
You should see that this triggers guest tasks to be built in
|
||||||
```
|
parallel. Once the build completes the guest will already be in the
|
||||||
Unable to get checksum for xenguest-extern-guests SRC_URI entry foo.xenguest: file could not be found
|
rootfs of the host thanks to `ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUEST`
|
||||||
```
|
|
||||||
|
|
||||||
This is expected, and only indicates that the guest image has not yet been
|
The deployed image including the guest will be in `host/deploy/images/`
|
||||||
generated when the host parses the SRC_URI. By the time it is needed by the
|
|
||||||
host recipe fetch task it will be present.
|
|
||||||
|
|
||||||
During the build you should see that guest tasks are also being executed in
|
|
||||||
parallel. Once the build completes the guest will already be in the rootfs of
|
|
||||||
the host thanks to `ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUEST`
|
|
||||||
|
|
||||||
The final host image including the guests will be deployed in
|
|
||||||
`host/deploy/images/`
|
|
||||||
|
|
||||||
|
|
||||||
Multiple Guests
|
Multiple Guests
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
To have multiple guests with the same config the line which appends to
|
To have multiple guests with the same config the line which appends to
|
||||||
`ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS` just needs to pass the argument
|
`ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUEST` just needs to be duplicated with
|
||||||
'guestcount=#' to install symlink copies of the xenguest file on the host.
|
a different guestname.
|
||||||
Documentation for the guestcount parameter can be found in
|
|
||||||
documentation/arm-autonomy-quickstart.md in the section titled
|
|
||||||
'Include guests directly in the host image'. This will ensure that the guest
|
|
||||||
is still only built once, despite resulting in multiple copies on the target.
|
|
||||||
|
|
||||||
If guests are required to have different configurations, each will need its own
|
To have different config for each guest, each will need its own config
|
||||||
config file, e.g. 'netguest.conf'. Ensure that the name of the conf file does
|
file similar to guest.conf, ensuring TMPDIR is set to a different path,
|
||||||
not contain any hyphens, as this will create errors when it becomes part of a
|
and everything between `---Guest Config Start---` and
|
||||||
function name. In this file the values of TMPDIR, MACHINE, DISTRO_FEATURES etc.
|
`---Guest Config End---` will need to be duplicated.
|
||||||
should be the same as above, but with the prefix "MC_GUEST_*" modified to
|
|
||||||
something different to avoid collisions (e.g. MC_GUEST_2_*).
|
|
||||||
|
|
||||||
As before, your additional config for the guest type should
|
Any copies of variables that start `MC_GUEST` must be altered to avoid
|
||||||
follow "ANY OTHER GUEST CONFIG"
|
collisions (e.g. `MC_GUEST_2_*`), and the name of the conf file must also
|
||||||
|
be added to BBMULTICONFIG.
|
||||||
|
|
||||||
In your local.conf, everything between `---Guest Config Start---` and
|
|
||||||
`---Guest Config End---` will need to be duplicated for each desired guest type.
|
|
||||||
All copies of variables that start `MC_GUEST` must be modified with the same
|
|
||||||
prefix as in the new guest config file (e.g. `MC_GUEST_2_*`).
|
|
||||||
|
|
||||||
Each chunk of guest config in local.conf has automatic guest variables
|
|
||||||
(found after the line "These variables are set automatically...").
|
|
||||||
These should all use the same prefix as their chunk in their values,
|
|
||||||
for example:
|
|
||||||
```
|
|
||||||
MC_GUEST_2_FILENAME_PREFIX = "${@ 'Image-initramfs' if d.getVar('MC_GUEST_2_INITRAMFS_IMAGE_BUNDLE',d) else '${MC_GUEST_2_IMAGERECIPE}' }"
|
|
||||||
```
|
|
||||||
|
|
||||||
Guest with provisioned disk
|
Guest with provisioned disk
|
||||||
----------------
|
----------------
|
||||||
@@ -202,12 +172,11 @@ AUTONOMY_HOST_EXTRA_PARTITION = "part --label provisioned-guest --source rawcopy
|
|||||||
--sourceparams=file=${TOPDIR}/${MC_GUEST}/deploy/images/${MC_GUEST_MACHINE}/${MC_GUEST_FILENAME_PREFIX}-${MC_GUEST_MACHINE}.ext4"
|
--sourceparams=file=${TOPDIR}/${MC_GUEST}/deploy/images/${MC_GUEST_MACHINE}/${MC_GUEST_FILENAME_PREFIX}-${MC_GUEST_MACHINE}.ext4"
|
||||||
```
|
```
|
||||||
|
|
||||||
inside your host.conf file.
|
inside host.conf file.
|
||||||
|
|
||||||
The rest of the configuration has to be appended to guest.conf file:
|
The rest of the configuration has to be appended to guest.conf file:
|
||||||
|
|
||||||
```
|
```
|
||||||
# ANY OTHER GUEST CONFIG
|
|
||||||
XENGUEST_IMAGE_DISK_SIZE = "0"
|
XENGUEST_IMAGE_DISK_SIZE = "0"
|
||||||
XENGUEST_IMAGE_SRC_URI_XEN_CONFIG = "file://\${TOPDIR}/path/to/rootdisk.cfg"
|
XENGUEST_IMAGE_SRC_URI_XEN_CONFIG = "file://\${TOPDIR}/path/to/rootdisk.cfg"
|
||||||
XENGUEST_IMAGE_DISK_DEVICE = "_GUEST_DISK_DEVICE_"
|
XENGUEST_IMAGE_DISK_DEVICE = "_GUEST_DISK_DEVICE_"
|
||||||
@@ -216,7 +185,7 @@ IMAGE_ROOTFS_SIZE = "102400"
|
|||||||
IMAGE_FSTYPES = "ext4"
|
IMAGE_FSTYPES = "ext4"
|
||||||
```
|
```
|
||||||
|
|
||||||
Example content of rootdisk.cfg:
|
content of rootdisk.cfg"
|
||||||
|
|
||||||
```
|
```
|
||||||
disk = ["phy:_GUEST_DISK_DEVICE_,xvda,w"]
|
disk = ["phy:_GUEST_DISK_DEVICE_,xvda,w"]
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
arm-autonomy Quick Start
|
arm-autonomy Quick Start
|
||||||
==================
|
==================
|
||||||
|
|
||||||
This documentation explains how to quickly start with the arm-autonomy layer,
|
This documentation is explaining how to quickly start with arm-autonomy layer
|
||||||
and the main features provided.
|
and the main features provided.
|
||||||
In the documentation directory you will find some more detailed documentation
|
You will find in the documentation directory some more detailed documentation
|
||||||
for each of the functionalites provided by this layer.
|
for each of the functionalites provided by this layer.
|
||||||
|
|
||||||
What to use this layer for?
|
What to use this layer for?
|
||||||
@@ -29,7 +29,7 @@ First you must download the Yocto layers needed:
|
|||||||
- all other layers you might want to use
|
- all other layers you might want to use
|
||||||
|
|
||||||
For each of the downloaded layer make sure you checkout the release of Yocto
|
For each of the downloaded layer make sure you checkout the release of Yocto
|
||||||
you want to use (for example hardknott using `git checkout hardknott`).
|
you want to use (for example zeus using `git checkout zeus`).
|
||||||
|
|
||||||
Please follow [Yocto documentation](https://www.yoctoproject.org/docs/latest/brief-yoctoprojectqs/brief-yoctoprojectqs.html)
|
Please follow [Yocto documentation](https://www.yoctoproject.org/docs/latest/brief-yoctoprojectqs/brief-yoctoprojectqs.html)
|
||||||
in order to have the required dependencies.
|
in order to have the required dependencies.
|
||||||
@@ -110,8 +110,7 @@ The project will generate a Linux kernel, a root filesystem, a Xen binary and
|
|||||||
a DTB modified to include the required entries to boot Xen and Linux as Dom0
|
a DTB modified to include the required entries to boot Xen and Linux as Dom0
|
||||||
(this DTB has the extension `-xen.dtb`).
|
(this DTB has the extension `-xen.dtb`).
|
||||||
|
|
||||||
To boot the system using a u-boot base board for machines other than FVP-Base
|
To boot the system using an u-boot base board you will need to:
|
||||||
you will need to:
|
|
||||||
- Load the kernel (by default at 0x80080000 unless you modify
|
- Load the kernel (by default at 0x80080000 unless you modify
|
||||||
XEN_DEVICETREE_DOM0_ADDR value)
|
XEN_DEVICETREE_DOM0_ADDR value)
|
||||||
- Load the xen device tree (for example at 0x83000000)
|
- Load the xen device tree (for example at 0x83000000)
|
||||||
@@ -120,88 +119,53 @@ you will need to:
|
|||||||
|
|
||||||
In this example the addresses might need to be adapted depending on your board.
|
In this example the addresses might need to be adapted depending on your board.
|
||||||
|
|
||||||
For arm-autonomy host on FVP-Base, u-boot has been modified such that
|
For arm-autonomy host on FVP-Base u-boot has been modified such that
|
||||||
`booti 0x84000000 - 0x83000000` is the default boot command. If FVP-Base is your
|
`booti 0x84000000 - 0x83000000` is the default boot command. If FVP-Base is your
|
||||||
MACHINE target there should be no need to interfere with u-boot.
|
MACHINE target there should be no need to interfere with u-boot.
|
||||||
|
|
||||||
Guest project
|
Guest project
|
||||||
-------------
|
-------------
|
||||||
The guest projects are not target specific and will instead use a Yocto MACHINE
|
The guest projects are not target specific and will use a Yocto MACHINE defined
|
||||||
defined in meta-arm-autonomy to include only the Linux configuration required to
|
in meta-arm-autonomy to include only the Linux configuration required to run
|
||||||
run a xen guest.
|
a xen guest.
|
||||||
|
|
||||||
To create a guest project:
|
To create a guest project:
|
||||||
|
|
||||||
1. Follow the steps of "Create a project"
|
1. Follow the steps of "Create a project"
|
||||||
|
|
||||||
2. Optionally add layers required to build the guest image, and any features you
|
2. Optionaly add layers required to build the image and features you need.
|
||||||
need.
|
|
||||||
|
|
||||||
3. Edit conf/local.conf to add `arm-autonomy-guest` to the DISTRO_FEATURES and
|
3. edit conf/local.conf to add `arm-autonomy-guest` to the DISTRO_FEATURES and
|
||||||
set MACHINE to `arm64-autonomy-guest`:
|
set MACHINE to `arm64-autonomy-guest`:
|
||||||
```
|
```
|
||||||
MACHINE = "arm64-autonomy-guest"
|
MACHINE = "arm64-autonomy-guest"
|
||||||
DISTRO_FEATURES += "arm-autonomy-guest"
|
DISTRO_FEATURES += "arm-autonomy-guest"
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Build the image you want.
|
4. build the image you want.
|
||||||
For example `bitbake core-image-minimal`
|
For example `bitbake core-image-minimal`
|
||||||
|
|
||||||
The build will create a ".xenguest" image that can be use on an host project
|
The build will create a ".xenguest" image that can be use on an host project
|
||||||
with the xenguest-manager, as well as a file "xenguest.env" containing the
|
with the xenguest-manager.
|
||||||
variables used to configure and generate the guest image.
|
|
||||||
|
|
||||||
The guest can also be built as a 'multiconfig' sub project of the host, see
|
The guest can also be built as a 'multiconfig' sub project of the host, see
|
||||||
`meta-arm-autonomy/documentation/arm-autonomy-multiconfig.md` for more
|
`meta-arm-autonomy/documentation/arm-autonomy-multiconfig.md` for more information
|
||||||
information
|
|
||||||
|
|
||||||
Include guests directly in the host image
|
Include guests directly in the host image
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
The layer provides a way to directly include one or more images generated by
|
The layer provides a way to directly include in the host project one or several
|
||||||
guest projects in the host project.
|
images generated by guest projects.
|
||||||
|
|
||||||
To use this feature, you must edit your host project `local.conf` file and
|
To use this feature, you must edit your host project `local.conf` file and
|
||||||
add set the value of 'ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS' to the list of
|
add set ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS to the list of xenguest images
|
||||||
paths to xenguest images you want to include in your host.
|
you want to include in your host. Each xenguest image must be given using a
|
||||||
|
full path to it.
|
||||||
There are 4 supported formats for ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS
|
|
||||||
entries:
|
|
||||||
|
|
||||||
- http/https url
|
|
||||||
- "https://[url]:[port]/foo.xenguest;md5sum=..."
|
|
||||||
|
|
||||||
- file:// absolute local path from root
|
|
||||||
- "file:///xenguests/bar.xenguest"
|
|
||||||
|
|
||||||
- file:// path relative to FILESEXTRAPATHS
|
|
||||||
- "file://relative/baz.xenguest"
|
|
||||||
|
|
||||||
- plain absolute local path from root
|
|
||||||
- "/xenguests/absolute/xyzzy.xenguest"
|
|
||||||
|
|
||||||
It is not recommended to use other bitbake URL types, as they may result in
|
|
||||||
undefined behaviour.
|
|
||||||
|
|
||||||
A semicolon seperated list of install arguments can follow each image path:
|
|
||||||
- guestname : the name that will be attached when the image is imported
|
|
||||||
(default: [filename, without extension])
|
|
||||||
- guestcount : the number of copies of the guest to install, with
|
|
||||||
incrementing numbers appended to the name
|
|
||||||
(default: 1)
|
|
||||||
|
|
||||||
Any other arguments, for example an md5sum, will be assumed to be fetch
|
|
||||||
arguments, and will be appended to the path in the SRC_URI.
|
|
||||||
For example:
|
For example:
|
||||||
```
|
```
|
||||||
ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS = "\
|
ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS = "/home/user/guest-project/tmp/deploy/images/arm64-autonomy-guest/core-image-minimal-arm64-autonomy-guest.xenguest;guestname=myguest"
|
||||||
https://[url]:[port]/base.xenguest;md5sum=[checksum];guestname=http \
|
|
||||||
file:///guests/base.xenguest;guestname=file_abs \
|
|
||||||
file://foo/base.xenguest;guestname=file_rel;guestcount=2 \
|
|
||||||
/guests/foo/bar/base.xenguest;guestname=no_fetcher \ "
|
|
||||||
```
|
```
|
||||||
|
This will add the guest and name it `myguest` on the host project image and
|
||||||
Documentation for setting up a multiconfig build can be found in:
|
the xenguest-manager will automatically boot it during startup.
|
||||||
meta-arm-autonomy/documentation/arm-autonomy-multiconfig.md
|
|
||||||
|
|
||||||
Add support for your board
|
Add support for your board
|
||||||
--------------------------
|
--------------------------
|
||||||
@@ -222,7 +186,7 @@ started). You can find the complete list of the kernel configuration elements
|
|||||||
required in `recipes-kernel/linux/arm-autonomy-kmeta/features/arm-autonomy/xen-host.cfg`.
|
required in `recipes-kernel/linux/arm-autonomy-kmeta/features/arm-autonomy/xen-host.cfg`.
|
||||||
|
|
||||||
### Define the drive and partition to use for the LVM volume
|
### Define the drive and partition to use for the LVM volume
|
||||||
The xenguest-manager creates guest storage drives using LVM on an empty
|
The xenguest-manager is creating disk hard drive using LVM on an empty
|
||||||
partition. The default value is set to use /dev/sda2.
|
partition. The default value is set to use /dev/sda2.
|
||||||
You can change this for your board by setting XENGUEST_MANAGER_VOLUME_DEVICE.
|
You can change this for your board by setting XENGUEST_MANAGER_VOLUME_DEVICE.
|
||||||
|
|
||||||
@@ -231,37 +195,37 @@ Check `recipes-extended/xenguest/xenguest-manager.bbappend` for examples.
|
|||||||
Please also read xenguest-manager.md.
|
Please also read xenguest-manager.md.
|
||||||
|
|
||||||
### Define the interface to add to xenguest network bridge
|
### Define the interface to add to xenguest network bridge
|
||||||
xenguest-network bridge creates a bridge on the host and adds network
|
xenguest-network bridge is creating a bridge on the host and adds network
|
||||||
interfaces to it so that guests connected to it have access to external network.
|
interfaces to it so that guest connected to it have access to external network.
|
||||||
By default `eth0` is set as the list of interfaces to be added to the bridge.
|
By default `eth0` is set as the list of interfaces to be added to the bridge.
|
||||||
Depending on your board or use case you might want to use an other interface
|
Depending on your board or use case you might want to use an other interface
|
||||||
or use multiple interfaces.
|
or use multiple interfaces.
|
||||||
You can change this for your board by setting XENGUEST_NETWORK_BRIDGE_MEMBERS.
|
You can change this for your board by setting XENGUEST_NETWORK_BRIDGE_MEMBERS.
|
||||||
|
|
||||||
Check `recipes-extended/xenguest/xenguest-network.bbappend` for
|
Check `recipes-extended/xenguest/xenguest-network-bridge.bbappend` for
|
||||||
exmaples.
|
exmaples.
|
||||||
|
|
||||||
Please also read xenguest-network-bridge.md.
|
Please also read xenguest-network-bridge.md.
|
||||||
|
|
||||||
### Define the network configuration of the xenguest network bridge
|
### Define the network configuration of the xenguest network bridge
|
||||||
xenguest-network puts the host network interfaces in a bridge and configures it
|
xenguest network bridge is putting the host network interfaces in a bridge
|
||||||
by default to use dhcp.
|
and is configuring it by default to use dhcp.
|
||||||
If you need a different type of configuration you can set
|
If you need a different type of configuration you can set
|
||||||
XENGUEST_NETWORK_BRIDGE_CONFIG in your xenguest-network-bridge.bbappend to use
|
XENGUEST_NETWORK_BRIDGE_CONFIG in a xenguest-network-bridge.bbappend to use
|
||||||
a different file.
|
a different file.
|
||||||
The recipe will look for the file in ${WORKDIR}, so you will need to add it to
|
The recipe will look for the file in ${WORKDIR} so you will need to add it to
|
||||||
the SRC_URI in your bbappend.
|
SRC_URI in your bbappend.
|
||||||
The recipe will also substitute `###BRIDGE_NAME###` with the bridge name
|
The recipe will also substitute `###BRIDGE_NAME###` with the bridge name
|
||||||
configured in ${XENGUEST_NETWORK_BRIDGE_NAME} when the config file is installed.
|
configured in ${XENGUEST_NETWORK_BRIDGE_NAME}.
|
||||||
|
|
||||||
You can find an example configuration file in
|
You can find an example configuration file in
|
||||||
`recipes-extended/xenguest/files/xenguest-network-bridge-dhcp.cfg.in`.
|
`recipes-extended/xenguest/files/xenguest-network-bridge-dhcp.cfg.in`.
|
||||||
|
|
||||||
Please also read xenguest-network.md.
|
Please also read xenguest-network-bridge.md.
|
||||||
|
|
||||||
### Customize Dom0 and Xen boot arguments for you board
|
### Customize Dom0 and Xen boot arguments for you board
|
||||||
xen-devicetree modifies the generated DTB Xen and Linux boot arguments,
|
xen-devicetree is writting inside the generated DTB Xen and Linux boot
|
||||||
as long as the address where Dom0 Linux kernel can be found.
|
arguments as long as the address where Dom0 Linux kernel can be found.
|
||||||
You might need to have different values for your board or depending on your
|
You might need to have different values for your board or depending on your
|
||||||
use case.
|
use case.
|
||||||
|
|
||||||
|
|||||||
@@ -11,24 +11,19 @@ perform a couple of customizations in the generated wic image:
|
|||||||
1 MiB per physical volume, hence it needs to be taken into account when
|
1 MiB per physical volume, hence it needs to be taken into account when
|
||||||
setting GUEST_PART_SIZE.
|
setting GUEST_PART_SIZE.
|
||||||
|
|
||||||
2. Set the boot partition size (default: 100M) via `BOOT_PART_SIZE` and
|
2. The wic image partition layout and contents with a custom wks file via
|
||||||
`BOOT_PART_SIZE_UNIT` (M or G) variables in any conf file. The default
|
|
||||||
bootimg is ~44M so 100M leaves just over 50M of free space.
|
|
||||||
|
|
||||||
3. The wic image partition layout and contents with a custom wks file via
|
|
||||||
`ARM_AUTONOMY_WKS_FILE` variable (default:
|
`ARM_AUTONOMY_WKS_FILE` variable (default:
|
||||||
arm-autonomy-n1sdp-efidisk.wks.in which is affected by GUEST_PART_SIZE,
|
arm-autonomy-n1sdp-efidisk.wks.in which is affected by GUEST_PART_SIZE,
|
||||||
GUEST_PART_SIZE_UNIT, BOOT_PART_SIZE, BOOT_PART_SIZE_UNIT and
|
GUEST_PART_SIZE_UNIT and GRUB_CFG_FILE variables).
|
||||||
GRUB_CFG_FILE variables).
|
|
||||||
|
|
||||||
4. Custom grub.cfg file via `GRUB_CFG_FILE` (default:
|
3. Custom grub.cfg file via `GRUB_CFG_FILE` (default:
|
||||||
arm-autonomy-n1sdp-grub.cfg) variable to be set in any conf file. The full
|
arm-autonomy-n1sdp-grub.cfg) variable to be set in any conf file. The full
|
||||||
path or relative to `ARM_AUTONOMY_WKS_FILE` should be set.
|
path or relative to `ARM_AUTONOMY_WKS_FILE` should be set.
|
||||||
|
|
||||||
The `arm-autonomy-n1sdp-efidisk.wks.in` and `arm-autonomy-n1sdp-grub.cfg` files
|
The `arm-autonomy-n1sdp-efidisk.wks.in` and `arm-autonomy-n1sdp-grub.cfg` files
|
||||||
are located at `meta-arm-autonomy/dynamic-layers/meta-arm-bsp/wic`.
|
are located at `meta-arm-autonomy/dynamic-layers/meta-arm-bsp/wic`.
|
||||||
|
|
||||||
Other variables can also be customized to set what files need to be included
|
Other variables can also be custmized to set what files need to be included
|
||||||
in the wic image boot partition. Please refer to
|
in the wic image boot partition. Please refer to
|
||||||
`meta-arm-autonomy/dynamic-layers/meta-arm-bsp/conf/machine/n1sdp-extra-settings.inc`
|
`meta-arm-autonomy/dynamic-layers/meta-arm-bsp/conf/machine/n1sdp-extra-settings.inc`
|
||||||
for more details.
|
for more details.
|
||||||
@@ -56,8 +56,7 @@ The following parameters are available:
|
|||||||
the xen devicetrees are properly regenerated if the source DTBs are changed.
|
the xen devicetrees are properly regenerated if the source DTBs are changed.
|
||||||
This variable is set by default to "virtual/kernel:do_deploy" to use DTBs
|
This variable is set by default to "virtual/kernel:do_deploy" to use DTBs
|
||||||
generated during the compilation of the Linux kernel. This must be changed
|
generated during the compilation of the Linux kernel. This must be changed
|
||||||
if the machine you are using is not using a DTB listed in
|
if the machine your are using is not using a DTB listed in KERNEL_DEVICETREE.
|
||||||
KERNEL_DEVICETREE.
|
|
||||||
|
|
||||||
- XEN_DEVICETREE_DTBS: This should be set to the list of DTBs you want to be
|
- XEN_DEVICETREE_DTBS: This should be set to the list of DTBs you want to be
|
||||||
modified by xen-devicetree. Those must be files that xen-devicetree can find
|
modified by xen-devicetree. Those must be files that xen-devicetree can find
|
||||||
@@ -71,10 +70,7 @@ The following parameters are available:
|
|||||||
This variable is only used if XEN_DEVICETREE_XEN_BOOTARGS has a value
|
This variable is only used if XEN_DEVICETREE_XEN_BOOTARGS has a value
|
||||||
containing "dom0_mem=${XEN_DEVICETREE_DOM0_MEM}" as the memory assigned to
|
containing "dom0_mem=${XEN_DEVICETREE_DOM0_MEM}" as the memory assigned to
|
||||||
dom0 is defined using Xen boot arguments.
|
dom0 is defined using Xen boot arguments.
|
||||||
This variable is set by default to "1024M,max:1024", and cannot be empty.
|
This variable is set by default to "1024M".
|
||||||
The value can simply specify a size, e.g. "1024M", but best practice is to
|
|
||||||
also provide a max, documented here:
|
|
||||||
https://wiki.xenproject.org/wiki/Xen_Project_Best_Practices
|
|
||||||
|
|
||||||
- XEN_DEVICETREE_DOM0_BOOTARGS: Boot arguments to pass to Dom0 Linux when
|
- XEN_DEVICETREE_DOM0_BOOTARGS: Boot arguments to pass to Dom0 Linux when
|
||||||
booting it.
|
booting it.
|
||||||
@@ -88,8 +84,7 @@ The following parameters are available:
|
|||||||
- XEN_DEVICETREE_DOM0_ADDR: This is the address from which the Linux kernel to
|
- XEN_DEVICETREE_DOM0_ADDR: This is the address from which the Linux kernel to
|
||||||
be used for Dom0 will be copied. When using u-boot, this is the address at
|
be used for Dom0 will be copied. When using u-boot, this is the address at
|
||||||
which you will load the kernel Image before starting Xen.
|
which you will load the kernel Image before starting Xen.
|
||||||
This variable is set by default to "0x80080000", and cannot be empty.
|
This variable is set by default to "0x80080000".
|
||||||
Values for this variable can be in hex (prefixed with '0x') or in decimal.
|
|
||||||
|
|
||||||
- XEN_DEVICETREE_DOM0_SIZE: This is the size of the kernel loaded at
|
- XEN_DEVICETREE_DOM0_SIZE: This is the size of the kernel loaded at
|
||||||
${XEN_DEVICETREE_DOM0_ADDR}. Xen will copy this amount of data inside the
|
${XEN_DEVICETREE_DOM0_ADDR}. Xen will copy this amount of data inside the
|
||||||
@@ -97,8 +92,7 @@ The following parameters are available:
|
|||||||
size but can be bigger. You must be careful not to have a value too big as it
|
size but can be bigger. You must be careful not to have a value too big as it
|
||||||
could slow down boot or copy other parts with it (like the DTB).
|
could slow down boot or copy other parts with it (like the DTB).
|
||||||
You might need to increase this if you use a kernel with a bundled initramfs.
|
You might need to increase this if you use a kernel with a bundled initramfs.
|
||||||
This variable is set by default to "0x01000000" and cannot be empty.
|
This variable is set by default to "0x01000000".
|
||||||
Values for this variable can be in hex (prefixed with '0x') or in decimal.
|
|
||||||
|
|
||||||
- XEN_DEVICETREE_DTSI_MERGE: This variable contains the list of dtsi files that
|
- XEN_DEVICETREE_DTSI_MERGE: This variable contains the list of dtsi files that
|
||||||
must be included inside the generated DTB file. By default the only one
|
must be included inside the generated DTB file. By default the only one
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Introduction
|
|||||||
xenguest-manager is a tool to manage Xenguest images generated by
|
xenguest-manager is a tool to manage Xenguest images generated by
|
||||||
[xenguest-mkimage](xenguest-mkimage.md).
|
[xenguest-mkimage](xenguest-mkimage.md).
|
||||||
|
|
||||||
On a Xen Dom0 system it can:
|
On a Xen Dom0 system it will:
|
||||||
- create a xen guest from a xenguest image: extract its components, create a
|
- create a xen guest from a xenguest image: extract its components, create a
|
||||||
disk for the guest using LVM volumes.
|
disk for the guest using LVM volumes.
|
||||||
- start/stop a xen guest (during init or using xenguest-manager directly).
|
- start/stop a xen guest (during init or using xenguest-manager directly).
|
||||||
@@ -23,7 +23,7 @@ Usage
|
|||||||
-----
|
-----
|
||||||
|
|
||||||
xenguest-manager must be called like this:
|
xenguest-manager must be called like this:
|
||||||
`xenguest-manager [-v(v)] OPERATION [OPTIONS]`
|
`xenguest-manager OPERATION [OPTIONS]`
|
||||||
The following operations are available:
|
The following operations are available:
|
||||||
- create XENGUEST_IMAGE [GUESTNAME]: create a guest from a xenguest image file
|
- create XENGUEST_IMAGE [GUESTNAME]: create a guest from a xenguest image file
|
||||||
as guest GUESTNAME. If GUESTNAME is not given the image file name is used
|
as guest GUESTNAME. If GUESTNAME is not given the image file name is used
|
||||||
@@ -37,9 +37,6 @@ The following operations are available:
|
|||||||
- status [GUESTNAME]: print the current status of GUESTNAME. If GUESTNAME is
|
- status [GUESTNAME]: print the current status of GUESTNAME. If GUESTNAME is
|
||||||
not given, print the status of all guests.
|
not given, print the status of all guests.
|
||||||
|
|
||||||
Passing -v or -vv will increase the logging written to the logfile.
|
|
||||||
The terminal will always show only error messages, regardless of the logfile.
|
|
||||||
|
|
||||||
For a detailed help on available options please use:
|
For a detailed help on available options please use:
|
||||||
`xenguest-manager --help`
|
`xenguest-manager --help`
|
||||||
|
|
||||||
@@ -48,7 +45,6 @@ Bitbake parameters
|
|||||||
|
|
||||||
Several parameters are available to configure the xenguest manager during Yocto
|
Several parameters are available to configure the xenguest manager during Yocto
|
||||||
project compilation (those can be set in your project local.conf, for example).
|
project compilation (those can be set in your project local.conf, for example).
|
||||||
This config will be written to a file xenguest-manager.conf in /etc/xenguest/.
|
|
||||||
|
|
||||||
The following parameters are available:
|
The following parameters are available:
|
||||||
|
|
||||||
@@ -69,22 +65,6 @@ The following parameters are available:
|
|||||||
name).
|
name).
|
||||||
This is set by default to "/usr/share/guests".
|
This is set by default to "/usr/share/guests".
|
||||||
|
|
||||||
- XENGUEST_MANAGER_LOG_LEVEL: Set the default log level for xenguest manager.
|
|
||||||
Must be one of ERROR, INFO, VERBOSE (default: ERROR). The logs will be
|
|
||||||
written to /var/log/xenguest.
|
|
||||||
|
|
||||||
If a verbosity argument (-v or -vv) is passed to xenguest-manager directly, it
|
|
||||||
will override the setting in xenguest-manager.conf
|
|
||||||
|
|
||||||
Since /var/log is by default a volatile location, extra configuration is
|
|
||||||
required if logs are desired to be kept between reboots:
|
|
||||||
VOLATILE_LOG_DIR="no"
|
|
||||||
|
|
||||||
Read more here: https://www.yoctoproject.org/docs/latest/mega-manual/mega-manual.html#var-VOLATILE_LOG_DIR
|
|
||||||
|
|
||||||
When this is enabled, logrotate will monitor the file to ensure it does not
|
|
||||||
grow excessively large. See recipes-extended/xenguest/files/logrotate-xenguest
|
|
||||||
|
|
||||||
Init scripts
|
Init scripts
|
||||||
------------
|
------------
|
||||||
|
|
||||||
@@ -100,7 +80,7 @@ directory on the target:
|
|||||||
|
|
||||||
Inside the directory, scripts will be executed in alphabetical order.
|
Inside the directory, scripts will be executed in alphabetical order.
|
||||||
|
|
||||||
Since these scripts are sourced by xenguest-manager, they can acccess functions
|
Since these scripts are sourced by xenguest-manager they can acccess functions
|
||||||
and variables from the parent file's scope, including:
|
and variables from the parent file's scope, including:
|
||||||
|
|
||||||
- ${guestname} : The name of the guest being created
|
- ${guestname} : The name of the guest being created
|
||||||
@@ -109,34 +89,11 @@ and variables from the parent file's scope, including:
|
|||||||
|
|
||||||
- ${guestcfgfile} : The name of the config file for the starting guest
|
- ${guestcfgfile} : The name of the config file for the starting guest
|
||||||
|
|
||||||
- log() : Used to write a log to the logfile, default level INFO.
|
- ${LOGFILE} : The file to append any logging to, e.g.
|
||||||
Takes an optional log level and a message body
|
echo "Hello, World" >> ${LOGFILE}
|
||||||
e.g. log ERROR "blah"
|
|
||||||
|
|
||||||
Options for log level: ERROR, INFO, VERBOSE,
|
Sourcing also allows the script to access params.cfg.
|
||||||
and FATAL which will call exit 1 immediately after logging
|
|
||||||
the message at level ERROR.
|
|
||||||
|
|
||||||
- log_command() : Used to call a shell command and log that it has been
|
|
||||||
called, as well as capturing both stdout and stderr.
|
|
||||||
|
|
||||||
By default the command output is dumped to the logfile as an
|
|
||||||
error if the command returns a status > 0, or as a verbose
|
|
||||||
message if the whole script is running in verbose mode.
|
|
||||||
|
|
||||||
An optional log level can be passed to alter the level the
|
|
||||||
log should be if the command returns a status >0, which may
|
|
||||||
be useful if the command is expected to return a non-zero
|
|
||||||
result.
|
|
||||||
e.g. log_command INFO "ls -lh ~"
|
|
||||||
|
|
||||||
Options for log level: ERROR, INFO, and VERBOSE
|
|
||||||
|
|
||||||
Attempting to call any other functions from xenguest_manager in an init script
|
|
||||||
may result in a fatal error, from which cleanup is not guarenteed.
|
|
||||||
|
|
||||||
|
|
||||||
Init scripts also have access to config variables defined in params.cfg.
|
|
||||||
|
|
||||||
An example of how to create the directory and install an init shell script can
|
An example of how to create the directory and install an init shell script can
|
||||||
be found in:
|
be found in:
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ Xenguest mkimage
|
|||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
|
|
||||||
xenguest-mkimage is a tool to create and modify images to be used as a Guest
|
xenguest-mkimage is a tool to create and modify images to be used as Guest with
|
||||||
with Xen. It defines a format to store completely defined guests as a file or as
|
Xen. It defines a format to store completely defined guests as a file or as
|
||||||
a directory, and provides options to create and modify those images.
|
a directory and provides options to create and modify those images.
|
||||||
|
|
||||||
A xenguest image contains all elements required to create a xen guest.
|
A xenguest image contains all elements required to create a xen guest.
|
||||||
This is the base elements like a Xen configuration and a Linux kernel binary
|
This is the base elements like a Xen configuration and a Linux kernel binary
|
||||||
@@ -15,8 +15,8 @@ but also some more advanced elements like init scripts or a disk definition.
|
|||||||
The format is made to be deployable easily by storing everything in a single
|
The format is made to be deployable easily by storing everything in a single
|
||||||
file and provide tools to easily manipulate the images. It can also easily be
|
file and provide tools to easily manipulate the images. It can also easily be
|
||||||
extended to have features like encryption or signature of images, updates or
|
extended to have features like encryption or signature of images, updates or
|
||||||
complex configurations by providing the ability to have init scripts embedded
|
complex configurations by providing features to have init script that will be
|
||||||
inside the image that will be executed on the host when the guest is started.
|
executed on the host embedded inside the image.
|
||||||
|
|
||||||
Xenguest images content
|
Xenguest images content
|
||||||
-----------------------
|
-----------------------
|
||||||
@@ -35,7 +35,7 @@ before starting the guest.
|
|||||||
|
|
||||||
### files
|
### files
|
||||||
This directory contains files that can be used by the xen configuration, for
|
This directory contains files that can be used by the xen configuration, for
|
||||||
example the kernel image referenced in xen configuration.
|
example the binary of the kernel referenced in xen configuration).
|
||||||
This is where the kernel binary, the dtb or a ramdisk will be stored.
|
This is where the kernel binary, the dtb or a ramdisk will be stored.
|
||||||
|
|
||||||
### init.pre, init.d and init.post
|
### init.pre, init.d and init.post
|
||||||
@@ -47,7 +47,7 @@ contains scripts called at a different time:
|
|||||||
generate part of the xen configuration dynamically.
|
generate part of the xen configuration dynamically.
|
||||||
- init.d: scripts executed when the guest has been created but before it is
|
- init.d: scripts executed when the guest has been created but before it is
|
||||||
started. This can be used to do some xenstore operations or configure the
|
started. This can be used to do some xenstore operations or configure the
|
||||||
guest behaviour, using xl for example.
|
guest behaviour using xl, for example.
|
||||||
- init.post: scripts executed just after starting the guest. This can be
|
- init.post: scripts executed just after starting the guest. This can be
|
||||||
used to configure things created by xen for the guest like network
|
used to configure things created by xen for the guest like network
|
||||||
network interfaces.
|
network interfaces.
|
||||||
@@ -58,19 +58,12 @@ order.
|
|||||||
### disk.cfg and disk-files
|
### disk.cfg and disk-files
|
||||||
disk.cfg contains the guest disk description (disk size and disk partitions).
|
disk.cfg contains the guest disk description (disk size and disk partitions).
|
||||||
The file contains the following entries:
|
The file contains the following entries:
|
||||||
- `DISK_SIZE=X`: size of the disk to create in MB or GB(default),
|
- `DISK_SIZE=X`: size of the disk to create in GB
|
||||||
e.g. 1000M or 4[G]
|
|
||||||
- `DISK_PARTX=SIZE:FS:CONTENT`: create a partition number X (1 to 4) with a
|
- `DISK_PARTX=SIZE:FS:CONTENT`: create a partition number X (1 to 4) with a
|
||||||
size of SIZE MB or GB(default), e.g 1000M or 2[G].
|
size of SIZE GB, format it with filesystem FS (can be ext2, ext3, ext4, vfat
|
||||||
Format it with filesystem FS (can be ext2, ext3, ext4, vfat or swap)
|
or swap) and extract CONTENT as initial partition content
|
||||||
and extract CONTENT as initial partition content (.tar[.gz|.xz|.bz2] file
|
(.tar[.gz|.xz|.bz2] file or img[.gz|.bz2] file to be dumped in the partition). FS and
|
||||||
or img[.gz|.bz2] file to be dumped in the partition).
|
CONTENT can be empty.
|
||||||
FS and CONTENT can be empty.
|
|
||||||
- `DISK_DEVICE=X`: disk or partition to be used by lvm. Setting this option
|
|
||||||
allows to bind guest disk with any partition or disk available on host,
|
|
||||||
e.g. /dev/sda3 or /dev/sdb.
|
|
||||||
This variable is not set by default, but if set, it overrides disk settings
|
|
||||||
inside xenguest-manager.conf - 'XENGUEST_VOLUME_DEVICE'.
|
|
||||||
|
|
||||||
The disk-files contain files to be used for initializing the disk partitions
|
The disk-files contain files to be used for initializing the disk partitions
|
||||||
content. Those should be used to create a LVM or a physical disk and initialize
|
content. Those should be used to create a LVM or a physical disk and initialize
|
||||||
@@ -112,12 +105,12 @@ For a detailed help on available operations, please use:
|
|||||||
image file. Several script can be added and the basename of FILE is used to
|
image file. Several script can be added and the basename of FILE is used to
|
||||||
distinguish them (calling the option twice with the same file will update the
|
distinguish them (calling the option twice with the same file will update the
|
||||||
script in the image with the second one).
|
script in the image with the second one).
|
||||||
--disk-size=SIZE: set the guest disk size to SIZE in MB or GB(default),
|
--disk-size=SIZE: set the guest disk size to SIZE in GB. Calling this with 0
|
||||||
e.g 1000M or 2[G]. Calling this with 0 disable the guest disk.
|
disable the guest disk.
|
||||||
- --disk-add-part=NUM:SIZE:FS:CONTENT: This is adding a partition to the
|
- --disk-add-part=NUM:SIZE:FS:CONTENT: This is adding a partition to the
|
||||||
xenguest image disk. The partition is described with the arguments:
|
xenguest image disk. The partition is described with the arguments:
|
||||||
- NUM: partition number.
|
- NUM: partition number.
|
||||||
- SIZE: partition size in MB or GB(default), e.g 1000M or 2[G].
|
- SIZE: partition size in GB.
|
||||||
- FS: filesystem to format the partition with. This can be ext2, ext3, ext4,
|
- FS: filesystem to format the partition with. This can be ext2, ext3, ext4,
|
||||||
vfat of swap. If empty the partition is not formated.
|
vfat of swap. If empty the partition is not formated.
|
||||||
- CONTENT: tar of img file to use to initialize the partition. The file must
|
- CONTENT: tar of img file to use to initialize the partition. The file must
|
||||||
|
|||||||
-32
@@ -4,36 +4,4 @@
|
|||||||
# default rootfs, so use vda3 for guest lvm
|
# default rootfs, so use vda3 for guest lvm
|
||||||
XENGUEST_MANAGER_VOLUME_DEVICE ?= "/dev/vda3"
|
XENGUEST_MANAGER_VOLUME_DEVICE ?= "/dev/vda3"
|
||||||
|
|
||||||
# We need to extend the wks search path to be able to find the wks file set in
|
|
||||||
# ARM_AUTONOMY_WKS_FILE.
|
|
||||||
WKS_SEARCH_PATH_prepend := "${ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR}/wic:"
|
|
||||||
|
|
||||||
ARM_AUTONOMY_WKS_FILE ?= "arm-autonomy-fvp-base-disk.wks.in"
|
|
||||||
# set wks file only if INITRAMFS_IMAGE_BUNDLE is not set
|
|
||||||
WKS_FILE = "${@bb.utils.contains('INITRAMFS_IMAGE_BUNDLE', '1', '',\
|
|
||||||
'${ARM_AUTONOMY_WKS_FILE}', d)}"
|
|
||||||
|
|
||||||
XEN_FILE ?= "xen-fvp-base"
|
|
||||||
DTB_FILE ?= "${@ get_xen_dtb_filename(d)}"
|
|
||||||
XEN_ADDR ?= "0x84000000"
|
|
||||||
DTB_ADDR ?= "0x83000000"
|
|
||||||
|
|
||||||
FVP_DATA += "cluster0.cpu0=${DEPLOY_DIR_IMAGE}/${XEN_FILE}@${XEN_ADDR} \
|
|
||||||
cluster0.cpu0=${DEPLOY_DIR_IMAGE}/${DTB_FILE}@${DTB_ADDR}"
|
|
||||||
|
|
||||||
# Set the wks guest partition size and unit. It must be aligned with the sum of
|
|
||||||
# all XENGUEST_IMAGE_DISK_SIZE set for the guests. By default, LVM2 metadata is
|
|
||||||
# 1 MiB per physical volume, hence it needs to be taken into account when
|
|
||||||
# setting GUEST_PART_SIZE. The XENGUEST_IMAGE_DISK_SIZE default value is 4GiB.
|
|
||||||
GUEST_PART_SIZE ?= "4097"
|
|
||||||
GUEST_PART_SIZE_UNIT ?= "M"
|
|
||||||
|
|
||||||
XENGUEST_NETWORK_BRIDGE_MEMBERS ?= "eth0"
|
XENGUEST_NETWORK_BRIDGE_MEMBERS ?= "eth0"
|
||||||
|
|
||||||
# This function uses the "KERNEL_DEVICETREE" variable and manipulates it to
|
|
||||||
# return the xen kernel device tree file name.
|
|
||||||
def get_xen_dtb_filename(d):
|
|
||||||
kernel_dtb_filename = d.getVar('KERNEL_DEVICETREE',d)
|
|
||||||
xen_dtb_filename = os.path.splitext(os.path.basename(kernel_dtb_filename))[0] + '-xen.dtb'
|
|
||||||
return xen_dtb_filename
|
|
||||||
|
|
||||||
+1
-51
@@ -14,19 +14,8 @@ WKS_FILE = "${ARM_AUTONOMY_WKS_FILE}"
|
|||||||
GUEST_PART_SIZE ?= "4097"
|
GUEST_PART_SIZE ?= "4097"
|
||||||
GUEST_PART_SIZE_UNIT ?= "M"
|
GUEST_PART_SIZE_UNIT ?= "M"
|
||||||
|
|
||||||
# Set default boot partition size and unit
|
|
||||||
BOOT_PART_SIZE ?= "100"
|
|
||||||
BOOT_PART_SIZE_UNIT ?= "M"
|
|
||||||
|
|
||||||
# The GRUB_CFG_FILE affects arm-autonomy-n1sdp-efidisk.wks.in file
|
# The GRUB_CFG_FILE affects arm-autonomy-n1sdp-efidisk.wks.in file
|
||||||
#
|
GRUB_CFG_FILE ?= "${ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR}/wic/arm-autonomy-n1sdp-grub.cfg"
|
||||||
# When alternate-kernel DISTRO_FEATURE is present we set the
|
|
||||||
# arm-autonomy-n1sdp-rt-grub.cfg by default. This GRUB config file has
|
|
||||||
# additional entries for booting with the PREEMPT_RT kernel.
|
|
||||||
GRUB_CFG_FILE ?= "${@bb.utils.contains('DISTRO_FEATURES','alternate-kernel', \
|
|
||||||
'${ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR}/wic/arm-autonomy-n1sdp-rt-grub.cfg', \
|
|
||||||
'${ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR}/wic/arm-autonomy-n1sdp-grub.cfg' \
|
|
||||||
, d)}"
|
|
||||||
|
|
||||||
# From arm-autonomy-n1sdp-efidisk.wks.in, the /boot partition is /dev/sda1, and
|
# From arm-autonomy-n1sdp-efidisk.wks.in, the /boot partition is /dev/sda1, and
|
||||||
# the "/" partition is /dev/sda2.
|
# the "/" partition is /dev/sda2.
|
||||||
@@ -49,42 +38,3 @@ do_image_wic[depends] += "xen:do_deploy"
|
|||||||
IMAGE_EFI_BOOT_FILES += "xen-n1sdp.efi;xen.efi"
|
IMAGE_EFI_BOOT_FILES += "xen-n1sdp.efi;xen.efi"
|
||||||
IMAGE_EFI_BOOT_FILES += "${XEN_MOD_DEVICETREE_DTBS}"
|
IMAGE_EFI_BOOT_FILES += "${XEN_MOD_DEVICETREE_DTBS}"
|
||||||
|
|
||||||
# When alternate-kernel DISTRO_FEATURE is present we set the linux-yocto-rt
|
|
||||||
# by default
|
|
||||||
PREFERRED_PROVIDER_alternate/kernel ?= "\
|
|
||||||
${@bb.utils.contains('DISTRO_FEATURES', 'alternate-kernel', \
|
|
||||||
'linux-yocto-rt', '', d)}"
|
|
||||||
|
|
||||||
KERNEL_PACKAGE_NAME_alternate/kernel ?= "kernel-rt"
|
|
||||||
# When alternate-kernel DISTRO_FEATURE is present we set the kernel-rt by
|
|
||||||
# default
|
|
||||||
KERNEL_PACKAGE_NAME_pn-linux-yocto-rt = "\
|
|
||||||
${@ d.getVar('KERNEL_PACKAGE_NAME_alternate/kernel') \
|
|
||||||
if bb.utils.contains('DISTRO_FEATURES', 'alternate-kernel', True, False, d) \
|
|
||||||
else 'kernel' }"
|
|
||||||
|
|
||||||
# Relative path from DEPLOY_DIR_IMAGE of the Kernel PREEMPT_RT deployed Image
|
|
||||||
KERNEL_RT_IMAGE ?= "kernel-rt/Image-n1sdp.bin;Image-preempt-rt"
|
|
||||||
# Only include the Kernel PREEMPT_RT Image if we are building with
|
|
||||||
# alternate-kernel DISTRO_FEATURE
|
|
||||||
IMAGE_EFI_BOOT_FILES += "\
|
|
||||||
${@ d.getVar('KERNEL_RT_IMAGE',d) or '' \
|
|
||||||
if bb.utils.contains('DISTRO_FEATURES', 'alternate-kernel', True, False, d) and \
|
|
||||||
d.getVar('PREFERRED_PROVIDER_alternate/kernel') else ''}"
|
|
||||||
|
|
||||||
|
|
||||||
EFIDIR ?= "/EFI/BOOT"
|
|
||||||
GRUB_CFG_EXTRA_FILE ?= "${ARM_AUTONOMY_ARM_BSP_DYNAMIC_DIR}/wic/arm-autonomy-n1sdp-grub.cfg;.${EFIDIR}}"
|
|
||||||
|
|
||||||
# When alternate-kernel DISTRO_FEATURE is present we set the
|
|
||||||
# arm-autonomy-n1sdp-rt-grub.cfg by default. This GRUB config file has
|
|
||||||
# additional entries for booting with the PREEMPT_RT kernel and also includes
|
|
||||||
# the main GRUB config file set by GRUB_CFG_EXTRA_FILE.
|
|
||||||
IMAGE_EFI_BOOT_FILES += "\
|
|
||||||
${@ d.getVar('GRUB_CFG_EXTRA_FILE',d) or '' \
|
|
||||||
if bb.utils.contains('DISTRO_FEATURES', 'alternate-kernel', True, False, d) and \
|
|
||||||
d.getVar('PREFERRED_PROVIDER_alternate/kernel') else ''}"
|
|
||||||
|
|
||||||
# Additionnal kernel modules are necessary for n1sdp to be able to mount FAT
|
|
||||||
# filesystems using CP437.
|
|
||||||
MACHINE_ESSENTIAL_EXTRA_RDEPENDS_append = " kernel-module-nls-cp437 kernel-module-nls-iso8859-1"
|
|
||||||
+8
-8
@@ -1,14 +1,14 @@
|
|||||||
# Use OVERRIDES to minimize the usage of
|
# Use OVERRIDES to minimize the usage of
|
||||||
# ${@bb.utils.contains('DISTRO_FEATURES', 'autonomy-host', ...
|
# ${@bb.utils.contains('DISTRO_FEATURES', 'xen', ...
|
||||||
OVERRIDES_append = "${@bb.utils.contains('DISTRO_FEATURES', 'arm-autonomy-host', ':autonomy-host', '', d)}"
|
OVERRIDES_append = "${@bb.utils.contains('DISTRO_FEATURES', 'xen', ':xen', '', d)}"
|
||||||
|
|
||||||
FILESEXTRAPATHS_prepend_autonomy-host := "${THISDIR}/${PN}:"
|
FILESEXTRAPATHS_prepend_xen := "${THISDIR}/${PN}:"
|
||||||
|
|
||||||
DEPENDS_append_autonomy-host = " dos2unix-native"
|
DEPENDS_append_xen = " dos2unix-native"
|
||||||
|
|
||||||
SRC_URI_append_autonomy-host = " file://add-xen-support.patch;patchdir=../"
|
SRC_URI_append_xen = " file://add-xen-support.patch;patchdir=../"
|
||||||
|
|
||||||
do_install_append_autonomy-host() {
|
do_install_append_xen() {
|
||||||
mv -v ${D}/${UNPACK_DIR}/SOFTWARE/uEnv.txt \
|
mv -v ${D}/${UNPACK_DIR}/SOFTWARE/uEnv.txt \
|
||||||
${D}/${UNPACK_DIR}/SOFTWARE/uenvfile
|
${D}/${UNPACK_DIR}/SOFTWARE/uenvfile
|
||||||
for dir in $(ls ${D}/${UNPACK_DIR}/SITE1/)
|
for dir in $(ls ${D}/${UNPACK_DIR}/SITE1/)
|
||||||
@@ -18,11 +18,11 @@ do_install_append_autonomy-host() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DEPLOY_EXTRA_DEPS ??= ""
|
DEPLOY_EXTRA_DEPS ??= ""
|
||||||
DEPLOY_EXTRA_DEPS_autonomy-host = "xen:do_deploy xen-devicetree:do_deploy"
|
DEPLOY_EXTRA_DEPS_xen = "xen:do_deploy xen-devicetree:do_deploy"
|
||||||
|
|
||||||
do_deploy[depends] += "${DEPLOY_EXTRA_DEPS}"
|
do_deploy[depends] += "${DEPLOY_EXTRA_DEPS}"
|
||||||
|
|
||||||
do_deploy_prepend_autonomy-host() {
|
do_deploy_prepend_xen() {
|
||||||
# To avoid dependency loop between firmware-image-juno:do_install,
|
# To avoid dependency loop between firmware-image-juno:do_install,
|
||||||
# xen:do_deploy and xen-devicetree:do_deploy when
|
# xen:do_deploy and xen-devicetree:do_deploy when
|
||||||
# INITRAMFS_IMAGE_BUNDLE = "1", we need to handle the xen and
|
# INITRAMFS_IMAGE_BUNDLE = "1", we need to handle the xen and
|
||||||
|
|||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
# Yocto kernel-cache sets CONFIG_NLS_CODEPAGE_437=m for LINUX_KERNEL_TYPR=preempt-rt
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
|
||||||
# Yocto kernel-cache sets CONFIG_NLS_ISO8859_1=m for LINUX_KERNEL_TYPR=preempt-rt
|
|
||||||
CONFIG_NLS_ISO8859_1=y
|
|
||||||
|
|
||||||
# Set the timer interrupt run at 1000 Hz to have a fast response
|
|
||||||
CONFIG_HZ_1000=y
|
|
||||||
-3
@@ -1,3 +0,0 @@
|
|||||||
define KFEATURE_DESCRIPTION "Extra kernel configs when building with PREEMPT_RT"
|
|
||||||
|
|
||||||
kconf non-hardware preempt-rt-extras.cfg
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# short-description: Create a disk image
|
|
||||||
# long-description: Creates a partitioned disk image that the user
|
|
||||||
# can directly dd to boot media.
|
|
||||||
|
|
||||||
# For FVP Base first partition is empty to keep compatibility with disk.img
|
|
||||||
part --label empty --source empty --ondisk sda --size="1M" --system-id 8e --align 1024
|
|
||||||
|
|
||||||
# Second partition is rootfs normally populated as /dev/vda2
|
|
||||||
part / --source rootfs --ondisk sda --fstype=ext4 --label root --align 1024
|
|
||||||
|
|
||||||
# Third partition to accomodate guests images normally populated as /dev/vda3 (used by XENGUEST_MANAGER_VOLUME_DEVICE)
|
|
||||||
part --label guests --source empty --ondisk sda --size="${GUEST_PART_SIZE}${GUEST_PART_SIZE_UNIT}" --system-id 8e --align 1024
|
|
||||||
|
|
||||||
# Fourth partition is user defined entry normally populated as /dev/vda4
|
|
||||||
${AUTONOMY_HOST_EXTRA_PARTITION}
|
|
||||||
|
|
||||||
bootloader --ptable msdos
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
# can directly dd to boot media. Uses a custom grub.cfg file to configure the boot.
|
# can directly dd to boot media. Uses a custom grub.cfg file to configure the boot.
|
||||||
|
|
||||||
# First boot partition normally populated as /dev/sda1
|
# First boot partition normally populated as /dev/sda1
|
||||||
part /boot --source bootimg-efi --sourceparams="loader=grub-efi" --ondisk sda --size="${BOOT_PART_SIZE}${BOOT_PART_SIZE_UNIT}" --label msdos --active --align 1024
|
part /boot --source bootimg-efi --sourceparams="loader=grub-efi" --ondisk sda --label msdos --active --align 1024
|
||||||
|
|
||||||
# Second rootfs partition normally populated as /dev/sda2
|
# Second rootfs partition normally populated as /dev/sda2
|
||||||
part / --source rootfs --ondisk sda --fstype=ext4 --label root --align 1024
|
part / --source rootfs --ondisk sda --fstype=ext4 --label root --align 1024
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
set term="vt100"
|
|
||||||
set default="3"
|
|
||||||
set timeout="5"
|
|
||||||
|
|
||||||
source $prefix/arm-autonomy-n1sdp-grub.cfg
|
|
||||||
|
|
||||||
menuentry 'N1SDP PREEMPT_RT ACPI Boot' {
|
|
||||||
linux /Image-preempt-rt $kernel_cmdline acpi=force
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'N1SDP PREEMPT_RT Single-Chip Boot (Device Tree)' {
|
|
||||||
devicetree /n1sdp-single-chip.dtb
|
|
||||||
linux /Image-preempt-rt $kernel_cmdline
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'N1SDP PREEMPT_RT Multi-Chip Boot (Device Tree)' {
|
|
||||||
devicetree /n1sdp-multi-chip.dtb
|
|
||||||
linux /Image-preempt-rt $kernel_cmdline
|
|
||||||
}
|
|
||||||
|
|
||||||
menuentry 'N1SDP PREEMPT_RT Arm Autonomy (Xen) Single-Chip Boot (Device Tree)' {
|
|
||||||
# no_argumants under here is a workaround for a bug
|
|
||||||
# also any kernel or dom0 cmdline arguments has to be passed via dtb
|
|
||||||
# because any arguments put here will be ignored by xen
|
|
||||||
xen_hypervisor /xen.efi no_arguments=use_dtb_for_xen_or_kernel_cmdline
|
|
||||||
xen_module /Image-preempt-rt
|
|
||||||
devicetree /n1sdp-single-chip-xen.dtb
|
|
||||||
}
|
|
||||||
File renamed without changes.
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# When booting gem5-arm64 with Xen we need to set the cpu as Cortex A53 and
|
# When booting gem5-arm64 with Xen we need to set the cpu as Cortex A53 and
|
||||||
# remove support for pointer authentification
|
# remove support for pointer authentification
|
||||||
GEM5_RUN_EXTRA_append = " \
|
GEM5_RUN_EXTRA_append = " \
|
||||||
${@bb.utils.contains('DISTRO_FEATURES_NATIVE', 'xen', \
|
${@bb.utils.contains('DISTRO_FEATURES_NATIVE', 'arm-autonomy-host', \
|
||||||
'--param=system.cpu_cluster[0].cpus[0].isa[0].midr=0x410fd030 \
|
'--param=system.cpu_cluster[0].cpus[0].isa[0].midr=0x410fd030 \
|
||||||
--param=system.cpu_cluster[0].cpus[0].isa[0].id_aa64isar1_el1=0x0', \
|
--param=system.cpu_cluster[0].cpus[0].isa[0].id_aa64isar1_el1=0x0', \
|
||||||
'', d)}"
|
'', d)}"
|
||||||
File renamed without changes.
File renamed without changes.
+1
@@ -0,0 +1 @@
|
|||||||
|
XENGUEST_NETWORK_BRIDGE_MEMBERS_gem5-arm64 ?= "eth0"
|
||||||
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,15 @@
|
|||||||
|
FILESEXTRAPATHS_prepend_gem5-arm64 := "${THISDIR}:"
|
||||||
|
|
||||||
|
#
|
||||||
|
# arm-autonomy kmeta extra
|
||||||
|
#
|
||||||
|
SRC_URI_append_gem5-arm64 = " file://arm-autonomy-kmeta-extra-gem5;type=kmeta;name=arm-autonomy-kmeta-extra-gem5;destsuffix=arm-autonomy-kmeta-extra-gem5"
|
||||||
|
|
||||||
|
# We need to turn off SVE support in the Linux kernel otherwise Xen is stopping
|
||||||
|
# Linux kernel with a coredump while trying to access XEN bit of CPACR1 core
|
||||||
|
# register.
|
||||||
|
LINUX_ARM_AUTONOMY_DISABLE_ARM64_SVE_gem5-arm64 = "${@bb.utils.contains_any('DISTRO_FEATURES', \
|
||||||
|
'arm-autonomy-host arm-autonomy-guest', \
|
||||||
|
' features/arm-autonomy/disable-arm64-sve.scc','',d)}"
|
||||||
|
|
||||||
|
KERNEL_FEATURES_append_gem5-arm64 = "${LINUX_ARM_AUTONOMY_DISABLE_ARM64_SVE}"
|
||||||
@@ -1 +1 @@
|
|||||||
GRUB_BUILDIN += "${@bb.utils.contains('DISTRO_FEATURES', 'arm-autonomy-host', 'xen_boot', '', d)}"
|
GRUB_BUILDIN += "${@bb.utils.contains('DISTRO_FEATURES', 'xen', 'xen_boot', '', d)}"
|
||||||
File renamed without changes.
File renamed without changes.
-70
@@ -1,70 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
INSTALL_DIR="###CONTAINERS_INSTALL_DIR###"
|
|
||||||
MANIFEST="${INSTALL_DIR}/###CONTAINERS_MANIFEST###"
|
|
||||||
|
|
||||||
INIT_DIR="/etc/init.d"
|
|
||||||
DOCKER_INIT="docker.init"
|
|
||||||
|
|
||||||
find_docker_init() {
|
|
||||||
if [ -f "$INIT_DIR/$DOCKER_INIT" ]; then
|
|
||||||
$INIT_DIR/$DOCKER_INIT "start"
|
|
||||||
else
|
|
||||||
echo "ERROR: Couldn't find docker init script! ($INIT_DIR/$DOCKER_INIT)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
is_docker_started() {
|
|
||||||
if ! docker info > /dev/null 2>&1; then
|
|
||||||
find_docker_init
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
check_manifest() {
|
|
||||||
if [ ! -f ${MANIFEST} ]; then
|
|
||||||
echo "No manifest found!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
has_docker_image() {
|
|
||||||
docker image inspect "$1" >/dev/null 2>&1
|
|
||||||
}
|
|
||||||
|
|
||||||
start() {
|
|
||||||
check_manifest
|
|
||||||
is_docker_started
|
|
||||||
|
|
||||||
while read -r archive name tag keep _; do
|
|
||||||
|
|
||||||
CONTAINER_IMAGE_NAME_AND_TAG="${name}:${tag}"
|
|
||||||
|
|
||||||
# Image does not exist and image file exists: Import the image.
|
|
||||||
if ! has_docker_image "${CONTAINER_IMAGE_NAME_AND_TAG}" && \
|
|
||||||
[ -f "${INSTALL_DIR}/${archive}" ]; then
|
|
||||||
echo "Importing ${CONTAINER_IMAGE_NAME_AND_TAG} container image..."
|
|
||||||
docker import "${INSTALL_DIR}/${archive}" \
|
|
||||||
"${CONTAINER_IMAGE_NAME_AND_TAG}" 2>&1 || {
|
|
||||||
echo "Import ${CONTAINER_IMAGE_NAME_AND_TAG} container image: Failed."
|
|
||||||
exit $?
|
|
||||||
}
|
|
||||||
echo "Import ${CONTAINER_IMAGE_NAME_AND_TAG} container image: Done."
|
|
||||||
|
|
||||||
if [ "${keep}" != "1" ]; then
|
|
||||||
rm "${INSTALL_DIR}/${archive}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done < ${MANIFEST}
|
|
||||||
}
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
start)
|
|
||||||
start && exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: $0 {start}"
|
|
||||||
exit 2
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit $?
|
|
||||||
-36
@@ -1,36 +0,0 @@
|
|||||||
#
|
|
||||||
# This recipe adds an init script to import the containers added by
|
|
||||||
# docker_extern_containers.bbclass at boot time
|
|
||||||
# Notes:
|
|
||||||
# docker_extern_containers.bbclass creates a manifest file which contains
|
|
||||||
# the columns: archive name tag keep
|
|
||||||
# for each container. This file is read by the import_containers
|
|
||||||
# script to determine the parameters of the import
|
|
||||||
#
|
|
||||||
# Since the script needs knowledge of the values of $CONTAINERS_INSTALL_DIR
|
|
||||||
# and $CONTAINERS_MANIFEST these are substituted for placeholder strings when
|
|
||||||
# the script is installed.
|
|
||||||
|
|
||||||
DESCRIPTION = "Add init script to import docker images at boot"
|
|
||||||
LICENSE = "MIT"
|
|
||||||
|
|
||||||
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
|
||||||
|
|
||||||
inherit docker_extern_containers
|
|
||||||
|
|
||||||
SRC_URI = "file://import_containers.sh"
|
|
||||||
|
|
||||||
inherit update-rc.d
|
|
||||||
INITSCRIPT_PARAMS = "start 30 2 3 4 5 ."
|
|
||||||
INITSCRIPT_NAME = "import_containers.sh"
|
|
||||||
|
|
||||||
S = "${WORKDIR}"
|
|
||||||
do_install_append() {
|
|
||||||
install -d ${D}${sysconfdir}/init.d
|
|
||||||
install -m 755 import_containers.sh ${D}${sysconfdir}/init.d
|
|
||||||
|
|
||||||
sed -i "s,###CONTAINERS_INSTALL_DIR###,${CONTAINERS_INSTALL_DIR}," \
|
|
||||||
${D}${sysconfdir}/init.d/import_containers.sh
|
|
||||||
sed -i "s,###CONTAINERS_MANIFEST###,${CONTAINERS_MANIFEST}," \
|
|
||||||
${D}${sysconfdir}/init.d/import_containers.sh
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
CONFIG_FEATURE_TAR_LONG_OPTIONS=y
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
|
|
||||||
|
|
||||||
# The --exclude flag in Busybox tar is required by xenguest-mkimage
|
|
||||||
SRC_URI += "file://feature_tar_long_options.cfg"
|
|
||||||
@@ -1,16 +1,36 @@
|
|||||||
# Recipe to create a minimal Arm Autonomy reference stack host image
|
# Recipe to create a minimal Arm Autonomy stack host image
|
||||||
|
|
||||||
DESCRIPTION = "Arm Autonomy stack host minimal image"
|
DESCRIPTION = "Arm Autonomy stack host minimal image"
|
||||||
|
|
||||||
# When alternate-kernel DISTRO_FEATURE is present we will build
|
inherit core-image
|
||||||
# and install the alternate kernel
|
|
||||||
inherit ${@bb.utils.filter('DISTRO_FEATURES', 'alternate-kernel', d)}
|
|
||||||
|
|
||||||
inherit core-image features_check
|
|
||||||
|
|
||||||
LICENSE = "MIT"
|
LICENSE = "MIT"
|
||||||
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
||||||
|
|
||||||
|
# The ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS variable can be used to include in the
|
||||||
|
# image one or several xenguest images.
|
||||||
|
# The list must be space separated and each entry must have the following
|
||||||
|
# format: URL[;guestname=NAME]
|
||||||
|
# - URL can be the full path to a file or a Yocto compatible SRC_URI url
|
||||||
|
# - guestname=NAME can be used to specify the name of the guest. If not
|
||||||
|
# specified the basename of the file (without .xenguest extension) is used.
|
||||||
|
# Here are examples of values:
|
||||||
|
# /home/mydir/myguest.xenguest;guestname=guest1
|
||||||
|
# http://www.url.com/testguest.xenguest
|
||||||
|
#
|
||||||
|
# If you are using the output of an other Yocto project, you should use the
|
||||||
|
# full path syntax instead of the Yocto SRC_URI to be able to use the
|
||||||
|
# symlink version of your image (as the real file has a new name on each
|
||||||
|
# build as it includes the date). You must not use SRC_URI type file:// as
|
||||||
|
# it will try to include the symlink and not the destination file which will
|
||||||
|
# be detected by the recipe and output an error 'Guest file is a symlink'.
|
||||||
|
#
|
||||||
|
# Guests can also be added using a bbapend to this recipe by adding entries
|
||||||
|
# to SRC_URI with parameter ;guestname=NAME to specify the destination
|
||||||
|
# guestname. The parameter guestname must be present as it is used to detect
|
||||||
|
# guests to be added
|
||||||
|
ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS ??= ""
|
||||||
|
|
||||||
# Includes minimal set required to start and manage guest. The xen specific
|
# Includes minimal set required to start and manage guest. The xen specific
|
||||||
# modules are not explicitly included as they are built as part of the kernel
|
# modules are not explicitly included as they are built as part of the kernel
|
||||||
# image for performance reasons. It doesn't include all kernel modules to
|
# image for performance reasons. It doesn't include all kernel modules to
|
||||||
@@ -20,7 +40,6 @@ IMAGE_INSTALL += " \
|
|||||||
packagegroup-core-boot \
|
packagegroup-core-boot \
|
||||||
packagegroup-core-ssh-openssh \
|
packagegroup-core-ssh-openssh \
|
||||||
qemu-system-i386 \
|
qemu-system-i386 \
|
||||||
xenguest-extern-guests \
|
|
||||||
xenguest-manager \
|
xenguest-manager \
|
||||||
xenguest-network \
|
xenguest-network \
|
||||||
"
|
"
|
||||||
@@ -31,5 +50,96 @@ EXTRA_IMAGEDEPENDS += "xen"
|
|||||||
# Build xen-devicetree to produce a xen ready devicetree
|
# Build xen-devicetree to produce a xen ready devicetree
|
||||||
EXTRA_IMAGEDEPENDS += "xen-devicetree"
|
EXTRA_IMAGEDEPENDS += "xen-devicetree"
|
||||||
|
|
||||||
REQUIRED_DISTRO_FEATURES += 'arm-autonomy-host'
|
# Documentation for setting up a multiconfig build can be found in:
|
||||||
REQUIRED_DISTRO_FEATURES += 'xen'
|
# meta-arm-autonomy/documentation/arm-autonomy-multiconfig.md
|
||||||
|
|
||||||
|
# In a multiconfig build this variable will hold a dependency string, which differs based
|
||||||
|
# on whether the guest has initramfs or not.
|
||||||
|
# It may have a space seperated list of dependency strings if mulitple guest types are
|
||||||
|
# configured
|
||||||
|
MC_DOIMAGE_MCDEPENDS ?= ""
|
||||||
|
# Example value: mc:host:guest:core-image-minimal:do_image_complete
|
||||||
|
|
||||||
|
# In a multiconfig build the host task 'do_image' has a dependency on multiconfig guest.
|
||||||
|
# This ensures that the guest image file already exists when it is needed by the host
|
||||||
|
DO_IMAGE_MCDEPENDS := "${@ '${MC_DOIMAGE_MCDEPENDS}' if d.getVar('BBMULTICONFIG') else ''}"
|
||||||
|
|
||||||
|
# Apply mc dependency. Empty string if multiconfig not enabled
|
||||||
|
do_image[mcdepends] += "${DO_IMAGE_MCDEPENDS}"
|
||||||
|
|
||||||
|
|
||||||
|
python __anonymous() {
|
||||||
|
if bb.utils.contains('DISTRO_FEATURES', 'arm-autonomy-host', False, True, d):
|
||||||
|
raise bb.parse.SkipRecipe("DISTRO_FEATURES does not contain 'arm-autonomy-host'")
|
||||||
|
|
||||||
|
if bb.utils.contains('DISTRO_FEATURES', 'xen', False, True, d):
|
||||||
|
raise bb.parse.SkipRecipe("DISTRO_FEATURES does not contain 'xen'")
|
||||||
|
|
||||||
|
# Check in ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS for extra guests and add them
|
||||||
|
# to SRC_URI with xenguest parameter if not set
|
||||||
|
guestlist = d.getVar('ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS')
|
||||||
|
if guestlist:
|
||||||
|
for guest in guestlist.split():
|
||||||
|
# If the user just specified a file instead of file://FILE, add
|
||||||
|
# the file:// prefix
|
||||||
|
if guest.startswith('/'):
|
||||||
|
guestfile = ''
|
||||||
|
guestname = ''
|
||||||
|
if ';guestname=' in guest:
|
||||||
|
# user specified a guestname
|
||||||
|
guestname = guest.split(';guestname=')[1]
|
||||||
|
guestfile = guest.split(';guestname=')[0]
|
||||||
|
else:
|
||||||
|
# no guestname so use the basename
|
||||||
|
guestname = os.path.basename(guest)
|
||||||
|
guestfile = guest
|
||||||
|
# in case we have a link we need the destination
|
||||||
|
guestfile = os.path.realpath(guestfile)
|
||||||
|
|
||||||
|
# make sure the file exist to give a meaningfull error
|
||||||
|
if not os.path.exists(guestfile):
|
||||||
|
raise bb.parse.SkipRecipe("ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS entry does not exist: " + guest)
|
||||||
|
|
||||||
|
# In case the file is a symlink make sure we use the destination
|
||||||
|
d.appendVar('SRC_URI', ' file://' + guestfile + ';guestname=' + guestname)
|
||||||
|
else:
|
||||||
|
# we have a Yocto URL
|
||||||
|
try:
|
||||||
|
_, _, path, _, _, parm = bb.fetch.decodeurl(guest)
|
||||||
|
# force guestname param in if not already there
|
||||||
|
if not 'guestname' in parm:
|
||||||
|
guest += ';guestname=' + os.path.basename(path)
|
||||||
|
d.appendVar('SRC_URI', ' ' + guest)
|
||||||
|
except:
|
||||||
|
raise bb.parse.SkipRecipe("ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS contains an invalid entry: " + guest)
|
||||||
|
}
|
||||||
|
|
||||||
|
python add_extern_guests () {
|
||||||
|
# Destination directory on the rootfs
|
||||||
|
guestdir = d.getVar('IMAGE_ROOTFS') + d.getVar('datadir') + '/guests'
|
||||||
|
|
||||||
|
# Parse SRC_URI for files with ;guestname= parameter
|
||||||
|
src_uri = d.getVar('SRC_URI')
|
||||||
|
for entry in src_uri.split():
|
||||||
|
_, _, path, _, _, parm = bb.fetch.decodeurl(entry)
|
||||||
|
if 'guestname' in parm:
|
||||||
|
if os.path.islink(path):
|
||||||
|
realpath = os.path.realpath(path)
|
||||||
|
|
||||||
|
if not os.path.exists(realpath):
|
||||||
|
bb.fatal("ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS link does not resolve: " + path)
|
||||||
|
|
||||||
|
bb.note("Guest file is a symlink:\n " + path + "\nResolved to:\n " + realpath)
|
||||||
|
path = realpath
|
||||||
|
|
||||||
|
bb.utils.mkdirhier(guestdir)
|
||||||
|
dstname = parm['guestname']
|
||||||
|
# Add file extension if not there
|
||||||
|
if not dstname.endswith('.xenguest'):
|
||||||
|
dstname += '.xenguest'
|
||||||
|
if not bb.utils.copyfile(path, guestdir + '/' + dstname):
|
||||||
|
bb.fatal("Fail to copy Guest file " + path)
|
||||||
|
}
|
||||||
|
|
||||||
|
IMAGE_PREPROCESS_COMMAND += "add_extern_guests; "
|
||||||
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
# Use OVERRIDES to minimize the usage of
|
# Use OVERRIDES to minimize the usage of
|
||||||
# ${@bb.utils.contains('DISTRO_FEATURES', 'arm-autonomy-host', ...
|
# ${@bb.utils.contains('DISTRO_FEATURES', 'xen', ...
|
||||||
OVERRIDES_append = "${@bb.utils.contains('DISTRO_FEATURES', 'arm-autonomy-host', ':autonomy-host', '', d)}"
|
OVERRIDES_append = "${@bb.utils.contains('DISTRO_FEATURES', 'xen', ':xen', '', d)}"
|
||||||
|
|
||||||
# For Xen we only need the i386 binaries
|
# For Xen we only need the i386 binaries
|
||||||
QEMU_TARGETS_autonomy-host = "i386"
|
QEMU_TARGETS_xen = "i386"
|
||||||
|
|
||||||
PACKAGECONFIG[noaudio] = "--audio-drv-list='',,"
|
PACKAGECONFIG[noaudio] = "--audio-drv-list='',,"
|
||||||
PACKAGECONFIG_append_autonomy-host = " noaudio"
|
PACKAGECONFIG_append_xen = " noaudio"
|
||||||
PACKAGECONFIG_remove_autonomy-host = "fdt sdl kvm"
|
PACKAGECONFIG_remove_xen = "fdt sdl kvm"
|
||||||
|
|
||||||
require ${@bb.utils.contains('DISTRO_FEATURES', 'arm-autonomy-host', 'recipes-devtools/qemu/${BPN}-package-split.inc', '', d)}
|
require ${@bb.utils.contains('DISTRO_FEATURES', 'xen', 'recipes-devtools/qemu/${BPN}-package-split.inc', '', d)}
|
||||||
@@ -12,54 +12,29 @@ S = "${WORKDIR}"
|
|||||||
|
|
||||||
DESCRIPTION = "Add entries in DTB for Xen and Dom0"
|
DESCRIPTION = "Add entries in DTB for Xen and Dom0"
|
||||||
|
|
||||||
# Please refer to documentation/xen-devicetree.md for documentation on these
|
# Please refer to documentation/xen-devicetree.md for documentation on those
|
||||||
# customizable parameters
|
# parameters
|
||||||
# kernel size is passed to xen via xen.dtb so we need to add
|
# kernel size is passed to xen via xen.dtb so wee need to add
|
||||||
# 'virtual/kernel:do_deploy' as a dependency
|
# 'virtual/kernel:do_deploy' as a dependency
|
||||||
XEN_DEVICETREE_DEPEND_append = " virtual/kernel:do_deploy"
|
XEN_DEVICETREE_DEPEND_append = " virtual/kernel:do_deploy"
|
||||||
XEN_DEVICETREE_DTBS ?= "${KERNEL_DEVICETREE}"
|
XEN_DEVICETREE_DTBS ?= "${KERNEL_DEVICETREE}"
|
||||||
XEN_DEVICETREE_XEN_BOOTARGS ?= "noreboot dom0_mem=${XEN_DEVICETREE_DOM0_MEM}"
|
XEN_DEVICETREE_XEN_BOOTARGS ?= "noreboot dom0_mem=${XEN_DEVICETREE_DOM0_MEM}"
|
||||||
XEN_DEVICETREE_DOM0_MEM ?= "1024M,max:1024M"
|
XEN_DEVICETREE_DOM0_MEM ?= "1024M"
|
||||||
XEN_DEVICETREE_DOM0_BOOTARGS ?= "console=hvc0 earlycon=xen"
|
XEN_DEVICETREE_DOM0_BOOTARGS ?= "console=hvc0 earlycon=xen"
|
||||||
XEN_DEVICETREE_DOM0_ADDR ?= "0x80080000"
|
XEN_DEVICETREE_DOM0_ADDR ?= "0x80080000"
|
||||||
XEN_DEVICETREE_DOM0_SIZE ?= "0x01000000"
|
XEN_DEVICETREE_DOM0_SIZE ?= "0x01000000"
|
||||||
XEN_DEVICETREE_DTSI_MERGE ?= "xen.dtsi"
|
XEN_DEVICETREE_DTSI_MERGE ?= "xen.dtsi"
|
||||||
|
|
||||||
# Our package does not generate any packages for the rootfs, but instead
|
# Our package does not generate any package for the rootfs but contributes to
|
||||||
# contributes to deploy
|
# deploy
|
||||||
inherit nopackages deploy
|
inherit nopackages deploy
|
||||||
|
|
||||||
DEPENDS += "dtc-native"
|
DEPENDS += "dtc-native"
|
||||||
PACKAGE_ARCH = "${MACHINE_ARCH}"
|
|
||||||
|
|
||||||
do_configure[noexec] = "1"
|
do_configure[noexec] = "1"
|
||||||
do_compile[noexec] = "1"
|
do_compile[noexec] = "1"
|
||||||
do_install[noexec] = "1"
|
do_install[noexec] = "1"
|
||||||
|
|
||||||
# Validate xen devicetree variables
|
|
||||||
python __anonymous() {
|
|
||||||
|
|
||||||
# Compare values of a list of variables to a regex pattern
|
|
||||||
def validate_type(pattern, var_list):
|
|
||||||
for varname in var_list:
|
|
||||||
if d.getVar(varname):
|
|
||||||
if not pattern.match(d.getVar(varname)):
|
|
||||||
raise bb.parse.SkipRecipe(d.getVar(varname) + "' is not a valid value for " + varname + "!")
|
|
||||||
else:
|
|
||||||
raise bb.parse.SkipRecipe('Required variable ' + varname + ' is empty!')
|
|
||||||
|
|
||||||
import re
|
|
||||||
|
|
||||||
num_vars_to_check = ['XEN_DEVICETREE_DOM0_ADDR', 'XEN_DEVICETREE_DOM0_SIZE']
|
|
||||||
size_vars_to_check = ['XEN_DEVICETREE_DOM0_MEM']
|
|
||||||
|
|
||||||
num_pattern = re.compile(r'((0x[0-9a-fA-F]+)|[0-9]+)$')
|
|
||||||
size_pattern = re.compile(r'[0-9]+[MG](,max:[0-9]+[MG])?$')
|
|
||||||
|
|
||||||
validate_type(num_pattern, num_vars_to_check)
|
|
||||||
validate_type(size_pattern, size_vars_to_check)
|
|
||||||
}
|
|
||||||
|
|
||||||
do_deploy() {
|
do_deploy() {
|
||||||
if [ ! -f ${WORKDIR}/xen.dtsi.in ]; then
|
if [ ! -f ${WORKDIR}/xen.dtsi.in ]; then
|
||||||
die "xen.dtsi.in does not exist"
|
die "xen.dtsi.in does not exist"
|
||||||
@@ -113,18 +88,14 @@ python calc_xen_dtb_dom0_size() {
|
|||||||
bb.note('size in bytes: %d' % size)
|
bb.note('size in bytes: %d' % size)
|
||||||
# Ceil to MiB
|
# Ceil to MiB
|
||||||
size_required = ceil(size / (2 ** 20)) * (2 ** 20)
|
size_required = ceil(size / (2 ** 20)) * (2 ** 20)
|
||||||
xen_devicetree_dom0_size = d.getVar('XEN_DEVICETREE_DOM0_SIZE')
|
size_defined = int(d.getVar('XEN_DEVICETREE_DOM0_SIZE'), 16)
|
||||||
if xen_devicetree_dom0_size[:2] == "0x":
|
|
||||||
size_defined = int(xen_devicetree_dom0_size, 16)
|
|
||||||
else:
|
|
||||||
size_defined = int(xen_devicetree_dom0_size)
|
|
||||||
|
|
||||||
if size_required > size_defined:
|
if size_required > size_defined:
|
||||||
bb.note ("Wrong kernel size setting inside xen dtb!\n"\
|
bb.warn ("Wrong kernel size setting inside xen dtb!\n"\
|
||||||
"Required:\t%(req)d (%(req)#010X)\n"\
|
"Required:\t%(req)d (%(req)#010X)\n"\
|
||||||
"Requested:\t%(def)d (%(def)#010X)"\
|
"Requested:\t%(def)d (%(def)#010X)"\
|
||||||
% {"req": size_required, "def": size_defined})
|
% {"req": size_required, "def": size_defined})
|
||||||
bb.note ("Overriding XEN_DEVICETREE_DOM0_SIZE with "\
|
bb.warn ("Overriding XEN_DEVICETREE_DOM0_SIZE with "\
|
||||||
"%(req)d (%(req)#010X)" % {"req": size_required})
|
"%(req)d (%(req)#010X)" % {"req": size_required})
|
||||||
d.setVar('XEN_DEVICETREE_DOM0_SIZE', hex(size_required))
|
d.setVar('XEN_DEVICETREE_DOM0_SIZE', hex(size_required))
|
||||||
}
|
}
|
||||||
File renamed without changes.
@@ -1,3 +1,8 @@
|
|||||||
|
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
|
||||||
|
|
||||||
|
SRC_URI += "file://0001-vif-nat-fix-hostname.patch \
|
||||||
|
"
|
||||||
|
|
||||||
PACKAGECONFIG_remove = "\
|
PACKAGECONFIG_remove = "\
|
||||||
${@bb.utils.contains('DISTRO_FEATURES', \
|
${@bb.utils.contains('DISTRO_FEATURES', \
|
||||||
'arm-autonomy-host', \
|
'arm-autonomy-host', \
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-4.14:"
|
|
||||||
|
|
||||||
SRC_URI += "file://0001-vif-nat-fix-hostname.patch \
|
|
||||||
"
|
|
||||||
@@ -22,7 +22,7 @@ case "$1" in
|
|||||||
*)
|
*)
|
||||||
# do not advertise unreasonable commands that there is no reason
|
# do not advertise unreasonable commands that there is no reason
|
||||||
# to use with this device
|
# to use with this device
|
||||||
echo "Usage: $0 {start|stop|status|restart|force-reload}"
|
echo $"Usage: $0 {start|stop|status|restart|force-reload}"
|
||||||
exit 1
|
exit 1
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
/var/log/xenguest {
|
|
||||||
missingok
|
|
||||||
size 10k
|
|
||||||
copytruncate
|
|
||||||
rotate 2
|
|
||||||
}
|
|
||||||
@@ -10,17 +10,12 @@ BRIDGE_NAME="###BRIDGE_NAME###"
|
|||||||
|
|
||||||
case "${XENGUEST_NETWORK_TYPE:=}" in
|
case "${XENGUEST_NETWORK_TYPE:=}" in
|
||||||
nat)
|
nat)
|
||||||
echo "vif = ['script=vif-nat']" >> "${guestcfgfile:?}"
|
echo "vif = ['script=vif-nat']" >> ${guestcfgfile}
|
||||||
log info "Network type is NAT"
|
|
||||||
;;
|
;;
|
||||||
bridge)
|
bridge)
|
||||||
echo "vif = ['script=vif-bridge,bridge=${BRIDGE_NAME}']" >> "${guestcfgfile:?}"
|
echo "vif = ['script=vif-bridge,bridge=${BRIDGE_NAME}']" >> ${guestcfgfile}
|
||||||
log info "Network type is bridge: ${BRIDGE_NAME}"
|
|
||||||
;;
|
|
||||||
none)
|
|
||||||
log info "Network type is none"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
log error "XENGUEST_NETWORK_TYPE=$XENGUEST_NETWORK_TYPE invalid"
|
echo "${@}: XENGUEST_NETWORK_TYPE=$XENGUEST_NETWORK_TYPE invalid"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -25,19 +25,19 @@ case "$1" in
|
|||||||
echo "Starting xenguest"
|
echo "Starting xenguest"
|
||||||
|
|
||||||
# Create unconfigured guests
|
# Create unconfigured guests
|
||||||
if [ -d "${XENGUEST_GUEST_DIR}" ]; then
|
if [ -d ${XENGUEST_GUEST_DIR} ]; then
|
||||||
shopt -s nullglob
|
for f in $(find ${XENGUEST_GUEST_DIR} -name "*.xenguest" \
|
||||||
for path in "${XENGUEST_GUEST_DIR}"/*.xenguest; do
|
-exec basename {} .xenguest \;); do
|
||||||
f=$(basename "${path}" .xenguest)
|
if [ ! -f ${XENGUEST_CONF_BASE}/guests/${f}/guest.cfg ]; then
|
||||||
if [ ! -f "${XENGUEST_CONF_BASE}/guests/${f}/guest.cfg" ]; then
|
|
||||||
# Check if this guest should be auto booted
|
# Check if this guest should be auto booted
|
||||||
autoboot=$(/usr/bin/xenguest-mkimage dump-paramsconfig \
|
autoboot=$(/usr/bin/xenguest-mkimage dump-paramsconfig \
|
||||||
"${path}" | \
|
${XENGUEST_GUEST_DIR}/${f}.xenguest | \
|
||||||
grep GUEST_AUTOBOOT | sed -e "s,.*=,," | tr -d '"')
|
grep GUEST_AUTOBOOT | sed -e "s,.*=,," | tr -d '"')
|
||||||
if [ "$autoboot" = "0" ]; then
|
if [ "$autoboot" = "0" ]; then
|
||||||
echo "Do not create $f, autoboot disabled"
|
echo "Do not create $f, autoboot disabled"
|
||||||
else
|
else
|
||||||
/usr/bin/xenguest-manager create "${path}"
|
/usr/bin/xenguest-manager create \
|
||||||
|
${XENGUEST_GUEST_DIR}/${f}.xenguest
|
||||||
# Update guestlist
|
# Update guestlist
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
guestlist="${guestlist} ${f}"
|
guestlist="${guestlist} ${f}"
|
||||||
@@ -49,11 +49,11 @@ case "$1" in
|
|||||||
if [ -n "${guestlist}" ]; then
|
if [ -n "${guestlist}" ]; then
|
||||||
for f in ${guestlist}; do
|
for f in ${guestlist}; do
|
||||||
GUEST_AUTOBOOT="1"
|
GUEST_AUTOBOOT="1"
|
||||||
if [ -f "${XENGUEST_CONF_BASE}/guests/${f}/params.cfg" ]; then
|
if [ -f ${XENGUEST_CONF_BASE}/guests/${f}/params.cfg ]; then
|
||||||
source "${XENGUEST_CONF_BASE}/guests/${f}/params.cfg"
|
source ${XENGUEST_CONF_BASE}/guests/${f}/params.cfg
|
||||||
fi
|
fi
|
||||||
if [ "${GUEST_AUTOBOOT}" = "1" ]; then
|
if [ "${GUEST_AUTOBOOT}" = "1" ]; then
|
||||||
/usr/bin/xenguest-manager start "${f}"
|
/usr/bin/xenguest-manager start ${f}
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
@@ -66,9 +66,9 @@ case "$1" in
|
|||||||
stop)
|
stop)
|
||||||
echo "Stopping xenguest"
|
echo "Stopping xenguest"
|
||||||
# update guest list
|
# update guest list
|
||||||
guestlist=$(xenguest-manager status | grep Running | cut -d " " -f1)
|
guestlist=$(xenguest-manager status | grep Running | cut -d ":" -f1)
|
||||||
for f in ${guestlist}; do
|
for f in ${guestlist}; do
|
||||||
xenguest-manager shutdown "${f}" --kill
|
xl shutdown -w ${f} || xl destroy ${f}
|
||||||
done
|
done
|
||||||
;;
|
;;
|
||||||
reload)
|
reload)
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -110,8 +110,7 @@ Init configuration
|
|||||||
|
|
||||||
Disk configuration
|
Disk configuration
|
||||||
--disk-reset-config reset disk guest configuration to default (no disk)
|
--disk-reset-config reset disk guest configuration to default (no disk)
|
||||||
--disk-size=SZ set guest disk size in MB or GB(default),
|
--disk-size=SZ set guest disk size (in GB)
|
||||||
e.g 1000M or 2[G].
|
|
||||||
--disk-device=DEV set device to be used to create the guest disk
|
--disk-device=DEV set device to be used to create the guest disk
|
||||||
if unset or set to an empty string, the volume will be
|
if unset or set to an empty string, the volume will be
|
||||||
create in the default manager volume group.
|
create in the default manager volume group.
|
||||||
@@ -128,7 +127,7 @@ Disk configuration
|
|||||||
--disk-rm-part=ID remove partition ID from the guest disk
|
--disk-rm-part=ID remove partition ID from the guest disk
|
||||||
--disk-add-file=SRC:DST add file SRC as disk file DST in the xenguest image.
|
--disk-add-file=SRC:DST add file SRC as disk file DST in the xenguest image.
|
||||||
DST can then be used as a partition CONTENT.
|
DST can then be used as a partition CONTENT.
|
||||||
--disk-rm-file=DST remove disk file DST from the xenguest image.
|
--disk--rm-file=DST remove disk file DST from the xenguest image.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,159 +370,13 @@ disk_config_rm_part() {
|
|||||||
sed -i "/DISK_PART${partid}=.*/d" ${IMAGE_TMPDIR}/disk.cfg
|
sed -i "/DISK_PART${partid}=.*/d" ${IMAGE_TMPDIR}/disk.cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
is_integer() {
|
|
||||||
if ! [[ "${1}" =~ ^[0-9]+$ ]]; then
|
|
||||||
>&2 echo "error: invalid number '${1}'"; exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# check size and convert it to MB, e.g '1[G]' => '1000M'
|
|
||||||
check_size() {
|
|
||||||
local disksize="${1}"
|
|
||||||
|
|
||||||
[ -n "${disksize}" ] || disksize="invalid"
|
|
||||||
|
|
||||||
# disksize may have appended M or G suffix, let's extract it
|
|
||||||
# ${var:offset:length}, where #var is var length
|
|
||||||
local lastchar="${disksize:${#disksize}-1}"
|
|
||||||
case "${lastchar}" in
|
|
||||||
[0-9])
|
|
||||||
# backwards compatibility
|
|
||||||
is_integer "${disksize}"
|
|
||||||
echo -e "$((${disksize} * 1000))M"
|
|
||||||
return
|
|
||||||
;;
|
|
||||||
G|M)
|
|
||||||
if [ "${#disksize}" -gt "1" ]; then
|
|
||||||
local size="${disksize::${#disksize}-1}"
|
|
||||||
is_integer "${size}"
|
|
||||||
# convert GB to MB
|
|
||||||
[ "${lastchar}" = "M" ] || size=$((${size} * 1000))
|
|
||||||
echo -e "${size}M"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
>&2 echo -e "Invalid size format '${1}'" \
|
|
||||||
"\n\tSupported size format is e.g 1000M or 2[G]"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_config_get_size() {
|
|
||||||
disksize=$(echo -e "$( . ${IMAGE_TMPDIR}/disk.cfg && echo $DISK_SIZE)")
|
|
||||||
check_size "${disksize}"
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_config_get_parts() {
|
|
||||||
echo -e "$( . ${IMAGE_TMPDIR}/disk.cfg && \
|
|
||||||
typeset -p | awk '$3 ~ /^DISK_PART/ { print $3 }')"
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_config_get_free_space() {
|
|
||||||
disk_usage="0"
|
|
||||||
for partinfo in $(disk_config_get_parts)
|
|
||||||
do
|
|
||||||
partsize=$(echo "${partinfo}" | cut -d '"' -f2 | sed -e "s/:.*//")
|
|
||||||
sizeMB=$(check_size "${partsize}")
|
|
||||||
[ -n "${sizeMB}" ] || exit 1
|
|
||||||
disk_usage=$((${sizeMB::${#sizeMB}-1} + $disk_usage))
|
|
||||||
done
|
|
||||||
|
|
||||||
disk_size=$(disk_config_get_size)
|
|
||||||
echo -e "$((${disk_size::${#disk_size}-1} - ${disk_usage}))M"
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_check_partition_format() {
|
|
||||||
local partformat="${1}"
|
|
||||||
# if partformat is not defined let's skip this check
|
|
||||||
[ -n "${partformat}" ] || return 0
|
|
||||||
|
|
||||||
case "${partformat}" in
|
|
||||||
vfat|ext2|ext3|ext4|swap)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# invalid/unknown fstype
|
|
||||||
echo "Invalid file fstype ${partformat}"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_check_partition_content() {
|
|
||||||
local partcontent="${1}"
|
|
||||||
# if partcontent is not defined let's skip this check
|
|
||||||
[ -n "${partcontent}" ] || return 0
|
|
||||||
|
|
||||||
case "${partcontent}" in
|
|
||||||
*.img*)
|
|
||||||
case "${partcontent}" in
|
|
||||||
*.img.gz|*.img.bz2|*.img)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# invalid/unknown compression type
|
|
||||||
echo "Invalid file format in disk ${partcontent}"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.tar*)
|
|
||||||
case "${partcontent}" in
|
|
||||||
*.tar.gz|*.tar.bz2|*.tar.xz|*.tar)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
# invalid/unknown tar type
|
|
||||||
echo "Invalid file format in disk ${partcontent}"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
#invalid content type
|
|
||||||
echo "Unsupported content type ${partcontent}!"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
# do not allow to create multiple partitions the same content
|
|
||||||
if grep ":${partcontent}\"" <<< "$(disk_config_get_parts)"; then
|
|
||||||
echo "Error ${partcontent} is already inside guest image"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_config_add_part() {
|
disk_config_add_part() {
|
||||||
partconf="${1}"
|
partconf="${1}"
|
||||||
partid=$(echo ${partconf} | sed -e "s/:.*//")
|
partid=$(echo ${partconf} | sed -e "s/:.*//")
|
||||||
partinfo=$(echo ${partconf} | sed -e "s/[^:]*://")
|
partinfo=$(echo ${partconf} | sed -e "s/[^:]*://")
|
||||||
partsize=$(echo ${partinfo} | cut -d ":" -f1)
|
|
||||||
partformat=$(echo ${partinfo} | cut -d ":" -f2)
|
|
||||||
partcontent=$(echo ${partinfo} | cut -d ":" -f3)
|
|
||||||
|
|
||||||
# check size "ID:*SIZE*:FORMAT:CONTENT"
|
|
||||||
partsizeMB=$(check_size "${partsize}")
|
|
||||||
|
|
||||||
# Make sure we don't add the same partition twice
|
# Make sure we don't add the same partition twice
|
||||||
disk_config_rm_part "${partid}"
|
disk_config_rm_part ${partid}
|
||||||
|
|
||||||
# check available disk space
|
|
||||||
freespace=$(disk_config_get_free_space)
|
|
||||||
if ((${partsizeMB::${#partsizeMB}-1} > ${freespace::${#freespace}-1}))
|
|
||||||
then
|
|
||||||
echo -e "Not enough free disk space(${freespace}) for partition "\
|
|
||||||
"'${partconf}'!"\
|
|
||||||
"\tTo adjust disk size use '--disk-size' parameter"\
|
|
||||||
"\tor shrink the partition with '--disk-add-part' parameter"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check format "ID:SIZE:*FORMAT*:CONTENT"
|
|
||||||
disk_check_partition_format "${partformat}"
|
|
||||||
|
|
||||||
# check content "ID:SIZE:FORMAT:*CONTENT*"
|
|
||||||
disk_check_partition_content "${partcontent}"
|
|
||||||
|
|
||||||
echo "DISK_PART${partid}=\"${partinfo}\"" >> \
|
echo "DISK_PART${partid}=\"${partinfo}\"" >> \
|
||||||
${IMAGE_TMPDIR}/disk.cfg
|
${IMAGE_TMPDIR}/disk.cfg
|
||||||
}
|
}
|
||||||
@@ -889,13 +742,11 @@ for arg in "${@}"; do
|
|||||||
disk_config_reset
|
disk_config_reset
|
||||||
;;
|
;;
|
||||||
--disk-size=*)
|
--disk-size=*)
|
||||||
size=$(check_size "${optarg}")
|
sed -i "s/DISK_SIZE=.*/DISK_SIZE=\"${optarg}\"/" \
|
||||||
[ -n "size" ] || exit 1
|
|
||||||
sed -i "s/DISK_SIZE=.*/DISK_SIZE=\"${size}\"/" \
|
|
||||||
${IMAGE_TMPDIR}/disk.cfg
|
${IMAGE_TMPDIR}/disk.cfg
|
||||||
;;
|
;;
|
||||||
--disk-device=*)
|
--disk-device=*)
|
||||||
sed -i "s@DISK_DEVICE=.*@DISK_DEVICE=\"${optarg}\"@" \
|
sed -i "s/DISK_DEVICE=.*/DISK_SIZE=\"${optarg}\"/" \
|
||||||
${IMAGE_TMPDIR}/disk.cfg
|
${IMAGE_TMPDIR}/disk.cfg
|
||||||
;;
|
;;
|
||||||
--disk-add-part=*)
|
--disk-add-part=*)
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ case "$1" in
|
|||||||
*)
|
*)
|
||||||
# do not advertise unreasonable commands that there is no reason
|
# do not advertise unreasonable commands that there is no reason
|
||||||
# to use with this device
|
# to use with this device
|
||||||
echo "Usage: $0 {start|stop|status|restart|force-reload}"
|
echo $"Usage: $0 {start|stop|status|restart|force-reload}"
|
||||||
exit 1
|
exit 1
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
@@ -11,20 +11,19 @@ set +u
|
|||||||
#
|
#
|
||||||
|
|
||||||
check_if_vif_is_ready() {
|
check_if_vif_is_ready() {
|
||||||
ret=$(xl network-list "${guestname:?}" | grep "${1}" \
|
ret=($(xl network-list "${guestname}" | grep "${1}"))
|
||||||
| tr -s ' ' | cut -d' ' -f5)
|
# ${ret[4]} is network interface status value
|
||||||
# ${ret} is network interface status value
|
|
||||||
# 1 means vif is not ready
|
# 1 means vif is not ready
|
||||||
# 4 means vif is ready
|
# 4 means vif is ready
|
||||||
[ "${ret}" = "4" ] && return 0
|
[ "${ret[4]}" = "4" ] && return 0
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
case "${XENGUEST_NETWORK_TYPE:-}" in
|
case "${XENGUEST_NETWORK_TYPE:-}" in
|
||||||
nat)
|
nat)
|
||||||
vif_name="$(xl network-list "${guestname:?}" | grep -o "vif.*")"
|
vif_name="$(xl network-list ${guestname} | grep -o vif.*)"
|
||||||
|
|
||||||
for try in $(seq 20)
|
for try in {1..20}
|
||||||
do
|
do
|
||||||
if check_if_vif_is_ready "${vif_name}"; then
|
if check_if_vif_is_ready "${vif_name}"; then
|
||||||
claim_lock "vif-nat-kea"
|
claim_lock "vif-nat-kea"
|
||||||
@@ -32,14 +31,15 @@ case "${XENGUEST_NETWORK_TYPE:-}" in
|
|||||||
release_lock "vif-nat-kea"
|
release_lock "vif-nat-kea"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
log info "Waiting for ${vif_name} - network interface is not ready..."
|
echo "Waiting for ${vif_name} - network interface is not ready..."\
|
||||||
log info "try #${try}"
|
" try #${try}" >> "${LOGFILE}" 2>&1
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
log error "Failed to get ${vif_name}. network interface ready!"
|
echo "ERROR: Failed to get ${vif_name} "\
|
||||||
|
"network interface ready!" >> "${LOGFILE}" 2>&1
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
log verbose "No action needed"
|
echo "No action needed" >> "${LOGFILE}" 2>&1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
# Create a xenguest base image
|
# Create a xenguest base image
|
||||||
#
|
#
|
||||||
# This recipe creates a base image that is then extended by other recipes
|
# This recipe creates a base image that is then extended by other recipes
|
||||||
# through xenguest_image class.
|
# through xenguest-image class.
|
||||||
# xenguest image type uses this recipe as a base to add a kernel and a disk
|
# xenguest image type is using this as base to add a kernel and a disk image
|
||||||
# image to create a guest
|
# to create a guest
|
||||||
#
|
#
|
||||||
# The recipe also adds files in those directories to the xenguest image:
|
# The recipe is also adding files in those directories to the xenguest image:
|
||||||
# - ${WORKDIR}/extend/disk-files: all files in this directory will be added to
|
# - ${WORKDIR}/extend/disk-files: all files in this directory will be added to
|
||||||
# the guest disk files (using --disk-add-file)
|
# the guest disk files (using --disk-add-file)
|
||||||
# - ${WORKDIR}/extend/files: all files in this directory will be added to the
|
# - ${WORKDIR}/extend/files: all files in this directory will be added to the
|
||||||
@@ -72,15 +72,7 @@ XENGUEST_IMAGE_SRC_URI_INIT_POST ??= ""
|
|||||||
|
|
||||||
S = "${WORKDIR}"
|
S = "${WORKDIR}"
|
||||||
|
|
||||||
# Extra vars to add to xenguest.env
|
inherit deploy xenguest-image
|
||||||
XENGUEST_IMAGE_VARS_EXTRA += "\
|
|
||||||
XENGUEST_IMAGE_HOST_PORT XENGUEST_IMAGE_GUEST_PORT \
|
|
||||||
XENGUEST_IMAGE_NAT_PORT_FORWARD_SCRIPT XENGUEST_IMAGE_SRC_URI_DISK_FILES \
|
|
||||||
XENGUEST_IMAGE_SRC_URI_XEN_FILES XENGUEST_IMAGE_SRC_URI_XEN_CONFIG \
|
|
||||||
XENGUEST_IMAGE_SRC_URI_INIT_PRE XENGUEST_IMAGE_SRC_URI_INIT \
|
|
||||||
XENGUEST_IMAGE_SRC_URI_INIT_POST"
|
|
||||||
|
|
||||||
inherit deploy xenguest_image
|
|
||||||
|
|
||||||
# parse XENGUEST_IMAGE_SRC_URI_ variables and add them to SRC_URI
|
# parse XENGUEST_IMAGE_SRC_URI_ variables and add them to SRC_URI
|
||||||
python __anonymous() {
|
python __anonymous() {
|
||||||
|
|||||||
@@ -1,85 +0,0 @@
|
|||||||
# Xenguest Extern Guests
|
|
||||||
#
|
|
||||||
# This recipe installs the extern guest files specified in
|
|
||||||
# ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS into the host image, They are installed
|
|
||||||
# to the directory XENGUEST_MANAGER_GUEST_DIR
|
|
||||||
#
|
|
||||||
# src_uri_parse_var.bbclass is used to parse
|
|
||||||
# ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS and add the guest paths to the SRC_URI
|
|
||||||
# to be fetched and unpacked to ${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}
|
|
||||||
#
|
|
||||||
# Further documentation can be found in documentation/arm-autonomy-quickstart.md,
|
|
||||||
# in the section named "Include guests directly in the host image"
|
|
||||||
|
|
||||||
DESCRIPTION = "Xenguest Extern Guests"
|
|
||||||
LICENSE = "MIT"
|
|
||||||
|
|
||||||
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
|
||||||
|
|
||||||
# Global value of XENGUEST_MANAGER_GUEST_DIR set here
|
|
||||||
require conf/xenguest.conf
|
|
||||||
|
|
||||||
ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS ??= ""
|
|
||||||
|
|
||||||
# Parse the variable ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS for xenguest files,
|
|
||||||
# unpack them to SRC_URI_FROM_VAR_UNPACK_DIR and create a manifest file
|
|
||||||
# containing each of SRC_URI_FROM_VAR_MANIFEST_PARAMS for each entry
|
|
||||||
inherit set_src_uri_from_var
|
|
||||||
SRC_URI_FROM_VAR_NAME = "ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS"
|
|
||||||
SRC_URI_FROM_VAR_MANIFEST_PARAMS= "guestname=[basename] guestcount=1"
|
|
||||||
SRC_URI_FROM_VAR_UNPACK_DIR = "xenguests"
|
|
||||||
|
|
||||||
# Unnecessary tasks
|
|
||||||
do_compile[noexec] = "1"
|
|
||||||
do_configure[noexec] = "1"
|
|
||||||
do_patch[noexec] = "1"
|
|
||||||
|
|
||||||
# Install guest files to XENGUEST_MANAGER_GUEST_DIR
|
|
||||||
do_install() {
|
|
||||||
|
|
||||||
local guestfile guestname guestcount
|
|
||||||
|
|
||||||
if [ -f "${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/manifest" ]; then
|
|
||||||
|
|
||||||
install -d "${D}${XENGUEST_MANAGER_GUEST_DIR}"
|
|
||||||
|
|
||||||
# Iterate over manifest file containing parameters
|
|
||||||
while read -r guestfile guestname guestcount _; do
|
|
||||||
[ -f "${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/${guestfile}" ] ||
|
|
||||||
bbfatal "${guestfile} does not exist"
|
|
||||||
|
|
||||||
install -m 644 \
|
|
||||||
"${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/${guestfile}" \
|
|
||||||
"${D}${XENGUEST_MANAGER_GUEST_DIR}/${guestname}.xenguest"
|
|
||||||
|
|
||||||
# Create symlinks for duplicate guests, appending numbers to
|
|
||||||
# guestname
|
|
||||||
for i in `seq 2 $guestcount`
|
|
||||||
do
|
|
||||||
ln -s -r \
|
|
||||||
"${D}${XENGUEST_MANAGER_GUEST_DIR}/${guestname}.xenguest" \
|
|
||||||
"${D}${XENGUEST_MANAGER_GUEST_DIR}/${guestname}$i.xenguest"
|
|
||||||
done
|
|
||||||
|
|
||||||
done < "${WORKDIR}/${SRC_URI_FROM_VAR_UNPACK_DIR}/manifest"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
do_install[vardeps] += "ARM_AUTONOMY_HOST_IMAGE_EXTERN_GUESTS"
|
|
||||||
|
|
||||||
FILES_${PN} += "${XENGUEST_MANAGER_GUEST_DIR}"
|
|
||||||
|
|
||||||
# In a multiconfig build this variable will hold a dependency string, which
|
|
||||||
# differs based on whether the guest has initramfs or not. It may have a space
|
|
||||||
# seperated list of dependency strings if mulitple guest types are configured
|
|
||||||
MC_DOIMAGE_MCDEPENDS ?= ""
|
|
||||||
# Example value: mc:host:guest:core-image-minimal:do_merge_xenguestenv
|
|
||||||
|
|
||||||
# In a multiconfig build the host task 'do_image' has a dependency on
|
|
||||||
# multiconfig guest. This ensures that the guest image file already exists
|
|
||||||
# when it is needed by the host
|
|
||||||
DO_IMAGE_MCDEPENDS := "${@ '${MC_DOIMAGE_MCDEPENDS}' \
|
|
||||||
if d.getVar('BBMULTICONFIG') else ''}"
|
|
||||||
|
|
||||||
# Apply mc dependency. Empty string if multiconfig not enabled
|
|
||||||
do_fetch[mcdepends] += "${DO_IMAGE_MCDEPENDS}"
|
|
||||||
@@ -1,10 +1,7 @@
|
|||||||
# Xenguest manager recipe
|
# Xenguest manager recipe
|
||||||
#
|
#
|
||||||
# xenguest-manager is a tool to control xen guests (e.g. create, start, stop)
|
# xenguest-manager is a tool to control xen guest (e.g. create, start, stop)
|
||||||
#
|
#
|
||||||
# Usage documentation for the xenguest-manager tool can be found in
|
|
||||||
# meta-arm-autonomy/documentation/xenguest-manager.md including the
|
|
||||||
# customizable bitbake variables.
|
|
||||||
|
|
||||||
DESCRIPTION = "Xen Guest Manager"
|
DESCRIPTION = "Xen Guest Manager"
|
||||||
LICENSE = "MIT"
|
LICENSE = "MIT"
|
||||||
@@ -12,25 +9,23 @@ LICENSE = "MIT"
|
|||||||
SRC_URI = " \
|
SRC_URI = " \
|
||||||
file://xenguest-manager \
|
file://xenguest-manager \
|
||||||
file://xenguest-init \
|
file://xenguest-init \
|
||||||
file://logrotate-xenguest \
|
|
||||||
"
|
"
|
||||||
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
||||||
|
|
||||||
S = "${WORKDIR}"
|
S = "${WORKDIR}"
|
||||||
|
|
||||||
|
# Please refer to documentation/xenguest-manager.md for documentation on those
|
||||||
|
# parameters
|
||||||
XENGUEST_MANAGER_VOLUME_DEVICE ?= "/dev/sda2"
|
XENGUEST_MANAGER_VOLUME_DEVICE ?= "/dev/sda2"
|
||||||
XENGUEST_MANAGER_VOLUME_NAME ?= "vg-xen-$(basename ${XENGUEST_MANAGER_VOLUME_DEVICE})"
|
XENGUEST_MANAGER_VOLUME_NAME ?= "vg-xen"
|
||||||
XENGUEST_MANAGER_LOG_LEVEL ?= "ERROR"
|
XENGUEST_MANAGER_GUEST_DIR ?= "${datadir}/guests/"
|
||||||
#XENGUEST_MANAGER_GUEST_DIR set in xenguest.conf
|
|
||||||
|
|
||||||
require conf/xenguest.conf
|
|
||||||
|
|
||||||
# We add an init script to create and start guests automatically
|
# We add an init script to create and start guests automatically
|
||||||
# run start script after xen-tools and run stop script before xen-tools
|
# run start script after xen-tools and run stop script before xen-tools
|
||||||
INITSCRIPT_NAME = "xenguest"
|
INITSCRIPT_NAME = "xenguest"
|
||||||
INITSCRIPT_PARAMS = "start 90 2 3 4 5 . stop 79 0 1 6 ."
|
INITSCRIPT_PARAMS = "start 90 2 3 4 5 . stop 79 0 1 6 ."
|
||||||
|
|
||||||
inherit allarch update-rc.d
|
inherit update-rc.d
|
||||||
|
|
||||||
do_compile() {
|
do_compile() {
|
||||||
echo "XENGUEST_VOLUME_DEVICE=\"${XENGUEST_MANAGER_VOLUME_DEVICE}\"" > \
|
echo "XENGUEST_VOLUME_DEVICE=\"${XENGUEST_MANAGER_VOLUME_DEVICE}\"" > \
|
||||||
@@ -39,8 +34,6 @@ do_compile() {
|
|||||||
xenguest-manager.conf
|
xenguest-manager.conf
|
||||||
echo "XENGUEST_GUEST_DIR=\"${XENGUEST_MANAGER_GUEST_DIR}\"" >> \
|
echo "XENGUEST_GUEST_DIR=\"${XENGUEST_MANAGER_GUEST_DIR}\"" >> \
|
||||||
xenguest-manager.conf
|
xenguest-manager.conf
|
||||||
echo "XENGUEST_LOG_LEVEL=\"${XENGUEST_MANAGER_LOG_LEVEL}\"" >> \
|
|
||||||
xenguest-manager.conf
|
|
||||||
}
|
}
|
||||||
|
|
||||||
do_install() {
|
do_install() {
|
||||||
@@ -51,13 +44,10 @@ do_install() {
|
|||||||
install -d -m 755 ${D}${sysconfdir}/init.d
|
install -d -m 755 ${D}${sysconfdir}/init.d
|
||||||
install -m 755 xenguest-init ${D}${sysconfdir}/init.d/${INITSCRIPT_NAME}
|
install -m 755 xenguest-init ${D}${sysconfdir}/init.d/${INITSCRIPT_NAME}
|
||||||
install -d -m 755 ${D}${XENGUEST_GUEST_DIR}
|
install -d -m 755 ${D}${XENGUEST_GUEST_DIR}
|
||||||
install -d -m 755 ${D}${sysconfdir}/logrotate.d
|
|
||||||
install -m 644 logrotate-xenguest ${D}${sysconfdir}/logrotate.d/xenguest
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Things that we need on the target
|
# Things that we need on the target
|
||||||
RDEPENDS_${PN} += "bash xenguest-mkimage lvm2 xen-tools parted e2fsprogs \
|
RDEPENDS_${PN} += "bash tar xenguest-mkimage lvm2 xen-tools parted e2fsprogs dosfstools"
|
||||||
dosfstools logrotate"
|
|
||||||
|
|
||||||
FILES_${PN} += "${bindir}/xenguest-manager \
|
FILES_${PN} += "${bindir}/xenguest-manager \
|
||||||
${sysconfdir}/xenguest"
|
${sysconfdir}/xenguest"
|
||||||
@@ -2,11 +2,8 @@
|
|||||||
#
|
#
|
||||||
# xenguest-mkimage is a tool to create/modify images to be used as xen guests
|
# xenguest-mkimage is a tool to create/modify images to be used as xen guests
|
||||||
# Produced images contains a xen configuration and several optional components
|
# Produced images contains a xen configuration and several optional components
|
||||||
# (kernel, device-tree, disk definition and files, and init scripts) which all
|
# (kernel, device-tree, disk definition and files, init scripts) which all
|
||||||
# together fully define a xen guest image
|
# together fully define a full xen guest
|
||||||
#
|
|
||||||
# Usage documentation for the xenguest-mkimage tool can be found in
|
|
||||||
# meta-arm-autonomy/documentation/xenguest-mkimage.md
|
|
||||||
|
|
||||||
DESCRIPTION = "Xenguest mkimage tool"
|
DESCRIPTION = "Xenguest mkimage tool"
|
||||||
LICENSE = "MIT"
|
LICENSE = "MIT"
|
||||||
@@ -20,8 +17,6 @@ S = "${WORKDIR}"
|
|||||||
# Can be built native also to produce xenguest images during Yocto build
|
# Can be built native also to produce xenguest images during Yocto build
|
||||||
BBCLASSEXTEND = "native"
|
BBCLASSEXTEND = "native"
|
||||||
|
|
||||||
inherit allarch
|
|
||||||
|
|
||||||
do_configure[noexec] = "1"
|
do_configure[noexec] = "1"
|
||||||
do_compile[noexec] = "1"
|
do_compile[noexec] = "1"
|
||||||
|
|
||||||
@@ -30,7 +25,7 @@ do_install() {
|
|||||||
install -m 755 xenguest-mkimage ${D}${bindir}/.
|
install -m 755 xenguest-mkimage ${D}${bindir}/.
|
||||||
}
|
}
|
||||||
|
|
||||||
# We need bash
|
# We need bash and tar
|
||||||
RDEPENDS_${PN} = "bash"
|
RDEPENDS_${PN} = "bash tar"
|
||||||
FILES_${PN} = "${bindir}/xenguest-mkimage"
|
FILES_${PN} = "${bindir}/xenguest-mkimage"
|
||||||
|
|
||||||
Loaded 100 of 506 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user