最近研究学习Linux虚拟机KVM,母机安装的是CentOS6.2 64位版本,虚拟机安装CentOS 6.0 32位版本。
启动virsh命令想通过console命令连接至客户机的终端,结果输入命令后终端卡在这个状态:
[root@KVM-01 ~]# virsh console centos
Connected to domain centos
Escape character is ^]
敲任何键都无响应,通过网上查询知道原来想通过console连接客户机终端还要在客户机上做相应的终端设置,才能使输出正确地输出到虚拟机管理程序的终端。
虚拟机设置步骤:
1、添加ttyS0的安全许可,允许root登录:
echo “ttyS0” >> /etc/securetty
2、在/etc/grub.conf文件中为内核添加参数:
console=ttyS0
3、在/etc/inittab中添加agetty:
S0:12345:respawn:/sbin/agetty ttyS0 115200
4、重启客户机:
reboot
此时,再次尝试console命令可以正常使用:
[root@KVM-01 ~]# virsh console centos
Connected to domain centos
Escape character is ^]
回车后键入tty,显示
/dev/ttyS0
显然虚拟管理程序的终端已经正常工作了。
重启就好了,可以看见从进入内核引导后的全部过程。
说一下原理
修改 menu.1st 让内核吧输出输出至 ttyS0
在inittab里加一个ttyS0在系统启动时会生成一个ttyS0来接收内核的数据
还有在 securetty里面要有不然也出不来。
最后发现 virsh console有了整个启动过程,kvm连上去反而没有了,只有启动到内核之前的数据,不爽。
后来发现在 menu.1st 的kernel 这行加一个 console=tty0 就可以恢复默认的kvm输出。
不过这2个console是有优先级的,最后一个console优先级最高。
下面的截图是 左面是ttyS0 右边是tty0
vnc是tty0 数据明显比ttyS0多,启动数据全部在tty0。不过启动完成后都能操作,也没啥区别。
上面是实际用下来的感觉,没有查过相关文档。文档牛人可以绕道或留言。。。
方法二:安装直接支持:—增加内核参数
<span><span style="color: #110000;">virt-install </span>--name<span style="color: #110000;"> testvm </span>--ram1024<span style="color: #110000;"> </span>--vcpus2<span style="color: #110000;"> </span>--os-type<span style="color: #110000;"> linux </span>--os-variant<span style="color: #110000;"> rhel6.1 </span>--diskpath<span style="color: #110000;">=</span>/<span style="color: #110000;">vmrepo</span>/<span style="color: #110000;">disk</span>/<span style="color: #110000;">testvm.img,</span>size<span style="color: #110000;">=</span>12<span style="color: #110000;"> </span>--location<span style="color: #110000;"> ftp://192.168.2.1/rpm/rhel6/</span><span style="color: #110000;"> </span>--networkbridge<span style="color: #110000;">=br1 </span><b></b></span><b><span style="color: #ff0000; font-size: x-large;">–extra-args “console=tty0 console=ttyS0,115200n8″</span></b>
——————————————————–
原理:
securetty设置安全权限,允许root登录。
修改 grub.conf 让内核把输出定向至 ttyS0。
在inittab里加一个ttyS0在系统启动时会生成一个ttyS0来接收内核的数据。
关于终端的基本概念汇总:
tty(终端设备的统称):
tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。
pty(伪终端,虚拟终端):
但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,www.codesky.net 这就是虚拟终端pty(pseudo-tty)
pts/ptmx(pts/ptmx结合使用,进而实现pty):
pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。
在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种:
1、串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。
2、伪终端(/dev/pty/)
伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty /m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。telnet主机A就是通过“伪终端”与主机A的登录程序进行通信。
3、控制终端(/dev/tty)
如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。
4、控制台终端(/dev/ttyn, /dev/console)
在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上(这时也叫控制台终端)。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。/dev/console即控制台,是与操作系统交互的设备,系统将一些信息直接输出到控制台上。目前只有在单用户模式下,才允许用户登录控制台。
5 虚拟终端(/dev/pts/n)
在Xwindows模式下的伪终端.如我在KUbuntu下用konsole,就是用的虚拟终端,用tty命令可看到/dev/pts/1。
6 其它类型
Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。
tty设备包括虚拟控制台,串口以及伪终端设备。
/dev/tty代表当前tty设备,在当前的终端中输入 echo “hello” > /dev/tty ,都会直接显示在当前的终端中。
参考文档:
http://zhumeng8337797.blog.163.com/blog/static/1007689142011715111317513/
转载请注明:爱开源 » KVM客户机添加virsh console 虚拟终端支持及原理