This commit is contained in:
Ezio 2016-02-27 19:49:12 +08:00
parent 9b8154162c
commit 6886aaf932

View File

@ -1,67 +1,90 @@
怎样在ubuntu和debian中用命令行使用KVM
================================================================================
有很多不同的方式去管理运行在KVM管理程序上的虚拟机。例如virt-manager就是一个流行的基于图形用户界面的前端虚拟机管理工具。然而如果你想要在没有图形窗口的服务器环境下使用KVM那么基于图形用户界面的解决方案显然是行不通的。事实上你可以纯粹的使用包装了kvm命令行脚本的命令行来管理KVM虚拟机。作为替代方案你可以使用virsh这个容易使用的命令行用户接口来管理客户虚拟机。在virsh中它通过和libvirtd服务通信来达到控制虚拟机的目的而libvirtd可以控制几个不同的虚拟机管理器包括KVMXenQEMULXC和OpenVZ。
当你想要对虚拟机的前期准备和后期管理实现自动化操作时像virsh这样的命令行管理工具是非常有用的。同样virsh支持多个管理器的事实也意味着你可以通过相同的virsh接口去管理不同的虚拟机管理器。
在这篇文章中,我会示范**怎样在ubuntu和debian上通过使用virsh命令行去运行KVM**。
有很多不同的方式去管理运行在 KVM 管理程序上的虚拟机。例如virt-manager 就是一个流行的基于图形界面的前端虚拟机管理工具。然而,如果你想要在没有图形窗口的服务器环境下使用 KVM ,那么基于图形界面的解决方案显然是行不通的。事实上,你可以纯粹的使用包装了 kvm 命令行脚本的命令行来管理 KVM 虚拟机。作为替代方案,你可以使用 virsh 这个容易使用的命令行程序来管理客户虚拟机。在 virsh 中,它通过和 libvirtd 服务通信来达到控制虚拟机的目的,而 libvirtd 可以控制多个不同的虚拟机管理器,包括 KVMXenQEMULXC 和 OpenVZ。
当你想要对虚拟机的前期准备和后期管理实现自动化操作时,像 virsh 这样的命令行管理工具是非常有用的。同样virsh 支持多个管理器也就意味着你可以通过相同的 virsh 接口去管理不同的虚拟机管理器。
在这篇文章中,我会示范**怎样在ubuntu和debian上通过使用virsh命令行去运行KVM**。
### 第一步:确认你的硬件平台支持虚拟化 ###
作为第一步首先要确认你的主机CPU配备了硬件虚拟化拓展e.g.Intel VT或者AMD-V)这是KVM对硬件的要求。下面的命令可以检查硬件是否支持虚拟化。
第一步,首先要确认你的 CPU 支持硬件虚拟化扩展e.g.Intel VT 或者 AMD-V),这是 KVM 对硬件的要求。下面的命令可以检查硬件是否支持虚拟化。
```
$ egrep '(vmx|svm)' --color /proc/cpuinfo
```
![](https://c2.staticflickr.com/2/1505/24050288606_758a44c4c6_c.jpg)
如果在输出中不包含vmx或者svm标识那么就意味着你的主机cpu不支持硬件虚拟化。因此你不能在你的机器上使用KVM。确认了主机cpu存在vmx或者svm之后接下来开始安装KVM。
对于KVM来说它不要求运行在拥有64位内核系统的主机上但是通常我们会推荐在64位系统的主机上面运行KVM。
如果在输出中不包含 vmx 或者 svm 标识,那么就意味着你的 cpu 不支持硬件虚拟化。因此你不能在你的机器上使用 KVM 。确认了 cpu 支持 vmx 或者 svm 之后,接下来开始安装 KVM。
对于 KVM 来说,它不要求运行在拥有 64 位内核系统的主机上,但是通常我们会推荐在 64 位系统的主机上面运行 KVM。
### 第二步安装KVM ###
使用apt-get安装KVM和相关的用户空间工具。
使用 `apt-ge` 安装 KVM 和相关的用户空间工具。
```
$ sudo apt-get install qemu-kvm libvirt-bin
```
安装期间libvirtd组在debian上是libvirtd-qemu组将会被创建并且你的用户id将会被自动添加到该组中。这样做的目的是让你可以以一个普通用户而不是root用户的身份去管理虚拟机。你可以使用id命令来确认这一点下面将会告诉你怎么去显示你的组id
安装期间libvirtd 用户组(在 debian 上是 libvirtd-qemu 用户组)将会被创建,并且你的用户 id 将会被自动添加到该组中。这样做的目的是让你可以以一个普通用户而不是 root 用户的身份去管理虚拟机。你可以使用 `id` 命令来确认这一点,下面将会告诉你怎么去显示你的组 id
```
$ id <your-userID>
```
![](https://c2.staticflickr.com/6/5597/15432586092_64dfb867d3_c.jpg)
如果因为某些原因libvirt在debian中是libvirt-qemu没有在你的组id中被找到你也可以手动将你自己添加到对应的组中如下所示
在ubuntu上
如果因为某些原因libvirt在 debian 中是 libvirt-qemu没有在你的组 id 中被找到,你也可以手动将你自己添加到对应的组中,如下所示:
在 ubuntu 上:
```
$ sudo adduser [youruserID] libvirtd
```
在debian上
debian 上:
```
$ sudo adduser [youruserID] libvirt-qemu
```
按照如下形式重修载入更新后的组成员关系。如果要求输入密码,那么输入你的登陆密码即可。
按照如下命令重新载入更新后的组成员关系。如果要求输入密码,那么输入你的登陆密码即可。
```
$ exec su -l $USER
```
这时你应该可以以普通用户的身份去执行virsh了。做一个如下所示的测试这个命令将会以列表的形式列出可用的虚拟机当前的列表是空的。如果你没有遇到权限问题那意味着迄今为止一切都是正常的。
这时,你应该可以以普通用户的身份去执行 virsh 了。做一个如下所示的测试,这个命令将会以列表的形式列出可用的虚拟机(当前的列表是空的)。如果你没有遇到权限问题,那意味着到目前为止一切都是正常的。
$ virsh list
----------
Id Name State
----------------------------------------------------
----------------------------------------------------
### 第三步:配置桥接网络 ###
为了使KVM虚拟机能够访问外部网络一种方法是通过在KVM宿主机上创建Linux桥来实现。创建之后的桥能够将虚拟机的虚拟网卡和宿主机的物理网卡连接起来因此虚拟机能够发送和接受由物理网卡发送过来的流量数据包。这种方式叫做网桥连接。
下面将告诉你如何创建并且配置网桥我们称它为br0.
为了使 KVM 虚拟机能够访问外部网络,一种方法是通过在 KVM 宿主机上创建 Linux 桥来实现。创建之后的桥能够将虚拟机的虚拟网卡和宿主机的物理网卡连接起来,因此,虚拟机能够发送和接收由物理网卡传输的数据包。这种方式叫做网络桥接。
下面将告诉你如何创建并且配置网桥,我们创建一个网桥称它为 br0.
首先,安装一个必需的包,然后用命令行创建一个网桥。
```
$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0
```
下一步就是配置已经创建好的网桥,即修改位于/etc/network/interfaces的配置文件。我们需要将该桥接网卡设置成开机启动。为了修改该配置文件你需要关闭你的操作系统上的网络管理器如果你在使用它的话。跟随[操作指南][1]的说明去关闭网络管理器。
关闭网络管理器之后,接下来就是通过修改配置文件来配置网桥了。
下一步就是配置已经创建好的网桥,即修改位于 `/etc/network/interfaces` 的配置文件。我们需要将该桥接网卡设置成开机启动。为了修改该配置文件,你需要关闭你的操作系统上的网络管理器(如果你在使用它的话)。跟随[操作指南][1]的说明去关闭网络管理器。
关闭网络管理器之后,接下来就是通过修改配置文件来配置网桥了。
```
#auto eth0
#iface eth0 inet dhcp
@ -71,23 +94,28 @@
bridge_stp off
bridge_fd 0
bridge_maxwait 0
```
在上面的配置中,我假设 eth0 是主要网卡,它也是连接到外网的网卡,同样,我假设 eth0 将会通过 DHCP 协议自动获取 ip 地址。注意,之前在 `/etc/network/interfaces` 中还没有对 eth0 进行任何配置。桥接网卡 br0 引用了 eth0 的配置,而 eth0 也会受到 br0 的制约。
在上面的配置中我假设eth0是主要网卡它也是连接到外网的网卡同样我假设eth0将会通过DHCP得到它的ip地址。注意之前在/etc/network/interfaces中还没有对eth0进行任何配置。桥接网卡br0引用了eth0的配置而eth0也会受到br0的制约。
重启网络服务并确认网桥已经被成功的配置好。如果成功的话br0的ip地址将会是eth0的被自动分配的ip地址而且eth0不会被分配任何ip地址。
重启网络服务并确认网桥已经被成功的配置好。如果成功的话br0 的 ip 地址将会是 eth0 自动分配的 ip 地址,而且 eth0 不会被分配任何 ip 地址。
```
$ sudo /etc/init.d/networking restart
$ ifconfig
```
如果因为某些原因eth0仍然保留了之前分配给了br0的ip地址那么你可能必须明确的删除eth0的ip地址。
如果因为某些原因eth0 仍然保留了之前分配给了 br0 的 ip 地址,那么你可能必须手动删除 eth0 的 ip 地址。
![](https://c2.staticflickr.com/2/1698/23780708850_66cd7ba6ea_c.jpg)
###第四步:用命令行创建一个虚拟机 ###
### 第四步:用命令行创建一个虚拟机 ###
对于虚拟机来说它的配置信息被存储在它对应的xml文件中。因此创建一个虚拟机的第一步就是准备一个与主机名对应的xml文件。
下面是一个示例xml文件你可以根据需要手动修改它。
对于虚拟机来说它的配置信息被存储在它对应的xml文件中。因此创建一个虚拟机的第一步就是准备一个与虚拟机对应的 xml 文件。
下面是一个示例 xml 文件,你可以根据需要手动修改它。
```
<domain type='kvm'>
<name>alice</name>
<uuid>f5b8c05b-9c7a-3211-49b9-2bd635f7e2aa</uuid>
@ -134,55 +162,69 @@
</console>
</devices>
</domain>
```
上面的主机xml配置文件定义了如下的虚拟机内容。
- 1GB内存一个虚拟cpu和一个硬件驱动。
- Disk image/home/dev/images/alice.img。
- Boot from CD-ROM/home/dev/iso/CentOS-6.5-x86_64-minomal.iso
- Networking:一个桥接到br0的虚拟网卡。
- 通过VNC远程访问。
<uuid></uuid>中的UUID字符串可以随机生成。为了得到一个随机的uuid字符串你可能需要使用uuid命令行工具。
- 1GB内存一个虚拟cpu和一个硬件驱动
- Disk image`/home/dev/images/alice.img`
- Boot from CD-ROM`/home/dev/iso/CentOS-6.5-x86_64-minomal.iso`
- Networking:一个桥接到 br0 的虚拟网卡
- 通过 VNC 远程访问
`<uuid></uuid>` 中的 UUID 字符串可以随机生成。为了得到一个随机的 uuid 字符串,你可能需要使用 uuid 命令行工具。
```
$ sudo apt-get install uuid
$ uuid
```
生成一个主机xml配置文件的方式就是通过一个已经存在的虚拟机来导出它的xml配置文件。如下所示。
```
$ virsh dumpxml alice > bob.xml
```
![](https://c2.staticflickr.com/6/5808/23968234602_25e8019ec8_c.jpg)
###第五步:使用命令行启动虚拟机###
### 第五步:使用命令行启动虚拟机 ###
在启动虚拟机之前,我们需要创建它的初始磁盘镜像。为此,你需要使用qemu-img命令来生成一个你已经安装的qemu-kvm镜像。下面的命令将会创建10GB大小的空磁盘并且它是qcow2格式的。
在启动虚拟机之前,我们需要创建它的初始磁盘镜像。为此,你需要使用 qemu-img 命令来生成一个 qemu-kvm 镜像。下面的命令将会创建 10 GB 大小的空磁盘,并且它是 qcow2 格式的。
```
$ qemu-img create -f qcow2 /home/dev/images/alice.img 10G
```
使用qcow2格式的磁盘镜像的好处就是它在创建之初并不会给它分配全部大小磁盘容量这里是10GB而是随着虚拟机中文件的增加而逐渐增大。因此它对空间的使用更加有效。
现在你可以准备通过使用之前创建的xml配置文件启动你的虚拟机了。下面的命令将会创建一个虚拟机然后自动启动它。
使用 qcow2 格式的磁盘镜像的好处就是它在创建之初并不会给它分配全部大小磁盘容量(这里是 10 GB而是随着虚拟机中文件的增加而逐渐增大。因此它对空间的使用更加有效。
现在,你可以通过使用之前创建的 xml 配置文件启动你的虚拟机了。下面的命令将会创建一个虚拟机,然后自动启动它。
```
$ virsh create alice.xml
----------
Domain alice created from alice.xml
```
**注意**:如果你对一个已经存在的虚拟机运行了上面的命令,那么这个操作将会在没有警告信息的情况下抹去那个已经存在的虚拟机的全部信息。如果你已经创建了一个虚拟机,你可能会使用下面的命令来启动虚拟机。
**注意**: 如果你对一个已经存在的虚拟机执行了了上面的命令,那么这个操作将会在没有任何警告的情况下抹去那个已经存在的虚拟机的全部信息。如果你已经创建了一个虚拟机,你可能会使用下面的命令来启动虚拟机。
```
$ virsh start alice.xml
```
使用如下命令确认一个新的虚拟机已经被创建并成功的被启动。
```
$ virsh list
----------
```
Id Name State
----------------------------------------------------
3 alice running
同样使用如下命令确认你的虚拟机的虚拟网卡已经被成功的添加到了你先前创建的br0网桥中。
同样,使用如下命令确认你的虚拟机的虚拟网卡已经被成功的添加到了你先前创建的 br0 网桥中。
$ sudo brctl show
@ -193,59 +235,82 @@
为了远程访问一个正在运行的虚拟机的控制台你可以使用VNC客户端。
首先你需要使用如下命令找出用于虚拟机的VNC端口号。
```
$ sudo netstat -nap | egrep '(kvm|qemu)'
```
![](https://c2.staticflickr.com/6/5633/23448144274_49045bc868_c.jpg)
在这个例子中用于alice虚拟机的VNC端口号是5900
然后启动一个VNC客户端连接到一个端口号为5900的VNC服务器。在我们的例子中虚拟机支持由CentOS光盘文件启动。
在这个例子中,用于 alice 虚拟机的 VNC 端口号是 5900
然后启动一个VNC客户端连接到一个端口号为5900的VNC服务器。在我们的例子中虚拟机支持由CentOS光盘文件启动。
![](https://c2.staticflickr.com/2/1533/24076369675_99408972a4_c.jpg)
### 使用virsh管理虚拟机 ###
### 使用 virsh 管理虚拟机 ###
下面列出了virsh命令的常规用法
下面列出了 virsh 命令的常规用法
创建客户机并且启动虚拟机:
```
$ virsh create alice.xml
```
停止虚拟机并且删除客户机
```
$ virsh destroy alice
```
关闭虚拟机(不用删除它)
```
$ virsh shutdown alice
```
暂停虚拟机
```
$ virsh suspend alice
```
恢复虚拟机
```
$ virsh resume alice
```
访问正在运行的虚拟机的登陆控制台
访问正在运行的虚拟机的控制台
```
$ virsh console alice
```
设置虚拟机开机启动:
```
$ virsh autostart alice
```
查看虚拟机的详细信息
```
$ virsh dominfo alice
```
编辑虚拟机的配置文件:
```
$ virsh edit alice
```
上面的这个命令将会使用一个默认的编辑器来调用主机配置文件。该配置文件中的任何改变都将自动被libvirt验证其正确性。
你也可以在一个virsh会话中管理虚拟机。下面的命令会创建并进入到一个virsh会话中
```
$ virsh
在virsh提示中你可以使用任何virsh命令。
```
在 virsh 提示中,你可以使用任何 virsh 命令。
![](https://c2.staticflickr.com/6/5645/23708565129_b1ef968b30_c.jpg)
@ -255,33 +320,41 @@
error: internal error: no supported architecture for os type 'hvm'
如果你的硬件不支持虚拟化的话你可能就会遇到这个错误。例如Intel VT或者AMD-V这是运行KVM所必需的。如果你遇到了这个错误而你的cpu支持虚拟化那么这里可以给你一些可用的解决方案
如果你的硬件不支持虚拟化的话你可能就会遇到这个错误。例如Intel VT或者AMD-V这是运行KVM所必需的。如果你遇到了这个错误而你的cpu支持虚拟化那么这里可以给你一些可用的解决方案
首先,检查你的内核模块是否丢失。
首先,检查你的内核模块是否丢失。
```
$ lsmod | grep kvm
```
如果内核模块没有加载,你必须按照如下方式加载它。
如果内核模块没有加载,你必须按照如下方式加载它。
```
$ sudo modprobe kvm_intel (for Intel processor)
$ sudo modprobe kvm_amd (for AMD processor)
```
第二个解决方案就是添加“--connect qemu:///system”参数到virsh命令中如下所示。当你正在你的硬件平台上使用超过一个虚拟机管理器的时候就需要添加这个参数例如VirtualBoxVMware
第二个解决方案就是添加 `--connect qemu:///system` 参数到 `virsh` 命令中如下所示。当你正在你的硬件平台上使用超过一个虚拟机管理器的时候就需要添加这个参数例如VirtualBoxVMware
```
$ virsh --connect qemu:///system create alice.xml
```
2. 当我试着访问我的虚拟机的登陆控制台的时候遇到了错误:
```
$ virsh console alice
error: internal error: cannot find character device <null>
```
----------
这个错误发生的原因是你没有在你的虚拟机配置文件中定义控制台设备。在 xml 文件中加上下面的内部设备部分即可。
error: internal error: cannot find character device <null>
这个错误发生的原因是你没有在你的虚拟机配置文件中定义控制台设备。在xml文件中加上下面的内部设备部分即可。
```
<console type='pty'>
<target port='0'/>
</console>
```
--------------------------------------------------------------------------------