1、前言
因为要调试看下librbd的一个功能。然后准备在自己的测试环境配置下iscsi+librbd,然后方便调试,这里记录下大概过程。
这里是使用的tgt作为iscsi的target。具体什么是iscsi和iscsi有哪几种target类型,google下就好。
1、ceph集群准备
准备一个标准三节点ceph集群:
[root@ceph01 ~]# ceph -v
ceph version 12.2.12 (1436006594665279fe734b4c15d7e08c13ebd777) luminous (stable)
[root@ceph01 ~]#
[root@ceph01 ~]#
[root@ceph01 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.08455 root default
-3 0.02917 host ceph01
0 hdd 0.01459 osd.0 up 1.00000 1.00000
1 hdd 0.01459 osd.1 up 1.00000 1.00000
-5 0.02818 host ceph02
2 hdd 0.01459 osd.2 up 1.00000 1.00000
4 hdd 0.01360 osd.4 up 1.00000 1.00000
-7 0.02719 host ceph03
3 hdd 0.01360 osd.3 up 1.00000 1.00000
5 hdd 0.01360 osd.5 up 1.00000 1.00000
2、编译tgtd
为啥要自己编译,不直接使用yum install?因为直接yum安装的tgtd服务可能不包含rbd的功能模块,也就不能使用librbd了。所以要自己编译,在编译的时候加入rbd的功能到tgtd服务里面。
2.1、获取tgtd源码包
下载地址:https://github.com/fujita/tgt/releases, 下载当前最新的版本v1.0.76,并解压:
[root@ceph01 ~]# tar -zxvf tgt-1.0.76.tar.gz
2.2、修改相关文件
为了把rbd功能编入tgtd服务里面,还要一些相关文件才行。
2.2.1、修改spec文件的如下内容
[root@ceph01 ~]# vim tgt-1.0.76/scripts/tgtd.spec
...
Version: 1.0.76 # 修改版本为你下载的包的版本
...
%install
...
%{__install} -d %{buildroot}/etc/tgt
%{__install} -d %{buildroot}/usr/lib/tgt/backing-store # 增加存放bs_rbd.so库的目录
...
%{__install} -p -m 0600 conf/targets.conf %{buildroot}/etc/tgt
%{__install} -p -m 0600 usr/bs_rbd.so %{buildroot}/usr/lib/tgt/backing-store # 放置usr/bs_rbd.so到/usr/lib/tgt/backing-store目录下
...
%files
...
/usr/lib/tgt/backing-store/bs_rbd.so # 在该rpm包释放的文件列表中增加bs_rbd.so文件
...
如果不加上面有关bs_rbd.so相关的文件,那制作出来的tgt包就不会包含bs_rbd.so文件,最后安装的tgt包的后端存储就不会支持rbd。
2.2.2、修改build-pkg.sh里面相关信息
下面的几个信息,根据你下载的源码版本而定:
[root@ceph01 ~]# vim tgt-1.0.76/scripts/build-pkg.sh
...
branch="master"
version="1.0.76"
release="1"
...
2.3、编译tgtd
安装依赖包(注意下面列出的依赖包,在我们编译出tgtd的rpm包后,待安装tgtd服务的目标机器上也需要安装这些依赖包)
[root@ceph01 ~]# yum install librbd1-devel librados2-devel -y
[root@ceph01 ~]# yum install libxslt docbook-style-xsl libibverbs-devel librdmacm-devel libaio-devel -y
开始编译,要设置CEPH_RBD变量为1,表示编译时加入rbd的功能模块
[root@ceph01 ~]# cd tgt-1.0.76
[root@ceph01 tgt-1.0.76]# make CEPH_RBD=1
make -C usr
make[1]: Entering directory `/root/tgt-1.0.76/usr'
cc -c -DUSE_SIGNALFD -DUSE_TIMERFD -DUSE_EVENTFD -D_GNU_SOURCE -I. -g -O2 -fno-strict-aliasing -Wall -Wstrict-prototypes -Werror -fPIC -DTGT_VERSION=\"1.0.76\" -DBSDIR=\"/usr/lib/tgt/backing-store\" iscsi/conn.c -o iscsi/conn.o
cc -c -DUSE_SIGNALFD -DUSE_TIMERFD -DUSE_EVENTFD -D_GNU_SOURCE -I. -g -O2 -fno-strict-aliasing -Wall -Wstrict-prototypes -Werror -fPIC -DTGT_VERSION=\"1.0.76\" -DBSDIR=\"/usr/lib/tgt/backing-store\" iscsi/param.c -o iscsi/param.o
cc -c -DUSE_SIGNALFD -DUSE_TIMERFD -DUSE_EVENTFD -D_GNU_SOURCE -I. -g -O2 -fno-strict-aliasing -Wall -Wstrict-prototypes -Werror -fPIC -DTGT_VERSION=\"1.0.76\" -DBSDIR=\"/usr/lib/tgt/backing-store\" iscsi/session.c -o iscsi/session.o
cc -c -DUSE_SIGNALFD -DUSE_TIMERFD -DUSE_EVENTFD -D_GNU_SOURCE -I. -g -O2 -fno-strict-aliasing -Wall -Wstrict-prototypes -Werror -fPIC -DTGT_VERSION=\"1.0.76\" -DBSDIR=\"/usr/lib/tgt/backing-store\" iscsi/iscsid.c -o iscsi/iscsid.o
cc -c -DUSE_SIGNALFD -DUSE_TIMERFD -DUSE_EVENTFD -D_GNU_SOURCE -I. -g -O2 -fno-strict-aliasing -Wall -Wstrict-prototypes -Werror -fPIC -DTGT_VERSION=\"1.0.76\" -DBSDIR=\"/usr/lib/tgt/backing-store\" iscsi/target.c -o iscsi/target.o
...
上面编译过程没有报错的话,继续制作rpm安装包,因为使用rpm包来安装,后期管理相关包时会方便很多:
[root@ceph01 tgt-1.0.76]# make rpm
Building version: 1.0.76-1
Creating rpm build dirs under /root/tgt-1.0.76/pkg
Creating tgz scsi-target-utils-1.0.76-1.tgz
Creating rpm
Wrote: /root/tgt-1.0.76/pkg/SRPMS/scsi-target-utils-1.0.76-1.src.rpm
Wrote: /root/tgt-1.0.76/pkg/RPMS/x86_64/scsi-target-utils-1.0.76-1.x86_64.rpm
Wrote: /root/tgt-1.0.76/pkg/RPMS/x86_64/scsi-target-utils-debuginfo-1.0.76-1.x86_64.rpm
Done.
3、安装配置tgtd
安装下上面编译出来的rpm包:
[root@ceph01 tgt-1.0.76]# rpm -ivh /root/tgt-1.0.76/pkg/RPMS/x86_64/scsi-target-utils-1.0.76-1.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:scsi-target-utils-1.0.76-1 ################################# [100%]
启动tgtd服务:
[root@ceph01 ~]# systemctl restart tgtd
检查是否支持rbd:
[root@ceph01 ~]# tgtadm --lld iscsi --mode system --op show | grep rbd
rbd (bsoflags sync:direct)
如果没有rbd相关信息输出,表示不支持rbd,请检查相关编译过程是否都正确。
准备一个rbd:
[root@ceph01 ~]# rbd create img02 --size 10G
配置target:
[root@ceph01 ~]# cat /etc/tgt/conf.d/librbd.conf
<target iqn.2019-04.com.example:cephrbd.img02>
bs-type rbd
backing-store rbd/img02
initiator-address 192.168.0.0/16
</target>
重启tgtd服务:
systemctl restart tgtd
查看target是否正确启用:
[root@ceph01 conf.d]# tgtadm --lld iscsi --mode target --op show
Target 1: iqn.2019-04.com.example:cephrbd.img02
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 10737 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rbd
Backing store path: rbd/img02
Backing store flags:
Account information:
ACL information:
192.168.0.0/16
好了,看到一切都正常,然后就可以到客户端去发现、登陆和使用这个rbd设备了。
4、使用
来到另外一个节点client01,把我们刚刚配置的img02这个rbd设备挂载到我们的client01节点本地来使用。
4.1、安装iscsi客户端软件
安装并启动iscsi-initiator-utils服务:
[root@client01 ~]# yum install iscsi-initiator-utils -y
[root@client01 ~]# systemctl start iscsid
4.2、发现目标设备
有个小口诀就是先发现再登陆,最后再使用:
[root@client01 ~]# iscsiadm -m discovery -t st -p 192.168.10.20
192.168.10.20:3260,1 iqn.2019-04.com.example:cephrbd.img02
上面-m discovery参数是扫描iscsi服务端可用的存储设备,-t st参数是执行扫描操作的类型,-p 192.168.10.20参数为iscsi服务端的ip地址。
可以看到上面已经发现了iqn.2019-04.com.example:cephrbd.img02这个设备,我们下面就开始登陆:
[root@client01 ~]# iscsiadm -m node -T iqn.2019-04.com.example:cephrbd.img02 -p 192.168.10.20 --login
Logging in to [iface: default, target: iqn.2019-04.com.example:cephrbd.img02, portal: 192.168.10.20,3260] (multiple)
Login to [iface: default, target: iqn.2019-04.com.example:cephrbd.img02, portal: 192.168.10.20,3260] successful.
登陆成功之后,就可以在本地看到这个设备了,也就是下面的sdd这个设备:
[root@client01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part
├─centos-root 253:0 0 17.5G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 10G 0 disk
sr0 11:0 1 4G 0 rom
好了,现在就可以像使用本地设备一样使用这个sdd设备了。