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¶
1#cloud-config 2device_aliases:{my_alias:/dev/sdb, swap_disk:/dev/sdc} 3disk_setup: 4/dev/sdd:{layout:true, overwrite:true, table_type:mbr} 5my_alias: 6layout:[50,50] 7overwrite:true 8table_type:gpt 9swap_disk: 10layout: 11-[100,82] 12overwrite:true 13table_type:gpt 14fs_setup: 15-{cmd:mkfs -t %(filesystem)s -L %(label)s %(device)s, device:my_alias.1, filesystem:ext4, 16 label:fs1} 17-{device:my_alias.2, filesystem:ext4, label:fs2} 18-{device:swap_disk.1, filesystem:swap, label:swap} 19-{device:/dev/sdd1, filesystem:ext4, label:fs3} 20mounts: 21-[my_alias.1,/mnt1] 22-[my_alias.2,/mnt2] 23-[swap_disk.1,none,swap,sw,'0','0'] 24-[/dev/sdd1,/mnt3]
Partition a disk¶
The disk_setup
directive instructs Cloud-init to partition a disk. The
format is:
#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:
disk_setup: <DEVICE>: table_type:'mbr' layout:<LAYOUT|BOOL> overwrite:<BOOL>
Where:
<DEVICE>
: The name of the device.ephemeralX
andswap
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 tablegpt
: sets up a GPT partition table
Note: At this time only
mbr
andgpt
partition tables are allowed. We anticipate that in the future we will also haveRAID
to create amdadm
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:
The device will be checked for a partition table
The device will be checked for a filesystem
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.
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:
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 amkfs.<FS_TYPE>
that behaves likesmkfs
. On a standard Ubuntu Cloud Image, this means that you have the option ofext{2,3,4}
andvfat
by default.<DEVICE>
: The device name. Special names ofephemeralX
orswap
are allowed and the actual device is acquired from the cloud datasource.When using
ephemeralX
(i.e.ephemeral0
), be sure to leave the label asephemeralX
or there may be issues with mounting the ephemeral storage layer.If you define the device as
ephemeralX.Y
then Y will be interpreted as a partition value. However,ephemeralX.0
is the same asephemeralX
.<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 oftest
, and filesystem ofext4
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 oftest
, 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
andany
are specifically intended for formatting ephemeral storage or for simple schemes.none
: Put the filesystem directly on the device.<NUM>
: WhereNUM
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.
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 resizefs module and the growpart module schema.
Disable root filesystem resize operation¶
1#cloud-config 2resize_rootfs:false
Run resize operation in background¶
1#cloud-config 2resize_rootfs:noblock
Grow partitions¶
For a full list of keys, refer to the Growpart module schema.
Example 1¶
1#cloud-config 2growpart: 3devices:[/] 4ignore_growroot_disabled:false 5mode:auto
Example 2¶
1#cloud-config 2growpart: 3devices:[/,/dev/vdb1] 4ignore_growroot_disabled:true 5mode:growpart
Cloud examples¶
Default disk definitions for AWS¶
This only works for non-NVME devices on supported instance types.
#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¶
#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¶
#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¶
#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.