iSCSI 服务
NAS 与 SAN
网络附加储存服务器(NAS,Network Attached Storage)其实就是一台定制好的文件服务器,将 NAS 连上网络,在网络内的主机就能访问 NAS 上的数据。
储存局域网(SAN,Storage Area Networks)可以被视为一个外接式的储存设备,可以为局域网内所有主机提供磁盘而不是文件系统访问。
iSCSI 接口
通过 TCP/IP 技术而不是光纤接口来连接 SAN 就是 iSCSI(Internet SCSI)。iSCSI 分为两部分:
- iSCSI target:储存设备端,存放磁盘或 RAID 的设备。
- iSCSI initiator:使用 target 的客户端,通常是服务器。
iSCSI 服务安装
iSCSI 所需的软件有下面两个:
scsi-target-utils
:用来将 Linux 系统仿真成为 iSCSI target 的功能。iscsi-initiator-utils
:挂载来自 target 的磁盘到本地。
直接使用 yum
安装:
[root@server2 ~]$ yum install -y scsi-target-utils [root@server2 ~]$ yum install -y iscsi-initiator-utils
iSCSI target 设置
建立一个 100 MB 大小的文件 /srv/iscsi/disk.img
:
[root@server2 ~]$ mkdir /srv/iscsi [root@server2 ~]$ dd if=/dev/zero of=/srv/iscsi/disk.img bs=1M count=100 [root@server2 ~]$ chcon -Rv -t tgtd_var_lib_t /srv/iscsi
建立一个 200 MB 大小实际的分区 /dev/sda3
:
[root@server2 ~]$ fdisk /dev/sda [root@server2 ~]$ partprobe [root@server2 ~]$ fdisk -l Device Boot Start End Blocks Id System /dev/sda1 * 2048 411647 204800 83 Linux /dev/sda2 411648 33187839 16388096 8e Linux LVM /dev/sda3 33187840 33579007 195584 83 Linux /dev/sda4 33579008 41943039 4182016 5 Extended /dev/sda5 33581056 34195455 307200 8e Linux LVM
建立一个 300 MB 大小的 LV 设备 /dev/centos/iscsi01
:
[root@server2 ~]$ pvcreate /dev/sda5 [root@server2 ~]$ vgextend centos /dev/sda5 [root@server2 ~]$ lvcreate -L 296M -n iscsi01 centos [root@server2 ~]$ lvscan ACTIVE '/dev/centos/home' [4.88 GiB] inherit ACTIVE '/dev/centos/iscsi01' [296.00 MiB] inherit
iSCSI target 文件名以 iqn(iSCSI Qualified Name)开头,命名格式为 iqn.yyyy-mm.<reversed domain>:id
。这里使用名称 iqn.2000-01.server2:mydisk
。
每个 target 能够拥有数个磁盘设备,这些磁盘被叫做逻辑单位编号(LUN,Logical Unit Number)。iSCSI initiator 就是跟 target 协调后才取得 LUN 的访问权。
tgt
的配置文件 /etc/tgt/targets.conf
可以很简单,将上面新建的三个 LUN 加入到 iqn 中即可:
[root@server2 ~]$ vi /etc/tgt/targets.conf <target iqn.2000-01.server2:mydisk> backing-store /srv/iscsi/disk.img backing-store /dev/sda3 backing-store /dev/centos/iscsi01 initiator-address 10.1.1.0/24 incominguser iuser ipass write-cache off </target>
参数说明如下:
backing-store/direct-store
:一般用backing-store
设置虚拟设备,想整块硬盘都被使用可以用direct-store
。initiator-address
:限制客户端地址,一般也不用设置而用iptables
来规划。incominguser
:设置通过账号密码来使用 iSCSI target。write-cache
:是否使用缓存,默认使用缓存来提高读写速度,有数据丢失风险。
如果没有使用 initiator-address
参数,使用 ipbatles
防火墙来规定只有 10.1.1.0/24
可以访问 target 设置如下:
[root@server2 ~]$ iptables -A INPUT -p tcp -s 10.1.1.0/24 --dport 3260 -j ACCEPT
iSCSI target 启动
启动 tgtd
服务:
[root@server2 ~]$ systemctl enable --now tgtd [root@server2 ~]$ netstat -ntulp |grep tgt tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 23981/tgtd
使用 tgt-admin
命令查看运行状态:
[root@server2 ~]$ tgt-admin --show Target 1: iqn.2000-01.server2:mydisk System information: Driver: iscsi State: ready I_T nexus information: I_T nexus: 2 Initiator: iqn.1994-05.com.redhat:bf38cf4ccf5 alias: server3 Connection: 0 IP Address: 10.1.1.2 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: 310 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/centos/iscsi01 Backing store flags: LUN: 2 Type: disk SCSI ID: IET 00010002 SCSI SN: beaf12 Size: 200 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /dev/sda3 Backing store flags: LUN: 3 Type: disk SCSI ID: IET 00010003 SCSI SN: beaf13 Size: 105 MB, Block size: 512 Online: Yes Removable media: No Prevent removal: No Readonly: No SWP: No Thin-provisioning: No Backing store type: rdwr Backing store path: /srv/iscsi/disk.img Backing store flags: Account information: iuser ACL information: 10.1.1.0/24
可以看到和配置文件设定的一致,并且有一个已经连接的主机 10.1.1.2
。
iSCSI initiator 设置
安装好 iscsi-initiator-utils
之后,修改配置文件 /etc/iscsi/iscsid.conf
内容,主要是设置访问账号密码:
[root@server3 ~]$ vi /etc/iscsi/iscsid.conf node.session.auth.username = iuser node.session.auth.password = ipass discovery.sendtargets.auth.username = iuser discovery.sendtargets.auth.password = ipass
iSCSI initiator 操作
设置好之后,使用 iscsiadm
命令来检测 10.1.1.1
中的 iSCSI 设备:
[root@server3 ~]$ iscsiadm -m discovery -t sendtargets -p 10.1.1.1 10.1.1.1:3260,1 iqn.2000-01.server2:mydisk
启动 iscsi
程序:
[root@server3 ~]$ systemctl start iscsi
登录目标 target:
[root@server3 ~]$ iscsiadm -m node 10.1.1.1:3260,1 iqn.2000-01.server2:mydisk [root@server3 ~]$ iscsiadm -m node -T iqn.2000-01.server2:mydisk --login Logging in to [iface: default, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] (multiple) Login to [iface: default, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] successful.
查询 iSCSI 磁盘:
[root@server3 ~]$ fdisk -l Disk /dev/sdb: 310 MB, 310378496 bytes, 606208 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdc: 200 MB, 200278016 bytes, 391168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdd: 104 MB, 104857600 bytes, 204800 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes
注销 target,但并不删除连接:
[root@server3 ~]$ iscsiadm -m node -T iqn.2000-01.server2:mydisk --logout Logging out of session [sid: 1, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] Logout of [sid: 1, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] successful.
删除 target 连接:
[root@server3 ~]$ iscsiadm -m node -o delete -T iqn.2000-01.server2:mydisk [root@server3 ~]$ iscsiadm -m node iscsiadm: No records found
直接将 target 中的磁盘组成 LV 并格式化:
[root@server3 ~]$ pvcreate /dev/sd{b,c,d} Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created. Physical volume "/dev/sdd" successfully created. [root@server3 ~]$ vgcreate iscsi /dev/sd{b,c,d} Volume group "iscsi" successfully created [root@server3 ~]$ vgdisplay [root@server3 ~]$ lvcreate -l 144 -n disk iscsi Logical volume "disk" created. [root@server3 ~]$ lvdisplay [root@server3 ~]$ mkfs -t ext4 /dev/iscsi/disk [root@server3 ~]$ mkdir -p /data/iscsi [root@server3 ~]$ echo "/dev/iscsi/disk /data/iscsi ext4 defaults,_netdev 1 2" >> /etc/fstab [root@server3 ~]$ mount -a [root@server3 ~]$ df -Th /dev/mapper/iscsi-disk ext4 551M 876K 510M 1% /data/iscsi
挂载时使用 _netdev
参数的意思是,开机后需要网络启动完毕后再挂载。