Porter image deployment on target
Once the Porter image has been built with Yocto, we can deploy it on an empty SD card to prepare its use on the target.
SD card image creation
First, we need to generate an SD card disk image file. For this purpose, a helper script is provided within the container. Here below is the way to use it.
Linux, Mac OS X ©
cd /xdt/build
mksdcard /xdt/build/tmp/deploy/images/porter/agl-demo-platform-porter-20XXYYZZxxyyzz.rootfs.tar.bz2 /home/devel/mirror
Windows ©
cd /xdt/build
sudo dd if=/dev/zero of=/sprs.img bs=1 count=1 seek=4G
sudo mkfs.ext4 /sprs.img
sudo mkdir /tmp/sprs
sudo mount /sprs.img /tmp/sprs
sudo mksdcard /xdt/build/tmp/deploy/images/porter/agl-demo-platform-porter-20XXYYZZxxyyzz.rootfs.tar.bz2
/tmp/sprs/sdcard.img
xz -dc /tmp/sprs/sdcard.img.xz > $XDT_WORKSPACE/agl-demo-platform-porter-sdcard.img
You should get the following prompt during the mksdcard
step:
Creating the image agl-demo-platform-porter-sdcard.img ...
0+0 records in
0+0 records out
0 bytes (0 B) copied, 6.9187e-05 s, 0.0 kB/s
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done
Creating filesystem with 524287 4k blocks and 131072 inodes
Filesystem UUID: 5307e815-9acd-480b-90fb-b246dcfb28d8
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
Extracting image tarball...
done
Image agl-demo-platform-porter-sdcard.img created!
Set the following uboot environment
setenv bootargs_console 'console=ttySC6,38400 ignore_loglevel'
setenv bootargs_video 'vmalloc=384M video=HDMI-A-1:1920x1080-32@60'
setenv bootargs_root 'root=/dev/mmcblk0p1 rootdelay=3 rw rootfstype=ext3 rootwait'
setenv bootmmc '1:1'
setenv bootcmd_sd 'ext4load mmc ${bootmmc} 0x40007fc0 boot/uImage+dtb'
setenv bootcmd 'setenv bootargs ${bootargs_console} ${bootargs_video} ${bootargs_root}; run bootcmd_sd; bootm 0x40007fc0'
saveenv
NB: replace bootmmc value '1:1' with '0:1' or '2:1' to access the good slot
use 'ext4ls mmc XXX:1' to test access
$ ls -lh $XDT_WORKSPACE
-rw-r--r-- 1 devel devel 2.0G Feb 15 14:13 agl-demo-platform-porter-sdcard.img
After the disk image is created, we can copy it on the SD card itself using an SD card adapter. To do so, we need to gain access to the SD card image file from our host machine.
If you already share a directory between your host machine and the container (as described in section Set up a persistent workspace), this state is already reached and you go directly on sections relating the SD card image installation.
Otherwise, you need to copy the SD card image file out of the container and into your host machine using SSH protocol:
- On Linux and Mac OS X hosts, you can use the
scp
command, which is part of the OpenSSH project, - On Windows hosts, you can use the
pscp.exe
binary, which is part of the PuTTY project.
Deployment from a Linux or Mac OS X host
Now that the SD card image is ready, the last step required is to “flash” it onto the SD card itself.
First, you need an SD card adapter connected to your host machine. Depending on your adapter type and OS, the relevant block device can change. Mostly, you can expect:
/dev/sdX
block device; usually for external USB adapters on Linux hosts./dev/mmcblkN
: when using a laptop internal adapter on Linux hosts./dev/diskN
: on Mac OS X hosts.
Linux
If you do not know which block device you should use, you can check the kernel logs using the following command to figure out what is the associated block devices:
$ dmesg | grep mmcblk
$ dmesg | grep sd
[...snip...]
[1131831.853434] sd 6:0:0:0: [sdb] 31268864 512-byte logical blocks: (16.0 GB/14.9 GiB)
[1131831.853758] sd 6:0:0:0: [sdb] Write Protect is on
[1131831.853763] sd 6:0:0:0: [sdb] Mode Sense: 4b 00 80 08
[1131831.854152] sd 6:0:0:0: [sdb] No Caching mode page found
[1131831.854157] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[1131831.855174] sd 6:0:0:0: [sdb] No Caching mode page found
[1131831.855179] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[...snip...]
$
In this example, no mmcblk
device where found, but a 16.0GB disk was
listed and can be accessed on /dev/sdb
which in our case is the
physical SD card capacity.
The command lsblk
is also a good solution to explore block devices:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
|--sda1 8:1 0 8G 0 part /
|--sda2 8:2 0 16G 0 part [SWAP]
|--sda3 8:3 0 907.5G 0 part
|--vg0-usr 254:0 0 32G 0 lvm /usr
|--vg0-data 254:1 0 200G 0 lvm /data
|--vg0-home 254:2 0 100G 0 lvm /home
|--vg0-var 254:3 0 8G 0 lvm /var
|--vg0-docker 254:4 0 100G 0 lvm /docker
sdb 8:16 0 223.6G 0 disk
|--sdb1 8:17 0 223.6G 0 part /ssd
sdc 8:32 1 3.7G 0 disk <-- SD card plugged into USB card reader
|--sdc1 8:33 1 2G 0 part <--
sr0 11:0 1 1024M 0 rom
In this example, the 4GB device /dev/sdc
is listed as removable
(column RM) and corresponds to a SD Card plugged into an USB card
reader.
Finally, as we know the block device which corresponds to our SD card,
we can raw-copy the image on it using the following command **from your
host terminal** : (replace /dev/sdZ
by the appropriate device)
$ xzcat ~/mirror/agl-demo-platform-porter-20XXYYZZxxyyzz.raw.xz | sudo dd of=/dev/sdZ bs=1M
2048+0 records in
2048+0 records out
2147483648 bytes (2.0 GB) copied, 69 s, 39.2 MB/s
$ sync
This will take few minutes to copy and sync. You should not remove the card from its slot until both commands succeed.
Once it is finished, you can unplug the card and insert it in the micro-SD card slot on the Porter board, and perform a power cycle to start your new image on the target.
**NB:** The output format is also suitable to bmaptool
utility (source
code available here: https://github.com/01org/bmap-tools:
this significantly speeds up the copy as only relevant data are written on
the Sdcard (filesystem “holes” are not written). It’s also supporting
direct access to URLs pointing to compressed images.
Mac OS X ©
If you do not know which block device you should use, you can use the
diskutil
tool to list them:
$ diskutil list
[...snip...]
/dev/disk2
#: TYPE NAME SIZE IDENTIFIER
0: Fdisk_partition_scheme 7.9 GB disk2
1: Linux 7.9 GB disk2s1
[...snip...]
$
In this example, we have a 8.0GB disk which can be accessed on
/dev/disk2
which in our case is the physical SD card capacity.
Finally, as we know the block device which accesses our SD card, we can raw-copy the image on it using the following command from your host terminal:
$ xzcat ~/mirror/agl-demo-platform-porter-20XXYYZZxxyyzz.raw.xz | sudo dd of=/dev/disk2 bs=1M
2048+0 records in
2048+0 records out
2147483648 bytes (2.0 GB) copied, 69 s, 39.2 MB/s
$ sync
This will take few minutes to copy and sync. You should not remove the card from its slot until both commands succeed.
Once it is finished, you can unplug the card and insert it in the micro-SD card slot on the Porter board, and perform a power cycle to start your new image on the target.
Deployment from a Windows host
Now that the SD card image is ready, the last step required is to “flash” it onto the SD card itself.
First, you need an SD card adapter connected to your host machine.
We will then use the Win32DiskImager
program which we will download at
this URL:
http://sourceforge.net/projects/win32diskimager/
and by clicking on this button:
We will then install it:
{style width:48%; float:left; margin-right:0.3em} {style width:48%; float:right}
And then start it with its icon:
We can then click on the “blue folder” button to select our .img file (uncompress the XZ image first using utilities like 7zip for example).
After having verified that the drive letter on the right matches our SD card reader, we click on the “Write” button to start the flashing process.
This will take few minutes to copy and sync. You should not remove the card from its slot until both commands succeed.
Once it is finished, you can unplug the card and insert it in the micro-SD card slot on the Porter board, and perform a power cycle to start your new image on the target.