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

このうち、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として記述するだけだ。
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