yocto - sstate-cache, signature

markyang92·2021년 5월 11일
0

yocto

목록 보기
27/53
post-thumbnail

shared state cache

  • Yocto는 레시피각 task마다 checksum(or signature)을 매긴다.
    • Bitbake build 때 레시피각 task 수행 시! 1)체크섬(signature), 2)Setscene를 가지고 태스크가 실행유무 판단
  • sstate작업에 사용되는 변수는 SSTATE_DIRSSTATE_MIRRORS 변수를 참조한다.
SSTATE 변수                   Description
SSTATE_DIR
  • rw권한이 있어야함
  • local 에 저장해야하기 때문
  • SSTATE_MIRRORS
  • sstate의 미러
    • 다른 패키지에서 '이 레시피'에 대해 do_packagehit X 시, re-build
    • 디펜던시를 명시적으로 다른 레시피의 compile에 대해 걸면 sstate-hit가 안날 수 있음

    Checksum

    • 체크섬: 태스크 인풋의 Unique Signature
      • Configuration: local.conf, distro.conf etc 에서 살핌
      • Recipe: .bb, .bbappend, functions etc 에서 살핌
      • files: src_uri
    • task hash: script hash + all dependency hashs

    SetScene

    • Bitbake는 prebuilt object가 사용가능하면, skipping tasks를 지원한다.
      • Setscene: Bitbake가 "pre-built" artifact를 다룰수 있게한다.
    • 캐시된 정보가 target build에 관해 사용가능 한가?
    • 캐시된 정보가 사용가능하면, Bitbake는 main task를 실행하지 않고, 캐시된 information을 사용한다.
    • Not setscene variant: do_patch, do_unpack
    • setscene variant: do_package, do_populate_sysroot, do_deploy

    빌드 시스템은 위의 태스크와 다른 이전 태스크 사이 관계의 정보를 가지고 있다.

    • bitbake가 do_populate_sysroot_setscene for something,

    do_package가 실행되어야 할 때, bitbake는 다른 태스크를 실행하길 원한다.

    Bitbake는 두 가지 문맥으로 실행한다.
    1) setscene stage
    2) actual build

    1) bitbake는 처음에 태스크의 리스트와 빌드와 일치하는 해쉬를 가지는BB_HASHCHECK_FUNCTION 변수에 의해 정의된 함수 호출한다.

    $ bitbake -e | grep BB_HASHCHECK

    2) 이 함수는 빠르도록 설계되었으며 아티팩트를 얻을 수 있다고 믿는 작업의 목록을 반환합니다.

    3) possibilities를 리턴받는 태스크의 각각은 bitbake가 artifact covers 가능한 태스크의 setscene version을 실행한다.

    4) 태스크의 setscene 버은 실행 및 제공한다. 필요한 artifact를/ success or failure를 리턴하는/

    5) 이후 모든 setscene tasks는 실행한다. bitbake는 artifacts가 없는 남아있는 태스크를 호출한다.


    $ bitbake -c listtasks core-image-minimal

    do_build                              Default task for a recipe - depends on all other normal tasks required to 'build' a recipe
    do_checkuri                           Validates the SRC_URI value
    do_clean                              Removes all output files for a target
    do_cleanall                           Removes all output files, shared state cache, and downloaded source files for a target
    do_cleansstate                        Removes all output files and shared state cache for a target
    do_compile                            Compiles the source in the compilation directory
    do_configure                          Configures the source by enabling and disabling any build-time and configuration options for the software being built
    do_deploy_source_date_epoch
    do_deploy_source_date_epoch_setscene <----   (setscene version)
    do_devpyshell                         Starts an interactive Python shell for development/debugging
    do_devshell                           Starts a shell with the environment set up for development/debugging
    do_fetch                              Fetches the source code
    do_flush_pseudodb
    do_image
    do_image_complete
    do_image_complete_setscene <---             (setscene version)
    do_image_ext4
    do_image_qa
    do_image_qa_setscene <----                   (setscene version)
    do_image_tar
    do_install                            Copies files from the compilation directory to a holding area
    do_listtasks                          Lists all defined tasks for a target
    do_package                            Analyzes the content of the holding area and splits it into subsets based on available packages and files
    do_package_qa_setscene <---                Runs QA checks on packaged files (setscene version)
    do_package_setscene  <---                   Analyzes the content of the holding area and splits it into subsets based on available packages and files (setscene version)
    do_package_write_rpm_setscene <---         Creates the actual RPM packages and places them in the Package Feed area (setscene version)
    do_packagedata                        Creates package metadata used by the build system to generate the final packages
    do_packagedata_setscene <---               Creates package metadata used by the build system to generate the final packages (setscene version)
    do_patch                              Locates patch files and applies them to the source code
    do_populate_lic_deploy
    do_populate_lic_setscene <---             Writes license information for the recipe that is collected later when the image is constructed (setscene version)
    do_populate_sdk                       Creates the file and directory structure for an installable SDK
    do_populate_sdk_ext
    do_populate_sysroot_setscene <---         Copies a subset of files installed by do_install into the sysroot in order to make them available to other recipes (setscene version)
    do_prepare_recipe_sysroot
    do_rootfs                             Creates the root filesystem (file and directory structure) for an image
    do_rootfs_wicenv
    do_sdk_depends
    do_unpack                             Unpacks the source code into a working directory
    do_write_qemuboot_conf
    

    stamps

    bitbake는 checksums(or signature)를 setscene과 함께 태스크 실행이 필요한지 결정하는데 사용한다.

    이 signature는 STAMP_DIR 디렉터리에 존재한다.

    이 디렉토리는 Bitbake가 track하기 위한 목표를 간주하기용으로 사용하는 정보들을 가지고 있다.

    • what tasks have run?
    • what they have run?

      1. 아키텍처 별로 나뉘어있다.

    • 2.아키텍처/컴포넌트 별로 나뉘어있다.

    • 3. 아키텍처/컴포넌트/'버전'.'태스크'.'해시'

    STAMPS_DIR

    • global STAMP_DIR 위치
    $ bitbake -e | grep ^STAMPS_DIR=

    stamps dir


    $ bitbake-dumpsig

    체크섬은 bitbake-diffsig 커맨드를 이용해 시험된다.

    $ bitbake-dumpsig -t <COMPONENT> <TASK>
    $ bitbake-dumpsig -t myhello compile
    • $ bitbkae-dumpsig -t myhello compilemyhello 컴포넌트의 do.compile() 태스크에 대한 자세한 내용 및 signature data를 생성한다.

    1. $ bitbake-dumpsig -t core-image-minimal compile
      • "core-image-minimal" 이미지레시피를 할 때 compile task 내용 보기
      • 여튼 core-image-minimal compile의 hash는 9556d55a9a82b6820dd7da07a4131ceb2653293c2f0a209ef4420791bfc59aa3
    1. $ bitbake -S none core-image-minimallocked-sigs.inc와 비교해보자.

      진짜 정확하네!!?!

    2. poky/build/tmp/stamps/qemux86_64-poky-linux/core-image-minimal/에서 찍힌 timestamp와 비교

    요것도 정확하다!!
    -> stamp는 rerun한 태스크 일것임


    $ bitbake-diffsigs

    Signature data는 $ bitbake -S none <recipename>에 의해 생성된다.

    우리는 ls on stamps directory로 rerun한 태스크를 알 수 있다.

    two set의 sigdata(signature data)를 볼 수 있다.

    주어진 태스크의 2개의 버전을 비교해보고 싶을때 bitbake-diffsig를 사용하여 비교할 수 있다.

    bitbake-diffsigs -t core-image-minimal compile

    diff 내역


    간단한 task는 짧게 diff해시가 나온다.

    do_configure

    몇 줄 추가되었다고 나온다.


    • poky/build/sstate-cache

    • poky/build/conf/local.conf

      기본적으로 주석처리되어 있음 (디폴트로 "${TOPDIR}/sstate-cache"를 참조함)


    LockSharedState

    • OpenEmbedded build system은 bitbake가 rebuilt할 필요 없는 parts 결정하지 않는한, 처음부터 모든 것을 빌드한다.
      시스템은 any given tasks and uses를 digital signature로써의 input의 체크섬을 기반으로 하여 이러한 결정을한다.
    • sstate cache를 사용할 때, 이러한 signatures는 비교되고 그러한 차이는 rerun을 불러이르킨다.
    • 우리가 사용할 캐시된 태스크를 잘 안다면, 필요한 signature를 생성 시켜, bitbake를 configure해 specific cache를 사용할 수 있다.

    $ bitbake -S none [IMAGE] : Signatures 생성

    $ bitbake -S SIGNATURE_HANDLER <IMAGE[ IMAGE2 ...]>
    $ bitbake --dump-signatures=SIGNATURE_HANDLER <IMAGE[ IMAGE2 ...]>
    
    SIGNATURE_HANDLER
    none		시그니처를 dump함
    printdiff	덤프된 시그니처를 캐시된 것과 비교한다.
    
    
    e.g.
    $ bitbake -S none core-image-minimal
    $ bitbake -S printdiff core-image-minimal
    $ bitbake --dump-signatures=none core-image-minimal
    $ bitbake --dump-signatures=printdiff core-image-minimal
    • 최신 시그니쳐 Hash를 담은 locked-sigs.inc를 생성한다.
    1. MACHINE은 현재 /conf/local.conf에 있는 MACHINE을 따른다.


    • Bitbake가 task가 rerun에 필요한지 결정하는데 사용하는 signature의 리스트를 생성한다.
      • handlernone으로 설정하면, locked-sigs.inc 라는 파일에 signature들을 만든다.
      • locked-sigs.inc라고 만 만들어지는 것 같다...
    $ bitbake -S none core-image-minimal core-image-sato
    • 위 예는 build core-image-minimal, core-image-sato필요한 모든 tasks해시를 생성한다. any recipe나 any image 또한 가능하다.

    locked-sigs.inc 내용

    • MACHINE=qemux86-64
    • Image: core-image-minimal
    • Generating CMD
    $ bitbake -S none core-image-minimal

    • SIGGEN_LOCKEDSIGS_t-allarch: 모든 아키텍처에 대한 컴포넌트와 그 컴포넌트의 각 태스크의 해시


    • SIGGEN_LOCKEDSIGS_t-core2-64:=

    • SIGGEN_LOCKEDSIGS_t-qemux86-64:=


    • SIGGEN_LOCKEDSIGS_t-x86-64: x86-64

    • SIGGEN_LOCKEDSIGS_t-x86-64-ubuntu-20.04

    • SIGGEN_LOCKEDSIGS_t-x86-64-x86-64

    • SIGGEN_LOCKEDSIGS_TYPES_qemux86-64 = t-allarch t-core-64 t-qemux86-64 t-x86-64 t-x86-64-ubuntu-20.04 t-x86-64-x86-64"

    맨 아래 줄인
    SIGGEN_LOCKED_SIGS_TYPES_qemux86-64를 보면 이 signature file은 qemux86-64 MACHINE용 임을 알 수 있다.


    $ gen-lockedsig-cache

    • sstate-cache는 계속 쌓이기 때문에 용량문제 유발할 수 있다.
    • 내가 필요한 레시피, 이미지locked-sig.inc + oldsstate-cache 를 이용해 필요한 newly sstate-cache 를 만들 수 있다.

    1. NATIVELSBSTRING을 알아낸다.
    $ bitbake -e | grep "^NATIVELSBSTRING="
    NATIVELSBSTRING="universal"

    uninative.bbclass 참고


    1. gen-lockedsig-cache 명령
    $ gen-lockedsig-cache
    syntax: gen-lockedsig-cache <locked-sig.inc> <input-cachedir> <output-cachedir> <nativelsbstring> [filterfile]
    
    e.g.
    gen-lockedsig-cache ./locked-sigs.inc /current/sstate-cache/ ~/new/sstate-cache universal


    1. conf/local.conf에서 SSTATE_DIR을 newly sstate-cache 로 지정

      이런식으로 새롭게 만들어낸 newly sstate-cache 사용 가능

    nativelsbstring

    • 위에서 아까 NATIVELSBSTRING=universal이란 것을 보았고, gen-lockedsig-cache 명령 때 사용했다.
    • nativelsbstring참고
      • 이 string은 host distribution을 식별한다. Strings는 host distributor ID로 구성되어 있는데, lsb_release tool이나 /etc/lsb-release를 read함으로 써.
      • 예를들어 Ubuntu 12.10에서 빌드하는 시스템이라면, 이 값은 Ubuntu-12.10이다. 이 값을 결정 할 수 없다면, "Unknown"을 써라
    • uninative.bbclass (유니네이티브)
      • host 배포판의 C 라이브러리로부터 빌드 시스템을 isolate하기 위한 시도
      • 다른 호스트 배포판 실행에 따른 Native shared state artifacts 의 재사용을 하기 위함
      • 이 bbclass는 pre-built된 C library를 포함하는 tarball이 빌드 시작 시, 다운로드됨을 enable할 수 있다.
      • Poky reference distribution에서 meta/conf/distro/include/yocto-uninative.inc를 통해 디폴트로 enable
      • poky로 derive 하지 않는 다른 distribution은 "require conf/distro/include/yocto-uninative.inc"를 통해 사용할 수 있다.
      • 반대로, uninative-tarball를 너 스스로 빌드 할 수 있다. 결과 tarball을 Publish(e.g. via HTPP)하고 set UNINATIVE_URL, UNINATIVE_CHECKSUM 적절히
      • 예를 들어, meta/conf/distro/include/yocto-uninative.inc를 보라
      • 이 include는 Yocto Project에 의해 생성되고 관리되는 uninative tarballs를 포인트한다.
      • 빌드머신에서 돌아가는 특정 distro인 native/cross artifact를 가지는 재료보다 native/cross artifact에 대한 통합된 sstate feed를 사용/관리하길 원하는 distros에 의해 이 파일들은 included 될 수 있다.
      • UniNative_Url


    Lock할 태스크 선택

    • locked-sigs.inc 파일이 해시를 내포하기 때문에 우리가 SSTATE를 lock하고 싶다면, configuration에 locked-sigs.inc를 포함해도 된다.
    • distro's configuration file과 같은 포함된 configuration 파일중 하나에, include 키워드를 이용해 이를 실현할 수 있다. (혹은 심플하게 local.conf) (e.g. include locked-sig.inc)
    • 한번 이렇게하면 당신은 SIGGEN_LOCKEDSIGS_TASKSIG_CHECK 배리어블에 warn하고 싶을 것인데, 왜냐하면 어떠한 에러를 무시하기 위해서이다.
      모든 파일을 포함하는 것 보단, 당신이 lock을 원하는 태스크만 픽하고 고를 수 있는 것이 낫다.
      예를 들어 다음의 몇 태스크를 local.conf 파일에 카피해 넣어란
    • SSTATE를 lock하고 싶다면 configuration에서 locked-sigs.inc를 포함해야한다.
      • distro configuration file이나 간단한 local.conf 파일과 같이 include된 configuration 파일에 include를 사용하여 할 수 있다.
      • 이를 포함하면, SIGGEN_LOCKEDSIGS_TASKSIG_CHECK 변수를 설정해 에러를 무시하기위한 WARN을 셋 할 수 있다. Settings inlcude "error", "warn",
    SIGGEN_LOCKEDSIGS = "\
    gcc-cross:do_populate_sysroot:a8d91b35b98e1494957a2ddaf4598956 \
    eglibc:do_populate_sysroot:13e8c68553dc61f9d67564f13b9b2d67 \
    eglibc:do_packagedata:bfca0db1782c719d373f8636282596ee \
    gcc-cross:do_packagedata:4b601ff4f67601395ee49c46701122f6 \
    "

    task signature가 어떠한 이유에 의해 바뀌더라도, Bitbake는 우리가 제공한 signature에 맞춘 sstate cache를 사용할 것이다.
    이것은 우리의 configuration에서의 변경된 것을 무시하고, 태스크를 강제로 캐시할 수 있다.


    locked-sigs.inc 강제 할당

    1. locked-sigs.inccore-image-minimal 이미지에 대한 locked-sigs file이다.
      1-1. locked-sigs.inc${TOPDIR} = ${BUILDDIR}에 위치한다.

    1. 해당 $BUILDDIR에서 local.conf를 수정한다.
      2-1. poky/${BUILDDIR}/conf/local.conf

    1. (실험) ${TOPDIR}/sstate-cache를 삭제한다.

    1. core-image-minimal을 bitbake build해도 100% 해시 complete확인

    1. (실험2) local.confMACHINE을 수정해본다. qemux86-64 -> qemuarm
      그리고 그냥 bitbake 재빌드 -> 100% caching!

    1. 빌드 후 생성되는 sstate-cache는 빈폴더다
    • 이유는 locked-sigs.inc에서 다 해시 되었기 때문

    sstate-diff-machines.sh

    • poky/scripts/sstate-diff-machines.sh
    • sstate-diff-mahcines.sh 의 역할
    1. MACHINE 사이의 sstate checksum을 비교한다.
      1-1. 스크립트를 실행하고 비교 결과 list.M 파일 생성한다.
      1-2. bash를 사용하여 PIPESTATUS variable을 가지도록한다.
    2. older sstate checksum을 유지해, updating metadata 이후에 왜 무언가가 rebuild되었는지? 찾아낼 수 있게한다.
    $ diff \
        sstate-diff/1349348392/fake-cortexa8/list.M \
        sstate-diff/1349348392/fake-cortexa9/list.M \
        | wc -l
    538
    1. 아래와 같이 사용해 sigdata를 비교한다.
    $ ls sstate-diff/1349348392/*/armv7a-vfp-neon*/linux-libc-headers/*do_configure*sigdata*
       sstate-diff/1349348392/fake-cortexa8/armv7a-vfp-neon-oe-linux-gnueabi/linux-libc-headers/3.4.3-r0.do_configure.sigdata.cb73b3630a7b8191e72fc469c5137025
       sstate-diff/1349348392/fake-cortexa9/armv7a-vfp-neon-oe-linux-gnueabi/linux-libc-headers/3.4.3-r0.do_configure.sigdata.f37ada177bf99ce8af85914df22b5a0b
    $ bitbake-diffsigs stamps.1349348392/*/armv7a-vfp-neon*/linux-libc-headers/*do_configure*sigdata*
       basehash changed from 8d0bd67bb1da6f68717760fc3ef43171 to e869fa61426e88e9c30726ba88a1216a
       Variable TUNE_CCARGS value changed from  -march=armv7-a     -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a8 to  -march=armv7-a     -mthumb-interwork -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a9
    

    args

    • Global vars
    1. tmpdir=
    2. machines=
    3. targets=
    4. default_machines="qemuarm qemux86 qemux86-64"
    5. default_target="core-image-base"
    6. analyze="N"

    • Usage
    1. --tmpdir=<tmpdir>
      tmpdir을 명시한다.
      /OE/oe-core/tmp-eglibc 와같이 명시한다. ( No / at the end).
      명시하지 않으면, 환경변수의 $TMPDIR이 사용된다.
    2. --machines=<machine>
      스페이스로 별도의 MACHINEs 리스트 명시한다.
      기본 값은 "qemuarm qemux86 qemux86-64"이다.
      명시하지 않으면, 환경변수의 $MACHINES 가 사용된다.
    3. --targets=<targets>
      스페이스로 별도의 타겟들을 리스트 명시한다.
      기본 값은 "core-image-base"이다.
      명시하지 않으면, 환경변수의 $TARGETS 가 사용된다.
    4. --analyze
      MACHINEs 사이의 차이를 보여준다.

    사용

    1. 실험 전 환경
      MACHINE=qemux86-64 core-image-minimal 빌드
      MACHINE=qemuarm core-image-minimal 빌드
    2. sstate-diff-machines.sh for qemuarm으로 명령
    ➜  build git:(dunfell)../scripts/sstate-diff-machines.sh --tmpdir=/home/dhyang/poky/build/tmp --machines=qemuarm --targets=core-image-minimal --analyze

    1. 생성물
      3-1. $PWD/locked-sigs.inc 생성
      중요!! locked-sigs.incsstate-diff-machines.sh--machines에서 준 아규먼트와는 상관없이, conf/local.confMACHINE에 영향받음

      3-2. tmpdir/sstate-diff 생성

      sstate-diff-machines.sh--machines=qemuarm에 의해 qemuarm의 정보 생성

      list.M 생성됨

    1. sstate-diff-machines.sh for qemux86-64으로 명령
    ➜  build git:(dunfell)../scripts/sstate-diff-machines.sh --tmpdir=/home/dhyang/poky/build/tmp --machines=qemux86-64 --targets=core-image-minimal --analyze

    중복 sstate 삭제

    sstate-cache-management.sh

    • 스크립트 위치: poky/scripts/sstate-cache-management
      • 기능: 중복된 데이터나 오래된 데이터를 캐시에서 지운다.

    • usage
    Options:
      -h, --help
            Display this help and exit.
    
      --cache-dir=<sstate cache dir>
            Specify sstate cache directory, will use the environment
            variable SSTATE_CACHE_DIR if it is not specified.
    
      --extra-archs=<arch1>,<arch2>...<archn>
            Specify list of architectures which should be tested, this list
            will be extended with native arch, allarch and empty arch. The
            script won't be trying to generate list of available archs from
            AVAILTUNES in tune files.
    
      --extra-layer=<layer1>,<layer2>...<layern>
            Specify the layer which will be used for searching the archs,
            it will search the meta and meta-* layers in the top dir by
            default, and will search meta, meta-*, <layer1>, <layer2>,
            ...<layern> when specified. Use "," as the separator.
    
            This is useless for --stamps-dir or when --extra-archs is used.
    
      -d, --remove-duplicated
            Remove the duplicated sstate cache files of one package, only
            the newest one will be kept. The duplicated sstate cache files
            of one package must have the same arch, which means sstate cache
            files with multiple archs are not considered duplicate.
    
            Conflicts with --stamps-dir.
    
      --stamps-dir=<dir1>,<dir2>...<dirn>
            Specify the build directory's stamps directories, the sstate
            cache file which IS USED by these build diretories will be KEPT,
            other sstate cache files in cache-dir will be removed. Use ","
            as the separator. For example:
            --stamps-dir=build1/tmp/stamps,build2/tmp/stamps
    
            Conflicts with --remove-duplicated.
    
      -L, --follow-symlink
            Remove both the symbol link and the destination file, default: no.
    
      -y, --yes
            Automatic yes to prompts; assume "yes" as answer to all prompts
            and run non-interactively.
    
      -v, --verbose
            Explain what is being done.
    
      -D, --debug
            Show debug info, repeat for more debug info.

    SSTATE_MIRRORS

    • conf/local.conf에 가면 SSTATE_MIRRORSsstatemirror로 사용할 수 있다.
    SSTATE_MIRRORS = "\
        file://.* http://mirrorserver/repo/master/sstate-cache/PATH \n \
        file://.* file:///path/repo/master/sstate-cache/PATH \n \
        file://.* http://mirrorserver/repo/main/sstate-cache/PATH"
    
    profile
    pllpokko@alumni.kaist.ac.kr

    0개의 댓글