远程控制 | 2018-10-15
工作中,我们可能都会接触到 KVM 虚拟机,并且公司的很多应用也都会跑在 KVM 虚拟机上。因此,对 KVM的熟练应用以及熟悉kvm怎么开启console也是运维必不可少的能力。今天小编给大家介绍的是,kvm怎么开启console?
kvm 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。
kvm有如下特点:
guest作为一个普通进程运行于宿主机
guest的CPU(vCPU)作为进程的线程存在,并受到宿主机内核的调度
guest继承了宿主机内核的一些属性,比如huge pages(大页表)
guest的磁盘IO和网络IO会受到宿主机的设置的影响
guest通过宿主机上的虚拟网桥与外部相连。
guest的所有用户级别(user)的指令集,都会直接由宿主机线程执行,此线程会调用kvm的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不需要经过CPU指令集的软件模拟转换,大大的减少了虚拟化成本,这也是kvm优于其他虚拟化方式的点之一。
kvm向外提供了一个虚拟设备/dev/kvm,通过ioctl(IO设备带外管理接口)来对kvm进行操作,包括虚拟机的初始化,分配内存,指令加载等等。
guest作为一个进程存在,当然他的内核的所有驱动等都存在,只是硬件被QEMU所模拟(后面介绍virtio的时候特殊)。guest的所有硬件操作都会有QEMU来接管,QEMU负责与真实的宿主机硬件打交道。
guest的内存在host上由emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次经过一次转换,转换为host的物理地址。后面会有介绍各种虚拟化的优化手段,这里只是做一个overview。
第一步,获取到kvm句柄
kvmfd = open("/dev/kvm", O_RDWR);
第二步,创建虚拟机,获取到虚拟机句柄。
vmfd = ioctl(kvmfd, kvm_CREATE_VM, 0);
第三步,为虚拟机映射内存,还有其他的PCI,信号处理的初始化。
ioctl(kvmfd, kvm_SET_USER_MEMORY_REGION, &mem);
第四步,将虚拟机镜像映射到内存,相当于物理机的boot过程,把镜像映射到内存。
第五步,创建vCPU,并为vCPU分配内存空间。
ioctl(kvmfd, kvm_CREATE_VCPU, vcpuid);
vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, kvm_GET_VCPU_MMAP_SIZE, 0);
第五步,创建vCPU个数的线程并运行虚拟机。
ioctl(kvm->vcpus->vcpu_fd, kvm_RUN, 0);
第六步,线程进入循环,并捕获虚拟机退出原因,做相应的处理。
这里的退出并不一定是虚拟机关机,虚拟机如果遇到IO操作,访问硬件设备,缺页中断等都会退出执行,退出执行可以理解为将CPU执行上下文返回到QEMU。
open("/dev/kvm")
ioctl(kvm_CREATE_VM)
ioctl(kvm_CREATE_VCPU)
for (;;) {
ioctl(kvm_RUN)
switch (exit_reason) {
case kvm_EXIT_IO: /* ... */
case kvm_EXIT_HLT: /* ... */
}
}
关于kvm_CREATE_VM参数的描述,创建的VM是没有cpu和内存的,需要QEMU进程利用mmap系统调用映射一块内存给VM的描述符,其实也就是给VM创建内存的过程。
通过为内核传递参数 console=ttyS0,来让内核把输出定向至 ttyS0
[root@test01-kvm-jz test01-kvm-jz.btr /root]
# vim /etc/grub.conf
通过在 inittab 里加一个 ttyS0 ,来使得系统启动时能够生成一个 ttyS0 来接收来自内核的数据
[root@test01-kvm-jz test01-kvm-jz.btr /root]
# echo "S0:12345:respawn:/sbin/agetty ttyS0 115200" >> /etc/inittab
[root@test01-kvm-jz test01-kvm-jz.btr /root]
# tail -1 /etc/inittab
S0:12345:respawn:/sbin/agetty ttyS0 115200
由于 /etc/securetty 文件允许你规定 root 用户可以从哪个 TTY 设备登录,因此我们需要添加 ttyS0 的安全许可,即将 ttyS0 添加至该文件,来允许我们的 root 用户登录。
root@test01-kvm-jz test01-kvm-jz.btr /root]
# echo "ttyS0" >> /etc/securetty
[root@test01-kvm-jz test01-kvm-jz.btr /root]
# reboot
常规情况下,安装完 KVM 之后,可能都会通过 VNC 连接到 KVM 虚拟机里面去设置相应的 IP 等信息。但是这样子,一方面可能会因为打开过多的端口造成安全问题,另一方面也不是会便捷。针对此种情况,我们可以使用 KVM 为我们提供的 console 接口功能,它可以采用字符界面进行 linux 虚拟机控制台连接。这样子,及时 KVM 虚拟机没有 IP 地址,又或者 KVM 虚拟机出现了问题通过 IP 连接不进去了,都可以很便捷的快速进入到 KVM 虚拟机里面去排查问题。
向日葵控控A2是由Oray自主研发的一款远程控制硬件第二代新产品,它拥有小巧体型,在画面传输质量也有了大幅提升,支持HDMI高清输入/输出接口,基于向日葵远程控制软件提供多个远程服务,例如:远程桌面、远程SSH等,搭配KVM切换器,即可实现多台服务器同时进行远程维护。