AN889の日記

組込みエンジニアのブログ

【Yocto】Intel 64ビットプロセッサー向けLinuxビルド(meta-intel)

はじめに

Intel 64ビットプロセッサー(x64)向けLinuxをYoctoでビルドする方法です。 meta-intel を使います。

環境構築

$ mkdir path/to/prj
$ mkdir sources
$ cd sources
$ git clone git://git.yoctoproject.org/poky -b kirkstone
$ git clone git://git.openembedded.org/meta-openembedded -b kirkstone
$ git clone git://git.yoctoproject.org/meta-intel -b kirkstone
$ cd ..
$ . ./sources/poky/oe-init-build-env build

設定

build/conf/local.conf
  • MACHINEの設定
MACHINE = "intel-corei7-64"
WKS_FILE = "image-installer.wks.in"
IMAGE_FSTYPES:append = " ext4"
IMAGE_TYPEDEP_wic = "ext4"
INITRD_IMAGE_LIVE = "core-image-minimal-initramfs"
do_image_wic[depends] += "${INITRD_IMAGE_LIVE}:do_image_complete"
do_image_wic[recrdeptask] += "do_image_ext4"
do_rootfs[depends] += "virtual/kernel:do_deploy"
IMAGE_BOOT_FILES:append = " \
${KERNEL_IMAGETYPE} \
    microcode.cpio \
    ${IMGDEPLOYDIR}/${IMAGE_BASENAME}-${MACHINE}.ext4;rootfs.img \
    ${@bb.utils.contains('EFI_PROVIDER', 'grub-efi', 'grub-efi-bootx64.efi;EFI/BOOT/bootx64.efi', '', d)} \
    ${@bb.utils.contains('EFI_PROVIDER', 'grub-efi', '${IMAGE_ROOTFS}/boot/EFI/BOOT/grub.cfg;EFI/BOOT/grub.cfg', '', d)} \
    ${@bb.utils.contains('EFI_PROVIDER', 'systemd-boot', 'systemd-bootx64.efi;EFI/BOOT/bootx64.efi', '', d)} \
    ${@bb.utils.contains('EFI_PROVIDER', 'systemd-boot', '${IMAGE_ROOTFS}/boot/loader/loader.conf;loader/loader.conf ', '', d)} \
    ${@bb.utils.contains('EFI_PROVIDER', 'systemd-boot', '${IMAGE_ROOTFS}/boot/loader/entries/boot.conf;loader/entries/boot.conf', '', d)} \
    "
build/conf/bblayers.conf
  • レシピパスの設定
BBLAYERS ?= " \
      ${TOPDIR}/../sources/poky/meta \
      ${TOPDIR}/../sources/poky/meta-poky \
      ${TOPDIR}/../sources/poky/meta-yocto-bsp \
      ${TOPDIR}/../sources/meta-openembedded/meta-oe \
      ${TOPDIR}/../sources/meta-openembedded/meta-networking \
      ${TOPDIR}/../sources/meta-openembedded/meta-python \
      ${TOPDIR}/../sources/meta-openembedded/meta-filesystems \
      ${TOPDIR}/../sources/meta-openembedded/meta-multimedia \
      ${TOPDIR}/../sources/meta-intel \
      "

ビルド

  • X11 の最小イメージ
$ bitbake core-image-x11
  • SATO デスクトップイメージ
$ bitbake core-image-sato

インストールUSBメモリーの作成

  • X11 の最小イメージ
$ sudo dd if=tmp/deploy/images/intel-corei7-64/core-image-x11-intel-corei7-64.wic of=/dev/sdx status=progress
  • SATO デスクトップイメージ
$ sudo dd if=tmp/deploy/images/intel-corei7-64/core-image-sato-intel-corei7-64.wic of=/dev/sdx status=progress

sdx は環境に合わせて変更ください。
[例]sdc

Windows機ならrufusで作成できます。
rufus.ie

ターゲット機のBIOSUEFI)でブートデバイス順序の第1をUSBにして、このUSBメモリーをターゲット機に挿して起動すればインストール開始します。

カスタマイズ

インストール開始までの待ち(タイムアウト)時間変更

デフォルトだと、インストール開始まで5秒待たされます。この待ち時間はsources/meta-intel/wic/image-installer.wks.inで変更できます。
[例]1秒

bootloader --ptable gpt --timeout=1 --append=" rootwait "
インストール処理の変更

インストール処理はsources/poky/meta/recipes-core/initrdscripts/files/init-install-efi.shに記述されています。 インストール処理を変更したい場合はこのファイルを編集ください。

  • [例]インストール先指定に待ち時間を設定
--- sources/poky/meta/recipes-core/initrdscripts/files/init-install-efi.sh.orig      2023-12-26 13:21:42.493604948 +0900
+++ sources/poky/meta/recipes-core/initrdscripts/files/init-install-efi.sh     2023-12-07 09:14:09.962019853 +0900
@@ -101,12 +101,16 @@

 # Get user choice
 while true; do
-    echo "Please select an install target or press n to exit ($hdnamelist ): "
-    read answer
+    echo "Please select an install target or press n to exit ($hdnamelist ), waiting for 5 secs ...: "
+    read -t 5 answer || true
     if [ "$answer" = "n" ]; then
         echo "Installation manually aborted."
         exit 1
     fi
+    if [ -z "$answer" ]; then
+        echo "Default target (sda) selected."
+        answer=sda
+    fi
     for hdname in $hdnamelist; do
         if [ "$answer" = "$hdname" ]; then
             TARGET_DEVICE_NAME=$answer
  • [例]インストール先の強制フォーマット
 @@ -208,7 +212,7 @@
 mkfs.vfat $bootfs

 echo "Formatting $rootfs to ext4..."
-mkfs.ext4 $rootfs
+mkfs.ext4 -F $rootfs

 echo "Formatting swap partition...($swap)"
 mkswap $swap
  • [例]ブートオプションの変更
@@ -274,7 +278,7 @@
     # delete any root= strings
     sed -i "s/ root=[^ ]*/ /" $SYSTEMDBOOT_CFGS
     # add the root= and other standard boot options
-    sed -i "s@options *@options root=PARTUUID=$rootuuid rw $rootwait quiet @" $SYSTEMDBOOT_CFGS
+    sed -i "s@options *@options root=PARTUUID=$rootuuid rw $rootwait @" $SYSTEMDBOOT_CFGS
 fi

 umount /tgt_root
Linuxブートまでの待ち(タイムアウト)時間変更

デフォルトだと、Linuxブートまで10秒待たされます。この待ち時間はbuild/conf/local.confに下記追加で変更できます。
[例]1秒

SYSTEMD_BOOT_TIMEOUT = "1"