在苹果M3笔记本上用VMWare安装Linux

上一个苹果本到寿,本来鉴于华为手机的品质,换了个华为笔记本,然而价虽廉物却不美,特别是对于Anti-Microsoft成员,华为本上的Linux体验可谓差到极点、不是这一块系统不支持就是那一块硬件不能用,无可奈何,只好咬咬后槽牙换回苹果本,他家已星移物换,从Intel i7变成了Silicon M系列。M是ARM架构,对吾这种必须用Linux虚机的人而言又是个挑战,一通折腾勉强搞定,把过程记录于此,共享给有同样需求的筒子们做个参考。

笔记本配置

MacBook Pro 14.2吋屏
CPU:Apple M3 Pro
内存:36G
硬盘:2T
操作系统:Mac OS Sonoma,应该是Mac OS X 14.3版

一、虚拟机

首先是选虚拟机软件,仔细考察了下,能虚拟ARM机器的就只有三款:苹果自家的Parallels Desktop,VMware的VMware Fusion,以及开源的Virtual Box,看了下Virtual BOX自己的官方介绍和网上筒子们写的相关文档,觉得他的M系列CPU支持可能不太靠谱(只有beta版下载),Parallels则是价格不便宜,而且可能改成订阅模式要每年付费,倒是VMware Fusion Player提供了个人用户非商业用途的共享模式,就选VMware了。在他家官网下载VMware Fusion Player要注册一个账号、提交各种个人资料后,下载申请发出,要等他审核通过,一等等好几天,麻烦透了,不过免费的东西麻烦也正常。如果有筒子不想这么麻烦,那么下个商业版的VMware Fusion也是可以的,出点钱,或者自己去找注册码。

最终结果,安装了VMware Fusion Player,等同于VMware Fusion的13版。

二、在虚拟机安装Linux

支持ARM架构的Linux不太好找,大部分ARM版都是面向嵌入式设备的,桌面版本和服务器版本不多,而且大多数服务器版本对于个人用户而言费用不低,如果不付费是无法在线更新的。搜索半天,筛选了两个考察对象:

1、openEuler Aarch64版
2、Ubuntu Server arm LTS版

先试openEuler aarch64版,下载iso镜像倒是很快,但是设置完虚机后却无法启动,报告:

EFI stub: Booting Linux Kernel…
EFI stub: EFI_RNG_PROTOCOL unavailable, KASLR will be disabled
ESI stub: Using DTB from configuration table
ESI stub: Exiting boot services and installing virtual address map…

然后就半天没动静了,怎么回事?貌似是内核的问题?连续试了openEuler的22.09和最新的23.09两个版本,表现一模一样。吾这是继笔记本之后又被华为坑了一把吗?他家难道真的除了通讯、手机,其它都不怎么样?他们不是疯狂宣传他们的欧拉操作系统吗?难道是因为苹果是美国企业,M3 Pro是美国CPU,所以华为的操作系统被针对了、他们也是受害者?以华为笔记本预装微软Windows的尿性,看起来也不至于吧?还是他的openEuler考虑问题不周全?也许光顾着适配他自家的鲲鹏、除鲲鹏都不是ARM了?算了吧,拜拜欧拉。

只能试下Ubuntu了,前面那个华为笔记本装Linux,也是Ubuntu救的场(说老实话,被美国制裁这么狠的企业,出的笔记本不但预装的是Windows,而且跟国产的优秀Linux发行版如Deepin无法匹配,吾当时表示很震惊)。

在Ubuntu官网上线找到的是Ubuntu Server 64 for ARM,22.04.4 LTS版本,下载,安装,果然还是Ubuntu令人放心,一路推进,直到结束。但看似顺利,竟然是全命令行界面?完全成功了重启虚拟机,久违的login命令行提示符,原来Ubuntu的ARM架构LTS版只有Server,而且他这个Server是不带GUI的、只有英文。这可不行,吾用Linux,还是有可能用下GUI的,不仅仅偶尔还要用下各种IDE,吾们sucore/teamworks平台上的业务建模工具、消息调试工具都是Java Swing写的,没有GUI怎么行?

看了下,跟所有的Linux发行版一样,Ubuntu Server也可以在安装完之后,再apt install自行安装一个桌面GUI(ubuntu-desktop),然后手工继续安装中文包,不过这样有点麻烦,没那么多时间去消耗,一番考察下,发现了国内一篇介绍优麒麟ARM版安装的文章,他给了一个Ubuntu每日构建版(daily-live)ARM架构的Desktop 22.04下载源:

http://cdimages.ubuntu.com/jammy/daily-live/current/

进入其中,有一个jammy-desktop-arm64.iso,就是它了。下载,在VMware重新创建一个虚机,再次安装,先是Lite版的GUI,点桌面上的安装图标,GUI安装过程启动,Step by Step,顺利搞定,熟悉的Ubuntu GUI界面出现了。

安装完Ubuntu之后,按照使用x86_64上虚拟机的经验是需要安装一下VMware的vmtools的,否则一是宿主机和虚机之间鼠标键盘切换不顺畅,二是不能使用宿主机提供的共享文件夹服务。照例到VMware的安装目录下找了一找(注意,苹果的Applications目录是个特殊目录,直接从访达Finder是不能进入每个应用的下级目录的,只能打开一个Shell终端,一步一步cd进入其下级目录中):

cd /Applications/VMware Fusion.app/Contents/Library/isoimages

进入目标目录后ls查看,除了以前常见的x86_x64目录,果然又多了个arm64目录,然而再cd进去,好家伙,只有一个windows.iso,原来只是对windows特殊伺候了,没把其它操作系统放在眼里。

还得另想办法。关于如何在Ubuntu虚拟机里安装vmtools,网上有不少参考,但大多不是ARM架构,写得也乱(国内的尤其乱,国内IT写文档的能力大多差得要死)。有个老外写过一篇如何在ARM架构的Ubuntu 20.04 LTS虚拟机里编译并安装vmtools的文章,虽然吾的ubuntu版本是22.04要高一些,但是第一,那个virten.net看起来像是一个跟vmware高度关联的纯技术网站,其次,那个老外写的内容看下来是操作步骤最清晰的,文章链接:

https://www.virten.net/2020/10/vmware-tools-for-ubuntu-20-04-lts-arm64-on-esxi-arm/

按照他写的指引操作,先在Ubuntu虚机里打开一个shell,然后:

第一步,更新一下系统,安装下必要的编译器、git工具,升级一下依赖的库,这些命令工具和相关的库包括:

  • git
  • automake
  • make
  • gobjc++
  • libtool
  • pkg-config
  • libmspack-dev
  • libglib2.0-dev
  • libpam0g-dev
  • libssl-dev
  • libxml2-dev
  • libxmlsec1-dev
  • libx11-dev
  • libxext-dev
  • libxinerama-dev
  • libxi-dev
  • libxrender-dev
  • libxrandr-dev
  • libxtst-dev
  • libgdk-pixbuf2.0-dev
  • libgtk-3-dev
  • libgtkmm-3.0-dev

具体的命令如下:

$ sudo apt install -y git automake make gobjc++ libtool pkg-config libmspack-dev libglib2.0-dev libpam0g-dev libssl-dev libxml2-dev libxmlsec1-dev libx11-dev libxext-dev libxinerama-dev libxi-dev libxrender-dev libxrandr-dev libxtst-dev libgdk-pixbuf2.0-dev libgtk-3-dev libgtkmm-3.0-dev

第二步,下载vmtools的源代码。vmware的vmtools是有开源版本的,vmware把代码仓库托管在github上,地址是:

https://github.com/vmware/open-vm-tools

可以在本地创建一个用于编译的目录,直接把代码仓库克隆到本地,例如吾在吾的虚机里这样操作:

$ mkdir /udata/temp
$ cd /udata/temp
$ git clone https://github.com/vmware/open-vm-tools.git

如果顺利结束,就可以在当前目录(吾的是/udata/temp)下看到open-vm-tools目录。由于网络的原因,直接从github克隆可能会因为网络中断而不能成功,此时可以打开一个Web浏览器,用仓库地址定位到对应的页面,然后用github页面上的download zip按钮将仓库内容打包下载到本地。

第三步,编译。进入本地的代码仓库目录,开始编译vmtools,具体命令是(吾的机器代码仓库目录为/udata/temp/open-vm-tools:

$ cd /udata/temp/open-vm-tools
$ autoreconf -i
$ ./configure --disable-dependency-tracking
$ make

第四步,安装。编译完成后,如果没有报告编译错误,就用如下命令安装

$ sudo make install
$ sudo ldconfig

第五步,配置服务。现在vmtools已经安装完毕,还需要将其配置成一个能开机自启动的服务。首先用任意文本编辑器(例如vi,或者gedit)创建一个名为vmtoolsd.service的文本文件,其内容为:

[Unit]
Description=Service for virtual machines hosted on VMware
Documentation=http://github.com/vmware/open-vm-tools
After=network-online.target

[Service]
ExecStart=/usr/local/bin/vmtoolsd
Restart=always
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

保存该文件(吾的文件保存在/udata/temp目录下,吾的当前登录用户拥有该目录的读写权限),然后将其拷贝到/etc/systemd/system目录(这是一个只有root能写的目录),命令是:

$ cd /etc/systemd/system
$ sudo cp /udata/temp/vmtoolsd.service vmtoolsd.service

拷贝完成后,用如下命令设置vmtoolsd服务为自动启动,随后启动该服务:

$ sudo systemctl enable vmtoolsd.service
$ sudo systemctl start vmtoolsd.service

启动之后,可以用如下命令查看该服务的运行状态:

$ sudo systemctl status vmtoolsd.service

服务运行正常后,在宿主机和虚拟机之间移动鼠标,各自都可以平滑捕捉光标、切换光标了,但是在虚拟机管理器中设置宿主机的共享目录,虚拟机提示:

无法更新运行时文件共享
状态:在客户机操作系统中装载共享文件夹文件系统时出错

不仅仅不能共享文件夹,甚至连虚拟机里已经配置好的显示设置都会被重置为缺省状态,看来即使用源码安装的方式安装了vmtools,也不是所有的VMware功能都能正常使用,共享文件夹需要想其它的办法。

三、利用nfs在MacOS宿主机和Ubuntu虚拟机之间共享文件夹

由于MacOS可以看作从UNIX衍生的系统,Linux可以看作类UNIX系统,二者都实现了nfs文件系统相关的服务和客户端,因此打算用nfs解决Ubuntu虚机和MacOS宿主机之间的文件夹共享问题。首先配置MacOS的nfs服务。

MacOS的nfs服务进程是nfsd,可以通过终端命令启动、停止该服务,或者查看该服务的状态,为此首先要在MacOS上打开一个Shell终端,然后用nfsd命令查看nfs服务的状态:

% nfsd status

如果服务正在运行,该命令输出的结果是:

nfsd service is enabled
nfsd is running (pid 9596, 8 threads)

如果服务没有运行,该命令输出的结果是:

nfsd service is enabled
nfsd is not running

如果服务不可用,该命令输出的第一行是:

nfsd service is disabled

当服务不可用时,用如下命令将该服务修改为可用(启用):

% sudo nfsd enable

服务可用之后,用如下命令启动该服务:

% sudo nfsd start

为配置nfs服务,需要通过/etc/exports文件配置nfs的输出目录,这是一个纯文本文件,因为位于系统目录/etc之下,只有root用户拥有写权限,因此最便捷的方法是用vi编辑:

% sudo vi /etc/exports

吾需要将吾在个人主目录/Users/che下创建的MyData目录通过nfs服务输出,需要编辑如下内容的exports文件:

/Users/che/MyData -alldirs -rw -mapall=che:staff -network 172.16.20.0 -mask 255.255.255.0

上面的内容含义如下:

1)最开头的“/Users/che/MyData”是要通过nfs输出的目录;

2)选项“-alldirs”代表要输出所有的子目录:

3)选项“-rw”代表以可读写的方式输出该目录,这本是MacOS的缺省选项,可以省略,但考虑到这里是要向Linux主机输出,可能存在用户身份映射的差异,仍然添加了这个选项;

4)选项“-mapall=che:staff”的意思是无论nfs客户端(Linux主机)以什么身份连接到MacOS的nfs服务,都会被映射为MacOS宿主机上staff用户组的用户chenben,这么做的原因是MacOS和Linux在创建用户时,即使用户名相同,但其用户id是不同的(实际上不同发行版的Linux如果不在useradd命令添加-u选项,创建的同名用户其uid也是不同的),为避免用户身份映射有问题,把所有的用户都映射到吾的登录用户上。实际上,这一行内容如果是在MacOS主机之间使用nfs,往往被写成:

/Users/che/MyData -alldirs -maproot=root:wheel -network 172.16.20.0 -mask 255.255.255.0

即仅仅配置了root的身份映射,将nfs客户端的root用户映射为nfs服务端的root,在MacOS主机之间,这个配置是能够很好的工作的。

5)选项“-network 172.16.20.0”的意思是nfs输出的目录在172.16.20.0标识的网段可以被访问。吾是在MacOS宿主机和Linux虚机之间使用nfs,按照MacOS的nfs配置方法,需要知道nfs服务可以被访问的网段,为此分别在MacOS和Linux主机上打开各自的Shell终端用ifconfig命令查看:

MacOS宿主机:

% ifconfig -a

可以在该命令的输出中看到如下一段内容:

bridge101: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=3<RXCSUM,TXCSUM>
    ether 82:a9:97:b1:73:65
    inet 172.16.20.1 netmask 0xffffff00 broadcast 172.16.20.255
    inet6 fe80::80a9:97ff:feb1:7365%bridge101 prefixlen 64 scopeid 0x1c 
    Configuration:
        id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
        maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
        root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
        ipfilter disabled flags 0x0
    member: vmenet1 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 27 priority 0 path cost 0
    member: vmenet2 flags=3<LEARNING,DISCOVER>
            ifmaxaddr 0 port 29 priority 0 path cost 0
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active

那个172.16.20.1是IP地址,255.255.255.0(即netmask 0xffffff00)是它的子网掩码。

Ubuntu虚机:

$ ifconfig -a

可以在该命令的输出看到如下一段内容:

ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.20.130  netmask 255.255.255.0  broadcast 172.16.20.255
        inet6 fe80::a64a:3179:ea6:660d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:57:88:47  txqueuelen 1000  (以太网)
        RX packets 45528  bytes 10454085 (10.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 23997  bytes 4456865 (4.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 45  memory 0x3fe00000-3fe20000  

那个172.16.20.130是IP地址,255.255.255.0是它的子网掩码。

对比二者的输出,可以看出MacOS宿主机和Linux虚机的共同网段是172.16.20.0,子网掩码是255.255.255.0

注意Ubuntu刚刚安装后,默认是没有安装ifconfig工具的,需要通过apt命令安装:

$ sudo apt install net-tools

安装完后就可以使用ifconfig命令了。

6)选项“-mask 255.255.255.0”是能够访问nfs服务的网段的子网掩码,吾的机器上由VMware管理的那个虚拟网段子网掩码如前面用ifconfig看到的是255.255.255.0

编辑完成/etc/exports文件之后,保存该文件,然后重新启动nfsd:

% sudo nfsd stop
% sudo nfsd start

或者:

% sudo nfsd restart

接下来配置Ubuntu虚机中的nfs客户端,首先要确保安装了nfs客户端,默认情况下,Ubuntu是没有安装nfs客户端的,打开一个终端Shell,用如下命令安装:

$ sudo apt install nfs-common

安装完成后,就可以用showmount命令查看MacOS宿主机上目录的输出情况了。如前面MacOS里ifconfig命令的输出,在吾的环境中,MacOS宿主机里输出目录绑定的IP地址是172.16.20.1,查看nfs目录输出的命令如下:

$ sudo showmount -e 172.16.20.1

可以看到该命令的输出为:

Export list for 172.16.20.1:
/Users/che/MyData 172.16.20.0

吾打算把MacOS宿主机上输出的目录挂载到Ubuntu虚机的/udata/localhost目录,为此先创建该目录:

$ sudo mkdir /udata/localhost

为便于操作,将该目录的所有者修改为当前的登录用户(吾的是che,用户组che)

$ sudo chown -R /udata/localhost che:che

现在可以用mount命令尝试挂载nfs网络文件系统了:

$ sudo mount -t nfs -o sync,noac 172.16.20.1:/Users/che/MyData /udata/localhost

挂载成功后,进入/udata/localhost查看,可以看到MacOS宿主机上的文件夹以及文件夹内容了,尝试创建一个文本文件,然后回到MacOS宿主机查看,可以看到文本文件正确被创建,而且创建者的身份已经被映射为了staff组的che。

可以歇一口气了:用nfs在MacOS和Ubuntu(Linux)之间共享文件夹是可行的,可以替代VMware自己提供的共享目录方案!

最后解决两个问题:

1)MacOS宿主机里的文件夹或文件,在Ubuntu虚机里用ls命令查看时,所有者显示的都是数字501,而用户组显示的是dialout,这是因为名为che的用户在MacOS系统中的uid是501,而同名用户在Ubuntu中是1001,MacOS中che所属的组staff,其group id是20,而Ubuntu中group id为20的组是dialout(内置的组);
2)虚机网络文件系统的挂载应该在启动时自动完成,VMware自己提供的共享目录就是这么工作的。

第一个问题不影响使用,但是为了看上去更直观,还是可以创建一个专门用来代表宿主机身份映射目标用户(吾配置的是che)的本地用户,例如名为vmnfscli,将该用户的uid指派得跟宿主机目标用户的id一样(是501),可以用如下命令:

$ sudo useradd vmnfscli -u 501 -g che

还可以进一步将该用户添加到dialout组:

$ sudo gpasswd -a vmnfscli dialout

此时再查看网络文件系统中的文件,可以看到所有者信息都成了vmnfscli:dialout(除非所有者不是目标用户)。

第二个问题需要编辑/etc/fstab文件。在编辑该文件之前为了简化挂载nfs文件系统时主机指派,可以先编辑/etc/hosts文件,将MacOS宿主机的IP地址映射为一个易读的主机名。/etc/hosts文件只有root用户有权修改,所以吾用vi命令编辑:

$ sudo vi /etc/hosts

添加上如下一行内容:

172.16.20.1   vmowner

即用主机名vmowner来标识MacOS宿主机。编辑后保存hosts文件,现在可以编辑fstab文件了,该文件同样只有root有权限修改,用vi命令编辑:

$ sudo vi /etc/fstab

添加如下一行:

vmowner:/Users/che/MyData /udata/localhost nfs sync,noac 0 0

保存后,重启Ubuntu虚拟机,然后进入/udata/localhost目录查看,可以看到MacOS宿主机上的内容已经正确挂载。
 

  • 29
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值