草庐IT

GPFS 文件系统部署步骤

右手 2023-04-21 原文

GPFS 文件系统部署步骤

  参考文档:
  简书网友提供: 
    https://www.jianshu.com/p/a0ecc0838b3b?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
  编程圈网友提供:
    https://www.bianchengquan.com/article/131965.html
  官方网站提供:
    https://www.ibm.com/docs/en/spectrum-scale/5.0.3?topic=installing-spectrum-scale-linux-nodes-deploying-protocols
  添加GPFS Client操作
    https://www.sohu.com/a/213249408_151779/

一、GPFS介绍

  IBM Spectrum Scale是一个集群文件系统,它提供从多个节点对单个文件系统或一组文件系统的并发访问。节点可以是 SAN 连接的、网络连接的、SAN 连接和网络连接的混合,或者在无共享集群配置中。这可以实现对这组通用数据的高性能访问,以支持横向扩展解决方案或提供高可用性平台。
  IBM Spectrum Scale具有许多常见数据访问之外的功能,包括数据复制、基于策略的存储管理和多站点操作。您可以创建由 AIX® 节点、Linux 节点、Windows 服务器节点或三者混合组成的集群。IBM Spectrum Scale可以在虚拟化实例上运行,提供环境中的通用数据访问、利用逻辑分区或其他管理程序。多个IBM Spectrum Scale集群可以在一个位置内或跨广域网 (WAN) 连接共享数据。
IBM Spectrum Scale 的优势
  IBM Spectrum Scale提供了一个全局命名空间、 IBM Spectrum Scale 集群之间的共享文件系统访问、多个节点的同步文件访问、通过复制实现的高可恢复性和数据可用性、在安装文件系统时进行更改的能力,即使在大型环境中也能简化管理。
IBM Spectrum Scale 的基本结构
  IBM Spectrum Scale是一个定义在一个或多个节点上的集群文件系统。在集群中的每个节点上, IBM Spectrum Scale由三个基本组件组成:管理命令、内核扩展和多线程守护进程。
IBM频谱的比例的群集配置
  IBM频谱的比例簇可以以各种方式来配置。集群可以是硬件平台和操作系统的异构组合。
 

二、环境介绍

节点名 节点IP 节点作用
 gpfsnode1  192.168.27.61  gpfs主节点
 gpfsnode2  192.168.27.62  gpfs从节点
 gpfsclient  192.168.27.63  gpfs客户端
 timeserver  192.168.0.7  时间同步服务器

三、安装前准备

  • 配置yum源
  • 配置/etc/hosts
  • 配置ssh免密登录
  • 关闭防火墙,selinux
  • 配置时间同步
  • 安装依赖包

3.1 配置yum源。

  使用安装系统时的镜像作为yum的本地源来配置yum源。

3.2 配置/etc/hosts

  将两台节点的信息分别写入各自机器的/etc/hosts文件下
[root@gpfsnode1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.27.61 gpfsnode1
192.168.27.62 gpfsnode2
192.168.27.63 gpfsclient

3.3 配置ssh免密登录

  分别配置三台机器之间root用户的免密登录
[root@gpfsnode1 ~ ]# ssh-keygen -t rsa
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
[root@gpfsnode1 ~ ]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@gpfsnode2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
Are you sure you want to continue connecting (yes/no)? yes
root@gpfsnode2's password:  这里输入gpfsnode2的密码

3.4 关闭防火墙、selinux

  防火墙
关闭防火墙
[root@gpfsnode1 ~] systemctl stop firewalld
设置防火墙不开机自动启动
[root@gpfsnode1 ~] systemctl disable firewalld
  SELinux
[root@gpfsnode1 ~] vim /etc/selinux/config SELINUX=disabled
  注意:SELinux修改后需要重新启动机器

3.5 配置时间同步

[root@gpfsnode1 ~] crontab -e
*/5 * * * * /usr/sbin/ntpdate 192.168.0.7;/usr/sbin/hwclock -w

3.6 安装依赖包

  对照如下表格安装所需依赖包
 包名  功能 安装命令
 Gcc 代码编译包 yum install gcc
 Cpp 计算机编程语言 yum install cpp
 Automake Makefile文件编辑器 yum install automake
 Kernel-devel 内核文件开发包 yum install kernel-devel
Kernel-headers 系统内核头文件包 yum install kernel-headers
binutils 一组开发工具包 yum install binutils
Python Python主安装文件 yum install python
Make Linux系统的编译工具 yum install make
Ksh 交互式的命令解释器和命令变成语言 yum install ksh
Gcc-c++ 针对C++的代码编译包 yum install gcc-c++
rpm-build rpm安装包编译工具 yum install rpm-build

四、安装GPFS文件系统

  依赖包安装完成后,将 Spectrum Scale 软件包 Spectrum_Scale_Advanced-5.0.3.0-x86_64-Linux-install 上传到所有的节点服务器,通过 chmod+x 赋予执行权限。

4.1 解压安装包

  解压安装文件 ./ Spectrum_Scale_Advanced-5.0.3.0-x86_64-Linux-install --text-only,根据提示按"1",并接受 license 协议继续,默认安装文件会被解压到 /usr/lpp/mmfs/5.0.3.0目录下。
[root@gpfsnode1 ~]# ./Spectrum_Scale_Advanced-5.0.3.0-x86_64-Linux-install --text-only
  默认情况下,RPM 软件包将被解压到以下位置:/usr/lpp/mmfs/5.0.3.0,一般redhat的rpm包在gpfsf_rpm目录里
[root@gpfsnode1 ~]# cd /usr/lpp/mmfs/5.0.3.0/gpfs_rpms
  在Redhat Linux安装gpfs文件系统所需要的软件包如下:
gpfs.base-5.0.3-1.*.rpm
gpfs.gpl-5.0.3-1.noarch.rpm
gpfs.compression-5.0.3-1.*.rpm
gpfs.gskit-8.0.50-86.*.rpm
gpfs.msg.en_US-5.0.3-1.noarch.rpm
gpfs.license.xxx-5.0.3-1.*.rpm(其中 xxx 是许可证类型)
gpfs.adv-5.0.3-1.*.rpm(仅限 IBM Spectrum Scale Advanced 或 Data Management Edition)
gpfs.crypto-5.0.3-1.*.rpm(仅限 IBM Spectrum Scale Advanced 或 Data Management Edition)
  按照如下顺序安装rpm包:
rpm -ivh gpfs.base-5.0.3-0.x86_64.rpm
rpm -ivh gpfs.gpl-5.0.3-0.noarch.rpm
rpm -ivh gpfs.adv-5.0.3-0.x86_64.rpm
rpm -ivh gpfs.license.adv-5.0.3-0.x86_64.rpm
rpm -ivh gpfs.gskit-8.0.50-86.x86_64.rpm
rpm -ivh gpfs.msg.en_US-5.0.3-0.noarch.rpm
rpm -ivh gpfs.crypto-5.0.3-0.x86_64.rpm
rpm -ivh gpfs.docs-5.0.3-0.noarch.rpm

  安装完成后,在启动 GPFS 之前,必须构建并安装 GPFS 可移植层。
  GPFS 可移植层是一个可加载的内核模块,它允许 GPFS 守护进程与操作系统交互。

4.2 配置环境变量

  打开root用户的.bash_profile文件,添加如下内容。
  vim /root/.bash_profile
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/lpp/mmfs/bin
export PATH

4.3 构建 GPFS 可移植层

[root@gpfsnode1 ~]# /usr/lpp/mmfs/bin/mmbuildgpl --build-package
注意:
  • GPFS 可移植性层特定于当前内核和 GPFS 版本。如果内核或 GPFS 版本发生变化,则需要构建新的 GPFS 可移植层。
  • 尽管操作系统内核可能会升级到新版本,但它们在重新启动后才处于活动状态。因此,必须在重新启动操作系统后为这个新内核构建一个 GPFS 可移植层。
  • 在安装新的 GPFS 可移植层之前,请确保先卸载先前版本的 GPFS 可移植层。
 
  命令完成后,它会显示生成的包的位置,如下例所示:
Wrote: /root/rpmbuild/RPMS/x86_64/gpfs.gplbin-3.10.0-229.el7.x86_64-5.0.3-x.x86_64.rpm
  然后,将生成的包复制到其他机器进行部署。默认情况下,生成的包只能部署到架构、分发级别、Linux 内核和IBM Spectrum Scale维护级别与构建gpfs.gplbin包的机器相同的机器上。但是,可以通过设置将生成的包安装在具有不同 Linux 内核的机器上MM_INSTALL_ONLY安装生成的包之前的环境变量。如果安装 gpfs.gplbin包,则不需要安装 gpfs.gpl包

4.4 创建集群

[root@gpfsnode1 ~]# mmcrcluster -N /tmp/mmfs/nodefile -p gpfsnode1 -s gpfsnode2 -C gpfscluster -A -r /usr/bin/ssh -R /usr/bin/scp
  参数说明:
    -N表示节点的配置文件
    -p表示主节点
    -s表示第二节点
    -C集群名称
    -A表示当一个节点重启的时候GPFS守护进程不会关闭。
    -r和-R都是通信协议。
    nodefile是一个文件,其中包含要添加到集群中的节点和节点名称的列表,其内容如下:
gpfsnode1:quorum-manager:
gpfsnode2:quorum-manager:
  注意:GPFS的仲裁机制和ZooKeeper的仲裁机制类似,当有一半以上的节点是quorum时,集群才可以启动,即:quorum >= 1+sizeof(all nodes)/2
  
  配置完成后,就可以通过 Spectrum Scale 内置指令创建集群,所有角色将自动按照事先定义的服务器自动推送与设置。
  接受适用节点许可证。
[root@gpfsnode1 ~]# mmchlicense server --accept -N all

  从节点使用以下命令启动 GPFS 守护进程和集群。

[root@gpfsnode1 ~]# /usr/lpp/mmfs/bin/mmstartup -N Nodename

4.5 创建NSD

  创建要与mmcrnsd命令一起使用的 NSD 配置文件。
  配置文件内容如下,放在任意位置即可。
%nsd:device=/dev/sdb nsd=data01 servers=gpfsnode1 usage=dataAndMetadata failureGroup=-1 pool=system
%nsd:device=/dev/sdb nsd=data02 servers=gpfsnode2 usage=dataAndMetadata failureGroup=-1 pool=system
  参数说明:
    nsd (网络共享磁盘)表示网络共享磁盘的名称
    device 表示真正的设备
    servers 表示节点
    usage 表示用途,metadataOnly(用于存放元数据)
    failureGroup 失败组
    pool 存储池
  注意: NSD 配置文件中使用的服务器名称必须可由系统解析。
  
  使用以下命令创建 NSD:
[root@gpfsnode1 ~]# mmcrnsd -F /gpfsfile/NSDfile

  查看nsd:

[root@gpfsnode1 ~]# mmlsnsd -m
  启动集群:
[root@gpfsnode1 ~]# mmstartup -a
  查看集群状态:
[root@gpfsnode1 ~]# mmgetstate -Las

4.6 创建gpfs文件系统

  使用以下命令创建 GPFS 文件系统。
[root@gpfsnode1 ~]# mmcrfs gpfs -F /tmp/mmfs/nsdfile -A yes -B 1M -j hcluster -m 2 -r 2 -M 3 -R 3 -T /gpfs --metadata-block-size 256K
  官方给出的命令如下(一般用这个创建):
[root@gpfsnode1 ~]# mmcrfs gpfs -F /tmp/mmfs/nsdfile -k nfs4
  参数说明:
    gpfs:表示文件系统的名称
    -F:指定NSD配置文件
    -A:当系统守护进程启动时该项设置为yes
    -B:指定数据块的大小,其值必须是16k,64k,128k,256k,512k,1M,2M,4M,8M,16M.
    -j:指定映射类型
    -m:元数据副本数的默认值
    -M:元数据副本数的最大值
    -r:数据副本数的默认值
    -R:数据副本数的最大值
    -T:挂载点
    --metadata-block-size:元数据节点块的大小

4.7 挂载文件系统

  使用如下命令挂载gpfs文件系统,挂载成功后使用df命令可以查询到。
[root@gpfsnode1 ~]# mmmount gpfs /gpfs -N all

  查询挂载是否成功,看见文件系统为gpfs的表示挂载成功。

[root@gpfsnode1 ~]# df -hT
文件系统              类型      容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root xfs        92G   14G   78G   15% /
devtmpfs              devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                 tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                 tmpfs     1.9G  9.0M  1.9G    1% /run
tmpfs                 tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1             xfs      1014M  143M  872M   15% /boot
tmpfs                 tmpfs     378M     0  378M    0% /run/user/0
gpfs                  gpfs      600G  6.7G  594G    2% /gpfs
  查询文件系统
[root@gpfsnode1 ~]# mmgetstate -Las

 Node number  Node name       Quorum  Nodes up  Total nodes  GPFS state   Remarks    
-------------------------------------------------------------------------------------
       1      gpfsnode1          2        2          3       active       quorum node
       2      gpfsnode2          2        2          3       active       quorum node
       3      gpfsclient         2        2          3       active       

 Summary information 
---------------------
Number of nodes defined in the cluster:            3
Number of local nodes active in the cluster:       3
Number of remote nodes joined in this cluster:     0
Number of quorum nodes defined in the cluster:     2
Number of quorum nodes active in the cluster:      2
Quorum = 2, Quorum achieved

4.8 创建文件集

[root@gpfsnode1 ~]# mmcrfileset gpfs sqdb
[root@gpfsnode1 ~]# mmlinkfileset gpfs sqdb -J /gpfs/sqdbfolder
[root@gpfsnode1 ~]# mmlsfileset gpfs

4.9 其他操作

查看节点
# mmlsnode

查看集群
# mmlscluster -Lsa

增加节点(如下为增加服务端,也可以修改server的参数后增加客户端)
# mmaddnode -N gpfs04:quorum
# mmchlicense server --accept -N gpfs04

关闭所有节点
# mmshutdown -a
# mmshutdown -N nodename

查看配置
# mmlsconfig all

修改配置
# mmchconfig

使用以下命令卸载 GPFS 文件系统并停止所有节点上的 GPFS。
# mmshutdown -a

卸载gpfs分区
# mmumount gpfs

使用以下命令在可用文件系统之一上配置 CES 共享根文件系统。
# mmchconfig cesSharedRoot=/gpfs/fs0

使用以下命令在集群中的所有节点上启动 GPFS。
# mmstartup -a
# mmstartup -N nodename

使用以下命令在所需节点上启用 CES。
# mmchnode --ces-enable -N prnode1,prnode2,prnode3

使用以下命令将协议节点的 IP 地址添加到 CES。
# mmces address add --ces-ip 198.51.100.2
# mmces address add --node prnode1 --ces-ip 198.51.100.2

使用以下命令验证 CES 配置。
# mmlscluster --ces
# mmces address list
更改自动挂载点
  官方解释:
    每个 GPFS 文件系统都有一个与之关联的默认挂载点。可以使用mmcrfsmmchfs命令的-T选项指定和更改此挂载点。
  如果您在创建文件系统时没有指定挂载点,GPFS 会将默认挂载点设置为/gpfs/ DeviceName
mmcrfs -T 
mmchfs -T
  具体使用方式和其他命令使用方式可以参考官方网址:https://www.ibm.com/docs/en/spectrum-scale/5.0.3?topic=reference-mmchfs-command
 

五、添加GPFS 客户端操作

   通过上述操作,已经将GPFS群集搭建完成,并且已经生成文件系统和共享磁盘供客户端调用。之前已经介绍过GPFS是C/S结构的,为了让OpenStack中的nova、glance和cinder可以使用共享磁盘,本章将通过在OpenStack中安装GPFS客户端的方式,将共享磁盘挂载到云环境中的计算节点、镜像节点以及块存储节点。

 5.1 安装GPFS软件

  安装软件可以参考文章开头的操作过程,GPFS服务器端的安装和客户端的安装没有任何区别,软件的依赖关系也是一样的。

 5.2 修改Host文件

  在客户端修改/etc/hosts,加入GPFS的三台服务器,同时确保所有服务器和客户端可以免密码登陆,具体设置方法可以参考本章GPFS安装与配置。

 5.3 创建客户端Nodefile

  前面已经介绍,GPFS的客户端和服务器的区别主要是靠配置文件中的角色定义所决定。为了批量安装和配置好客户端,本项目将采用Nodefile方式对客户端进行单独安装。编辑addnodefile文件:
gpfsclient:client

5.4 添加客户端节点

  在GPFS集群的任意节点上执行mmaddnode命令,将客户端节点加入到现有集群中,-N指定前面创建addnodefile文件。
[root@gpfsclient ~]# mmaddnonde -N addnodefile
  同样,安装完成后,需要通过mmchlicense命令同意客户端的许可,并通过mmstartup启动客户端服务,通过mmgetstate命令查看群集状态:
[root@gpfsclient ~]# mmchlicense client --accept -N gpfsclient
[root@gpfsclient ~]# mmstartup -N gpfsclient
[root@gpfsclient ~]# mmmount gpfs /gpfs -N gpfsclient

  节点服务启动后,GPFS文件系统会自动挂载,可以通过df -h命令查看。

5.5  其他操作

重新挂载
  如果需要对gpfs文件重新挂载,那么先使用mmumount gpfs卸载后,重新执行mmmount 进行挂载。
[root@gpfsclient ~]# mmumount gpfs
[root@gpfsclient ~]# mmmount gpfs /gpfs -N ${CLIENT_NODE_NAME}
关于环境重启后恢复环境的操作:
  如果需要重新启动环境,需要执行如下步骤才能恢复环境到正常情况
  1.重启Server端的服务。
[root@gpfnode1 ~]# mmstartup -a 

  2.挂载Server端的gpfs目录。

[root@gpfnode1 ~]# mmmount gpfs /gpfs -N all
  3.重启Client端的服务,如果gpfs自动挂载的路径不对,需要手动卸载gpfs的目录重新挂载。
[root@gpfsclient ~]# mmstartup -N gpfsclient
卸载:mmumount gpfs
[root@gpfsclient ~]# mmmount gpfs /gpfs -N gpfsclient

结束语

  通过在 Redhat 上实现GPFS群集的部署与在云计算方面的应用,可以更多的了解其优秀的特性,提高存储性能及云计算的灵活性、扩展性。同时通过本文,可以让读者对GPFS有一个直观的了解和认识,不仅在Linux平台,在AIX和Windows平台上,GPFS也有不俗的表现。
 
  gpfs 高级配置、升级等其他操作请查看官网手册
  gpfs相关命令使用方式查询链接
  https://www.ibm.com/docs/en/spectrum-scale/5.0.3?topic=command-reference

 

搭建步骤到此结束

如果有什么建议或者不明白的地方,欢迎留言或者私信我,看见第一时间回复。

本篇文档中存在的已知问题欢迎各路大牛指出。


 

有关GPFS 文件系统部署步骤的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  10. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

随机推荐