ビルドが失敗する理由はタイムアウトが短かすぎるせいだった。 修正方法をに記載しました。
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デバイスとして認識できるらしい。やってみよう。
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
- 作者: Interface編集部
- 出版社/メーカー: CQ出版
- 発売日: 2014/04/26
- メディア: 単行本
- この商品を含むブログを見る
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