Get the PVC's actual disk usage on vSAN datatore
search cancel

Get the PVC's actual disk usage on vSAN datatore

book

Article ID: 404844

calendar_today

Updated On:

Products

VMware vSphere Kubernetes Service

Issue/Introduction

The PVC is stored on the vSAN datastore, and the customer wants to know the actual disk usage occupied by backend vsan objects.

Environment

vSAN 7.x

vSAN 8.x

CNS

Resolution

1. Install GOVC

2. Access to the vCenter

export GOVC_INSECURE=1
export GOVC_URL='https://[email protected]:<SSO_PW>@<VCENTER_IP>'

3. Get the volume info

govc volume.ls > volumes.txt

Output similar to:
#######-####-####-####-###########    pvc-########-####-####-####-###########
#######-####-####-####-###########   pvc-########-####-####-####-###########

4. Copy the text file to ESXi 

5. Run the script

#!/bin/sh
 
FCD_DIR="/vmfs/volumes/vsanDatastore/fcd"
VOLUME_MAP_FILE="volumes.txt"
 
# 检查映射文件是否存在
if [ ! -f "$VOLUME_MAP_FILE" ]; then
  echo "❌ Volume map file '$VOLUME_MAP_FILE' 不存在"
  exit 1
fi
 
echo "🔍 正在处理 CNS Volume → PVC 映射文件: $VOLUME_MAP_FILE"
echo "📦 FCD 路径: $FCD_DIR"
echo
 
# 读取映射文件中的每一行
while read -r LINE; do
  # 忽略空行或注释
  [ -z "$LINE" ] && continue
  echo "$LINE" | grep -q '^#' && continue
 
  # 拆分 volume ID 和 PVC 名
  CNS_ID=$(echo "$LINE" | awk '{print $1}')
  PVC_NAME=$(echo "$LINE" | awk '{print $2}')
 
  echo "🔸 CNS Volume ID: $CNS_ID"
  echo "🔸 PVC Name     : $PVC_NAME"
 
  FOUND=0
  # 遍历 FCD 目录中的 .vmdk 文件
  for VMDK_FILE in "$FCD_DIR"/*.vmdk; do
    # 跳过 flat.vmdk 文件
    echo "$VMDK_FILE" | grep -q 'flat.vmdk$' && continue
 
    # 获取描述文件中的 PVC 名
    MATCHED_NAME=$(grep 'ddb.fcd.name' "$VMDK_FILE" | cut -d'"' -f2)
 
    if [ "$MATCHED_NAME" = "$PVC_NAME" ]; then
      # 提取 vSAN UUID(Extent description 下一行中的路径)
      EXTENT_LINE=$(awk '/^# Extent description/{getline; print}' "$VMDK_FILE")
      VSAN_UUID=$(echo "$EXTENT_LINE" | awk -F'/' '{print $NF}' | sed 's/"//g')
 
      echo "✅ 匹配成功:"
      echo "    描述文件  : $VMDK_FILE"
      echo "    PVC 名称  : $MATCHED_NAME"
      echo "    vSAN UUID : $VSAN_UUID"
 
      # 执行 localcli 命令,获取实际使用的容量
      USED_CAPACITY=$(localcli vsan debug object list -u "$VSAN_UUID" | grep "Used:" | awk '{print $2}')
 
      if [ -n "$USED_CAPACITY" ]; then
        echo "    实际使用容量 : $USED_CAPACITY"
      else
        echo "    无法获取实际使用容量"
      fi
 
      echo
      FOUND=1
      break
    fi
  done
 
  if [ "$FOUND" -eq 0 ]; then
    echo "❌ 未在 $FCD_DIR 中找到 PVC 匹配: $PVC_NAME"
    echo
  fi
 
done < "$VOLUME_MAP_FILE"

6. Output similar to 

🔍 正在处理 CNS Volume → PVC 映射文件: volumes.txt
📦 FCD 路径: /vmfs/volumes/vsanDatastore/fcd
  
🔸 CNS Volume ID: #########-####-####-####-#########
🔸 PVC Name     : pvc-#########-####-####-####-#########
✅ 匹配成功:
    描述文件  : /vmfs/volumes/vsanDatastore/fcd/<VMDK_NAME>.vmdk
    PVC 名称  : pvc-#########-####-####-####-#########
    vSAN UUID : <VSAN_OBJECT>
    实际使用容量 : 0.18