talk: fosdem-2020: Add Yocto talk.

talks/fosdem-2020/yocto: New directory.
This commit is contained in:
Mathieu Othacehe 2020-02-18 18:26:47 +01:00
parent ddabe3a073
commit edb12281e4
No known key found for this signature in database
GPG Key ID: 8354763531769CA6
12 changed files with 375 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

View File

@ -0,0 +1,375 @@
#+TITLE: GNU Guix as an alternative to the Yocto Project
#+AUTHOR: Mathieu Othacehe <m.othacehe@gmail.com>
#+DATE: 2020-02-02
#+OPTIONS: H:1 toc:nil num:t
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [presentation]
#+BEAMER_HEADER: \setbeamertemplate{footline}[page number]{}
#+BEAMER_HEADER: \setbeamertemplate{navigation symbols}{}
#+BEAMER_THEME: Madrid
#+begin_src emacs-lisp :results output silent :exports none
(setq org-latex-listings 'minted
org-latex-packages-alist '(("newfloat" "minted"))
org-latex-pdf-process
'("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
"pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")))
#+end_src
* About myself
#+ATTR_LATEX: :width 5cm
[[file:drone.png]]
- Working as a Linux embedded engineer for 7 years.
- Mostly making drones and other IOT devices using Buildroot, Yocto, and
Alchemy (Android based build system).
* Using the right tools
#+ATTR_LATEX: :width 6cm
[[file:tools.png]]
- I've been switching from distributions to distributions, from desktop
environments to desktop environments for a few years.
- Kept using GNU Emacs the whole time.
- Never found in Buildroot, Yocto and AOSP[fn:1] build system a tool that I could rely
on to produce embedded Linux root file-systems.
[fn:1] Android Open Source Project
* GNU Guix
#+ATTR_LATEX: :width 2cm
[[file:guix.png]]
- In the meantime, I'm quite involved with GNU Guix.
- Who has ever heard of GNU Guix?
- GNU Guix is many things:
- package manager
- tool to instanciate an operating system
- container provisioning tool
- continuous integration/deployment tool
* GNU Guix vs Yocto
What to expect from Yocto & friends?
- A tool that can generate disk-images.
- A wide board support & packages database.
- A versatile tool that can adapt to industrial mess (X boards x Y hardware
revisions).
* Let's fly
#+ATTR_LATEX: :width 10cm
[[file:pinea64_ardupilot.png]]
- Let's take a real world use case to compare both tools: installation of
Ardupilot[fn:2] on a Pine A64 LTS.
[fn:2] Unmanned vehicle autopilot software.
* Using Yocto
** Bash
:PROPERTIES:
:BEAMER_col: 0.8
:END:
#+ATTR_LATEX: :options fontsize=\small,breaklines=true
#+begin_src bash
apt install gawk wget gt-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev xterm
git clone git://git.yoctoproject.org/poky && cd poky
git clone https://github.com/alistair23/meta-pine64.git
. oe-init-build-env
bitbake-layers add-layer ../meta-pine64
# This package does not exist yet.
echo 'IMAGE_INSTALL_append = "ardupilot"' >> conf/local.conf
MACHINE=pine-a64-lts bitbake core-image-base
#+end_src
* Unexpected failures
** Output
:PROPERTIES:
:BEAMER_env: alertblock
:END:
#+ATTR_LATEX: :options fontsize=\scriptsize
#+begin_src console
WARNING: Host distribution "ubuntu-19.10" has not been validated with this
version of the build system; you may possibly experience unexpected
failures. It is recommended that you use a tested distribution.
#+end_src
** Is it bad?
:PROPERTIES:
:BEAMER_env: alertblock
:END:
- I don't want to go any further. Build should be distribution independant
and fully reproducible.
* Yocto build result
- 8 hours and 50GB later, I have a disk-image than I can copy onto an
SD-card, and boot from.
* Using GNU Guix
** Operating system configuration (config.scm)
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options fontsize=\tiny,breaklines=true
#+begin_src scheme
(use-modules (gnu) (gnu bootloader u-boot) (gnu packages drones))
(operating-system
(host-name "vignemale")
(timezone "Europe/Paris")
(locale "en_US.utf8")
(bootloader (bootloader-configuration
(bootloader u-boot-pine64-lts-bootloader)
(target "/dev/vda")))
(initrd-modules (cons* "sunxi-mmc" "sd_mod" "axp20x-rsb" "axp20x-regulator"
%base-initrd-modules))
(file-systems (cons (file-system
(device (file-system-label "my-root"))
(mount-point "/")
(type "ext4"))
%base-file-systems))
(packages (cons arducopter-bbbmini %base-packages))
(services (cons (service agetty-service-type
(agetty-configuration
(extra-options '("-L")) ; no carrier detect
(baud-rate "115200")
(term "vt100")
(tty "ttyS0")))
%base-services)))
#+end_src
* Using GNU Guix
** Create the disk-image
:PROPERTIES:
:BEAMER_env: block
:END:
#+begin_src python
guix system disk-image --target aarch64-linux-gnu config.scm
#+end_src
** Flash it
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options fontsize=\small
#+begin_src bash
dd if=/gnu/store/yjslrvdszyng7ism4cdy-disk-image of=/dev/mmcblk0
#+end_src
** Disclaimer
This will not work using the current GNU Guix 1.0.1 release.
* Using GNU Guix
#+ATTR_LATEX: :width 10cm
[[file:guix-pinea64.png]]
In short:
- 1 file and 1 command.
- A few minutes to build a whole disk-image with substitutes locally
available.
* Now fly!
* Tool organization
- Yocto has many layers, maintained by different entites. Quality and support
of those layers can vary substantially.
- Guix has one Git repository and supports 12000 packages on 4
architectures. It is also possible to add external packages definitions
using various mechanisms.
* Tool organization
#+ATTR_LATEX: :width 12cm
[[file:layers.png]]
* Build reproducibility
Both GNU Guix and Yocto aim for "Reproducible builds". But Yocto also states:
** Yocto wiki
:PROPERTIES:
:BEAMER_env: block
:END:
#+begin_quote
"Depending on your circumstances and requirements, it may help to:
- build on the same distro version with the same installed packages
- build in the same path
- use the same build hardware"
#+end_quote
* Build reproducibility
- GNU Guix is building in isolated build environments. You can expect the same
result using different host distributions and different build paths!
- No need to use a docker image or a virtual machine to be able to reproduce a
build, running the same version of GNU Guix is enough.
* Substitutes and offloading
- Using substitutes, disk-space and build time is considerably reduced. By
default, GNU Guix will use an official build farm to get substitutes.
- It is also very is easy to setup build offloading to different machines on
different architectures.
- Yocto can setup shared sstate cache but if you are not running the same
distro at the same exact version, chances of hitting substitutes are
reduced.
* Deploying the same config on multiple supports
An operating-system object can be instanciated on multiple supports.
** Deploy systems
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options escapeinside=||
#+begin_src bash
# Create a disk image for the host architecture.
guix system disk-image config.scm
# Create a disk image for a target architecture.
guix system disk-image --target aarch64-linux-gnu config.scm
# Reconfigure my running Guix System.
guix system reconfigure config.scm
# Create a virtual machine image.
guix system vm-image config.scm
# Deploy to remote servers.
guix deploy deploy.scm
#+end_src
* Tool handling as an integrator
** Creating multiple vehicles
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options fontsize=\tiny,breaklines=true
#+begin_src scheme
(use-modules (gnu)
(gnu packages drones)
(base-system))
(define (ardupilot-package vehicle)
(case vehicle
((copter) arducopter-bbbmini)
((plane) arduplane-bbbmini)
(else (error "Unsupported vehicle."))))
(define (make-vehicle vehicle)
(operating-system
(inherit my-base-os)
(packages
(cons (ardupilot-package vehicle) %base-packages))))
(make-vehicle 'copter)
;;(make-vehicle 'plane)
#+end_src
* Tool handling as an integrator
** Enjoying Guix scheme API
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options fontsize=\tiny,breaklines=true
#+begin_src scheme
;; Get all licenses.
(format #t "Using licenses: ~%~{ - ~a~%~}%"
(delete-duplicates
(map license-name
(flatten (map package-license
(operating-system-packages my-os))))))
#+end_src
** Result
#+ATTR_LATEX: :options fontsize=\tiny,breaklines=true
#+begin_src console
Using licenses:
- GPL 2+
- GPL 2
- GPL 3+
- LGPL 2.0+
- Original BSD
- Public Domain
- MPL 2.0
- Modified BSD
- ISC
- LGPL 2.1+
- X11
- LGPL 2.0
- LGPL 3+
- non-copyleft
#+end_src
* Tool handling as an integrator
** Enjoying Guix scheme API
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options fontsize=\tiny,breaklines=true
#+begin_src scheme
;; Get all packages licensed GPL 3+.
(format #t "Packages licensed GPL 3+: ~{~a ~}~%"
(map package-name
(filter (lambda (package)
(any (lambda (license)
(equal? license gpl3+))
(flatten (list (package-license package)))))
(operating-system-packages os))))
#+end_src
** Result
#+ATTR_LATEX: :options fontsize=\tiny,breaklines=true
#+begin_src console
Packages licensed GPL 3+: which less zile nano util-linux-with-udev inetutils info-reader guile-readline guile-colorized bash coreutils findutils grep sed diffutils patch gawk tar gzip lzip
#+end_src
* Tool handling as a developer
** Adding an SSH server
:PROPERTIES:
:BEAMER_env: block
:END:
#+ATTR_LATEX: :options fontsize=\small,breaklines=true
#+begin_src scheme
(use-modules (gnu)
(gnu services ssh)
(base-system))
(operating-system
(inherit my-base-os)
(services
(cons (service openssh-service-type
(openssh-configuration
(permit-root-login 'without-password)
(authorized-keys
`(("mathieu"
,(local-file
"/home/mathieu/.ssh/id_rsa.pub"))))
(port-number 2222)))
%base-services)))
#+end_src
* Some limits
- Many packages build natively but fail to cross-compile.
- The minimal image isn't minimal yet (1.5GB vs 300MB).
- No support for minimalistic libc.
- Board support catalog still has to be improved.
* Conclusion
- GNU Guix is already a real alternative to Yocto.
- Build reproducibility and substitutes make developments faster and easier.
- The GNU Guix high level Scheme API can benefit system integrators as
well as developers.
- GNU Guix is fun, come help us!
* Thank you
- Thanks for your attention.
- Any questions?

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB