[英]Automate GCP persistent disk initialization
是否有任何脚本可以自动格式化永久磁盘并将其附加到 Google Cloud VM 实例,而不是执行格式化和安装步骤?
永久磁盘是使用 Terraform 创建的,它还会创建一个 VM 并使用attached_disk
命令将磁盘附加到它。
我希望在 VM 实例启动时运行一个简单的脚本:
您是否考虑过在实例上使用启动脚本(我认为您也可以使用 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
标记的答案对我不起作用,因为sudo blkid /dev/sdb
部分总是返回一个值(因此为真)并且脚本将退出。
我更新了脚本以检查fstab
的条目并向脚本添加了安全选项。
#!/bin/bash
set -uxo pipefail
MNT_DIR=/mnt/disks/persistent_storage
DISK_NAME=my-disk
# Check if entry exists in fstab
grep -q "$MNT_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) $MNT_DIR ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
fi
如果你想下载它,这是要点 - https://gist.github.com/raj-saxena/3dcaa5c0ba0be88ed91ef3fb50d3ce85
几乎所有时间都需要在 /etc/fstab 中格式化、挂载和添加条目。 这是我想出的解决方案,可能会对其他人有所帮助。 当然,这也可以改进。 我添加了 echo 命令来解释每个块的作用。
关于磁盘名称,当您将磁盘附加到此处提到的实例时,您可以在 terraform 代码中添加设备名称: https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_attached_disk
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 xfs 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 xfs 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.