前言

之前我给大家介绍过如何在 macOS 上使用 multipass 创建轻量级虚拟机来使用 Podman,众小伙伴纷纷齐说真香。今天我要给大家介绍一个全新的黑科技,利用 macOS Big Sur 引入的全新虚拟化框架 Virtualization Kit[1] 来创建更加轻量级的虚拟机。准确地说,这个最新的虚拟化框架并不能直接使用,它只是提供了 API,为许多设备类型定义了标准接口,包括网络、存储等设备,且支持 Virtio 标准。要想使用该框架来创建管理虚拟机,需要对其进行封装,构建出一个易于使用的工具,目前最优秀的就是 vftool[2]。

下面就来看看如何使用 vftool 来创建 Ubuntu 虚拟机。

1. 编译 vftool

vftool[3] 使用的是 Swift 语言,要想成功编译出可执行文件,需要安装 Xcode 命令行工具,你可以通过下面的命令直接安装:

$ xcode-select --install

或者到官方网站下载安装:https://developer.apple.com/download/more/[4]

或者你也可以直接安装 Xcode

安装好 Xcode 命令行工具后,就可以拉取 vftool 仓库进行编译了:

$ git clone https://github.com/evansm7/vftool.git
$ clang -framework Foundation -framework Virtualization vftool/vftool/main.m -o /usr/local/bin/vftool

后面创建虚拟机的时候,你可能会遇到以下的报错:

Configuration vaildation failure! Error Domain=VZErrorDomain Code=2 “Virtualization requires the “com.apple.security.virtualization” entitlement” UserInfo={NSDebugDescription=Virtualization requires the “com.apple.security.virtualization” entitlement}

这是因为编译完成后需要对二进制文件进行签名,而签名是需要授权的,所以需要创建一个自签名证书。打开钥匙串访问,依次选择 证书助理 --> 创建证书

百度网盘再次回收免费空间!21日前赶紧登录下!网友评:想钱想疯了?

选择证书类型为 代码签名,名字随便写,然后点击创建:

从 HTTP 到 HTTP/3 的发展简史

然后利用新建的自签名证书对二进制文件进行签名:

$ codesign --entitlements vftool/vftool/vftool.entitlements -s "<NAME ON CERTIFICATE>" /usr/local/bin/vftool

除了上面的方法之外,还有一种编译方法,直接运行以下命令:

$ xcodebuild
$ cp build/Release/vftool /usr/local/bin/vftool

现在就可以使用这个二进制文件来创建虚拟机了。

2. 准备镜像文件

需要准备三个文件:

  • kernel: https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-vmlinuz-generic[5]

  • initrd: https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-initrd-generic[6]

  • disk image: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.tar.gz[7]

下载相关文件:

$  mkdir -p ~/bin/vm
$ cd ~/bin/vm
$ wget https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-vmlinuz-generic
$ wget https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-initrd-generic
$ wget https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.tar.gz
$ mv ubuntu-20.04-server-cloudimg-amd64-vmlinuz-generic vmlinux
$ mv ubuntu-20.04-server-cloudimg-amd64-initrd-generic initrd
$ tar xvfz ubuntu-20.04-server-cloudimg-amd64.tar.gz

创建数据盘:

$ dd if=/dev/zero of=data.img bs=1m count=51200

3. 修改虚拟机网段

如果你想自定义虚拟机的网段,可以直接修改文件 /Library/Preferences/SystemConfiguration/com.apple.vmnet.plist。例如修改为:

        <key>Shared_Net_Address</key><string>192.168.64.1</string><key>Shared_Net_Mask</key><string>255.255.255.0</string>

3. 创建虚拟机

直接通过 vftool 创建虚拟机:

$ vftool \-k vmlinux \-i initrd \-c focal-server-cloudimg-amd64.img \-d data.img \-m 2048 \-a "console=hvc0"2021-01-14 13:27:08.223 vftool[66147:839169] vftool (v0.3 10/12/2020) starting
2021-01-14 13:27:08.223 vftool[66147:839169] +++ kernel at vmlinux, initrd at initrd, cmdline 'console=hvc0', 1 cpus, 2048MB memory
2021-01-14 13:27:08.224 vftool[66147:839169] +++ fd 3 connected to /dev/ttys000
2021-01-14 13:27:08.224 vftool[66147:839169] +++ Waiting for connection to:  /dev/ttys000

从日志信息可以看到该虚拟机连接的 TTY,我这里是 /dev/ttys000。打开一个新的终端窗口,连接该 TTY,然后执行一系列命令来进行初始化操作:

$ screen /dev/ttys000
<LOTS OF OUTPUT>
(initramfs) dd if=/dev/vda of=/dev/vdb bs=1024k &
(initramfs) mkdir /mnt
(initramfs) mount /dev/vdb /mnt
(initramfs) chroot /mntroot@(none):/# touch /etc/cloud/cloud-init.disabled
root@(none):/# echo 'root:root' | chpasswd
root@(none):/# echo "podman" >/etc/hostname
root@(none):/# ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa
root@(none):/# ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa
root@(none):/# ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519
root@(none):/# cat <<EOF > /etc/netplan/01-dhcp.yaml
network:renderer: networkdethernets:enp0s1:dhcp4: noaddresses: [192.168.64.2/24]gateway4: 192.168.64.1nameservers:addresses: [114.114.114.114]version: 2
EOFroot@(none):/# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
root@(none):/# sed -i "/^PasswordAuthentication/ c PasswordAuthentication yes" /etc/ssh/sshd_configroot@(none):/# exit
(initramfs) umount /dev/vda

上面的步骤总共干了这么几件事:

  • 挂载硬盘

  • 禁用 cloud-init

  • 设置主机名和 ssh 秘钥

  • 设置网络

  • 设置 ssh 允许使用 root 用户和密码登录

然后在运行 vftool 命令的窗口中按 CTRL-C 来关闭虚拟机。

接着使用新的硬盘来启动虚拟机:

$ vftool \-k vmlinux \-i initrd \-d data.img \-m 2048 \-a "console=hvc0 root=/dev/vda" \-t 0

打开一个新的终端窗口,通过 ssh 连接虚拟机,调整硬盘容量,移除不必要的组件:

$ ssh root@192.168.64.2
# login as root
root@podman:~# systemctl disable --now snapd.service snapd.socket
root@podman:~# resize2fs /dev/vda
root@podman:~# apt remove -y cloud-init cloud-initramfs-copymods cloud-initramfs-dyn-netconf cloud-guest-utils popularity-contest

看看它的内存占用:

他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...

果然很香!

4. 开机自启

MacOS 可以使用 launchctl 来管理服务,它可以控制启动计算机时需要开启的服务,也可以设置定时执行特定任务的脚本,就像 Linux crontab 一样, 通过加装 *.plist 文件执行相应命令。Launchd 脚本存储在以下位置, 默认需要自己创建个人的 LaunchAgents 目录:

  • ~/Library/LaunchAgents : 由用户自己定义的任务项

  • /Library/LaunchAgents : 由管理员为用户定义的任务项

  • /Library/LaunchDaemons : 由管理员定义的守护进程任务项

  • /System/Library/LaunchAgents : 由 MacOS 为用户定义的任务项

  • /System/Library/LaunchDaemons : 由 MacOS 定义的守护进程任务项

我们选择在 ~/Library/LaunchAgents/ 目录下创建 vftool.ubuntu.plist 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict><key>Label</key><string>ubuntu</string><key>ProgramArguments</key><array><string>/bin/bash</string><string>-c</string><string>$HOME/bin/vm/start.sh</string></array><key>StandardOutPath</key><string>/var/log/vftool.ubuntu.stdout.log</string><key>StandardErrorPath</key><string>/var/log/vftool.ubuntu.stderr.log</string><key>KeepAlive</key><true/><key>RunAtLoad</key><true/></dict>
</plist>

创建启动脚本:

$ cd ~/bin/vm
$ cat <<EOF > start.sh
#!/bin/bash/usr/local/bin/vftool \-k $HOME/bin/vm/vmlinux \-i $HOME/bin/vm/initrd \-d $HOME/bin/vm/data.img \-m 2048 \-a "console=hvc0 root=/dev/vda" \-t 0
EOF
$ chmod +x start.sh

创建日志文件:

$ touch /var/log/vftool.ubuntu.stdout.log
$ touch /var/log/vftool.ubuntu.stderr.log
$ sudo chmod a+rw /var/log/vftool.ubuntu.stdout.log
$ sudo chmod a+rw /var/log/vftool.ubuntu.stderr.log

设置开机自动启动 Ubuntu 虚拟机:

$ launchctl load -w ~/Library/LaunchAgents/vftool.ubuntu.plist

启动服务:

$ launchctl start ubuntu

查看服务:

$ launchctl list ubuntu
{"StandardOutPath" = "/var/log/vftool.ubuntu.stdout.log";"LimitLoadToSessionType" = "Aqua";"StandardErrorPath" = "/var/log/vftool.ubuntu.stderr.log";"Label" = "ubuntu";"OnDemand" = false;"LastExitStatus" = 256;"PID" = 50797;"Program" = "/bin/bash";"ProgramArguments" = ("/bin/bash";"-c";"$HOME/bin/vm/start.sh";);
};

大功告成,现在就可以通过 ssh 连接虚拟机了:

$ ssh root@192.168.64.2

参考

  • Building x86_64 Docker Containers on Apple Silicon[8]

  • Containerized the Apple Silicon[9]

  • Ubuntu Server fails[10]

参考资料

[1]Virtualization Kit: https://developer.apple.com/documentation/virtualization

[2]vftool: https://github.com/evansm7/vftool

[3]vftool: https://github.com/evansm7/vftool

[4]https://developer.apple.com/download/more/: https://developer.apple.com/download/more/

[5]https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-vmlinuz-generic: https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-vmlinuz-generic

[6]https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-initrd-generic: https://cloud-images.ubuntu.com/releases/focal/release/unpacked/ubuntu-20.04-server-cloudimg-amd64-initrd-generic

[7]https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.tar.gz: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.tar.gz

[8]Building x86_64 Docker Containers on Apple Silicon: https://medium.com/swlh/building-x86-64-docker-containers-on-apple-silicon-a6d868a18f37

[9]Containerized the Apple Silicon: https://bee42.com/de/blog/tutorials/containerized-the-apple-silicon/

[10]Ubuntu Server fails: https://github.com/evansm7/vftool/issues/2

听过云原生玩家都关注了他

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具

只需一条命令,连 ssh 都不需要!

往期推荐

百度网盘再次回收免费空间!21日前赶紧登录下!网友评:想钱想疯了?

从 HTTP 到 HTTP/3 的发展简史

他总在逆风翻盘,绝地反击!最不爱钱却成了最有钱的人...

开发文件上传功能稍不注意就会引发安全漏洞

IDEA不能一个窗口管理多个项目?那是你不会用!

Nacos 惊爆安全漏洞,可绕过身份验证(附修复建议)

macOS Big Sur 使用全新虚拟化框架创建超轻量虚拟机!相关推荐

  1. MacOS Big Sur 11.3.1 (20E41) CDR 格式虚拟机镜像

    本镜像仅适用于虚拟机安装,笔者仅实测过 VMware Fusion/Workstation(macOS 和 Windows)以及 Parallel Desktop(仅 macOS,使用原版 dmg 镜 ...

  2. virtualbox7虚拟机中安装苹果macOS big sur系统详细教程

    第1步,在 Windows 10/11 PC 上启用虚拟化. 现在的电脑一般都默认开启虚拟化技术了. 如果你遇到一些报错,比如收到错误消息"无法在虚拟机上打开会话",可以查看 如果 ...

  3. 【githubshare】KCon 黑客大会演讲 macOS Big Sur 内核漏洞挖掘、云虚拟化安全、服务器硬件可信与安全实践

    GitHub 上一个开源资料库:<KCon 黑客大会演讲 PPT>,2021 年包含了 macOS Big Sur 内核漏洞挖掘.云虚拟化安全.服务器硬件可信与安全实践等内容.个开源资料库 ...

  4. 10代X系列CPU-X299主板OpenCore(OC)引导升级/全新安装macOS Big Sur 11.0

    关键字:10代X系列CPU:X299:OpenCore:OC:升级安装:全新安装:macOS Big Sur 11.0: 摘要: 随着OpenCore(OC)代码的更新,目前(07月06日以后的编译版 ...

  5. 如何在 Mac 和虚拟机上安装 macOS Big Sur、Monterey 和 Ventura

    请访问原文链接:https://sysin.org/blog/how-to-install-macos/,查看最新版.原创作品,转载请保留出处. 作者主页:www.sysin.org 名词解释: 硬件 ...

  6. 如何在 Mac 和虚拟机上安装 macOS Big Sur 11.0 正式版

    作者主页:www.sysin.org 请访问原文链接:https://sysin.org/blog/how-to-install-macos-big-sur/,查看最新版.转载请保留原文链接. 本文适 ...

  7. WWDC19 苹果宣布全新 UI 框架 SwiftUI

    2019 年 WWDC 大会上,苹果在压轴环节向大众宣布了基于 Swift 语言构建的全新 UI 框架 -- SwiftUI.开发者可通过它快速为所有的 Apple 平台创建美观.动态的应用程序. 在 ...

  8. macOS Big Sur 11.7.5 (20G1225) 正式版 ISO、PKG、DMG、IPSW 下载

    本站提供的 macOS Big Sur 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装. 2023 年 3 月 27 日 (北 ...

  9. macOS Big Sur 11.7 (20G817) Boot ISO 原版可引导镜像

    本站下载的 macOS Big Sur 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装. 腾讯云产品限量秒杀 请访问原文链接: ...

最新文章

  1. python 获取当前ip
  2. 数据结构和算法之——跳表
  3. iis8 php mysql_windows2012下 iis8+php5.2+mysql5 配置
  4. Apriori算法进行关联分析(2)
  5. 部署在Netweaver上的Fiori应用的WebContent文件夹
  6. centos6/7 yum安装mysql客户端和rpm包方式安装方式
  7. linux下imp导入oracle数据库,Oracle数据库Linux下的导入IMP
  8. Linux的工作队列work queue和延时工作队列
  9. 更换微软TTS语音引擎切换
  10. Oracle中TO_NUMBER()函数的用法
  11. 校友诗选_母校百年 同学聚会(来稿刊登)
  12. win7装xp双系统_UEFI新PC装Win7 32位系统:巧用”硬盘保护卡“解决
  13. Web前端——移动端页面开发
  14. 【UPCOJ】21185问题 H: 买二送一
  15. 在计算机网络互联设备中,网络互联设备
  16. 他预言过Uber的成功、预言过川普的当选,但却预言不了这个!
  17. tdk磁材手册_TDK 集团发布关于铝电解电容器的完整修订版 《数据手册》
  18. webStrom使用gitee管理代码
  19. 安全合规--39--基于欧美法律法规的企业隐私合规体系建设经验总结(三)
  20. 卷积滤波 英文_图形学之卷积滤波器

热门文章

  1. 利用Vlan控制与隔离广播风暴
  2. 大型局域网二层三层结构比较
  3. maven集成tomcat进行web应用测试
  4. golang float64 保留2位小数
  5. golang json数据的处理 动态key 动态字段
  6. linux shell 判断文件 修改时间和系统时间差
  7. 如何利用隐写术配合四个重定向连接到C2服务器
  8. docker 同时停止删除容器 强制删除容器
  9. Windows软件授权管理工具 slmgr命令详解
  10. 开涛老师的博客汇总 -- Web MVC 开发学习