File system management

Local file systems, both supported and unsupported, are represented by LMI_LocalFileSystem class and its subclasses.

Each LMI_LocalFileSystem instance of supported filesystems have associated one instance of LMI_FileSystemSetting representing its configuration (e.g. inode size).

Supported filesystems are: ext2, ext3, ext4, xfs, btrfs. Only supported filesystems can be created! Actual set of supported filesystems can be obtained from LMI_FileSystemConfigurationCapabilities instance associated to LMI_FileSystemConfigurationService.

Following instance diagram shows four block devices:

  • /dev/sda1 and /dev/sda2 with btrfs filesystem spanning both these devices.
  • /dev/sda3 with ext3 filesystem.
  • /dev/sda4 with msdos filesystems. The msdos filesystem is unsupported, therefore it has no LMI_FileSystemSetting associated.

Note

Currently the filesystem support is limited:

  • Filesystems can be only created and deleted, it is not possible to modify existing filesystem.
  • There is no way to set specific filesystem options when creating one. Simple mkfs.<filesystem type> is called, without any additional parameters.
  • btrfs filesystem can be only created or destroyed. There is currently no support for btrfs subvolumes, RAIDs, and dynamic addition or removal of block devices.
  • The LMI_LocalFileSystem instances do not report free and used space on the filesystems.

These limitations will be addressed in future releases.

Useful methods

LMI_CreateFileSystem
Formats a StorageExtent with filesystem of given type. Currently the Goal parameter is not used, i.e. no filesystem options can be specified.
DeleteFileSystem

Destroys a file system (LMI_LocalFileSystem) or other metadata, such as Physical Volume metadata or MD RAID metadata present (LMI_DataFormat) on a device.

Only unmounted filesystems and unused metadata can be deleted.

Use cases

Note

All example scripts expect properly initialized lmishell.

Create File System

Use LMI_CreateFileSystem method. Following example formats /dev/sda3 with ext3:

filesystem_service = ns.LMI_FileSystemConfigurationService.first_instance()

# Find the /dev/sda3 device
sda3 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sda3"})

# Format it
(ret, outparams, err) = filesystem_service.SyncLMI_CreateFileSystem(
        FileSystemType=filesystem_service.LMI_CreateFileSystem.FileSystemTypeValues.EXT3,
        InExtents=[sda3])

The resulting filesystem is the same as shown in diagram above.

Create btrfs File System with two devices

Use the same LMI_CreateFileSystem method as above. Following example formats /dev/sda1 and dev/sda2 as one btrfs volume:

filesystem_service = ns.LMI_FileSystemConfigurationService.first_instance()

# Find the /dev/sda1+2 devices
sda1 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sda1"})
sda2 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sda2"})

# Format them
(ret, outparams, err) = filesystem_service.SyncLMI_CreateFileSystem(
        FileSystemType=filesystem_service.LMI_CreateFileSystem.FileSystemTypeValues.BTRFS,
        InExtents=[sda1, sda2])

The resulting filesystem is the same as shown in diagram above.

Delete filesystem

Use LMI_CreateFileSystem method:

filesystem_service = ns.LMI_FileSystemConfigurationService.first_instance()

sda1 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sda1"})
fs = sda1.first_associator(ResultClass='LMI_LocalFileSystem')
(ret, outparams, err) = filesystem_service.SyncDeleteFileSystem(
        TheFileSystem = fs)

Note that with one btrfs on multiple block devices, the whole btrfs volume is destroyed.

Future direction

In future, we might implement:

  • Add advanced options to LMI_CreateFileSystem
  • Allow (some) filesystem modification, e.g. amount of reserved space for root user.
  • Indications of various events, like filesystem is getting full.