ข้ามไปยังเนื้อหาหลัก
Version: TOS 7

VMs CLI

บทนำ​

VMs CLI เป็นเครื่องมือจัดการบรรทัดคำสั่งของแอปพลิเคชันเสมือน VMs ของ TerraMaster ซึ่งให้ความสามารถในการสืบค้นและบริหารจัดการเหมือนกับอินเทอร์เฟซจัดการบนเว็บ CLI สื่อสารกับบริการ VMs ผ่าน unix socket ของเครื่องนี้ ใช้ส่วนติดต่อคำสั่งที่เป็นมาตรฐานและรูปแบบเอาต์พุต JSON จึงสามารถผสานรวมในสคริปต์ การบริหารจัดการอัตโนมัติ และเวิร์กโฟลว์การพัฒนาต่อยอดได้

คุณสมบัติหลัก​

  • ใช้งานได้ทันที: ติดตั้งพร้อมกับแอปพลิเคชัน VMs ไม่ต้องติดตั้งเพิ่มเติม
  • วิธีเรียกใช้ที่ยืดหยุ่น: รองรับหลายช่องทาง เช่น เทอร์มินัลในเครื่อง, SSH ระยะไกล, สคริปต์, เครื่องมือ AI เป็นต้น
  • โหมดโต้ตอบและไม่โต้ตอบ: เหมาะทั้งสำหรับการบำรุงรักษาประจำวันของผู้ดูแลระบบ และสำหรับสคริปต์และงานอัตโนมัติ
  • รองรับเอาต์พุต JSON: สะดวกสำหรับการแยกวิเคราะห์ด้วยโปรแกรมและการผสานรวมอัตโนมัติ
  • การสื่อสารในเครื่อง: สื่อสารกับบริการ VMs ผ่าน unix socket ของเครื่องนี้เท่านั้น ไม่เปิดพอร์ตออกภายนอก
  • ยืนยันการดำเนินการที่เป็นอันตรายซ้ำ: การดำเนินการเช่นลบเครื่องเสมือน ลบเครือข่าย จะต้องยืนยันตามค่าเริ่มต้น

เริ่มต้นอย่างรวดเร็ว​

# 在终端中执行(可通过本地终端、SSH、脚本、AI 工具等任意命令行途径)
vms --help

# 查看虚拟机列表
vms vm list

# 查看虚拟机详情
vms vm get <id>

# 以 JSON 格式输出(便于脚本解析)
vms vm list --json

ตัวอย่างเอาต์พุตของ vms vm list:

NAME     GUEST ID                              STATUS    VCPU NUM  VRAM SIZE  IP
145 09fd98ee-4e2d-4c7a-a95c-8bacab80d322 shutdown 4 2097152 -
win10 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1 shutdown 4 2097152 -
1454486 5a0391f2-c545-45eb-8eed-0a104972229b shutdown 4 2097152 -
win101 32ee5a74-de8b-47a9-959d-1725c881ceab shutdown 4 2097152 -

ตัวเลือกส่วนกลาง​

ตัวเลือกต่อไปนี้ใช้ได้กับทุกคำสั่ง:

ตัวเลือกรูปย่อคำอธิบาย
--help-hแสดงข้อมูลช่วยเหลือของคำสั่ง
--version-vแสดงหมายเลขเวอร์ชัน (ใช้ร่วมกับ --json เพื่อแสดงข้อมูลแบบมีโครงสร้างได้)
--json-แสดงผลในรูปแบบ JSON
--yes-yข้ามข้อความยืนยันการดำเนินการที่เป็นอันตราย (ต้องใช้ในโหมดไม่โต้ตอบ)
--debug-เปิดใช้งานเอาต์พุตดีบัก แสดงกระบวนการทำงานอย่างละเอียด
--socket <path>-พาธของ VMs unix socket ค่าเริ่มต้นคือ /var/api/VMs.sock
--timeout <duration>-เวลาหมดเวลาของคำขอ ค่าเริ่มต้นคือ 30s

ตัวอย่างข้อมูลเวอร์ชัน​

vms --version
vms CLI v1.0.058
vms --version --json
{
"build": "20260911",
"cli_version": "v1.0.058"
}

สภาพแวดล้อมการทำงาน​

VMs CLI ติดตั้งพร้อมกับแอปพลิเคชัน VMs เมื่อเปิดใช้งานแอปพลิเคชัน จะลิงก์ CLI ไปยังไดเรกทอรี PATH เริ่มต้นของระบบ เมื่อเข้าสู่ระบบผ่าน SSH แล้วสามารถใช้งานได้ทันที

รายการคำอธิบาย
ไฟล์ CLI/Volume1/@apps/VMs/bin/vms
พาธคำสั่ง/usr/local/sbin/vms (อยู่ในระบบ PATH แล้ว)
วิธีการสื่อสารunix socket ของเครื่องนี้ ค่าเริ่มต้น /var/api/VMs.sock
ผู้ใช้งานผู้ดูแลระบบที่เข้าสู่ระบบเครื่องนี้

ข้อควรระวัง:

  • CLI ใช้สำหรับจัดการเครื่องเสมือนของเครื่องนี้ ไม่รองรับการจัดการอุปกรณ์อื่นจากระยะไกลผ่าน CLI
  • ฝั่งเซิร์ฟเวอร์จะส่งคืน HTTP 200 เสมอ ความสำเร็จของคำสั่งพิจารณาจากฟิลด์ code ในเนื้อหาการตอบกลับ CLI จะแปลงเป็นรหัสออกตามข้อมูลนี้
  • การดำเนินการที่เป็นอันตราย (ลบเครื่องเสมือน ลบเครือข่าย ลบอิมเมจ ลบพื้นที่จัดเก็บ) ในโหมดโต้ตอบจะขอการยืนยัน ในโหมดไม่โต้ตอบต้องระบุ --yes อย่างชัดเจน

ตารางสรุปคำสั่ง​

ต่อไปนี้เป็นข้อมูลอ้างอิงอย่างรวดเร็วของคำสั่ง vms ทั้งหมด:

คำสั่งหลักคำสั่งย่อยคำอธิบายฟังก์ชันต้องยืนยันความเสี่ยงสูง
vms--versionแสดงข้อมูลเวอร์ชันไม่ไม่
vms vmlistแสดงรายการเครื่องเสมือนทั้งหมดไม่ไม่
vms vmgetดูรายละเอียดเครื่องเสมือนที่ระบุไม่ไม่
vms vmlist-resourceแสดงรายการทรัพยากรที่ใช้สร้างเครื่องเสมือนได้ไม่ไม่
vms vmlogsดูบันทึกการดำเนินการของเครื่องเสมือนไม่ไม่
vms vmpoweronเปิดเครื่องเสมือนไม่ไม่
vms vmpoweroffปิดเครื่องเสมือน (ปิดเครื่องตามปกติ)ใช่ไม่
vms vmforce-poweroffบังคับปิดเครื่องเสมือนใช่✅
vms vmrebootรีสตาร์ทเครื่องเสมือนไม่ไม่
vms vmpauseหยุดเครื่องเสมือนชั่วคราวไม่ไม่
vms vmresumeกลับมาใช้งานเครื่องเสมือนที่หยุดชั่วคราวไม่ไม่
vms vmautorunตั้งค่าเปิดเครื่องอัตโนมัติไม่ไม่
vms vmcloneโคลนเครื่องเสมือนไม่ไม่
vms vmexportส่งออกเครื่องเสมือนเป็นไฟล์ OVAไม่ไม่
vms vmdeleteลบเครื่องเสมือนใช่✅
vms vm disklistดูฮาร์ดดิสก์เสมือนของเครื่องเสมือนไม่ไม่
vms vm snapshotlistแสดงรายการสแนปช็อตของเครื่องเสมือนไม่ไม่
vms vm snapshotcreateสร้างสแนปช็อตไม่ไม่
vms vm snapshoteditแก้ไขคำอธิบายและสถานะการล็อกของสแนปช็อตไม่ไม่
vms vm snapshotconfigดูการกำหนดค่าเครื่องเสมือนที่บันทึกไว้ในสแนปช็อตไม่ไม่
vms vm snapshotconsistencyดูตัวอย่างความสอดคล้องของสแนปช็อตไม่ไม่
vms vmlinkรับข้อมูลการเชื่อมต่อคอนโซล VNCไม่ไม่
vms networklistแสดงรายการเครือข่ายเสมือนไม่ไม่
vms networkgetดูรายละเอียดเครือข่ายเสมือนไม่ไม่
vms networkcreateสร้างเครือข่ายเสมือนไม่ไม่
vms networkupdateอัปเดตเครือข่ายเสมือนไม่ไม่
vms networkdeleteลบเครือข่ายเสมือนใช่✅
vms networklist-interfacesแสดงรายการอินเทอร์เฟซเครือข่ายตามประเภทที่ระบุไม่ไม่
vms networklist-vnicsแสดงรายการการ์ดเครือข่ายเสมือนบนเครือข่ายไม่ไม่
vms networkovsinfoดูว่าเปิดใช้งาน OVS หรือไม่ไม่ไม่
vms imagelistแสดงรายการอิมเมจไม่ไม่
vms imageeditแก้ไขข้อมูลอิมเมจไม่ไม่
vms imagedeleteลบอิมเมจใช่✅
vms imagelist-vmsดูเครื่องเสมือนที่ใช้อิมเมจนี้ไม่ไม่
vms repolistแสดงรายการพื้นที่จัดเก็บไม่ไม่
vms repogetดูรายละเอียดพื้นที่จัดเก็บไม่ไม่
vms repoupdateอัปเดตการกำหนดค่าพื้นที่จัดเก็บไม่ไม่
vms repodeleteลบพื้นที่จัดเก็บใช่✅
vms repolist-volumesแสดงรายการโวลุ่มที่ใช้งานได้ไม่ไม่
vms repolist-vmsแสดงรายการเครื่องเสมือนภายในพื้นที่จัดเก็บไม่ไม่
vms repocheck-runningตรวจสอบเครื่องเสมือนที่กำลังทำงานบนพื้นที่จัดเก็บไม่ไม่
vms repowhether-exist-dataตรวจสอบว่ามีข้อมูลภายในพื้นที่จัดเก็บหรือไม่ไม่ไม่
vms settinggetดูการตั้งค่าส่วนกลางไม่ไม่
vms collectdhostinfoดูข้อมูลการตรวจสอบโฮสต์ไม่ไม่
vms collectdvminfoดูข้อมูลการตรวจสอบเครื่องเสมือนไม่ไม่
vms collectdstorageinfoดูข้อมูลการตรวจสอบพื้นที่จัดเก็บไม่ไม่

ข้อมูลอ้างอิงคำสั่ง​

<id> ในคำสั่งคือ ID ของเครื่องเสมือน ซึ่งสอดคล้องกับ GUEST ID ในเอาต์พุตรายการเครื่องเสมือน ส่วน <network_id>, <image_id>, <repo_id> ก็เช่นเดียวกัน สามารถรับได้จาก vms network list, vms image list, vms repo list ตามลำดับ

เกี่ยวกับตัวอย่างเอาต์พุต: เอาต์พุตแบบตารางของ vms จะตัดค่าฟิลด์ที่ยาวเกินไปตามความกว้างคงที่ (ลงท้ายด้วยเครื่องหมายจุดไข่ปลา และไม่เกี่ยวข้องกับความกว้างของเทอร์มินัล) ตัวอย่างเช่น VDISKS, VNICS, ISO IMAGES ในการกำหนดค่าเครื่องเสมือน และชื่ออิมเมจ ดังนั้นในเอกสารนี้ คำสั่งที่เกี่ยวข้องกับฟิลด์ยาวจะให้ตัวอย่างเอาต์พุต --json แบบเต็ม คำสั่งอื่นๆ จะให้ตัวอย่างเอาต์พุตแบบตาราง เมื่อประมวลผลด้วยสคริปต์ก็แนะนำให้ใช้ --json เช่นกัน

I. การสืบค้นเครื่องเสมือน​

vms vm list – แสดงรายการเครื่องเสมือน​

แสดงรายการเครื่องเสมือนทั้งหมดของเครื่องนี้และสถานะพื้นฐาน

vms vm list [--limit N] [--offset N] [--json]
  • --limit, --offset เป็นพารามิเตอร์การแบ่งหน้า
  • คอลัมน์เอาต์พุต: ชื่อ, ID เครื่องเสมือน, สถานะการทำงาน, จำนวนคอร์ CPU, ขนาดหน่วยความจำ (หน่วย KB), ที่อยู่ IP

ตัวอย่างเอาต์พุต:

NAME     GUEST ID                              STATUS    VCPU NUM  VRAM SIZE  IP
145 09fd98ee-4e2d-4c7a-a95c-8bacab80d322 shutdown 4 2097152 -
win10 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1 shutdown 4 2097152 -
1454486 5a0391f2-c545-45eb-8eed-0a104972229b shutdown 4 2097152 -
win101 32ee5a74-de8b-47a9-959d-1725c881ceab shutdown 4 2097152 -

ค่าที่พบได้ทั่วไปของ STATUS:

สถานะคำอธิบาย
runningกำลังทำงาน
shutdownปิดเครื่องแล้ว
savedหยุดชั่วคราว (บันทึกสถานะการทำงานลงดิสก์แล้ว)

vms vm get – ดูรายละเอียดเครื่องเสมือน​

ดูการกำหนดค่าและสถานะการทำงานทั้งหมดของเครื่องเสมือนที่ระบุ

vms vm get <id> --json
  • เอาต์พุตประกอบด้วยฟิลด์การกำหนดค่าและสถานะการทำงานทั้งหมดของเครื่องเสมือน
  • ค่าว่างเช่น ไม่มีคำอธิบาย ไม่มี IP จะแสดงเป็นสตริงว่าง
  • หากไม่มีเครื่องเสมือน คำสั่งจะส่งคืนข้อผิดพลาดและแสดงข้อความข้อผิดพลาด

ตัวอย่างเอาต์พุต:

{
"iso_images": [
"c93083a5-2b39-4f32-b19f-1ad97c6b4de4",
"9b3f2fdd-9173-4611-a84c-0cc9ce88293c"
],
"image_paths": [
"",
""
],
"autorun": 0,
"boot_from": "cdrom",
"bios": "bios",
"kb_layout": "en-us",
"serial_console": true,
"usb_version": 2,
"usb_device_name": [
"USB - Integrated Technology Express, Inc. Disk 2.0"
],
"usbs": [
":3:3:048d:1234"
],
"use_ovmf": false,
"vnics": [
{
"prefer_sriov": false,
"vnic_type": 3,
"mac": "1a:e2:ae:95:4a:51",
"network_id": "b364a1ec-f60c-4971-9ea2-f7a002f09fa3",
"virtual_interface_id": "fe972ef5-b066-4967-89fa-8e85e43c8808"
}
],
"operating_system_type": 0,
"vdisks": [
{
"vdisk_mode": 1,
"name": "",
"unmap": false,
"iops_enable": false,
"dev_limit": 0,
"dev_reservation": 0,
"dev_weight": 3,
"vdisk_size": 1024,
"idx": 0,
"vdisk_id": "f4ed4eae-1512-4273-963b-79ebd93a0932",
"disk_image_type": "",
"disk_image_id": ""
}
],
"name": "win10",
"vcpu_num": 4,
"vcpu_usage": 0,
"vram_size": 2097152,
"video_card": "vga",
"machine_type": "1",
"cpu_weight": 3,
"ip": "",
"desc": "",
"cpu_passthru": false,
"hyperv_enlighten": true,
"cpu_pin_num": 0,
"repo_id": "735ef7f7-5d8d-4102-9377-8a7b8c33cda6",
"repo_name": "VM-Storage01",
"poweron_after_create": false,
"guest_id": "9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1",
"increaseAllocatedSize": 0,
"host_id": "15341593-7f43-49f4-9523-6ac750a63a8a",
"host_name": "",
"snap_num": 0,
"has_guest_agent": false,
"status": "shutdown",
"status_code": 0,
"status_desc": "",
"host_ram_size": 0,
"total_throughput": 0,
"total_iops": 0,
"total_io_latency": 0,
"total_rx_bytes": 0,
"total_tx_bytes": 0,
"memory_usage": 0,
"cpu_usage": 0,
"vm_status_progress": 0
}

vms vm list-resource – แสดงรายการทรัพยากรที่ใช้สร้างเครื่องเสมือนได้​

ดูทรัพยากรที่โฮสต์สามารถให้ได้ เช่น ประเภทเฟิร์มแวร์, อิมเมจ, CPU, หน่วยความจำ, เครือข่าย, พื้นที่จัดเก็บ, อุปกรณ์ที่ส่งผ่านได้ ใช้ในการประเมินก่อนสร้างเครื่องเสมือน

vms vm list-resource --json

ฟิลด์ที่ส่งคืน: max_cpu_num, max_ram_size, usbs, pci_devices, networks, repos, images, video_cards, firmware, keyboard_layout

ตัวอย่างเอาต์พุต:

{
"max_cpu_num": 4,
"max_ram_size": 16503336960,
"usbs": [
{
"product_name": "4-Port USB 2.0 Hub",
"usb_id": ":3:3:0x0bda:0x5423",
"version": ""
},
{
"product_name": "4-Port USB 3.2 Hub",
"usb_id": ":4:2:0x0bda:0x0423",
"version": ""
},
{
"product_name": "Flash Drive",
"usb_id": ":3:2:0x058f:0x6387",
"version": ""
}
],
"pci_devices": [
{
"device_name": "",
"bdf": "0000:02:00.0",
"vendor_id": "0x10ec",
"product_id": "0x8126",
"class_id": "0x020000",
"iommu_group": 13,
"iommu_group_bdfs": [
"0x0000:0x02:0x00.0x0"
],
"driver": "r8169",
"type": "Network Controller"
},
{
"device_name": "",
"bdf": "0000:00:0d.0",
"vendor_id": "0x8086",
"product_id": "0x464e",
"class_id": "0x0c0330",
"iommu_group": 2,
"iommu_group_bdfs": [
"0x0000:0x00:0x0d.0x0"
],
"driver": "xhci_hcd",
"type": "USB Controller"
},
{
"device_name": "",
"bdf": "0000:03:00.0",
"vendor_id": "0x10ec",
"product_id": "0x8126",
"class_id": "0x020000",
"iommu_group": 14,
"iommu_group_bdfs": [
"0x0000:0x03:0x00.0x0"
],
"driver": "r8169",
"type": "Network Controller"
},
{
"device_name": "",
"bdf": "0000:00:14.0",
"vendor_id": "0x8086",
"product_id": "0x54ed",
"class_id": "0x0c0330",
"iommu_group": 3,
"iommu_group_bdfs": [
"0x0000:0x00:0x14.0x2",
"0x0000:0x00:0x14.0x0"
],
"driver": "xhci_hcd",
"type": "USB Controller"
},
{
"device_name": "",
"bdf": "0000:00:14.2",
"vendor_id": "0x8086",
"product_id": "0x54ef",
"class_id": "0x050000",
"iommu_group": 3,
"iommu_group_bdfs": [
"0x0000:0x00:0x14.0x2",
"0x0000:0x00:0x14.0x0"
],
"driver": "",
"type": "IOMMU Group Device"
}
],
"networks": [
{
"name": "VM-Network04",
"network_id": "ce9807c9-47b3-4258-9a80-ea8db1fd785d",
"support_sriov": false
},
{
"name": "VM-Network05",
"network_id": "b56c2f7b-e3f0-4b68-8a3b-245c90a8f8b5",
"support_sriov": false
},
{
"name": "VM-Network01",
"network_id": "b364a1ec-f60c-4971-9ea2-f7a002f09fa3",
"support_sriov": false
},
{
"name": "VM-Network02",
"network_id": "6c9fffd8-c7c4-4968-9b50-6890a640ec94",
"support_sriov": false
},
{
"name": "VM-Network03",
"network_id": "4c05b2a2-dd49-4588-ac5c-64975c92d2d3",
"support_sriov": false
}
],
"repos": [
{
"name": "VM-Storage01",
"free_size": 941970767872,
"repo_id": "735ef7f7-5d8d-4102-9377-8a7b8c33cda6",
"volume_size": 1099511627776,
"file_system": "btrfs",
"status": ""
},
{
"name": "VM-Storage02",
"free_size": 445785296896,
"repo_id": "517571ba-f7f7-49e1-9a62-7eb6ddfd9c78",
"volume_size": 536870912000,
"file_system": "btrfs",
"status": ""
}
],
"images": [
{
"id": "c93083a5-2b39-4f32-b19f-1ad97c6b4de4",
"name": "cn_windows_10_consumer_editions_version_1909_updated_jan_2020_x86_dvd_9c50652f",
"status": "available",
"type": "iso",
"used_size": 3884539904
},
{
"id": "9b3f2fdd-9173-4611-a84c-0cc9ce88293c",
"name": "virtio-win-0.1.285pro",
"status": "available",
"type": "iso",
"used_size": 789645312
},
{
"id": "efd6da18-9475-44cf-8fb0-e2513421e68a",
"name": "haos_ova-18.2",
"status": "available",
"type": "qcow2",
"used_size": 1091698688,
"virtual_size": 34359738368
},
{
"id": "cb9d929a-d673-4e46-ac86-9488bbef19b9",
"name": "cn_windows_11_consumer_editions_version_21h2_updated_july_2022_x64_dvd_50ad4acf",
"status": "available",
"type": "iso",
"used_size": 5858816000
}
],
"video_cards": [
"cirrus",
"vga",
"vmvga"
],
"firmware": [
"Legacy BIOS",
"UEFI"
],
"keyboard_layout": [
"fr-be",
"ar",
"bepo",
"cz",
"da",
"de",
"de-ch",
"en-gb",
"en-us",
"es",
"et",
"fo",
"fr",
"fr-be",
"fr-ca",
"fr-ch",
"hr",
"hu",
"is",
"it",
"ja",
"lt",
"lv",
"mk",
"nl",
"nl-be",
"no",
"pl",
"pt",
"pt-br",
"ru",
"sl",
"sv",
"th",
"tr"
]
}

vms vm logs – ดูบันทึกการดำเนินการของเครื่องเสมือน​

ดูบันทึกการดำเนินการที่เกี่ยวข้องกับเครื่องเสมือนที่ระบุ (เปิด/ปิดเครื่อง, สแนปช็อต, แก้ไข, นำเข้า/ส่งออก เป็นต้น)

vms vm logs <id> --json [--limit N] [--desc]
  • --limit ระบุจำนวนรายการที่ส่งคืน ค่าเริ่มต้น 50
  • --desc เรียงตามเวลาจากใหม่ไปเก่า (เปิดใช้งานตามค่าเริ่มต้น)
  • บันทึกแต่ละรายการประกอบด้วยเวลา, ระดับ, หมวดหมู่, ผู้ใช้ที่ดำเนินการ และคำอธิบายเหตุการณ์ โดยคำอธิบายเหตุการณ์เป็นข้อความเต็ม
  • คำอธิบายเหตุการณ์ (event) บริการ VMs จะแสดงแบบแปลตามภาษาระบบของอุปกรณ์ ตัวอย่างในเอกสารนี้ใช้ภาษาอังกฤษเป็นมาตรฐาน

ตัวอย่างเอาต์พุต:

[
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:44:09.176535374+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) shutdown successfully"
},
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:43:10.597187659+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) started successfully"
},
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:40:32.74904922+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) shutdown successfully"
},
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:39:55.916718004+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) started successfully"
},
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:39:43.341421576+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) shutdown successfully"
},
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:38:31.518259486+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) shutdown successfully"
},
{
"id": 0,
"level": "Info",
"time": "2026-09-02T11:38:07.98065689+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine(win10) started successfully"
},
{
"id": 0,
"level": "Error",
"time": "2026-09-02T11:32:35.01952111+08:00",
"category": "vm",
"user": "system",
"event": "Virtual machine (win10) export failed (Error:stat : no such file or directory)"
}
]

II. การจัดการพลังงานเครื่องเสมือน​

vms vm poweron – เปิดเครื่องเสมือน​

vms vm poweron <id>
  • เครื่องเสมือนต้องอยู่ในสถานะปิดเครื่อง มิฉะนั้นจะส่งคืนข้อผิดพลาดความขัดแย้งของสถานะ
  • เอาต์พุต: VM powered on: <id>

vms vm poweroff – ปิดเครื่องเสมือน​

ส่งคำขอปิดเครื่องตามปกติไปยังเครื่องเสมือน เพื่อให้ระบบปิดอย่างราบรื่น

vms vm poweroff <id> [--yes]
  • เป็นการดำเนินการที่เป็นอันตราย: โหมดโต้ตอบจะถามยืนยัน โหมดไม่โต้ตอบต้องเพิ่ม --yes
  • เครื่องเสมือนต้องอยู่ในสถานะทำงาน มิฉะนั้นจะส่งคืนข้อผิดพลาดความขัดแย้งของสถานะ

ข้อความยืนยันในโหมดโต้ตอบ:

This action will powered off VM "9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1". Do you want to continue? [y/N]: 
  • เอาต์พุต: VM powered off: <id>

vms vm force-poweroff – บังคับปิดเครื่องเสมือน (ความเสี่ยงสูง)​

บังคับปิดเครื่องเสมือน เทียบเท่ากับการตัดไฟโดยตรง

vms vm force-poweroff <id> [--yes]
  • เป็นการดำเนินการความเสี่ยงสูง: โหมดโต้ตอบจะถามยืนยัน โหมดไม่โต้ตอบต้องเพิ่ม --yes
  • อาจทำให้ข้อมูลภายในเครื่องเสมือนสูญหาย แนะนำให้ใช้เฉพาะเมื่อเครื่องเสมือนไม่ตอบสนอง

ข้อความยืนยันในโหมดโต้ตอบ:

This action will force powered off VM "9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1". Do you want to continue? [y/N]: 
  • เอาต์พุต: VM force powered off: <id>

vms vm reboot – รีสตาร์ทเครื่องเสมือน​

vms vm reboot <id>
  • เอาต์พุต: VM rebooted: <id>

vms vm pause – หยุดเครื่องเสมือนชั่วคราว​

หยุดสถานะการทำงานของเครื่องเสมือนชั่วคราว และบันทึกสถานะปัจจุบันลงดิสก์

vms vm pause <id>
  • เครื่องเสมือนต้องอยู่ในสถานะทำงาน มิฉะนั้นจะส่งคืนข้อผิดพลาดความขัดแย้งของสถานะ
  • หลังหยุดชั่วคราว สถานะเครื่องเสมือนจะแสดงเป็น saved
  • เอาต์พุต: VM paused: <id>

vms vm resume – กลับมาใช้งานเครื่องเสมือน​

คืนสถานะเครื่องเสมือนจากสถานะหยุดชั่วคราวกลับสู่สถานะทำงาน

vms vm resume <id>
  • เครื่องเสมือนต้องอยู่ในสถานะหยุดชั่วคราว มิฉะนั้นจะส่งคืนข้อผิดพลาดความขัดแย้งของสถานะ
  • เอาต์พุต: VM resumed: <id>

vms vm autorun – ตั้งค่าเปิดเครื่องอัตโนมัติ​

ตั้งค่าว่าเครื่องเสมือนจะเปิดเครื่องอัตโนมัติเมื่อโฮสต์เริ่มทำงานหรือไม่

vms vm autorun <id> <true|false>
  • พารามิเตอร์ตัวที่สองต้องเป็น true หรือ false
  • คำสั่งจะอ่านการกำหนดค่าปัจจุบันและแก้ไขเฉพาะสวิตช์เปิดอัตโนมัติ การกำหนดค่าอื่นไม่ได้รับผลกระทบ
  • เอาต์พุต: Auto-start enabled for VM <id> หรือ Auto-start disabled for VM <id>

III. การคัดลอก ส่งออก และลบเครื่องเสมือน​

vms vm clone – โคลนเครื่องเสมือน​

คัดลอกเครื่องเสมือนใหม่โดยใช้เครื่องเสมือนที่มีอยู่เป็นแม่แบบ

vms vm clone --body '{"guest_id":"<source_id>","name":"my-clone"}'
vms vm clone --file clone.json
  • ในเนื้อหาคำขอ guest_id คือ ID ของเครื่องเสมือนต้นทาง name (หรือ guest_name) คือชื่อเครื่องเสมือนใหม่
  • เครื่องเสมือนต้นทางต้องอยู่ในสถานะปิดเครื่อง
  • --body ส่งเนื้อหาคำขอโดยตรงเป็นสตริง JSON ส่วน --file อ่านเนื้อหาคำขอจากไฟล์

vms vm export – ส่งออกเครื่องเสมือน​

ส่งออกเครื่องเสมือนเป็นไฟล์ OVA เพื่อความสะดวกในการสำรองข้อมูลหรือย้ายไปยังแพลตฟอร์มเสมือนอื่น

vms vm export --body '{"guest_id":"<source_id>","target_ova_path":"/Volume1/export/my-vm.ova"}'
vms vm export --file export.json
  • ในเนื้อหาคำขอ guest_id คือ ID ของเครื่องเสมือนต้นทาง target_ova_path คือพาธไฟล์เป้าหมาย ova_mode คือโหมดเข้ากันได้กับ VMware ซึ่งเป็นตัวเลือกเสริม
  • เครื่องเสมือนต้นทางต้องอยู่ในสถานะปิดเครื่อง
  • การส่งออกเป็นงานที่ใช้เวลา เครื่องเสมือนขนาดใหญ่จะใช้เวลานาน

vms vm delete – ลบเครื่องเสมือน (ความเสี่ยงสูง)​

ลบเครื่องเสมือนอย่างถาวร

vms vm delete <id> [--yes]
  • เป็นการดำเนินการความเสี่ยงสูง: โหมดโต้ตอบจะถามยืนยัน โหมดไม่โต้ตอบต้องเพิ่ม --yes
  • หลังลบไม่สามารถกู้คืนได้ โปรดยืนยันล่วงหน้าว่าข้อมูลภายในเครื่องเสมือนได้สำรองไว้แล้ว

ข้อความยืนยันในโหมดโต้ตอบ:

This action will permanently delete VM "5a0391f2-c545-45eb-8eed-0a104972229b". Do you want to continue? [y/N]: 
  • เอาต์พุต: VM deleted: <id>

IV. ฮาร์ดดิสก์เสมือน​

vms vm disk list – ดูฮาร์ดดิสก์เสมือน​

แสดงรายการฮาร์ดดิสก์เสมือนทั้งหมดของเครื่องเสมือนที่ระบุ

vms vm disk list <id> [--json]

ตัวอย่างเอาต์พุต:

NAME  VDISK ID                              VDISK SIZE  VDISK MODE  IDX
- f4ed4eae-1512-4273-963b-79ebd93a0932 1024 1 0
  • VDISK MODE คือหมายเลขประเภทคอนโทรลเลอร์ฮาร์ดดิสก์เสมือน 1 หมายถึง IDE
  • ฮาร์ดดิสก์เสมือนที่ไม่มีชื่อจะแสดงเป็น - ในคอลัมน์ NAME

V. การจัดการสแนปช็อต​

vms vm snapshot list – แสดงรายการสแนปช็อต​

vms vm snapshot list <id> [--json]

ตัวอย่างเอาต์พุต:

NAME                                    GUEST ID                              DESCRIPTION      LOCKED  CREATED AT                 VM STATE  ACTUAL CONSISTENCY
snapshot_2026-09-02T11-43-51.183703274 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1 cli-test-edited false 2026-09-02T11:43:51+08:00 running crash
snapshot_2026-05-15T17-13-48.986448711 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1 - false 2026-05-15T17:13:48+08:00 shutdown filesystem
  • VM STATE คือสถานะการทำงานของเครื่องเสมือนขณะสร้างสแนปช็อต
  • ACTUAL CONSISTENCY คือประเภทความสอดคล้องของสแนปช็อต filesystem หมายถึงความสอดคล้องระดับระบบไฟล์ crash หมายถึงความสอดคล้องระดับการขัดข้อง

vms vm snapshot create – สร้างสแนปช็อต​

สร้างสแนปช็อตให้เครื่องเสมือน เพื่อใช้ย้อนกลับอย่างรวดเร็วหรือสำรองสถานะปัจจุบัน

vms vm snapshot create <id>
vms vm snapshot create <id> --body '{"description":"before-upgrade","locked":false}'
  • เนื้อหาคำขอเป็นตัวเลือกเสริม: description คือคำอธิบายสแนปช็อต locked คือการล็อกหรือไม่
  • ชื่อสแนปช็อตระบบจะสร้างอัตโนมัติตามเวลาที่สร้าง
  • สแนปช็อตจะใช้พื้นที่จัดเก็บ หากไม่ล้างเป็นเวลานานอาจเต็มพื้นที่ แนะนำให้จัดระเบียบเป็นประจำ

vms vm snapshot edit – แก้ไขสแนปช็อต​

แก้ไขคำอธิบายหรือสถานะการล็อกของสแนปช็อต

vms vm snapshot edit <id> <snapshot_name> --body '{"description":"updated description"}'
vms vm snapshot edit <id> <snapshot_name> --body '{"locked":true}'
  • แก้ไขเฉพาะฟิลด์ที่ปรากฏในเนื้อหาคำขอ ฟิลด์ที่ไม่ปรากฏจะคงค่าเดิมไว้ การแก้ไขเฉพาะคำอธิบายจะไม่เปลี่ยนสถานะการล็อก และในทางกลับกันก็เช่นเดียวกัน

ตัวอย่างเอาต์พุต:

PROPERTY            VALUE
ACTUAL CONSISTENCY crash
CREATED AT 2026-09-02T11:43:51+08:00
DESCRIPTION cli-test-edited
GUEST ID 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1
LOCKED false
NAME snapshot_2026-09-02T11-43-51.183703274
VM STATE running

vms vm snapshot config – ดูการกำหนดค่าเครื่องเสมือนในสแนปช็อต​

ดูการกำหนดค่าเครื่องเสมือนที่บันทึกไว้ในสแนปช็อต

vms vm snapshot config <id> <snapshot_name>

<id> คือ ID เครื่องเสมือน <snapshot_name> คือชื่อสแนปช็อต สามารถรับได้จาก vms vm snapshot list <id>

ตัวอย่างเอาต์พุต:

PROPERTY                VALUE
CPU COMPATIBILITY MODE true
CPU PASSTHRU false
HYPERV ENLIGHTEN true
REPO NAME VM-Storage01
USB DEVICE NAME ["USB - Integrated Technology Express, Inc. Disk 2.0"]
USB VERSION 2
USBS [":3:3:048d:1234"]
VCPU NUM 4
VDISK NUM 1
VDISK TOTAL SIZE 1024
VDISKS [{"name":"disk1","type":"ide","vdisk_size":1024}]
VIDEO CARD vga
VRAM SIZE 2097152

vms vm snapshot consistency – ดูตัวอย่างความสอดคล้องของสแนปช็อต​

ดูตัวอย่างประเภทความสอดคล้องที่อาจได้ก่อนสร้างสแนปช็อต ช่วยในการตัดสินว่าปัจจุบันเหมาะกับการสร้างสแนปช็อตหรือไม่

vms vm snapshot consistency <id>

ตัวอย่างเอาต์พุต:

PROPERTY          VALUE
CONSISTENCY TYPE filesystem
REASON vm_shutdown
VM STATE shutdown

เมื่อเครื่องเสมือนอยู่ในสถานะปิดเครื่อง การสร้างสแนปช็อตจะได้สแนปช็อตที่มีความสอดคล้องระดับระบบไฟล์ เมื่ออยู่ในสถานะทำงานโดยปกติจะได้เฉพาะสแนปช็อตที่มีความสอดคล้องระดับการขัดข้อง

VI. คอนโซลระยะไกล​

รับข้อมูลการเชื่อมต่อคอนโซล VNC ของเครื่องเสมือน ใช้สำหรับเปิดคอนโซลระยะไกลในเบราว์เซอร์

vms vm link <id> --json
  • เครื่องเสมือนต้องอยู่ในสถานะทำงานหรือหยุดชั่วคราว มิฉะนั้นจะส่งคืนข้อผิดพลาดความขัดแย้งของสถานะ

ตัวอย่างเอาต์พุต:

{
"url": "VMs/noVNC/vnc.html?autoconnect=true\u0026reconnect=true\u0026path=utils/websockify/?token=09fd98ee-4e2d-4c7a-a95c-8bacab80d322\u0026title=145",
"port": 8181,
"https": false
}
  • url คือพาธคอนโซลที่สัมพันธ์กับที่อยู่จัดการ NAS port คือพอร์ตบริการคอนโซล https ระบุว่าจำเป็นต้องเข้าถึงผ่าน HTTPS หรือไม่
  • ในเอาต์พุต JSON สัญลักษณ์ & ใน URL จะถูก escape เป็น \u0026

VII. การจัดการเครือข่ายเสมือน​

ประเภทเครือข่ายแบ่งเป็นสองแบบ:

ประเภทคำอธิบาย
เฉพาะ (private)เครือข่ายภายในที่ใช้สื่อสารระหว่างเครื่องเสมือนของเครื่องนี้เท่านั้น ไม่ผูกกับการ์ดเครือข่ายกายภาพ
ภายนอก (external)เครือข่ายที่ผูกกับการ์ดเครือข่ายกายภาพ เครื่องเสมือนสามารถสื่อสารกับภายนอกผ่านเครือข่ายนี้ได้

vms network list – แสดงรายการเครือข่ายเสมือน​

vms network list [--limit N] [--offset N] [--json]

ตัวอย่างเอาต์พุต:

NAME          NETWORK ID                            TYPE      VLAN ID  NUM GUESTS  NUM HOSTS  NUM INTERFACES  HOST NAME
VM-Network04 ce9807c9-47b3-4258-9a80-ea8db1fd785d external 0 0 1 1 A-eae4
VM-Network01 b364a1ec-f60c-4971-9ea2-f7a002f09fa3 external 0 2 1 1 A-eae4
  • NUM GUESTS คือจำนวนเครื่องเสมือนที่เชื่อมต่อกับเครือข่ายนี้ NUM INTERFACES คือจำนวนการ์ดเครือข่ายกายภาพที่เลือกไว้

vms network get – ดูรายละเอียดเครือข่ายเสมือน​

vms network get <network_id> --json

ตัวอย่างเอาต์พุต:

{
"metadata": {
"createdAt": "2026-05-15T16:46:08.415062294+08:00",
"updatedAt": "2026-05-15T16:46:08.415062415+08:00"
},
"network_id": "b364a1ec-f60c-4971-9ea2-f7a002f09fa3",
"name": "VM-Network01",
"host_id": "15341593-7f43-49f4-9523-6ac750a63a8a",
"host_name": "A-eae4",
"interfaces": {
"15341593-7f43-49f4-9523-6ac750a63a8a": {
"totalCount": 1,
"items": [
{
"checked": false,
"host_id": "15341593-7f43-49f4-9523-6ac750a63a8a",
"host_name": "A-eae4",
"interface_id": "/00000000-0000-0000-0000-6cbfb504eae5",
"interface_name": "LAN 2",
"ip": [
"192.168.2.121"
],
"mask": [
"ffffff00"
],
"speed_mbs": 1000,
"status": "connected",
"tx_kbps": 0,
"rx_kbps": 0
},
{
"checked": true,
"host_id": "15341593-7f43-49f4-9523-6ac750a63a8a",
"host_name": "A-eae4",
"interface_id": "/00000000-0000-0000-0000-6cbfb504eae4",
"interface_name": "LAN 1",
"ip": [
"10.18.8.95"
],
"mask": [
"ffffff00"
],
"speed_mbs": 1000,
"status": "connected",
"tx_kbps": 2.5458984375,
"rx_kbps": 11.45458984375
}
]
}
},
"num_guests": 0,
"num_hosts": 1,
"num_interfaces": 1,
"type": "external",
"vlan_id": 0
}
  • interfaces คือข้อมูลการ์ดเครือข่ายที่ผูกกับเครือข่ายนี้ จัดเรียงตาม ID โฮสต์ checked ระบุว่าการ์ดเครือข่ายนั้นถูกเลือกหรือไม่
  • metadata บันทึกเวลาสร้างและเวลาอัปเดตของเครือข่าย

vms network create – สร้างเครือข่ายเสมือน​

vms network create --body '{"name":"net1","type":"private","host_name":"TNAS"}' --json
vms network create --body '{"name":"net1","type":"external","vlan_id":100,"host_name":"TNAS","interface_name":"LAN 1"}' --json

สร้างเครือข่ายเฉพาะ:

  • เนื้อหาคำขอต้องมี name, type (private), host_name หรือ host_id เพื่อระบุว่าเครือข่ายถูกสร้างบนโฮสต์ใด
  • ก่อนสร้างสามารถดูโฮสต์ที่ใช้งานได้ผ่าน vms network list-interfaces private

สร้างเครือข่ายภายนอก:

  • เนื้อหาคำขอต้องมี name, type (external), vlan_id และระบุการ์ดเครือข่ายกายภาพอย่างน้อยหนึ่งการ์ด
  • สามารถระบุการ์ดเครือข่ายผ่าน interface_name (เช่น LAN 1) หรือ interface_id หากชื่อการ์ดเครือข่ายไม่ซ้ำกันระหว่างโฮสต์ ต้องใช้ร่วมกับ host_name
  • ก่อนสร้างสามารถดูการ์ดเครือข่ายที่ใช้งานได้ผ่าน vms network list-interfaces external

เอาต์พุตคือข้อมูลเครือข่ายหลังสร้าง โครงสร้างเหมือนกับ vms network get:

{
"metadata": {
"createdAt": "2026-09-17T16:57:32.064720576+08:00",
"updatedAt": "2026-09-17T16:57:32.064720634+08:00"
},
"network_id": "27047bd1-eeeb-4762-82ae-45094dea4854",
"name": "cli-demo-net",
"host_id": "15341593-7f43-49f4-9523-6ac750a63a8a",
"host_name": "A-eae4",
"interfaces": {
"15341593-7f43-49f4-9523-6ac750a63a8a": {
"totalCount": 1,
"items": [
{
"checked": true,
"host_id": "15341593-7f43-49f4-9523-6ac750a63a8a",
"host_name": "A-eae4",
"interface_id": "",
"interface_name": "PNdea4854",
"ip": null,
"mask": null,
"speed_mbs": 0,
"status": ""
}
]
}
},
"num_guests": 0,
"num_hosts": 1,
"num_interfaces": 1,
"type": "private",
"vlan_id": 0
}

เมื่อไม่ได้ระบุการ์ดเครือข่าย คำสั่งจะแสดงคำแนะนำ:

network create (type "external") requires selecting at least one interface; add "interface_name" (optionally scoped with "host_name") or "interface_id" to the body, e.g. {"name":"net1","type":"external","vlan_id":100,"host_name":"TNAS","interface_name":"LAN 1"}. Run "vms network list-interfaces external" to see available interfaces. Example available interface: LAN 2 on A-eae4 (host_id=15341593-7f43-49f4-9523-6ac750a63a8a, interface_id=/00000000-0000-0000-0000-6cbfb504eae5)

vms network update – อัปเดตเครือข่ายเสมือน​

ส่งเฉพาะฟิลด์ที่ต้องแก้ไข ฟิลด์ที่ไม่ได้ส่งจะคงค่าเดิมไว้

vms network update --body '{"network_id":"<network_id>","name":"renamed"}'
vms network update --body '{"network_id":"<network_id>","vlan_id":200}'
  • เนื้อหาคำขอต้องมี network_id
  • คำสั่งจะอ่านการกำหนดค่าเครือข่ายปัจจุบันก่อนและรวมฟิลด์ที่ส่งมา ชื่อเครือข่ายและการ์ดเครือข่ายที่เลือกจะไม่ถูกล้าง
  • เอาต์พุตคือข้อมูลเครือข่ายหลังอัปเดต

vms network delete – ลบเครือข่ายเสมือน (ความเสี่ยงสูง)​

vms network delete <network_id> [--yes]
  • เป็นการดำเนินการความเสี่ยงสูง: โหมดโต้ตอบจะถามยืนยัน โหมดไม่โต้ตอบต้องเพิ่ม --yes
  • การลบเครือข่ายจะตัดการเชื่อมต่อเครื่องเสมือนทั้งหมดที่เชื่อมต่อกับเครือข่ายนี้
  • แนะนำให้ยืนยันเครื่องเสมือนที่เชื่อมต่อผ่าน vms network list-vnics <network_id> ก่อน

ข้อความยืนยันในโหมดโต้ตอบ:

This action will delete network "b364a1ec-f60c-4971-9ea2-f7a002f09fa3". Do you want to continue? [y/N]: 
  • เอาต์พุต: Network deleted: <network_id>

vms network list-interfaces – แสดงรายการอินเทอร์เฟซเครือข่าย​

แสดงรายการอินเทอร์เฟซเครือข่ายตามประเภทที่ระบุ

vms network list-interfaces external [--limit N] [--offset N]
vms network list-interfaces private [--limit N] [--offset N]
  • external ส่งคืนการ์ดเครือข่ายกายภาพที่ใช้ได้บนโฮสต์
  • private ส่งคืนข้อมูลโฮสต์ที่ใช้สร้างเครือข่ายเฉพาะได้

ตัวอย่างเอาต์พุต (external):

INTERFACE NAME  INTERFACE ID                           HOST NAME  STATUS        IP              SPEED MBS
LAN 2 /00000000-0000-0000-0000-6cbfb504eae5 A-eae4 disconnected - -1
LAN 1 /00000000-0000-0000-0000-6cbfb504eae4 A-eae4 connected ["10.18.8.73"] 1000

ตัวอย่างเอาต์พุต (private):

INTERFACE NAME  INTERFACE ID  HOST NAME  STATUS  IP  SPEED MBS
- - A-eae4 - - 0

vms network list-vnics – แสดงรายการการ์ดเครือข่ายเสมือนบนเครือข่าย​

vms network list-vnics <network_id> [--limit N] [--offset N] [--json]

ตัวอย่างเอาต์พุต:

GUEST NAME  GUEST ID                              MAC ADDRESS        VIRTUAL INTERFACE ID                  NETWORK NAME  STATUS  PREFER SRIOV
win10 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1 1a:e2:ae:95:4a:51 fe972ef5-b066-4967-89fa-8e85e43c8808 VM-Network01 - false
win101 32ee5a74-de8b-47a9-959d-1725c881ceab 1a:f6:db:fb:3d:79 f93bf16c-01ca-4b60-b164-8a3083fb5f03 VM-Network01 - false

vms network ovsinfo – ดูสถานะ OVS​

ยืนยันว่าเปิดใช้งานสวิตช์เสมือน Open vSwitch หรือไม่

vms network ovsinfo [--json]

ตัวอย่างเอาต์พุต:

PROPERTY  VALUE
RESULT true

VALUE เป็น true หมายถึงเปิดใช้งาน OVS แล้ว

VIII. การจัดการอิมเมจ​

vms image list – แสดงรายการอิมเมจ​

แสดงรายการไฟล์อิมเมจระบบที่ใช้สร้างเครื่องเสมือนได้

vms image list --json
  • image_name คือชื่ออิมเมจ file_name คือชื่อไฟล์ที่สอดคล้องกัน
  • type คือรูปแบบอิมเมจ เช่น iso, qcow2
  • status คือสถานะอิมเมจ available หมายถึงใช้งานได้
  • repos คือพื้นที่จัดเก็บที่อิมเมจนี้อยู่
  • progress คือความคืบหน้าของงานประมวลผลอิมเมจ 0 หมายถึงไม่มีงานที่กำลังดำเนินการ

ตัวอย่างเอาต์พุต:

{
"totalCount": 4,
"items": [
{
"image_name": "cn_windows_10_consumer_editions_version_1909_updated_jan_2020_x86_dvd_9c50652f",
"image_id": "c93083a5-2b39-4f32-b19f-1ad97c6b4de4",
"file_name": "cn_windows_10_consumer_editions_version_1909_updated_jan_2020_x86_dvd_9c50652f.iso",
"type": "iso",
"file_size": 3884539904,
"status": "available",
"status_code": 0,
"status_reason": "",
"create_time": 1778835784,
"repos": [
{
"repo_name": "VM-Storage01",
"repo_id": "735ef7f7-5d8d-4102-9377-8a7b8c33cda6"
}
],
"progress": 0,
"task_id": 0,
"virtual_size": 0
},
{
"image_name": "cn_windows_11_consumer_editions_version_21h2_updated_july_2022_x64_dvd_50ad4acf",
"image_id": "cb9d929a-d673-4e46-ac86-9488bbef19b9",
"file_name": "cn_windows_11_consumer_editions_version_21h2_updated_july_2022_x64_dvd_50ad4acf.iso",
"type": "iso",
"file_size": 5858816000,
"status": "available",
"status_code": 0,
"status_reason": "",
"create_time": 1778835784,
"repos": [
{
"repo_name": "VM-Storage01",
"repo_id": "735ef7f7-5d8d-4102-9377-8a7b8c33cda6"
}
],
"progress": 0,
"task_id": 0,
"virtual_size": 0
},
{
"image_name": "virtio-win-0.1.285pro",
"image_id": "9b3f2fdd-9173-4611-a84c-0cc9ce88293c",
"file_name": "virtio-win-0.1.285.iso",
"type": "iso",
"file_size": 789645312,
"status": "available",
"status_code": 0,
"status_reason": "",
"create_time": 1778836128,
"repos": [
{
"repo_name": "VM-Storage01",
"repo_id": "735ef7f7-5d8d-4102-9377-8a7b8c33cda6"
}
],
"progress": 0,
"task_id": 0,
"virtual_size": 0
},
{
"image_name": "haos_ova-18.2",
"image_id": "efd6da18-9475-44cf-8fb0-e2513421e68a",
"file_name": "haos_ova-18.2.qcow2",
"type": "qcow2",
"file_size": 1091698688,
"status": "available",
"status_code": 0,
"status_reason": "",
"create_time": 1787191833,
"repos": [
{
"repo_name": "VM-Storage02",
"repo_id": "517571ba-f7f7-49e1-9a62-7eb6ddfd9c78"
}
],
"progress": 0,
"task_id": 0,
"virtual_size": 0
}
]
}

vms image edit – แก้ไขอิมเมจ​

แก้ไขชื่ออิมเมจ หรือปรับพื้นที่จัดเก็บที่อิมเมจอยู่

vms image edit --body '{"image_id":"<image_id>","repos":["<repo_id>"]}'
vms image edit --body '{"image_id":"<image_id>","repos":["<repo_id_1>","<repo_id_2>"],"image_name":"renamed.iso"}'
  • เนื้อหาคำขอต้องมี image_id และ repos โดย repos เป็นรายการพื้นที่จัดเก็บเป้าหมายทั้งหมดของอิมเมจนี้ ต้องไม่ว่างเปล่า
  • image_name, file_name, type, file_size เป็นฟิลด์ตัวเลือกเสริม หากไม่ระบุจะใช้ค่าเดิม
  • หาก repos ว่างเปล่าจะทำให้อิมเมจถูกย้ายออกจากทุกพื้นที่จัดเก็บ คำสั่งจะปฏิเสธคำขอนี้ก่อนดำเนินการ
  • เอาต์พุต: Image updated

vms image delete – ลบอิมเมจ (ความเสี่ยงสูง)​

vms image delete --image-id <image_id> [--yes]
  • --image-id เป็นรายการบังคับ
  • เป็นการดำเนินการความเสี่ยงสูง: โหมดโต้ตอบจะถามยืนยัน โหมดไม่โต้ตอบต้องเพิ่ม --yes
  • การลบอิมเมจไม่กระทบเครื่องเสมือนที่สร้างไว้แล้ว แต่จะกระทบการสร้างเครื่องเสมือนจากอิมเมจนี้ในภายหลัง
  • แนะนำให้ยืนยันการใช้งานผ่าน vms image list-vms --image-id <image_id> ก่อน

ข้อความยืนยันในโหมดโต้ตอบ:

This action will permanently delete image "efd6da18-9475-44cf-8fb0-e2513421e68a". Do you want to continue? [y/N]: 
  • เอาต์พุต: Image deleted: <image_id>

vms image list-vms – ดูเครื่องเสมือนที่ใช้อิมเมจนี้​

vms image list-vms --image-id <image_id> [--json]

ตัวอย่างเอาต์พุต:

GUEST NAME
1454486

ก่อนลบอิมเมจสามารถรันคำสั่งนี้เพื่อยืนยันขอบเขตผลกระทบ หากไม่มีเครื่องเสมือนใดใช้อิมเมจนี้ เอาต์พุตจะว่างเปล่า

IX. การจัดการพื้นที่จัดเก็บ​

vms repo list – แสดงรายการพื้นที่จัดเก็บ​

vms repo list [--json]

ตัวอย่างเอาต์พุต:

NAME          REPO ID                               STATUS  USED          PERCENT USED        TOTAL SIZE     FILE SYSTEM  HOST NAME
VM-Storage01 735ef7f7-5d8d-4102-9377-8a7b8c33cda6 - 155583651840 14.150249481201172 1097552691200 btrfs -
VM-Storage02 517571ba-f7f7-49e1-9a62-7eb6ddfd9c78 normal 89361494016 16.64487648010254 535146790912 btrfs A-eae4

vms repo get – ดูรายละเอียดพื้นที่จัดเก็บ​

vms repo get <repo_id> [--json]

ตัวอย่างเอาต์พุต:

PROPERTY              VALUE
ENABLE LOWER NOTIFY false
FILE SYSTEM btrfs
HARD LIMIT 2
HOST ID 15341593-7f43-49f4-9523-6ac750a63a8a
HOST NAME A-eae4
LAST NOTIFY TRESHOLD -
LOCATION VOLUME /Volume2
NAME VM-Storage02
REPO ID 517571ba-f7f7-49e1-9a62-7eb6ddfd9c78
SOFT LIMIT 10
STATUS normal
TOTAL SIZE 534760128512
  • LOCATION VOLUME คือโวลุ่มที่พื้นที่จัดเก็บอยู่
  • SOFT LIMIT, HARD LIMIT คือเกณฑ์แจ้งเตือนความจุ (เปอร์เซ็นต์)
  • ENABLE LOWER NOTIFY คือการเปิดใช้งานการแจ้งเตือนความจุไม่เพียงพอหรือไม่

vms repo update – อัปเดตพื้นที่จัดเก็บ​

ส่งเฉพาะฟิลด์ที่ต้องแก้ไข ฟิลด์ที่ไม่ได้ส่งจะคงค่าเดิมไว้

vms repo update --body '{"repo_id":"<repo_id>","name":"new-name"}'
vms repo update --body '{"repoId":"<repo_id>","enable_lower_notify":true}'
  • ID พื้นที่จัดเก็บสามารถส่งผ่าน repo_id หรือ repoId
  • คำสั่งจะอ่านการกำหนดค่าปัจจุบันก่อนและรวมฟิลด์ที่ส่งมา การตั้งค่าอื่นจะไม่สูญหาย
  • เอาต์พุตคือข้อมูลพื้นที่จัดเก็บหลังอัปเดต

vms repo delete – ลบพื้นที่จัดเก็บ (ความเสี่ยงสูง)​

vms repo delete <repo_id> <true|false> [--yes]
  • พารามิเตอร์ตัวที่สองคือ need_save_data: true หมายถึงเก็บไฟล์ข้อมูลบนดิสก์ไว้ false หมายถึงลบพร้อมกับข้อมูล
  • เป็นการดำเนินการความเสี่ยงสูง: โหมดโต้ตอบจะถามยืนยัน โหมดไม่โต้ตอบต้องเพิ่ม --yes
  • การลบพื้นที่จัดเก็บจะลบเครื่องเสมือนและอิมเมจภายในด้วย แนะนำให้รัน vms repo check-running และ vms repo whether-exist-data เพื่อยืนยันขอบเขตผลกระทบก่อน

ข้อความยืนยันในโหมดโต้ตอบ:

This action will delete repository "735ef7f7-5d8d-4102-9377-8a7b8c33cda6" (save data: true). Do you want to continue? [y/N]: 
  • เอาต์พุต: Repository deleted: <repo_id>

vms repo list-volumes – แสดงรายการโวลุ่มที่ใช้งานได้​

แสดงรายการโวลุ่มที่ใช้สร้างพื้นที่จัดเก็บได้

vms repo list-volumes [--json]

ตัวอย่างเอาต์พุต:

NAME  UUID                                  DEVICE               FILESYSTEM  STATUS  VOLUME TYPE  TOTAL                            USED                           AVAILABLE                        USAGE
lv3 00000004-2608-1311-3025-6cbfb504eae4 /dev/mapper/vg0-lv3 ext4 - - {"unit":"KB","value":102626232} {"unit":"KB","value":52} {"unit":"KB","value":101561220} 0.000051200619070623694
lv2 00000003-2606-2215-3256-6cbfb504eae4 /dev/mapper/vg0-lv2 btrfs - - {"unit":"KB","value":104857600} {"unit":"KB","value":9715824} {"unit":"KB","value":93096464} 9.450061066630479

vms repo list-vms – แสดงรายการเครื่องเสมือนภายในพื้นที่จัดเก็บ​

vms repo list-vms --body '{"repo_id":"<repo_id>"}'
  • ID พื้นที่จัดเก็บสามารถส่งผ่าน repo_id หรือ repoId
  • คำสั่งจะดึงออบเจกต์พื้นที่จัดเก็บก่อนแล้วจึงสืบค้นเครื่องเสมือนของออบเจกต์นั้น ผลลัพธ์จึงเชื่อถือได้มากกว่า

vms repo check-running – ตรวจสอบเครื่องเสมือนที่กำลังทำงานบนพื้นที่จัดเก็บ​

vms repo check-running <repo_id> [--json]

รันก่อนลบพื้นที่จัดเก็บ เพื่อยืนยันว่าไม่มีเครื่องเสมือนกำลังทำงาน หากไม่มีเครื่องเสมือนที่ทำงานอยู่ เอาต์พุตจะว่างเปล่า

vms repo whether-exist-data – ตรวจสอบว่ามีข้อมูลภายในพื้นที่จัดเก็บหรือไม่​

vms repo whether-exist-data --body '{"repo_id":"<repo_id>"}'

รันก่อนลบพื้นที่จัดเก็บ เพื่อยืนยันว่าภายในพื้นที่จัดเก็บยังมีข้อมูลหรือไม่ เหมือนกับการตรวจสอบล่วงหน้าก่อนลบพื้นที่จัดเก็บในอินเทอร์เฟซเว็บ

X. การตั้งค่าส่วนกลาง​

vms setting get – ดูการตั้งค่าส่วนกลาง​

ดูการกำหนดค่าส่วนกลางของแอปพลิเคชัน VMs

vms setting get [--json]

ตัวอย่างเอาต์พุต:

PROPERTY                VALUE
HOST SHUTDOWN BEHAVIOR 1
KB LAYOUT en-us
SHOW VIRTIO BLK VDISK false
  • HOST SHUTDOWN BEHAVIOR คือวิธีจัดการเครื่องเสมือนเมื่อโฮสต์ปิดเครื่อง
  • KB LAYOUT คือรูปแบบแป้นพิมพ์ของเครื่องเสมือน

XI. การสืบค้นข้อมูลการตรวจสอบ​

vms collectd hostinfo – ดูข้อมูลการตรวจสอบโฮสต์​

vms collectd hostinfo [--limit N] [--offset N] [--json]

ตัวอย่างเอาต์พุต:

NAME    ID  STATUS   TYPE     CPU USAGE  RAM USAGE  DESC
A-eae4 - running healthy 2.53 15.66 Info

vms collectd vminfo – ดูข้อมูลการตรวจสอบเครื่องเสมือน​

vms collectd vminfo [--limit N] [--offset N] [--json]

ตัวอย่างเอาต์พุต:

NAME     ID                                    STATUS    TYPE     CPU USAGE  RAM USAGE  DESC
145 09fd98ee-4e2d-4c7a-a95c-8bacab80d322 shutdown healthy 0 0 info
win10 9c7078ab-a1e7-4bc0-819f-6ac83e24cfc1 shutdown healthy 0 0 info
win101 32ee5a74-de8b-47a9-959d-1725c881ceab shutdown healthy 0 0 info

vms collectd storageinfo – ดูข้อมูลการตรวจสอบพื้นที่จัดเก็บ​

vms collectd storageinfo [--limit N] [--offset N] [--json]

ตัวอย่างเอาต์พุต:

NAME          ID                                    HOST NAME  STATUS  TYPE     SIZE           USED          PERCENT USED        PERCENT FREE
VM-Storage01 735ef7f7-5d8d-4102-9377-8a7b8c33cda6 A-eae4 none healthy 1097552691200 155583651840 14.328414916992188 85.67158508300781
VM-Storage02 517571ba-f7f7-49e1-9a62-7eb6ddfd9c78 A-eae4 none healthy 535146790912 89361494016 16.966018676757812 83.03398132324219

โหมดโต้ตอบและโหมดไม่โต้ตอบ​

CLI จะตัดสินว่าปัจจุบันทำงานในสภาพแวดล้อมเทอร์มินัลหรือไม่ และมีพฤติกรรมที่แตกต่างกัน:

โหมดโต้ตอบ (สภาพแวดล้อมเทอร์มินัล)​

  • การดำเนินการที่เป็นอันตรายจะแสดงข้อความยืนยัน ตัวเลือกเริ่มต้นคือ No
  • ป้อน y หรือ Y เพื่อดำเนินการต่อ ป้อน n หรือกด Enter โดยตรงเพื่อยกเลิก
  • เมื่อยกเลิกการดำเนินการจะแสดง Operation cancelled รหัสออกคือ 99

โหมดไม่โต้ตอบ (สคริปต์/อัตโนมัติ)​

  • การดำเนินการที่เป็นอันตรายต้องใช้ --yes เพื่อข้ามการยืนยัน มิฉะนั้นคำสั่งจะแจ้งข้อผิดพลาดทันทีและส่งคืนรหัสออก 1
  • เมื่อไม่มีสภาพแวดล้อมเทอร์มินัลจะไม่รอการป้อนข้อมูล เหมาะสำหรับการเรียกจากสคริปต์และงานตามกำหนดเวลา
  • แนะนำให้จัดการรหัสออกอย่างชัดเจนในสคริปต์ เพื่อแยกความสำเร็จ ความล้มเหลว และความขัดแย้งของสถานะ

รูปแบบเอาต์พุต JSON​

คำสั่งประเภทสืบค้นรองรับพารามิเตอร์ --json แสดงข้อมูล JSON ที่เป็นมาตรฐาน สะดวกสำหรับการแยกวิเคราะห์ด้วยโปรแกรม

ข้อตกลงรูปแบบ:

  • ชื่อฟิลด์ใช้ snake_case
  • ค่าบูลีนเป็น true/false
  • เวลาใช้รูปแบบ ISO 8601 รวมความละเอียดระดับนาโนวินาทีและออฟเซต UTC+8 (เช่น 2026-09-02T11:43:51.176535374+08:00)
  • JSON แสดงออกไปยัง stdout ข้อความข้อผิดพลาดแสดงออกไปยัง stderr
  • ฟิลด์ยาวที่ถูกตัดในเอาต์พุตแบบตาราง จะเป็นค่าเต็มในเอาต์พุต JSON

ตัวอย่าง:

vms setting get --json
{
"host_shutdown_behavior": 1,
"kb_layout": "en-us",
"show_virtio_blk_vdisk": false
}

โครงสร้าง JSON ของคำสั่งต่างๆ แตกต่างกันเล็กน้อย: vms vm list, vms vm snapshot list, vms vm logs แสดงอาร์เรย์โดยตรง คำสั่งประเภทอื่นแสดงออบเจกต์ที่มี totalCount และฟิลด์ข้อมูล โดยชื่อฟิลด์ข้อมูลขึ้นอยู่กับทรัพยากร (เช่น items, hosts, vms, storage) ตัวอย่าง vms repo list --json:

{
"totalCount": 2,
"items": {
"517571ba-f7f7-49e1-9a62-7eb6ddfd9c78": {
"name": "VM-Storage02",
"repo_id": "517571ba-f7f7-49e1-9a62-7eb6ddfd9c78",
"status": "normal",
"used": 89361494016,
"percent_used": 16.64487648010254,
"location_volume": "/Volume2",
"total_size": 535146790912,
"hard_limit": 2,
"soft_limit": 10,
"enable_lower_notify": false,
"file_system": "btrfs"
}
}
}

เอาต์พุต JSON ของบางคำสั่งเป็นค่าธรรมดา เช่น vms network ovsinfo --json แสดง true, vms vm pause --json แสดง null

คำอธิบายรหัสออก​

รหัสออกความหมายสถานการณ์ทั่วไป
0สำเร็จคำสั่งทำงานเสร็จสมบูรณ์
1พารามิเตอร์ผิดพลาดขาดพารามิเตอร์บังคับ รูปแบบพารามิเตอร์ผิดพลาด ไม่ได้ใส่ --yes
3ไม่พบทรัพยากรการตรวจสอบเบื้องต้นของคำสั่งไม่ผ่าน เช่น อิมเมจที่ระบุไม่มีอยู่
4ความขัดแย้งของสถานะสถานะปัจจุบันของเครื่องเสมือนไม่อนุญาตการดำเนินการนี้ (เช่น สั่งปิดเครื่องกับเครื่องเสมือนที่ปิดไปแล้ว)
6ข้อผิดพลาดการเชื่อมต่อไม่สามารถเชื่อมต่อกับบริการ VMs หรือพาธ socket ไม่ถูกต้อง
7หมดเวลาคำขอหมดเวลา สามารถปรับได้ผ่าน --timeout
9ข้อผิดพลาดการดำเนินการฝั่งเซิร์ฟเวอร์ส่งคืนข้อผิดพลาด (ข้อความข้อผิดพลาดมี code_num และคำอธิบายข้อผิดพลาด)
99ผู้ใช้ยกเลิกเลือก No ในการยืนยันแบบโต้ตอบ หรือกด Enter โดยตรง

ตัวอย่าง:

# 退出码 1(参数错误)
vms vm poweroff <id>
# Confirmation required. Re-run with --yes to continue.

# 退出码 4(状态冲突)
vms vm pause <id>
# cannot pause a virtual machine: VM must be running (current status: shutdown)

# 退出码 9(执行错误)
vms vm get <id>
# vm check configure error: vdisk check - vm not exist: key not found (code_num=2001, vm check configure error)

# 退出码 6(连接错误)
vms vm list --socket /tmp/nope.sock
# failed to connect to VMs daemon (socket /tmp/nope.sock): dial unix /tmp/nope.sock: connect: no such file or directory

ตัวอย่างสถานการณ์การใช้งาน​

การปฏิบัติงานประจำวัน​

# 查看所有虚拟机状态
vms vm list

# 查看某台虚拟机的配置与运行状态
vms vm get <id>

# 查看虚拟机的操作日志
vms vm logs <id> --limit 20

# 开机、关机与重启
vms vm poweron <id>
vms vm poweroff <id> --yes
vms vm reboot <id>

การดำเนินการแบบกลุ่มด้วยสคริปต์​

# 批量启动所有已关机的虚拟机
vms vm list --json | jq -r '.[] | select(.status == "shutdown") | .guest_id' | while read -r id; do
vms vm poweron "$id"
done

# 批量关闭所有运行中的虚拟机
vms vm list --json | jq -r '.[] | select(.status == "running") | .guest_id' | while read -r id; do
vms vm poweroff "$id" --yes
done

# 存储空间容量检查,超过 80% 时输出告警
vms collectd storageinfo --json | jq -r '.storage[] | select(.percent_used > 80) | .name'

การสำรองข้อมูลและการตรวจสอบ​

# 关机后为虚拟机创建快照
vms vm poweroff <id> --yes
vms vm snapshot consistency <id>
vms vm snapshot create <id> --body '{"description":"weekly-backup"}'

# 查看快照列表与详情
vms vm snapshot list <id>
vms vm snapshot config <id> <snapshot_name>

# 导出虚拟机为 OVA 文件,用于异地备份
vms vm export --body '{"guest_id":"<id>","target_ova_path":"/Volume1/backup/my-vm.ova"}'

การตรวจสอบก่อนลบ​

# 删除存储空间前,先确认是否有虚拟机正在运行、是否存在数据
vms repo check-running <repo_id>
vms repo whether-exist-data --body '{"repo_id":"<repo_id>"}'

# 删除映像前,先确认有哪些虚拟机在使用
vms image list-vms --image-id <image_id>

# 删除网络前,先确认接入的虚拟机
vms network list-vnics <network_id>

การเรียกใช้ด้วยเครื่องมือ AI​

# AI 工具可通过命令行调用 vms 命令
# 例如:获取虚拟机与宿主机状态供 AI 分析
vms vm list --json
vms collectd hostinfo --json

# AI 可解析 JSON 输出并作出决策
vms vm list-resource --json

การพัฒนาภายในและการผสานรวมระบบ​

# 开发人员可通过 CLI 封装内部运维工具
# 示例:封装虚拟机健康检查函数
check_vm_health() {
vms collectd vminfo --json | jq -r '.vms[] | select(.status != "running") | .name'
}

# 将 CLI 集成到内部监控平台
vms collectd storageinfo --json | curl -X POST https://monitor.example.com/api/report -d @-

คำถามที่พบบ่อย​

Q: CLI ต้องติดตั้งเพิ่มเติมหรือไม่?

ไม่ต้อง CLI ติดตั้งพร้อมกับแอปพลิเคชัน VMs หลังจากเปิดใช้งานแอปพลิเคชันแล้วสามารถรันคำสั่ง vms ได้โดยตรง

Q: CLI ต้องใช้ผ่าน SSH เท่านั้นหรือไม่?

ไม่ใช่ CLI สามารถเรียกใช้ได้จากเทอร์มินัลบรรทัดคำสั่งใดๆ รวมถึงเทอร์มินัลในเครื่อง, SSH ระยะไกล, สคริปต์, เครื่องมือ AI เป็นต้น

Q: CLI สามารถจัดการเครื่องเสมือนบนอุปกรณ์อื่นได้หรือไม่?

ไม่ได้ CLI สื่อสารกับบริการ VMs ผ่าน unix socket ของเครื่องนี้ ใช้สำหรับจัดการเครื่องเสมือนของเครื่องนี้เท่านั้น

Q: ทำไมบางคำสั่งมีการแจ้งยืนยัน บางคำสั่งไม่มี?

การดำเนินการเช่น ลบเครื่องเสมือน ลบเครือข่าย ลบอิมเมจ ลบพื้นที่จัดเก็บ และปิดเครื่อง (poweroff, force-poweroff) จะกระทบข้อมูลหรือบริการ จึงต้องยืนยันตามค่าเริ่มต้น ส่วนคำสั่งเริ่ม รีสตาร์ท หยุดชั่วคราว กลับมาใช้งาน และประเภทสืบค้นไม่มีข้อจำกัดเหล่านี้

Q: ในโหมดไม่โต้ตอบจะยืนยันการดำเนินการที่เป็นอันตรายอย่างไร?

การดำเนินการที่เป็นอันตรายทั้งหมดต้องเพิ่มพารามิเตอร์ --yes มิฉะนั้นคำสั่งจะแจ้งข้อผิดพลาดและออก (รหัสออก 1)

Q: ในสคริปต์จะตัดสินว่าคำสั่งดำเนินการสำเร็จหรือไม่อย่างไร?

ตัดสินจากรหัสออก: 0 หมายถึงสำเร็จ ค่าที่ไม่ใช่ 0 หมายถึงล้มเหลว หรือจะแยกวิเคราะห์เนื้อหาเอาต์พุตของ --json ก็ได้

Q: ทำไมรายการที่ --json แสดงจึงเป็นออบเจกต์?

เอาต์พุต JSON ของบางคำสั่งจัดเรียงเป็นออบเจกต์ตาม ID และแนบฟิลด์ totalCount มาด้วย สะดวกในการเรียกใช้ตาม ID โดยตรง

ความช่วยเหลือเพิ่มเติม​

ทุกคำสั่งรองรับ --help เพื่อดูวิธีใช้งานอย่างละเอียด:

vms --help
vms vm --help
vms vm poweroff --help
vms network create --help