两台Ubuntu之间通过Samba共享文件夹,是我在工作中处理Linux设备间文件交换时最常用的方案。虽然Ubuntu自带的文件管理器已经能通过“其他位置”直接访问局域网主机,但要实现稳定的、可复用路径的共享,自己手动配置一次Samba,反而能让后续使用省掉很多麻烦。
这篇文章我会从Samba的实际用途讲起,把两台Ubuntu互通文件这件事的完整操作流程、配置文件解读、挂载方式和常见问题都梳理一遍。内容包含我实操时踩过的坑和总结出来的经验,后续你在自己环境里照着做,基本能避开所有比较隐蔽的雷区。适合刚接触Linux共享、需要在内网设备间交换数据的用户参考,也适合运维新手快速掌握Samba的基础配置逻辑。
1. Samba选型思路:为什么在两台Ubuntu之间依然选它
1.1 Samba解决的是什么问题
当你手头有两台Ubuntu机器,想把其中一台的目录直接当成另一台的本地文件夹来用,本质上需要一种“跨主机的文件系统访问协议”。Linux生态里可选方案不少,比如NFS、FTP、sshfs、rsync,但Samba始终是我在局域网混用场景下的默认首选。原因很直观:
- Samba实现的是SMB/CIFS协议,这是Windows、macOS、Linux三方天然支持的协议栈,意味着同一套共享配置,将来如果加入一台Windows机器也能无缝使用。
- 内核内置的cifs.ko模块对SMB协议支持成熟,吞吐、稳定性在小规模内网环境下都有保障。
- 它的权限模型与Linux本地权限结合紧密,可以通过配置精确控制多个用户的读写范围。
- 相比FTP,Samba没有冗长的文件列表刷新延迟;相比NFS,Samba在认证、广播、防火墙兼容性上更友好。
在两台Ubuntu之间共享文件,很多人第一反应是用NFS,觉得“都是Linux,没必要走SMB”。但我在实际环境中对比过:NFS虽然配置简单、性能略高,可在客户端断线重连、权限漂移、以及后续添加非Linux设备时,维护成本远高于Samba。如果你只是临时传几个文件,那怎么都行;但如果你需要长期把远端目录挂载到本地作为工作目录,Samba的容错性和工具链完善度明显更胜一筹。
1.2 Samba与Ubuntu的版本兼容性
Ubuntu官网镜像和桌面版、服务器版的迭代,并不影响Samba本身的安装方式。只要你的系统还在支持周期内,apt源里都能直接拉到对应版本的samba包。我这边主力环境是Ubuntu 22.04 LTS和24.04 LTS,两个版本在Samba配置上基本一致,主要差异在默认的SMB协议版本和某些安全策略的默认值上。
需要注意一个细节:Samba版本越高,默认的server min protocol越倾向于更安全的协议版本。较早的Ubuntu 18.04/20.04默认可能允许SMB1协议,但新版本早已默认禁用SMB1。所以如果两台机器版本差距过大,比如一台是旧版、一台是24.04,配置共享时一定要在smb.conf里显式指定一个两者都支持的server min protocol,比如SMB2_10,避免低版本机器用老协议握手时被拒。
1.3 和其他方案的选择对比
我整理了一个简单的对比表,方便你根据自己场景判断是否该用Samba:
| 方案 | 协议 | 适用场景 | 配置复杂度 | 跨平台能力 | 性能 |
|---|---|---|---|---|---|
| Samba | SMB/CIFS | 局域网多设备共享、需要用户认证 | 中等 | 极强(Win/macOS/Linux) | 稳定可靠 |
| NFS | NFS | 纯Linux环境、高性能计算集群 | 低 | 弱(Windows支持差) | 略高于Samba |
| FTP | FTP/SFTP | 临时传输、公网访问 | 低 | 强 | 一般 |
| sshfs | FUSE over SSH | 简单、临时的远程目录挂载 | 低 | 中 | 一般 |
| rsync | 自有协议 | 同步备份、增量传输 | 中 | 中 | 特定场景优秀 |
如果你只是偶尔传一次文件,rsync或者sshfs其实更轻量。但如果你想在客户端上直接操作远端文件,像本地目录一样进行浏览、编辑、保存,Samba的体验最接近“网络磁盘”这一直觉。我在日常开发中,常把编译服务器上的一块存储通过Samba挂载到工作机,这样编辑器、终端、文件管理器三层操作全都在同一套路径语义下完成,不会出现“本地一份、远端一份”这类同步混乱。
2. 环境准备:安装Samba前的必要梳理
2.1 两台Ubuntu的通信基线检查
很多人直接从“安装Samba、改配置、重启服务”开始,结果死活连不上,回头排查发现根本没有Ping通对方。所以我的建议是,动手配置之前先把通信基线打牢,至少确认三个点:
- 两台机器在同一网段,且能互相Ping通网关和对方IP。
- SSH能互连,如果SSH都不通,Samba大概率也会受同样问题拖累。
- 主机名解析正常,或者你直接使用IP进行连接,避免DNS和WINS问题干扰判断。
举例来说,我的两台测试机分别是ubuntu-server(192.168.1.10)和ubuntu-work(192.168.1.20)。首先要保证的是它们互相之间执行ping 192.168.1.10和ping 192.168.1.20都能通。如果Ping不通,先检查网卡配置、路由表、还有交换机/路由器端口,而不是急着折腾Samba。
2.2 统一用户与目录规划
Samba的共享目录不像FTP根目录那么粒度单一,它可以直接指向Linux文件系统里的任意路径。但权限模型上,Samba用户必须映射到Linux系统用户。也就是说,你需要在提供服务的那台机器上创建一个系统用户,然后把这个用户添加到Samba的用户数据库里,设置独立的Samba密码。
我做规划时通常遵循一套固定模式:
- 共享根目录放在
/srv/samba/share,不会随意放在home目录下,因为home目录可能涉及加密家目录(encrypted home),Samba服务用户无法正常读取,容易出诡异权限问题。 - 创建一个专用系统用户
sambauser,设置nologin作为shell,避免这个用户被用于其他登录用途。 - 把共享目录所有者设置为
sambauser,组设置为sambauser,权限控制在755或750。 - 如果需要多个用户看到不同子目录,我通常建立子目录并在Samba配置里用
valid users来控制访问范围。
2.3 安装Samba本体
在Ubuntu上安装Samba非常单纯,执行下面两行即可:
sudo apt update sudo apt install samba安装完成后,可以用smbd --version查看版本号。以Ubuntu 22.04为例,默认拉到的Samba版本一般是4.15系列,24.04则可能是4.19系列。这两个版本在默认配置行为上有细微差异,主要体现在密码加密算法协商和协议下限上,但普通共享场景不受影响。
安装完毕先不急着改配置,先把服务跑起来:
sudo systemctl enable --now smbd sudo systemctl status smbd如果执行systemctl status出现active (running),说明Samba服务本身已经就绪。此时/etc/samba/smb.conf是默认最小配置,还没有任何自定义共享。
3. Samba核心配置拆解:smb.conf在讲什么
3.1 配置文件的全局段([global])
/etc/samba/smb.conf是Samba的心脏。默认文件里已经有完整的注释,但真正需要关注和修改的核心参数并不多。我会直接给出一个精简且适合内网两台机器共享的全局段配置:
[global] workgroup = WORKGROUP server string = %h samba server netbios name = ubuntu-server security = user map to guest = Bad User server min protocol = SMB2_10 server max protocol = SMB3_11 log file = /var/log/samba/log.%m max log size = 1000 logging = file panic action = /usr/share/samba/panic-action obey pam restrictions = Yes unix password sync = Yes passwd program = /usr/bin/passwd %u passwd chat = *Enter\snew\s*\spo\s*password:* %n\n *Retype\snew\s*\spo\s*password:* %n\n *password\supdated\ssuccessfully* . pam password change = Yes socket options = TCP_NODELAY IPTOS_LOWDELAY这里挑几个关键参数说说为什么这样设:
security = user:Samba的认证模式。这是最常用、也最安全的模式,每个访问共享的用户都需要通过本地Samba用户数据库认证。与之相对的是security = share老古董模式,早已不推荐。map to guest = Bad User:当一个不存在于Samba数据库中的用户尝试访问共享时,自动将其映射为guest用户。这个参数常用于配置公共共享(让访客无需密码访问某目录),但如果你想要严格认证,就把它改成map to guest = Never。server min protocol = SMB2_10:关闭SMB1,避免老协议带来的安全风险,同时兼容Win10以后的默认策略。在两台Ubuntu之间,这个值完全够用。socket options = TCP_NODELAY IPTOS_LOWDELAY:降低小文件传阅时的网络延迟。虽然现代内核和Samba会自动优化TCP栈,但写上这个选项在局域网小文件场景下实测有效果。
3.2 共享目录段([share])的参数讲解
在smb.conf末尾追加共享定义。以下是我在一台服务端机器上常用的配置模板:
[myshare] comment = Ubuntu Shared Folder path = /srv/samba/share browseable = yes writable = yes valid users = sambauser create mask = 0644 directory mask = 0755 force user = sambauser force group = sambauser逐项解释:
path:共享目录的真实路径,这一项的权限需要被认真处理,Samba服务进程对它有直接读写权限。browseable = yes:同一局域网内可被自动发现或浏览到。writable = yes:允许通过Samba协议写入文件。valid users = sambauser:只有指定的Linux用户才能访问这个共享,其他用户一律拒绝。create mask = 0644:新创建的文件默认权限为rw-r--r--。如果你需要保留可执行位,可以改成0744。directory mask = 0755:新创建的目录默认权限为rwxr-xr-x。force user = sambauser:即使客户端以其他用户身份建立会话,服务端也会把所有文件操作强制映射为sambauser来执行。这一项可以有效避免多个客户端创建出的文件属主混乱问题。
3.3 配置校验与服务重载
改完配置后,不要直接重启服务,先检查配置语法:
testparm如果显示Loaded services file OK,说明配置没问题。接着重启或重载服务:
sudo systemctl restart smbd sudo systemctl reload smbd我一般用restart,因为reload在某些版本上不会完全重新解析配置文件里的共享段,可能导致新共享没有生效。完成后再用smbclient -L //127.0.0.1 -U sambauser验证是否能列出共享列表。
4. 实操:服务端配置与客户端挂载全流程
4.1 服务端完整配置步骤
假设我现在有两台机器:Ubuntu Server(IP 192.168.1.10)作为服务端,Ubuntu Desktop(IP 192.168.1.20)作为客户端。完整流程如下:
第一步,创建共享目录并设定权限:
sudo mkdir -p /srv/samba/share sudo chown -R sambauser:sambauser /srv/samba/share sudo chmod -R 0755 /srv/samba/share创建系统用户(如果还没有):
sudo useradd -M -s /usr/sbin/nologin sambauser sudo smbpasswd -a sambausersmbpasswd -a命令会要求输入两次密码,这个密码专门用于Samba访问认证,可以不同于系统密码,也可以一致,视你的安全策略而定。
第二步,编辑smb.conf:
sudo nano /etc/samba/smb.conf把上面给的[global]和[myshare]段落写进去,保存退出。
第三步,校验并重启:
testparm sudo systemctl restart smbd你也可以顺手检查一下Samba端口监听状态:
sudo ss -tlnp | grep -E '139|445'正常情况下应该能看到smbd进程监听在445和139端口,这时服务端准备完毕。
4.2 客户端图形界面访问:双击路径即可
在Ubuntu Desktop上,打开文件管理器(Files),在左侧栏找到“其他位置”,在底部“连接到服务器”输入框中填写:
smb://192.168.1.10/myshare回车后会弹出认证窗口,输入sambauser和对应的Samba密码,就能直接看到共享目录里的内容。这个方式最快,适合临时访问,但缺点是无法指定本地挂载点,无法在终端里通过绝对路径访问。
4.3 客户端命令行挂载:稳定且可复现
命令行挂载是我最常用的方式,因为挂载后可以在脚本、编译工具、终端编辑器里自由使用路径,体验等同于本地目录。
安装CIFS工具:
sudo apt install cifs-utils创建挂载点并挂载:
sudo mkdir -p /mnt/ubuntuserver sudo mount -t cifs //192.168.1.10/myshare /mnt/ubuntuserver -o username=sambauser,uid=$(id -u),gid=$(id -g),vers=3.1.1,file_mode=0644,dir_mode=0755参数解释:
username=sambauser:Samba认证用户。uid=$(id -u),gid=$(id -g):把挂载后的文件所有者映射为本地当前用户,这样可以避免文件权限显示成nobody,或者某些文件写不进去的窘境。vers=3.1.1:强制使用SMB 3.1.1协议版本,和之前服务端的server max protocol对应。file_mode=0644,dir_mode=0755:为不支持Linux权限分配的文件系统提供默认文件/目录权限。
挂载完成后,在/mnt/ubuntuserver里写文件、做同步、用rsync拉数据,一切都和本地操作一样。
4.4 开机自动挂载:编辑fstab
如果你希望客户端每次开机都自动挂载这个共享,可以在/etc/fstab里加一行:
//192.168.1.10/myshare /mnt/ubuntuserver cifs username=sambauser,password=你的密码,uid=1000,gid=1000,vers=3.1.1,file_mode=0644,dir_mode=0755,_netdev 0 0有几个注意事项特别重要:
- 不建议在
fstab的长期挂载项里明文写密码。如果是在自家内网安全环境,图省事可以这样做;严谨一点的话,推荐使用credentials=/etc/samba/credentials文件,并把这个文件的权限设为600。 _netdev这个选项很关键,告诉系统这是一个网络设备,需要等待网络就绪后再挂载。不加的话,开机时网络栈未初始化,挂载会失败。uid和gid建议写实际数字,不要写用户名,因为fstab解析时某些版本对用户名的映射不稳定。
credentials文件的写法如下:
echo "username=sambauser" > ~/.smbcredentials echo "password=你的密码" >> ~/.smbcredentials chmod 600 ~/.smbcredentials然后把fstab里的username、password替换成credentials=/home/你的用户名/.smbcredentials。
4.5 挂载时遇到权限被拒怎么办
这个是我遇到最多的问题。客户端访问时提示“Permission denied”或“无法写入”,排查顺序很关键:
先看服务端共享目录的实际权限是否允许sambauser写入:
sudo -u sambauser touch /srv/samba/share/test.txt如果这步失败,直接定位到目录属主和权限问题,别先怀疑Samba配置。
再看Samba配置里writable和force user是否生效,testparm可以给出最终解析结果。我一直觉得一个高效的排查原则是:本地层面先打通,再谈网络协议层面的问题。
5. 常见问题与排查技巧实录
5.1 连接报错“protocol negotiation failed”
这个报错最容易出现在两台机器Samba协议支持范围不一致的时候。比如新客户端默认支持SMB3,但老服务端只支持到SMB1,或者反之。解决方法是统一两侧或单侧配置:
在服务端smb.conf的[global]段里显式指定:
server min protocol = SMB2 server max protocol = SMB3_11然后重启smbd。如果改用客户端命令行挂载,可以在挂载参数里增加vers=3.0或vers=3.1.1,绕过协商。
5.2 客户端能连接,但只能读不能写
最常见原因是共享目录的本地权限不够。Samba工作在内核的用户态,受文件系统权限约束。也就是说:即使Samba配置里设置了writable = yes,如果Linux文件系统本身对sambauser没有写权限,依然无法写入。
排查步骤:
- 确认共享目录属主设置为
sambauser。 - 确认属组权限包含写权限,至少给组或其他用户开写权限。
- 确认
create mask和directory mask是否限制得过死。 - 检查挂载参数里是否带了
ro,或者file_mode是否设置为0444。
我见过不少人在fstab里写了ro却忘了,结果折腾半天配置和权限。
5.3 防火墙导致无法访问
Ubuntu桌面版默认不开ufw,服务器版则可能开着。如果之前关过或开过防火墙,需要放行Samba相关的端口:
sudo ufw allow 139/tcp sudo ufw allow 445/tcp sudo ufw allow 137/udp sudo ufw allow 138/udp也可以用更简洁的sudo ufw allow samba直接放行Samba服务。注意Samba除了TCP端口,还需要UDP的137和138用于NetBIOS名称解析。如果只放行TCP,可能导致客户端通过主机名访问时解析失败,但用IP访问却正常。
5.4 文件属主显示nobody
这个问题在客户端挂载时特别常见。原因是CIFS升版后,默认访问方式下远端用户无法映射到客户端本地的用户体系。解决办法就是挂载时用uid和gid参数强制指定属主。例如:
sudo mount -t cifs //192.168.1.10/myshare /mnt/ubuntuserver -o username=sambauser,uid=1000,gid=1000这样操作后,所有文件在客户端看来都归属于uid 1000,也就是你当前的本地用户。
5.5 挂载断连后无法自动重连
内网环境下偶尔会遇到路由器重启、服务端休眠等情况,客户端挂载会进入“不可用”状态。此时使用该目录的进程可能卡死,需要强制卸载后重新挂载:
sudo umount -l /mnt/ubuntuserver sudo mount -a-l参数是lazy unmount,可以解除卡在IO上的挂载点。如果你想要自动重连,内核的CIFS支持echo_interval参数,在挂载时添加:
-o username=sambauser,echo_interval=30,hard其中hard模式会让客户端在服务器恢复后持续重试,而不是在短暂网络故障时报Input/output error。但要注意,hard模式下如果服务器长时间不可用,客户端进程会一直阻塞在IO等待上,需要用户自行判断是否该放弃操作。
5.6 小文件传输性能差
如果你在两台Ubuntu之间通过Samba频繁操作大量小文件(比如代码仓库、图片素材目录),可能会觉得比rsync慢不少。这一部分是SMB协议本身的开销,另一部分也和网络延迟有关。
几个优化小技巧:
- 服务端在
[global]中保持socket options = TCP_NODELAY IPTOS_LOWDELAY。 - 客户端挂载参数里加上
cache=none或cache=loose,根据实际数据一致性要求取舍。小文件场景我通常用cache=none减少缓存同步损耗。 - 如果共享文件要被并行写入,建议服务端挂载共享目录时使用
strict allocate=yes,可以避免频繁扩展文件占用的性能波动。 - 对于超大文件拷贝,不要用文件管理器拖拽,用
rsync或cp命令行效率更高,进度监控也更方便。
5.7 Samba用户密码修改与同步
如果需要修改Samba用户的访问密码,执行:
sudo smbpasswd sambauser如果系统用户本身密码被修改了,想要同步到Samba密码,可以开启unix password sync = yes选项,但前提是你希望两者保持一致。有时候反而会造成困扰,比如系统密码改了,Samba密码也跟着变,导致客户端凭据失效。我一般建议保持两者独立,统一用smbpasswd管理Samba侧密码。
6. 进阶:多用户隔离与性能调优
6.1 多用户不同权限的共享规划
如果不止一个用户访问共享,比如团队里有人要读写、有人只读,可以在同一台服务端建立多个Linux用户,然后为每个用户分别设置Samba密码,smb.conf里为不同用户配置不同的valid users和read list、write list:
[teamshare] path = /srv/samba/team browseable = yes writable = no valid users = alice, bob, carol read list = alice, bob write list = carol这样alice和bob只能读取,carol可以写入。保持writable = no作为兜底策略,再通过write list精确开放写权限,比writable = yes然后试图用read list限制更安全,因为后者容易被管理员遗漏。
6.2 在共享上启用回收站功能
Samba没有原生的回收站机制,但可以通过配置vfs_recycle模块来实现。在共享段中添加:
[myshare] vfs objects = recycle recycle:repository = .deleted recycle:keeptree = yes recycle:touch = no这样客户端删除文件时,不会直接物理删除,而是移动到共享目录下的.deleted隐藏文件夹中。这个功能在多人协作时特别实用,防止误删难以恢复。注意启用后需要创建对应的.deleted目录,且目录的所有者需要能被force user写入。
6.3 网络层面如何提升实际传输速度
如果两台机器都支持千兆网卡,但Samba传输速度始终上不去,先排查链路本身的问题。用iperf3测一下两台机器之间的原始TCP吞吐量:
# 服务端(192.168.1.10) iperf3 -s # 客户端(192.168.1.20) iperf3 -c 192.168.1.10如果iperf3测得的吞吐远低于网卡速率,问题大概率在交换机端口协商、网线质量或TCP窗口设置上,与Samba无关。如果iperf3结果正常,但Samba慢,可以尝试:
- 检查服务端和客户端的网卡是否开启了
offload相关特性,比如tso、gso。在极端情况下,开启这些特性反而会导致大包传输效率下降。 - 挂载共享时增加
rsize=65536,wsize=65536参数,注意这需要设为131072倍数才有意义,直接写65536对现代内核来说已经是优化过的默认值,手动调整空间不大。 - 使用
smbstatus -S查看当前会话的传输情况,判断是读阻塞还是写阻塞,再针对性优化。
6.4 Samba时区与文件时间戳问题
Samba使用UTC存储时间戳,客户端挂载时如果时区设置不一致,可能导致文件修改时间与本地时间有偏差。Ubuntu桌面版一般会自动设置时区,服务器版如果之前直接修改过硬件时钟,可能产生时间偏移。检查方式:
timedatectl确保Local time、Universal time、RTC time都符合预期。如果RTC被设置成了local time,建议改回UTC:
sudo timedatectl set-local-rtc false这一步对文件同步校验很重要。如果你用rsync基于时间戳做增量备份,时间差会让每次同步都产生大量非必要的文件重传。
6.5 Samba备份与日志轮转
Samba自身生成的日志文件可能占满磁盘,特别是长时间运行且访问频繁的共享服务器。smb.conf里的max log size单位为KB,默认1000即1MB每个日志文件。日志文件命名格式log.%m会按照访问主机名生成独立文件,时间久了可能积累出大量小文件。
建议开启系统的logrotate对Samba日志做轮转。Ubuntu上默认的轮转配置在/etc/logrotate.d/samba,如果不存在,可以手写一个:
/var/log/samba/log.* { daily rotate 7 compress delaycompress missingok notifempty copytruncate }copytruncate的作用是备份后截断原文件,不影响正在运行的smbd进程写入。这个细节比较容易忽略,但实际运维中作用很大。
7. 安全加固与配置基线
7.1 仅允许内网IP访问
如果服务端同时有多个网络接口,或者公网IP暴露在外,建议在Samba配置的[global]段限制监听接口和允许来源。最简单的方式是用防火墙限定,也可以使用interfaces和bind interfaces only参数:
[global] interfaces = lo 192.168.1.0/24 bind interfaces only = yes绑定了接口后,只有来自该网段的请求能访问Samba端口,其他网段的连接会被直接拒绝。这个设置比防火墙多一层应用层保护。
7.2 禁止guest访问
如果你不需要匿名共享,务必确认:
map to guest = Never restrict anonymous = 2restrict anonymous = 2禁止任何匿名枚举,可以防止攻击者通过空会话获取共享列表和用户信息。针对两台内网可信机器,这个配置没有任何副作用。
7.3 配置层面的最小化暴露
Samba默认会共享打印机相关服务,如果你只是共享文件,可以在[global]增加:
load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes这些配置会关闭打印相关的IPC接口,减少不必要的服务暴露,同时也能让启动日志更干净。
7.4 Samba服务本身的更新维护
Ubuntu的apt源会定期发布Samba安全更新,建议保持系统更新:
sudo apt update && sudo apt upgrade当你执行apt upgrade看到samba包有更新时,不要犹豫。这个软件在公网上的攻击面比较大,虽然内网环境风险偏低,但及时修补总是稳妥的。更新后重启smbd服务即可,不用重新配置。
8. 从实操中沉淀下来的经验
这篇文章写到这里,已经把两台Ubuntu之间通过Samba共享文件夹的完整链路梳理清楚了:从协议选型、环境准备、配置编写、服务端部署、客户端挂载,到常见问题排查、性能优化和基础安全加固。
我在实际使用中最深的体会是:Samba配置出错,绝大多数不是协议问题,而是Linux本地权限和文件系统特性没搞清楚。创建共享前,先在服务端本地把目录权限调整到目标用户可读可写的状态;再启动Samba服务。如果本地登录测试都过不了,配置Samba共享也一样寸步难行。
另外强烈建议把客户端的挂载方式固化下来。哪怕刚开始不打算长期用,也花一分钟写好credentials文件,别把密码裸奔在fstab里。内网虽然相对可信,但一旦这台机器将来被攻破或共享出去,明文密码就是一颗定时炸弹。
最后分享一个小技巧:在客户端挂载完成后,可以用mount | grep cifs确认挂载参数是否生效。如果看到rw,relatime,vers=3.1.1这类输出,说明挂载状态正常。后续如果有权限或性能问题,第一条命令看这个,能帮你快速确认自己到底是以什么参数访问的远端共享。
Samba在Ubuntu生态里的角色,像是一座桥,把两个“各管各的”的文件系统连成一套统一的工作空间。第一次配好后,你会发现自己再也不想用U盘来回拷数据了。