顯示具有 qemu 標籤的文章。 顯示所有文章
顯示具有 qemu 標籤的文章。 顯示所有文章

2020年5月28日 星期四

SD Card 整合

SD Card 整合 #1
2020/05/29



整合至 sdcard.img #1

截至目前為止,我們已經完成了底下事項:
1. rootfs -> OK
2. linux kernel -> OK
3. boot loader (u-boot) -> OK
4. SD card image -> OK

現在要開始進行整合的步驟:
1+2+3 -> SD card -> qemu


1. 複製 Linux 核心至 /mnt/sdcard1

~eecs/virtualarm/kernel/linux-3.16.81/arch/arm/boot# cp uImage /mnt/sdcard1

2. 複製 u-boot 檔案至 /mnt/sdcard1

u-boot
u-boot.bin

~eecs/virtualarm/bootloader/u-boot-2016.09# cp u-boot /mnt/sdcard1
~eecs/virtualarm/bootloader/u-boot-2016.09# cp u-boot.bin /mnt/sdcard1

3. 複製 rootfs 目錄至 /mnt/sdcard2

~eecs/virtualarm# rsync -av rootfs/ /mnt/sdcard2

作完之後,我們先解除掛載,然後用 qemu 來開機。


4. 測試開機

~/virtualarm$ ~/virtualarm$ qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sd_test.img,if=sd,format=raw,index=0


U-Boot 2016.09 (May 22 2020 - 09:58:23 +0800)

DRAM:  256 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC:   MMC: 0
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   smc911x-0
Hit any key to stop autoboot:  0
=> fatload mmc 0:1 0x60000000 uimage

=> setenv bootargs console=ttyAMA0,38400n8 root=/dev/mmcblk0p2

=> bootm 0x60000000

此時即可開機,並以 root 或是 leenix 帳號登錄。

5. 與 br10 連接在一起

請將底下內容另存為  runsd.sh,再來執行即可。

MACHINE=vexpress-a9
#SD_IMAGE=sdcard.img
SD_IMAGE=sd_test.img
#SD_IMAGE=sd_512M.img

#FLASH_IMG=flash.img

KERNEL_VERSION=3.16.81
UBOOT_VERSION=2016.09

MAC="52:54:12:34:00:A0"
BRIDGE=br10


MEMORY=256
#MEMORY=1024

qemu-system-arm -machine $MACHINE -m $MEMORY \
  -serial stdio \
  -drive file=./$SD_IMAGE,if=sd,format=raw,index=0 \
  -kernel ./bootloader/u-boot-$UBOOT_VERSION/u-boot \
  -net nic,macaddr=$MAC -net bridge,br=$BRIDGE




2016年10月23日 星期日

如何用 qemu 安裝虛擬機

# apt-get install qemu-system-x86

新增一個 ~/centos,並切換至此目錄:

$ mkdir ~/centos

$ cd ~/centos

作 centos 安裝硬碟檔,容量 10G

底下指令是 raw 格式:
~/centos$ qemu-img create centos.img 10G
Formatting 'centos.img', fmt=raw size=10737418240

或生 qcow2 格式
~/centos$ qemu-img create centos_qcow2.img 10G -f qcow2
Formatting 'centos_qcow2.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off refcount_bits=16

上述任一格式均可安裝 centos,目前 centos 最新的 ISO 檔名為:

CentOS-7-x86_64-DVD-1511.iso

我們將此檔複製至 ~/centos 目錄中,然後執行底下指令確定系統是否有載入 kvm 模組:

$ lsmod |grep kvm
kvm_intel             163840  0
kvm                   438272  1 kvm_intel

接著開始安裝,請執行底下指令:

~/centos$ qemu-system-x86_64  -enable-kvm -m 4096 -drive file=centos.img,format=raw -cdrom CentOS-7-x86_64-DVD-1511.iso -boot d

此時會進入 CentOS 安裝畫面,選擇:

Software Selection -> Server with GUI

Begin Installation 畫面中要設定 root 密碼及一般使用,此時會進行 centos 的安裝
流程,等安裝完畢後重新開機並在原啟動畫面按 Ctrl+C 中斷虛擬機。

我們再執行底指令重啟虛擬機:

~/centos$ qemu-system-x86_64  -enable-kvm -m 4096 -drive file=centos.img,format=raw -cdrom CentOS-7-x86_64-DVD-1511.iso -boot c


接著就有虛擬機可用,那麼目前 centos.img 就是我們所安裝的虛擬 linux 環境,如果要
作備份,請先把虛擬機關閉,然後執行:

~/centos$ qemu-img convert -O raw centos.img centos_backup.img

執行完畢後會出現一個 centos_backup.img 檔,這就是我們虛擬機的備份檔,以後玩虛
擬機是玩 centos.img 這個檔案,萬一玩死掉了可以執行底下指令來復原:

~/centos$ qemu-img convert -O raw centos_backup.img centos.img

復原之後就可以繼續玩 centos.img 檔。

2014年6月18日 星期三

自行編譯「完整版 Linaro Qemu」

Linaro Qemu 是 Linaro 基金會所支援的 Qemu,它較官方的 Qemu 支援更多 ARM 硬體,因此十分適合用在嵌入式系統開發上面。qemu linaro 有一項特異功能是使用 usb redir net 以使用網路傳遞 usb 通訊協定, 但是 debian wheezy 的函式庫過於老舊以致於無法將 qemu linaro 的這項功能啟動,在此介紹如何自行外加新版的函式庫以啟動此功能。

假設在 qemu linaro 目錄下執行 ./configure 出現:


ERROR: pixman not present. Your options:
         (1) Preferred: Install the pixman devel package (any recent
             distro should have packages as Xorg needs pixman too).
         (2) Fetch the pixman submodule, using:
             git submodule update --init pixman

其解決方式如下:

apt-get install libpixman-1-dev

若是 ./configure 出現問題:

ERROR: DTC not present. Your options:
         (1) Preferred: Install the DTC devel package
         (2) Fetch the DTC submodule, using:
             git submodule update --init dtc

其解決方式為:

apt-get install libfdt-dev

之後有可能出現的錯誤訊息是:

GTK support       no

的訊息,我們可以檢視 configure 檔案,裡面有底下段落:

##########################################
# GTK probe

if test "$gtk" != "no"; then
    gtkpackage="gtk+-$gtkabi"
    if test "$gtkabi" = "3.0" ; then
      gtkversion="3.0.0"
      vtepackage="vte-2.90"
      vteversion="0.32.0"
    else
      gtkversion="2.18.0"
      vtepackage="vte"
      vteversion="0.24.0"

.. (中略)

    elif ! $pkg_config --exists "$vtepackage >= $vteversion"; then
        if test "$gtk" = "yes" ; then
            error_exit "libvte not found (required for gtk support)"

.. (下略)

我們可以看到上面有一行:

error_exit "libvte not found (required for gtk support)"

此訊息表示 libvte-dev 之類名稱的套件沒有安裝,我們可以利用 aptitude 安裝 libvte-dev 套件,再執行 ./configure 看看。


seccomp support   no

這表示我們沒有安裝 libseccomp-dev 套件,但是此套件目前在 Wheezy 底下並沒有出現,必須設定 Debian backports 才可以安裝,設定方式請在 /etc/apt/sources.list 中加入底下內容:

#Wheezy Backports
deb http://ftp.tw.debian.org/debian wheezy-backports main

接著執行 apt-get update; apt-get install libseccomp-dev 即可安裝。安裝完畢後我們再執行

./configure

其狀態如下:

seccomp support   yes


1. 下載必要函式庫


apt-get install

libnss3-dev
libudev-dev
libpng12-dev
libghc6-zlib-dev
libogg-dev
libglobus-openssl-dev
libxrandr-dev
libxfixes-dev
libjpeg8-dev
libsasl2-dev
libiscsi-dev
librbd-dev
xfslibs-dev
libbrlapi-dev
libbluetooth-dev
libxen-dev


spice - http://spice-space.org/download.html

http://www.spice-space.org/download/releases/spice-0.12.5.tar.bz2
http://www.spice-space.org/download/releases/spice-protocol-0.12.7.tar.bz2

http://www.spice-space.org/download/usbredir/usbredir-0.7.tar.bz2
https://alioth.debian.org/frs/download.php/3842/pcsc-lite-1.8.7.tar.bz2
#https://alioth.debian.org/frs/download.php/3757/pcsc-lite-1.8.6.tar.bz2


http://jaist.dl.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.19/libusb-1.0.19.tar.bz2



但是在編 spice 時會說 pixman 版本太舊,因此我們還要自行安裝新版 pixman。

pixman - http://cgit.freedesktop.org/pixman/
http://cgit.freedesktop.org/pixman/snapshot/pixman-0.28.2.tar.gz

libcacard - http://spice-space.org/download/libcacard/

http://spice-space.org/download/libcacard/libcacard-0.1.2.tar.bz2


2. 安裝

pcsc-lite-1.8.7 安裝步驟:

tar xfva pcsc-lite-1.8.7.tar.bz2
cd pcsc-lite-1.8.7
./configure
make
# make install



libcacard 安裝步驟:

tar xfva libcacard-0.1.2.tar.bz2
./configure

錯誤訊息:

checking for NSS... no
configure: error: Package requirements (nss) were not met:

No package 'nss' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables NSS_CFLAGS
and NSS_LIBS to avoid the need to call pkg-config.

請安裝

libnss3-dev

即可。

make -j N

make install

libusb-1.0.18 安裝步驟:

tar xfva libusb-1.0.18.tar.bz2

cd libusb-1.0.18

./configure

make -j N

#make install

usbredir-0.7 安裝步驟:

tar xfva usbredir-0.7.tar.bz2
cd usbredir-0.7
./configure
make -j N
#make install


spice-protocol-0.12.7 安裝

tar xfva spice-protocol-0.12.7.tar.bz2
cd spice-protocol-0.12.7
./configure
make -j N
#make install

#cp /usr/local/share/pkgconfig/spice-protocol.pc /usr/lib/pkgconfig/

pixman 安裝步驟:

tar xfva pixman-0.28.2.tar.gz
cd pixman-0.28.2
./autogen
./configure
make -j N

# make install

celt 安裝步驟:

請注意 SPICE 只接受 CELT 0.51 版,因此不要安裝比此新的版本:

wget http://downloads.us.xiph.org/releases/celt/celt-0.5.1.3.tar.gz
tar xfv celt-0.5.1.3.tar.gz
cd celt-0.5.1.3
./configure
make -j N
#make install
cd /usr/local/lib/pkgconfig
/usr/local/lib/pkgconfig# ln -s celt.pc celt051.pc

spice

spice 安裝步驟:

tar xfva spice-0.12.5.tar.bz2
cd spice-0.12.5

./configure --enable-smartcard

但是執行此指令不一定能順利執行,大多數的情況下會有錯誤,我們要一一處理,例如:


錯誤訊息:

checking for CELT051... no
configure: error: Package requirements (celt051 >= 0.5.1.1) were not met:

No package 'celt051' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables CELT051_CFLAGS
and CELT051_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.


如果遇上以上錯誤訊息的話請先安裝先前所提到的 celt 0.51 套件:

錯誤訊息:

checking for pyparsing python module... not found
configure: error: pyparsing python module is required to compile this package

請安裝底下套件:

python-pyparsing

即可。

錯誤訊息:

checking sasl/sasl.h usability... no
checking sasl/sasl.h presence... no
checking for sasl/sasl.h... no
checking for sasl_client_init in -lsasl2... no
checking for sasl_client_init in -lsasl... no
configure: error: Missing required Cyrus SASL development package

請安裝底下套件:

libsasl2-dev

即可


錯誤訊息:

checking for SMARTCARD... no
configure: error: Package requirements (libcacard >= 0.1.2) were not met:

No package 'libcacard' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SMARTCARD_CFLAGS
and SMARTCARD_LIBS to avoid the need to call pkg-config.

請依先前步驟安裝 libcacard 0.1.2 即可。

qemu
tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
cd qemu-linaro-1.7.0-2014.01
./configure

time make -j 4

su

# make install


 安裝完畢後可以執行底下指令來看看 qemu-linaro 版是否能正確執行:

qemu-system-arm -version




如果出現底下錯誤訊息的話,表示動態連結函式庫沒設定好:

qemu-system-arm: error while loading shared libraries: libspice-server.so.1: cannot open shared object file: No such file or directory



請以 root 權限執行:

# ldconfig


再回到一般使用者權限即可執行:

$ qemu-system-arm -version
QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard

2014年3月27日 星期四

Qemu 執行時之問題排除

Qemu 是建置虛擬電腦教室環境中不可或缺的工具,我們所使用的 Qemu 是自行編譯下載,在執行時可能會出現底下錯誤需要處理:

設定qemu-bridge-helper 權限

qemu-bridge-helper 需要有 root 的權限才能執行,如果沒有 root 權限的話在啟動 qemu 時會出現底下錯誤訊息

failed to create tun device: Operation not permitted
failed to launch bridge helper
qemu-system-x86_64: -net bridge,br=br10: Device 'bridge' could not be initialized

由於我們希望給一般使用者執行 qemu-bridge-helper 的權限,而其安裝目錄在 /usr/local/libexec,我們可以執行底下指令以觀看此檔權限:

ls -l /usr/local/libexec/qemu-bridge-helper


其輸出如下所示:

-rwxr-xr-x 1 root staff 39624 Mar  8 00:08 qemu-bridge-helper

為了讓一般使用者可以執行,此檔案必須具有 SETUID,如此一來才有可以執行之權限,請執行底下指令來設定:

chmod u+s /usr/local/libexec/qemu-bridge-helper

此時再觀察其屬性,其輸出如下所示:

-rwsr-xr-x 1 root staff 39624 Mar  8 00:08 qemu-bridge-helper


我們可以發現其屬性由 rwxr-xr-x 改成 rw{\bf s}r-xr-x,這表示此檔已具有 SEDUID 屬性,可以提供一般使用者使用了。

設定可執行之橋接網路權限

在 Qemu 執行時,會檢查 /usr/local/etc/qemu/bridge.conf 中之權限,如果沒(有)設定的話,在執行 Qemu 時會出現底下的錯誤訊息:

access denied by acl file
failed to launch bridge helper
qemu-system-x86_64: -net bridge,br=br10: Device 'bridge' could not be initialized

以本書來說,所要支援之橋接網路介面為 br10,因此我們必須在 /usr/local/etc/qemu/bridge.conf 檔中增加一行 allow br10 之設定,如底下所示。

allow br0
allow br1
allow br2
allow br10

上述設定是說橋接網路介面 br0、br1、br2 以及 br10 都可以使用,此時我們再執行 Qemu 的話就不會(有)先前的錯誤訊息了。





找不到 bios.bin

如果在執行 qemu 時出現底下錯誤,那表示 seabios 沒有安裝或是作正確的連結。

qemu: could not load PC BIOS 'bios.bin'

要解決此問題,請先安裝 seabios 套件,然後以 root 權限在 /usr/local/share/qemu 目錄下執行:

/usr/local/share/qemu# ln -sf /usr/share/seabios/*.bin .

找不到 kvmvapic.bin

如果在執行 qemu 時出現底下錯誤,那表示 seabios 沒有安裝或是作正確的連結。

Could not open option rom 'kvmvapic.bin': No such file or directory

要解決此問題,請先安裝 seabios 套件,然後以 root 權限在 /usr/local/share/qemu 目錄下執行:

/usr/local/share/qemu# ln -sf /usr/share/seabios/optionrom/*.bin .

2013年11月25日 星期一

安裝 qemu linaro 版

目的:安裝 qemu linaro 版

說明:qemu linaro 版是第三方協力廠商所開發的 qemu 版,其功能較原始官方版本更強,例如支援 beagle 模擬,因此在此我們介紹如何下載、編譯、安裝 qemu linaro 版。

下載:qemu linaro 版下載網址如下:
      https://launchpad.net/qemu-linaro/

      請下載最新版本,以本例來說,其檔名是 qemu-linaro-1.7.0-2014.01.tar.gz

      wget ftp://120.117.72.71/files/qemu-linaro-1.7.0-2014.01.tar.gz

解開:tar xfva qemu-linaro-1.7.0-2014.01.tar.gz
      解開後會出現一個名為 qemu-linaro-1.7.0-2014.01 的目錄,請切換至此目錄中。


要編譯前要先安裝底下套件:

zlib1g-dev
pkg-config
libcurl4-openssl-dev
libsdl-dev
libsasl2-dev
libaio-dev
libvde-dev
libvdeplug2-dev
uuid-dev
libcap-ng-dev
libpixman-1-dev


編譯:

./configure


若是 ./configure 出現底下錯誤的話:

ERROR: DTC not present. Your options:
         (1) Preferred: Install the DTC devel package
         (2) Fetch the DTC submodule, using:
             git submodule update --init dtc

其解決方法在:

http://lists.gnu.org/archive/html/qemu-devel/2013-11/msg03494.html

請再安裝底下套件

device-tree-compiler
libfdt-dev


time make -j N

若有錯誤訊息,請設法解決。


安裝:

# make install


驗證:

在 /usr/local/bin 目錄下有一堆 qemu-system-???? 的檔案,如下所示:

/usr/local/bin/qemu-system-alpha         /usr/local/bin/qemu-system-or32
/usr/local/bin/qemu-system-arm           /usr/local/bin/qemu-system-ppc
/usr/local/bin/qemu-system-cris          /usr/local/bin/qemu-system-ppc64
/usr/local/bin/qemu-system-i386          /usr/local/bin/qemu-system-ppcemb
/usr/local/bin/qemu-system-lm32          /usr/local/bin/qemu-system-s390x
/usr/local/bin/qemu-system-m68k          /usr/local/bin/qemu-system-sh4
/usr/local/bin/qemu-system-microblaze    /usr/local/bin/qemu-system-sh4eb
/usr/local/bin/qemu-system-microblazeel  /usr/local/bin/qemu-system-sparc
/usr/local/bin/qemu-system-mips          /usr/local/bin/qemu-system-sparc64
/usr/local/bin/qemu-system-mips64        /usr/local/bin/qemu-system-unicore32
/usr/local/bin/qemu-system-mips64el      /usr/local/bin/qemu-system-x86_64
/usr/local/bin/qemu-system-mipsel        /usr/local/bin/qemu-system-xtensa
/usr/local/bin/qemu-system-moxie         /usr/local/bin/qemu-system-xtensaeb

我們可以執行

/usr/local/bin/qemu-system-arm -version

或是

/usr/local/bin/qemu-system-x86_64 --version


其輸出如下:


QEMU emulator version 1.7.0 (qemu-linaro 2014.01), Copyright (c) 2003-2008 Fabrice Bellard


我們可以看過上述字串有 qemu-linaro 2014.01,這表示我們所安裝的 qemu linaro 已經是最新版了。

2013年11月11日 星期一

使用 qemu 啟動虛擬 ARM 機器

0. 先以 qemu 安裝 ARM 版 Debian Linux 至 arm.img

檔案位置:

~/qemu_image/                   -> 所有虛擬 ARM 檔案目錄
            /arm.img            -> 虛擬 ARM 硬碟映像檔
            /vmlinuz-3.2.0-4-versatile          -> ARM 開機核心
            /initrd.img-3.2.0-4-versatile       -> ARM 開機 initrd
            /runarm.sh          -> 開機 script


0. 先執行底下指令:
# losetup -a
此時會看到目前沒有輸出。

1. 接著將開機核心擷取出來:

# losetup /dev/loop0 arm.img
再執行
# losetup -a
其輸出如下:
/dev/loop0: [0831]:31198060 (/home/herman/qemu_image/arm.img)
這表示 /dev/loop0 與 arm.img 已經連接 (attach) 在一起,之後我們可以使用 fdisk -lu /dev/loop0 來觀看是否為當初安裝時所分割的磁區:

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            2048     3913727     1955840   83  Linux
/dev/loop0p2         3915774     4192255      138241    5  Extended
/dev/loop0p5         3915776     4192255      138240   82  Linux swap / Solaris

開機核心位於 ?

/boot

因此,我們要將 /dev/loop0p1 掛載上來,再至其 boot 目錄擷取 ARM 版 Linux 核心及 initrd。

losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0

接著我們可以將 /dev/loop1 掛載至 /mnt 目錄下:

mount /dev/loop1 /mnt

掛載完後可以執行 df -h /mnt 來觀看結果:

檔案系統        容量  已用  可用 已用% 掛載點
/dev/loop1      1.9G  506M  1.3G   30% /mnt

接著可以至 /mnt/boot 目錄下擷取 Linux 核心

 cp /mnt/boot/initrd.img-3.2.0-4-versatile .
cp /mnt/boot/vmlinuz-3.2.0-4-versatile .

如此一來即完成核心擷取,接下來可以進行開機作業。

2. 使用 qemu 來開機

請將底下指令另存 runarm.sh 以便進行開機:

qemu-system-arm -M versatilepb -m 512 \
        -kernel ./vmlinuz-3.2.0-4-versatile \
        -initrd ./initrd.img-3.2.0-4-versatile \
        -hda arm.img \
        -append "root=/dev/sda1"


接著請執行 sh runarm.sh

 3. 登入系統,確定我們是在 ARM 的機器中

請在登入畫面使用 root 帳號、密碼,看能不能登入,並執行

cat /proc/cpuinfo

來觀看 CPU 狀態。


如果在 qemu 視窗中點擊滑鼠將會使 qemu 把滑鼠「抓走」,此時我們要按

Ctrl+Alt 讓 qemu 將滑鼠「釋放」出來,否則會沒有遊標可用,要確定目前

滑鼠是否有被 qemu 抓走請看 qemu 之狀態列。

在 qemu 畫面下按 Ctrl+Alt+f 可以放大/縮小全螢幕狀態。

 4. 安裝 arm 的 Xwindow,並進入 Xwindow 環境

4.1 將 /etc/apt/sources.list 中的鏡像站改至校內:

加上這兩行

deb ftp://120.117.72.71/debian wheezy main contrib non-free
deb ftp://120.117.72.71/debian wheezy-updates main contrib non-free

將 deb-src 註解,保留 security.debian.org 設定


修改完畢後執行 apt-get update

再安裝 xorg icewm 套件

4.2 安裝完畢後以一般 user 登入

登入完畢後執行

startx

看看能不能進入 Xwindow

5. 清除已安裝之 .deb 檔案

# apt-get clean

清除完畢可以執行 df -h 來看目前磁碟空間

6. 依照 X86 流程,安裝 iceweasel,並觀察能否上網。

2012年11月21日 星期三

安裝 qemu arm 版 Debian Linux

在 Qemu 安裝 ARM 環境

準備

1. ARM iso 檔 - http://debian.nctu.edu.tw/debian-cd/6.0.6/armel/iso-cd/debian-6.0.6-armel-CD-1.iso

2. ARM installer 檔案
a. http://debian.nctu.edu.tw/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/initrd.gz
b. http://debian.nctu.edu.tw/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/vmlinuz-2.6.32-5-versatile

3. ARM 安裝 img 檔,自行建立,指令如下:

qemu-img create arm.img 1G

目錄配置:

~/qemu-arm/arm.img         
                /initrd.img-2.6.32-5-versatile
                /vmlinuz-2.6.32-5-versatile
                /install/initrd.gz
                /install/vmlinuz-2.6.32-5-versatile
                /install/debian-6.0.6-armel-CD-1.iso

執行安裝

請在 ~/qemu-arm 目錄執行底下指令:

qemu-system-arm -M versatilepb \
 -kernel ./install/vmlinuz-2.6.32-5-versatile \
 -initrd ./install/initrd.gz \
 -cdrom  ./install/debian-6.0.6-armel-CD-1.iso \
 -hda arm.img \
 -m 1024

請注意安裝流程中硬碟分割區只要一個即可。安裝完畢重新開機後會進入安裝畫面,請執原始指令終端機按 Ctrl+C 將 qemu中斷。接著我們可以萃取「正常開機核心」。

萃取「正常開機核心」。

安裝完後以 losetup 將 arm.img 掛載,然而複製 /boot 底下的

initrd.img-2.6.32-5-versatile
vmlinuz-2.6.32-5-versatile

出來,然後執行底下指令即可開機:

qemu-system-arm -M versatilepb -m 512 -boot c \
        -kernel vmlinuz-2.6.32-5-versatile \
        -initrd initrd.img-2.6.32-5-versatile \
        -hda arm.img \
        -append "root=/dev/sda1"

2012年10月17日 星期三

如何建立虛擬 SD card

#2020/04/20 改版

如何建立虛擬 SD card


0. 目標:建立一個 sdcard.img,將其分割為二個分割區

part1: 80 M
part2: 920 M

並將第一個分割區以 vfat 方式格式化,第二個分割區以 ext4 方式格式化,而且兩個分割區都要能掛載。


1. 使用 dd 指令建立 1G 之 sdcard.img

dd if=/dev/zero of=sdcard.img bs=1M count=1024

作完後之輸出如下所示:

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 17.8515 s, 60.1 MB/s

我們可以使用 file 及 hexdump 這兩個指令來檢視 sdcard.img,其操作如下:

file sdcard.img

其輸出為:

sdcard.img: data

hexdump sdcard.img

其輸出為:

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
40000000

以上輸出表示此檔案之內容為 00 (也就是 ASCII 表中之 Null 字元),其位址從 0x0000000 一直至 0x40000000 也就是 1G。

到此為止,我們已完成一個空的 sdcard.img。接著我們要使用 losetup 來連接此檔案至 /dev/loop0 裝置以便進行分割及格式化。

2. 使用 losetup 指令

要使用 losetup 指令,請先切換至 root 權限,我們先看目前是否有 /dev/loop 裝置,其指令如下所示:

# losetup -a

理論上目前沒有任何輸出。接著請執行底下指令將 /dev/loop0 與 sdcard.img 「連接」在一起。

# losetup /dev/loop0 sdcard.img

此時我們即將 sdcard.img 「連接」至 /dev/loop0 這個裝置。


3. 使用 fdisk 分割 /dev/loop0

將第一個分割區切成 80 MB
將第二個分割區切成剩下空間 (920 MB)

作完後將分割區狀況存入並退出 fdisk,我們可以執行底下指令來觀看 /dev/loop0 狀態。

fdisk -lu /dev/loop0

其輸出如下所示:

# fdisk -lu /dev/loop0
Disk /dev/loop0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa5e072a5

Device       Boot  Start     End Sectors  Size Id Type
/dev/loop0p1        2048  165887  163840   80M  b W95 FAT32
/dev/loop0p2      165888 2097151 1931264  943M 83 Linux


在存分割表 (w 指令)時如果出現底下訊息要將 /dev/loop0 與 sdcard.img 分離,再重新連接才可以繼續往下作。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 22: 不適用的引數.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


** 使用 losetup 將 /dev/loop0 與 sdcard.img 分離 **

# losetup -d /dev/loop0

我們可以執行 losetup -a 來看是否已解除連接。若要重新連接請執行以下指令:

# losetup /dev/loop0 sdcard.img

連接完可以執行

fdisk -lu /dev/loop0

來觀察其輸出是否如上所示。

4. 格式化/掛載/解掛/解除連結

4.1 格式化與掛載

我們統一將第 1 個分割區格式化為 fat 格式,第 2 個分割區格式化為 ext4 格式以便 u-boot 載入系統核心並掛載 rootfs。在格式化前我們需注意每一個分割區的 sector 數目,例如第 1 個分割區的 Sectors 為 163840,而第 2 個分割區則為 1931264。這兩個數字將分別應用在格式化上,但是在格式化前,我們要將第 1 個分割區連接至 /dev/loop1,第 2 個分割區連接至 /dev/loop2,請執行底下指令連接 /dev/loop1:

losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0

接著再執行底下指令連接 /dev/loop2:

losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0

上述指令都有使用到 expr 這個命令,expr 可以拿來作簡單的四則運算,例如:

expr 1 + 1 其輸出為 2
expr 2 - 1 其輸出為 1

但若要進行乘法的話必須使用 \* 而非 *,因為 * 是特殊字元。

expr 2 * 3 -> expr: 格式錯誤
expr 2 \* 3 -> 6

至於除法範例如下:

expr 6 / 2 -> 2
expr 6 / 4 -> 1 (沒有餘數)

`expr a \* b` 表示「傳回」 a * b 之值。

當我們要連接 /dev/loop1 (第 1 個分割區) 及 /dev/loop2 (第 2 個分割區)時,必須跳過相對應的 offset,這個 offset 就由 expr 來替我們作運算。當 /dev/loop1 及 /dev/loop2 都連接上時,我們可以執行:

losetup -a

此時會出現底下輸出,告訴我們 /dev/loop1 及 /dev/loop2 都完成連接。

/dev/loop0: [0805]:2540233 (/home/herman/qemu_image/arm/sdcard.img)
/dev/loop1: [0005]:1312 (/dev/loop0), offset 32256
/dev/loop2: [0005]:1312 (/dev/loop0), offset 90478080

接著我們即可真正對 /dev/loop1 及 /dev/loop2 進行格式化:

mkfs.msdos -s 2 /dev/loop1 81920

mkfs.ext4 /dev/loop2 965632    -> 此指令不用,以免 u-boot 無法掛載

mkfs.ext4 -O ^metadata_csum,^64bit /dev/loop2  -> 改用這個指令來分割虛擬 sdcard

格式化完畢後我們可以進行掛載以便待會複製檔案,我們統一掛載至

/mnt/sdcard1 及 /mnt/sdcard2 目錄。

Q: 若以上兩個目錄不存在,該如何建立 ?

mkdir -p /mnt/sdcard1 /mnt/sdcard2


建好目錄後可以進行掛載,指令如下:

mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2

我們可以執行 df -h 來檢查是否有正確掛載,其輸出如下:

檔案系統              Size  Used Avail Use% 掛載點
/dev/loop1             87M     0   87M   0% /mnt/sdcard1
/dev/loop2            919M   18M  855M   2% /mnt/sdcard2

接下來,我們可以針對虛擬 SDCARD 開始複製檔案以便使用 Qemu 開機模擬。

4.2 解掛

4.2.1 解掛目錄

# umount /mnt/sdcard1 /mnt/sdcard2

4.2.2 解掛 loop,注意:順序要跟掛 loop 反過來作。

# losetup -d /dev/loop2
# losetup -d /dev/loop1
# losetup -d /dev/loop0

檢查是否完全解開:

# losetup -a


5. 植入 bootloader、kernel 以及 rootfs

5.1 bootloader 所需檔案

MLO
u-boot
u-boot.bin
u-boot.img
uEnv.txt        -> 開機設定檔

5.2 kernel 所需檔案

uImage

請將上述檔案複製至 /mnt/sdcard1 目錄


5.3 如何建立 rootfs

Q: 請問什麼是 rootfs ?
a. 最簡單的作法:將 qemu 中的 rootfs 拿來改,但是要記得瘦身。

b. 另一個簡單的作法:拿現成的來用,網路上有一位高手叫 Robert Nelson,
他所提供的下載網址在:


http://rcn-ee.net/deb/minfs/

目前最新的下載檔案是:

http://rcn-ee.net/deb/minfs/wheezy/debian-7.7-minimal-armel-2014-11-10.tar.xz
c. 修改 rootfs

要將 rootfs 植入 /mnt/sdcard2 中請完成底下工作:

c.1 將 rootfs 存入 /mnt/sdcard2
c.2 將核心模組存入 /mnt/sdcard2/lib/modules 目錄
c.3 修改設定檔,修改內容如下:

c.3.a 將 /etc/inittab 存入 /mnt/sdcard2/etc 中,並將最後一行改為
T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

c.3.b 將 /mnt/sdcard2/etc/fstab 修改如下:
proc             /proc proc defaults           0 0
/dev/mmcblk0p2   /     auto errors=remount-ro  0 1
/dev/mmcblk0p1   /boot auto defaults           0 0

c.3.c 將 /mnt/sdcard2/etc/network/interfaces 修改如下:
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

c.3.d 將 /etc/sdcard2/etc/hostname 修改如下:
leenix

c.3.e 將 /etc/resolv.conf 修改如下:
nameserver 8.8.8.8

6. 當所有檔案完成複製後,我們必須將 sdcard.img 解除掛載及解除連接,請執行以下指令:

umount /mnt/sdcard1 /mnt/sdcard2 -> 先解除目錄掛載

losetup -d /dev/loop2   -> 再依順序解除 loop 連接,請依後進先出的原則來解除
losetup -d /dev/loop1
losetup -d /dev/loop0   -> 至此全部解除連接,我們可以執行

losetup -a 來確認。


7. 測試虛擬 sdcard.img

當我們都完成檔案複製後,我們可以使用 qemu 來測試所完成之虛擬 sdcard.img,測試指令如下:

 qemu-system-arm -M beagle -m 512 -nographic -sd ./test.img -clock unix \
        -device usb-mouse -device usb-kbd \
        -usb -device usb-net,netdev=mynet -netdev user,id=mynet

2012年9月26日 星期三

qemu 下載與安裝


1. 下載:
Qemu 下載網頁 - http://wiki.qemu.org/Download

2. 解壓縮:
tar xfva qemu-2.5.0.tar.bz2
解開後會出現  qemu-2.5.0 目錄

3. 設定前安裝套件:
libtool
zlib1g-dev
pkg-config
libsdl1.2-dev
libcurl4-openssl-dev
libsasl2-dev
libaio-dev
libvde-dev
libvdeplug2-dev
uuid-dev
libcap-ng-dev

4. 設定:
在 qemu-2.5.0 目錄下執行:

./configure

請注意底下兩個參數一定要設定成功:

SDL support       yes
KVM support       yes

如果有類似底下訊息時:
lzo support        no
bzip2 support    no


我們可以編輯 configure 這個檔案,搜尋 bzip2 與 lzo 這兩個關鍵字,此時會發現有底下片段,分別是:


        if test "$bzip2" = "yes"; then
            feature_not_found "libbzip2" "Install libbzip2 devel"
        fi
以及
        if test "$lzo" = "yes"; then
            feature_not_found "liblzo2" "Install liblzo2 devel"
        fi

這表示我們的系統中沒有安裝 bzip2 devel 以及 lzo devel 套件,在 Debian 底下,此兩個套件的名稱為:
libbz2-dev
liblzo2-dev
將上述兩個套件安裝,再執行 ./configure 後會發現 lzo 及 bzip2 都已支援,其訊息如下:

lzo support       yes
bzip2 support   yes

其它找不到套件的訊息依此類推來解決,理論上可以作到的訊息如下:

 ./configure
Disabling libtool due to broken toolchain support
Install prefix    /usr/local
BIOS directory    /usr/local/share/qemu
binary directory  /usr/local/bin
library directory /usr/local/lib
module directory  /usr/local/lib/qemu
libexec directory /usr/local/libexec
include directory /usr/local/include
config directory  /usr/local/etc
local state directory   /usr/local/var
Manual directory  /usr/local/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /home/herman/tmp/qemu/qemu-2.5.0
C compiler        cc
Host C compiler   cc
C++ compiler      c++
Objective-C compiler cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include  -g
QEMU_CFLAGS       -I/usr/include/pixman-1   -fPIE -DPIE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common  -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong     -I/usr/include/libpng12  -I/usr/local/include/spice-server -I/usr/local/include/cacard -I/usr/local/include -I/usr/local/include/spice-1 -I/usr/include/nss -I/usr/include/nspr -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1  -I/usr/local/include/cacard -I/usr/include/nss -I/usr/include/nspr  -I/usr/local/include/libusb-1.0  -I/usr/local/include
LDFLAGS           -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g
make              make
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          x86_64
host big endian   no
target list        aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblaze-softmmu microblazeel-softmmu mips-softmmu mips64-softmmu mips64el-softmmu mipsel-softmmu moxie-softmmu or32-softmmu ppc-softmmu ppc64-softmmu ppcemb-softmmu s390x-softmmu sh4-softmmu sh4eb-softmmu sparc-softmmu sparc64-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensa-softmmu xtensaeb-softmmu aarch64-linux-user alpha-linux-user arm-linux-user armeb-linux-user cris-linux-user i386-linux-user m68k-linux-user microblaze-linux-user microblazeel-linux-user mips-linux-user mips64-linux-user mips64el-linux-user mipsel-linux-user mipsn32-linux-user mipsn32el-linux-user or32-linux-user ppc-linux-user ppc64-linux-user ppc64abi32-linux-user ppc64le-linux-user s390x-linux-user sh4-linux-user sh4eb-linux-user sparc-linux-user sparc32plus-linux-user sparc64-linux-user tilegx-linux-user unicore32-linux-user x86_64-linux-user
tcg debug enabled no
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
pixman            system
SDL support       yes
GTK support       yes
GTK GL support    no
GNUTLS support    no
GNUTLS hash       no
libgcrypt         yes
nettle            no ()
libtasn1          yes
VTE support       yes
curses support    yes
virgl support     no
curl support      yes
mingw32 support   no
Audio drivers     oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support    no
VNC support       yes
VNC SASL support  yes
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    yes
bluez  support    yes
Documentation     yes
PIE               yes
vde support       yes
netmap support    no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
RDMA support      no
TCG interpreter   no
fdt support       yes
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
sigev_thread_id   yes
uuid support      yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
Trace backends    nop
spice support     yes (0.12.7/0.12.5)
rbd support       yes
xfsctl support    yes
smartcard support yes
libusb            yes
usb net redir     yes
OpenGL support    no
libiscsi support yes
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   yes
coroutine backend ucontext
coroutine pool    yes
GlusterFS support no
Archipelago support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   yes
QOM debugging     yes
vhdx              yes
lzo support       yes
snappy support    no
bzip2 support     yes
NUMA host support no
tcmalloc support  no
jemalloc support  no


5. 編譯 qemu

請在設定完成後執行:

make -j 8 (8 核)

6. 安裝

請以 root 權限執行底下指令:

make install

將 qemu 安裝在 /usr/local/bin 目錄下

7. 測試

X86 版本:

請執行底下指令:

$ qemu-system-x86_64 -version
qemu-system-x86_64: error while loading shared libraries: libiscsi.so.1: cannot open shared object file: No such file or directory

我們會看到 qemu-system-x86_64 抱怨找不到 libiscsi.so.1,這最主要的原因目前的 libiscsi 這個動態連結函式庫的檔名已經是 libiscsi.so.2 了,所以 qemu 找不到 libiscsi.so.1,要解決此問題,我們要手動新增這個檔案,請以 root  權限切換至 /usr/lib/x86_64-linux-gnu 目錄,執行:

/usr/lib/x86_64-linux-gnu# ls -l libiscsi.so*
lrwxrwxrwx 1 root root     18 Jul 31  2014 libiscsi.so -> libiscsi.so.2.1.12
lrwxrwxrwx 1 root root     18 Jul 31  2014 libiscsi.so.2 -> libiscsi.so.2.1.12
-rw-r--r-- 1 root root 143344 Jul 31  2014 libiscsi.so.2.1.12

可以看到目前只有 libiscsi.so.2 這個檔案,在此目錄中要再新增 libiscsi.so.1 連結檔,指令如下:

/usr/lib/x86_64-linux-gnu# ln -s libiscsi.so.2.1.12 libiscsi.so.1

之後可以再執行 ls 確認一下連結檔是否已建立成功:
/usr/lib/x86_64-linux-gnu# ls -l libiscsi*
-rw-r--r-- 1 root root 223084 Jul 31  2014 libiscsi.a
lrwxrwxrwx 1 root root     18 Jul 31  2014 libiscsi.so -> libiscsi.so.2.1.12
lrwxrwxrwx 1 root root     18 Mar 25 10:43 libiscsi.so.1 -> libiscsi.so.2.1.12
lrwxrwxrwx 1 root root     18 Jul 31  2014 libiscsi.so.2 -> libiscsi.so.2.1.12
-rw-r--r-- 1 root root 143344 Jul 31  2014 libiscsi.so.2.1.12

此時再執行 qemu 即沒有問題:

$ qemu-system-x86_64 -version
QEMU emulator version 2.5.0, Copyright (c) 2003-2008 Fabrice Bellard

qemu-system-arm -M ?

可以看到 qemu arm 模擬器的資訊

qemu-system-arm -version

可以看到 qemu 模擬器版本資訊

QEMU emulator version 1.2.0, Copyright (c) 2003-2008 Fabrice Bellard