LXD 5.6 has been released

Introduction

The LXD team is very excited to announce the release of LXD 5.6!

This is another busy LXD release, coming with improvements all around, whether you’re using LXD to run some containers, virtual machines or are using clustering and projects.

Enjoy!

New features and highlights

Grafana Loki support

LXD can now stream its log messages and lifecycle events over to a central Grafana Loki server. This initial implementation supports basic HTTP authentication and has some flexibility around what fields are sent as labels.

Specification: [LXD] Stream lifecycle and log events to Loki
Documentation: Server configuration - LXD documentation

Object storage on local storage pools

Following the initial implementation of storage buckets in LXD 5.5 with Ceph, this release now expands that feature to work with all of our other storage drivers.

This is based on the great work from the MinIO project which lets us offer an S3 compatible API directly from a local storage driver.

Specification: [LXD] Object storage (S3 API)
Documentation: How to manage storage buckets and keys - LXD documentation

Infiniband support for virtual machines

Still continuing our work to get our virtual machines be at parity with our containers, we have now added support for Infiniband to LXD VMs.

This works effectively the same way as containers by using the infiniband device type, both physical and sriov is supported. Unlike with containers, for SR-IOV to function in this case, you will need to make sure that IOMMU is enabled on the system and that you have a number of SR-IOV virtual functions left "unprobed` by the Mellanox driver.

Documentation: Instance configuration - LXD documentation

Restricted network access in projects

Still growing the number of configuration options and restrictions available on LXD projects, we have now introduced a new restricted.networks.access which takes a comma delimited list of managed networks.

When set, such a restricted project will only allow the use and even listing of those networks. This is particularly useful in environments that aren’t using ovn for networking but where one network per project is indeed used for isolation.

Documentation: Project configuration - LXD documentation

instance-ready lifecycle event

LXD 5.5 introduced the new READY instance state which can be triggered through the /dev/lxd guest API. Now LXD 5.6 introduces a new instance-ready lifecycle event which is emitted whenever an instance reaches that ready state.

Metric for total effective CPUs

Lastly, a new metric has been added to LXD’s metrics API.

lxd_cpu_effective_total will report the total number of CPUs that are available to the insance. This can be useful to accurately calculate CPU percentage usage.

Complete changelog

Here is a complete list of all changes in this release:

Full commit list
  • Doc: Fix typo in howto/storage_backup
  • gomod: Update dependencies
  • Makefile: Pin xgettext-go to working version
  • doc: backquote true and NO_PROXY in doc/server.md
  • doc: backquote mac in doc/api-extensions.md
  • doc: backquote instance types in events.md
  • doc: backqoute cloud-init in doc/cloud-init.md
  • Doc: replace Pongo with Pongo2 in doc/image-handling.md
  • doc: Capitalize fuse to FUSE in doc/instances.md
  • doc: Capitalize candid in doc/api-extensions.md
  • doc: Use more backquotes in documents
  • doc: Capitalize MAC filtering in doc/instances.md
  • doc: Improve uses of backquotes in documents
  • Doc: update using backquotes by review suggestions
  • lxd/instance/drivers: Adds storage pool to instance-created lifecycle context.
  • doc: Correct typo in cephobject.radosgw.endpoint*
  • lxd: Correct typo in cephobject.radosgw.endpoint*
  • test: Correct typo in cephobject.radosgw.endpoint*
  • lxd/db/cluster/update: Adds patch to correct typo in cephobject.radosgsw.endpoint*
  • doc: Note AIO requirement
  • lxd/db/generate/db/stmt: Add braces around WHERE clause
  • lxd/db/cluster/devices: Add Filter structs to Config/Devices
  • lxd/db/generate/db/parse: Generate queries with multiple filters
  • lxd/db/cluster/mapper: Update generated code
  • lxd/instance/instancetype/instance/type: Add instancetype.Filter
  • lxd: Remove usage of empty filter structs
  • doc/storage: small cleanup to the storage bucket documentation
  • doc/storage: group the pool/volume/bucket information
  • doc: remove FAQ about live migration
  • api: Adds storage_buckets_create_credentials extension
  • lxd-generate: Catch ‘type’ and change to ‘entityType’.
  • lxd/db/cluster/schema: Apply schema patch version for bucket config typo fix
  • doc/migration: add link to lxd-migrate tutorial on Discourse
  • doc/upgrading: clarify database updates
  • doc/storage/btrfs: add YouTube link
  • doc/storage/lvm: add YouTube link
  • client: Update CreateStoragePoolBucket to return create-time admin key
  • lxc/storage/bucket: Display generated admin key in cmdStorageBucketCreate
  • lxd/storage/buckets: Generate admin key on bucket creation
  • test: Update storage buckets tests to check for initial credentials
  • i18n: Update translation templates
  • doc/rest-api: Refresh swagger YAML
  • doc/storage: make navigation titles more consistent
  • lxd/storage/buckets: Handle missing URL in storagePoolBucketsGet
  • api: metric: lxd_cpu_seconds_total: fix help text, floats
  • lxd/db/generate/db/method: Fix external package support
  • lxd/db/generate/db/stmt: Add joinon tag
  • lxd/db/generate/db/stmt: Don’t allow joins and leftjoins at the same time
  • lxd/db/generate/db/stmt: Use joinon tag for ID query generation
  • lxd-generate: Adds method to get table and column from join config.
  • lxd-generate: Use join table in order by clause.
  • lxd-generate: Use join table config in create statement subselect.
  • lxd-generate: Use join table config in update statement subselect.
  • lxd-generate: Updates whereClause to use join config.
  • lxd/db/generate: Use joinTable
  • lxd: Change project rename response to operation in swagger.
  • doc: Regenerate swagger.
  • lxd/storage/buckets: Detect missing bucket URL in storagePoolBucketGet
  • lxd/storage/utils: Improve errors
  • lxd/storage/utils: Return explicit nil on error in VolumeDBGet
  • lxd/storage/utils: Prevent using VolumeDBCreate to create bucket volume records
  • lxd/storage/drivers/volume: Adds VolumeTypeBucket type
  • lxd/storage/drivers/interface: Use Volume type for bucket functions
  • lxd/storage/drivers/driver/common: Updates bucket functions to accept Volume type
  • lxd/storage/drivers/driver/cephobject/buckets: Use consistent minio s3 client context names
  • lxd/storage/drivers/driver/cephobject: Improved comments
  • lxd/storage/drivers/driver/cephobject/buckets: Updates to use Volume type for bucket config
  • lxd/storage/utils: Adds BucketDBCreate and BucketDBDelete functions
  • lxd/storage/backend/lxd: Switch to using Volume for buckets
  • lxd/storage/backend/lxd: Removes unused GetBucket
  • lxd/storage/drivers/bucket: Removes unused Bucket type
  • doc/requirements: correct statement about AIO
  • lxd/cgroup: Add GetEffecticeCPUs
  • lxd/metrics: Add lxd_cpu_effective_total
  • api: metrics_cpu_effective_total
  • lxd/db/storage/buckets: Allow cross-pool bucket listing in GetStoragePoolBuckets
  • lxd/storage/buckets: tx.GetStoragePoolBuckets usage
  • lxd/storage/storage: tx.GetStoragePoolBuckets usage
  • lxd/storage/drivers/driver/zfs: Adds ensureInitialDatasets function
  • lxd/storage/drivers/driver/cephobject/buckets: Ensure context cancel is run after revert.Fail
  • doc: improve systemd-resolved integration by adding stop command
  • doc: resolvectl status doesn’t require sudo
  • doc: remove sentence about disk support for VMs
  • doc/network: add note that static leases require MAC as identifier
  • doc/storage/volumes: add --all-projects to documentation
  • lxd/apparmor: Deref compress commands
  • shared/api/event/lifecycle: Add instance ready constant
  • lxd/lifecycle: Add InstanceReady lifecycle event
  • lxd/devlxd: Send InstanceReady lifecycle event
  • doc/events: Add instance-ready lifecycle event
  • test: Test InstanceReady lifecycle event
  • doc: add configuration and script for markdownlint
  • doc: add a target for running markdownlint
  • doc: add an action to run markdownlint on the docs
  • doc: fix markdown errors for MD022
  • doc: fix markdown errors for MD004-MD007
  • doc: fix markdown errors for MD034
  • doc: fix markdown errors for MD032
  • doc: fix markdown errors for MD012
  • doc: fix markdown errors for MD031
  • doc: fix markdown errors for MD027
  • doc: do not use emphasis
  • doc: fix markdown errors for MD026
  • doc: fix markdown errors for MD038
  • doc: fix markdown errors for MD010
  • doc: fix markdown errors for MD038
  • doc: fix markdown errors for MD002
  • lxd/device: Support physical infiniband for VMs
  • doc: add related links to the start page
  • test: Add 60s timeout to lxc commands
  • test: Add clean up of storage buckets in kill_lxd
  • scripts/empty-lxd.sh: Add emptying of storage buckets
  • test: Allow automatic removal of loop devices in deconfigure_loop_device
  • lxd/db/networks: Removes unused NetworkNodes function
  • lxd/db/storage/pools: Removes unused StoragePoolNodes function
  • lxd/instance/drivers/driver/lxc: Removes profiles argument from lxcLoad
  • lxd/instance/drivers/driver/common: Removes profiles argument from expandConfig
  • lxd/instance/drivers/driver/qemu: Removes profiles argument from qemuLoad
  • lxd/instance: Removes profiles argument from load
  • lxd: instance.Load usage
  • lxd/profiles/utils: instance.Load usage in doProfileUpdateInstance
  • lxd-agent/server: Log original error during write error in createCmd
  • lxd/daemon: Log original error during write error in createCmd
  • lxd/operations/websocket: Don’t return close errors in Render
  • lxd/instance/drivers: Change common.Project from string to api.Project type
  • lxd/instance: Updates instance load functions to accept api.Project
  • lxd/device/disk: instance.Load usage
  • lxd/project/permissions: Update AllowSnapshotCreation to accept api.Project
  • lxd/instance: instance.Load and project.AllowSnapshotCreation usage
  • lxd/instance/snapshot: project.AllowSnapshotCreation usage
  • lxd/instances: instance.Load usage
  • lxd/storage/backend/lxd: instance.Load usage
  • lxd/storage/utils: Updates VolumeUsedByProfileDevices to pass api.Project to callback function
  • lxd/storage/volumes/utils: storagePools.VolumeUsedByProfileDevices and instance.Load usage
  • lxd/profiles/utils: Updates profile management functions to load projects
  • lxd/profiles/utils: Fix incorrect handling of error in doProfileUpdate
  • lxd/storage/volumes/snapshot: project.AllowSnapshotCreation usage
  • lxd/storage/volumes: instance.Load usage
  • lxd/project/project: Updates ProfileProject to return effective api.Project info
  • lxd/profiles: project.ProfileProject usage
  • lxd/project/project: Updates NetworkProject to return requested project’s info
  • lxd/networks: NetworkProject usage
  • lxd/project/project: Align StorageBucketProject with StorageVolumeProject return values
  • lxd/storage/buckets: project.StorageBucketProject usage
  • lxd/instance: Change Project() to return api.Project
  • lxd/instance: inst.Project() usage
  • lxd/device/disk: inst.Project() usage
  • lxd/device/proxy: inst.Proxy() usage
  • lxd/device: inst.Project() usage
  • lxd/backup: inst.Project() usage
  • lxd/seccomp: inst.Project() usage
  • lxd/maas: inst.Project() usage
  • lxd/lifecycle: inst.Project() usage
  • lxd/network: inst.Project() usage
  • lxd/storage/backend/lxd: inst.Project() usage
  • lxd/apparmor: inst.Project() usage
  • lxd: inst.Project() usage
  • lxc-to-lxd: Handle linux32 and linux64 arch personalities
  • doc/network/bgp: add some clarifications to the BGP docs
  • doc/metrics: add a list of provided metrics
  • lxd/instance/drivers/driver/qemu: Adds support for multi-queue macvlan NICs in VMs
  • lxd/backup: Add Profiles field do Config struct
  • lxd/storage: Add profiles to backup data
  • lxd/db/generate/db/parse: Add ParseStmt
  • lxd/db/generate/db/stmt: Parse ‘objects’ directive result to create ‘objects-by’
  • lxd/db/cluster/instance/profiles: Add ‘objects’ directive for instance_profiles and certificate_projects
  • lxd/db/generate/README: Add lxd-generate README
  • lxd/db/cluster/mapper: Update generated code
  • doc/migration: Document lxc-to-lxd tool
  • api: Adds projects_networks_restricted_access extension
  • doc/projects: Documents restricted.networks.access
  • lxd/api/project: Adds restricted.networks.access
  • lxd/project/project: Adds NetworkAllowed function
  • lxd/network: Uses project.NetworkAllowed to check access to networks
  • lxd/networks: Prevent creation of managed networks not accessible by project
  • doc/storage/dir: add link to the YouTube video
  • lxd/project/permissions: Updates checkRestrictions to check NICs against restricted.networks.access setting
  • test: Updates project restrictions tests to check for restricted.networks.access setting
  • lxd/apparmor: allow rw access to /sys/fs/bpf
  • api: Adds storage_buckets_local extension
  • shared/util: Adds HTTPSStorageBucketsDefaultPort constant
  • lxd/endpoints: StorageBucketsServer listener
  • lxd/api/1.0: Updates doApi10UpdateTriggers to handle core.storage_buckets_address
  • scripts/bash/lxd-client: Adds core.storage_buckets_address
  • lxd/node/config: Adds core.storage_buckets_address support
  • lxd/storage/s3/types: Add S3 types
  • lxd/storage/s3/headers: Adds AuthorizationHeaderAccessKey function
  • lxd/storage/s3/policy: Adds policy generator
  • lxd/storage/s3/miniod: Adds miniod package
  • gomod: Adds GitHub - minio/madmin-go: The MinIO Admin Go Client SDK provides APIs to manage MinIO services
  • lxd/db/storage/buckets: Adds GetStoragePoolLocalBucket function
  • lxd/db/storage/buckets: Adds GetStoragePoolLocalBucketByAccessKey function
  • lxd/db/storage/buckets: Uses GetStoragePoolLocalBucketByAccessKey in CreateStoragePoolBucketKey and UpdateStoragePoolBucketKey
  • lxd/storage/pool/interface: Adds ActivateBucket
  • lxd/storage/pool/interface: Adds GetBucketURL definition
  • lxd/storage/backend/mock: Adds ActivateBucket
  • lxd/storage/backend/mock: Adds GetBucketURL
  • lxd/storage/backend/lxd: Implements local bucket support
  • lxd/storage/drivers: Renames BucketURL to GetBucketURL for consistency
  • lxd/storage/drivers/driver/dir: Add bucket support
  • lxd/storage/drivers/driver/lvm: Add bucket support
  • lxd/storage/drivers/driver/btrfs: Add bucket support
  • lxd/storage/drivers/driver/zfs: Add bucket support
  • lxd/storage/buckets: Use pool.GetBucketURL()
  • lxd/api: Adds storageBucketsServer
  • lxd/daemon: Initialise StorageBucketsServer listener in init
  • lxd/daemon: Shutdown minio processes during Stop
  • doc: Updates docs for local storage bucket support
  • test: Update storage buckets tests
  • lxd/db/generate/db/mapping: Add field-to-sql clause conversion helpers
  • lxd/db/generate/db/stmt: Rework statement generation
  • lxd/db/cluster/nodes: Generate ID statement for nodes
  • lxd/db/cluster/snapshots: Remove ‘via’ tag and replace with ‘joinon’ tag
  • lxd/db/cluster/mapper: Update generated code
  • lxd/db/generate/db/stmt: Expect full database package path in arguments
  • lxd/db/generate/db/stmt: Fallback to database package for parsing existing variables
  • lxd/db/generate/README: Update lxd-generate README
  • lxd/network/driver/bridge: Consider a dnsmasq start failure as a network start failure
  • lxd/warnings: Fix lxc warning show
  • doc: move live migration content
  • doc: cosmetic changes
  • lxc/config/default: Change DefaultConfig to a function
  • lxc/config: DefaultConfig usage
  • test: Add tests to check for lxc warning show functionality
  • doc/migration: clarify how to enable live migration for VMs
  • GetAllXattr: handle overlay filtering
  • lxd/db: Remove GetLocalStoragePoolVolumes and storagePoolVolumesGet functions
  • lxd/db/storage/pools: Removes GetStoragePoolVolume
  • lxd/storage/utils: Updates VolumeDBGet to return *db.StorageVolume and use tx.GetStoragePoolVolume
  • lxd/storage/backend/lxd: Replace b.state.DB.Cluster.GetLocalStoragePoolVolume with VolumeDBGet usage
  • lxd/api/internal: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/cluster/connect: Replace s.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/daemon/storage: Replace s.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/db/storage/volume/snapshots: Replace c.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/db/storage/volumes: Replace c.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/device/disk: Replace d.state.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/storage/pool/load: Replace state.DB.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/storage/volumes: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/storage/volumes/backup: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/storage/volumes/snapshot: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/storage/volumes/state: Replace d.db.Cluster.GetLocalStoragePoolVolume with tx.GetStoragePoolVolume usage
  • lxd/db/storage/volumes: Removes inefficient storagePoolVolumeGetType and associated functions
  • lxd/db: Removes storageVolumeIDsGet and storagePoolVolumeReplicateIfCeph
  • lxd/db/generate/db/mapping: Use ‘join’ tag to deduce column name
  • lxd/db/generate/db/mapping: Override joined column name with ‘joinon’ tag
  • lxd/storage/s3/miniod: Use a sub-directory for minio on storage volume
  • shared/subprocess/proc: Adds context support
  • shared/subprocess/manager: Removes redundant error return value from NewProcessWithFds
  • lxd/archive/archive: subprocess usage
  • lxd/device: subprocess usage
  • lxd/instance/drivers/driver/qemu: subprocess usage
  • lxd/network/driver/bridge: subprocess usage
  • lxd/apparmor/archive: Use non-deferenced outputPath to derive profile name in archiveProfile
  • gomod: Updates dependencies
  • shared/logger/log: Don’t modify the global logrus standard logger
  • shared/util/linux: Update GetAllXattr implementation using github.com/pkg/xattr
  • gomod: Adds github.com/pkg/xattr
  • shared/idmap/idmapset/linux: Improve errors in doUidshiftIntoContainer
  • shared/idmap/idmapset/linux: Go vet fixes in doUidshiftIntoContainer
  • lxd: Fix calls to inst.Project().Name when used in fmt.Sprintf and related functions
  • Makefile: Fix shellcheck version detection
  • Makefile: Use same pinned version of golangci-lint as github workflows
  • lxd/db/generate/db/method: Use QueryRowContext for one-row queries
  • lxd/db/cluster/mapper: Update generated code
  • lxd/db/query/objects: Include context in db query helpers
  • lxd/db/generate/db/method: Pass context to query helpers
  • lxd/db/cluster/mapper: Update generated code
  • lxd: Pass transaction ctx through to query helpers
  • lxd/test: Update tests
  • lxd/db/db: Include context in node Transaction
  • lxd: Update node.Transaction usages
  • lxd: Pass node transaction ctx to query helpers
  • lxd/db/schema/schema: Add context to schema updates
  • lxd/firewall/drivers/drivers/nftables: Pass rules via stdin rather than as command arguments
  • lxd/networks: Don’t log all networks initialized if they weren’t yet
  • gomod: go mod tidy
  • lxd/networks: Start deferred networks depending on physical interfaces before logical ones
  • lxd/storage/backend/lxd: Log pool names in Mount and Unmount
  • lxd/db/query/retry: Don’t log not found errors in Retry
  • lxd/network/openvswitch/ovn: Check that the chassis is a member of the correct chassis group in ChassisGroupChassisDelete
  • lxd/db/images: Adds project support to UpdateImageLastUseDate
  • lxd/db/images: Adds project and custom last used date support to SetImageCachedAndLastUseDate
  • lxd/db/images: Make CreateImage project argument and explicit string type
  • lxd/images: d.db.Cluster.SetImageCachedAndLastUseDate usage
  • lxd/daemon/images: d.db.Cluster.SetImageCachedAndLastUseDate usage
  • lxd/daemon/images: Ensure cached property is maintained when using existing image from another project
  • lxd/instance: s.DB.Cluster.UpdateImageLastUseDate usage
  • test/README: Use backticks for test env var options
  • test/README: Clarify options which enable tests
  • test/README: Removes unused LXD_SKIP_STATIC
  • test: Adds LXD_SKIP_TESTS env var option
  • lxd/db: Replace usage of QueryRow with QueryRowContext
  • lxd/db: Add context arg to more tx methods
  • lxd/db: Replace tx.Query with tx.QueryContext
  • lxd: Pass transaction ctx to QueryContext
  • lxd/patches: Use context.TODO for db patch calls to query helpers
  • lxd/test: Update tests
  • lxd/db/generate/db/method: Remove superfluous error check for GetID
  • lxd/db/cluster/mapper: Update generated code
  • lxd/device: Support sr-iov infiniband for VMs
  • doc/instances: Add VM to supported instance types for infiniband devices
  • build(deps): bump actions/checkout from 2 to 3
  • build(deps): bump actions/setup-go from 2 to 3
  • doc/performance: create new pages
  • doc/performance: move content from production setup
  • shared/osarch: Improve 32bit arm handling
  • shared/validate/validate: Add IsX509Certificate validator
  • shared/validate/validate: Remove List validators
  • lxd/network/driver/physical: Update usages
  • lxd/network/driver/physical: Fix ipv4.routes validation
  • lxd/storage/drivers/driver/dir/volumes: Don’t allow creating a volume that already exists on disk
  • lxd/storage/backend/lxd: Delete local volume if bucket creation fails
  • lxd/storage/drivers/volume: Create bucket local storage volumes using same permissions as custom volumes
  • lxd/storage/s3/miniod/miniod: Run MinIO as LXD’s unprivilged user
  • lxd/storage/backend/lxd: miniod.EnsureRunning usage
  • doc: update footer to display correctly
  • test: Adds LXD_REQUIRED_TESTS support
  • test: Updates test_storage_buckets to check for minio command
  • lxd/device/device/common: Fix project name in device logger
  • doc/security: edit information about name leakage
  • doc/performance: clean up information about txqueuelen
  • doc/performance: clean up page about production setup server settings
  • doc/performance: move production setup page
  • doc/metrics: make part of the Metrics documentation reusable
  • doc/performance: update the performance tuning information
  • doc/spellcheck: add benchmarking to wordlist
  • Drop replace directive in go.mod
  • Update gomod
  • client: Handle nil args in CopyImage
  • doc/performance: add how-to guide for benchmarking
  • doc/lxc-to-lxd: update installation command
  • doc/storage: add information about special custom volumes
  • doc/storage: add link to YouTube video about storage volumes
  • doc/storage: add links between storage documentation
  • doc/instance API: add link to YouTube video
  • lxd/events: Add simpleListenerConnection
  • lxd/cluster/config: Add Loki config keys
  • lxd/events: Remove closed listeners
  • lxd/events: Add internal listener
  • lxd/daemon: Add internal event listener to Daemon
  • Update gomod
  • lxd/loki: Support Loki server
  • lxd: Support Loki server
  • doc/server: Add Loki config
  • api: Add loki API extension
  • i18n: Update translations from weblate
  • gomod: Update dependencies

Try it for yourself

This new LXD release is already available for you to try on our demo service.

Downloads

The release tarballs can be found on our download page.

Binary builds are also available for:

  • Linux: snap install lxd
  • MacOS: brew install lxc
  • Windows: choco install lxc
1 Like

LXD 5.6 is currently in the latest/candidate snap channel with rollout to stable scheduled for early next week.

There’s going to be the usual release live stream at 2pm east coast time on Monday:

1 Like

Thanks for the live stream.

The loki instructions on youtube are not all working for me. First, you need to add docker-compose to the install command.

Only the loki.api.url key is accepted for me. All the other loki.api give an error like this:

$ lxc config set loki.api.loglevel=info
Error: cannot set 'loki.api.loglevel' to 'info': unknown key

Oops, I think I’ve now corrected the comment. I wrote it from memory after the fact so got a few things wrong :wink: