Fedora16上装kvm Fedora17 Guest

一直想搞个虚拟机做测试用,换内核啊重启啊什么的也方便,趁五一宅家,折腾一下。

1. 环境设置

要用kvm需要有相应软硬件的支持。硬件上来说就是要CPU支持虚拟化。目前CPU基本都支持了,只是有的时候BIOS里会把虚拟化支持给关掉,这时候就需要手动打开。比如我的T400上虚拟化支持默认就是关掉的,导致我modprobe kvm-intel的时候返回ENOTSUPP错误。重启进入BIOS,找到CPU设置,有虚拟化设置相关的选项,选择ENABLE,然后完全关机(重启不管用),再重新上电设置才能生效。

软件上的支持,首先是kernel要支持。Fedora16的kernel肯定没问题。其次是安装kvm相关的软件,比如qemu-kvm qemu-img qemu-kvm-tools qemu-system-x86_64。根据自己需要吧。最后别忘了加载内核,对Intel CPU来说就是

modprobe kvm-intel

2. 安装虚拟机

首先用qemu-img生成一个文件,用作虚拟机的磁盘文件。

qemu-img create -f qcow2 f17.img 30G

这里是生成一个qcow2格式的30G大小的文件,用作Fedora 17的镜像。关于格式,可以参看qemu-img –help最后的输出,关于区别还是google吧。

然后就可以用Fedora 17的iso镜像进行安装了。

qemu-kvm -m 1024 -smp 2 -hda ./f17.img -net nic -net user -vnc localhost:1 -cdrom ./Fedora-17-TC1-x86_64-DVD.iso -boot d
 
  • -m 1024: 给虚拟机分配1024MB内存
  • -smp 2: 分配2CPU
  • -hda ./f17.img: 硬盘为f17.img
  • -net nic -net user: user mode网络,虚拟机ip是10.0.2.15,host的ip是10.0.2.2,guest用NAT模式通过host上网
  • -vnc localhost:1 :开启vnc server,让host可以连接
  • -cdrom: 指定安装iso镜像
  • -boot d: 指定从cd启动

关于guest网络设置可以有很复杂的配置,比如guest通过bridge直接从dhcp server获取ip地址,而且这个ip是可以从其他主机访问的。但这种模式需要有线连接,一般无线网卡都不支持bridge,所以我就没用这种方法。(而且这种方法配置起来也有点麻烦,对网络一直不好的我来说,有点困难……)

其实不使用vnc也是完全可以的,qemu会自动启一个图形显示。总之无论是否通过vnc,都可以正常安装系统了。我这里用了Minimal模式安装,最小系统,没有图形化界面,因为我只想通过ssh登录到虚拟机里操作。

3. 启动Guest

Guest安装好了之后就可以启动了,我用了以下启动参数

qemu-kvm -m 1024 -smp 2 -name f17 -hda ./f17.img -net nic -net user -redir tcp:2222::22 -vnc 127.0.0.1:1 -daemonize -serial tcp:localhost:4445,server,nowait -monitor tcp:localhost:4444,server,nowait
 
  • -redir tcp:2222:22 — 把host的2222端口转发到guest的22端口,这样就可以在host里 ssh -p 2222 root@localhost来登录guest了,很方便
  • -daemonize — 让qemu-kvm在后台运行
  • -serial tcp:localhost:4445,server,nowait — 把guest的serial转发到host的4445端口,并且不用等待连接,这样在host上就可以用 telnet localhost 4445来看guest的console输出了,前提是guest的kernel commandline里要加上console=ttyS0这个参数
  • -monitor tcp:localhost:4444,server,nowait — 跟上一个类似,只是把qemu的monitor输出重定向,telnet之后是qemu的控制台。注意在控制台里不要直接quit,那样会把guest直接杀掉,而是要先ctrl-]回到telnet提示符,再quit

关于serial和monitor的设置,主要参考了这里这里

4. 编译最新的kernel

由于想测试最新的upstream的kernel,那就要自己编译了

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
make localmodconfig  # 根据当前系统进行最小模块化编译,参考这里
make -j 4  # 由于 -smp 2,这里就 -j 4
make modules_install
make install

由于用了make localmodconfig,这里编译速度很快。如果想把自己关注的模块编译进去,就要事先加载模块,比如 modprobe btrfs,之后再make localmodconfig。

make install会自动设置并更新grub,重启就可以进入新内核了。不过这里为了方便调试,并把serial重定向,还需要更新一下grub的配置。因为Fedora 17里就用的是grub2了,我不太熟悉,就用了grubby这个工具来更新grub配置了。我增加了两个参数,一个是serial的,一个是kdump的

grubby --update-kernel=/boot/vmlinuz-3.4.0-rc5 --args="console=ttyS0 crashkernel=128M"

这个工具还是很好用的,具体就man吧。重启之后别忘了配置kdump并chkconfig kdump on && service kdump start

5. 开始折腾

以上都设置好之后,就可以开始折腾了,比如做一些测试,改一些代码,重新编译测试新kernel等等。我是通过从host ssh到guest来做的,并通过telnet看guest的console信息

# On host
ssh -p 2222 root@localhost  # ssh登录guest
telnet localhost 4445   # telnet看guest的console

这下能方便点折腾内核了,作为初学者就得不厌其烦慢慢折腾吧。

Leave a Reply