kkkggg 发表于 2012-10-21 13:09

kvm下安装virtio驱动的freebsd

kvm下安装客户机据说采用virtio驱动效率会高一些。不过virtio是gpl授权协议的,freebsd不会默认支持。需要用户自行编译内核。现记录过程如下

宿主机OS ubuntu 12.04 desktop 64
客户机OS freebsd 9.0 64

安装qemu-kvm
apt-get install qemu-kvm

设置桥接
装了qemu-kvm后应该已经连带安装了桥接工具bridge-utils。
这个ubuntu版本默认用networkmanager管理网卡设置,不过只要手动设置/etc/network/interfaces文件,系统会自动改为使用interfaces设置。但要先确定/etc/NetworkManager/NetworkManager.conf文件中项managed=false。
修改interfaces,添加
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
我的主机一块网卡,系统中是eth0。eth0不能设置ip。桥接设备br0设为dhcp方式获取ip。

创建虚拟机磁盘
qemu-img create -f qcow2 fb64.img 40G
qcow2镜像文件格式是稀疏文件,一开始很小,会根据实际数据扩大。所以不必担心一开始设置得过大。

创建虚拟机
sudo qemu-system-x86_64 -smp 2 -m 768 -boot d -drive file=fb64.img,cache=writeback -cdrom /dev/cdrom -net nic,macaddr=00:30:18:a2:91:62 -net tap
我主机是64位的cpu,需要建立的客户机系统也是64位,所以用qemu-system-x86_64;客户机cpu设为双核(宿主机为双核);内存768MB;设为光驱启动;虚拟机磁盘文件为fb64.img,据说加上cache=writeback速度会快些;光盘我用的物理光驱;加入网卡,设定网卡MAC物理地址;网络我打算用桥接的方式,所以网卡类型选tap。

安装freebsd
跟正常安装一样。可以选择安装ssh。

添加virtio源码
这时freebsd系统是没有virtio驱动的,还不能添加virtio驱动的设备。现在磁盘设备认到的是ada0,网卡是re0。
添加virtio源码。参照了这篇文章“freebsd下增加kvm-virtio驱动支持的方法”http://i.19830102.com/freebsd%E4%B8%8B%E5%A2%9E%E5%8A%A0kvm-virtio%E9%A9%B1%E5%8A%A8%E6%94%AF%E6%8C%81%E7%9A%84%E6%96%B9%E6%B3%95/comment-page-1/#comment-328
我不懂svn的命令和知识,所以采用了笨办法:在宿主机中用wget -r -np http://svn.freebsd.org/base/projects/virtio/sys/dev/virtio和wget -r -np http://svn.freebsd.org/base/projects/virtio/sys/modules/virtio把这两个子目录树下载了下来(也可以直接在freebsd中下载,不过freebsd默认没装wget,要先装wget)。再用find (刚才下载的目录路径) -name index.html|xargs rm把目录中所有的index.html删掉,不删的话也可以。再用scp命令把两个virtio子目录树分别拷贝到/usr/src/sys/dev/和/usr/src/sys/modules/下,如scp -r (先前下载的.../dev/virtio目录的路径) root@(客户机的ip):/usr/src/sys/dev/。

编译内核
接下来按那篇文章中的叙述修改,
修改/usr/src/sys/modules/Makefile,在SUBDIR中vge \的下方添加:

virtio \

修改/usr/src/sys/conf/files.amd64,在dev/uart/uart_cpu_amd64.c (按照你的freebsd实际cpu版本选择文件,比如file.i386...)行下方添加:

dev/virtio/virtio.c optional virtio
dev/virtio/virtio_if.m optional virtio
dev/virtio/virtio_bus_if.m optional virtio
dev/virtio/virtqueue.c optional virtio
dev/virtio/pci/virtio_pci.c optional virtio_pci pci
dev/virtio/network/if_vtnet.c optional vtnet
dev/virtio/block/virtio_blk.c optional virtio_blk
dev/virtio/balloon/virtio_balloon.c optional virtio_balloon

修改/usr/src/sys/conf/kmod.mk文件,在MFILES?中添加:

dev/virtio/virtio_bus_if.m dev/virtio/virtio_if.m \

修改/usr/src/sys/amd64(按你自己的freebsd cpu版本选择)/conf/GENERIC(或者不直接修改默认的这个文件,按照一般网上教程所教的,复制为一个名为MYKEREL的文件再修改,具体请自行搜索)添加:

# Linux KVM VirtIO Drivers
device virtio # VirtIO Layout
device virtio_pci # VirtIO PCI Driver
device vtnet # VirtIO Net Interface
device virtio_blk # VirtIO Block Driver
device virtio_balloon # VirtIO Balloon Driver

接下来开始编译内核
cd /usr/src
make buildkernel KERNCONF=MYKERNEL(如果你先前把GENERIC复制为MYKERNEL的话)
安装内核
make installkernel KERNCONF=MYKERNEL
关机
shutdown -p +0

添加virtio设备
创建新的磁盘镜像文件
qemu-img create -f qcow2 fb64virtio.img 40G
使用sudo qemu-system-x86_64 -smp 2 -m 768 -drive file=fb64.img,cache=writeback -net nic,macaddr=00:30:18:a2:91:62,model=virtio -net tap -drive file=fb64virtio.img,cache=writeback,if=virtio启动
登录系统。把网卡设备名改过来。修改/etc/rc.conf
把先前的re0改为vtnet0。
用gpart show命令(freebsd9.0默认会使用gpt分区)看一下磁盘设备,可以看到多了一个vtbd0的磁盘。

给新磁盘分区
如果你不会用gpart命令分区,或者对freebsd分区不熟悉,可以用bsdinstall来自动分区。
启动bsdinstall。
问你要不要更改默认键盘布局,选no。
设置计算机名。
要你选择从哪个ftp源安装。我只是想用bsdinstall来分区,不想安装。按键盘esc键(不要点other也不要点cancel)。
选择Guided使用安装向导来分区。
选择Entire Disk,选择磁盘vtbd0。提示会清除选中的磁盘所有数据,选yes。
选择Finish。完成分区。会提示找不到安装文件,不用理会。
退出bsdinstall。

虽然已经可以认到新的virtio磁盘,但现在的系统是安装在非virtio的磁盘上的,如果只是在启动参数中把现在的磁盘加上if=virtio改为virtio磁盘,是无法启动的。要再次安装freebsd把freebsd安装到新的virtio磁盘上。

安装freebsd到virtio磁盘上
挂载virtio磁盘上的分区
先前已经给新的virtio分了区,现在把其中准备用来装系统的分区挂载上来。
mkdir /install
mount -t ufs /dev/vtbd0p2(这是vtdb0磁盘上准备用来装系统的分区,是vtbd0上的第二个分区) /install

编译安装freebsd
cd /usr/src
make world DESTDIR=/install
这一步时间比较长,根据主机配置,一般要数小时。
make distribution DESTDIR=/install

配置新的freebsd
现在ls /install/etc和/install/boot/kernel会发现配置文件很少,并且没有内核。需要把原来的freebsd的配置文件和内核拷贝过去。
cp -Rp /etc /install/
我这一步报错,提示namedb文件夹拷不了。
跳过namedb文件夹,再拷。
cd /etc
ls |grep -v namedb |xargs -I {} cp -Rp {} /install/etc/
再拷贝/boot
cp -Rp /boot /install/
现在挂载的分区信息跟新的系统启动后的分区是不一样的,所以修改/install/etc/fstab
把所有ada0改成vtbd0。

新freebsd安装完成。可以关掉了。

也许还有其它更快捷的方法来安装。比如把现在添加了virtio的系统打包成iso安装镜像再来安装,不过我不会。或者直接把所有ada0p2分区上的文件拷贝到vtbd0p2上去,不过我想系统在运行中会有很多文件拷贝不了,需要反复排除。谁有兴趣和时间的话可以尝试一下。

启动virtio磁盘上的freebsd
修改先前的启动参数,把先前的磁盘去掉,只用新的virtio的磁盘启动。先前用bsdinstall分区的时候,应该自动把/分区设为启动分区了,所有应该可以正常启动。
sudo qemu-system-x86_64 -smp 2 -m 768 -net nic,macaddr=00:30:18:a2:91:62,model=virtio -net tap -drive file=fb64virtio.img,cache=writeback,if=virtio
我这里启动正常。好了virtio磁盘和网卡可以正常使用了。

至于virtio磁盘比非virtio的快多少,我不太清楚,我没比较过。

芭比小柒 发表于 2012-10-21 21:48

svn co .................................

===

10的会有virtuio


用wget:em17:第一次见到

kkkggg 发表于 2012-10-22 11:25

回复 2# 芭比小柒

呵呵,不会svn。而且freebsd9.0默认也没装svn。
virtio是gpl的,freebsd应该以后也不会默认内核支持的。否则freebsd就会变成gpl的了。


   

芭比小柒 发表于 2012-10-22 13:04

回复 3# kkkggg


    http://svnweb.freebsd.org/base/head/sys/dev/virtio/virtio.h?revision=241470&view=markup这个是virtio.h的许可证信息(头部)
    http://svnweb.freebsd.org/base/head/sys/dev/virtio/virtio.c?revision=241470&view=markup这个是virtio.c的许可证信息

一般我看到这个结构,我会认为前一个许可证是3句版BSD许可证,后一个是2句版BSD许可证

zeissoctopus 发表于 2012-10-22 23:03

樓主說的是對,virtio 是 GPL
芭比小柒 君說的也是對,FreeBSD 10 的 base 會包含 virtio

而 FreeBSD 10 -CURRENT 所包含的 virtio 是一個乎合 BSD 許可証的 "重寫" 實作。
所以,如果閣下是用 i386 或 amd64 的 8.x 或 9.x 安裝 virtio 並不需要像樓主般大費周章了。

直接用 ports 的 /usr/ports/emulators/virtio-kmod 的就是了。

如果閣下是用 amd64 的 8.x 或 9.x ,可以到這裡下載有關的 packages
http://people.freebsd.org/~kuriyama/virtio/

如果閣下是用 i386, amd64 的 10-CURRENT,不用安裝 ports 了,因為 base 已內置了 BSD 授權版的 virtio

什么都是青蛙 发表于 2012-10-24 20:38

楼上是正解

lyhabc 发表于 2016-08-24 23:02

怎麽知道磁盘当前已经在用virtio驱动
页: [1]
查看完整版本: kvm下安装virtio驱动的freebsd