搭建FTP 服务器与yum本地源小结
引言
- 简介
FTP(File Transfer Protocol,文件传输协议)是用于在客户端与服务器之间双向传输文件的标准网络协议,广泛用于网站文件上传、服务器数据备份等场景。它需通过 “FTP 服务器” 提供文件存储服务,“FTP 客户端” 发起连接和传输操作,核心是解决不同设备间的文件共享问题 - 工作模式

- 准备将Centos 7-1(192.168.152.129)作为FTP客户端(client),额外下载Centos 7-1(192.168.152.130)作为FTP服务端(server),最终通过一台核心服务器(文档服务器),同时对外提供 “软件包共享(YUM)” 和 “文件共享(FTP)” 能力,满足内网中 Linux 设备的软件安装需求和跨系统的文件传输需求

一、选择 FTP 服务器软件
- ftp 命令(基础工具,系统自带)
#没有则下载
yum install ftp -y
#
ftp 192.168.152.130 # 连接FTP服务器(默认21端口)
# 输入用户名(如ftp)和密码(如空)
get test.txt # 下载服务器的test.txt到本地
put local.txt # 上传本地的local.txt到服务器
bye # 断开连接
二、基础环境准备
- 确保网络环境稳定(防火墙、端口配置)
#关闭防火墙和增强型安全功能
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 开机自关闭防火墙
setenforce 0 #临时切换到宽容模式(Permissive)
- 用户权限管理(创建 FTP 专用用户)
三、服务端搭建FTP服务器(以Linux vsftpd为例)
3.1 安装vsftpd
yum install -y vsftpd
#
systemctl start vsftpd #开启FTP服务
systemctl enable vsftpd #开机自启FTP服务
3.2 修改核心配置(/etc/vsftpd/vsftpd.conf)
cd /etc/vsftpd/
cp vsftpd.conf vsftpd.conf.bak #备份
#
#匿名访问测试
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES #开启匿名用户访问。默认已开启 12#
write_enable=YES #开放服务器的写权限(若要上传,必须开启)。默认已开启
anon_umask=022 #设置匿名用户所上传数据的权限掩码(反掩码)。
anon_upload_enable=YES #允许匿名用户.上传文件。默认已注释,需取消注释
anon_mkdir_write_enable=YES #允许匿名用户创建(上传)目录。默认已注释,需取消注释
anon_other_write_enable=YES #允许删除、重命名、覆盖等操作。需添加
#注意YEC/NO都需要大写
#
chmod 777 /var/ftp/pub/ #为匿名访问ftp的根目录下的pub子目录设置最大权限,以便匿名用户.上传数据
3.3 启动服务并设置开机自启
# 启动服务
systemctl start vsftpd
# 开机自启
systemctl enable vsftpd
# 查看状态(确认正常运行)
systemctl status vsftpd
3.4 测试服务器(以客户端192.168.152.129为例)
ftp 192.168.152.130
Connected to 192.168.152.130 (192.168.152.130).
220 (vsFTPd 3.0.2)
Name (192.168.152.130:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
- 注意服务端已经开启匿名模式,用户名: anonymous 密码: 直接回车(空密码)

四、服务端的yum本地源文件共享
4.1 yum仓库在线源工作流程

- 用户输入指令
以 yum install -y httpd 为例,用户通过该指令发起软件安装请求(-y 表示自动确认所有交互提示) - 读取仓库配置位置
yum 会读取 /etc/yum.repos.d/ 目录下的 .repo 配置文件(如图中的 CentOS-aliyun-lhr.repo、epel-aliyun.repo),这些文件定义了 Yum 仓库的地址、启用状态等关键信息 - 访问 Yum 仓库
yum 工具根据配置的仓库地址(公网或私有仓库),在仓库中寻找目标 RPM 包(如 httpd)及其依赖文件 - 缓存仓库配置
系统会将仓库的配置信息加载并存储到本地缓存中(路径通常为 /var/cache/yum/),避免重复读取配置文件,提升后续操作效率 - 后续使用缓存
再次执行 yum 安装、升级等操作时,yum 会直接从本地缓存读取仓库位置信息,简化流程、加快响应速度 - yum 缓存的作用
yum 的缓存不仅存储仓库配置,还包含软件包的元数据(如依赖关系、版本信息)和下载的 RPM 包。这一机制让离线环境下的软件管理、重复安装操作更高效,同时减少网络带宽消耗。
4.2 服务端yum本地仓库搭建
- 为何搭建本地仓库?
- 防止从在线源仓库下载rpm包时,因公网地址更新等因素而不可用
- 适合无外网环境:内网、隔离网络、生产环境无法访问互联网
- 网络不稳定:避免因网络问题导致安装失败
- 带宽限制:大量服务器同时下载时节省带宽
- 改写yum本地仓库中baseurl的指向位置到本地镜像文件,使得rpm包可以从ISO 光盘镜像获取,如 CentOS-7-x86_64-DVD-2009.iso,此镜像的 Packages 目录中包含大量 .rpm 包
- 而sr0:虚拟光驱设备(类型 rom,大小 1024M),需要挂载才能使用
- 通过 mount 命令将 /dev/sr0 挂载到 /mnt
[root@localhost yum.repos.d]# lsblk #列出系统所有块设备(磁盘、光驱等)
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
├─sda3 8:3 0 50G 0 part /
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 27G 0 part /home
sr0 11:0 1 4.4G 0 rom /mnt
# sd(硬盘类型)a(第一块硬盘)1(第一个分区)
- 到此为止已经准备好了本地yum仓库的baseurl地址
- 由于yum 会读取 /etc/yum.repos.d/ 目录下的 .repo 配置文件,先把原配置文件备份到下级目录,然后在当前目录创建空白本地软件仓库文件
[root@localhost yum.repos.d]# tree
.
├── backup
│ ├── CentOS-aliyun-lhr.repo
│ └── epel-aliyun.repo
└── local.repo
- 配置本地仓库源
[root@localhost yum.repos.d]# vi local.repo
# 添加以下内容
[local]
baseurl=file:///mnt
enabled=1
gpgcheck=0
- 重建 yum 缓存并测试
yum clean all && yum makecache
yum repolist # 查看源是否正常加载
4.3 客户端yum本地仓库搭建
- 直到配置本地仓库源之前都相同
- 添加指向服务端的baseurl
[root@localhost backup]# cat ftp.repo
[Local]
name=Local FTP Repository
baseurl=ftp://192.168.152.130/
enabled=1
gpgcheck=0
metadata_expire=300
timeout=300
retries=3
上述配置保存退出后提示报错,
4.4 对4.3报错的尝试
误解了yum仓库的概念,/etc/yum.repos.d/ 目录存放的是yum的配置文件,而不是实际的软件包文件。实际的软件仓库应该是包含 repodata 目录和大量 .rpm 软件包的文件目录
4.4.1 在FTP服务端(192.168.152.130)的操作
- 确认FTP服务正常运行
# 检查FTP服务状态
systemctl status vsftpd
# 如果未运行,启动FTP服务
systemctl start vsftpd
systemctl enable vsftpd
- 确认仓库目录结构
# 查看FTP根目录下的仓库结构
[root@localhost yum.repos.d]#ls -la /var/ftp/
总用量 0
drwxr-xr-x. 3 root root 17 10月 16 21:27 .
drwxr-xr-x. 20 root root 278 10月 16 21:27 ..
drwxrwxrwx. 2 root root 25 10月 17 09:13 pub
# pub/ 目录是FTP的默认共享目录
# 创建挂载点
mkdir -p /var/ftp/pub/centos-repo
- 将本地仓库文件链接到FTP共享目录
# 由于之前已经挂载到/mnt,创建符号链接,将/mnt目录再链接到FTP共享目录
ln -s /mnt /var/ftp/pub/centos-repo
# 验证链接是否创建成功
ls -la /var/ftp/pub/
# 看到 centos-repo -> /mnt 的符号链接
- 验证FTP可访问性
# 测试从FTP根目录访问
ls -la /var/ftp/pub/centos-repo/
# 应该看到和 /mnt/ 目录相同的内容
4.4.2 在FTP客户端(192.168.152.129)的操作:
- 创建FTP仓库配置
vi /etc/yum.repos.d/ftp.repo
#
[ftp-server]
name=FTP Server Repository
#服务端已经开启匿名模式,name:passwd应可以省略?
baseurl=ftp://192.168.152.130/pub/centos-repo
enabled=1
gpgcheck=0
- 验证配置
# 清理缓存
yum clean all
# 更新元数据
yum makecache

报错根源
[Errno 14] FTP Error 550 - Server denied you to change to the given directory
说明:Yum 配置的 FTP 仓库路径(如 ftp://192.168.152.130/var/ftp/pub/centos-repo/)存在权限限制或路径错误,FTP 服务器不允许切换到该目录,因此无法获取仓库元数据(如repodata/repomd.xml)
4.4.3 修复方法
- 路径一致:FTP 客户端看到的路径(如 ftp://192.168.152.130/pub/centos-repo/)需对应服务器实际路径(如 /var/ftp/pub/centos-repo/),避免因 anon_root 等配置导致路径映射错误。
- 权限足够:FTP 用户(匿名 / 本地)需对目标目录有 执行权限(x) 以进入目录,对 repodata 及包文件有 读取权限(r) 以获取内容。
- 检查目录权限
所属组为 root,权限为 drwxr-xr-x
[root@localhost repodata]# ls -ld /var/ftp/pub/centos-repo/
drwxr-xr-x. 8 root root 2048 11月 4 2020 /var/ftp/pub/centos-repo/
- 修改所属组改为ftp组(以便 FTP 用户能正常访问)
[root@localhost repodata]# chown :ftp /var/ftp/pub/centos-repo/
chown: 正在更改"/var/ftp/pub/centos-repo/" 的所属组: 只读文件系统
报错结果:chown: 正在更改"/var/ftp/pub/centos-repo/" 的所属组: 只读文件系统,说明该目录所在的文件系统是只读挂载的,无法修改权限 / 归属
- 元数据完整:repodata/repomd.xml 是 Yum 识别仓库的关键,缺失则需用 createrepo 重新生成。
暂时失败









