Kernel command line
*******************

Providing configuration data via the kernel command line is somewhat of a last
resort, since many datasources do not support injecting kernel command line
arguments without modifying the bootloader.

Note that this page describes kernel command line behavior that applies
to all clouds. The :ref:`NoCloud datasource<datasource_nocloud>` provides more
configuration options.

.. _kernel_datasource_override:

Datasource discovery override
=============================

During boot, cloud-init must identify which datasource it is running on
(OpenStack, AWS, Azure, GCP, etc). This discovery step can be optionally
overridden by specifying the datasource name, such as:

.. code-block:: text

   root=/dev/sda ro ds=openstack

Kernel cloud-config-url configuration
=====================================

In order to allow an ephemeral, or otherwise pristine image to receive some
configuration, ``cloud-init`` can read a URL directed by the kernel command
line and proceed as if its data had previously existed.

This allows for configuring an instance metadata service, or some other data.

When :ref:`the local stage<boot-Local>` runs, it will check to see if
``cloud-config-url`` appears in key/value fashion in the kernel command line,
such as:

.. code-block:: text

   root=/dev/sda ro cloud-config-url=http://foo.bar.zee/abcde

``Cloud-init`` will then read the contents of the given URL. If the content
starts with ``#cloud-config``, it will store that data to the local filesystem
in a static filename :file:`/etc/cloud/cloud.cfg.d/91_kernel_cmdline_url.cfg`,
and consider it as part of the config from that point forward.

.. note::
   If :file:`/etc/cloud/cloud.cfg.d/91_kernel_cmdline_url.cfg` already exists,
   cloud-init will not overwrite the file, and the ``cloud-config-url``
   parameter is completely ignored.


This is useful, for example, to be able to configure the MAAS datasource by
controlling the kernel command line from outside the image, you can append:

.. code-block:: text

    cloud-config-url=http://your.url.here/abcdefg

Then, have the following content at that url:

.. code-block:: yaml

    #cloud-config
    datasource:
      MAAS:
        metadata_url: http://mass-host.localdomain/source
        consumer_key: Xh234sdkljf
        token_key: kjfhgb3n
        token_secret: 24uysdfx1w4

.. warning::

   ``url`` kernel command line key is deprecated.
   Please use ``cloud-config-url`` parameter instead.

.. note::

   Since ``cloud-config-url=`` is so generic, in order to avoid false
   positives, only :ref:`cloud config<user_data_formats-cloud_config>` user
   data starting with ``#cloud-config`` is supported.


.. note::

   The ``cloud-config-url=`` is unencrypted http GET, and may contain
   credentials. Care must be taken to ensure this data is only
   transferred via trusted channels (i.e., within a closed system).
