自动 GCP 永久性磁盘初始化

问题描述 投票:0回答:3

是否有任何脚本可以自动执行永久性磁盘格式化并附加到 Google Cloud VM 实例,而不是执行格式化和安装步骤

永久磁盘是使用 Terraform 创建的,它还会创建一个虚拟机并使用

attached_disk
命令将磁盘附加到该虚拟机。

我希望在虚拟机实例启动时运行一个简单的脚本:

  • 检查附加磁盘是否已格式化,如果需要则使用 ext4 进行格式化
  • 检查磁盘是否挂载,未挂载则挂载
  • 不做任何其他事情
google-cloud-platform google-compute-engine terraform terraform-provider-gcp
3个回答
10
投票

您是否考虑过在实例上使用启动脚本(我想您也可以使用 Terraform 添加启动脚本)?您可以使用

if
循环来发现磁盘是否已格式化,如果没有,您可以尝试运行您链接的文档中的格式化/安装命令(我意识到您已经建议您不想遵循中的手动步骤)文档,但可以将这些集成到启动脚本中以达到所需的结果)。

如果磁盘未格式化,则运行以下输出并空字符串:

 sudo blkid /dev/sdb

因此,您可以在启动脚本中使用它来发现磁盘是否已格式化,如果不是,则执行格式化/安装。例如,您可以使用类似的内容(注意***如果磁盘已格式化但未安装,这可能很危险,如果您的用例可能涉及可能已格式化的现有磁盘,则不应使用):

#!/bin/bash


if sudo blkid /dev/sdb;then 
        exit
else 
        sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb; \
        sudo mkdir -p /mnt/disks/newdisk
        sudo mount -o discard,defaults /dev/sdb /mnt/disks/newdisk
fi

9
投票

标记的答案对我不起作用,因为

sudo blkid /dev/sdb
部分始终返回一个值(因此为 true)并且脚本将退出。

我更新了脚本以检查

fstab
中的条目,并向脚本添加了安全选项。

#!/bin/bash
set -uxo pipefail

MOUNT_DIR=/mnt/disks/persistent_storage
DISK_NAME=my-disk

# Check if entry exists in fstab
grep -q "$MOUNT_DIR" /etc/fstab
if [[ $? -eq 0 ]]; then # Entry exists
    exit
else
    set -e # The grep above returns non-zero for no matches & we don't want to exit then.

    # Find persistent disk's drive value, prefixed by `google-`
    DEVICE_NAME="/dev/$(basename $(readlink /dev/disk/by-id/google-${DISK_NAME}))"

    sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard $DEVICE_NAME
    sudo mkdir -p $MOUNT_DIR
    sudo mount -o discard,defaults $DEVICE_NAME $MOUNT_DIR

    # Add fstab entry
    echo UUID=$(sudo blkid -s UUID -o value $DEVICE_NAME) $MOUNT_DIR ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
fi

如果您想下载它,这是要点 - https://gist.github.com/raj-saxena/3dcaa5c0ba0be88ed91ef3fb50d3ce85


2
投票

几乎所有时候都需要在 /etc/fstab 中格式化、安装和添加条目。这是我想出的解决方案,可能对其他人有帮助。当然,这也可以改进。我添加了 echo 命令来解释每个块的作用。

关于磁盘名称,当您将磁盘附加到实例时,您可以在 terraform 代码中添加 device_name,如下所述:https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/计算附加磁盘

device_name -(可选) 指定您选择的唯一设备名称,该名称反映在实例中运行的 Linux 操作系统的 /dev/disk/by-id/google- 树中。此名称可用于在实例内引用用于安装、调整大小等的设备。*

#!/bin/bash

DISKS_PATH=/dev/disk/by-id

DISKS=(disk1 disk2)

check_disks () {
    for disk in "${DISKS[@]}"; do
        MOUNT_DIR="/$disk"
        echo "$MOUNT_DIR"
        if sudo blkid $DISKS_PATH/google-${disk}; then
            echo "$disk is already formatted, nothing to do"
            echo "checking if $disk is present in fstab"
            UUID=$(sudo blkid -s UUID -o value $DISKS_PATH/google-${disk})
            grep -q "UUID=${UUID} $MOUNT_DIR" /etc/fstab
            if [[ $? -eq 0 ]]; then
                echo "$disk already present in fstab, continuing with checking mount"
                echo "Now checking if $disk is already mounted"
                grep -qs "$MOUNT_DIR" /proc/mounts
                if [[ $? -eq 0 ]]; then
                    echo "$disk is already mounted, so doing nothing  with mount"
                else
                    echo "$disk is not mounted, so mounting it"
                    sudo mkdir -p $MOUNT_DIR
                    sudo mount -o discard,defaults $DISKS_PATH/google-${disk} $MOUNT_DIR
                fi
            elif [[ $? -ne 0 ]]; then
                echo "$disk not present in fstab, so adding it"
                echo UUID="$UUID" $MOUNT_DIR ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
                echo "Now checking if $disk is already mounted"
                grep -qs "$MOUNT_DIR" /proc/mounts
                if [[ $? -eq 0 ]]; then
                    echo "$disk is already mounted, so doing nothing  with mount"
                else
                    echo "$disk is not mounted, so mounting it"
                    sudo mkdir -p $MOUNT_DIR
                    sudo mount -o discard,defaults $DISKS_PATH/google-${disk} $MOUNT_DIR
                fi
            fi
        else
            echo "Formatting ${disk}"
            sudo mkfs.ext4 $DISKS_PATH/google-${disk};
            echo "Creating directory for ${disk} on $MOUNT_DIR"
            sudo mkdir -p $MOUNT_DIR
            echo "adding  $disk in fstab"
            UUID=$(sudo blkid -s UUID -o value $DISKS_PATH/google-${disk})
            echo UUID="$UUID" $MOUNT_DIR ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
            echo "Mounting $disk"
            sudo mount -o discard,defaults $DISKS_PATH/google-${disk} $MOUNT_DIR
        fi
    done
}

check_disks
© www.soinside.com 2019 - 2024. All rights reserved.