Commit 112fa5ea authored by Stefano Babic's avatar Stefano Babic
Browse files

Sync with 2021.04


Signed-off-by: Stefano Babic's avatarStefano Babic <sbabic@denx.de>
parent d1cd2df6
......@@ -436,9 +436,12 @@ a possible setup using a remote handler could be:
)
The connection is instantiated using the socket "/tmp/test_remote". If
connect() fails, the remote handler signals that the update is not successful.
Each Zeromq Message from SWUpdate is a multi-part message split into two frames:
The connection is instantiated using the socket ``test_remote`` (according
to the "data" field's value) in the directory pointed to by the environment
variable ``TMPDIR`` with ``/tmp`` as fall-back if ``TMPDIR`` is not set.
If ``connect()`` fails, the remote handler signals that the update is not
successful. Each zeromq message from SWUpdate is a multi-part message split
into two frames:
- first frame contains a string with a command.
- second frame contains data and can be of 0 bytes.
......@@ -760,6 +763,8 @@ Disk partitioner
This handler creates or modifies partitions using the library libfdisk. Handler must be put into
the `partitions` section of sw-description. Setup for each partition is put into the `properties` field
of sw-description.
After writing the partition table it may create a file system on selected partitions.
(Availlable only if CONFIG_DISKFORMAT is set.)
.. table:: Properties for diskpart handler
......@@ -790,6 +795,11 @@ supported:
| | | It is the hex code for DOS (MBR) partition table |
| | | or it is the string identifier in case of GPT. |
+-------------+----------+----------------------------------------------------+
| fstype | string | Optional filesystem type to be created on the |
| | | partition. If no fstype key is given, no file |
| | | will be created on the corresponding partition. |
| | | vfat / ext2 / ext3 /ext4 file system is supported |
+-------------+----------+----------------------------------------------------+
......@@ -806,9 +816,10 @@ GPT example:
partition-1 = [ "size=64M", "start=2048",
"name=bigrootfs", "type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B"];
partition-2 = ["size=256M", "start=133120",
"name=ldata", "type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"];
"name=ldata", "type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7",
"fstype=vfat"];
partition-3 = ["size=512M", "start=657408",
"name=log", "type=0FC63DAF-8483-4772-8E79-3D69D8477DE4"];
"name=log", "fstype =ext4", 63DAF-8483-4772-8E79-3D69D8477DE4"];
partition-4 = ["size=4G", "start=1705984",
"name=system", "type=0FC63DAF-8483-4772-8E79-3D69D8477DE4"];
partition-5 = ["size=512M", "start=10094592",
......@@ -833,6 +844,8 @@ MBR Example:
partition-4 = ["size=6G", "start=1181696", "name=system", "type=0x5"];
partition-5 = ["size=512M", "start=1183744", "name=part5", "type=0x83"];
partition-6 = ["size=512M", "start=2234368", "name=part6", "type=0x83"];
partition-7 = ["size=16M", "start=3284992", "name=part7", "type=0x6",
"fstype=vfat"];
}
}
......
......@@ -65,6 +65,9 @@ Talks about SWUpdate
- Secure Boot and Over-the-Air Updates - That's simple, no ? by Jan Kiszka (Siemens AG), ELC 2020,
`Slides Secure OTA ELC 2020 <https://static.sched.com/hosted_files/ossna2020/17/Secure-OTA-Updates_elc-na-2020.pdf>`_,
`Video Secure OTA <https://www.youtube.com/watch?v=vfYSP4qIJP0&t=1647s>`_
- Diving into SWUpdate: adding new platform support with Yocto/OE! by Pierre-Jean Texier, LiveEmbedded 2020,
`Slides Diving into SWUpdate <https://de.slideshare.net/PierrejeanTexier/diving-into-swupdate-adding-new-platform-support-in-30minutes-with-yoctooe>`_,
`Video Diving into SWUpdate <https://www.youtube.com/watch?v=TK10pNb_mzw>`_
Useful references
=================
......
......@@ -18,7 +18,7 @@ replaced by a single line:
::
SPDX-License-Identifier: GPL-2.0+
SPDX-License-Identifier: GPL-2.0-only
Ideally, the license terms of all files in the source tree should be
defined by such License Identifiers; in no case a file can contain
......@@ -30,9 +30,9 @@ used under the terms of either of these licenses, i. e. with
::
SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause
SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause
you can choose between GPL-2.0+ and BSD-3-Clause licensing.
you can choose between GPL-2.0-only and BSD-3-Clause licensing.
We use the SPDX_ Unique License Identifiers (SPDX-Identifiers_)
......@@ -46,19 +46,20 @@ We use the SPDX_ Unique License Identifiers (SPDX-Identifiers_)
+=================================================+==================+==============+
| GNU General Public License v2.0_ only | GPL-2.0-only | Y |
+-------------------------------------------------+------------------+--------------+
| GNU General Public License v2.0_ or later | GPL-2.0-or-later | Y |
+-------------------------------------------------+------------------+--------------+
| GNU Lesser General Public License v2.1_ or later| LGPL-2.1-or-later| Y |
+-------------------------------------------------+------------------+--------------+
| BSD 1-Clause_ License | BSD-1-Clause | Y |
+-------------------------------------------------+------------------+--------------+
| BSD 2-Clause_ License | BSD-2-Clause | Y |
+-------------------------------------------------+------------------+--------------+
| BSD 3-clause_ "New" or "Revised" License | BSD-3-Clause | Y |
| BSD 3-Clause_ "New" or "Revised" License | BSD-3-Clause | Y |
+-------------------------------------------------+------------------+--------------+
| MIT_ License | MIT | Y |
+-------------------------------------------------+------------------+--------------+
.. _v2.0: http://www.gnu.org/licenses/gpl-2.0.txt
.. _v2.1: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
.. _1-Clause: http://spdx.org/licenses/BSD-1-Clause
.. _2-Clause: http://spdx.org/licenses/BSD-2-Clause
.. _3-Clause: http://spdx.org/licenses/BSD-3-Clause#licenseText
.. _3-Clause: http://spdx.org/licenses/BSD-3-Clause
.. _MIT: https://spdx.org/licenses/MIT.html
......@@ -2,6 +2,7 @@
Documentation for previous releases
===================================
- `2020.11 <./2020.11/index.html>`_
- `2020.04 <./2020.04/index.html>`_
- `2019.11 <./2019.11/index.html>`_
- `2019.04 <./2019.04/index.html>`_
......
......@@ -57,6 +57,6 @@ The single fields have the following meaning:
- *info* additional information about installation.
As an example for a progress client, ``tools/progress.c`` prints the status
As an example for a progress client, ``tools/swupdate-progress.c`` prints the status
on the console and drives "psplash" to draw a progress bar on a display.
......@@ -48,6 +48,29 @@ small changes, and it is not a general solution between two generic releases.
A general approach could be to integrate SWUpdate with a storage to allow one
a delta upgrade from any release.
Support for OpenWRT
===================
OpenWRT is used on many routers and has its own way for updating that is not power-cut safe.
Selective downloading
=====================
Bandwidth can be saved not only via delta, but identifying which part of the SWu must be
loaded and skipping the rest. For example, SWUpdate can detect the versions for artifact before
downloading them and ask the servers to send just the relevant artifacts.
Support for BTRFS snapshot
==========================
BTRFS supports subvolume and delta backup for volumes - supporting subvolumes is a way
to move the delta approach to filesystems, while SWUpdate should apply the deltas
generated by BTRFS utilities.
Note: research in this direction was stopped due to License conflicts with btrfs-utils.
They are now solved on btrfs-utils top of tree (libraries are now LGPLv2.1 and can be used
by SWUpdate).
Parser
======
......@@ -75,6 +98,14 @@ a sort of software compatibility check. For example, SWUpdate verifies if a comp
(like an application) is compatible with a runningOS and reject the update in case of
mismatch.
Lua
===
- API between SWUpdate and Lua is poorly documented.
- Extend Lua to load modules at startup with functions that are globally visible
and can be used by own Lua scripts or by the embedded-script in sw-description.
- Store in SWUpdate's repo Lua libraries and common functions to be reused by projects.
Handlers:
=========
......@@ -112,7 +143,6 @@ Security
========
- add support for asymmetryc encryption
- add support to encrypted sw-description
Support for evaluation boards
=============================
......@@ -125,6 +155,14 @@ patches welcome.
Back-end support (suricatta mode)
=================================
Back-end: responsiveness for IPC
--------------------------------
Suricatta is implemented as process that launches functions for the selected module.
This means that the IPC does not answer if Suricatta is doing something, specially if it is
downloading and upgrading the system. This can be enhanced adding a separate thread for IPC and of course
all required synchronization with the main modules.
Back-end: check before installing
---------------------------------
......
......@@ -832,8 +832,8 @@ SWUpdate scans for all scripts and calls them after installing the images.
If the data attribute is defined, its value is passed as the last argument(s)
to the script.
Update Transaction Marker
-------------------------
Update Transaction and Status Marker
------------------------------------
By default, SWUpdate sets the bootloader environment variable "recovery_status"
to "in_progress" prior to an update operation and either unsets it or sets it to
......@@ -861,7 +861,14 @@ transaction marker:
It is also possible to disable setting of the transaction marker
entirely (and independently of the setting in `sw-description`) by
starting swupdate with the `-M` option.
starting SWUpdate with the `-M` option.
The same applies to setting the update state in the bootloader via its
environment variable "ustate" (default) to `STATE_INSTALLED=1` or
`STATE_FAILED=3` after an installation. This behavior can be turned off
globally via the `-m` option to SWUpdate or per `sw-description` via the
boolean switch "bootloader_state_marker".
bootloader
----------
......
......@@ -60,9 +60,9 @@ will be ignored until a new REQ_INSTALL will be received.
It is recommended to use the client library to communicate with SWUpdate. On the lower
level with direct socket communication, it cannot be guaranteed that the structures
will remain compatible in future. The client library was affected by this issue, too, and it is
changed to accept an opaque interface that will survive to API changes. Compatibility
layers could be added on bedarf in future due to API changes.
will remain compatible in the future. The client library was affected by this issue, too, and it is
changed to accept an opaque interface that will survive API changes. Compatibility
layers could be added on-demand in the future due to API changes.
Client Library
......@@ -192,6 +192,26 @@ Enable / disable Suricatta daemon
{ "enable" : true }
{ "enable" : false }
Set custom device attributes for Suricatta (for Hawkbit implementation)
.......................................................................
::
{ "identify" : [
{
"name" : "customizableAttributeOne",
"value" : "valueOne"
},
{
"name" : "customizableAttributeTwo",
"value" : "valueTwo"
}
]}
New attributes can be added at runtime, and existing attributes can be modified in the same
way. Changes will be reflected on the server in the next poll iteration.
Trigger a check on the server
.............................
......@@ -393,5 +413,3 @@ Example:
"name": "rootfs.ext4.gz",
"percent": "18"
}
......@@ -328,29 +328,51 @@ Running SWUpdate
What is expected from a SWUpdate run
------------------------------------
The whole update process can be seen as a set of pipelines. The incoming stream
(the SWU file) is processed by each pipe and passed to the next step.
First, the SWU is streamed from one of the interfaces : local (USB, filesystem), Webserver,
suricatta (one of the backend), etc. The incoming SWU is forwarded to the installer to be examined
and installed.
A run of SWUpdate consists mainly of the following steps:
- check for media (USB-pen)
- check for an image file. The extension must be .swu
- extracts sw-description from the image and verifies it
- extracts sw-description from the stream and verifies it
It parses sw-description creating a raw description in RAM
about the activities that must be performed.
- Reads the cpio archive and proofs the checksum of each single file
SWUpdate stops if the archive is not complete verified
- if Signed Images is activated, extracts sw-description.sig and
validate sw-description.
- check for hardware-software compatibility, if any,
reading hardware revision from hardware and matching
with the table in sw-description.
- Parse sw-description to determine which artefacts in the incoming SWU
are required. Not required artifacts are simply skipped.
The meta file sw-description is declarative and executive. If "hooks"
are defined in sw-description, they are executed at parse time. Hooks
are executed before any artefact is evaluated and they are the best
way to implement pre install functions.
At the end of the parsing, SWUpdate builds an internal mapping for each artifact
to recognize which handler should be called for each of them.
- Reads the cpio archive and proofs the CPIO checksum of each single file
(this can be disabled in the configuration) and computes the sha256 sum if foreseen or if Signed Images
are activated. SWUpdate stops if the archive is not complete verified.
- check that all components described in sw-description are
really in the cpio archive.
- modify partitions, if required. This consists in a resize
of UBI volumes, not a resize of MTD partition.
- runs pre-install scripts
- iterates through all images and call the corresponding
- run the partitions handlers, if required.
- runs pre-install scripts, if any. Please note: if artifacts are streamed, a preinstall script cannot be
executed because it depends on the order the artifact (including the script) are packed into the CPIO archive.
In this case, please use the "embedded-script" feature in sw-description to execute functions before any
installation takes place.
- if an artifact is found in SWU and it is marked with "installed-directly", proceed with installation,
else extract it temporarily into TMPDIR.
- iterates through all `images` and call the corresponding
handler for installing on target.
- runs post-install scripts
- update bootloader environment, if changes are specified
in sw-description.
- reports the status to the operator (stdout)
- iterates through all `files` and call the corresponding
handler for installing on target.
- iterates through all `scripts` and call the corresponding
handler for post-install scripts
- iterates through all `bootenv` and updates the bootloader environment.
- reports the status to the operator through the notification interface
(logging, traces) and through the progress interface.
- if a postinstall command is foreseen (for example to reboot the device), call it.
The first step that fails, stops the entire procedure and
an error is reported.
......@@ -485,6 +507,14 @@ Command line parameters
| | | the range 0..65535) or it is a semantic |
| | | version. |
+-------------+----------+--------------------------------------------+
| -max-version| string | The maximum required version of software. |
| <version> | | This will be checked with the version of |
| | | new software. |
| | | Version consists of either 4 numbers |
| | | (major.minor.rev.build with each field in |
| | | the range 0..65535) or it is a semantic |
| | | version. |
+-------------+----------+--------------------------------------------+
| -R <version>| string | The current installed version of software. |
| | | This will be checked with the version of |
| | | new software and forbids reinstalling. |
......@@ -496,6 +526,9 @@ Command line parameters
| -M | - | Disable setting the bootloader transaction |
| | | marker. |
+-------------+----------+--------------------------------------------+
| -m | - | Disable setting the update state in the |
| | | bootloader. |
+-------------+----------+--------------------------------------------+
| -w <parms> | string | Available if CONFIG_WEBSERVER is set. |
| | | Start internal webserver and pass to it |
| | | a command line string. |
......@@ -604,6 +637,22 @@ Mandatory arguments are marked with '\*':
| | | SWUpdate can reuse the file and download |
| | | just the remaining part of the SWU. |
+-------------------------+----------+--------------------------------------------+
| -m <seconds> | integer | Delay in seconds between re-trying to send |
| | | initial feedback specified with "-c" |
| | | option. Default value is 10 seconds. If |
| | | Suricatta is started with initial state of |
| | | STATE_WAIT ("-c 6"), this value is ignored.|
+-------------------------+----------+--------------------------------------------+
| -s <seconds> | integer | Connection timeout to use in seconds. |
| | | If user doesn't set this option, default |
| | | libcurl connection timeout value of 300 |
| | | seconds is used. |
| | | NOTE: it is not possible for Suricatta to |
| | | respond to external program API requests |
| | | during this period - adapt this value to |
| | | your use case! |
+-------------------------+----------+--------------------------------------------+
systemd Integration
-------------------
......
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '2020.11',
VERSION: '2021.04',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
......
......@@ -1550,6 +1550,13 @@
return '\\' + escapes[match];
};
// In order to prevent third-party code injection through
// `_.templateSettings.variable`, we test it against the following regular
// expression. It is intentionally a bit more liberal than just matching valid
// identifiers, but still prevents possible loopholes through defaults or
// destructuring assignment.
var bareIdentifier = /^\s*(\w|\$)+\s*$/;
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
......@@ -1585,8 +1592,17 @@
});
source += "';\n";
// If a variable is not specified, place data values in local scope.
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
var argument = settings.variable;
if (argument) {
// Insure against third-party code injection.
if (!bareIdentifier.test(argument)) throw new Error(
'variable is not a bare identifier: ' + argument
);
} else {
// If a variable is not specified, place data values in local scope.
source = 'with(obj||{}){\n' + source + '}\n';
argument = 'obj';
}
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
......@@ -1594,7 +1610,7 @@
var render;
try {
render = new Function(settings.variable || 'obj', '_', source);
render = new Function(argument, '_', source);
} catch (e) {
e.source = source;
throw e;
......@@ -1605,7 +1621,6 @@
};
// Provide the compiled source as a convenience for precompilation.
var argument = settings.variable || 'obj';
template.source = 'function(' + argument + '){\n' + source + '}';
return template;
......
......@@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Language Bindings &mdash; Embedded Software Update Documentation 2020.11 documentation</title>
<title>Language Bindings &mdash; Embedded Software Update Documentation 2021.04 documentation</title>
......@@ -62,7 +62,7 @@
<div class="version">
2020.11
2021.04
</div>
......@@ -304,7 +304,7 @@ their space-separated IP addresses plus subnet masks as respective values.</p>
<div role="contentinfo">
<p>
&copy; Copyright 2013-2020, Stefano Babic
&copy; Copyright 2013-2021, Stefano Babic
</p>
</div>
......
......@@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>meta-swupdate: building with Yocto &mdash; Embedded Software Update Documentation 2020.11 documentation</title>
<title>meta-swupdate: building with Yocto &mdash; Embedded Software Update Documentation 2021.04 documentation</title>
......@@ -62,7 +62,7 @@
<div class="version">
2020.11
2021.04
</div>
......@@ -399,7 +399,7 @@ For example, to automatically set the version tag:</p>
<div role="contentinfo">
<p>
&copy; Copyright 2013-2020, Stefano Babic
&copy; Copyright 2013-2021, Stefano Babic
</p>
</div>
......
......@@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Contributing to SWUpdate &mdash; Embedded Software Update Documentation 2020.11 documentation</title>
<title>Contributing to SWUpdate &mdash; Embedded Software Update Documentation 2021.04 documentation</title>
......@@ -62,7 +62,7 @@
<div class="version">
2020.11
2021.04
</div>
......@@ -302,7 +302,7 @@ this project or the open source license(s) involved.</li>
<div role="contentinfo">
<p>
&copy; Copyright 2013-2020, Stefano Babic
&copy; Copyright 2013-2021, Stefano Babic
</p>
</div>
......
......@@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Symmetrically Encrypted Update Images &mdash; Embedded Software Update Documentation 2020.11 documentation</title>
<title>Symmetrically Encrypted Update Images &mdash; Embedded Software Update Documentation 2021.04 documentation</title>
......@@ -62,7 +62,7 @@
<div class="version">
2020.11
2021.04
</div>
......@@ -294,7 +294,7 @@ containing at least the elements of this example:</p>
<div role="contentinfo">
<p>
&copy; Copyright 2013-2020, Stefano Babic
&copy; Copyright 2013-2021, Stefano Babic
</p>
</div>
......
......@@ -9,7 +9,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Index &mdash; Embedded Software Update Documentation 2020.11 documentation</title>
<title>Index &mdash; Embedded Software Update Documentation 2021.04 documentation</title>
......@@ -61,7 +61,7 @@
<div class="version">
2020.11
2021.04
</div>
......@@ -200,7 +200,7 @@
<div role="contentinfo">
<p>
&copy; Copyright 2013-2020, Stefano Babic
&copy; Copyright 2013-2021, Stefano Babic
</p>
</div>
......
......@@ -8,7 +8,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Handlers &mdash; Embedded Software Update Documentation 2020.11 documentation</title>
<title>Handlers &mdash; Embedded Software Update Documentation 2021.04 documentation</title>
......@@ -62,7 +62,7 @@
<div class="version">
2020.11
2021.04
</div>
......@@ -584,9 +584,12 @@ a possible setup using a remote handler could be:</p>
<span class="p">)</span>
</pre></div>
</div>
<p>The connection is instantiated using the socket “/tmp/test_remote”. If
connect() fails, the remote handler signals that the update is not successful.
Each Zeromq Message from SWUpdate is a multi-part message split into two frames:</p>
<p>The connection is instantiated using the socket <code class="docutils literal notranslate"><span class="pre">test_remote</span></code> (according
to the “data” field’s value) in the directory pointed to by the environment
variable <code class="docutils literal notranslate"><span class="pre">TMPDIR</span></code> with <code class="docutils literal notranslate"><span class="pre">/tmp</span></code> as fall-back if <code class="docutils literal notranslate"><span class="pre">TMPDIR</span></code> is not set.
If <code class="docutils literal notranslate"><span class="pre">connect()</span></code> fails, the remote handler signals that the update is not
successful. Each zeromq message from SWUpdate is a multi-part message split
into two frames:</p>
<blockquote>
<div><ul class="simple">
<li>first frame contains a string with a command.</li>
......@@ -926,7 +929,9 @@ If not set, default value 0 will be used.</td>
<h2>Disk partitioner<a class="headerlink" href="#disk-partitioner" title="Permalink to this headline"></a></h2>
<p>This handler creates or modifies partitions using the library libfdisk. Handler must be put into
the <cite>partitions</cite> section of sw-description. Setup for each partition is put into the <cite>properties</cite> field
of sw-description.</p>
of sw-description.
After writing the partition table it may create a file system on selected partitions.
(Availlable only if CONFIG_DISKFORMAT is set.)</p>
<table border="1" class="docutils" id="id4">
<caption><span class="caption-text">Properties for diskpart handler</span><a class="headerlink" href="#id4" title="Permalink to this table"></a></caption>
<colgroup>
......@@ -986,6 +991,13 @@ Kilobytes, Megabytes and Gigabytes.</td>
It is the hex code for DOS (MBR) partition table
or it is the string identifier in case of GPT.</td>
</tr>
<tr class="row-even"><td>fstype</td>
<td>string</td>
<td>Optional filesystem type to be created on the
partition. If no fstype key is given, no file
will be created on the corresponding partition.
vfat / ext2 / ext3 /ext4 file system is supported</td>
</tr>
</tbody>
</table>
<p>GPT example:</p>
......@@ -998,9 +1010,10 @@ or it is the string identifier in case of GPT.</td>
<span class="n">partition</span><span class="o">-</span><span class="mi">1</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;size=64M&quot;</span><span class="p">,</span> <span class="s2">&quot;start=2048&quot;</span><span class="p">,</span>
<span class="s2">&quot;name=bigrootfs&quot;</span><span class="p">,</span> <span class="s2">&quot;type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B&quot;</span><span class="p">];</span>
<span class="n">partition</span><span class="o">-</span><span class="mi">2</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;size=256M&quot;</span><span class="p">,</span> <span class="s2">&quot;start=133120&quot;</span><span class="p">,</span>
<span class="s2">&quot;name=ldata&quot;</span><span class="p">,</span> <span class="s2">&quot;type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7&quot;</span><span class="p">];</span>
<span class="s2">&quot;name=ldata&quot;</span><span class="p">,</span> <span class="s2">&quot;type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7&quot;</span><span class="p">,</span>
<span class="s2">&quot;fstype=vfat&quot;</span><span class="p">];</span>
<span class="n">partition</span><span class="o">-</span><span class="mi">3</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;size=512M&quot;</span><span class="p">,</span> <span class="s2">&quot;start=657408&quot;</span><span class="p">,</span>
<span class="s2">&quot;name=log&quot;</span><span class="p">,</span> <span class="s2">&quot;type=0FC63DAF-8483-4772-8E79-3D69D8477DE4&quot;</span><span class="p">];</span>
<span class="s2">&quot;name=log&quot;</span><span class="p">,</span> <span class="s2">&quot;fstype =ext4&quot;</span><span class="p">,</span> <span class="mi">63</span><span class="n">DAF</span><span class="o">-</span><span class="mi">8483</span><span class="o">-</span><span class="mi">4772</span><span class="o">-</span><span class="mf">8E79</span><span class="o">-</span><span class="mi">3</span><span class="n">D69D8477DE4</span><span class="s2">&quot;];</span>
<span class="n">partition</span><span class="o">-</span><span class="mi">4</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;size=4G&quot;</span><span class="p">,</span> <span class="s2">&quot;st