qemu创建虚拟机,gdb调试及网络配置

准备:  安装镜像iso,qemu source code,安装编译qemu必要的库

准备,主要参考openwrt交叉开发环境,加上常用的软件
sudo apt-get update
sudo apt-get install gcc g++ gfortran gdb vim cscope ctags git expect openssh-server binutils patch bzip2 flex bison make autoconf automake autogen gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk libexpat1-dev zlib1g-dev libglib2.0-dev pkg-config libtool python perl numactl lrzsz libssl-dev
下面如果需要重新编译libirt就需要安装
apt-get install libdevmapper-dev libpciaccess-dev libyajl-dev libxml2-dev libnl-3-dev libnl-route-3-dev
重新编译libvirt,apt-get source libvirt; ./autogen.sh --system;make


编译qemu:
./configure --prefix="/usr" --target-list=ppc64-softmmu
make
make install

创建磁盘:
qemu-img   create   -f   qcow2    qemu_ppc64le_system.qcow2   50G
qemu-img info qemu_ppc64le_system.qcow2

安装:
在server 10.100.8.213上运行。
/home/chenglin/qemu/qemu_debug_run/qemu-2.4.0/ppc64-softmmu/qemu-system-ppc64  -m 50G  -hda /home/chenglin/qemu/qemu_debug_kernel/qemu-dir/qemu_ppc64le_system.qcow2 -cdrom /home/chenglin/bake/ubuntu-14.04.2-server-ppc64el.iso -boot once=d -nographic -net nic -net tap,ifname=tap0 -vnc :0

在桌面机器上打开vncviewer(linux和ubuntu都可以)
vncviewer 10.100.8.213 5900进入安装界面,和普通一样安装, 5900是默认端口
-vnc选项后面后空格,实际上是-vnc ip:port(这里ip为空)

运行:
原始:
/home/chenglin/qemu/qemu_debug_run/qemu-2.4.0/ppc64-softmmu/qemu-system-ppc64 --enable-kvm -m 50G  -hda /home/chenglin/qemu/qemu_debug_kernel/qemu-dir/qemu_ppc64le_system.qcow2  -nographic -smp cpus=32,cores=4,threads=8,sockets=1 -net nic -net tap,ifname=tap0 -vnc :0

替换kernel:
/home/chenglin/qemu/qemu_debug_run/qemu-2.4.0/ppc64-softmmu/qemu-system-ppc64 --enable-kvm -m 50G  -hda /home/chenglin/qemu/qemu_debug_kernel/qemu-dir/qemu_ppc64le_system.qcow2  -nographic -smp cpus=32,cores=4,threads=8,sockets=1 -net nic -net tap,ifname=tap0 -vnc :0  -kernel /home/chenglin/source/linux-4.2.3/arch/powerpc/boot/zImage -append root=/dev/sda2

双硬盘:
/home/chenglin/qemu/qemu_debug_run/qemu-2.4.0/ppc64-softmmu/qemu-system-ppc64 --enable-kvm -m 50G  -hda /home/chenglin/qemu/qemu_debug_kernel/qemu-dir/ubuntu-ppc64le.img -hdb /home/chenglin/qemu/qemu_debug_kernel/qemu-dir/qemu_ppc64le.img -kernel /home/chenglin/source/linux-4.2.3/arch/powerpc/boot/zImage -append root=/dev/sda2  -nographic -smp cpus=32,cores=4,threads=8,sockets=1 -net nic -net tap,ifname=tap0 -vnc :0

常用的方法是配置好网络后安装openssh-server
apt-get install openssh-server
在host里面利用ssh登录qemuvm
ssh [email protected]

如果需要gdb debug,在启动qemu command中加入-s -S选项。
然后另开一个cmd运行。
gdb /path/vmlinux
进入gdb console,输入
(gdb) target remote :1234
Remote debugging using :1234
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x0001000000000000 in ?? ()
(gdb)
(gdb) c  (这里没有打断点,vm直接起来,可以正常用ssh登录)
Continuing.

qemu command命令窗口同步运行到vm起来,用ssh登录,我这里的目的是debug kernel trace,可以在特定的函数打断点然后对kprobe或者加入其它trace debug。
tar xvf linux-4.2.3.tar.xz
cd linux-4.2.3
cp /boot/configxxx .config
make menuconfig
make prepare
sudo apt-cache search linux-headers (搜索有哪些头文件)
sudo apt-get install linux-headers-4.2.0-23-generic
cd tools/perf
根据编译perf时的Auto-detecting system features:信息及apt-cache search搜索匹配,安装依赖的安装perf依赖包:
sudo apt-get install binutils-dev libdw-dev  libslang2-dev libelf-dev libaudit-dev  libgtk2.0-dev libperl-dev python-dev liblzma-dev libnuma-dev libiberty-dev libssl-dev
还有一个包没有安装libunwind在安装log中是OFF标志

make
出现:
Auto-detecting system features:
...                         dwarf: [ on  ]
...                         glibc: [ on  ]
...                          gtk2: [ on  ]
...                      libaudit: [ on  ]
...                        libbfd: [ on  ]
...                        libelf: [ on  ]
...                       libnuma: [ on  ]
...                       libperl: [ on  ]
...                     libpython: [ on  ]
...                      libslang: [ on  ]
...                     libunwind: [ OFF ]
...            libdw-dwarf-unwind: [ on  ]
...                          zlib: [ on  ]
...                          lzma: [ on  ]


make install(安装的目录在/home/目录



主要有两种方法,NAT和桥接


NAT设置

NAT就是虚拟机里的guestOS通过host的物理网卡eth0,连接上网。该方法方便设置,缺点是其他机器难以访问到guest。
要求host机器创建虚拟网卡tap0,guest机器和该网卡tap0设置为统一网段,并以tap0的地址作为网关,host机器上的物理网卡eth0为该tap0做NAT。

因此需要安装Uml-utilites以生成虚拟网卡tap0,tunctl -t tap0

注: 
    1. 首先内核中支持tap/tuns设备,可以通过lsmod |grep tun,查看输出有没有tun,没有的话就得重新编译内核模块加入,这个可以从查找相应资料
    2. qemu中在启动虚拟机时可以自动生成一个虚拟网卡(-net nic -net tap,ifname=tap0,script=/etc/qemu-ipup)
    3. 可以在qemu启动时加上-net user参数,直接让guest上网

步骤:
1. 首先在qemu启动时,通过ipconfig查找到其生成的虚拟网卡tapN,手动设置其ip
    ifconfig tapN 192.168.25.1 netmask 255.255.255.0
     当然也可以在/etc/qemu-ipup脚本中删除其他内容加入
    ifconfig $1 192.168.25.1 netmask 255.255.255.0     ($1 是qemu传递过来的网卡名称,即tap0)
     别忘用 ifconfig tapN 查看设置结果

2. 现在启动qemu,在gusetOS里设置网络,和tapN同一网段,网管为tapN的ip,DNS也和host机器一样
    tapN:
                  ip:                  192.168.25.1
                  broadcast:     192.168.25.255
                  netmask:       255.255.255.0
    guestOS :
                  ip:                  192.168.25.N
                  broadcast:     192.168.25.255
                  netmask:       255.255.255.0
                  getway:         192.168.25.1
                  DNS:               参照host机器eth0的设置
    相关命令 ifconfig eth0 192.168.255.123 netmask 255.255.255.0
                  route add default gw 192.168.25.1

    设置好以后,应该gusetOS就可以和host通讯里,ping以下host的eth0的ip看看。但是guestOS还不能上网,成里host-only了。

3.设置NAT
    这个其实就是在host里双网卡,其中eth0为tapN做NAT。
    首先打开ip转换功能(也可以直接编辑配置文件ip_forward=1)
    echo 1 > /proc/sys/net/ipv4/ip_forward
    然后开启NAT
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.25.0/24 -j MASQUERADE
    上句的意思为将所有来自192.168.8.0/24网段的数据包,从eth0接口转发出去
   
    这样虚拟机里的guestOS就可以上网喽。
启动虚拟机

qemu -hda /imagepath -net nic -net tap,ifname=tapN


桥接设置

基本思想是host机器上,物理网卡eth0和虚拟网卡tapN建立网桥,guestOS通过tapN连接上网,这样guestOS和host都处于物理局域网内,其他机器也可以访问guestOS。

需要安装以下两个包,bridge-tils和Uml-utilites,前者用于建立桥接,后者用于生成虚拟网卡。

步骤:
1.删除host上eth0的ip,建立网桥,将eth0加入到网桥中
    eth0的ip为192.168.8.123,删除之
    ip addr del 192.168.8.123 dev eth0
    生成网桥br0     
    brctl addbr br0
    将eth0加入网桥
    brctl addif eth0
    将eth0的ip信息配置到br0中
    ifconfig br0 192.168.8.123 。。。
    如果时dhcp则
    dhclient dr0

2.启动qemu虚拟机,之后ifconfig中会出现新的tap设备tapN,将之加入到br0中
    brctl addif br0 tapN

3.虚拟机gusetOS里设置网络参数,和eth0最初的一样,如果时dhcp则将自动获取到局域网的ip,至此就可以上网喽。

以上其实可以写一个脚本,可以参考下面的文章。


参考

KVM虚拟机和QEMU
http://jianlee.ylinux.org/Computer/Software/kvm-qemu.html

VisualBox设置桥接的方法
http://forum.ubuntu.org.cn/viewtopic.php?f=65&t=172790

Qemu使用Bridge模式让虚拟机和主系统互访和上网
http://www.wangchao.net.cn/bbsdetail_1611042.html

Qemu & Networking
http://ubuntuforums.org/showthread.php?t=457405

你可能感兴趣的:(vm)