From 65149417e1deb23f83726edfd41f3215ae0591e0 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Tue, 13 Oct 2020 14:46:56 +0200 Subject: add 2020-09-29 and 2020-10-{06,13} slides --- 2020-09-29.md | 387 +++++++++++++++++++++++++++ 2020-10-06.md | 119 +++++++++ 2020-10-13.md | 432 +++++++++++++++++++++++++++++++ Makefile | 13 +- bibliography.bib | 21 ++ res/DHCP_session.png | Bin 0 -> 61621 bytes res/home-network.jpg | Bin 0 -> 75431 bytes res/plantuml/buildroot-overview.plantuml | 34 +++ res/plantuml/buildroot-process.plantuml | 41 +++ res/plantuml/buildroot-project.plantuml | 41 +++ res/rfc791.pdf | Bin 0 -> 52132 bytes res/rfc791.png | Bin 0 -> 314322 bytes 12 files changed, 1086 insertions(+), 2 deletions(-) create mode 100644 2020-09-29.md create mode 100644 2020-10-06.md create mode 100644 2020-10-13.md create mode 100644 res/DHCP_session.png create mode 100644 res/home-network.jpg create mode 100644 res/plantuml/buildroot-overview.plantuml create mode 100644 res/plantuml/buildroot-process.plantuml create mode 100644 res/plantuml/buildroot-project.plantuml create mode 100644 res/rfc791.pdf create mode 100644 res/rfc791.png diff --git a/2020-09-29.md b/2020-09-29.md new file mode 100644 index 0000000..8aa0608 --- /dev/null +++ b/2020-09-29.md @@ -0,0 +1,387 @@ +--- +title: WTF is Linux +author: Rémi Nicole +date: 2020-09-29 +slide-level: 2 +aspectratio: 169 + +theme: metropolis +colortheme: owl +beameroption: "show notes on second screen=right" + +toc: true +highlightstyle: breezedark +lang: en-US + +bibliography: ../bibliography.bib +--- + +# Before we get started + +## Reminder + +- Please fill the [form](https://mensuel.framapad.org/p/zufgimy2yy-9j3n) +- Please have a GNU/Linux system with an SD card reader + + +## Where were we + +::: notes + +- We managed to boot the system! +- What we needed was: + - A file system to store files, and to be used as the root directory + - An init program in this file system, and started by the kernel + +::: + + +# It works but... + + +## The init problem + +- init is a shell +- we want to automate some tasks: + - re-mounting the `/` directory in read-write mode + - networking? + - anything our system should do + + +## The networking problem + +- We want to access the network: + - get updates + - execute our primary function + + +## The user problem + +users, anyone? + +::: notes + +- At no point in our creation of a system we had to create a user, or add + a password + +::: + + +# Automating tasks + +## Goal + +We want to execute programs or code when the system is starting + + +## Attempt number 1 + +Let's make a shell script + +::: notes + +- Instead of just launching a command-line as first program, let's execute some + commands automatically before, and *then* launch the command-line + +::: + + +## Attempt number 2 + +Let's use SysV-style init + + +## SysV-style init + +- The init process reads `/etc/inittab` +- Starts processes as specified by this configuration + + +## inittab + +This file is a series of files in this format: + +```ini +::: +``` + +::: notes + +Busybox does not support each of these features + +::: + +## inittab (Busybox version) + +```ini +# ,-- out of scope +# | +# vvv + ::: +``` + +`action` can be one of: + +- sysinit +: normal process started at boot +- shutdown +: process started before shutting down +- reboot +: process started before rebooting +- ... + +## inittab example + +```ini +# Mount /proc and /sys, and remount / in read-write mode +::sysinit:/etc/init.d/mount-special-filesystems + +# Setup the network +::sysinit:/etc/init.d/setup-network start + +# Start additional services +::sysinit:/etc/init.d/miniserve start + +# ... +``` + +::: notes + +- Note the start argument in the two last services + +::: + +## Changing to SysV-style init + +We just have to change the `init=` kernel parameter to Busybox's `init`. + +## The long-running processes problem + +- We need to launch long-running processes in the background +- We also need a way to stop them + +::: notes + +- We might want to stop a process if something goes wrong, if we want to modify + the configuration, etc. + +::: + + +## The `start-stop-daemon` command + +Can do multiple things: + +- Start a process in a background +- Start a process as a different user +- Write the PID of the launched process into a file (called a "PID file") +- Kill a process with a PID file + +:::notes + +- We don't have our users figured out yet +- Reminder, this is still the old/light way of doing things, so you might not + have this command on your Linux + +::: + + +## Example service script + +```sh +#!/bin/sh + +PIDFILE="/var/run/myprogram.pid" + +case "$1" in + start) + start-stop-daemon -S -p "$PIDFILE" -m -b \ + -x myprogram -- args... + ;; + stop) + start-stop-daemon -K -p "$PIDFILE" + ;; +esac +``` + +# Networking + +## What's in an IP packet + +![Anatomy of an IP packet[@corkami:rfc791]](../res/rfc791.png){ height=80% } + +::: notes + +- From this, we can conclude that we need an IP address for every packet sent + over IP + +- Also, we see that we cannot contact a server through it's domain name (like + google.com), we have to use IP addresses + +::: + +## A home network + +![Home network example[@wikimedia:network1]](../res/home-network.jpg){ height=80% } + +## Some definitions + +- IP address +: Identifier that allows you to get messages/packets +- Subnet +: A defined subset of all IP addresses. For example 192.168.1.0/24 means all IP + addresses from 192.168.1.0 to 192.168.1.255 +- Router +: Machine that connects one subnet to another. Usually, it is the subnet of + your home, to the global internet +- Gateway +: A machine where you send your internet packets, so that they are transferred + to the "real" recipient. It is usually your router. + +::: notes + +- The `/24` in the example subnet is what we call a "mask" + +It is nice to have a postal mail analogy. In this case: + +- IP address is your home address +- Subnet is your town name, street name +- Router and gateway would be your postman company (La Poste, UPS, Fedex, or + whatever) + +::: + +## Network interfaces + +- Represent a way to connect to a network +- Stores each: + - One or more IP address + - A subnet + +::: notes + +- If you have two Ethernet ports, you could connect to two different networks +- In this example you would have one interface for each of your Ethernet port +- And maybe one more interface for your WiFi connection, if you have the + hardware for it + +::: + +## What you need to connect to a network + +- An IP address +- The subnet of your network +- A gateway, if you want to connect your network to other networks, like the + world wide web +- A DNS server's IP address, if you want to resolve host names, like + + +## Configuring a network interface + +- The static way +- The dynamic way + +::: notes + +- The static way is simpler to configure, but you have to know in advance the + device that are going to connect to your network, and have a static IP + address for all of them + - You also have to know in advance the subnet and IP address of your router + +- The dynamic way is the one that you use on your personal computers + - This is the mode were you try to ask for all these parameters + +::: + +## The static way + +```sh +# Set the IP address and subnet +ip addr add $ip/$mask dev $interface +# Activate this interface +ip link set $interface up +# Set the default gateway +ip route add default via $gateway dev $interface +# Add the default DNS server +echo "nameserver $nameserver_ip" >> /etc/resolv.conf +``` + +::: notes + +For QEMU's defaults: + +- `busybox ip addr add 10.0.2.42/24 dev eth0` +- `busybox ip link set eth0 up` +- `busybox ip route add default via 10.0.2.2 dev eth0` +- `echo "nameserver 10.0.2.3" >> /etc/resolv.conf` + +::: + +## The dynamic way + +- DHCP for the win! +- meaning Dynamic Host Configuration Protocol + +. . . + +- we need a DHCP client on our machine and a DHCP server on the network + +::: notes + +DHCP is a protocol that allows us to get all of this information: + +- A new, unused IP address +- The subnet of the network +- The address of the gateway +- The address of the DNS server + +::: + +## DHCP overview + +![DHCP overview[@wikimedia:dhcp]](../res/DHCP_session.png){ height=80% } + +## Implementation + +- Here we can use the `udhcpc` command of Busybox + +# Users + +## Current status + +Right now we have none + +::: notes + +Do a `ls -l` on the machine + +::: + + +## The passwd file + +Each line of `/etc/passwd` contains: + +- Login name (what we were missing) +- Field unused today (was the password, but it got moved to another file) +- Numerical ID of the user +- Numerical ID of the main group for user +- User name or comment +- Home directory +- Optional default shell + +## Example + +```ini +# ,--- tells that the password is in another file +# | +# v +root:x:0:0:System administrator:/root:/bin/sh +``` + +## Login "screen" + +- Now we can add one to the `inittab` +- This is the `getty` command of `busybox` + +# References diff --git a/2020-10-06.md b/2020-10-06.md new file mode 100644 index 0000000..31133e4 --- /dev/null +++ b/2020-10-06.md @@ -0,0 +1,119 @@ +--- +title: WTF is Linux +author: Rémi Nicole +date: 2020-10-06 +slide-level: 2 +aspectratio: 169 + +theme: metropolis +colortheme: owl +beameroption: "show notes on second screen=right" + +toc: true +highlightstyle: breezedark +lang: en-US + +bibliography: ../bibliography.bib +--- + +# Before we get started + +## Practical work practicalities + +- One or two group is going to have only 1 Raspberry +- SD card readers are provided + +# Buildroot + +## Overview + +![Buildroot overview](./res/plantuml/buildroot-overview.png){ height=80% } + +## Single-project process + +![Buildroot single-project process](./res/plantuml/buildroot-project.png){ height=80% } + +## Overall process + +![Buildroot overall process](./res/plantuml/buildroot-process.png){ height=80% } + +## Configuring Buildroot + +- Same as the Linux kernel +- Allows you to set: + - Target architecture + - Target packages + - Build options + - ... + +## Default configuration + +- To list available default configurations: + - `make list-defconfigs` +- To set the configurations as one of the default: + - `make _defconfig` + +::: notes + +We're going to use `raspberrypi2_defconfig` + +::: + + +## Hierarchy of a Buildroot project + +- package/ +: All the available packages +- toolchain/ +: Packages for building stuff +- linux/ +: The Linux kernel package +- system/skeleton/ +: The skeleton of the target Linux system +- board/ +: All the board-specific files +- docs/ +: The documentation of Buildroot +- And other things + +::: notes + +By board-specific files, we can mean: kernel config & patches, scripts, etc. + +::: + +## Hierarchy of a Buildroot output + +Everything into `output/` + +- images/ +: The images to flash +- target/ +: The target root filesystem +- And other things + +## Demo time + +- _[Raspberry PI 2's pins](https://www.electronicwings.com/public/images/user_images/images/Raspberry%20Pi/RaspberryPi_UART/Raspberry%20pi%203%20UART%20pins.png)_ +- _[Serial cable's datasheet](https://docs.rs-online.com/12f1/0900766b811b9e83.pdf)_ page 7 + +::: notes + +- Show Buildroot's download page +- Go to extracted Buildroot directory +- Show available defconfigs +- Use `raspberrypi2_defconfig` +- `make all` +- Show output directory +- Flash image on sdcard +- Put sdcard on raspberry pi +- Show +- Boot raspberry + +::: + +# Installing GNU/Linux + + + +# References diff --git a/2020-10-13.md b/2020-10-13.md new file mode 100644 index 0000000..f8a67f4 --- /dev/null +++ b/2020-10-13.md @@ -0,0 +1,432 @@ +--- +title: WTF is Linux +author: Rémi Nicole +date: 2020-10-13 +slide-level: 2 +aspectratio: 169 + +theme: metropolis +colortheme: owl +beameroption: "show notes on second screen=right" + +toc: true +highlightstyle: breezedark +lang: en-US + +bibliography: ../bibliography.bib +--- + +# Makefile primer + +## Goal + +Make is a tool to create files + + +::: notes + +A Makefile is a file that will direct Make on how to create these files + +::: + +## Concepts---Rules[^rule-intro] + +Target +: Usually the name of a file/directory that this rule creates + +Prerequisites +: The files/directories that are needed to produce the target + +Recipe +: The commands to execute in order to create the target + +```make +my_executable: source_1.c source_2.c + gcc source_1.c source_2.c -o my_executable +``` + +[^rule-intro]: + +::: notes + +- The target can also be an action, but it is rarer +- If one of the prerequisite changes, Make figures out that the target needs to + be created again + +::: + +## Concepts---Variables[^variables] + +Very similar to shell variables, but use `$(VAR)` to expand it. + +```make +MY_SOURCES = source_1.c source_2.c + +my_executable: $(MY_SOURCES) + gcc $(MY_SOURCES) -o my_executable +``` + +[^variables]: + +## Concepts---Implicit Variables[^implicit-variables] + +Some variables are set implicitly by Make, for example: + +`$(CC)`{.no_minted} +: The C compiler + +`$(CXX)`{.no_minted} / `$(CPP)`{.no_minted} +: The C++ compiler + +`$(RM)`{.no_minted} +: The `rm -f` command + +`$(MAKE)`{.no_minted} +: The `make` command + +[^implicit-variables]: + +::: notes + +Yes, you can call "make" inside of a Makefile + +::: + +## Concepts--Automatic Variables[^automatic-variables] + +Some variables are set automatically per-rule, for example: + +`$@`{.no_minted} +: The target of the current rule + +`$<`{.no_minted} +: The first prerequisite of the current rule + +`$^`{.no_minted} +: All prerequisites of the current rule + +... + +[^automatic-variables]: + +## Our example redone + +```make +MY_SOURCES = source_1.c source_2.c + +my_executable: $(MY_SOURCES) + $(CC) $^ -o $@ +``` + +## Relation with Buildroot + +Buildroot uses Makefiles to: + +- Figure out which packages to (re-)compile +- How to compile them +- Create the outputs (images, root filesystem, etc.) in general. + +But it is heavily abstracted + +# Setting up Buildroot for our modifications + +## For additional packages + +- We create the directory `package/` +- We put our additional packages in it +- We create the `my_company.mk` and `Config.in` files[^adding-project-specific-packages] +- And include the new `Config.in` in `package/Config.in` + + [^adding-project-specific-packages]: + + +## Packages Makefile + +```makefile +include $(sort $(wildcard package/my_company/*/*.mk)) +``` + +## Packages configuration file + +In `package/my_company/Config.in`: + +```kconfig +source "package/my_company/my_package1/Config.in" +source "package/my_company/my_package2/Config.in" +source "package/my_company/.../Config.in" +# ... +``` + +## Packages configuration file inclusion + +In `package/Config.in`: + +```kconfig +# ---8<--- Rest of the configuration + +# We add our own packages in our own submenu +menu "My Company packages" + # We just created this file + source "package/my_company/Config.in" +endmenu + +endmenu # <-- Was here before, it's the "Target packages" submenu +``` + +## For everything else + +- We create the directory `board//` +- We put our additional files, patches, configurations, scripts, etc. in it + +::: notes + +In our case, the board would be `raspberrypi2`. + +::: + +# Adding single files + +## Overlays + +A file hierarchy from the root directory that is going to get copied on top of +the built system + +Can be used for: + +- Startup scripts +- Program configuration files +- Files containing data (like sound) + +::: notes + +However, if a startup script, configuration file, or data file is tied to +a given package, it is usually better to install it with the package, instead +of using an overlay. + +Overlays are more meant for files that are not tied to any specific package. + +::: + +## How to add an overlay + +- Create the directory `board///rootfs_overlay` +- Add your file in that directory, as if it were the root directory +- Configure Buildroot (`make menuconfig`) and set + `BR2_ROOTFS_OVERLAY`[^overlay-config] to + `board///rootfs-overlay`. + +[^overlay-config]: + Under "System configuration", "Root filesystem overlay directories" + +# Adding packages + +## Packages---Structure + +- Create the directory `package///` +- Create the file `package///Config.in`[^config-files] +- Create the file `package///.mk`[^mk-files] + +[^config-files]: + +[^mk-files]: + + + +::: notes + +- The `Config.in` will allow Buildroot to add an option to install your + package. This will also specify your dependencies (what is needed to build or + run your package). +- The `.mk` is a Makefile which instructs how to compile and + install your package. + +::: + +## Packages---Configuration + +Example configuration: + +```kconfig +config BR2_PACKAGE_DUMMY_PACKAGE + bool "dummy package" + default n + depends on BR2_PACKAGE_BUSYBOX || BR2_PACKAGE_BASH + help + A dummy package for demonstration purposes +``` + +## Packages---Makefile + +Example Makefile configuration: + +```makefile +define DUMMY_PACKAGE_INSTALL_TARGET_CMDS + $(INSTALL) -m 0755 -D \ + $(DUMMY_PACKAGE_PKGDIR)/dummy_script.sh \ + $(TARGET_DIR)/usr/bin +endef + +$(eval $(generic-package)) +``` + +::: notes + +- This "package" just installs a script that is in the same directory of the +`.mk` file +- It is important that all variables + +::: + +## Packages---More generic Makefile{.allowframebreaks} + +```makefile +LIBFOO_VERSION = 1.0 +LIBFOO_SOURCE = libfoo-$(LIBFOO_VERSION).tar.gz +LIBFOO_SITE = http://www.foosoftware.org/download +LIBFOO_LICENSE = GPL-3.0+ +LIBFOO_CONFIG_SCRIPTS = libfoo-config +LIBFOO_DEPENDENCIES = host-libaaa libbbb + +# ---8<--- +``` + +\framebreak + +If your package uses Makefiles to be built: + +```makefile +# ---8<--- + +define LIBFOO_BUILD_CMDS + $(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) all +endef + +# ---8<--- +``` + +`$(@D)`{.makefile} is the directory containing the downloaded sources. + +\framebreak + +```makefile +define LIBFOO_INSTALL_TARGET_CMDS + $(MAKE) \ + $(TARGET_CONFIGURE_OPTS) PREFIX=$(TARGET_DIR)/usr \ + -C $(@D) \ + install + # Or... + $(INSTALL) -D -m 0755 $(@D)/libfoo.so* $(TARGET_DIR)/usr/lib + $(INSTALL) -d -m 0755 $(TARGET_DIR)/etc/foo.d +endef + +$(eval $(generic-packages)) +``` + +::: notes + +- In this instances, our package is called "libfoo" +- `TARGET_CONFIGURE_OPTS` sets options like the compiler to use, the + compilation flags and other things + +::: + +## Packages---Notes + +- This was for a "generic package" +- For package using common build frameworks (e.g. python, autotools, cmake, + etc.), some things are already done for you[^mk-files] +- Don't forget to include the package's `Config.in` in + `package/my_company/Config.in` + +# Adding a service + +## Buildroot's Busybox init + +Every script or executable that is named like `/etc/init.d/S` is +going to be started on boot + +Two solutions then: + +- Add a script to the overlay (if not tied to one of your own package) +- Install it with your package in the `_INSTALL_TARGET_CMDS` + +# Adding users + +## Using the board directory + +- Create the file `board///users.txt`[^adding-users] +- Fill it with lines using the "makeusers" syntax[^makeusers-syntax] +- Set `BR2_ROOTFS_USERS_TABLES`[^users-conf] to `board///users.tx` + +[^adding-users]: + +[^makeusers-syntax]: + +[^users-conf]: Under "System Configuration", "Path to the users tables" + +## Using the board directory---Example + +```kconfig +# ,---------------------- name +# | ,------------- group +# | | ,------ password +# | | | +# vvv vvvvvv v + foo -1 libfoo -1 * - - - LibFoo daemon +# ^^ ^^ ^^^^^^^^^^^^^ +# | | | +# | | '--- comment +# | '------------------- GID +# '----------------------------- UID +``` + +::: notes + +- If UID or GID is "-1", buildroot will select an unused number +- If password is "\*", then there is no password you cannot login as this user + (but you can still execute programs as this user) + +::: + +## In a package + +Inside the `.mk` file. + +```makefile +define LIBFOO_USERS + foo -1 libfoo -1 * - - - LibFoo daemon +endef +``` + +# Saving the configuration + +## Why it is important + +- Right now, every modification to the configuration (added packages, overlay, + etc.) is only in the build directory +- We want to save it so that people cloning our modified Buildroot can have the + same configuration +- Please often verify that your modifications are saved by deleting your + `output` directory, or downloading and compiling or project again. + +::: notes + +- This is necessary for me (the reviewer) since I want to build exactly what you + have. + +::: + +## How to save the Buildroot configuration + +Once you have done your configuration of Buildroot (`make menuconfig`), execute +these commands: + +- Make sure the `BR2_DEFCONFIG` option[^defconfig-option] is set to + `configs/_defconfig` +- Execute `make savedefconfig` to save it + +And commit your changes + +[^defconfig-option]: Under "Build options", "Location to save buildroot config" + +# References diff --git a/Makefile b/Makefile index 17a8d13..71f1a88 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,10 @@ MARKDOWN_FILES := $(wildcard *.md) TEX_FILES := $(patsubst %.md,build/%.tex,$(MARKDOWN_FILES)) PDF_FILES := $(patsubst %.md,build/%.pdf,$(MARKDOWN_FILES)) -.SECONDARY: $(TEX_FILES) +PLANTUML_FILES := $(wildcard res/plantuml/*.plantuml) +PLANTUML_OUTPUTS := $(patsubst %.plantuml,build/%.png,$(PLANTUML_FILES)) + +.SECONDARY: $(TEX_FILES) $(PLANTUML_OUTPUTS) all: $(PDF_FILES) @@ -14,6 +17,9 @@ clean: build: mkdir -p build +build/res/plantuml: + mkdir -p build/res/plantuml + lua-filters/minted/minted.lua: git submodule update --init @@ -26,7 +32,7 @@ build/%.tex: %.md build beamer-template.tex lua-filters/minted/minted.lua --biblatex \ -so "$@" -build/%.pdf: build/%.tex bibliography.bib +build/%.pdf: build/%.tex bibliography.bib $(PLANTUML_OUTPUTS) cd build; latexmk \ -xelatex \ -interaction=nonstopmode \ @@ -36,3 +42,6 @@ build/%.pdf: build/%.tex bibliography.bib -output-directory=./build \ "$*.tex" cp build/build/$*.pdf build + +build/res/plantuml/%.png: res/plantuml/%.plantuml build/res/plantuml + PLANTUML_LIMIT_SIZE=8192 plantuml -tpng "$<" -o "$(PWD)/build/res/plantuml" diff --git a/bibliography.bib b/bibliography.bib index df9700c..9b18999 100644 --- a/bibliography.bib +++ b/bibliography.bib @@ -84,3 +84,24 @@ url = "https://commons.wikimedia.org/wiki/File:GUID_Partition_Table_Scheme.svg", } +@misc{ corkami:rfc791, + title = "RFC791", + year = "2017", + author = "corkami", + url = "https://github.com/corkami/pics/blob/master/tracing/rfc791.pdf", +} + +@misc{ wikimedia:network1, + title = "Network1", + year = "2017", + author = "Tsedenjav.Sh", + url = "https://commons.wikimedia.org/wiki/File:Network1.jpg", +} + +@misc{ wikimedia:dhcp, + title = "DHCP session", + year = "2015", + author = "Gelmo96", + url = "https://commons.wikimedia.org/wiki/File:DHCP_session.svg", +} + diff --git a/res/DHCP_session.png b/res/DHCP_session.png new file mode 100644 index 0000000..60aada9 Binary files /dev/null and b/res/DHCP_session.png differ diff --git a/res/home-network.jpg b/res/home-network.jpg new file mode 100644 index 0000000..d2cfe38 Binary files /dev/null and b/res/home-network.jpg differ diff --git a/res/plantuml/buildroot-overview.plantuml b/res/plantuml/buildroot-overview.plantuml new file mode 100644 index 0000000..1b1277d --- /dev/null +++ b/res/plantuml/buildroot-overview.plantuml @@ -0,0 +1,34 @@ +@startuml + +left to right direction + +skinparam backgroundcolor transparent +skinparam component { + borderColor black + arrowColor #FA8100 +} +skinparam package { + backgroundcolor white +} + +[Buildroot] #B794F6 + +package "External projects" { + [coreutils\n(ls, cp, mkdir, ...)] as coreutils #C6F68D + [util-linux\n(mount, mkfs, ...)] as utillinux #C6F68D + [Other projects...] as other_projects #C6F68D +} + +package "Outputs" { + [Flashable image] as image #F186C0 + [Other outputs...] as other_outputs #F186C0 +} + +coreutils --> Buildroot +utillinux --> Buildroot +other_projects --> Buildroot + +Buildroot --> image +Buildroot --> other_outputs + +@enduml diff --git a/res/plantuml/buildroot-process.plantuml b/res/plantuml/buildroot-process.plantuml new file mode 100644 index 0000000..8fea3fe --- /dev/null +++ b/res/plantuml/buildroot-process.plantuml @@ -0,0 +1,41 @@ +@startuml + +left to right direction + +skinparam backgroundcolor transparent +skinparam component { + borderColor black + arrowColor #FA8100 +} +skinparam package { + backgroundcolor white +} + +package "External projects" #C6F68D { + [...] as project1 + [...] as project2 + [...] as project3 +} + +package "Buildroot" #B794F6 { + [build build tools\n(host)] as host_build + [build wanted projects\n(target)] as target_build + [post-build script] as post_build + [assemble the installation directory] as assemble +} + +package "Outputs" { + [Flashable image] as image #F186C0 + [Other outputs...] as other_outputs #F186C0 +} + +project1 --> host_build +project3 --> target_build + +host_build -left-> target_build +target_build --> post_build +post_build -right-> assemble +assemble --> image +assemble --> other_outputs + +@enduml diff --git a/res/plantuml/buildroot-project.plantuml b/res/plantuml/buildroot-project.plantuml new file mode 100644 index 0000000..e2e48cf --- /dev/null +++ b/res/plantuml/buildroot-project.plantuml @@ -0,0 +1,41 @@ +@startuml + +left to right direction + +skinparam backgroundcolor transparent +skinparam component { + borderColor black + arrowColor #FA8100 +} +skinparam package { + backgroundcolor white +} + +package "External projects" #C6F68D { + [...] as project1 + [...] as project2 + [...] as project3 +} + +package "Buildroot" #B794F6 { + [download] + [check integrity] as checksum + [build] + [install] +} + +package "Outputs" { + [Flashable image] as image #F186C0 + [Other outputs...] as other_outputs #F186C0 +} + +project1 --> download + +download -left-> checksum +checksum --> build +build -right-> install + +install --> image +install --> other_outputs + +@enduml diff --git a/res/rfc791.pdf b/res/rfc791.pdf new file mode 100644 index 0000000..da91b92 Binary files /dev/null and b/res/rfc791.pdf differ diff --git a/res/rfc791.png b/res/rfc791.png new file mode 100644 index 0000000..77b836f Binary files /dev/null and b/res/rfc791.png differ -- cgit v1.2.3