一、FastDFS存储
-
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
-
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务
FastDFS结构
1、Tracker:调度器
- 负责维持集群的信息,例如各group及其内部的storage node,这些信息也是storage node报告所生成;每个storage node会周期性向tracker发心跳信息;
2、storage server存储服务
以group为单位进行组织,任何一个storage server都应该属于某个group,一个group应该包含多个storage server;在同一个group内部,各storage server的数据互相冗余;
![](https://img.haomeiwen.com/i11999111/4a69afb5fa08993c.png)
3、文件访问操作
upload上传、download下载、append追加、delete删除;
4、存储文件名格式
group/M00/00/00/FILE_ID
组/索引名/一级目录/二级目录/文件id
二、FastDFS存储过程
1、上传文件Upload File
(1)、由client发起上传连接请求;
(2)、由tracker查找可用的storage server;
(3)、找到可用的storage server后,将其(ip:port)返回给client;
(4)、上传文件(文件的属性信息和文件内容);
(5)、生成文件的fid,将client提交的内容写入选定位置;
(6)、返回fid;
(7)、同步 存储文件信息至同组中的其它节点;
2、tracker如何挑选组:
(1)、rr轮询
(2)、指定组
(3)、基于可用空间进行均衡,可用空间大者胜出;
3、如何在组中挑选storage server:
(1)、rr轮询;
(2)、以ip为次序,找第一个;
(3)、以优先级为序,找第一个;
4、如何选择磁盘(存储路径):
(1)、rr轮询;
(2)、剩余可用空间大者优先;
5、生成FID文件地址:
由源头storage server ip、创建时的时间戳、大小、文件的校验码和一个随机数进行hash计算后生成;最后基于base64进行文本编码,转换为可打印字符;
6、文件同步:
- 每个storage server在文件存储完成后,会将其信息存于binlog, binlog不包含数据,仅包含文件名等元数据信息;binlog可用于同步;
7、下载文件Download File:
- 客户端上传文件完成后,会收到storage server返回的FID,而后再次用到时,client会可根据此文件发出请求;
(1)、client向tracker发请求;
(2)、tracker根据文件名定位到group,并返回此group内的某一个storage server的信息(ip:port)给client;
(3)、client向得到的ip:port发请求;
(4)、storage server查找文件,并返回其内容给client;
三、FastDFS分布式文件系统安装使用
- FastDFS项目下载源码地址:https://github.com/happyfish100
![](https://img.haomeiwen.com/i11999111/b6d93f1195872b5b.png)
![](https://img.haomeiwen.com/i11999111/7443b16ff5b0264f.png)
[root@node-60 ~]# yum install git epel-release -y
[root@node-60 ~]# yum groupinstall "Development Tools" "Server Platform Development" -y
#克隆方式下载源码
[root@node-60 ~]# git clone https://github.com/happyfish100/libfastcommon.git
[root@node-60 ~]# git clone https://github.com/happyfish100/fastdfs.git
#查看版本
[root@node-60 ~]# less libfastcommon/libfastcommon.spec | grep Version:
Version: 1.0.40
#修改目录为对应版本
[root@node-60 ~]# mv libfastcommon libfastcommon-1.0.40
#压缩
[root@node-60 ~]# tar zcf libfastcommon-1.0.40.tar.gz libfastcommon-1.0.40/*
#创建制作rpm包的目录
[root@node-60 ~]# mkdir -pv /root/rpmbuild/{SOURCES,SPECS}
mkdir: created directory ‘/root/rpmbuild’
mkdir: created directory ‘/root/rpmbuild/SOURCES’
mkdir: created directory ‘/root/rpmbuild/SPECS’
#把压缩包放到目录下
[root@node-60 ~]# mv libfastcommon-1.0.40.tar.gz rpmbuild/SOURCES/
[root@node-60 ~]# cp libfastcommon-1.0.40/libfastcommon.spec rpmbuild/SPECS/
[root@node-60 ~]# cd rpmbuild/SPECS/
#生成rpm包
[root@node-60 SPECS]# rpmbuild -bb libfastcommon.spec
[root@node-60 ~]# ls /root/rpmbuild/RPMS/x86_64/
libfastcommon-1.0.40-1.el7.centos.x86_64.rpm
libfastcommon-debuginfo-1.0.40-1.el7.centos.x86_64.rpm
libfastcommon-devel-1.0.40-1.el7.centos.x86_64.rpm
#首先安装生成的依赖库rpm
[root@node-60 ~]# yum install rpmbuild/RPMS/x86_64/libfastcommon-1.0.40-1.el7.centos.x86_64.rpm -y
[root@node-60 ~]# yum install rpmbuild/RPMS/x86_64/libfastcommon-devel-1.0.40-1.el7.centos.x86_64.rpm -y
#制作fastdfs的rpm包
#查询版本
[root@node-60 ~]# less fastdfs/fastdfs.spec | grep FDFSVersion
%define FDFSVersion 5.0.12
#修改目录为对应版本
[root@node-60 ~]# mv fastdfs fastdfs-5.0.12
#压缩
[root@node-60 ~]# tar zcf fastdfs-5.0.12.tar.gz fastdfs-5.0.12/*
#拷贝到制作目录下
[root@node-60 ~]# mv fastdfs-5.0.12.tar.gz rpmbuild/SOURCES/
[root@node-60 ~]# cp fastdfs-5.0.12/fastdfs.spec rpmbuild/SPECS/
[root@node-60 ~]# cd rpmbuild/SPECS/
#制作rpm
[root@node-60 SPECS]# rpmbuild -bb fastdfs.spec
[root@node-60 ~]# ls /root/rpmbuild/RPMS/x86_64/
fastdfs-5.0.12-1.el7.centos.x86_64.rpm
fastdfs-debuginfo-5.0.12-1.el7.centos.x86_64.rpm
fastdfs-server-5.0.12-1.el7.centos.x86_64.rpm
fastdfs-tool-5.0.12-1.el7.centos.x86_64.rpm
libfastcommon-1.0.40-1.el7.centos.x86_64.rpm
libfastcommon-debuginfo-1.0.40-1.el7.centos.x86_64.rpm
libfastcommon-devel-1.0.40-1.el7.centos.x86_64.rpm
libfdfsclient-5.0.12-1.el7.centos.x86_64.rpm
libfdfsclient-devel-5.0.12-1.el7.centos.x86_64.rpm
#删除暂时不用的debuginfo
[root@node-60 ~]# cd rpmbuild/RPMS/x86_64/
[root@node-60 x86_64]# rm -f *debuginfo*
#将rpm拷贝到其他节点
[root@node-60 ~]# for i in 61 62 63; do scp -r rpmbuild/RPMS/x86_64/ 192.168.1.${i}:/root/fastdfs; done
#安装所有rpm包
[root@node-60 ~]# yum install rpmbuild/RPMS/x86_64/*.rpm -y
#配置tacker
[root@node-60 ]# cp -r /root/fastdfs-5.0.12/conf/* /etc/fdfs/
[root@node-60 ]# vim /etc/fdfs/tracker.conf
base_path=/data/fastdfs #此目录需创建
store_lookup=2 #存储模式,0为轮询,1为指定组,2为最大磁盘空间(默认)
store_group=group2 #指定存储组,当store_lookup模式为1时候,此选项有效
store_server=0 #使用存储组有效时,0为轮询,1为ip地址最小的,2权重最大的
store_path=0 #使用存储组有效时,磁盘选项,0为轮询,1使用空间最大的
download_server=0 #下载设置,0为轮询,1下载使用上传同一节点
reserved_storage_space = 10% #预留存储空间
log_level=info #日志记录等级
run_by_group= #运行组
run_by_user= #运行用户,建议使用普通用户
allow_hosts=* #访问控制那些主机可以访问
http.server_port=80
#启动tacker
[root@node-60 fdfs]# mkdir -pv mkdir -pv /data/{storage,fastdfs} #创建基础目录和存储
[root@node-60 fdfs]# service fdfs_trackerd restart
Restarting fdfs_trackerd (via systemctl): [ OK ]
[root@node-60 fdfs]# ss -tnl
LISTEN 0 128 *:22122 *:*
#配置storage
group_name=group1 #分配组
base_path=/data/fastdfs #基础路径
store_path0=/data/storage #第一存储路径,相当于mogilefs的Dev1设备,存储路径必须从0开始计数,其他路径例如store_path1、store_path2
store_path_count=1 #可用路径
subdir_count_per_path=256 #每个目录下有256个子目录
tracker_server=192.168.1.60:22122 #tracker的ip地址
#启动storage
[root@node-60 fdfs]# service fdfs_storaged start
[root@node-60 fdfs]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 128 *:23000 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:22122 *:*
节点2、3、4配置
#拷贝配置文件到存储节点
[root@node-60 fdfs]# scp http.conf anti-steal.jpg storage.conf mime.types 192.168.1.61:/etc/fdfs/
[root@node-60 fdfs]# scp http.conf anti-steal.jpg storage.conf mime.types 192.168.1.62:/etc/fdfs/
[root@node-60 fdfs]# scp http.conf anti-steal.jpg storage.conf mime.types 192.168.1.63:/etc/fdfs/
#clinet客户端配置
[root@node-60 ~]# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
[root@node-60 ~]# vim /etc/fdfs/client.conf
base_path=/data/fastdfs #指定基础目录
tracker_server=192.168.1.60:22122 #指定tracker的ip地址
#客户端工具
fdfs_appender_test fdfs_download_file fdfs_test1
fdfs_appender_test1 fdfs_file_info#文件信息 fdfs_trackerd
fdfs_append_file fdfs_monitor fdfs_upload_appender #上传追加文件
fdfs_crc32 fdfs_storaged fdfs_upload_file #上传文件
fdfs_delete_file #删除文件 fdfs_test
#上传文件测试
[root@node-60 ~]# fdfs_upload_file /etc/fdfs/client.conf /usr/share/wallpapers/backgrounds/day.jpg
group2/M00/00/00/wKgBPlvu4YqAXmBoAA6q2xIny8Y338.jpg #文件储存位置
#查询储存文件信息
[root@node-60 ~]# fdfs_file_info /etc/fdfs/client.conf group2/M00/00/00/wKgBPlvu4YqAXmBoAA6q2xIny8Y338.jpg
source storage id: 0
source ip address: 192.168.1.62
file create timestamp: 2018-11-16 23:26:02
file size: 961243
file crc32: 304597958 (0x1227CBC6)
#查询节点3和节点4,镜像组同步情况
[root@node-62 ~]# ls /data/storage/data/00/00
wKgBPlvu4YqAXmBoAA6q2xIny8Y338.jpg
[root@node-63~]# ls /data/storage/data/00/00
wKgBPlvu4YqAXmBoAA6q2xIny8Y338.jpg
#安装nginx反向代理
#安装依赖包
yum -y install openssl openssl-devel pcre-devel
#下载nginx
[root@node-60 ~]# useradd -r nginx
[root@node-60 ~]# wget http://nginx.org/download/nginx-1.6.3.tar.gz
#下载nginx第三方模块
[root@node-60 ~]# git clone https://github.com/happyfish100/fastdfs-nginx-module.git
#编译安装nginx
[root@node-60 nginx-1.6.3]# ./configure \
> --prefix=/usr \
> --sbin-path=/usr/sbin/nginx \
> --conf-path=/etc/nginx/nginx.conf \
> --error-log-path=/var/log/nginx/error.log \
> --http-log-path=/var/log/nginx/access.log \
> --pid-path=/var/run/nginx/nginx.pid \
> --lock-path=/var/lock/nginx.lock \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_flv_module \
> --with-http_stub_status_module \
> --with-http_gzip_static_module \
> --http-client-body-temp-path=/var/tmp/nginx/client/ \
> --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
> --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
> --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
> --http-scgi-temp-path=/var/tmp/nginx/scgi \
> --with-pcre \
> --with-debug \
> --add-module=../fastdfs-nginx-module/src
[root@node-60 nginx-1.6.3]# make&&make install
#编辑nginx启动脚本
[root@node-60 ~]# vim /etc/rc.d/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
[root@node-60 ~]# chmod +x /etc/rc.d/init.d/nginx
[root@node-60 ~]# mkdir -pv /var/tmp/nginx/clinent/
[root@node-60 ~]# touch /data/fastdfs/logs/mod_fastdfs.log
[root@node-60 ~]# chown -R nginx.nginx /data/fastdfs/logs/mod_fastdfs.log
#拷贝配置文件到etc目录
[root@node-60 ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#编辑配置文件
[root@node-60 ~]# vim /etc/fdfs/mod_fastdfs.conf
base_path=/data/fastdfs
tracker_server=192.168.1.60:22122
storage_server_port=23000
group_name=group1
store_path_count=1
store_path0=/data/storage
log_filename=/data/fastdfs/logs/mod_fastdfs.log
#编辑nginx配置文件
[root@node-60 ~]# vim /etc/nginx/nginx.conf
.............
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /M00 {
alias /data/fastdfs/data;
ngx_fastdfs_module;
}
#启动 nginx
[root@node-60 ~]# service nginx start
其他节点2、3、4分别安装
#同步时间
#安装epel源
[root@node-61 ~]# yum install epel-release -y
#安装fastdfs的rpm包
[root@node-61 ~]# yum install fastdfs/*.rpm -y
#创建基础目录和存储
[root@node-61 ~]# mkdir -pv mkdir -pv /data/{storage,fastdfs}
mkdir: created directory ‘mkdir’
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/storage’
mkdir: created directory ‘/data/fastdfs’
#查询节点1拷贝的配置文件,确认启动storaged服务
[root@node-61 fdfs]# service fdfs_storaged start
#安装nginx反向代理
#安装依赖包
yum -y install openssl openssl-devel pcre-devel
#下载nginx
[root@node-61 ~]# useradd -r nginx
[root@node-61 ~]# wget http://nginx.org/download/nginx-1.6.3.tar.gz
#下载nginx第三方模块
[root@node-61 ~]# git clone https://github.com/happyfish100/fastdfs-nginx-module.git
#编译安装nginx
[root@node-61 nginx-1.6.3]# ./configure \
> --prefix=/usr \
> --sbin-path=/usr/sbin/nginx \
> --conf-path=/etc/nginx/nginx.conf \
> --error-log-path=/var/log/nginx/error.log \
> --http-log-path=/var/log/nginx/access.log \
> --pid-path=/var/run/nginx/nginx.pid \
> --lock-path=/var/lock/nginx.lock \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_flv_module \
> --with-http_stub_status_module \
> --with-http_gzip_static_module \
> --http-client-body-temp-path=/var/tmp/nginx/client/ \
> --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
> --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
> --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
> --http-scgi-temp-path=/var/tmp/nginx/scgi \
> --with-pcre \
> --with-debug \
> --add-module=../fastdfs-nginx-module/src
[root@node-61 nginx-1.6.3]# make&&make install
#编辑nginx启动脚本
[root@node-61 ~]# vim /etc/rc.d/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
[root@node-61 ~]# chmod +x /etc/rc.d/init.d/nginx
[root@node-61 ~]# mkdir -pv /var/tmp/nginx/clinent/
[root@node-61 ~]# touch /data/fastdfs/logs/mod_fastdfs.log
[root@node-61 ~]# chown -R nginx.nginx /data/fastdfs/logs/mod_fastdfs.log
#拷贝配置文件到etc目录
[root@node-61 ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#编辑配置文件
[root@node-61 ~]# vim /etc/fdfs/mod_fastdfs.conf
base_path=/data/fastdfs
tracker_server=192.168.1.60:22122
storage_server_port=23000
group_name=group1
store_path_count=1
store_path0=/data/storage
log_filename=/data/fastdfs/logs/mod_fastdfs.log
#编辑nginx配置文件
[root@node-61 ~]# vim /etc/nginx/nginx.conf
.............
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /M00 {
alias /data/fastdfs/data;
ngx_fastdfs_module;
}
#启动 nginx
[root@node-61 ~]# service nginx start
其中的节点3和节点4编辑为第二组
[root@node-62 ~]# vim /etc/fdfs/storage.conf
group_name=group2
#查询节点1拷贝的配置文件,确认启动storaged服务
[root@node-62 fdfs]# service fdfs_storaged start
[root@node-63 ~]# vim /etc/fdfs/storage.conf
group_name=group2
#查询节点1拷贝的配置文件,确认启动storaged服务
[root@node-63 fdfs]# service fdfs_storaged start
四、编译报错和解决
1、rpm编译报错1
RPM build errors:
Symlink points to BuildRoot: /usr/lib/libfastcommon.so -> /root/rpmbuild/BUILDROOT/libfastcommon-1.0.40-1.el7.centos.x86_64/usr/lib64/libfastcommon.so
[root@node-60 ~]# ln -sf /usr/lib/libfastcommon.so /root/rpmbuild/BUILDROOT/libfastcommon-1.0.40-1.el7.centos.x86_64/usr/lib64/libfastcommon.so
原因:spec文件使用绝对路径,修改软链接使用%{buildroot}相对路径。
#解决:在.spec中的%install构建部分添加:
ln -sf '目标文件' %{buildroot}/'软连接文件'
这个‘软连接’通常出现在%files部分中引用
#修改.spec
[root@node-60]# vim rpmbuild/SPECS/libfastcommon.spec
%install
rm -rf %{buildroot}
DESTDIR=$RPM_BUILD_ROOT ./make.sh install
ln -sf usr/lib64/libfastcommon.so* %{buildroot}/usr/lib/libfastcommon.so* #添加软连接
![](https://img.haomeiwen.com/i11999111/0a474499e367d9ee.png)
2、rpm编译报错2
RPM build errors:
Installed (but unpackaged) file(s) found:
/etc/fdfs/http.conf.sample
/etc/fdfs/mime.types.sample
原因:spec文件中,“%files”部分中未指定将要安装的文件列表。
#解决:
编译过程中删除这些文件
#修改
[root@node-60]# vim rpmbuild/SPECS/fastdfs.spec
%clean
rm -rf %{buildroot} #把这里的#号删除,启用此语句
![](https://img.haomeiwen.com/i11999111/1edbd1e1abe0d7d7.png)
参考文献:https://stackoverflow.com/questions/29224772/symlinks-are-not-included-in-buildroot-when-using-rpmbuild
https://gitee.com/jinmuming/spring-boot-fastdfs
网友评论