1. 程式人生 > >qemu建立虛擬機器,gdb除錯及網路配置

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