X86_64平臺上利用qemu安裝aarch64架構的虛擬機
前一段時間摸索瞭如下在x86平臺上安裝arm架構(包括aarch64和armhf)的虛擬機,中間遇到了很多問題。把經驗總結下來但願能幫到你們。git
1.安裝qemu-system-aarch64
若是在宿主機上只安裝了qemu-kvm的話,宿主機上只能運行X86構架的虛擬機,並可以利用kvm加速,並不能將arm指令翻譯成X86指令運行。全部還須要安裝qemu-system-aarch64,它提供了aarch64架構虛擬機在x86架構上的運行支持。
能夠經過下載源代碼並編譯安裝:github
wget https://download.qemu.org/qemu-2.11.0.tar.xz tar xvJf qemu-2.11.0.tar.xz cd qemu-2.11.0 ./configure –-target-list=aarch64-softmmu make sudo make install
在安裝的過程當中可能會報缺乏一些依賴包,我在安裝過程當中安裝瞭如下依賴包後成功安裝。shell
sudo yum install zlib-devel sudo yum install glib2-devel sudo yum install pixman-devel
安裝成功後qemu-system-aarch64會安裝到/usr/local/bin/目錄下。ubuntu
2.UEFI固件下載
之前系統的啓動過程能夠簡化爲 BIOS固件—->引導程序—->操做系統,可是因爲傳統的BIOS啓動方式存在許多問題,如bios運行在16位模式,尋址空間小,運行慢等,因此如今X8六、ARM架構等架構都改採用了改進的 UEFI 啓動方式(固然會有兼容傳統BIOS啓動方式的考慮),這種狀況下系統啓動過程以下圖所示。
上圖啓動過程詳細我也不太清楚,你們能夠看看wiki上的進一步介紹,這裏須要說明的是,UEFI啓動中最開始執行的也是專門的UEFI固件。所以,咱們要想引導到安裝光盤(支持UEFI模式)進一步安裝aarch64架構的系統,先要下載對應架構(這裏是aarch64)的UEFI固件。
QEMU_EFI.fd(下載地址:http://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/)centos
3.操做系統下載
我這裏採用的是arm64架構的ubuntu 16.04 server版:ubuntu-16.04.3-server-arm64.isoruby
4.建立虛擬硬盤
利用qemu-img指令能夠建立1個空的虛擬硬盤,便於後面安裝的時候將系統安裝到虛擬硬盤上。bash
qemu-img create ubuntu16.04-arm64.img 16G
- 1
若是沒有上述命令,你們聯網安裝便可。markdown
5.虛擬機安裝
執行以下命令:
qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu-16.04.3-server-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0
執行上述命令時確保QEMU_EFI.fd、ubuntu-16.04.3-server-arm64.iso、ubuntu16.04-arm64.img文件在當前目前下,不然須要修改爲對應的文件路徑。在上述參數中,指定安裝光盤這裏-drive if=none,file=ubuntu-16.04.3-server-arm64.iso,id=cdrom,media=cdrom -device virtio-scsi-device -device scsi-cd,drive=cdrom
我在有些網站上找到了不一樣的方式並嘗試,但進入到光盤的安裝界面後會報以下圖所示錯誤,最後發現上述指定能正確的完成安裝。
下面是安裝過程的一些截圖。
6.虛擬機啓動
安裝完成以後,下面就是啓動虛擬機。正常狀況下,安裝完成後會自動從新啓動,而後發現進入到下面的界面。頓時慌了,又出問題了。安裝過程當中出現問題你們不要輕易放棄,必定要理性的分析問題和解決問題。
上面是進入到了UEFI的交互shell裏面,爲何沒有執行grub並引導進入ubuntu系統咧?說明UEFI固件沒有找到ESP分區(EFI system partition,安裝過程當中就會看見建立了一個ESP分區)或者沒有找到ESP分區中的EFI文件,由於系統須要該EFI文件來引導。在該shell下執行exit
進入到UEFI的管理界面,並手動選擇EFI文件啓動系統,以下圖所示。
終於進入到了系統中……
qemu-system-aarch64 -m 2048 -cpu cortex-a57 -smp 2 -M virt -bios QEMU_EFI.fd -nographic -drive if=none,file=ubuntu16.04-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0
6.利用virt-manager啓動虛擬機
前面可以利用命令成功啓動虛擬機啦,可是對於我這種入門級的選手來講更想用帶界面的virt-manager工具去直觀地管理虛擬機(開關虛擬機、添加刪除網絡接口也很方便),因而進行了一番嘗試,找到了一個可行的方法。
首先是安裝virt-manager工具。
sudo yum install virt-manager
安裝完成後啓動virt-manager,以下圖。在選擇Architecture爲aarch64後,出現了圖中所示的warning,表示找不到aarch64架構的UEFI固件,而且在安裝方式上自動選擇了Import existing disk image。一想也是,系統最開始執行的就是UEFI固件,而咱們並無指定UEFI固件的路徑。
這種狀況下須要提供系統鏡像外,還要提供vmlinuz內核文件和initrd文件。
這裏給出了安裝UEFI固件的步驟,網頁打開較慢,我這裏給出步驟的截圖。
安裝完成後,從下面的圖中能夠看到,warning消失了,而且只須要導入硬盤鏡像文件,說明UEFI固件已經起做用了。只要UEFI固件可以執行到硬盤ESP分區上的EFI文件,那就可以成功啓動系統了。
指定鏡像文件後啓動系統,出現了下面錯誤
經過查閱資料,發現這是因爲libvirt庫的版本致使的,將libvirt版本升級到3.10.0。在libvirt官網上最新穩定版本是3.10.0,但經過yum直接安裝尚未這個最新版本。我直接找到了一個可用源。在/etc/yum.repos.d目錄下建一個virt.repo文件,將下面代碼複製到文件中。
[virt]
name=CentOS-$releasever - virt #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra baseurl=http://mirrors.nwsuaf.edu.cn/centos/$releasever/virt/$basearch/libvirt-latest/ ailovermethod=priority enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
運行sudo yum update libvirt
完成更新!
更新完成後再次啓動虛擬機,本覺得會沒有問題了額,結果卡在了下面的界面中
我的以爲是新安裝的UEFI固件的問題,在網上也沒有找到可用的解決方法。若是有讀者可以找到上面問題的解決方法,也能夠留言告知我。
最終不得不採用內核啓動的方式。將前面的系統鏡像/boot目錄掛載到本地,而後提取其中的vmlinuz和initrd文件。
首先用fdisk查看系統鏡像的分區和偏移,下圖是個人系統鏡像的信息。
能夠看到,個人/boot在/所在的第二個分區中,執行下面命令將/所在分區掛載到本地的/mnt目錄下(注意偏移量的修改),並將兩個文件拷貝出來。命令以下
sudo mount -o loop,ro,offset=$((1050624*512)) xxx.img /mnt sudo cp /mnt/boot/vmlinuz . sudo cp /mnt/boot/initrd .
而後再導入過程當中指定虛擬機鏡像和vmlinuz、initrd文件、內核參數指定爲root=/dev/sda2
,或者在自定義階段配置,以下圖所示。
再次啓動系統,成功進入到系統中……
若是發現採用內核啓動方式仍然沒法啓動,並停留在下圖所示的界面,說明是仍是該UEFI固件的問題,我就遇到了這個問題。你們能夠將最前面用到的QEMU_EFI.fd文件,採用以下命令對安裝的UEFI固件進行替換便可
dd if=QEMU_EFI.fd of=/usr/share/edk2.git/aarch64/QEMU_EFI-pflash.raw conv=notrunc
7.參考連接
https://wiki.linaro.org/LEG/UEFIforQEMU
https://kennedy-han.github.io/2015/06/16/QEMU-debian-ARMv8.html
https://en.opensuse.org/openSUSE:AArch64
https://gmplib.org/~tege/qemu.html
https://marcin.juszkiewicz.com.pl/2015/04/17/running-vms-on-fedoraaarch64/
https://bugzilla.redhat.com/show_bug.cgi?id=1449837
https://marcin.juszkiewicz.com.pl/2015/04/17/running-vms-on-fedoraaarch64/