美文网首页
FastDFS分布式文件系统

FastDFS分布式文件系统

作者: 任总 | 来源:发表于2018-11-18 23:16 被阅读97次

一、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的数据互相冗余;


访问流程

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分布式文件系统安装使用

克隆方式复制地址
实验环境
[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*  #添加软连接
添加语句

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://stackoverflow.com/questions/29224772/symlinks-are-not-included-in-buildroot-when-using-rpmbuild
https://gitee.com/jinmuming/spring-boot-fastdfs

相关文章

网友评论

      本文标题:FastDFS分布式文件系统

      本文链接:https://www.haomeiwen.com/subject/nxygxqtx.html