在M1 Mac上使用虛擬機調用羅賽塔

Publish Date

本篇文章部分區域擷取這篇一級棒的文章,記得要去看看喔!

前言

有時我被因筆電的 ISA 而無法使用gdb感到困擾,且lldb實際上也和gdb有些差異,這些都是藉口,其實是因為我要上的課要求我們使用gdb, 我是沒意見 ¯\_(ツ)_/¯

在本篇教學中,我們將聚焦在 Apple Silicon®(AMD64 的子集)指令集。

架設虛擬機

這部分與前面提到的網站一樣,不過我是使用 Ubuntu Server 22.04.4 arm64。 因應需求分配 ram 和其他參數。當你開機時,網路應該都有設定好,然後當安裝程式詢問是否安裝 OpenSSH 伺服器,請記得勾選。

設定映射站

重新啟動後,我們要設定 amd64 的映射站,由於目前只有 arm64 系統預設的映射。

sudo apt-get update # 先更新映射站確保都是最新的資訊
sudo apt-get upgrade # 更新程式

接下來我們新增一個新的指令集。

sudo dpkg --add-architecture amd64

現在,我們回去前一個指令更新映射站,不過卻發生錯誤,原因在於 Ubuntu Jammy 沒有對amd64有相關的檔案,因為映射站的演繹是透過目前發行檔的源頭向上一層分析, 而amd64相關的資源存在在另一個完全不同的映射站,所以我們要進入/etc/apt/sources.list.d分析。

Now, we run the first commands again, but wait... it failed? There's no mirror for amd64 in Ubuntu's jammy distribution? It's because the mirror deduction works by using your default mirror sites, but amd64 lives on a different plane than arm64, at least for Jammy. Hence, we have to take a deep dive into /etc/apt/sources.list.d.

sudo vim /etc/apt/sources.list.d/amd64.list # 製作amd64的映射站

接下來,手動新增下列映射站。

deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse

使用羅賽塔 2

本章節和上述文章相近,先來安裝基礎的 amd64 套件。

sudo apt upgrade
sudo dpkg --add-architecture 'amd64' # 請記得使用管理員
sudo apt install gdb-multiarch
sudo apt install libc6:amd64 # 現在不是libc而是libc6
sudo apt install gcc:amd64

如果沒有抱錯,我們就能進入下一步,和UTM 官方教學相近,

sudo mkdir /media/rosetta
sudo mount -t virtiofs rosetta /media/rosetta
sudo /usr/sbin/update-binfmts --install rosetta /media/rosetta/rosetta \
     --magic "\x7fELF\\x02\\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \
     --mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
     --credentials yes --preserve no --fix-binary yes

然而在重開機後,羅賽塔就會消失,所以我們需要將下面這行加在/etc/fstab中。

rosetta	/media/rosetta	virtiofs	ro,nofail	0	0

大功告成!