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 vm | list | แสดงรายการเครื่องเสมือนทั้งหมด | ไม่ | ไม่ |
| vms vm | get | ดูรายละเอียดเครื่องเสมือนที่ระบุ | ไม่ | ไม่ |
| vms vm | list-resource | แสดงรายการทรัพยากรที่ใช้สร้างเครื่องเสมือนได้ | ไม่ | ไม่ |
| vms vm | logs | ดูบันทึกการดำเนินการของเครื่องเสมือน | ไม่ | ไม่ |
| vms vm | poweron | เปิดเครื่องเสมือน | ไม่ | ไม่ |
| vms vm | poweroff | ปิดเครื่องเสมือน (ปิดเครื่องตามปกติ) | ใช่ | ไม่ |
| vms vm | force-poweroff | บังคับปิดเครื่องเสมือน | ใช่ | ✅ |
| vms vm | reboot | รีสตาร์ทเครื่องเสมือน | ไม่ | ไม่ |
| vms vm | pause | หยุดเครื่องเสมือนชั่วคราว | ไม่ | ไม่ |
| vms vm | resume | กลับมาใช้งานเครื่องเสมือนที่หยุดชั่วคราว | ไม่ | ไม่ |
| vms vm | autorun | ตั้งค่าเปิดเครื่องอัตโนมัติ | ไม่ | ไม่ |
| vms vm | clone | โคลนเครื่องเสมือน | ไม่ | ไม่ |
| vms vm | export | ส่งออกเครื่องเสมือนเป็นไฟล์ OVA | ไม่ | ไม่ |
| vms vm | delete | ลบเครื่องเสมือน | ใช่ | ✅ |
| vms vm disk | list | ดูฮาร์ดดิสก์เสมือนของเครื่องเสมือน | ไม่ | ไม่ |
| vms vm snapshot | list | แสดงรายการสแนปช็อตของเครื่องเสมือน | ไม่ | ไม่ |
| vms vm snapshot | create | สร้างสแนปช็อต | ไม่ | ไม่ |
| vms vm snapshot | edit | แก้ไขคำอธิบายและสถานะการล็อกของสแนปช็อต | ไม่ | ไม่ |
| vms vm snapshot | config | ดูการกำหนดค่าเครื่องเสมือนที่บันทึกไว้ในสแนปช็อต | ไม่ | ไม่ |
| vms vm snapshot | consistency | ดูตัวอย่างความสอดคล้องของสแนปช็อต | ไม่ | ไม่ |
| vms vm | link | รับข้อมูลการเชื่อมต่อคอนโซล VNC | ไม่ | ไม่ |
| vms network | list | แสดงรายการเครือข่ายเสมือน | ไม่ | ไม่ |
| vms network | get | ดูรายละเอียดเครือข่ายเสมือน | ไม่ | ไม่ |
| vms network | create | สร้างเครือข่ายเสมือน | ไม่ | ไม่ |
| vms network | update | อัปเดตเครือข่ายเสมือน | ไม่ | ไม่ |
| vms network | delete | ลบเครือข่ายเสมือน | ใช่ | ✅ |
| vms network | list-interfaces | แสดงรายการอินเทอร์เฟซเครือข่ายตามประเภทที่ระบุ | ไม่ | ไม่ |
| vms network | list-vnics | แสดงรายการการ์ดเครือข่ายเสมือนบนเครือข่าย | ไม่ | ไม่ |
| vms network | ovsinfo | ดูว่าเปิดใช้งาน OVS หรือไม่ | ไม่ | ไม่ |
| vms image | list | แสดงรายการอิมเมจ | ไม่ | ไม่ |
| vms image | edit | แก้ไขข้อมูลอิมเมจ | ไม่ | ไม่ |
| vms image | delete | ลบอิมเมจ | ใช่ | ✅ |
| vms image | list-vms | ดูเครื่องเสมือนที่ใช้อิมเมจนี้ | ไม่ | ไม่ |
| vms repo | list | แสดงรายการพื้นที่จัดเก็บ | ไม่ | ไม่ |
| vms repo | get | ดูรายละเอียดพื้นที่จัดเก็บ | ไม่ | ไม่ |
| vms repo | update | อัปเดตการกำหนดค่าพื้นที่จัดเก็บ | ไม่ | ไม่ |
| vms repo | delete | ลบพื้นที่จัดเก็บ | ใช่ | ✅ |
| vms repo | list-volumes | แสดงรายการโวลุ่มที่ใช้งานได้ | ไม่ | ไม่ |
| vms repo | list-vms | แสดงรายการเครื่องเสมือนภายในพื้นที่จัดเก็บ | ไม่ | ไม่ |
| vms repo | check-running | ตรวจสอบเครื่องเสมือนที่กำลังทำงานบนพื้นที่จัดเก็บ | ไม่ | ไม่ |
| vms repo | whether-exist-data | ตรวจสอบว่ามีข้อมูลภายในพื้นที่จัดเก็บหรือไม่ | ไม่ | ไม่ |
| vms setting | get | ดูการตั้งค่าส่วนกลาง | ไม่ | ไม่ |
| vms collectd | hostinfo | ดูข้อมูลการตรวจสอบโฮสต์ | ไม่ | ไม่ |
| vms collectd | vminfo | ดูข้อมูลการตรวจสอบเครื่องเสมือน | ไม่ | ไม่ |
| vms collectd | storageinfo | ดูข้อมูลการตรวจสอบพื้นที่จัดเก็บ | ไม่ | ไม่ |
ข้อมูลอ้างอิงคำสั่ง
<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. คอนโซลระยะไกล
vms vm link – รับข้อมูลการเชื่อมต่อ VNC
รับข้อมูลการเชื่อมต่อคอนโซล 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คือพาธคอนโซลที่สัมพันธ์กับที่อยู่จัดการ NASportคือพอร์ตบริการคอนโซล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,qcow2statusคือสถานะอิมเมจ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