
在Mac上用虚拟机运行openEuler,很快会遇到一个实际问题:Mac和虚拟机之间怎么传文件?
scp命令虽然能用,但每次都要敲一长串命令,路径容易写错。想把Mac上的代码传到虚拟机编译,或者把虚拟机生成的日志文件拿出来分析,这种重复操作一天要做很多次。有些人会用网盘中转,但这又多了一个上传下载的环节,网速慢的时候更痛苦。
理想的方案应该是什么样?就像访问本地文件夹一样,在Mac的Finder里直接打开虚拟机的目录,拖拽文件就能完成传输。Samba正好能实现这个需求。
Samba是一个实现SMB/CIFS协议的开源软件,让Linux系统可以和Windows、macOS等系统进行文件共享。macOS原生支持SMB协议,Finder可以直接连接SMB服务器,不需要安装任何客户端软件。
SMB协议最初由微软开发,用于Windows系统之间的文件共享。Samba实现了这个协议的服务端,让Linux也能提供文件共享服务。对于Mac用户来说,连接Samba服务器和连接另一台Mac电脑的体验完全一样,通过Finder的"连接服务器"功能就能完成。
主机名是openEuler,可以通过openEuler.local域名访问。
cat /etc/os-release
从输出确认系统是openEuler 25.09。Mac连接Samba时就不需要记IP地址,直接用openEuler.local域名即可。
openEuler的官方仓库中包含Samba软件包,直接用dnf安装:
sudo dnf install -y samba samba-client samba-common
从安装输出可以看到,dnf自动安装了4个相关软件包:samba主程序、samba-client客户端工具、samba-common公共组件、samba-libs库文件。版本是4.22.1,这是一个较新的稳定版本。安装完成后验证版本:
rpm -qa | grep samba
smbd --version输出显示Samba 4.22.1安装成功,smbd是Samba的守护进程。
建立一个专门的目录用于文件共享:
sudo mkdir -p /data/share
sudo chmod 777 /data/share
ls -ld /data/share
权限设置为777是为了确保任何用户都能读写这个目录,避免权限问题导致文件操作失败。在生产环境中可以根据安全需求设置更严格的权限,但对于个人开发虚拟机来说,便利性更重要。
创建一个测试文件验证目录可用:
echo "这是openEuler虚拟机中的测试文件" | sudo tee /data/share/test.txt文件创建成功,后面可以在Mac上验证能否访问到这个文件。
Samba的配置文件是/etc/samba/smb.conf,需要在文件末尾添加共享配置。先备份原配置文件:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak然后添加共享配置:
sudo tee -a /etc/samba/smb.conf > /dev/null << 'EOF'
[share]
comment = openEuler Shared Folder
path = /data/share
browseable = yes
writable = yes
guest ok = no
valid users = root
create mask = 0755
directory mask = 0755
EOF
从配置内容可以看到几个关键参数。[share]是共享名称,这个名字会在Mac的Finder里看到。path指定共享的实际路径。browseable=yes让这个共享可以被浏览。writable=yes允许写入文件。guest ok=no禁止匿名访问,必须提供用户名密码。valid users=root指定只有root用户能访问。create mask和directory mask设置新建文件和目录的权限掩码。
Samba有自己的用户数据库,需要单独创建用户:
sudo smbpasswd -a root
sudo smbpasswd -e root
执行smbpasswd命令时会提示输入密码,这个密码是Samba专用的,可以和Linux系统密码不同。输入两次确认后,显示"Added user root"说明用户创建成功。然后用-e参数启用这个用户。
用pdbedit命令可以查看Samba用户的详细信息,输出显示了用户的SID、主目录、登录时间等配置。
Samba包含两个服务:smb负责文件共享,nmb负责NetBIOS名称解析。
sudo systemctl start smb
sudo systemctl start nmb
sudo systemctl enable smb
sudo systemctl enable nmb
sudo systemctl status smb
从服务状态可以看到smb服务已经active (running),主进程PID是9955,内存占用7.4MB。日志显示"smbd version 4.22.1 started"和"ready to serve connections",说明服务已经准备好接受连接。
enable命令让服务开机自动启动,这样虚拟机重启后不需要手动启动Samba。
openEuler默认启用防火墙,需要开放Samba使用的端口:
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
sudo firewall-cmd --list-services
第一条命令将samba服务添加到防火墙规则,--permanent参数让规则持久化。reload让新规则生效。最后一条命令验证配置,输出中包含"samba"说明规则已经生效。
这一步非常关键,如果忘记配置防火墙,Mac会连接不上Samba服务,这是最常见的问题之一。
在Mac上打开Finder,按Cmd+K或者选择菜单"前往" -> "连接服务器",输入地址:
smb://openEuler.local
点击连接后会提示输入用户名和密码。选择"注册用户",输入用户名root和之前设置的Samba密码。认证通过后会显示可用的共享列表,选择"share"进行挂载。
如果avahi没有配置,这里也可以直接用IP地址,比如smb://10.211.55.3,但用域名更方便,IP变化时不需要修改配置。
连接成功后,Finder左侧边栏会出现"share",点击进入可以看到之前在虚拟机中创建的test.txt文件和"测试"文件夹。

从Finder窗口可以看到共享目录下的文件列表。test.txt显示文件大小43字节,修改时间是2025年11月2日22:22。双击可以直接打开查看内容:"这是openEuler虚拟机中的测试文件"。
在Mac的Finder里可以像操作本地文件一样进行各种操作:拖拽文件到共享目录、创建新文件夹、重命名、删除等。这些操作会实时同步到虚拟机的/data/share目录中。
配置过程中可能会遇到一个问题:服务启动正常,防火墙也配置了,Mac能连接,但是看不到共享目录下的任何文件。这很可能是SELinux导致的。
openEuler默认启用SELinux,它会阻止Samba访问文件系统。检查SELinux状态:
getenforce如果显示Enforcing,说明SELinux处于强制模式。临时关闭SELinux试试:
sudo setenforce 0
getenforce执行后显示Permissive,SELinux切换到宽容模式。这时回到Mac的Finder刷新一下,应该就能看到文件了。
这个临时方案重启后会失效。如果要永久解决,可以配置SELinux策略:
sudo semanage fcontext -a -t samba_share_t "/data/share(/.*)?"
sudo restorecon -Rv /data/share
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on或者直接禁用SELinux,编辑/etc/selinux/config,将SELINUX=enforcing改成SELINUX=disabled,重启生效。
通过Samba配置,Mac和openEuler虚拟机之间的文件传输变得像访问本地文件一样简单。
对于开发场景,可以在Mac上用VS Code或其他编辑器打开共享目录,直接编辑虚拟机里的代码文件。保存后虚拟机里立即生效,不需要scp同步。编译日志、测试结果等文件也能直接在Mac上查看,不用来回复制。
对于日常使用,下载文件、文档传输都可以通过共享目录完成。虚拟机控制台复制粘贴不方便,共享目录提供了更好的交互方式。
对于多虚拟机管理,可以给每个虚拟机配置不同的共享目录,在Mac的Finder里同时挂载多个虚拟机的共享,切换访问非常方便。
这种文件共享方式基于标准的SMB协议,不依赖虚拟机软件的专有工具,适用性更广。即使换了虚拟机软件,或者在物理机上运行openEuler,Samba配置依然有效。
通过在openEuler虚拟机上配置Samba服务,实现了Mac和虚拟机之间的无缝文件共享。整个配置过程包括安装Samba软件包、创建共享目录、配置smb.conf文件、创建Samba用户、启动服务并配置防火墙。配置完成后Mac可以通过Finder直接访问虚拟机的共享目录,像操作本地文件一样进行读写操作。配置中最容易遇到的问题是防火墙拦截和SELinux阻止,通过相应的命令都能快速解决。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。