FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Zynq用Yocto-LinuxをビルドするためのVagrantfileとchef

ビルドが失敗する理由はタイムアウトが短かすぎるせいだった。 修正方法をに記載しました。

msyksphinz.hatenablog.com

Yocto-Linuxってビルドするのに手順が多くて、良く忘れてしまう。 そして、一度ビルドするとその方法ってそうそう変わらないので、こういうものこそVagrantで仮想化した環境を持っておいて、Chefで形式化してしまおう。

Vagrant上のLinuxからSD-Cardにアクセスできるようにする。

通常の方法では、Vagrant上のUbuntuは、SDカードを認識できるようにはなっていない。 まず、VirtualBoxでUSBデバイスがどのように認識されているのか調査した。これにはVBoxManage.exeを使う。

$ VBoxManage.exe list help
Oracle VM VirtualBox Command Line Management Interface Version 4.3.28
(C) 2005-2015 Oracle Corporation
All rights reserved.

Usage:

VBoxManage list [--long|-l] vms|runningvms|ostypes|hostdvds|hostfloppies|
                            intnets|bridgedifs|hostonlyifs|natnets|dhcpservers|
                            hostinfo|hostcpuids|hddbackends|hdds|dvds|floppies|
                            usbhost|usbfilters|systemproperties|extpacks|
                            groups|webcams


Syntax error: Unknown subcommand "help".

という訳で、

$ VBoxManage.exe list usbhost
Host USB Devices:

UUID:               9648dad6-7ae6-416a-a1ce-ef206fc9d9ee
VendorId:           0x046d (046D)
ProductId:          0xc531 (C531)
Revision:           33.0 (3300)
Port:               0
USB version/speed:  2/2
Manufacturer:       Logitech
Product:            USB Receiver
Address:            {36fc9e60-c465-11cf-8056-444553540000}\0039
Current State:      Busy

UUID:               fe977f7f-734f-489f-946f-95a935d3dd35
VendorId:           0x05ac (05AC)
ProductId:          0x12a8 (12A8)
Revision:           6.1 (0601)
Port:               0
USB version/speed:  2/2
Manufacturer:       Apple Inc.
Product:            iPhone
SerialNumber:       06180e666d3694d6f8a23cd64e143b750e302ed1
Address:            {36fc9e60-c465-11cf-8056-444553540000}\0034
Current State:      Busy

UUID:               66eaba18-222c-4016-a208-28dfb36530ad
VendorId:           0x1307 (1307)
ProductId:          0x0310 (0310)
Revision:           1.0 (0100)
Port:               0
USB version/speed:  2/2
Manufacturer:       Generic
Product:            Mass Storage Device
Address:            {36fc9e60-c465-11cf-8056-444553540000}\0009
Current State:      Captured

UUID:               f24b2cca-9e0b-4714-8e10-d05b54f31dae
VendorId:           0x1307 (1307)
ProductId:          0x0310 (0310)
Revision:           1.0 (0100)
Port:               0
USB version/speed:  2/2
Manufacturer:       Generic
Product:            Mass Storage Device
SerialNumber:       00000000000006
Address:            \\?\usb#vid_80ee&pid_cafe#00000000000006#{00873fdf-cafe-80ee-aa5e-00c04fb1720b}
Current State:      Captured

UUID:               e883a1e6-c723-4e61-88a8-49088013cb0b
VendorId:           0x17ef (17EF)
ProductId:          0x6047 (6047)
Revision:           3.0 (0300)
Port:               0
USB version/speed:  2/2
Manufacturer:       Lenovo
Product:            ThinkPad Compact USB Keyboard with TrackPoint
Address:            {36fc9e60-c465-11cf-8056-444553540000}\0037
Current State:      Busy

UUID:               84f6a207-0345-4c13-98f5-1ae265fdc670
VendorId:           0x21ee (21EE)
ProductId:          0x1100 (1100)
Revision:           3.145 (03145)
Port:               0
USB version/speed:  2/2
Manufacturer:       Broadcom Corp
Product:            Broadcom Bluetooth V3.0 USB Device
SerialNumber:       0009DD40680B
Address:            {e0cbf06c-cd8b-4647-bb8a-263b43f0f974}\0000
Current State:      Busy

おお、いろいろ出て来た。 まず注目すべきは、USB接続のSDカードアダプタ、そして、SDカードそのものだ。

UUID:               66eaba18-222c-4016-a208-28dfb36530ad
VendorId:           0x1307 (1307)
ProductId:          0x0310 (0310)
Revision:           1.0 (0100)
Port:               0
USB version/speed:  2/2
Manufacturer:       Generic
Product:            Mass Storage Device
Address:            {36fc9e60-c465-11cf-8056-444553540000}\0009
Current State:      Captured

f:id:msyksphinz:20150720102944j:plain

このうち、SDカードの情報をVagrantfileに追加すれば、USBデバイスとして認識できるらしい。やってみよう。

github.com

    vb.customize ['modifyvm', :id, '--usb', 'on']

    vb.customize ['usbfilter', 'add', '1',
                  '--target', :id,
                  '--name', 'Any mass storage',
                  '--manufacturer', 'Generic',
                  '--product', 'Mass Storage Device']

これで、vagrant upすると、SDカードがデバイスとして認識されている。

$ lsusb
Bus 001 Device 002: ID 1307:0310 Transcend Information, Inc. SD/MicroSD CardReader [hama]
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    40G  0 disk
└─sda1   8:1    0    40G  0 part /
sdc      8:32   1   3.7G  0 disk
└─sdc1   8:33   1   3.7G  0 part

Chefを使ってYocto-Linuxをビルドする

結局は、以下の書籍に書いてあることをrecipeとして記述するだけだ。

FPGAマガジンNo.5 Linux/Android×FPGA

FPGAマガジンNo.5 Linux/Android×FPGA

github.com

Chef化するにあたって迷ったところ。

bitbake を実行するのだが、この時にRootユーザであってはならないらしい。従って、Chefにはユーザ名を指定している。

git "/home/vagrant/poky/meta-xilinx" do
  user "vagrant"
  repository "git://git.yoctoproject.org/meta-xilinx"
  revision "master"
  enable_submodules true
  action :sync
end

ときどきビルドが失敗する

時々、Sigtermを出して失敗する。その場合は、何度か vagrant provision を繰替えせば、最終的にビルドが実行できるようになる。

==> default: NOTE: recipe gettext-native-0.19.4-r0: task do_patch: Succeeded
==> default: NOTE: Running task 260 of 2265 (ID: 574, virtual:native:/home/vagrant/poky/meta/recipes-core/gettext/gettext_0.19.4.bb, do_configure)
==> default: NOTE: recipe gettext-native-0.19.4-r0: task do_configure: Started
==> default: STDERR: ERROR: UI received SIGTERM
==> default: Traceback (most recent call last):
==> default:   File "/home/vagrant/poky/bitbake/bin/bitbake", line 45, in <module>
==> default:     cookerdata.CookerConfiguration()))
==> default:   File "/home/vagrant/poky/bitbake/lib/bb/main.py", line 384, in bitbake_main
==> default:     server_connection.terminate()
==> default:   File "/home/vagrant/poky/bitbake/lib/bb/server/process.py", line 189, in terminate
==> default:     self.procserver.stop()
==> default:   File "/home/vagrant/poky/bitbake/lib/bb/server/process.py", line 163, in stop
==> default:     self.quitin.send("quit")
==> default: IOError: [Errno 9] Bad file descriptor
==> default: ---- End output of "bash"  "/tmp/chef-script20150720-2509-qa85nb" ----
==> default: Ran "bash"  "/tmp/chef-script20150720-2509-qa85nb" returned
==> default: [2015-07-20T15:51:57+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

これについては、まだ原因不明...

$ vagrant provision
==> default: Running provisioner: chef_solo...
==> default: Detected Chef (latest) is already installed
Generating chef JSON and uploading...
==> default: Running chef-solo...
==> default: stdin: is not a tty
==> default: [2015-07-20T07:12:59+00:00] INFO: Forking chef instance to converge...
==> default: [2015-07-20T07:12:59+00:00] INFO: *** Chef 12.4.1 ***
==> default: [2015-07-20T07:12:59+00:00] INFO: Chef-client pid: 27870
==> default: [2015-07-20T07:13:04+00:00] INFO: Setting the run_list to ["recipe[yocto-tools]"] from CLI options
==> default: [2015-07-20T07:13:04+00:00] INFO: Run List is [recipe[yocto-tools]]
==> default: [2015-07-20T07:13:04+00:00] INFO: Run List expands to [yocto-tools]
==> default: [2015-07-20T07:13:04+00:00] INFO: Starting Chef Run for vagrant-ubuntu-trusty-64
==> default: [2015-07-20T07:13:04+00:00] INFO: Running start handlers
==> default: [2015-07-20T07:13:04+00:00] INFO: Start handlers complete.
==> default: [2015-07-20T07:13:04+00:00] INFO: execute[sed apt-source] ran successfully
==> default: [2015-07-20T07:13:08+00:00] INFO: execute[update package index] ran successfully
==> default: [2015-07-20T07:13:08+00:00] INFO: execute[sed apt-source] ran successfully
==> default: [2015-07-20T07:49:25+00:00] INFO: bash[Format Build environment] ran successfully
==> default: [2015-07-20T07:49:25+00:00] INFO: Chef Run complete in 2181.180758673 seconds
==> default: [2015-07-20T07:49:25+00:00] INFO: Skipping removal of unused files from the cache
==> default: [2015-07-20T07:49:25+00:00] INFO: Running report handlers
==> default: [2015-07-20T07:49:25+00:00] INFO: Report handlers complete