diff options
author | Malte Schmidt <malte.schmidt@weidmueller.com> | 2023-11-28 14:52:31 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-12-06 22:55:49 +0000 |
commit | 29b2bda7867e8564404303faf4b01f37dba594a2 (patch) | |
tree | 26ae437674d8f620dd8d72a0ceb02551d13baf75 /scripts/lib/wic/plugins/source/empty.py | |
parent | ef7ba05995ed4d195112efb6e2d4ee913f1bf9a2 (diff) | |
download | poky-29b2bda7867e8564404303faf4b01f37dba594a2.tar.gz |
wic: extend empty plugin with options to write zeros to partiton
Adds features to explicitly write zeros to the start of the
partition. This is useful to overwrite old content like
filesystem signatures which may be re-recognized otherwise.
The new features can be enabled with
'--soucreparams="[fill|size=<N>[S|s|K|k|M|G]][,][bs=<N>[S|s|K|k|M|G]]"'
Conflicting or missing options throw errors.
The features are:
- fill
Fill the entire partition with zeros. Requires '--fixed-size' option
to be set.
- size=<N>[S|s|K|k|M|G]
Set the first N bytes of the partition to zero. Default unit is 'K'.
- bs=<N>[S|s|K|k|M|G]
Write at most N bytes at a time during source file creation.
Defaults to '1M'. Default unit is 'K'.
(From OE-Core rev: d19d4529e7a2056caeb526fed980cc1df19a5f6e)
Signed-off-by: Malte Schmidt <malte.schmidt@weidmueller.com>
Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/wic/plugins/source/empty.py')
-rw-r--r-- | scripts/lib/wic/plugins/source/empty.py | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/scripts/lib/wic/plugins/source/empty.py b/scripts/lib/wic/plugins/source/empty.py index 9c492ca206..0a9f5fa27c 100644 --- a/scripts/lib/wic/plugins/source/empty.py +++ b/scripts/lib/wic/plugins/source/empty.py | |||
@@ -9,9 +9,19 @@ | |||
9 | # To use it you must pass "empty" as argument for the "--source" parameter in | 9 | # To use it you must pass "empty" as argument for the "--source" parameter in |
10 | # the wks file. For example: | 10 | # the wks file. For example: |
11 | # part foo --source empty --ondisk sda --size="1024" --align 1024 | 11 | # part foo --source empty --ondisk sda --size="1024" --align 1024 |
12 | # | ||
13 | # The plugin supports writing zeros to the start of the | ||
14 | # partition. This is useful to overwrite old content like | ||
15 | # filesystem signatures which may be re-recognized otherwise. | ||
16 | # This feature can be enabled with | ||
17 | # '--soucreparams="[fill|size=<N>[S|s|K|k|M|G]][,][bs=<N>[S|s|K|k|M|G]]"' | ||
18 | # Conflicting or missing options throw errors. | ||
12 | 19 | ||
13 | import logging | 20 | import logging |
21 | import os | ||
14 | 22 | ||
23 | from wic import WicError | ||
24 | from wic.ksparser import sizetype | ||
15 | from wic.pluginbase import SourcePlugin | 25 | from wic.pluginbase import SourcePlugin |
16 | 26 | ||
17 | logger = logging.getLogger('wic') | 27 | logger = logging.getLogger('wic') |
@@ -19,6 +29,16 @@ logger = logging.getLogger('wic') | |||
19 | class EmptyPartitionPlugin(SourcePlugin): | 29 | class EmptyPartitionPlugin(SourcePlugin): |
20 | """ | 30 | """ |
21 | Populate unformatted empty partition. | 31 | Populate unformatted empty partition. |
32 | |||
33 | The following sourceparams are supported: | ||
34 | - fill | ||
35 | Fill the entire partition with zeros. Requires '--fixed-size' option | ||
36 | to be set. | ||
37 | - size=<N>[S|s|K|k|M|G] | ||
38 | Set the first N bytes of the partition to zero. Default unit is 'K'. | ||
39 | - bs=<N>[S|s|K|k|M|G] | ||
40 | Write at most N bytes at a time during source file creation. | ||
41 | Defaults to '1M'. Default unit is 'K'. | ||
22 | """ | 42 | """ |
23 | 43 | ||
24 | name = 'empty' | 44 | name = 'empty' |
@@ -31,4 +51,39 @@ class EmptyPartitionPlugin(SourcePlugin): | |||
31 | Called to do the actual content population for a partition i.e. it | 51 | Called to do the actual content population for a partition i.e. it |
32 | 'prepares' the partition to be incorporated into the image. | 52 | 'prepares' the partition to be incorporated into the image. |
33 | """ | 53 | """ |
34 | return | 54 | get_byte_count = sizetype('K', True) |
55 | size = 0 | ||
56 | |||
57 | if 'fill' in source_params and 'size' in source_params: | ||
58 | raise WicError("Conflicting source parameters 'fill' and 'size' specified, exiting.") | ||
59 | |||
60 | # Set the size of the zeros to be written to the partition | ||
61 | if 'fill' in source_params: | ||
62 | if part.fixed_size == 0: | ||
63 | raise WicError("Source parameter 'fill' only works with the '--fixed-size' option, exiting.") | ||
64 | size = get_byte_count(part.fixed_size) | ||
65 | elif 'size' in source_params: | ||
66 | size = get_byte_count(source_params['size']) | ||
67 | |||
68 | if size == 0: | ||
69 | # Nothing to do, create empty partition | ||
70 | return | ||
71 | |||
72 | if 'bs' in source_params: | ||
73 | bs = get_byte_count(source_params['bs']) | ||
74 | else: | ||
75 | bs = get_byte_count('1M') | ||
76 | |||
77 | # Create a binary file of the requested size filled with zeros | ||
78 | source_file = os.path.join(cr_workdir, 'empty-plugin-zeros%s.bin' % part.lineno) | ||
79 | if not os.path.exists(os.path.dirname(source_file)): | ||
80 | os.makedirs(os.path.dirname(source_file)) | ||
81 | |||
82 | quotient, remainder = divmod(size, bs) | ||
83 | with open(source_file, 'wb') as file: | ||
84 | for _ in range(quotient): | ||
85 | file.write(bytearray(bs)) | ||
86 | file.write(bytearray(remainder)) | ||
87 | |||
88 | part.size = (size + 1024 - 1) // 1024 # size in KB rounded up | ||
89 | part.source_file = source_file | ||