[Yandex Cloud documentation](../../../index.md) > [Yandex Compute Cloud](../../index.md) > [Step-by-step guides](../index.md) > File storages > Attaching a file storage to a VM

# Attaching a file storage to a VM

{% note warning %}

You can only attach a [file storage](../../concepts/filesystem.md) to [VMs](../../concepts/vm.md) running a Linux [OS](../../concepts/filesystem.md#os) with kernel version 5.4 or higher.

To check the kernel version, run `sudo uname -r`.

{% endnote %}

1. If the VM [status](../../concepts/vm-statuses.md) is `RUNNING`, [stop it](../vm-control/vm-stop-and-start.md#stop).
1. Attach a file storage to the VM in Compute Cloud:

   {% list tabs group=instructions %}

   - Management console {#console}

     1. In the [management console](https://console.yandex.cloud), select the [folder](../../../resource-manager/concepts/resources-hierarchy.md#folder) where you created the file storage.
     1. Navigate to **Compute Cloud**.
     1. In the left-hand panel, select ![image](../../../_assets/console-icons/nodes-right.svg) **File storages**.
     1. Select the storage.
     1. Go to the **Virtual machines** tab.
     1. Click ![image](../../../_assets/console-icons/plus.svg) **Attach to VM**.
     1. In the window that opens:
        1. Select the VM.
        1. Specify the device name to represent the file storage in the VM. Save this name as you will need it when mounting the storage.
        1. Click **Attach to VM**.

   - CLI {#cli}

     If you do not have the Yandex Cloud CLI yet, [install and initialize it](../../../cli/quickstart.md#install).

     The folder used by default is the one specified when [creating](../../../cli/operations/profile/profile-create.md) the CLI profile. To change the default folder, use the `yc config set folder-id <folder_ID>` command. You can also specify a different folder for any command using `--folder-name` or `--folder-id`. If you access a resource by its name, the search will be limited to the default folder. If you access a resource by its ID, the search will be global, i.e., through all folders based on access permissions.

     1. See the description of the [CLI](../../../cli/index.md) command for attaching a file storage to a VM:

        ```bash
        yc compute instance attach-filesystem --help
        ```

     1. Get a list of file storages in the default [folder](../../../resource-manager/concepts/resources-hierarchy.md#folder):

        ```bash
        yc compute filesystem list
        ```
        
        Result:
        
        ```text
        +----------------------+-------------------+------------+---------------+--------+-------------+
        |          ID          |        NAME       |    SIZE    |     ZONE      | STATUS | DESCRIPTION |
        +----------------------+-------------------+------------+---------------+--------+-------------+
        | epdtcr9blled******** | first-filesystem  | 1073741824 | ru-central1-a | READY  |             |
        | epd3f4gv8bs4******** | second-filesystem | 1073741824 | ru-central1-a | READY  |             |
        +----------------------+-------------------+------------+---------------+--------+-------------+
        ```

     1. Get a list of VMs in the default folder:

        ```bash
        yc compute instance list
        ```

        Result:

        ```text
        +----------------------+-------+---------------+---------+--------------+-------------+
        |          ID          | NAME  |    ZONE ID    | STATUS  |  EXTERNAL IP | INTERNAL IP |
        +----------------------+-------+---------------+---------+--------------+-------------+
        | epdj4upltbiv******** | vm-01 | ru-central1-a | RUNNING | 51.250.**.** | 192.168.*.* |
        | 1pc3088tkv4m******** | vm-02 | ru-central1-a | RUNNING | 84.201.**.** | 192.168.*.* |
        +----------------------+-------+---------------+---------+--------------+-------------+
        ```

     1. Attach the file storage to the VM:

        ```bash
        yc compute instance attach-filesystem \
          --id <VM_ID> \
          --filesystem-id <file_storage_ID> \
          --device-name <device_name>
        ```

        Where:
        * `--id`: VM ID.

          Instead of the ID, you can specify the VM name in the `--name` parameter.

        * `--filesystem-id`: File storage ID.

          Instead of the ID, you can specify the file storage name in the `--filesystem-name` parameter.

        * `--device-name`: Device name to represent the file storage in the VM. This is an optional setting.

          By default, the file storage ID is used as the device name.

        Result:

        ```text
        id: epdj4upltbiv********
        folder_id: b1g681qpemb4********
        created_at: "2024-04-29T15:50:19Z"
        name: vm-01
        ...
        filesystems:
        - mode: READ_WRITE
          device_name: attached-filesystem
          filesystem_id: epdtcr9blled********
        ...
        ```

   - Terraform {#tf}

     If you do not have Terraform yet, [install it and configure the Yandex Cloud provider](../../../tutorials/infrastructure-management/terraform-quickstart.md#install-terraform).
     
     
     To manage infrastructure using Terraform under a service account or user accounts (a Yandex account, a federated account, or a local user), [authenticate](../../../terraform/authentication.md) using the appropriate method.

     Set the `allow_stopping_for_update` parameter to `true` on your VM, if you have not done it yet.

     To attach a file storage to your VM, add the `filesystem` section with the `filesystem_id` parameter to the VM description (see the example below).
     1. Open the Terraform configuration file and add a section specifying the storage to the VM description:

        {% cut "Example of specifying a storage in the VM configuration using Terraform" %}

        ```hcl
        ...
        resource "yandex_compute_instance" "vm-1" {
          name        = "test-vm"
          platform_id = "standard-v3"
          zone        = "ru-central1-a"

          filesystem {
            filesystem_id = "fhmaikp755gr********"
          }
        }
        ...
        ```

        {% endcut %}

     1. Apply the changes:

        1. In the terminal, navigate to the configuration file directory.
        1. Make sure the configuration is correct using this command:
        
           ```bash
           terraform validate
           ```
        
           If the configuration is valid, you will get this message:
        
           ```bash
           Success! The configuration is valid.
           ```
        
        1. Run this command:
        
           ```bash
           terraform plan
           ```
        
           You will see a list of resources and their properties. No changes will be made at this step. Terraform will show any errors in the configuration.
        1. Apply the configuration changes:
        
           ```bash
           terraform apply
           ```
        
        1. Type `yes` and press **Enter** to confirm the changes.

     You can check whether the storage has been attached to the VM using the [management console](https://console.yandex.cloud) or this [CLI](../../../cli/index.md) command:

     ```bash
     yc compute instance get <VM_name>
     ```

   - API {#api}

     Use the [attachFilesystem](../../api-ref/Instance/attachFilesystem.md) REST API method for the [Instance](../../api-ref/Instance/index.md) resource or the [InstanceService/AttachFilesystem](../../api-ref/grpc/Instance/attachFilesystem.md) gRPC API call.

   {% endlist %}

1. Mount the file storage on the VM:
   1. If you do not know the device name, run this command:

      ```bash
      yc compute instance get <VM_name>
      ```

      Result:

      ```text
      ...
      filesystems:
        - mode: READ_WRITE
          device_name: storagename
          filesystem_id: epdb1jata63j********
      ...
      ```

      Save the value of the `device_name` field under `filesystems`. This is the name of the device to mount your file storage on; you will need it later.
   1. [Connect](../vm-connect/ssh.md) to the VM over SSH.
   1. Run this command:

      ```bash
      sudo mount -t virtiofs <device_name> <mount_path>
      ```

      Where:
      * `<device_name>`: Value of the `device_name` field you saved before. In the example above, it is `storagename`. Your device name may be different.
      * `<mount_path>`: Folder or disk to mount the file storage to, e.g., `/mnt/vfs0`.
   1. Check that the file storage has been mounted:

      ```bash
      df -T
      ```

      Result:

      ```text
      Filesystem        Type         1K-blocks    Used Available Use% Mounted on
      udev              devtmpfs        988600       0    988600   0% /dev
      tmpfs             tmpfs           203524     780    202744   1% /run
      /dev/vda2         ext4          13354932 1909060  10861420  15% /
      tmpfs             tmpfs          1017604       0   1017604   0% /dev/shm
      tmpfs             tmpfs             5120       0      5120   0% /run/lock
      tmpfs             tmpfs          1017604       0   1017604   0% /sys/fs/cgroup
      tmpfs             tmpfs           203520       0    203520   0% /run/user/1000
      storagename       virtiofs      66774660       0  66774660   0% /mnt/vfs0
      ```

   1. To mount the file storage every time the VM starts, add the following line to the `/etc/fstab` file:

      ```text
      <device_name> <mount_path> virtiofs    rw    0   0
      ```