虚拟化技术之kvm管理工具virsh常用基础命令(一)
在上一篇博客中,我们了解了KVM基础架构和部署以及图形管理工具virt-manager安装虚拟机的过程,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13499801.html;今天我们来聊一下kvm的命令行工具virsh;virsh工具功能非常丰富,它可以全生命周期的管理kvm;比如创建虚拟机,查看虚拟机,动态热插拔硬盘,给虚拟机做快照,迁移、启动、停止、挂起、暂停、删除虚拟机等等操作;
一、KVM工具栈
提示:上图主要描述了kvm的主要工具栈,从大的类别可以分为libvirt和qemu这两大类,其中libvirt中分virtual machine manager和virsh,virtual machine manager中的virt-manager是基于图形界面的管理,其他都是可以在命令行直接使用命令来管理虚拟机;virsh是基于终端命令行管理;两者都是通过libvirt连接至libvirtd进行管理;而对于qemu来说,它管理虚拟机上直接调用kvm内核中模块的API进行管理;
二、virsh工具的使用说明
1、查看virsh命令帮助信息
- [root@node1 ~]# virsh help
- 分组的命令:
- Domain Management (help keyword 'domain'):
- attach-device 从一个XML文件附加装置
- attach-disk 附加磁盘设备
- attach-interface 获得网络界面
- autostart 自动开始一个域
- blkdeviotune 设定或者查询块设备 I/O 调节参数。
- blkiotune 获取或者数值 blkio 参数
- blockcommit 启动块提交操作。
- blockcopy 启动块复制操作。
- blockjob 管理活跃块操作
- blockpull 使用其后端映像填充磁盘。
- blockresize 创新定义域块设备大小
- change-media 更改 CD 介质或者软盘驱动器
- console 连接到客户会话
- cpu-stats 显示域 cpu 统计数据
- create 从一个 XML 文件创建一个域
- define 从一个 XML 文件定义(但不开始)一个域
- desc 显示或者设定域描述或者标题
- destroy 销毁(停止)域
- detach-device 从一个 XML 文件分离设备
- detach-device-alias detach device from an alias
- detach-disk 分离磁盘设备
- detach-interface 分离网络界面
- domdisplay 域显示连接 URI
- domfsfreeze Freeze domain's mounted filesystems.
- domfsthaw Thaw domain's mounted filesystems.
- domfsinfo Get information of domain's mounted filesystems.
- domfstrim 在域挂载的文件系统中调用 fstrim。
- domhostname 输出域主机名
- domid 把一个域名或 UUID 转换为域 id
- domif-setlink 设定虚拟接口的链接状态
- domiftune 获取/设定虚拟接口参数
- domjobabort 忽略活跃域任务
- domjobinfo 域任务信息
- domname 将域 id 或 UUID 转换为域名
- domrename rename a domain
- dompmsuspend 使用电源管理功能挂起域
- dompmwakeup 从 pmsuspended 状态唤醒域
- domuuid 把一个域名或 id 转换为域 UUID
- domxml-from-native 将原始配置转换为域 XML
- domxml-to-native 将域 XML 转换为原始配置
- dump 把一个域的内核 dump 到一个文件中以方便分析
- dumpxml XML 中的域信息
- edit 编辑某个域的 XML 配置
- event Domain Events
- inject-nmi 在虚拟机中输入 NMI
- iothreadinfo view domain IOThreads
- iothreadpin control domain IOThread affinity
- iothreadadd add an IOThread to the guest domain
- iothreaddel delete an IOThread from the guest domain
- send-key 向虚拟机发送序列号
- send-process-signal 向进程发送信号
- lxc-enter-namespace LXC 虚拟机进入名称空间
- managedsave 管理域状态的保存
- managedsave-remove 删除域的管理保存
- managedsave-edit edit XML for a domain's managed save state file
- managedsave-dumpxml Domain information of managed save state file in XML
- managedsave-define redefine the XML for a domain's managed save state file
- memtune 获取或者数值内存参数
- perf Get or set perf event
- metadata show or set domain's custom XML metadata
- migrate 将域迁移到另一个主机中
- migrate-setmaxdowntime 设定最大可耐受故障时间
- migrate-getmaxdowntime get maximum tolerable downtime
- migrate-compcache 获取/设定压缩缓存大小
- migrate-setspeed 设定迁移带宽的最大值
- migrate-getspeed 获取最长迁移带宽
- migrate-postcopy Switch running migration from pre-copy to post-copy
- numatune 获取或者数值 numa 参数
- qemu-attach QEMU 附加
- qemu-monitor-command QEMU 监控程序命令
- qemu-monitor-event QEMU Monitor Events
- qemu-agent-command QEMU 虚拟机代理命令
- reboot 重新启动一个域
- reset 重新设定域
- restore 从一个存在一个文件中的状态恢复一个域
- resume 重新恢复一个域
- save 把一个域的状态保存到一个文件
- save-image-define 为域的保存状态文件重新定义 XML
- save-image-dumpxml 在 XML 中保存状态域信息
- save-image-edit 为域保存状态文件编辑 XML
- schedinfo 显示/设置日程安排变量
- screenshot 提取当前域控制台快照并保存到文件中
- set-lifecycle-action change lifecycle actions
- set-user-password set the user password inside the domain
- setmaxmem 改变最大内存限制值
- setmem 改变内存的分配
- setvcpus 改变虚拟 CPU 的号
- shutdown 关闭一个域
- start 开始一个(以前定义的)非活跃的域
- suspend 挂起一个域
- ttyconsole tty 控制台
- undefine 取消定义一个域
- update-device 从 XML 文件中关系设备
- vcpucount 域 vcpu 计数
- vcpuinfo 详细的域 vcpu 信息
- vcpupin 控制或者查询域 vcpu 亲和性
- emulatorpin 控制火车查询域模拟器亲和性
- vncdisplay vnc 显示
- guestvcpus query or modify state of vcpu in the guest (via agent)
- setvcpu attach/detach vcpu or groups of threads
- domblkthreshold set the threshold for block-threshold event for a given block device or it's backing chain element
- Domain Monitoring (help keyword 'monitor'):
- domblkerror 在块设备中显示错误
- domblkinfo 域块设备大小信息
- domblklist 列出所有域块
- domblkstat 获得域设备块状态
- domcontrol 域控制接口状态
- domif-getlink 获取虚拟接口链接状态
- domifaddr Get network interfaces' addresses for a running domain
- domiflist 列出所有域虚拟接口
- domifstat 获得域网络接口状态
- dominfo 域信息
- dommemstat 获取域的内存统计
- domstate 域状态
- domstats get statistics about one or multiple domains
- domtime domain time
- list 列出域
- Host and Hypervisor (help keyword 'host'):
- allocpages Manipulate pages pool size
- capabilities 性能
- cpu-baseline 计算基线 CPU
- cpu-compare 使用 XML 文件中描述的 CPU 与主机 CPU 进行对比
- cpu-models CPU models
- domcapabilities domain capabilities
- freecell NUMA可用内存
- freepages NUMA free pages
- hostname 打印管理程序主机名
- hypervisor-cpu-baseline compute baseline CPU usable by a specific hypervisor
- hypervisor-cpu-compare compare a CPU with the CPU created by a hypervisor on the host
- maxvcpus 连接 vcpu 最大值
- node-memory-tune 获取或者设定节点内存参数
- nodecpumap 节点 cpu 映射
- nodecpustats 输出节点的 cpu 状统计数据。
- nodeinfo 节点信息
- nodememstats 输出节点的内存状统计数据。
- nodesuspend 在给定时间段挂起主机节点
- sysinfo 输出 hypervisor sysinfo
- uri 打印管理程序典型的URI
- version 显示版本
- Interface (help keyword 'interface'):
- iface-begin 生成当前接口设置快照,可在今后用于提交 (iface-commit) 或者恢复 (iface-rollback)
- iface-bridge 生成桥接设备并为其附加一个现有网络设备
- iface-commit 提交 iface-begin 后的更改并释放恢复点
- iface-define define an inactive persistent physical host interface or modify an existing persistent one from an XML file
- iface-destroy 删除物理主机接口(启用它请执行 "if-down")
- iface-dumpxml XML 中的接口信息
- iface-edit 为物理主机界面编辑 XML 配置
- iface-list 物理主机接口列表
- iface-mac 将接口名称转换为接口 MAC 地址
- iface-name 将接口 MAC 地址转换为接口名称
- iface-rollback 恢复到之前保存的使用 iface-begin 生成的更改
- iface-start 启动物理主机接口(启用它请执行 "if-up")
- iface-unbridge 分离其辅助设备后取消定义桥接设备
- iface-undefine 取消定义物理主机接口(从配置中删除)
- Network Filter (help keyword 'filter'):
- nwfilter-define 使用 XML 文件定义或者更新网络过滤器
- nwfilter-dumpxml XML 中的网络过滤器信息
- nwfilter-edit 为网络过滤器编辑 XML 配置
- nwfilter-list 列出网络过滤器
- nwfilter-undefine 取消定义网络过滤器
- nwfilter-binding-create create a network filter binding from an XML file
- nwfilter-binding-delete delete a network filter binding
- nwfilter-binding-dumpxml XML 中的网络过滤器信息
- nwfilter-binding-list list network filter bindings
- Networking (help keyword 'network'):
- net-autostart 自动开始网络
- net-create 从一个 XML 文件创建一个网络
- net-define define an inactive persistent virtual network or modify an existing persistent one from an XML file
- net-destroy 销毁(停止)网络
- net-dhcp-leases print lease info for a given network
- net-dumpxml XML 中的网络信息
- net-edit 为网络编辑 XML 配置
- net-event Network Events
- net-info 网络信息
- net-list 列出网络
- net-name 把一个网络UUID 转换为网络名
- net-start 开始一个(以前定义的)不活跃的网络
- net-undefine undefine a persistent network
- net-update 更新现有网络配置的部分
- net-uuid 把一个网络名转换为网络UUID
- Node Device (help keyword 'nodedev'):
- nodedev-create 根据节点中的 XML 文件定义生成设备
- nodedev-destroy 销毁(停止)节点中的设备
- nodedev-detach 将节点设备与其设备驱动程序分离
- nodedev-dumpxml XML 中的节点设备详情
- nodedev-list 这台主机中中的枚举设备
- nodedev-reattach 重新将节点设备附加到他的设备驱动程序中
- nodedev-reset 重置节点设备
- nodedev-event Node Device Events
- Secret (help keyword 'secret'):
- secret-define 定义或者修改 XML 中的 secret
- secret-dumpxml XML 中的 secret 属性
- secret-event Secret Events
- secret-get-value secret 值输出
- secret-list 列出 secret
- secret-set-value 设定 secret 值
- secret-undefine 取消定义 secret
- Snapshot (help keyword 'snapshot'):
- snapshot-create 使用 XML 生成快照
- snapshot-create-as 使用一组参数生成快照
- snapshot-current 获取或者设定当前快照
- snapshot-delete 删除域快照
- snapshot-dumpxml 为域快照转储 XML
- snapshot-edit 编辑快照 XML
- snapshot-info 快照信息
- snapshot-list 为域列出快照
- snapshot-parent 获取快照的上级快照名称
- snapshot-revert 将域转换为快照
- Storage Pool (help keyword 'pool'):
- find-storage-pool-sources-as 找到潜在存储池源
- find-storage-pool-sources 发现潜在存储池源
- pool-autostart 自动启动某个池
- pool-build 建立池
- pool-create-as 从一组变量中创建一个池
- pool-create 从一个 XML 文件中创建一个池
- pool-define-as 在一组变量中定义池
- pool-define define an inactive persistent storage pool or modify an existing persistent one from an XML file
- pool-delete 删除池
- pool-destroy 销毁(删除)池
- pool-dumpxml XML 中的池信息
- pool-edit 为存储池编辑 XML 配置
- pool-info 存储池信息
- pool-list 列出池
- pool-name 将池 UUID 转换为池名称
- pool-refresh 刷新池
- pool-start 启动一个(以前定义的)非活跃的池
- pool-undefine 取消定义一个不活跃的池
- pool-uuid 把一个池名称转换为池 UUID
- pool-event Storage Pool Events
- Storage Volume (help keyword 'volume'):
- vol-clone 克隆卷。
- vol-create-as 从一组变量中创建卷
- vol-create 从一个 XML 文件创建一个卷
- vol-create-from 生成卷,使用另一个卷作为输入。
- vol-delete 删除卷
- vol-download 将卷内容下载到文件中
- vol-dumpxml XML 中的卷信息
- vol-info 存储卷信息
- vol-key 为给定密钥或者路径返回卷密钥
- vol-list 列出卷
- vol-name 为给定密钥或者路径返回卷名
- vol-path 为给定密钥或者路径返回卷路径
- vol-pool 为给定密钥或者路径返回存储池
- vol-resize 创新定义卷大小
- vol-upload 将文件内容上传到卷中
- vol-wipe 擦除卷
- Virsh itself (help keyword 'virsh'):
- cd 更改当前目录
- echo echo 参数
- exit 退出这个非交互式终端
- help 打印帮助
- pwd 输出当前目录
- quit 退出这个非交互式终端
- connect 连接(重新连接)到 hypervisor
- [root@node1 ~]#
提示:从上面的信息可以看到,virsh命令大概分了,Domain Management(域管理),Domain Monitoring(域监控)、 Host and Hypervisor(主机及虚拟化)、Interface(网卡接口)、Network Filter(网络防火墙)、Networking(网络)、Node Device(节点设备驱动)、Secret、Snapshot(快照)、Storage Pool(存储池或存储策略)、Storage Volume(存储卷)、Virsh itself(virsh shell自身相关)这些组,如果查看某一组帮助信息,我们可以使用virsh help +组名;比如查看storage volume组相关命令有哪些,可以使用virsh help volume;
- [root@node1 ~]# virsh help volume
- Storage Volume (help keyword 'volume'):
- vol-clone 克隆卷。
- vol-create-as 从一组变量中创建卷
- vol-create 从一个 XML 文件创建一个卷
- vol-create-from 生成卷,使用另一个卷作为输入。
- vol-delete 删除卷
- vol-download 将卷内容下载到文件中
- vol-dumpxml XML 中的卷信息
- vol-info 存储卷信息
- vol-key 为给定密钥或者路径返回卷密钥
- vol-list 列出卷
- vol-name 为给定密钥或者路径返回卷名
- vol-path 为给定密钥或者路径返回卷路径
- vol-pool 为给定密钥或者路径返回存储池
- vol-resize 创新定义卷大小
- vol-upload 将文件内容上传到卷中
- vol-wipe 擦除卷
- [root@node1 ~]#
如果查看组里的某个命令的用法,可以使用virsh help +命令即可
- [root@node1 ~]# virsh help vol-clone
- NAME
- vol-clone - 克隆卷。
- SYNOPSIS
- vol-clone <vol> <newname> [--pool <string>] [--prealloc-metadata] [--reflink]
- DESCRIPTION
- Clone an existing volume within the parent pool.
- OPTIONS
- [--vol] <string> 卷名称、密钥或者路径
- [--newname] <string> 克隆名称
- --pool <string> 池名或 uuid
- --prealloc-metadata 预先分配的元数据(用于 qcow2 而不是整个分配)
- --reflink use btrfs COW lightweight copy
- [root@node1 ~]#
2、virsh管理虚拟机相关命令
virsh list:列出当前宿主机上的虚拟机列表,默认不加任何选项表示列出当前处于运行状态的虚拟机列表(活跃的)
- [root@node1 ~]# virsh help list
- NAME
- list - 列出域
- SYNOPSIS
- list [--inactive] [--all] [--transient] [--persistent] [--with-snapshot] [--without-snapshot] [--state-running] [--state-paused] [--state-shutoff] [--state-other] [--autostart] [--no-autostart] [--with-managed-save] [--without-managed-save] [--uuid] [--name] [--table] [--managed-save] [--title]
- DESCRIPTION
- 返回域列表
- OPTIONS
- --inactive 列出不活跃的域
- --all 不活跃和活跃的域列表
- --transient 列出临时域
- --persistent 列出持久域
- --with-snapshot 列出现有快照的域
- --without-snapshot 列出没有快照的域
- --state-running 运行状态的域列表
- --state-paused 列出暂停状态的域
- --state-shutoff 列出关闭状态的域
- --state-other 列出其他状态的域
- --autostart 列出启用 autostart 的域
- --no-autostart 列出禁用 autostart 的域
- --with-managed-save 列出有管理的保存状态的域
- --without-managed-save 列出没有管理的保存状态的域
- --uuid 只列出 uuid
- --name 只列出域名
- --table 列出表格(默认)
- --managed-save 标记有管理的保存状态的域
- --title show domain title
- [root@node1 ~]# virsh list
- Id 名称 状态
- ----------------------------------------------------
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- - centos7.0 关闭
- [root@node1 ~]#
virsh create:从一个 XML 文件创建一个域(虚拟机)
- [root@node1 ~]# virsh help create
- NAME
- create - 从一个 XML 文件创建一个域
- SYNOPSIS
- create <file> [--console] [--paused] [--autodestroy] [--pass-fds <string>] [--validate]
- DESCRIPTION
- 创建一个域
- OPTIONS
- [--file] <string> 文件包括一个 XML 域描述
- --console 创建后附加到控制台
- --paused 生成后让虚拟机保持暂停状态
- --autodestroy virsh 断开连接时自动销毁虚拟机
- --pass-fds <string> 向虚拟机传递文件描述符 N、M......
- --validate validate the XML against the schema
- [root@node1 ~]#
virsh define:从指定配置文件中创建虚拟,但不运行,create是创建并运行;
- [root@node1 ~]# virsh help define
- NAME
- define - 从一个 XML 文件定义(但不开始)一个域
- SYNOPSIS
- define <file> [--validate]
- DESCRIPTION
- 定义一个域。
- OPTIONS
- [--file] <string> 文件包括一个 XML 域描述
- --validate validate the XML against the schema
- [root@node1 ~]#
示例:复制centos7的配置文件,修改里面的个别参数,用virsh create 创建一个虚拟机
- [root@node1 ~]# cd /etc/libvirt/qemu/
- [root@node1 qemu]# ls
- c1.xml centos7.0.xml networks
- [root@node1 qemu]# diff centos7.0.xml c1.xml
- 9,10c9
- < <name>centos7.0</name>
- < <uuid>56a1ecab-ef53-42f8-b7eb-6b4019ea3ee4</uuid>
- ---
- > <name>c1</name>
- 41c40
- < <source file='/var/lib/libvirt/images/centos7.0.qcow2'/>
- ---
- > <source file='/kvm/images/c1.qcow2'/>
- 74c73
- < <mac address='52:54:00:e3:8d:11'/>
- ---
- > <mac address='52:54:00:e3:8e:01'/>
- [root@node1 qemu]#
提示:默认kvm上的虚拟机的配置文件都保存在/etc/libvirt/qemu/目录下,以虚拟机名称命名的配置文件;上面主要修改了一些比较私密的配置,比如虚拟机名称、磁盘镜像文件存放位置,mac地址;
使用virsh 基于c1.xml创建虚拟
- [root@node1 qemu]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- - centos7.0 关闭
- [root@node1 qemu]# virsh create c1.xml
- 错误:从 c1.xml 创建域失败
- 错误:Cannot access storage file '/kvm/images/c1.qcow2' (as uid:107, gid:107): 没有那个文件或目录
- [root@node1 qemu]#
提示:上述错误说没有找到我们指定磁盘文件;
创建c1的磁盘文件
- [root@node1 qemu]# ll /kvm/images/
- 总用量 0
- [root@node1 qemu]# qemu-img create -f qcow2 /kvm/images/c1.qcow2 20G
- Formatting '/kvm/images/c1.qcow2', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 lazy_refcounts=off
- [root@node1 qemu]# ll -h /kvm/images/
- 总用量 196K
- -rw-r--r-- 1 root root 193K 8月 15 13:23 c1.qcow2
- [root@node1 qemu]#
提示:qemu-img create 表示使用qemu创建一个磁盘文件,-f指定文件格式,常用的磁盘格式有raw,cow,qcow2;当然qemu-img支持创建很多格式的磁盘文件,这个命令的主要作用就是对磁盘文件的管理,比如创建磁盘,转换磁盘格式,检查磁盘,对磁盘做快照等等操作;
查看新建磁盘信息
- [root@node1 qemu]# qemu-img info /kvm/images/c1.qcow2
- image: /kvm/images/c1.qcow2
- file format: qcow2
- virtual size: 20G (21474836480 bytes)
- disk size: 196K
- cluster_size: 65536
- Format specific information:
- compat: 1.1
- lazy refcounts: false
- [root@node1 qemu]#
再次使用virsh 来基于c1.xml文件来创建虚拟机
- [root@node1 qemu]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- - centos7.0 关闭
- [root@node1 qemu]# virsh create c1.xml
- 域 c1 被创建(从 c1.xml)
- [root@node1 qemu]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 1 c1 running
- - centos7.0 关闭
- [root@node1 qemu]#
提示:可以看到基于c1.xml文件中描述的信息,我们把c1虚拟机创建并启动起来了;这里需要注意,我们在创建虚拟机时,在其配置文件中并没有指定镜像文件在哪里,所以我们现在只创建了一个类似没有安装系统的虚拟机;
用virt-manager验证,看看c1虚拟机是否有系统运行?
提示:可以看到我们创建的虚拟机上没有运行系统。通常我们使用virsh来快速创建虚拟机,在创建磁盘文件时,首先把系统装进我们磁盘里,这样基于xml配置文件就可以很快速的启动一台虚拟机;通常我们会把这个磁盘文件做成一个模板,启动虚拟机时,直接拷贝模板命名为虚拟机名称,拷贝配置文件修改私密信息,然后用virsh工具基于这个改好的配置文件创建虚拟机即可;
测试:拷贝centos7的磁盘文件,命名为c2,然后拷贝centos7.0.xml的配置文件命名为c2.xml,修改c2.xml中的私有配置,然后基于这个配置文件来创建虚拟机
- [root@node1 qemu]# cp /var/lib/libvirt/images/centos7.0.qcow2 /kvm/images/c2.qcow2
- [root@node1 qemu]# ls /kvm/images/
- c1.qcow2 c2.qcow2
- [root@node1 qemu]# ls
- c1.xml c2.xml centos7.0.xml networks
- [root@node1 qemu]# diff centos7.0.xml c2.xml
- 9,10c9
- < <name>centos7.0</name>
- < <uuid>56a1ecab-ef53-42f8-b7eb-6b4019ea3ee4</uuid>
- ---
- > <name>c2</name>
- 41c40
- < <source file='/var/lib/libvirt/images/centos7.0.qcow2'/>
- ---
- > <source file='/kvm/images/c2.qcow2'/>
- 74c73
- < <mac address='52:54:00:e3:8d:11'/>
- ---
- > <mac address='52:54:00:e3:85:21'/>
- [root@node1 qemu]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 1 c1 running
- - centos7.0 关闭
- [root@node1 qemu]# virsh create c2.xml
- 域 c2 被创建(从 c2.xml)
- [root@node1 qemu]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 1 c1 running
- 2 c2 running
- - centos7.0 关闭
- [root@node1 qemu]#
验证:启动图形界面virt-manager,查看c2是否启动,并有系统在运行?
提示:可以看到现在c2启动以后,就有系统运行着,并且和centos7.0一模一样;
virsh console:从宿主机连接指定虚拟的串行控制台
- [root@node1 qemu]# virsh help console
- NAME
- console - 连接到客户会话
- SYNOPSIS
- console <domain> [--devname <string>] [--force] [--safe]
- DESCRIPTION
- 连接客户真实串行控制台
- OPTIONS
- [--domain] <string> domain name, id or uuid
- --devname <string> 字符设备名称
- --force 强制控制台连接(断开已连接的会话)
- --safe 只有在支持安全控制台处理时方可连接
- [root@node1 qemu]# virsh console c2
- 连接到域 c2
- 换码符为 ^]
提示:用virsh console c2命令连接c2的控制台,一直处于卡死的状态,这是因为centos7上默认没有允许ttyS0;
在宿主机用ssh连接至虚拟机(当然svn或者使用virt-manager也行),修改内核参数,然后重启虚拟机
- [root@node1 qemu]# ssh 192.168.122.168
- The authenticity of host '192.168.122.168 (192.168.122.168)' can't be established.
- ECDSA key fingerprint is SHA256:heUVB8InZ+56B+vMgUz+B7Uus4EgklEU9DVeywf1Z7s.
- ECDSA key fingerprint is MD5:0b:b1:75:a4:2b:ba:cf:f1:ac:51:cb:76:2a:74:89:42.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added '192.168.122.168' (ECDSA) to the list of known hosts.
- root@192.168.122.168's password:
- Permission denied, please try again.
- root@192.168.122.168's password:
- Last failed login: Sat Aug 15 03:06:50 EDT 2020 from 192.168.122.1 on ssh:notty
- There was 1 failed login attempt since the last successful login.
- Last login: Sat Aug 15 02:40:23 2020
- [root@localhost ~]#
- [root@localhost ~]# grep "ttyS0" /etc/securetty
- ttyS0
- [root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0"
- [root@localhost ~]# reboot
- PolicyKit daemon disconnected from the bus.
- We are no longer a registered authentication agent.
- Connection to 192.168.122.168 closed by remote host.
- Connection to 192.168.122.168 closed.
- [root@node1 qemu]#
提示:连接虚拟机后,需要看看/etc/securetty这个文件中是否有ttyS0,如果没有就加上,再更改内核参数;如果客户机上centos6,也是一样的步骤,不过在centos6上除了要确定/etc/securetty这个文件是否有ttyS0,还需要确认/etc/inittab文件中是否有S0:12345:respawn:/sbin/agetty ttyS0 115200这项配置,修改内核参数需要修改/etc/grup2.cfg,在启动内核的参数最后加console=ttyS0 保存重启客户机即可;
验证:现在使用virsh console c2命令看看是否能够连接至c2的控制台?
- [root@node1 qemu]# virsh console c2
- 连接到域 c2
- 换码符为 ^]
- CentOS Linux 7 (Core)
- Kernel 3.10.0-693.el7.x86_64 on an x86_64
- localhost login: root
- Password:
- Last failed login: Sat Aug 15 03:08:51 EDT 2020 on ttyS0
- There was 1 failed login attempt since the last successful login.
- Last login: Sat Aug 15 03:06:53 from 192.168.122.1
- [root@localhost ~]# ip a
- 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
- link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
- inet 127.0.0.1/8 scope host lo
- valid_lft forever preferred_lft forever
- inet6 ::1/128 scope host
- valid_lft forever preferred_lft forever
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
- link/ether 52:54:00:e3:85:21 brd ff:ff:ff:ff:ff:ff
- inet 192.168.122.168/24 brd 192.168.122.255 scope global dynamic eth0
- valid_lft 2883sec preferred_lft 2883sec
- inet6 fe80::4c39:5a0f:9800:6314/64 scope link
- valid_lft forever preferred_lft forever
- [root@localhost ~]#
- [root@node1 qemu]#
提示:可以看到在宿主机上我们可以直接使用virsh console命令来连接指定客户机的串行控制台;退出控制台回到宿主机需要使用Ctrl键+有中括号;
virsh shutdown:关闭指定虚拟机
- [root@node1 ~]# virsh help shutdown
- NAME
- shutdown - 关闭一个域
- SYNOPSIS
- shutdown <domain> [--mode <string>]
- DESCRIPTION
- 在目标域中执行关闭行为。
- OPTIONS
- [--domain] <string> domain name, id or uuid
- --mode <string> shutdown mode: acpi|agent|initctl|signal|paravirt
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 1 c1 running
- 2 c2 running
- - centos7.0 关闭
- [root@node1 ~]# virsh shutdown c1
- 域 c1 被关闭
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 1 c1 running
- 2 c2 running
- - centos7.0 关闭
- [root@node1 ~]#
提示:使用shutdown子命令,有时候会关不掉,我们需要使用destroy子命令来强制关机;
强制对c1进行关机
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 1 c1 running
- 2 c2 running
- - centos7.0 关闭
- [root@node1 ~]# virsh destroy c1
- 域 c1 被删除
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- - c1 关闭
- - centos7.0 关闭
- [root@node1 ~]#
提示:强制删除有点类似我们使用kill -9强制杀死一个进程一样,其实kvm上的虚拟在宿主机机上的表现形式就是一个进程,如下所示;
提示:我们在宿主机上查看进程就可以知道当前宿主机上就运行了台虚拟机,从上面的信息我们也不难理解virsh其实也就是调用qemu来创建虚拟机的;
virsh start:启动指定非活动虚拟机(开机)
- [root@node1 ~]# virsh help start
- NAME
- start - 开始一个(以前定义的)非活跃的域
- SYNOPSIS
- start <domain> [--console] [--paused] [--autodestroy] [--bypass-cache] [--force-boot] [--pass-fds <string>]
- DESCRIPTION
- 启动域,可以从最后一个 managedsave
- state,如果没有 managedsave state,
- 也可以从全新引导中启动。
- OPTIONS
- [--domain] <string> 非活跃域的名称
- --console 创建后附加到控制台
- --paused 生成后让虚拟机保持暂停状态
- --autodestroy virsh 断开连接时自动销毁虚拟机
- --bypass-cache 载入时避免文件系统缓存
- --force-boot 采用忽略所有管理保存的方式强制刷新引导
- --pass-fds <string> 向虚拟机传递文件描述符 N、M......
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- - c1 关闭
- - centos7.0 关闭
- [root@node1 ~]# virsh start centos7.0
- 域 centos7.0 已开始
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- 3 centos7.0 running
- - c1 关闭
- [root@node1 ~]#
virsh suspend:挂起一个虚拟机
- [root@node1 ~]# virsh help suspend
- NAME
- suspend - 挂起一个域
- SYNOPSIS
- suspend <domain>
- DESCRIPTION
- 挂起一个运行的域。
- OPTIONS
- [--domain] <string> domain name, id or uuid
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- 3 centos7.0 running
- - c1 关闭
- [root@node1 ~]# virsh suspend centos7.0
- 域 centos7.0 被挂起
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- 3 centos7.0 暂停
- - c1 关闭
- [root@node1 ~]#
提示:suspend操作是把指定虚拟机挂起,所谓挂起就是把运行状态的虚拟机暂停,并把当前运行状态保存到内存,有点类似时间停止的感觉,外部客户端对它访问它也不会响应;如果此时宿主机掉电,那么之前保存在内存的运行状态数据也将随之丢失;
virsh resume:恢复指定被挂起的虚拟机;
- [root@node1 ~]# virsh help resume
- NAME
- resume - 重新恢复一个域
- SYNOPSIS
- resume <domain>
- DESCRIPTION
- 重新恢复一个以前被挂起的域。
- OPTIONS
- [--domain] <string> domain name, id or uuid
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- 3 centos7.0 暂停
- - c1 关闭
- [root@node1 ~]# virsh resume centos7.0
- 域 centos7.0 被重新恢复
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- 3 centos7.0 running
- - c1 关闭
- [root@node1 ~]#
virsh save:把指定的虚拟机运行状态信息保存至指定文件,有点类似vmware 中的挂起操作,vmware的挂起操作是把运行状态保存到磁盘,宿主机掉电,它不会的丢失数据;
- [root@node1 ~]# virsh help save
- NAME
- save - 把一个域的状态保存到一个文件
- SYNOPSIS
- save <domain> <file> [--bypass-cache] [--xml <string>] [--running] [--paused] [--verbose]
- DESCRIPTION
- 保存运行中的域 的 RAM 状态
- OPTIONS
- [--domain] <string> domain name, id or uuid
- [--file] <string> 数据存到什么地方
- --bypass-cache 保存时避免文件系统缓存
- --xml <string> 包含为目标更新的 XML 的文件名
- --running 设定要在还原中运行的域
- --paused 设定要在还原中暂停的域
- --verbose 显示保存进程
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 2 c2 running
- 3 centos7.0 running
- - c1 关闭
- [root@node1 ~]# virsh save c2 ./c2.bin --paused
- 保存到 c2 的域 ./c2.bin
- [root@node1 ~]# ls
- c2.bin redis-5.0.8.tar.gz
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- - c1 关闭
- - c2 关闭
- [root@node1 ~]#
virsh restore:从指定文件恢复虚拟机(该文件是使用save命令保存下来的虚拟机运行状态信息文件)
- [root@node1 ~]# virsh help restore
- NAME
- restore - 从一个存在一个文件中的状态恢复一个域
- SYNOPSIS
- restore <file> [--bypass-cache] [--xml <string>] [--running] [--paused]
- DESCRIPTION
- 恢复一个域。
- OPTIONS
- [--file] <string> 恢复的状态
- --bypass-cache 恢复时避免文件系统缓存
- --xml <string> 包含为目标更新的 XML 的文件名
- --running 将域恢复为运行状态
- --paused 将域恢复为暂停状态
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- - c1 关闭
- - c2 关闭
- [root@node1 ~]# virsh restore ./c2.bin
- 从 ./c2.bin 恢复域
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- 4 c2 暂停
- - c1 关闭
- [root@node1 ~]#
提示:恢复后端c2变成了暂停状态,这是因为我们在保存状态信息时,指定了恢复时的状态;当然我们在恢复时也可以使用选项来指定我们要把虚拟机恢复到什么状态;
virsh reboot:重启指定虚拟机,如同在指定虚拟机上执行reboot命令一样;
- [root@node1 ~]# virsh help reboot
- NAME
- reboot - 重新启动一个域
- SYNOPSIS
- reboot <domain> [--mode <string>]
- DESCRIPTION
- 在目标域中执行重新启动命令。
- OPTIONS
- [--domain] <string> domain name, id or uuid
- --mode <string> shutdown mode: acpi|agent|initctl|signal|paravirt
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- 4 c2 暂停
- - c1 关闭
- [root@node1 ~]# virsh reboot centos7.0
- 域 centos7.0 正在被重新启动
- [root@node1 ~]#
virsh reset:对指定虚拟机执行强制重启,有点类似按机箱上的重置按钮;
- [root@node1 ~]# virsh help reset
- NAME
- reset - 重新设定域
- SYNOPSIS
- reset <domain>
- DESCRIPTION
- 如同使用电源按钮重新设定目标域
- OPTIONS
- [--domain] <string> domain name, id or uuid
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- 4 c2 暂停
- - c1 关闭
- [root@node1 ~]# virsh reset centos7.0
- 重新设定域 centos7.0
- [root@node1 ~]#
virsh dumpxml:以xml格式输出指定虚拟机的详细配置(把对应虚拟机的配置文件内容输出到标准输出);
- [root@node1 ~]# virsh help dumpxml
- NAME
- dumpxml - XML 中的域信息
- SYNOPSIS
- dumpxml <domain> [--inactive] [--security-info] [--update-cpu] [--migratable]
- DESCRIPTION
- 把域信息作为一个 XML 输出到 stdout。
- OPTIONS
- [--domain] <string> domain name, id or uuid
- --inactive 显示不活跃定义的 XML
- --security-info 包括 XML 转储中与安全性相关的信息
- --update-cpu 根据主机 CPU 更新虚拟机 CPU
- --migratable 为迁移提供 XML 可用性
- [root@node1 ~]# virsh dumpxml c1
- <domain type='kvm'>
- <name>c1</name>
- <uuid>c2bd061d-1628-4901-a459-e1cde62ed5b3</uuid>
- <memory unit='KiB'>2097152</memory>
- <currentMemory unit='KiB'>2097152</currentMemory>
- <vcpu placement='static'>2</vcpu>
- <os>
- <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
- <boot dev='hd'/>
- </os>
- <features>
- <acpi/>
- <apic/>
- </features>
- <cpu mode='custom' match='exact' check='partial'>
- <model fallback='allow'>Broadwell</model>
- </cpu>
- <clock offset='utc'>
- <timer name='rtc' tickpolicy='catchup'/>
- <timer name='pit' tickpolicy='delay'/>
- <timer name='hpet' present='no'/>
- </clock>
- <on_poweroff>destroy</on_poweroff>
- <on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
- <pm>
- <suspend-to-mem enabled='no'/>
- <suspend-to-disk enabled='no'/>
- </pm>
- <devices>
- <emulator>/usr/libexec/qemu-kvm</emulator>
- <disk type='file' device='disk'>
- <driver name='qemu' type='qcow2'/>
- <source file='/kvm/images/c1.qcow2'/>
- <target dev='vda' bus='virtio'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
- </disk>
- <disk type='file' device='cdrom'>
- <driver name='qemu' type='raw'/>
- <target dev='hda' bus='ide'/>
- <readonly/>
- <address type='drive' controller='0' bus='0' target='0' unit='0'/>
- </disk>
- <controller type='usb' index='0' model='ich9-ehci1'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci1'>
- <master startport='0'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci2'>
- <master startport='2'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
- </controller>
- <controller type='usb' index='0' model='ich9-uhci3'>
- <master startport='4'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pci-root'/>
- <controller type='ide' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
- </controller>
- <controller type='virtio-serial' index='0'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
- </controller>
- <interface type='network'>
- <mac address='52:54:00:e3:8e:01'/>
- <source network='default'/>
- <model type='virtio'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
- </interface>
- <serial type='pty'>
- <target type='isa-serial' port='0'>
- <model name='isa-serial'/>
- </target>
- </serial>
- <console type='pty'>
- <target type='serial' port='0'/>
- </console>
- <channel type='unix'>
- <target type='virtio' name='org.qemu.guest_agent.0'/>
- <address type='virtio-serial' controller='0' bus='0' port='1'/>
- </channel>
- <channel type='spicevmc'>
- <target type='virtio' name='com.redhat.spice.0'/>
- <address type='virtio-serial' controller='0' bus='0' port='2'/>
- </channel>
- <input type='tablet' bus='usb'>
- <address type='usb' bus='0' port='1'/>
- </input>
- <input type='mouse' bus='ps2'/>
- <input type='keyboard' bus='ps2'/>
- <graphics type='spice' autoport='yes'>
- <listen type='address'/>
- <image compression='off'/>
- </graphics>
- <sound model='ich6'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
- </sound>
- <video>
- <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
- </video>
- <redirdev bus='usb' type='spicevmc'>
- <address type='usb' bus='0' port='2'/>
- </redirdev>
- <redirdev bus='usb' type='spicevmc'>
- <address type='usb' bus='0' port='3'/>
- </redirdev>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
- </memballoon>
- <rng model='virtio'>
- <backend model='random'>/dev/urandom</backend>
- <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
- </rng>
- </devices>
- </domain>
- [root@node1 ~]# virsh dumpxml c1 > c1.xml.bak
- [root@node1 ~]# diff c1.xml.bak /etc/libvirt/qemu/c1.xml
- 0a1,7
- > <!--
- > WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
- > OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
- > virsh edit centos7.0
- > or other application using the libvirt API.
- > -->
- >
- 3d9
- < <uuid>c2bd061d-1628-4901-a459-e1cde62ed5b3</uuid>
- 119d124
- <
- [root@node1 ~]#
提示:可以看到到处都配置文件和原有配置文件没有本质的不同,除了注释相差就只是uuid,如果我们在创建虚拟机时指定了uuid,导出的配置和原配置文件都是一样的;
virsh undefine:删除指定虚拟机(会连同配置文件一并删除)
- [root@node1 ~]# virsh help undefine
- NAME
- undefine - 取消定义一个域
- SYNOPSIS
- undefine <domain> [--managed-save] [--storage <string>] [--remove-all-storage] [--delete-snapshots] [--wipe-storage] [--snapshots-metadata] [--nvram] [--keep-nvram]
- DESCRIPTION
- 取消定义一个域或者将持久转换为临时。
- OPTIONS
- [--domain] <string> domain name, id or uuid
- --managed-save 删除域管理的状态文件
- --storage <string> 删除关联的存储卷(用逗号分开的目标或者源路径列表)(查看 domblklist)
- --remove-all-storage 删除关联的存储卷(小心使用)
- --delete-snapshots delete snapshots associated with volume(s), requires --remove-all-storage (must be supported by storage driver)
- --wipe-storage 擦除删除卷中的数据
- --snapshots-metadata 如果不活跃则删除所有域快照元数据
- --nvram remove nvram file, if inactive
- --keep-nvram keep nvram file, if inactive
- [root@node1 ~]# ll /kvm/images/
- 总用量 20975172
- -rw-r--r-- 1 root root 197120 8月 15 13:23 c1.qcow2
- -rw------- 1 qemu qemu 21478375424 8月 15 16:30 c2.qcow2
- [root@node1 ~]# ll /etc/libvirt/qemu/
- 总用量 24
- -rw------- 1 root root 4531 8月 15 14:22 c1.xml
- -rw------- 1 root root 4531 8月 15 14:34 c2.xml
- -rw------- 1 root root 4609 8月 14 00:10 centos7.0.xml
- drwx------ 3 root root 42 8月 13 23:31 networks
- [root@node1 ~]# virsh undefine c1
- 域 c1 已经被取消定义
- [root@node1 ~]# ll /etc/libvirt/qemu/
- 总用量 16
- -rw------- 1 root root 4531 8月 15 14:34 c2.xml
- -rw------- 1 root root 4609 8月 14 00:10 centos7.0.xml
- drwx------ 3 root root 42 8月 13 23:31 networks
- [root@node1 ~]# ll /kvm/images/
- 总用量 20975172
- -rw-r--r-- 1 root root 197120 8月 15 13:23 c1.qcow2
- -rw------- 1 qemu qemu 21478375424 8月 15 16:30 c2.qcow2
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- 4 c2 暂停
- [root@node1 ~]#
提示:默认使用undefine只会把对应配置文件和虚拟机实例删除,如果还需要删除存储卷,可以在后面加上对应的选项指定即可;
virsh autostart :设置指定虚拟机为随宿主机启动而自动启动
- [root@node1 ~]# virsh help autostart
- NAME
- autostart - 自动开始一个域
- SYNOPSIS
- autostart <domain> [--disable]
- DESCRIPTION
- 设置一个域在启动时自动开始.
- OPTIONS
- [--domain] <string> domain name, id or uuid
- --disable 禁止自动启动
- [root@node1 ~]# virsh list --all
- Id 名称 状态
- ----------------------------------------------------
- 3 centos7.0 running
- 4 c2 暂停
- [root@node1 ~]# virsh autostart c2
- 域 c2标记为自动开始
- [root@node1 ~]# virsh autostart c2 --disable
- 域 c2取消标记为自动开始
- [root@node1 ~]#
虚拟化技术之kvm管理工具virsh常用基础命令(一)的更多相关文章
- 虚拟化技术之kvm管理工具virsh常用基础命令(二)
上一篇博客我们主要聊了下virsh 管理kvm虚拟机的命令相关用法和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13508231.html:今天我们来继 ...
- 虚拟化技术之kvm磁盘管理工具qemu-img
在前边的博客中,我们大致了解了virsh这个工具对kvm虚拟机的一些操作,回顾请参考https://www.cnblogs.com/qiuhom-1874/tag/virsh/:今天我们来了解下kvm ...
- 虚拟化技术之kvm WEB管理工具kimchi
在前面的博客中,我们介绍了kvm的各种工具,有基于图形管理的virt-manager.有基于命令行管理的virt-install .qemu-kvm.virsh等等:今天我们来介绍一款基于web界面的 ...
- 虚拟化技术之kvm虚拟机创建工具qemu-kvm
在前边的博客中我们介绍了如何创建kvm虚拟机,以及一些常用的工具的介绍和使用,今天我们来了解下kvm原始工具qemu-kvm:为什么说qemu-kvm是一个原始的工具呢,如果你用kvm虚拟机,心细的你 ...
- 虚拟化技术之KVM
虚拟化技术之KVM 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是虚拟化 其实虚拟化技术已经不是一个新技术了,上个世纪六十年代IBM公司已经在使用,只不过后来(上个世纪八 ...
- showdoc 开源在线api&&技术文档管理工具
showdoc 是一个很不错的api 以及技术文档管理工具 环境准备 doker-copose 文件 version: "3" services: doc: image: regi ...
- 无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer、Windows服务器管理工具或NET START命令启动它
无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe),然后用ServerExplorer.Windows服务器管理工具或NET START命令启动它 1. ...
- Linux常用基础命令整理:关机命令、查看目录下文件命令等
Linux常用基础命令整理:关机命令.查看目录下文件命令等 整理了一些Linux常用基础命令,欢迎指正. 首先记住四个热键,学会这四个键,收益一辈子. Tab按键---命令补齐功能Ctrl+c按键-- ...
- CentOS常用基础命令大全
这篇文章主要介绍了CentOS常用基础命令大全,学习centos的朋友需要掌握的知识,需要的朋友可以参考下 1.关机 (系统的关机.重启以及登出 ) 的命令shutdown -h now 关闭系统(1 ...
随机推荐
- 一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗
一:背景 1. 讲故事 最近因为各方面原因换了一份工作,去了一家主营物联柜的公司,有意思的是物联柜上的终端是用 wpf 写的,代码也算是年久失修,感觉技术债还是蛮重的,前几天在调试一个bug的时候,看 ...
- 数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优 ...
- DJANGO-天天生鲜项目从0到1-006-首页-内容展示
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- vue学习(九) 使用内联样式设置style样式
/html <div id="app"> //对象就是无序键值对的集合 <h1 :style="{ color:red, 'font-weight':2 ...
- 雪碧图——CSS Sprites(精灵)
在日常开发打开文件包,打开static文件夹,有一张图片,里面融合了这个应用都会用到的小图标,其实,主要是减少应用渲染出现繁多的请求,加速页面渲染. 解决方案:使用css背景定位 icon {widt ...
- 艺术鬼才,Unicode 字符还能这么玩?
上周的时候,朋友圈的直升飞机不知道为什么就火了,很多朋友开着各种花式飞机带着起飞. 还没来得及了解咋回事来着,这个直升飞机就到的微博热搜. 后面越来越多人开来他们的直升飞机,盘旋在朋友圈上方.于是很多 ...
- vuex多多,怎么当好一个奶妈
前言 vue 本身更偏向于 view 层的框架,尤大大并没有一开始就给他一个完整的 mvvm 架构. 在 vue 的世界里 vuex 是用来实现 mvvm 中关键的 vm 层(视图模型层),你甚至可以 ...
- 《Python编程快速上手 —让繁琐工作自动化》|百度网盘免费下载|Python自动化办公
Python编程快速上手—让繁琐工作自动化 提取码:u8vj 如今,人们面临的大多数任务都可以通过编写计算机软件来完成. Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言.通过 P ...
- Robot Framework 使用常见问题汇总
一 安装过程 windows可以使用pip命令进行一系列安装,一定要使用管理员打开cmd窗口进行安装,不然可能后续会有很多自定义库无法使用的问题. 1 ride安装后打不开 解决方案 https:/ ...
- CF R 635 div2 1337D Xenia and Colorful Gems 贪心 二分 双指针
LINK:Xenia and Colorful Gems 考试的时候没想到一个很好的做法. 赛后也有一个想法. 可以考虑答案的样子 x,y,z 可以发现 一共有 x<=y<=z,z< ...