大家好,又见面了,我是你们的朋友全栈君。
1.virsh查看/管理虚拟机 问题 本案例要求熟悉KVM虚拟化的virsh管理工具的的基本使用,从命令行来操作虚拟机,完成以下基本任务: 1)查看KVM服务器信息 2)列出有哪些虚拟机、指定虚拟机的状态 3)基本的开关机操作 4)将虚拟机设置为自动运行 方案 virsh命令行管理的常见用法: 1)virsh:直接进交互模式 2)virsh nodeinfo:查看KVM节点(服务器)信息 3)virsh list:列出正在运行的虚拟机 4)virsh list –all:列出所有虚拟机(包括未启动的) 5)virsh dominfo 虚拟机名称:查看指定虚拟机的信息 6)virsh start 虚拟机名称:将指定的虚拟机开机 7)virsh reboot 虚拟机名称:将指定的虚拟机重启 8)virsh shutdown 虚拟机名称:将指定的虚拟机正常关机 9)virsh destroy 虚拟机名称:将指定的虚拟机强制关机(相当于拔电源) 10)virsh autostart 虚拟机名称:将指定的虚拟机设置随KVM自动开机 11)virsh autostart –disable 虚拟机名称:禁止自动开机 步骤 实现此案例需要按照如下步骤进行。 步骤一:直接使用virsh交互模式 执行不带任何参数的virsh命令,即可进入交互模式。在virsh交互模式下,可以快速、连续地执行多条虚拟机管理指令,不用每次都指定virsh,最后再exit退出;这种方式与在Shell命令行执行virsh时后面跟上虚拟机管理指令的作用是等效的。 [root@kvmsvr ~]# virsh //进入virsh交互模式 欢迎使用 virsh,虚拟化的交互式终端。
输入:‘help’ 来获得命令的帮助信息 ‘quit’ 退出
virsh # list //查看所有开机的虚拟机 Id 名称 状态
3 rh6_n1 running
virsh # exit //退出 步骤二:查看虚拟机信息 1)查看KVM节点(服务器)信息 [root@kvmsvr ~]# virsh dominfo 错误:命令 ‘dominfo’ 需要 选项 [root@kvmsvr ~]# virsh nodeinfo CPU 型号: x86_64 CPU: 2 CPU 频率: 2594 MHz CPU socket: 1 每个 socket 的内核数: 2 每个内核的线程数: 1 NUMA 单元: 1 内存大小: 4048888 KiB 2)列出正在运行的虚拟机 [root@kvmsvr ~]# virsh list Id 名称 状态
3 rh6_n1 running 3)列出所有虚拟机(包括未启动的) [root@kvmsvr ~]# virsh list –all Id 名称 状态
3 rh6_n1 running
代码语言:javascript复制testpc 关闭
4)查看指定虚拟机的信息 [root@kvmsvr ~]# virsh dominfo rh6_n1 Id: 3 名称: rh6_n1 UUID: 0bd7cdcc-2579-9d5c-0513-700a36ba1b9c OS 类型: hvm 状态: running CPU: 1 CPU 时间: 240.9s 最大内存: 1048576 KiB 使用的内存: 1048576 KiB Persistent: yes 自动启动: 禁用 Managed save: no 安全性模式: none 安全性 DOI: 0 步骤三:基本的开关机操作 1)将虚拟机rh6_n1正常关机 若指定的虚拟机已经在运行,可以通过virsh发送shutdown指令来关机: [root@kvmsvr ~]# virsh shutdown rh6_n1 //关闭虚拟机rh6_n1 域 rh6_n1 被关闭 [root@kvmsvr ~]# virsh list –all //确认关闭结果(需等待至关机完成) Id 名称 状态
代码语言:javascript复制rh6_n1 关闭
代码语言:javascript复制testpc 关闭
2)将虚拟机rh6_n1开机 针对处于关闭状态的虚拟机,可以通过virsh发送start指令来开机: [root@kvmsvr ~]# virsh start rh6_n1 //开启虚拟机rh6_n1 域 rh6_n1 已开始 [root@kvmsvr ~]# virsh list –all //确认开机结果 Id 名称 状态
4 rh6_n1 running
代码语言:javascript复制testpc 关闭
3)将虚拟机rh6_n1重启 针对启动完毕的正常虚拟机,可以通过virsh发送reboot指令来重启(虚拟机当前的操作系统及状态必须能够响应此请求): [root@kvmsvr ~]# virsh reboot rh6_n1 域 rh6_n1 正在被重新启动 在重启指定虚拟机的时候,若要确认结果,可以通过virt-manager管理器来双击指定的虚拟机以观察重启响应过程,如图-1所示。
4)将虚拟机rh6_n1强制关机(相当于拔电源) 当正常关机或重启无法响应时,或者没有必要等待(比如重做系统)正常关机时,可以通过virsh发送destroy指令来强制关闭正在运行的虚拟机: [root@kvmsvr ~]# virsh list –all //查看当前的虚拟机状态 Id 名称 状态
5 rh6_n1 running
代码语言:javascript复制testpc 关闭
[root@kvmsvr ~]# virsh destroy rh6_n1 //强制关闭rh6_n1虚拟机 域 rh6_n1 被删除
[root@kvmsvr ~]# virsh list –all //确认关闭结果 Id 名称 状态
代码语言:javascript复制rh6_n1 关闭
代码语言:javascript复制testpc 关闭
5)虚拟机rh6_n1的自动开机设置 一台KVM虚拟机的“自动启动”状态,决定了当KVM服务器启动的时候,这台虚拟机是否也随之一起开机。启用此功能的virsh指令为autostart: [root@kvmsvr ~]# virsh dominfo rh6_n1 //查看默认的状态 Id: – 名称: rh6_n1 … … 自动启动: 禁用 //不随KVM自动开机 … …
[root@kvmsvr ~]# virsh autostart rh6_n1 //设置rh6_n1为自启动 域 rh6_n1标记为自动开始
[root@kvmsvr ~]# virsh dominfo rh6_n1 //确认配置结果 Id: – 名称: rh6_n1 … … 自动启动: 启用 //随KVM自动开机 … … 若要关闭指定虚拟机的自动开机设置,需要执行virsh指令autostrt –disable: [root@kvmsvr ~]# virsh autostart –disable rh6_n1 //取消rh6_n1的自启动 域 rh6_n1取消标记为自动开始
[root@kvmsvr ~]# virsh dominfo rh6_n1 //确认取消结果 Id: – 名称: rh6_n1 … … 自动启动: 禁用 //不随KVM自动开机 … … 2.利用XML调整/复制虚拟机 问题 在KVM服务器上,利用XML描述文件来调整/复制虚拟机,主要任务如下: 1)将虚拟机 rh6_n1 改名为 rhel6_node1 2)将虚拟机 rhel6_node1 复制为rh6_n2 方案 要运行一台KVM虚拟机,需要提供虚拟机的磁盘文件,还需要指定这台虚拟机的硬件配置。通常情况下,虚拟机的磁盘文件和配置文件放在下列位置: 1)配置文件:/etc/libvirt/qemu/虚拟机名.xml 2)磁盘文件:/var/lib/libvirt/images/虚拟机名.img 其中,用来记录虚拟机硬件的配置文件采用了XML(eXtensible Markup Language,可扩展标记语言)格式,也叫做描述文件。当我们从“虚拟系统管理器”新建虚拟机以后,对应的XML文件也就自动建好了。 也正因为如此,从命令行来管理KVM虚拟机的时候,就可以利用XML描述文件,来快速修改虚拟机的设置,也可以复制虚拟机。 利用XML文件修改虚拟机配置的基本思路: 1)virsh dumpxml 原虚拟机名 > /路径/new.xml 2)修改 /路径/new.xml 文件(name、uuid) 3)virsh define /路径/new.xml 4)virsh destroy 原虚拟机名,如果虚拟机未运行则跳过此步 5)virsh undefine 原虚拟机名 利用XML文件复制虚拟机的基本思路: 1)virsh dumpxml 原虚拟机名 > /路径/new.xml 2)修改 /路径/new.xml 文件(name、uuid、disk、mac address) 3)拷贝原虚拟机磁盘文件为新的虚拟机磁盘文件 4)virsh define /路径/new.xml 步骤 实现此案例需要按照如下步骤进行。 步骤一: 了解查看/导出XML描述的基本操作 1)查看虚拟机rh6_n1的XML描述信息 [root@kvmsvr ~]# virsh dumpxml rh6_n1 … …
rh6_n1 //名称 dae4cb37-0a80-75c3-5853-07d5187073c7 //UUID值 1048576 1048576 //内存大小 1 //CPU数量 … … 2)将虚拟机rh6_1的XML描述导出到/root/new.xml文件 [root@kvmsvr ~]# virsh dumpxml rh6_n1 > /root/new.xml //导出XML文件 [root@kvmsvr ~]# less /root/new.xml //确认结果 … …
rh6_n1 dae4cb37-0a80-75c3-5853-07d5187073c7 1048576 1048576 1 … … 步骤二:将虚拟机 rh6_n1 改名为 rhel6_node1 1)导出虚拟机 rh6_n1 的XML描述信息,保存为 new.xml 文件 [root@kvmsvr ~]# virsh dumpxml rh6_n1 > new.xml 2)修改导出的new.xml文件 [root@kvmsvr ~]# uuidgen //获取新的UUID值 c33a4aad-c555-48b3-a0a9-893ad0b4775e
[root@kvmsvr ~]# vim new.xml
rhel6_node1 //修改为新的虚拟机名称 c33a4aad-c555-48b3-a0a9-893ad0b4775e //修改UUID值 … … 3)根据 new.xml 建立新的虚拟机 [root@kvmsvr ~]# virsh define new.xml //导入新虚拟机描述 定义域 rhel6_node1(从 new.xml)
[root@kvmsvr ~]# virsh list –all //确认创建结果 Id 名称 状态
1 rh6_n1 启用
代码语言:javascript复制rhel6_node1 关闭
… … 4)删除原虚拟机的 XML 描述 [root@kvmsvr ~]# virsh destroy rh6_n1 //强制关机 域 rh6_n1 被删除
[root@kvmsvr ~]# virsh undefine rh6_n1 //删除虚拟机定义 域 rh6_n1 已经被取消定义
[root@kvmsvr ~]# virsh list –all //确认删除结果 Id 名称 状态
代码语言:javascript复制rhel6_node1 关闭
… … 步骤三:将虚拟机 rhel6_node1 复制为rh6_n2 1)导出虚拟机 rhel6_node1 的XML描述信息,保存为 rh6_n2.xml 文件 [root@kvmsvr ~]# virsh dumpxml rhel6_node1 > rh6_n2.xml 2)修改导出的 rh6_n2.xml文件 [root@kvmsvr ~]# uuidgen //获取新的UUID值 bfdce427-fca8-48a7-ae6c-0dd94daa2ceb
[root@kvmsvr ~]# vim rh6_n2.xml rh6_n2 //修改为新的虚拟机名称 bfdce427-fca8-48a7-ae6c-0dd94daa2ceb //修改UUID值 //改用新的虚拟磁盘 … … … … //修改网卡的MAC地址 … … 3)以复制的方式为新虚拟机建立磁盘文件 [root@kvmsvr ~]# cp -p /data/images/node1.img /data/images/node2.img 4)根据 rh6_n2.xml 建立新的虚拟机 [root@kvmsvr ~]# virsh define rh6_n2.xml 定义域 rh6_n2(从 rh6_n2.xml) [root@kvmsvr ~]# virsh list –all //确认复制结果 Id 名称 状态
代码语言:javascript复制rhel6_node1 关闭
代码语言:javascript复制rh6_n2 关闭
… … 3.虚拟机其他操作 问题 关于KVM虚拟机管理的其他操作: 1)通过virt-viewer直接访问虚拟机 2)使用virt-clone为现有的虚拟机创建克隆 方案 在KVM虚拟化服务器的桌面环境中,可以绕过virt-manager虚拟系统管理器,通过virt-viewer工具直接访问指定的虚拟机,基本用法: virt-viewer 虚拟机名称 另外可以通过virt-clone命令来克隆一台虚拟机,效果相当于练习二中的虚拟机复制,但是操作要更加简单: virt-clone -o 模板虚拟机名称 -n 新虚拟机名称 -f 指定虚拟磁盘路径 步骤 实现此案例需要按照如下步骤进行。 步骤一:virt-viewer直接访问 假设虚拟机rhel6_node1正在运行中,可以执行virt-viewer rhel6_node1来直接访问此虚拟机的图形控制台,如图-2所示。
步骤二:将虚拟机rhel6_node1克隆为新虚拟机rhel6_node2 1)将被克隆的虚拟机rhel6_node1关机 [root@kvmsvr ~]# virsh destroy rhel6_node1 域 rhel6_node1 被删除 2)执行克隆操作 [root@kvmsvr ~]# virt-clone -o rhel6_node1 -n rhel6_node2 -f /data/images/rhel6-clone.img 正在克隆 node1.img 46% [========- ] 7.7 MB/s | 4.5 GB //显示克隆进度 Clone ‘rhel6_node2’ created successfully.
[root@kvmsvr ~]# ls /data/images/ //确认新克隆的磁盘文件 node1.img node2.img rhel6-clone.img 3)验证新虚拟机rhel6_node2 [root@kvmsvr ~]# virsh start rhel6_node2 //开启新虚拟机 域 rhel6_node2 已开始 [root@kvmsvr ~]# virsh list –all //确认虚拟机列表 Id 名称 状态
8 rhel6_node2 running
代码语言:javascript复制rhel6_node1 关闭
代码语言:javascript复制rh6_n2 关闭
… … 4.qemu-img磁盘管理 问题 在KVM服务器上练习qemu-img磁盘管理工具的使用: 1)创建不同格式的磁盘镜像,查看属性、转换格式 2)为现有的磁盘镜像制作增量盘 3)为qcow2磁盘镜像使用快照备份,管理快照 方案 qcow2格式的磁盘可以实现增量备份,其依据是Copy On Write(写时复制)策略: 1)增量盘可以直接映射原始盘的数据内容,几乎零延时备份 2)当原始盘的数据有改动时,被改动的旧数据才会写入到增量盘里边 3)增量盘可以像正常的磁盘镜像一样给虚拟机使用,但是新增的内容并不会回写到原始盘 qcow2格式的磁盘可以实现快照备份,创建的快照只是一个状态记录,并不作为独立的磁盘文件,快照是依附在原始磁盘文件上的。 步骤 实现此案例需要按照如下步骤进行。 步骤一:磁盘镜像的基本管理 1)新建两个不同格式的磁盘镜像文件,大小均为10G [root@kvmsvr ~]# mkdir -p /data/images [root@kvmsvr ~]# cd /data/images/
[root@kvmsvr images]# qemu-img create -f raw disk1.raw 10G Formatting ‘disk1.raw’, fmt=raw size=10737418240
[root@kvmsvr images]# qemu-img create -f qcow2 disk2.qcow2 10G Formatting ‘disk2.qcow2’, fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 2)确认两个镜像文件 分别使用ls命令、qemu-img命令查看: [root@kvmsvr images]# ls -lh disk* -rw-r–r–. 1 root root 10G 12月 17 02:14 disk1.raw -rw-r–r–. 1 root root 193K 12月 17 02:15 disk2.qcow2
[root@kvmsvr images]# qemu-img info disk1.raw image: disk1.raw file format: raw virtual size: 10G (10737418240 bytes) disk size: 0
[root@kvmsvr images]# qemu-img info disk2.qcow2 image: disk2.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 136K cluster_size: 65536 3)转换磁盘格式 [root@kvmsvr images]# qemu-img convert -c -O qcow2 disk1.raw disk1.qcow2
[root@kvmsvr images]# ls -lh disk* -rw-r–r–. 1 root root 193K 12月 17 02:18 disk1.qcow2 -rw-r–r–. 1 root root 10G 12月 17 02:14 disk1.raw -rw-r–r–. 1 root root 193K 12月 17 02:15 disk2.qcow2 步骤二:制作增量盘 1)为disk2.qcow2制作增量镜像disk2-A.qcow2 [root@kvmsvr images]# qemu-img create -f qcow2 -b disk2.qcow2 disk2-A.qcow2 Formatting ‘disk2-A.qcow2’, fmt=qcow2 size=10737418240 backing_file=‘disk2.qcow2’ encryption=off cluster_size=65536 [root@kvmsvr images]# qemu-img info disk2-A.qcow2 //查看结果 image: disk2-A.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 196K cluster_size: 65536 backing file: disk2.qcow2 //后端盘为disk2.qcow2 2)为disk2.qcow2制作增量镜像disk2-B.qcow2 [root@kvmsvr images]# qemu-img create -f qcow2 -b disk2.qcow2 disk2-B.qcow2 Formatting ‘disk2-B.qcow2’, fmt=qcow2 size=10737418240 backing_file=‘disk2.qcow2’ encryption=off cluster_size=65536 [root@kvmsvr images]# qemu-img info disk2-B.qcow2 //查看结果 image: disk2-B.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 196K cluster_size: 65536 backing file: disk2.qcow2 //后端盘为disk2.qcow2 步骤三:快照管理 1)为disk1.qcow2制作快照,名称分别为snap1、snap2、snap3 [root@kvmsvr images]# qemu-img snapshot -c snap1 disk1.qcow2 [root@kvmsvr images]# qemu-img snapshot -c snap2 disk1.qcow2 [root@kvmsvr images]# qemu-img snapshot -c snap3 disk1.qcow2 2)查看创建的快照列表 [root@kvmsvr images]# qemu-img snapshot -l disk1.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 snap1 0 2015-12-17 02:26:41 00:00:00.000 2 snap2 0 2015-12-17 02:26:45 00:00:00.000 3 snap3 0 2015-12-17 02:26:47 00:00:00.000 3)将disk1.qcow2的数据恢复到快照snap2 [root@kvmsvr images]# qemu-img snapshot -a snap2 disk1.qcow2 4)删除快照snap1、snap3 [root@kvmsvr images]# qemu-img snapshot -d snap1 disk1.qcow2 [root@kvmsvr images]# qemu-img snapshot -d snap3 disk1.qcow2 [root@kvmsvr images]# qemu-img snapshot -l disk1.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 2 snap2 0 2015-12-17 02:26:45 00:00:00.000 5.快建新虚拟机 问题 本案例要求利用LVM逻辑卷来提供虚拟机磁盘,并用来构建模板虚拟机,其中创建并安装RHEL6虚拟机的操作要从命令行来实现。主要任务如下: 1)新建模板虚拟机muban1,名称为muban1,磁盘类型qcow2、大小20G,并配置出厂初始化 2)快建两台新虚拟机,作为后续练习环境,其中一台为svr5.tarena.com、另一台为pc205.tarena.com,完成配置后将新虚拟机关机,做快照备份 方案 新建的qcow2格式磁盘可以直接作为KVM虚拟机的磁盘来使用,不需要格式化。 而从命令行创建并安装虚拟机的操作需要使用virt-install命令,基本用法如下: virt-install –name 虚拟机名称 –vcpus=CPU核心数 –ram=内存大小 –disk path=虚拟机磁盘文件路径,format=格式 –network network=网络接口名称 –pxe 如果采用的虚拟机磁盘是默认的RAW格式,则上述操作中的format=可以省略;另外–pxe表示采用PXE方式来装系统,对于非PXE安装来说,应把 –pxe改成 –location=安装源URL。关于virt-install命令的更多用法,可参考man手册页。 步骤 实现此案例需要按照如下步骤进行。 步骤一:为模板虚拟机准备磁盘 新建一个qcow2格式的磁盘镜像文件muban1.qcow2,容量大小设为20G: [root@kvmsvr ~]# mkdir -p /data/images [root@kvmsvr ~]# cd /data/images/ [root@kvmsvr images]# qemu-img create -f qcow2 muban1.qcow2 20G … … [root@kvmsvr images]# qemu-img info muban1.qcow2 … … virtual size: 20G (21474836480 bytes) disk size: 136K 步骤二:为模板虚拟机安装RHEL6操作系统 将虚拟机的名称设为muban1,配单颗CPU、内存1024MB,使用的磁盘为步骤一新建的muban1.qcow2,同时通过PXE的方式安装操作系统: [root@kvmsvr ~]# virt-install –name muban1 –vcpus=1 –ram=1024 –disk path=/data/images/muban1.qcow2,format=qcow2 –network network=network1 –pxe
开始安装… 创建域… | 0 B 00:00 … … 注意:此处将虚拟机的网卡类型设为隔离的network1,若要设为桥接方式,应该将上述操作中的network=network1改成bridge=br0。 成功新建虚拟机以后,会自动弹出virt-viewer窗口,启动新虚拟机进行装机,如图-3所示。
后续过程与正常的PXE选择装机一样,此处不再赘述。 步骤三:模板机的出厂设置 为虚拟机muban1装好RHEL6系统以后,可以根据实际需要做一些应用或服务配置方面的调整,最后将其关机作为模板虚拟机(平时应关闭不启用),以便用来快速创建装配好的新虚拟机。比如,建议清空网卡的udev规则文件、删除网卡配置文件中的MAC地址及UUID设置语句。 [root@localhost ~]# > /etc/udev/rules.d/70-persistent-net.rules [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 EVICE=eth0 TYPE=Ethernet ONBOOT=yes NM_CONTROLLED=no #UUID=5db61050-18d7-423a-b478-95ddc99584e0 //移除此行 #HWADDR=00:0C:29:65:21:3C //移除此行 在实际应用当中,根据模板建立的虚拟机会要求管理员做一些基本设置,比如选择键盘类型、设置系统时区、重设root口令、配置网络等相关信息。要达到这个效果的话,只需要在模板虚拟机的根目录下建立一个.unconfigured隐藏文件即可: [root@localhost ~]# touch /.unconfigured //先标记为未配置 [root@localhost ~]# shutdown -h now //再关闭系统 步骤四:快建新虚拟机 由于模板虚拟机是已经装配好系统的,因此可以利用qcow2增量盘方式来快速生成新虚拟机的磁盘,这个时间是非常短的;然后只要为新虚拟机建立相应的XML描述文件,一台装配好系统的新虚拟机就迅速诞生了。 1)模板机的处理 在使用增量盘作为新虚拟机的磁盘时,为了减少COW带来的负担,最好不要对模板机的磁盘再有所更改。因此,可以先导出muban1的XML配置,然后删除此模板机的定义。 [root@kvmsvr ~]# virsh dumpxml muban1 > /root/muban1.xml [root@kvmsvr ~]# virsh undefine muban1 域 muban1 已经被取消定义 2)从模板机的磁盘建立两个qcow2增量盘 [root@kvmsvr ~]# cd /data/images/ [root@kvmsvr images]# qemu-img create -f qcow2 -b muban1.qcow2 svr5.qcow2 … …
[root@kvmsvr images]# qemu-img create -f qcow2 -b muban1.qcow2 pc205.qcow2 … … 3)建立新虚拟机svr5 [root@kvmsvr images]# vim /root/muban1.xml … … //注意修改name、uuid、disk、mac
svr5 9d00dfd7-9070-b891-7f86-640e2c15d555 … …
… …
… … [root@kvmsvr images]# virsh define /root/muban1.xml 定义域 svr5(从 /root/muban1.xml) 4)建立新虚拟机pc205 [root@kvmsvr images]# vim /root/muban1.xml … … //注意修改name、uuid、disk、mac
pc205 9d00dfd7-9070-b891-7f86-640e2c15d666 … …
… …
… … [root@kvmsvr images]# virsh define /root/muban1.xml 定义域 pc205(从 /root/muban1.xml) 5)新虚拟机的设置及备份 将新建的两台虚拟机svr5、pc205开机,并登入系统,按照网络服务实验环境的要求进行设置,其中svr5.tarena.com的IP地址设为192.168.4.5、pc205.tarena.com的IP地址设为192.168.4.205,并配置好YUM仓库,然后将这两台虚拟机关机。 为虚拟机svr5、pc205的磁盘制作好快照备份: [root@svr5 images]# qemu-img snapshot -c snap1 svr5.qcow2 [root@svr5 images]# qemu-img snapshot -l svr5.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 snap1 0 2015-12-17 02:54:45 00:00:00.000
[root@svr5 images]# qemu-img snapshot -c snap1 pc205.qcow2 [root@svr5 images]# qemu-img snapshot -l pc205.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 snap1 0 2015-12-17 02:54:50 00:00:00.000
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/169794.html原文链接:https://javaforall.cn