为GCP抢占式实例编写启动脚本配置本地scratch SSD
GCE抢占式实例本地SSD自动配置启动脚本方案
我之前在折腾GCE抢占式实例的本地SSD自动配置时踩过不少小坑,刚好能给你一套实用的启动脚本方案——毕竟抢占式实例每次重启本地SSD都会被清空,自动格式化挂载确实是刚需,而且你也说了VM上没重要数据,完全不用担心格式化的问题。
核心思路拆解
根据GCE本地SSD的文档,核心步骤就是识别设备→格式化→挂载,我们把这些步骤写成自动化脚本,让实例启动时自动完成:
1. 精准识别本地SSD设备
GCE的本地SSD通常会被识别为/dev/nvme0n1(单块的情况),但为了避免设备名因实例配置变化而改变,最好用lsblk来动态过滤:
# 过滤掉系统盘sda,只取其他磁盘设备 LOCAL_SSD=$(lsblk -dno NAME,SIZE,TYPE | grep disk | grep -v sda | awk '{print "/dev/"$1}')
如果是多块本地SSD,只需要把这里的逻辑改成循环处理所有匹配的设备就行。
2. 强制格式化SSD
因为本地SSD每次启动都是“全新”的,直接用mkfs.ext4加-F参数跳过确认,适合脚本自动执行:
mkfs.ext4 -F $LOCAL_SSD
3. 创建挂载点并完成挂载
先创建指定的挂载目录(比如/mnt/local-ssd),然后挂载设备:
MOUNT_POINT="/mnt/local-ssd" mkdir -p $MOUNT_POINT # 确保目录存在,不存在就创建 mount $LOCAL_SSD $MOUNT_POINT
4. 配置开机自动挂载(可选但强烈推荐)
如果希望实例重启后自动挂载,需要把设备信息写入/etc/fstab。这里推荐用/dev/disk/by-id下的硬件ID路径,比直接用设备名更稳定:
# 获取本地SSD的硬件ID路径 SSD_ID=$(ls -l /dev/disk/by-id | grep $(basename $LOCAL_SSD) | grep -v part | awk '{print $9}') # 写入fstab echo "/dev/disk/by-id/$SSD_ID $MOUNT_POINT ext4 defaults 0 0" >> /etc/fstab
完整启动脚本示例
把上面的步骤整合起来,就是一个开箱即用的脚本:
#!/bin/bash set -e # 遇到错误立即退出,避免后续无效操作 # 1. 识别本地SSD设备 LOCAL_SSD=$(lsblk -dno NAME,SIZE,TYPE | grep disk | grep -v sda | awk '{print "/dev/"$1}') # 检查是否找到设备 if [ -z "$LOCAL_SSD" ]; then echo "Error: 未检测到本地SSD设备" exit 1 fi # 2. 格式化SSD echo "正在格式化本地SSD设备: $LOCAL_SSD" mkfs.ext4 -F $LOCAL_SSD # 3. 创建挂载点并挂载 MOUNT_POINT="/mnt/local-ssd" echo "正在挂载至目录: $MOUNT_POINT" mkdir -p $MOUNT_POINT mount $LOCAL_SSD $MOUNT_POINT # 4. 配置开机自动挂载 echo "配置开机自动挂载..." SSD_ID=$(ls -l /dev/disk/by-id | grep $(basename $LOCAL_SSD) | grep -v part | awk '{print $9}') echo "/dev/disk/by-id/$SSD_ID $MOUNT_POINT ext4 defaults 0 0" >> /etc/fstab echo "本地SSD配置完成!已挂载至 $MOUNT_POINT"
一些实用提醒
- 抢占式实例终止时,本地SSD的数据会被彻底清除,所以千万不要用来存储重要数据,适合做临时计算缓存、中间数据存储这类场景。
- 如果你的实例配置了多块本地SSD,只需要修改脚本中的设备识别逻辑,改成循环处理所有匹配的
LOCAL_SSD即可。 - GCE的启动脚本默认以root权限执行,所以不需要额外加
sudo,直接把脚本内容填入创建实例时的“启动脚本”字段(gcloud命令用--metadata startup-script='#!/bin/bash...'参数)就行。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

