file_transfer 主要用于实现 BMC 与外部系统之间的文件传输能力
组件概述
组件是什么、解决什么问题
file_transfer 是独立部署的文件传输服务组件(部署服务 file_transfer.service),对外提供资源树功能接口 bmc.kepler.Managers.FileTransfer,解决 BMC 与远端服务器/存储之间的文件交换问题:
- 上传/下载:将 BMC 本地文件上传到远端(SFTP/SCP/HTTPS/SMB/CIFS/NFS),或将远端文件下载到 BMC 本地(
/tmp目录)。 - 文件系统挂载/解挂:将远端 NFS/CIFS 共享目录挂载到 BMC 本地挂载点,便于直接读写共享文件。
- 连通性检测:检测远端 SFTP/NFS 服务器是否可达,供上层(如升级、日志导出)预检网络。
组件通过 curl 或 mount 完成实际传输,传输过程异步执行并以**任务(TaskService)**形式向调用方回报进度与结果。
核心功能
| 功能 | 说明 |
|---|---|
| StartTransfer | 文件上传/下载,支持 HTTPS/SFTP/SCP/CIFS/NFS/SMB 协议,异步任务化 |
| Mount / Umount | NFS/CIFS 文件系统挂载与解挂 |
| TestConnection | SFTP/NFS 远端服务器网络连通性检测 |
| HTTPS 证书校验 | HttpsTransferCertVerification 属性控制是否校验服务器证书 |
| 任务管理 | 每次操作创建 TaskService 任务,可查询进度/状态/错误码 |
术语解释
| 术语 | 解释 |
|---|---|
| src_url / target_url | 传输源地址 / 目标地址。file:// 出现在 src_url 中为上传,否则为下载 |
| TaskService | 任务服务对象,传输以任务形式异步执行,通过任务 ID 查询进度与结果 |
| 挂载点 | Linux 中用于访问文件系统内容的目录(如 /tmp/nfs) |
| HTTPS 证书校验 | 传输时是否校验服务器 CA 证书(/data/trust/cert/ca/ 目录下的 .crt/.0 证书及 .crl/.r0 吊销列表) |
外部系统交互边界
说明:file_transfer 为纯北向服务组件,不依赖其他 BMC 组件的数据源;调用方通过 D-Bus 资源树接口调用,实际网络传输发生在组件内部线程。
对外接口
资源协作接口
FileTransfer
Path:
/bmc/kepler/Managers/1/FileTransferInterface:
bmc.kepler.Managers.FileTransfer
属性:
| 属性名称 | 属性类型 | 读写 | 取值范围 | 属性说明 |
|---|---|---|---|---|
| HttpsTransferCertVerification | bool | RW | true/false | HTTPS 证书校验使能状态,是否启用证书校验。true:传输时校验服务器证书;false:不校验。写权限要求 SecurityMgmt |
方法:
| 方法 | 描述 |
|---|---|
| StartTransfer | 传输文件,支持上传与下载 |
| Mount | 挂载文件系统,仅支持 NFS 和 CIFS 协议 |
| Umount | 解挂文件系统 |
| TestConnection | 检测远端服务器网络连通性(支持 SFTP、NFS) |
传输文件 StartTransfer
用于文件的上传和下载,通过 file:// 所在的字符串判断当前操作是上传还是下载:file:// 在 src_url 中则为上传,反之为下载。方法内部创建任务(TaskService)并异步执行传输,立即返回任务 ID。
输入:
context(a{ss}):调用上下文(调用者信息)src_url(string):源地址,协议格式为协议://用户名:密码@IP地址/路径,例如sftp://username:password@ipaddr/xxxtarget_url(string):目标地址,本地地址使用file:///tmp/xxx形式max_length(uint32):文件大小上限(字节),仅下载有效,上传的大小/敏感信息检查由调用方完成uid(uint32):文件属主 UID,仅下载有效gid(uint32):文件属组 GID,仅下载有效permission(uint32):文件权限,仅下载有效
输出:
task_id(uint32):传输任务标识,用于查询任务状态
示例:
使用 sftp 协议下载一个长度小于 1000 字节的 xxx 文件到 /tmp 目录下,用户/用户组为 root,权限为 640:
StartTransfer(ctx, "sftp://username:password@ipaddr/xxx", "file:///tmp/xxx", 1000(max_length), 0(uid), 0(gid), 640(permission))异常与触发条件:
| 异常 | 触发条件 |
|---|---|
GError:src file with protocol type error / target file with protocol type error | src_url 或 target_url 的协议不在支持列表(https/sftp/scp/smb/cifs/nfs/file)内 |
GError:Protocol type error, src is file... | src_url 与 target_url 同时为 file:// 或同时不是 file://(必须一端为远端地址、一端为本地 file://) |
GError:filepath is illegal, must in /tmp | 本地 file:// 路径不在 /tmp 或 /data/sp/ 目录下 |
GError:SFTP NOT supportted | 使用 tftp 协议(当前版本禁用 tftp) |
GError:Creat TaskService failed, try again later | 并发任务数已达 32 上限且无已完成任务可复用 |
任务状态 Exception,Parameters 携带 {"ErrorCode": -xxx} | 传输过程失败,通过 TaskService 任务查询错误码(见「问题定界指南」错误码表) |
首发版本: file_transfer 1.140.1(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:升级包/日志/配置文件在 BMC 与远端服务器之间上传下载。
- 限制条件:
- 本地路径必须在
/tmp(或/data/sp/)下,非 /tmp 路径需评审后以白名单形式管理; - 下载大小受
max_length与 /tmp 剩余空间双重限制,且单文件硬上限 500MB(0x1F400000); - 任务最多 32 个,任务存活最长 40 分钟,超时后对象销毁、进度强制置 100;
- 下载完成后文件属主/属组/权限由 uid/gid/permission 设置;上传的大小/敏感信息检查由调用方完成。
- 本地路径必须在
调试示例:
# 1) 查询资源树对象与属性
busctl --user introspect bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer
busctl --user get-property bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer HttpsTransferCertVerification
# 相应: b true
# 2) 调用 StartTransfer(sftp 下载 /xxx 到 /tmp/xxx,长度<1000,root:root,权限 640)
busctl --user call bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer StartTransfer a{ss}ssuuuu 0 \
'sftp://username:password@ipaddr/xxx' 'file:///tmp/xxx' 1000 0 0 640
# 相应: u 3 (u 为任务 ID)
# 3) 查询传输任务状态(State: Completed/Exception,Progress,Parameters 含 ErrorCode)
busctl --user get-property bmc.kepler.file_transfer \
/bmc/kepler/Managers/1/FileTransfer/TaskService/Tasks/3 \
bmc.kepler.Tasks.TaskService State
# 相应: s "Completed"挂载文件系统 Mount
用于挂载文件系统,只支持 NFS 和 CIFS 协议。
输入:
context(a{ss}):调用上下文(调用者信息)Src(string):服务端地址,例如nfs://nfsaddr/NFSShare/MountPoint(string):本地挂载点,例如/tmp/nfs
输出:
Result(int32):挂载结果,0 表示成功,非 0 表示失败
示例:
使用 nfs 协议,将 nfs 服务器上的 NFSShare 目录挂载到 /tmp/nfs 目录:
Mount(ctx, "nfs://nfsaddr/NFSShare/", "/tmp/nfs")异常与触发条件:
| 异常 | 触发条件 |
|---|---|
GError:Invalid protocol | Src 协议不是 nfs/cifs |
GError:Url parse failed / Get source directory failed | Src 地址格式非法(缺少 ://、IP 为空、路径非法) |
GError:Mount failed, ret = -1 | 挂载失败(详见日志 NFS mount failed, please check your pram. / CIFS mount failed...) |
| Result = UNKNOWN_ERROR(-1) | 以上任一失败场景的输出结果 |
首发版本: file_transfer 1.140.1(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:将远端 NFS/CIFS 共享目录挂载到 BMC 本地挂载点,直接读写共享文件。
- 限制条件:
- 仅支持 nfs、cifs 协议;CIFS 挂载内部会转换为
//IP/共享名形式并通过 smb 协议访问; - 挂载前会先 ping 远端 IP(3 次),ping 不通直接失败;
- 密码等挂载参数存在特殊字符(
,;$|&><\!` 及换行)时拒绝挂载; - 挂载点需提前创建且可写,挂载成功后由调用方负责解挂。
- 仅支持 nfs、cifs 协议;CIFS 挂载内部会转换为
调试示例:
# nfs 挂载
busctl --user call bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer Mount a{ss}ss 0 'nfs://nfsaddr/NFSShare/' '/tmp/nfs'
# 相应: i 0 (0 表示成功)
# cifs 挂载
busctl --user call bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer Mount a{ss}ss 0 'cifs://user:pass@ip/Share/' '/tmp/cifs'
# 相应: i 0
# 查看当前挂载情况
mount | grep /tmp/nfs解挂文件系统 Umount
用于解挂文件系统。
输入:
context(a{ss}):调用上下文(调用者信息)MountPoint(string):挂载点,例如/tmp/nfs
输出:
Result(int32):解挂结果,0 表示成功,非 0 表示失败
示例:
解挂挂载点为 /tmp/nfs 的文件系统:
Umount(ctx, "/tmp/nfs")异常与触发条件:
| 异常 | 触发条件 |
|---|---|
GError:Umount failed, ret = -1 | 解挂失败(挂载点未挂载、busy 等) |
| Result = UNKNOWN_ERROR(-1) | 解挂失败时的输出结果 |
首发版本: file_transfer 1.140.1(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:传输/挂载完成后释放挂载点,避免遗留挂载影响后续操作。
- 限制条件:挂载点必须已挂载;挂载点被占用(busy)时解挂失败,需先释放占用进程。
调试示例:
busctl --user call bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer Umount a{ss}s 0 '/tmp/nfs'
# 相应: i 0检测远端连通性 TestConnection
检测远端服务器网络连通性。当前支持 SFTP、NFS 协议,其他协议不支持。方法内部创建任务异步执行检测,立即返回任务 ID,检测结果(成功/失败)通过任务状态上报。
输入:
context(a{ss}):调用上下文(调用者信息)Protocol(string):协议类型,支持sftp、nfsAddress(string):服务器地址Port(uint16):端口号UserName(string):用户名Password(string):密码,敏感信息
输出:
TaskId(uint32):连通性检测任务标识,用于查询任务状态
异常与触发条件:
| 异常 | 触发条件 |
|---|---|
GError:Protocol(xxx) connectivity test is not supported | Protocol 不是 sftp/nfs |
GError:Creat TaskService failed, try again later | 任务数已达上限 |
任务状态 Exception | 连接失败/超时(sftp 连接超时 15s、操作超时 30s;nfs 挂载失败等),任务 Parameters 携带 ErrorCode |
首发版本: file_transfer 1.140.1(bmcsdk 25.x)
应用场景与限制条件:
- 典型场景:升级、日志导出等业务在发起前预检远端 SFTP/NFS 服务器可达性。
- 限制条件:仅支持 sftp、nfs 协议;sftp 依赖 curl(连接超时 15s、操作超时 30s);nfs 通过挂载共享根目录再解挂验证;检测结果为异步,需通过任务状态(Completed/Exception)判断。
调试示例:
# sftp 连通性检测
busctl --user call bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer TestConnection a{ss}ssqss 0 sftp 192.168.1.10 22 user pass
# 相应: u 5 (任务 ID)
# 查询检测结果
busctl --user get-property bmc.kepler.file_transfer \
/bmc/kepler/Managers/1/FileTransfer/TaskService/Tasks/5 \
bmc.kepler.Tasks.TaskService State
# 相应: s "Completed"IPMI接口
不涉及
配置介绍
数字证书
证书存放在 /data/trust/cert/ca/ 目录下,可能有 .crt、.crl、.0、.r0 四种后缀,其中 .0 和 .crt 功能一致(CA 证书),.r0 和 .crl 功能一致(证书吊销列表),目前同时兼容两种版本。
资源树属性 HttpsTransferCertVerification 决定了进行文件传输时是否对上传下载的 url 进行证书校验:true 时用证书目录中的证书校验服务器身份,false 时不校验。
组件扩展案例
扩展能力概述
file_transfer 的扩展能力体现在 HTTPS 服务器 CA 证书信任管理:通过向证书目录投放证书(.crt/.0 及吊销列表 .crl/.0)即可扩展可信任的 HTTPS 文件服务器,无需改动组件代码。
扩展点说明
| 扩展点 | 说明 |
|---|---|
| 证书目录 | /data/trust/cert/ca/,组件启动或传输时扫描该目录下的证书文件 |
| 证书后缀 | .crt/.0:CA 证书(两者功能一致);.crl/.r0:证书吊销列表(两者功能一致) |
| 使能开关 | 资源树属性 HttpsTransferCertVerification(默认 true):true 校验服务器证书,false 不校验 |
二次开发指导
步骤一:投放证书
将需要信任的 HTTPS 文件服务器根证书拷贝到 /data/trust/cert/ca/ 目录下,文件名为证书标识,后缀 .crt 或 .0(例如 myserver.crt)。
cp myserver.crt /data/trust/cert/ca/步骤二:使能证书校验
确认资源树属性 HttpsTransferCertVerification 为 true(默认值):
busctl --user get-property bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer HttpsTransferCertVerification
# 相应: b true若为 false,可通过资源树写操作或 Redfish 使能:
busctl --user set-property bmc.kepler.file_transfer /bmc/kepler/Managers/1/FileTransfer \
bmc.kepler.Managers.FileTransfer HttpsTransferCertVerification b true验证方法
| 场景 | 预期结果 | 关键日志 |
|---|---|---|
| 证书目录存在且证书正确 | HTTPS 下载成功,任务状态 Completed | try use remote https file transfer server root cert0 failed(无)→ 传输成功 |
| 证书不存在或校验失败 | 任务状态 Exception,ErrorCode=-122 | https server root cert0 failed, ret=60 / curl_easy_perform error: 60 |
| 关闭证书校验 | 即使证书不匹配也可传输 | CURLOPT_SSL_VERIFYPEER 置 0,无证书相关报错 |
注意事项
- 证书文件权限需保证 file_transfer 进程(root)可读;
- 同名证书同时存在
.crt与.0时按目录扫描顺序生效,建议只保留一种后缀;- 关闭证书校验(
HttpsTransferCertVerification=false)存在安全风险,生产环境不建议;- 修改证书后无需重启服务,下次传输自动读取;
- 吊销列表(
.crl/.r0)存在时一并参与校验。
问题定界指南
典型问题定界
| 现象描述 | 是否为本组件问题 | 判断依据 | 关键证据收集方法 |
|---|---|---|---|
| HTTPS 传输失败,任务 ErrorCode=-122 | 是 | 证书校验失败 | 日志含 CURL_PEER_SSL_VERIFY_FAILED、https server root cert0 failed, ret=60;检查证书目录与远端证书链 |
| 下载失败,ErrorCode=-103 | 是 | 文件超长或 /tmp 空间不足 | 日志含 the file length out of maxlength or free memory;df -h /tmp 查剩余空间 |
| 下载失败,ErrorCode=-105 | 是 | curl 传输失败 | 日志含 curl failed, ret=%d、curl_easy_perform error;检查网络与远端服务 |
| NFS/CIFS 挂载失败 | 是 | 挂载参数或网络问题 | 日志含 NFS mount failed, please check your pram. / CIFS mount failed...;ping 远端 IP 验证网络 |
| 上传失败,ErrorCode=-107 | 是 | 本地文件不可读/不存在 | 日志含 Open local file failed,filename;检查本地文件存在性与权限 |
调用报 filepath is illegal, must in /tmp | 否(调用方入参问题) | 本地路径不在 /tmp 或 /data/sp/ | 检查调用方传入的 file:// 路径 |
调用报 SFTP NOT supportted | 否(调用方入参问题) | 使用了 tftp 协议 | 检查调用方 URL 协议 |
错误码速查表
传输/挂载/连通性任务失败时,任务对象的 Parameters 会携带 {"ErrorCode": -xxx},MessageId 为 FileTransferErrorDesc,MessageArgs 为错误描述。
| 错误码 | 含义 | 可能原因 | 排查建议 |
|---|---|---|---|
| -1 | unknown error | 通用错误 | 结合日志定位 |
| -101 | 文件不允许下载 | 目标为 dump_info.tar.gz 等受保护文件 | 更换下载目标 |
| -102 | 文件名超长 | URL 中文件名过长 | 缩短文件名 |
| -103 | 文件超长或内存不足 | 超过 max_length 或 /tmp 空间不足 | 增大 max_length 或清理 /tmp |
| -104 | 设置升级标志失败 | 内部错误 | 收集日志反馈 |
| -105 | curl 传输失败 | 网络/远端服务异常、超时 | 检查网络、重试 |
| -106 | 上传不可用 | 上传前检查失败 | 检查上传 URL |
| -107 | 本地文件不可用 | 文件不存在或不可读 | 检查本地文件 |
| -108 | 协议不被允许 | 协议不在支持列表 | 使用支持协议 |
| -109 | URL 格式错误 | 缺少 ://、IP 为空、路径非法 | 检查 URL 格式 |
| -110 | SP 被 x86 系统占用 | SP 被占用 | 释放 SP 后重试 |
| -111 | 共享目录无法挂载 | NFS/CIFS 共享不可达 | 检查共享配置与网络 |
| -112 | 文件校验失败 | URI 或 SP 文件错误 | 检查 URI/文件 |
| -113 | URI 格式错误 | 与 -109 类似 | 检查 URI |
| -114 | 传输超时 | 网络环境差 | 检查网络环境 |
| -115 | SP 忙 | 请稍后重试 | 稍后重试 |
| -116 | SP 工具升级失败 | SP 工具异常 | 检查 SP |
| -117 | 查找类失败 | 内部错误 | 收集日志反馈 |
| -118 | 挂载 SP 设备失败 | SP 设备异常 | 检查 SP |
| -119 | 需要 x86_64 架构 SmartProvisioning DVD | 架构不匹配 | 插入对应 DVD |
| -120 | 需要 aarch64 架构 SmartProvisioning DVD | 架构不匹配 | 插入对应 DVD |
| -121 | 固件正在升级中 | 升级进行中禁止传输 | 升级完成后重试 |
| -122 | 对端证书或指纹校验失败 | 证书链不信任/证书过期 | 检查证书目录与远端证书链 |
| -123 | 无权限覆盖同名文件 | 目标文件权限受限 | 检查目标文件权限 |
调试方法
file_transfer 使用 libmc4c 日志框架,日志默认打到 syslog/journald(服务 file_transfer.service),可用 journalctl -u file_transfer.service -f 实时查看。复现方法:调用 StartTransfer/Mount/TestConnection 后,在任务对象上查看 State/Parameters/MessageArgs,结合日志关键字定位。
日志说明
一键日志收集
一键日志收集(AppDump/日志导出)涉及 file_transfer 的日志文件如下:
| 文件路径 | 内容说明 |
|---|---|
| journald / syslog(file_transfer 模块) | 运行日志:start to transfer、curl failed, ret=、NFS mount failed、connect server failed 等 |
| 操作日志(operation_log) | 关键操作记录:Enable/Disable remote HTTPS server certificate verification successfully、Connect to %s through %s successfully/faild、Set file_transfer manufacturer default configuration successfully/failed |
/data/persistence/file_transfer/per.db | 配置持久化数据库(出厂恢复/备份涉及) |
关键日志信息
| 日志片段 | 级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
start to transfer | NOTICE | 收到 StartTransfer 调用 | 无需处理 |
filepath is illegal, must in /tmp | ERROR | 本地路径不在 /tmp | 检查调用方路径 |
SFTP NOT supportted | ERROR | 使用了 tftp 协议 | 更换协议 |
the file length out of maxlength or free memory | ERROR | 文件超长或内存不足 | 调整 max_length / 清理 /tmp |
download file length out of MAXLEN | ERROR | 超过 500MB 硬上限 | 拆分文件 |
curl failed, ret=%d, %s | ERROR | curl 传输失败 | 检查网络与远端服务 |
https server root cert%u failed, ret=%d | ERROR | HTTPS 证书校验失败 | 检查证书目录 |
NFS mount failed, please check your pram. | ERROR | NFS 挂载失败 | 检查共享与网络 |
CIFS mount failed, please check your pram. | ERROR | CIFS 挂载失败 | 检查共享与网络 |
the mount addr(%s) is not support | ERROR | 挂载地址格式非法 | 检查 Src 格式 |
ping failed | ERROR | 远端 IP 不通 | 检查网络 |
connect server failed, ret: %s | ERROR | SFTP 连通性检测失败 | 检查网络与认证 |
umount_file system error, ret:%d | ERROR | 解挂失败 | 释放挂载占用后重试 |
FAQ
Q1:HTTPS 传输失败,任务错误码 -122,日志提示证书校验失败?
一句话答案: 远端 HTTPS 服务器证书不在信任列表中,检查 /data/trust/cert/ca/ 证书或临时关闭证书校验。
根因: HttpsTransferCertVerification 为 true 时,组件用证书目录中的证书逐一校验证书链,失败返回 -122(CURL_PEER_SSL_VERIFY_FAILED)。
解决方案: ① 将远端服务器根证书导入 /data/trust/cert/ca/;② 或临时置 HttpsTransferCertVerification=false 关闭校验(生产环境不建议)。
适用版本: file_transfer 1.140.1 及以上。
Q2:下载报错 -103,提示文件超长?
一句话答案: 待下载文件超过 max_length 或 /tmp 空间不足。
根因: 组件先比较文件大小与 max_length,再比较 max_length 与 /tmp 剩余空间,取小者;同时存在 500MB 硬上限。
解决方案: 调大 max_length、清理 /tmp 或拆分文件。
适用版本: 全版本。
Q3:为什么 tftp 协议不支持?
一句话答案: 当前版本禁用 tftp,仅支持 https/sftp/scp/smb/cifs/nfs。
根因: 源码中对 tftp 协议直接返回 SFTP NOT supportted,仅保留协议枚举未实现功能。
解决方案: 使用 sftp 或 https 替代。
适用版本: file_transfer 1.140.1。
Q4:任务查询不到或进度一直为 100?
一句话答案: 任务最多 32 个、存活 40 分钟,超时销毁;进度 100 表示已结束。
根因: 任务完成/销毁后对象不在位;进度 100 是任务结束(含失败)后的终态。
解决方案: 传输结束后尽快查询任务结果;失败时通过任务 Parameters 的 ErrorCode 定位。
适用版本: 全版本。