File: disk_setup.rst

package info (click to toggle)
cloud-init 25.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 12,412 kB
  • sloc: python: 135,894; sh: 3,883; makefile: 141; javascript: 30; xml: 22
file content (374 lines) | stat: -rw-r--r-- 10,480 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
.. _cce-disk-setup:

Configure partitions and filesystems
************************************

Cloud-init supports the creation of simple partition tables and filesystems
on devices.

- Disk partitioning is done using the ``disk_setup`` directive.
- File system configuration is done using the ``fs_setup`` directive.

For a full list of keys, refer to the `disk setup module`_ schema.

General example
===============

.. literalinclude:: ../../../module-docs/cc_disk_setup/example1.yaml
   :language: yaml
   :linenos:

Partition a disk
================

The ``disk_setup`` directive instructs Cloud-init to partition a disk. The
format is:

.. code-block:: yaml

    #cloud-config
    disk_setup:
      ephemeral0:
        table_type: 'mbr'
        layout: true
      /dev/xvdh:
        table_type: 'mbr'
        layout:
          - 33
          - [33, 82]
          - 33
        overwrite: True

The format is a list of "dicts of dicts". The first value is the name of the
device and the subsequent values define how to create and lay out the
partition. The general format is:

.. code-block:: yaml

   disk_setup:
     <DEVICE>:
       table_type: 'mbr'
       layout: <LAYOUT|BOOL>
       overwrite: <BOOL>

Where:

- ``<DEVICE>``:
  The name of the device. ``ephemeralX`` and ``swap`` are special values which
  are specific to the cloud. For these devices, cloud-init will look up what
  the real device is and then use it.

  For other devices, the kernel device name is used. At this time, only simple
  kernel devices are supported, meaning that device mapper and other targets
  may not work.

  Note: There is currently no handling or setup of device mapper targets.

- ``table_type=<TYPE>``:
  Currently, the following are supported:

  - ``mbr``: (default) sets up an MS-DOS partition table
  - ``gpt``: sets up a GPT partition table

  Note: At this time only ``mbr`` and ``gpt`` partition tables are allowed.
  We anticipate that in the future we will also have ``RAID`` to create a
  ``mdadm`` RAID.

- ``layout={...}``:
  The device layout. This is a list of values, with the percentage of disk that
  the partition will take. Valid options are:

  - ``[<SIZE>, [<SIZE>, <PART_TYPE]]``

    Where ``<SIZE>`` is the **percentage** of the disk to use, while
    ``<PART_TYPE>`` is the numerical value of the partition type.

  The following sets up two partitions, with the first partition having a swap
  label, taking 1/3 of the disk space, and the remainder being used as the
  second partition: ::

   /dev/xvdh':
     table_type: 'mbr'
     layout:
       - [33,82]
       - 66
     overwrite: True

  - When layout is "true", it instructs cloud-init to single-partition the
    entire device.
  - When layout is "false" it means "don't partition" or "ignore existing
    partitioning".

  If layout is set to "true" and overwrite is set to "false", cloud-init will
  skip partitioning the device without a failure.

- ``overwrite=<BOOL>``: This describes whether to "ride with safetys on and
  everything holstered".

  - "false" is the default, which means that:

    1. The device will be checked for a partition table
    2. The device will be checked for a filesystem
    3. If either a partition of filesystem is found, then the operation will
       be **skipped**.

  - "true" is **cowboy mode**. There are no checks and things are done blindly.
    Use this option only with caution, you can do things you really, really
    don't want to do.

Set up the filesystem
=====================

``fs_setup`` describes the how the filesystems are supposed to look.

.. code-block:: yaml

    fs_setup:
      - label: ephemeral0
        filesystem: 'ext3'
        device: 'ephemeral0'
        partition: 'auto'
      - label: mylabl2
        filesystem: 'ext4'
        device: '/dev/xvda1'
      - cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s
        label: mylabl3
        filesystem: 'btrfs'
        device: '/dev/xvdh'

The general format is:

.. code-block:: yaml

   fs_setup:
     - label: <LABEL>
       filesystem: <FS_TYPE>
       device: <DEVICE>
       partition: <PART_VALUE>
       overwrite: <OVERWRITE>
       replace_fs: <FS_TYPE>

Where:

- ``<LABEL>``:
  The filesystem label to be used. If set to "None", no label is used.

- ``<FS_TYPE>``:
  The filesystem type. It is assumed that the there will be a
  ``mkfs.<FS_TYPE>`` that behaves likes ``mkfs``. On a standard Ubuntu Cloud
  Image, this means that you have the option of ``ext{2,3,4}`` and ``vfat`` by
  default.

- ``<DEVICE>``:
  The device name. Special names of ``ephemeralX`` or ``swap`` are allowed and
  the actual device is acquired from the cloud datasource.

  When using ``ephemeralX`` (i.e. ``ephemeral0``), be sure to leave the label
  as ``ephemeralX`` or there may be issues with mounting the ephemeral storage
  layer.

  If you define the device as ``ephemeralX.Y`` then Y will be interpeted as a
  partition value. However, ``ephemeralX.0`` is the **same** as ``ephemeralX``.

- ``<PART_VALUE>``:
  Partition definitions are overwritten if you use the ``<DEVICE>.Y`` notation.
  The valid options are:

  - ``auto|any``:
    Tells cloud-init not to care if there is a partition or not.
    Auto will use the first partition that does not already contain a
    filesystem. In the absence of a partition table, it will put it directly
    on the disk.

  - ``auto``:
    If a filesystem that matches the specification (in terms of label),
    filesystem and device, then cloud-init will skip the filesystem creation.

  - ``any``:
    If a filesystem that matches the filesystem type and device, then
    cloud-init will skip the filesystem creation.

  Devices are selected based on first-detected, starting with partitions and
  then the raw disk. Consider the following: ::

           NAME     FSTYPE LABEL
           xvdb
           |-xvdb1  ext4
           |-xvdb2
           |-xvdb3  btrfs  test
           \-xvdb4  ext4   test

  If you ask for ``auto``, label of ``test``, and filesystem of ``ext4`` then
  cloud-init will select the 2nd partition, even though there is a partition
  match at the 4th partition.

  If you ask for ``any`` and a label of ``test``, then cloud-init will select
  the 1st partition.

  If you ask for ``auto`` and don't define label, then cloud-init will select
  the 1st partition.

  In general, if you have a specific partition configuration in mind, you
  should define either the device or the partition number. ``auto`` and ``any``
  are specifically intended for formatting ephemeral storage or for simple
  schemes.

- ``none``:
  Put the filesystem directly on the device.

- ``<NUM>``:
  Where ``NUM`` is the actual partition number.

- ``<OVERWRITE>``:
  Defines whether or not to overwrite any existing filesystem:

  - ``"true"``:
    Indiscriminately destroy any pre-existing filesystem. Use at your own risk.

  - ``"false"``:
    If a filesystem already exists, skip the creation.

- ``<REPLACE_FS>``:
  This is a special directive, used for Microsoft Azure, which instructs
  cloud-init to replace a filesystem of ``<FS_TYPE>``.

  Note that unless you define a label, this requires the use of the ``any``
  partition directive.

.. note::
   Expected behavior: The default behavior is to check if the filesystem
   exists. If a filesystem matches the specification, then the operation is a
   no-op.

.. _cce-resizefs:

Resize partitions and filesystems
=================================

These examples show how to resize a filesystem to use all available space on
the partition. The ``resizefs`` module can be used alongside the ``growpart``
module so that if the root partition is resized by ``growpart`` then the root
filesystem is also resized.

For a full list of keys, refer to the :ref:`resizefs module <mod_cc_resizefs>`
and the :ref:`growpart module <mod_cc_growpart>` schema.

Disable root filesystem resize operation
----------------------------------------

.. literalinclude:: ../../../module-docs/cc_resizefs/example1.yaml
   :language: yaml
   :linenos:

Run resize operation in background
----------------------------------

.. literalinclude:: ../../../module-docs/cc_resizefs/example2.yaml
   :language: yaml
   :linenos:

.. _cce-growpart:

Grow partitions
===============

For a full list of keys, refer to the :ref:`Growpart module <mod_cc_growpart>`
schema.

Example 1
---------

.. literalinclude:: ../../../module-docs/cc_growpart/example1.yaml
   :language: yaml
   :linenos:

Example 2
---------

.. literalinclude:: ../../../module-docs/cc_growpart/example2.yaml
   :language: yaml
   :linenos:


Cloud examples
==============

Default disk definitions for AWS
--------------------------------

This only works for non-NVME devices on supported instance types.

.. code-block:: yaml

    #cloud-config
    disk_setup:
      ephemeral0:
        table_type: 'mbr'
        layout: True
        overwrite: False
    fs_setup:
      - label: None,
        filesystem: ext3
        device: ephemeral0
        partition: auto

Default disk definitions for Microsoft Azure
--------------------------------------------

.. code-block:: yaml

    #cloud-config
    device_aliases: {'ephemeral0': '/dev/sdb'}
    disk_setup:
      ephemeral0:
        table_type: mbr
        layout: True
        overwrite: False
    fs_setup:
      - label: ephemeral0
        filesystem: ext4
        device: ephemeral0.1
        replace_fs: ntfs

Data disks definitions for Microsoft Azure
------------------------------------------

.. code-block:: yaml

    #cloud-config
    disk_setup:
      /dev/disk/azure/scsi1/lun0:
        table_type: gpt
        layout: True
        overwrite: True
    fs_setup:
      - device: /dev/disk/azure/scsi1/lun0
        partition: 1
        filesystem: ext4

Default disk definitions for SmartOS
------------------------------------

.. code-block:: yaml

    #cloud-config
    device_aliases: {'ephemeral0': '/dev/vdb'}
    disk_setup:
      ephemeral0:
        table_type: mbr
        layout: False
        overwrite: False
    fs_setup:
      - label: ephemeral0
        filesystem: ext4
        device: ephemeral0.0

.. note::
    For SmartOS, if the ephemeral disk is not defined, then the disk will
    not be automatically added to the mounts.

    The default definition is used to make sure that the ephemeral storage is
    setup properly.

.. LINKS
.. _disk setup module: https://cloudinit.readthedocs.io/en/latest/reference/modules.html#disk-setup