現在位置: ホーム / みらくるブログ / meta-spdxscannerを試してみた

meta-spdxscannerを試してみた

今回はYoctoを使ったLinuxディストリビューションであるEMLinuxを例にmeta-spdxscannerを試してみましたので、ご紹介したいと思います。既にYoctoを使って開発されている方はご自身の環境と置き換えてお読みいただければと思います。なお本記事はOpenChain Japan WG活動の1つです

In this article, we would like to introduce the trial of meta-spdxscanner under meta-emlinux developed with Yocto. If you have already use Yocto for your development, please read this article as a reference to your own environment. (This article is a part of OpenChain Japan WG’s Qiita Advent calendar)

meta-spdxscannerってなに?

meta-spdxscannerは、Yoctoプロジェクトで開発されているSPDXファイルを生成するためのYoctoレイヤーです。Yoctoでのイメージビルド過程で使用するパッケージのソースコードファイルに対してライセンススキャンを行い、その結果をSPDXファイルとして出力します。ライセンススキャニングはFOSSologyやscancode-toolkitと連携して行います。

SPDXは”Software Package Data Exchange”の略です。ソフトウェアコンポーネント情報、ライセンス情報、コピーライト情報などをまとめたオープンなフォーマットです。ソフトウェア情報交換をスムーズに行うために検討されたもので、国際標準ISO/IEC 5962:2021になっています。

FOSSologyとscancode-toolkitは、ソースコードに含まれるライセンスをスキャンするツールです。現在ではオープンソースとして開発されています。

YoctoによるLinuxイメージの作成

さっそくmeta-spdxscannerを試してみたいと思います。
まずYocto開発環境を準備します。既にYoctoを使って開発されている方はスキップください。
当社ではYoctoを使った組込み向けLinux “EMLinux” を開発しています。EMLinuxは製品版、評価版、OSS版(meta-emlinux)があります。評価版は製品版を購入いただくための検討に利用できるように製品版の特定の版にて用意しています。何らかのサポートが必要な製品開発をする時は製品版の購入をご検討ください。評価版EMLinuxを使った開発の仕方はこちらのブログを参照ください。

今回はmeta-emlinuxを使ってみたいと思います。meta-emlinuxはgithubにて公開しています。コンパイラなどのビルド環境構築はgithubのREADMEをご参照ください。

今回ハードウェアとしてRaspberry Pi 3B+を使います。ハードウェアの設定をlocal.confに記載します。

$ source repos/meta-emlinux/scripts/setup-emlinux build
Cloning into '/home/miracle/work/repos/poky'...
remote: Enumerating objects: 1648, done.
remote: Counting objects: 100% (1648/1648), done.
remote: Compressing objects: 100% (828/828), done.
remote: Total 539603 (delta 1006), reused 1097 (delta 797), pack-reused 537955

(中略)

You can also run generated qemu images with a command like 'runqemu qemux86'
NOTE: Starting bitbake server...
NOTE: Starting bitbake server...
NOTE: Starting bitbake server…
$ cat << EOF >> conf/local.conf

MACHINE = "raspberrypi3-64"
DL_DIR = “${HOME}/downloads”
IMAGE_INSTALL_append = " kernel-modules"

EOF
$

SDカードイメージをビルドします。開発に使用するパソコンスペックやインターネット環境に依存しますが、著者の環境では1時間程度かかりました。

$ bitbake core-image-minimal
Parsing recipes: 100% |##############################################################| Time: 0:00:24
Parsing of 1331 .bb files complete (0 cached, 1331 parsed). 2349 targets, 68 skipped, 4 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION = "1.42.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "ubuntu-18.04"
TARGET_SYS = "aarch64-emlinux-linux"
MACHINE = "raspberrypi3-64"
DISTRO = "emlinux"
DISTRO_VERSION = "2.4"
TUNE_FEATURES = "aarch64 cortexa53 crc"
TARGET_FPU = ""
meta
meta-yocto-bsp = "warrior:d4b57c68b22027c2bedff335dee06af963e4f8a8"
meta-debian = "warrior:fca5f3f1dad606bfd73b733671b70a518be28f39"
meta-debian-extended = "warrior:d8b6e2919ad25a9e55c2c319121f021f4d613882"
meta-emlinux = "warrior:89e02f1cb7f570e20c955e56b3e09980683b6442"

Initialising tasks: 100% |###########################################################| Time: 0:00:01
state summary: Wanted 853 Found 0 Missed 853 Current 0 (0% match, 0% complete)
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 2942 tasks of which 5 didn't need to be rerun and all succeeded.
$

SDカードイメージがtmp-glibc/deploy/images/raspberrypi3-64/に生成されることを確認できました。拡張子がwic.gzのファイルです。

$ ls tmp-glibc/deploy/images/raspberrypi3-64/
bcm2837-rpi-3-b--4.19-r0-raspberrypi3-64-20211224235912.dtb
bcm2837-rpi-3-b.dtb@
bcm2837-rpi-3-b-plus--4.19-r0-raspberrypi3-64-20211224235912.dtb
bcm2837-rpi-3-b-plus.dtb@
bcm2837-rpi-3-b-plus-raspberrypi3-64.dtb@
bcm2837-rpi-3-b-raspberrypi3-64.dtb@
boot.scr
config.txt
core-image-minimal-raspberrypi3-64-20211224235912.rootfs.manifest
core-image-minimal-raspberrypi3-64-20211224235912.rootfs.tar.gz
core-image-minimal-raspberrypi3-64-20211224235912.rootfs.wic
core-image-minimal-raspberrypi3-64-20211224235912.rootfs.wic.gz
core-image-minimal-raspberrypi3-64-20211224235912.testdata.json
core-image-minimal-raspberrypi3-64.manifest@
core-image-minimal-raspberrypi3-64.tar.gz@
core-image-minimal-raspberrypi3-64.testdata.json@
core-image-minimal-raspberrypi3-64.wic@
core-image-minimal-raspberrypi3-64.wic.gz@
Image@
Image--4.19-r0-raspberrypi3-64-20211224235912.bin
Image-raspberrypi3-64.bin@
modules--4.19-r0-raspberrypi3-64-20211224235912.tgz
modules-raspberrypi3-64.tgz@
rpi-bootfiles/
u-boot.bin@
u-boot-raspberrypi3-64-2019.01-r0.bin
u-boot-raspberrypi3-64.bin@
$

spdxscannerレイヤーの挿入

SDカードイメージの生成を確認できましたので、今回の本題であるmeta-spdxscannerを取り込んでみます。
meta-spdxscannerの取り込みに際して、レイヤーの依存関係を解消する必要があります。

  • meta-emlinuxはmeta-debianを使用しています。執筆時点では、meta-spdxscannerはmeta-debianをサポートしていませんので、meta-debian対応を含んだブランチ(github)のmeta-spdxscannerを使います。本ブランチは当社社員が開発したものです。
  • meta-spdxscannerはmeta-oeに依存しますので、そちらも挿入します。

具体的にみていきます。まずは、先ほど記載したレイヤーをcloneしてきます。

$ git clone -b warrior-metadebian https://github.com/masami256/meta-spdxscanner.git repos/meta-spdxscanner
Cloning into 'meta-spdxscanner'...
remote: Enumerating objects: 808, done.
remote: Counting objects: 100% (808/808), done.
remote: Compressing objects: 100% (301/301), done.
remote: Total 808 (delta 468), reused 808 (delta 468), pack-reused 0
Receiving objects: 100% (808/808), 163.82 KiB | 607.00 KiB/s, done.
Resolving deltas: 100% (468/468), done.
$ git clone -b warrior https://github.com/openembedded/meta-openembedded.git repos/meta-openembedded
Cloning into 'repos/meta-openembedded'...
remote: Enumerating objects: 169160, done.
remote: Counting objects: 100% (229/229), done.
remote: Compressing objects: 100% (138/138), done.
remote: Total 169160 (delta 113), reused 168 (delta 84), pack-reused 168931
Receiving objects: 100% (169160/169160), 51.25 MiB | 13.41 MiB/s, done.
Resolving deltas: 100% (100093/100093), done.
$

次に、cloneしてきたレイヤーを挿入します。

$ bitbake-layers add-layer \
../repos/meta-openembedded/meta-oe \
../repos/meta-spdxscanner
NOTE: Starting bitbake server…
$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer path priority
==========================================================================
meta /home/miracle/work/build/../repos/poky/meta 5
meta-yocto-bsp /home/miracle/work/build/../repos/poky/meta-yocto-bsp 5
meta-debian /home/miracle/work/build/../repos/meta-debian 10
meta-debian-extended /home/miracle/work/build/../repos/meta-debian-extended 11
meta-emlinux /home/miracle/work/build/../repos/meta-emlinux 12
meta-oe /home/miracle/work/repos/meta-openembedded/meta-oe 6
meta-spdxscanner /home/miracle/work/repos/meta-spdxscanner 6

$

最後にライセンススキャンツールの設定を行います。今回はライセンススキャンツールにFOSSologyを使用したいと思います。SPDX_DEPLOY_DIRはSPDXファイルの出力先です。

$ cat << EOF >> conf/local.conf
INHERIT += "fossdriver-host"
SPDX_DEPLOY_DIR = "${HOME}/work/emlinux-spdx-result"
EOF
$ mkdir -p ${HOME}/work/emlinux-spdx-result

 

FOSSologyの準備

FOSSologyと連携しますので、ビルド前にFOSSologyを動作させます。FOSSologyはdocker版が用意されていますので、そちらを動かします。warriorの場合は最新版では動作しません。meta-spdxscannerのwarriorブランチのREADMEに書かれている通り、バージョン3.5までの古めのイメージを利用します。今回はfossologyの3.3.0を使います。

$ docker run --rm -p 8081:80 -d fossology/fossology:3.3.0
Unable to find image 'fossology/fossology:3.3.0' locally
3.3.0: Pulling from fossology/fossology
9f0706ba7422: Pull complete
7a33fed0685b: Pull complete
f928f09bca37: Pull complete
1dac16b925b6: Pull complete
2d2e1cad8f03: Pull complete
ae4f013305ca: Pull complete
fd512c2fbc50: Pull complete
1951686eebdc: Pull complete
85cd4c67a75e: Pull complete
1510f8331793: Pull complete
64a9dc359d85: Pull complete
Digest: sha256:b596124b47a29d24d2fdd63f7ba19b9fc27ce67f090e7ee527b02c07c66b54ee
Status: Downloaded newer image for fossology/fossology:3.3.0
a65626a5fec1a0271d1691303d33a0b97e68a75096448fb746f999b475a59638
$ docker logs --tail=10 fossology-3.3.0
NOTE: Adding user www-data to group fossy
Reloading web server: apache2 failed!
Apache2 is not running ... (warning).
FOSSology postinstall complete, but sure to complete the remaining
steps in the INSTALL instructions.

Fossology initialisation complete; Starting up...

Starting FOSSology job scheduler: fossology.
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.7. Set the 'ServerName' directive globally to suppress this message
$

最後の行のIPアドレスをメモしておきます。

先ほど起動したFOSSologyと通信するためのfossdriverをインストールします。

$ git clone https://github.com/fossology/fossdriver.git fossdriver
Cloning into 'fossdriver'...
remote: Enumerating objects: 261, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 261 (delta 0), reused 0 (delta 0), pack-reused 258
Receiving objects: 100% (261/261), 55.88 KiB | 18.63 MiB/s, done.
Resolving deltas: 100% (145/145), done.
$ pip3 install -e fossdriver
Obtaining file:///home/miracle/work/fossdriver
Collecting bs4==0.0.1 (from fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/10/ed/7e8b97591f6f456174139ec089c769f89a94a1a4025fe967691de971f314/bs4-0.0.1.tar.gz
Collecting lxml==4.2.1 (from fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/a7/b9/ccf46cea0f698b40bca2a9c1a44039c336fe1988b82de4f7353be7a8396a/lxml-4.2.1-cp36-cp36m-manylinux1_x86_64.whl (5.6MB)
100% |████████████████████████████████| 5.7MB 394kB/s
Collecting requests-toolbelt==0.8.0 (from fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/97/8a/d710f792d6f6ecc089c5e55b66e66c3f2f35516a1ede5a8f54c13350ffb0/requests_toolbelt-0.8.0-py2.py3-none-any.whl (54kB)
100% |████████████████████████████████| 61kB 14.1MB/s
Collecting requests==2.20.0 (from fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/f1/ca/10332a30cb25b627192b4ea272c351bce3ca1091e541245cccbace6051d8/requests-2.20.0-py2.py3-none-any.whl (60kB)
100% |████████████████████████████████| 61kB 13.2MB/s
Collecting version-parser==1.0.0 (from fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/9d/f8/5285daf1866f337bc07e97b9095d87286449b8e1a6d1b9e3dd64227fa309/version_parser-1.0.0.tar.gz
Collecting beautifulsoup4 (from bs4==0.0.1->fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/69/bf/f0f194d3379d3f3347478bd267f754fc68c11cbf2fe302a6ab69447b1417/beautifulsoup4-4.10.0-py3-none-any.whl (97kB)
100% |████████████████████████████████| 102kB 9.4MB/s
Collecting certifi>=2017.4.17 (from requests==2.20.0->fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/37/45/946c02767aabb873146011e665728b680884cd8fe70dde973c640e45b775/certifi-2021.10.8-py2.py3-none-any.whl (149kB)
100% |████████████████████████████████| 153kB 8.4MB/s
Collecting idna<2.8,>=2.5 (from requests==2.20.0->fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/4b/2a/0276479a4b3caeb8a8c1af2f8e4355746a97fab05a372e4a2c6a6b876165/idna-2.7-py2.py3-none-any.whl (58kB)
100% |████████████████████████████████| 61kB 11.1MB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.20.0->fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl (133kB)
100% |████████████████████████████████| 143kB 5.6MB/s
Collecting urllib3<1.25,>=1.21.1 (from requests==2.20.0->fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/01/11/525b02e4acc0c747de8b6ccdab376331597c569c42ea66ab0a1dbd36eca2/urllib3-1.24.3-py2.py3-none-any.whl (118kB)
100% |████████████████████████████████| 122kB 11.5MB/s
Collecting soupsieve>1.2 (from beautifulsoup4->bs4==0.0.1->fossdriver==0.0.3)
Downloading https://files.pythonhosted.org/packages/72/a6/fd01694427f1c3fcadfdc5f1de901b813b9ac756f0806ef470cfed1de281/soupsieve-2.3.1-py3-none-any.whl
Building wheels for collected packages: bs4, version-parser
Running setup.py bdist_wheel for bs4 ... done
Stored in directory: /home/miracle/.cache/pip/wheels/a0/b0/b2/4f80b9456b87abedbc0bf2d52235414c3467d8889be38dd472
Running setup.py bdist_wheel for version-parser ... done
Stored in directory: /home/miracle/.cache/pip/wheels/93/2c/6b/8587de48e6b220cee3f76e79e2e8189f21e3dd6f0dba631275
Successfully built bs4 version-parser
Installing collected packages: soupsieve, beautifulsoup4, bs4, lxml, certifi, idna, chardet, urllib3, requests, requests-toolbelt, version-parser, fossdriver
Running setup.py develop for fossdriver
Successfully installed beautifulsoup4-4.10.0 bs4-0.0.1 certifi-2021.10.8 chardet-3.0.4 fossdriver idna-2.7 lxml-4.2.1 requests-2.20.0 requests-toolbelt-0.8.0 soupsieve-2.3.1 urllib3-1.24.3 version-parser-1.0.0
$

インストールされたか確認します。

$ pip3 list --format=columns | grep fossdriver
fossdriver 0.0.3 /home/miracle/work/fossdriver
$

fossdriver設定は~/.fossdriverrcに記載します。メモしておいたIPアドレスを記載します。

$ cat ~/.fossdriverrc
{
"serverUrl": "http://172.17.0.7:8081",
"username": "fossy",
"password": "fossy"
}
$

以上で準備完了です。

実行結果

では、ビルドしてみたいと思います。

native向けのパッケージをspdx作成の対象外にするため、meta-spdxscannerが提供するnopackages.bbclassを利用します。同じファイルがpoky側にも存在しますので、簡単に無効にするためにファイルの拡張子を変更します。

$ mv ../repos/poky/meta/classes/nopackages.bbclass \
../repos/poky/meta/classes/nopackages.bbclass.backup

meta-spdxscannerを挿入することでビルドの一環としてdo_spdxタスクが実行されるようになります。do_spdxタスクを行うことでSPDXファイルが作られます。ここまでの設定でdo_spdxタスクが組み込まれて実行されるか確認したいと思います。今回のbitbakeでは先ほどとは違うイメージを作ってみましたが、前述のcore-image-minimalでも大丈夫です。

$ bitbake -f core-image-weston
Parsing recipes: 100% |##############################################################| Time: 0:00:25
Parsing of 2029 .bb files complete (0 cached, 2029 parsed). 3225 targets, 109 skipped, 4 masked, 0 errors.
WARNING: No bb files matched BBFILE_PATTERN_spdxscanner '^/home/miracle/work/repos/meta-spdxscanner/'
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION = "1.42.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "ubuntu-18.04"
TARGET_SYS = "aarch64-emlinux-linux"
MACHINE = "raspberrypi3-64"
DISTRO = "emlinux"
DISTRO_VERSION = "2.4"
TUNE_FEATURES = "aarch64 cortexa53 crc"
TARGET_FPU = ""
meta
meta-yocto-bsp = "warrior:d4b57c68b22027c2bedff335dee06af963e4f8a8"
meta-debian = "warrior:fca5f3f1dad606bfd73b733671b70a518be28f39"
meta-debian-extended = "warrior:d8b6e2919ad25a9e55c2c319121f021f4d613882"
meta-emlinux = "warrior:89e02f1cb7f570e20c955e56b3e09980683b6442"
meta-oe = "warrior:a24acf94d48d635eca668ea34598c6e5c857e3f8"
meta-spdxscanner = "warrior-metadebian:61832ff26e361bfcd3ff197dfda332ddf899a07d"

NOTE: Tainting hash to force rebuild of task /home/miracle/work/build/../repos/poky/meta/recipes-graphics/images/core-image-weston.bb, do_build
WARNING: /home/miracle/work/build/../repos/poky/meta/recipes-graphics/images/core-image-weston.bb.do_build is tainted from a forced run
Initialising tasks: 100% |###########################################################| Time: 0:00:02Sstate summary: Wanted 1201 Found 0 Missed 1201 Current 354 (0% match, 22% complete)
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
Currently 4 running tasks (719 of 5377) 13% |###### |
0: linux-libc-headers-base-4.19-r0 do_spdx - 521s (pid 2107815)
1: gcc-runtime-8.3.0-r0 do_spdx - 521s (pid 2107817)
2: glibc-2.28-r0 do_spdx - 521s (pid 2107816)
3: attr-2.4.48-r0 do_spdx - 5s (pid 2107911)

青字にて強調したところを見てください。do_spdxが実行されていることが分かります。

ビルドが終わると設定したフォルダにSPDXファイルが生成されます。

$ ls -1 ~/work/emlinux-spdx-result/ 
acl-2.2.53.spdx
adwaita-icon-theme-3.30.1.spdx
apt-1.8.2.3.spdx
atk-2.30.0.spdx
at-spi2-atk-2.30.0.spdx
at-spi2-core-2.30.0.spdx
attr-2.4.48.spdx
autoconf-archive-20180313.spdx
base-files-3.0.14.spdx
base-passwd-3.5.46.spdx
(省略)

各パッケージの情報は各SPDXファイルにて確認できます。bashの例を示します。

$ cat ~/work/emlinux-spdx-result/bash-5.0.spdx | head -n 40
SPDXVersion: SPDX-2.1
DataLicense: CC0-1.0

##-------------------------
## Document Information
##-------------------------

DocumentNamespace: http://a65626a5fec1/repo/SPDX2TV_bash-5.0-r0-patched.tar.gz_1638243588.spdx
DocumentName: /srv/fossology/repository/report
SPDXID: SPDXRef-DOCUMENT

##-------------------------
## Creation Information
##-------------------------

Creator: meta-spdxscanner
Creator: meta-spdxscanner
CreatorComment: <text>
This document was created using license information and a generator from Fossology.
</text>
Created: 2021-11-30T03:39:49Z
LicenseListVersion: 2.6

##-------------------------
## Package Information
##-------------------------

PackageName: bash
PackageVersion: 5.0
PackageFileName: bash-5.0-r0-patched.tar.gz
SPDXID: SPDXRef-upload80
PackageDownloadLocation: http://ftp.debian.org/debian/pool/main/b/bash/bash_5.0-4.dsc;name=bash_5.0-4.dsc
PackageHomePage: http://tiswww.case.edu/php/chet/bash/bashtop.html
PackageSummary: <text>An sh-compatible command language interpreter</text>
modification record : True
PackageVerificationCode: da39a3ee5e6b4b0d3255bfef95601890afd80709
PackageDescription: <text>bash version 5.0</text>
PackageChecksum: SHA1: ccef0de1c448932ffda5a1bff412f52c79bec743
PackageChecksum: MD5: 11e82e390554b656faf5b2af9f37814b

まとめ

今回はmeta-emlinuxを例にmeta-spdxscannerを試してみました。ビルドの設定、FOSSologyと連携するための設定を行うのみで、ビルドと共にSPDXファイルを生成できました。皆さまはいかがでしたでしょうか?
OSSコンプライアンスへの取り組みに興味がありましたら、OpenChain Japan WGで行っているQiita記事もご参考になると思います。もしよろしければご覧になってください。

サイバートラストでは、Yoctoを使ったEMLinux製品の販売だけではなく、組込みLinux全般の開発支援も行っております。困りごとがございましたらお気軽にお声がけください。

タグ: