arm64 服務器中的 Debian armhf 虛擬機

  • 時間:2018-10-13 22:56 作者:Linux中國 來源:Linux中國 閱讀:339
  • 掃一掃,手機訪問
摘要:在 Collabora 公司,我們所做的許多工作之一就是為用戶構建包括 32 位和 64 位 ARM 系統在內的各種架構的 Debian 衍生版。就像 Debian 做的那樣,我們的 OBS 系統建立在原生系統而不是仿真器上。 -- Sjoerd Simons編譯自: https://www.col

arm64 服務器中的 Debian armhf 虛擬機

在 Collabora 公司,我們所做的許多工作之一就是為用戶構建包括 32 位和 64 位 ARM 系統在內的各種架構的 Debian 衍生版。就像 Debian 做的那樣,我們的 OBS 系統建立在原生系統而不是仿真器上。 -- Sjoerd Simons

編譯自: https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/

作者: Sjoerd Simons

譯者: geekpi

在 Collabora 公司,我們所做的許多工作之一就是為用戶構建包括 32 位和 64 位 ARM 系統在內的各種架構的 Debian[1] 衍生版。就像 Debian 做的那樣,我們的 OBS[2] 系統建立在原生系統而不是仿真器上。

幸運的是隨著幾年前 ARM 服務器系統的出現,為這些系統原生構建不再像以前那么痛苦了。對于 32 位的 ARM,我們一直依賴 Calxeda[3] 刀片服務器,然而不幸的是 Calxeda 在不久前淘汰,硬件開始顯露其年齡(雖然幸運的是 Debian Stretch 還支持它,因而至少軟件還是新的)。

在 64 位 ARM 方面,我們運行在基于 Gigabyte MP30-AR1 的服務器上,該服務器可以運行 32 位的 ARM 代碼(與之相反,比方基于 ThunderX 的服務器只能運行 64 位代碼)。像這樣在它們之上運行 armhf 虛擬機作為從構建服務器build slaves似乎是一個很好的選擇,但是設置起來可能會需要更多東西的介入。

第一個圈套是 Debian 中沒有標準的 bootloader 或者者 boot 固件來啟動 qemu 仿真的 “virt” 設施(我不想使用真實機器的仿真)。這也意味著在啟動時用戶機內沒有任何東西會加載內核,也不會從用戶機網絡引導,這意味著需要直接的內核引導。

第二個圈套是當前的 Debian Stretch 的 armhf 內核并不支持 qemu 虛擬機所提供的通用 PCI 主機控制器,這意味著用戶機中不會出現存儲器和網絡。希望這會被盡快處理(Debian bug 864726[4]),并出現在 Stretch 升級中,那在之前需要使用 bug 報告中附帶的補丁的自己設置內核,但在這篇文章中我不想進一步說。

高興的假設我們有一個可用的內核,剩下的挑戰是很好地管理直接內核加載;蛘哒吒唧w地說,如何確保主機啟動用戶機通過標準 apt 工具安裝的內核,而不必在用戶機/主機之間復制內核,這本質上歸結于用戶機將 /boot 暴露給主機。我們選擇的方案是使用 qemu 的 9pfs 支持來從主機共享一個文件夾,并將其用作用戶機的 /boot。對于 9p 文件夾,似乎需要 “mapped” 安全模式,由于 “none” 模式對 dpkg 有問題(Debian bug 864718[5])。

因為我們使用 libvirt 作為我們的虛擬機管理器,剩下的事情就是如何將它們組合到一起。

第一步是安裝系統,基本和平時一樣?梢灾苯右龑нM入由普通的 Stretch armhf netboot 安裝程序提供的 vmlinuz 和 initrd.gz(下載到如 /tmp 中)。 設置整體來說很直接,會有少量小的調整:

  • /srv/armhf-vm-boot 設置為 9p 共享文件夾(這個應該存在,并且由 libvirt-qemu 擁有),這之后會被用于共享 /boot。

  • 內核參數中在 root= 后面加上 VM 中的 root 分區,根據你的情況調整。

  • 鏡像文件使用 virtio 總線,這似乎不是默認的。

除了這些調整,最后的示例命令與 virt-install 手冊頁中的類似。

virt-install --name armhf-vm --arch armv7l --memory 512 \

--disk /srv/armhf-vm.img,bus=virtio

--filesystem /srv/armhf-vm-boot,virtio-boot,mode=mapped \

--boot=kernel=/tmp/vmlinuz,initrd=/tmp/initrd.gz,kernel_args="console=ttyAMA0,root=/dev/vda1"

按照通常的方式運行安裝。到最后安裝程序可能會提醒它不知道如何安裝引導程序,這個沒什么問題。只需在結束安裝和重啟之前,切換到 shell 并以某種方式將目標系統中的 /boot/vmlinuz 和 /boot/initrd.img 復制到主機中(比方 chroot 進入 /target 并在已安裝的系統中使用 scp)。 這是必須的,由于安裝程序不支持 9p,但是要啟動系統,需要 initramfs 以及能夠掛載根文件系統的板塊,這由已安裝的 initramfs 提供。這些完成后,安裝即可以完成了。

接下來,引導已安裝的系統。調整 libvirt 配置(比方使用 virsh 編輯并調整 xml)來使用從安裝程序復制過來的內核以及 initramfs,而不只是使用它提供的。再次啟動虛擬機,它應該就能愉快地進入安裝的 Debian 系統中了。

要在用戶機這一側完成,/boot 應該移動到共享的 9pfs 中,/boot 的新 fstab 條目看上去應該這樣:

virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 0 0

有了這一步,這只是將 /boot 中的文件混到新的文件系統里面,并且用戶機完事了(確保 vmlinuz/initrd.img 保持符號鏈接)。內核可以如常更新,并對主機可見。

這時對于主機端,有另外一個問題需要跨過,因為用戶機使用 9p 映射安全模式,用戶機的符號鏈接對主機而言將是普通的包含鏈接目標的文件。為理解決這個問題,我們在用戶機啟動前使用 libvirt qemu 的 hook 支持來設置合適的符號鏈接。作為一個例子,下面是我們最終使用的腳本(/etc/libvirt/hooks/qemu):

vm=$1

action=$2

bootdir=/srv/${vm}-boot

if [ ${action} != "prepare" ] ; then

exit 0

fi

if [ ! -d ${bootdir} ] ; then

exit 0

fi

ln -sf $(basename $(cat ${bootdir}/vmlinuz)) ${bootdir}/virtio-vmlinuz

ln -sf $(basename $(cat ${bootdir}/initrd.img)) ${bootdir}/virtio-initrd.img

有了這個,我們可以簡單地定義 libvirt 使用 /srv/${vm}-boot/virtio-{vmlinuz,initrd.img} 作為機器的內核 / initramfs,并且當 VM 啟動時,它會自動獲取用戶機安裝的最新內核 / initramfs。

只有最后一個邊緣情況了,當從 VM libvirt 重啟會讓 qemu 解決它而不是重啟 qemu。假如這不幸發生的話,意味著重啟不會加載新內核。所以現在我們通過配置 libvirt 來處理這個問題,從而在重啟時中止虛擬機。因為我們通常只在更新內核(安裝)時重啟 VM,盡管這有點乏味,但這避免了重啟加載的是舊內核 / initramfs 而不是預期的。


via: https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/

作者:Sjoerd Simons[6] 譯者:geekpi 校正:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

  • [1]: Debian - https://debian.org/

  • [2]: OBS - http://openbuildservice.org/

  • [3]: Calxeda - https://en.wikipedia.org/wiki/Calxeda

  • [4]: Debian bug 864726 - https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864726

  • [5]: Debian bug 864718 - https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=864718

  • [6]: Sjoerd Simons - https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/

  • 全部評論(0)
最新發布的資訊信息
【系統環境|服務器應用】在CentOS 7上如何安裝Gogs 0.11.53(2020-02-10 10:14)
【系統環境|】淘碼庫,據消息稱已被調查。淘碼庫源碼網,已經無法訪問!(2020-01-14 04:13)
【系統環境|服務器應用】Discuz隱藏后臺admin.php網址修改路徑(2019-12-16 16:48)
【系統環境|服務器應用】2020新網站如何讓百度快速收錄網站首頁最新方法,親測有用!免費(2019-12-16 16:46)
【系統環境|服務器應用】Discuz發布帖子時默認顯示第一個主題分類的修改方法(2019-12-09 00:13)
【系統環境|軟件環境】Android | App內存優化 之 內存泄漏 要點概述 以及 處理實戰(2019-12-04 14:27)
【系統環境|軟件環境】MySQL InnoDB 事務(2019-12-04 14:26)
【系統環境|軟件環境】vue-router(單頁面應用控制中心)常見用法(2019-12-04 14:26)
【系統環境|軟件環境】Linux中的Kill命令(2019-12-04 14:26)
【系統環境|軟件環境】Linux 入門時必學60個文件解決命令(2019-12-04 14:26)
手機二維碼手機訪問領取大禮包
返回頂部
3d开机号查询