我今天开心了吗 發表於 2021-12-3 20:37:00

【记录】 iSCSI服务器的搭建与使用[Debian]

<h2><span style="font-size: 2em">序言</span></h2>
<p><span style="font-size: 14px">更换系统后需要一个网络文件存储用于备份文件,本想用NFS多方便,但是timeshift不支持网络存储,备份路径必须是一个块存储设备,</span></p>
<p><span style="font-size: 14px">但是你还必须分好文件系统,这不是多此一举???反正我只用rsync进行同步</span></p>
<p><span style="font-size: 14px">于是使用iscsi满足它的需求,因为iscsi连接后获取到的就是一个块存储设备</span></p>
<p><span style="font-size: 14px">在配置过程中参考了很多网友写的博客 很有参考价值 非常感谢</span></p>
<h1 class="postTitle"><span style="font-size: 14px">《Linux下搭建iSCSI共享存储的方法 Linux-IO Target 方式 Debian9.5下实现》</span></h1>
<p><span style="font-size: 14px">他写的很全面,我在这里只记录我用到的部分</span></p>
<h2><span style="font-size: 2em">简述</span></h2>
<p><span style="font-size: 14px">iSCSI,通过TCP/IP网络传输SCSI命令提供对存储设备的块级访问,属于SAN存储,因此又叫IP-SAN,默认端口3260/TCP。</span></p>
<p>也就是说通过iSCS获取到的是一个真实的或者虚拟的存储设备,连接之后会多出一个硬件设备,就像一块本机硬盘一样,你需要在上面建立文件系统后才能使用。</p>
<p>而NFS、SMB等获取到的只是一个挂载点,与文件系统无关,连接后即可以使用。</p>
<p>客户端称为initiators,服务器上的存储目标称为target,客户端发现服务器上存储目标的过程叫discovery。</p>
<hr>
<h2>安装与配置</h2>
<p>基于Debian/Ubuntu的发行版可以直接通过apt命令安装</p>
<table style="height: 186px; width: 506px" border="1" align="left">
<tbody>
<tr>
<td><span style="font-size: 14px">&nbsp;</span></td>
<td><span style="font-size: 14px">服务器</span></td>
<td><span style="font-size: 14px">客户端</span></td>
</tr>
<tr>
<td><span style="font-size: 14px">安装</span></td>
<td><span style="font-size: 14px">sudo apt install targetcli-fb</span></td>
<td><span style="font-size: 14px">sudo apt install open-iscsi</span></td>
</tr>
<tr>
<td><span style="font-size: 14px">配置程序</span></td>
<td><span style="font-size: 14px">targetcli</span></td>
<td><span style="font-size: 14px">iscsiadm</span></td>
</tr>
<tr>
<td><span style="font-size: 14px">相关服务</span></td>
<td><span style="font-size: 14px">targetclid.server</span></td>
<td><span style="font-size: 14px">iscsid.service</span></td>
</tr>
<tr>
<td><span style="font-size: 14px">配置文件目录</span></td>
<td><span style="font-size: 14px">/etc/rtslib-fb-target/</span></td>
<td><span style="font-size: 14px">/etc/iscsi</span></td>
</tr>
</tbody>
</table>
<p>服务器配置 以<span style="color: rgba(255, 0, 0, 1)">root</span>权限运行targetcli</p>
<p><span style="font-size: 14px">sudo targetcli</span></p>
<p><span style="font-size: 14px">该工具的使用类似linux下shell的使用</span></p>
<p><span style="font-size: 14px">ls查看目录</span></p>
<p><span style="font-size: 14px">set 配置参数</span></p>
<p><span style="font-size: 14px">saceconfig 保存配置文件 默认位置 /etc/rtslib-fb-target/saveconfig.json</span></p>
<p>默认设置每次退出后会自动保存配置到该位置,之前的配置会备份到/etc/rtslib-fb-target/backup中,</p>
<p><span style="color: rgba(255, 0, 0, 1)">并且使用gzip压缩归档,文件后缀名为gz,如果需要使用targetctl恢复,需要先使用gzip解压后才能导入配置</span></p>
<div class="cnblogs_code">
<pre><code>/&gt; ls
o- / .................................................................................... [...]
o- backstores ......................................................................... [...]
| o- block .............................................................
| o- fileio ............................................................
| o- pscsi .............................................................
| o- ramdisk ...........................................................
o- iscsi .......................................................................
o- loopback ....................................................................
o- vhost .......................................................................
o- xen-pvscsi ..................................................................
/&gt;</code></pre>
</div>
<p>简单的使用只需要了解两个目录backstorages和iscsi</p>
<p><span style="font-size: 14px">其中backstorages是后端存储</span></p>
<p><span style="font-size: 14px">block是块存储设备,简单的说就是连接到本机的硬盘驱动器</span></p>
<p><span style="font-size: 14px">fileio是文件存储,简单地说就像虚拟机的镜像文件,raw,qcow2那样的镜像</span></p>
<p><span style="font-size: 14px">pscsi是连接到本机的scsi设备,我还没用过这种设备,只在书上见过</span></p>
<p><span style="font-size: 14px">ramdisk就是内存盘,linux上的tmpfs就属于这种,如果服务器内存很大,可以划出一部分内存做临时存储用</span></p>
<p><span style="font-size: 14px">iscsi里面就是要配置的存储目标target</span></p>
<h3><span style="font-size: 14px">1. 添加存储设备</span></h3>
<p><span style="font-size: 14px">我使用qemu-img创建一块磁盘镜像作为存储设备</span></p>
<div class="cnblogs_code">
<pre><code>qemu-img create -f qcow2 -o preallocation=falloc /mnt/ext4linux/var/iscsi/storage-1.qcow2 20G</code></pre>
</div>
<p><span style="font-size: 14px">其中 preallocation=falloc 参数的作用是立即分配空间 但不填充&nbsp;</span>参考 《qemu-img create创建磁盘》</p>
<p>使用targetcli 他提供了彩色的文字方便检查配置 绿色的配置为有效配置 红色的为无效配置 白色的为默认配置</p>
<p>要注意不同的目录下可用的命令和选项不相同</p>
<p>进入/backstores/fileio目录下,使用create命令添加存储设备</p>
<div class="cnblogs_code">
<pre><code>/&gt; backstores/fileio create name=demo1 file_or_dev=/mnt/ext4linux/var/iscsi/storage-1.qcow2
Created fileio demo1 with size 21478375424
/&gt; ls
o- / .................................................................................... [...]
o- backstores ......................................................................... [...]
| o- block .............................................................
| o- fileio ............................................................
| | o- demo1 ....
| |   o- alua ..............................................................
| |   o- default_tg_pt_gp ..................................
| o- pscsi .............................................................
| o- ramdisk ...........................................................
o- iscsi .......................................................................
o- loopback ....................................................................
o- vhost .......................................................................
o- xen-pvscsi ..................................................................
/&gt; </code></pre>
</div>
<p>&nbsp;</p>
<h3>2. 添加存储目标</h3>
<p>进入/iscsi目录后,使用create命令添加存储目标</p>
<div class="cnblogs_code">
<pre><code>/&gt; iscsi/ create iqn.2021-12.cn.erika.iscsi:erika-ge.storage
Created target iqn.2021-12.cn.erika.iscsi:erika-ge.storage.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/&gt; ls
o- / .................................................................................... [...]
o- backstores ......................................................................... [...]
| o- block .............................................................
| o- fileio ............................................................
| | o- demo1 ....
| |   o- alua ..............................................................
| |   o- default_tg_pt_gp ..................................
| o- pscsi .............................................................
| o- ramdisk ...........................................................
o- iscsi .......................................................................
| o- iqn.2021-12.cn.erika.iscsi:erika-ge.storage ..................................
|   o- tpg1 ..........................................................
|   o- acls .....................................................................
|   o- luns .....................................................................
|   o- portals ...............................................................
|       o- 0.0.0.0:3260 ................................................................
o- loopback ....................................................................
o- vhost .......................................................................
o- xen-pvscsi ..................................................................
/&gt;</code></pre>
</div>
<p>创建的时候如果不加IQN名称 则会生成一个随机的 如果指定一个 需要遵循一定的格式 具体参考RFC3720</p>
<p>前面的iqn是固定的 必须要有 后面的日期通常为创建该存储目标的日期 然后是反向域名 就和DNS的差不多</p>
<p>没有域名就自己编一个 又不用去注册 只为了作为标识 然后跟个冒号 冒号后面是该存储目标的识别名称</p>
<p>&nbsp;</p>
<h3>3. 关联存储设备</h3>
<p>进入/iscsi/你设置的iqn目标/tpg1/luns目录下,使用create命令关联存储设备</p>
<div class="cnblogs_code">
<pre><code>/&gt; iscsi/iqn.2021-12.cn.erika.iscsi:erika-ge.storage/tpg1/luns create /backstores/fileio/demo1
Created LUN 0.
/&gt; ls
o- / .................................................................................... [...]
o- backstores ......................................................................... [...]
| o- block .............................................................
| o- fileio ............................................................
| | o- demo1 ......
| |   o- alua ..............................................................
| |   o- default_tg_pt_gp ..................................
| o- pscsi .............................................................
| o- ramdisk ...........................................................
o- iscsi .......................................................................
| o- iqn.2021-12.cn.erika.iscsi:erika-ge.storage ..................................
|   o- tpg1 ..........................................................
|   o- acls .....................................................................
|   o- luns .....................................................................
|   | o- lun0
|   o- portals ...............................................................
|       o- 0.0.0.0:3260 ................................................................
o- loopback ....................................................................
o- vhost .......................................................................
o- xen-pvscsi ..................................................................
/&gt;</code></pre>
</div>
<p>&nbsp;这个时候还不能使用客户端访问存储,因为没有配置认证,先写一下客户端发现并连接服务器的方法</p>
<div class="cnblogs_code">
<pre><code># 发现目标 如果服务器端口号是默认的3260 则可以省略
sudo iscsiadm -m discovery -t sendtargets -p &lt;ip:port&gt;
# 登录目标节点 iqn写目标节点的iqn
sudo iscsiadm -m node -T &lt;iqn&gt; -p &lt;ip:port&gt; -l
# 登出目标节点 记得先umount 防止数据丢失
sudo iscsiadm -m node -T &lt;iqn&gt; -p &lt;ip:port&gt; -u
# 删除目标节点 这里是删除本机对该目标节点的记录
sudo iscaiadm -m node -T &lt;iqn&gt; -o delete</code></pre>
</div>
<p>这里我们先尝试连接看看会如何</p>
<div class="cnblogs_code">
<pre><code>e@kvm-ubuntu-01:/etc/iscsi$ sudo iscsiadm -m discovery -t sendtargets -p 172.20.0.65
172.20.0.65:3260,1 iqn.2021-12.cn.erika.iscsi:erika-ge.storage
e@kvm-ubuntu-01:/etc/iscsi$ sudo iscsiadm -m node -T iqn.2021-12.cn.erika.iscsi:erika-ge.storage -l
Logging in to (multiple)
iscsiadm: Could not login to .
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
</code></pre>
</div>
<p>需要在服务器上配置一下认证,即使不想使用认证也需要配置</p>
<p>命令很简单,进入/iscsi/你设置的iqn/tpg1目录下,使用set命令设置generate_node_acls为1</p>
<div class="cnblogs_code">
<pre><code>/&gt; iscsi/iqn.2021-12.cn.erika.iscsi:erika-ge.storage/tpg1/ set attribute generate_node_acls=1
Parameter generate_node_acls is now '1'.
/&gt; ls
o- / .................................................................................... [...]
o- backstores ......................................................................... [...]
| o- block .............................................................
| o- fileio ............................................................
| | o- demo1 ......
| |   o- alua ..............................................................
| |   o- default_tg_pt_gp ..................................
| o- pscsi .............................................................
| o- ramdisk ...........................................................
o- iscsi .......................................................................
| o- iqn.2021-12.cn.erika.iscsi:erika-ge.storage ..................................
|   o- tpg1 .............................................................
|   o- acls .....................................................................
|   o- luns .....................................................................
|   | o- lun0
|   o- portals ...............................................................
|       o- 0.0.0.0:3260 ................................................................
o- loopback ....................................................................
o- vhost .......................................................................
o- xen-pvscsi ..................................................................
/&gt; </code></pre>
</div>
<p>设置完后查看当前配置,会发现该iqn下的acls后面的中括号里 no-gen-acls变成了gen-acls,而且文字颜色变成了绿色,说明可以访问了</p>
<p>但要注意,只配置generate_node_acls的话该目标是只读的状态,应该是为了安全,毕竟不需要认证就能访问</p>
<p>在该iqn下的tpg1目录下查看属性 get attribute 就能看到有一条</p>
<div class="cnblogs_code">
<pre><code>generate_node_acls=1
--------------------
If set to 1, allow all initiators to login (i.e. demo mode).</code></pre>
</div>
<p>如果设置成1,则该节点为demo模式,如果需要写入,还需要设置属性demo_mode_write_protect=0,这样才能写入,然后再次连接</p>
<div class="cnblogs_code">
<pre><code>e@kvm-ubuntu-01:/etc/iscsi$ sudo iscsiadm -m node -T iqn.2021-12.cn.erika.iscsi:erika-ge.storage -l
Logging in to (multiple)
Login to successful.</code></pre>
</div>
<p>客户端查看当前的磁盘列表</p>
<div class="cnblogs_code">
<pre><code>e@kvm-ubuntu-01:/$ lsblk
NAME   MAJ:MIN RMSIZE RO TYPE MOUNTPOINT
loop0    7:0    0 86.9M1 loop /snap/core/4917
sda      8:0    0   20G0 disk
sr0   11:0    1 1024M0 rom
vda    252:0    0   30G0 disk
├─vda1 252:1    0    1M0 part
└─vda2 252:2    0   30G0 part /</code></pre>
</div>
<p>上面20G未分区的sda就是连接到的目标节点,之后可以使用fdisk之类的软件进行分区,然后挂载使用,就像本地硬盘一样使用</p>
<p>&nbsp;</p>
<h3>4. 配置认证</h3>
<p><span style="color: rgba(255, 0, 0, 1)"><strong>请注意,iscsi的认证可能有缓存,因此如果下面的步骤如果发生认证错误,请在客户端删除发现记录后重新发现然后尝试连接</strong></span></p>
<p>在上面的操作完成后,任何一台机器都能挂载该节点,完全没有安全性可言,因此我们需要添加认证</p>
<p>认证分两类:发现认证和登录(会话)认证,这两类认证又各自有单向认证和双向认证</p>
<p>双向认证是在单向认证的基础上,服务器向客户端确认认证信息用的,在一定程度上能避免中间人攻击</p>
<h4>4.1. 发现认证</h4>
<p>发现认证用于客户端发现服务器上可用的节点,属于全局认证,需要在/iscsi目录下进行</p>
<div class="cnblogs_code">
<pre><code>/&gt; cd iscsi/
/iscsi&gt; get discovery_auth
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=False      # 用来启用或者禁用发现认证
-----------
The enable discovery_auth parameter.

mutual_password=    # 双向认证的密码
----------------
The mutual_password discovery_auth parameter.

mutual_userid=      # 双向认证的用户名
--------------
The mutual_userid discovery_auth parameter.

password=         # 单向认证的密码
-------------------
The password discovery_auth parameter.

userid=            # 双向认证的密码
-------------
The userid discovery_auth parameter.
</code></pre>
</div>
<p>我这里只配置单向认证</p>
<div class="cnblogs_code">
<pre><code>/iscsi&gt; set discovery_auth enable=1
Parameter enable is now 'True'.
/iscsi&gt; set discovery_auth userid=admin
Parameter userid is now 'admin'.
/iscsi&gt; set discovery_auth password=admin@r00t
Parameter password is now 'admin@r00t'.
/iscsi&gt; get discovery_auth
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=True
-----------
The enable discovery_auth parameter.

mutual_password=
----------------
The mutual_password discovery_auth parameter.

mutual_userid=
--------------
The mutual_userid discovery_auth parameter.

password=admin@r00t
-------------------
The password discovery_auth parameter.

userid=admin
------------
The userid discovery_auth parameter.</code></pre>
</div>
<p>配置完后客户端也需要做相应的配置,修改文件/etc/iscsi/iscsid.conf</p>
<div class="cnblogs_code">
<pre><code># To enable CHAP authentication for a discovery session to the target
# set discovery.sendtargets.auth.authmethod to CHAP. The default is None.
discovery.sendtargets.auth.authmethod = CHAP      # 去掉注释 启用发现认证

# To set a discovery session CHAP username and password for the initiator
# authentication by the target(s), uncomment the following lines:
discovery.sendtargets.auth.username = admin         # 去掉注释 写上用户名
discovery.sendtargets.auth.password = admin@r00t    # 去掉注释 写上密码

# To set a discovery session CHAP username and password for target(s)
# authentication by the initiator, uncomment the following lines:
#discovery.sendtargets.auth.username_in = username_in
#discovery.sendtargets.auth.password_in = password_in
# 这两行是发现认证的双向认证的配置</code></pre>
</div>
<p>重启iscsid服务,执行发现命令,成功后结果如下</p>
<div class="cnblogs_code">
<pre><code>e@kvm-ubuntu-01:~$ sudo iscsiadm -m discovery -t sendtargets -p 172.20.0.65
172.20.0.65:3260,1 iqn.2021-12.cn.erika.iscsi:erika-ge.storage</code></pre>
</div>
<p>如果发现认证失败,则会如下</p>
<div class="cnblogs_code">
<pre><code>iscsiadm: Login failed to authenticate with target
iscsiadm: discovery login to 172.20.0.65 rejected: initiator failed authorization
iscsiadm: Could not perform SendTargets discovery: iSCSI login failed due to authorization failure</code></pre>
</div>
<h4>4.2. 配置登录认证</h4>
<p>一个服务器下可以配置多个目标节点(target),如果不配置登录认证,则通过发现认证的客户端可以连接所有的目标节点</p>
<p>举个例子,一个小公司使用iscsi做中央存储服务器,分给每个员工1T空间作为网络存储。</p>
<p>如果不设置登录认证,则每个员工都可以随意连接该服务器上的节点。</p>
<p>配置过程如下,进入/iscsi/你设置的iqn目标/tpg1/ 目录下</p>
<p>使用set命令设置属性 set attribute&nbsp;generate_node_acls=0,因为要自定义访问规则,因此要把自动生成的访问规则去掉</p>
<p>使用set命令设置属性 set attribute&nbsp;authentication=1,目的是启用登录认证</p>
<p>然后进入acls下,使用create命令创建允许访问的客户端的iqn,这个iqn一会要填在客户端的/etc/iscsi/initiatorname.iscsi文件中</p>
<p>然后执行ls命令会发现该iqn后面的中括号里面的文字是红色的,说明缺少配置信息,配置无效,因为这时还没有配置认证信息,继续</p>
<p>进入到创建的客户读的iqn目录下,使用set命令设置单向认证信息&nbsp;</p>
<div class="cnblogs_code">
<pre><code>/&gt; cd iscsi/iqn.2021-12.cn.erika.iscsi:erika-ge.storage/tpg1/
/iscsi/iqn.20....storage/tpg1&gt; ls
o- tpg1 ...........................................................
o- acls ...........................................................................
o- luns ...........................................................................
| o- lun0 ......
o- portals .....................................................................
    o- 0.0.0.0:3260 ......................................................................
/iscsi/iqn.20....storage/tpg1&gt; set attribute authentication=1
Parameter authentication is now '1'.
/iscsi/iqn.20....storage/tpg1&gt; set attribute generate_node_acls=0
Parameter generate_node_acls is now '0'.
/iscsi/iqn.20....storage/tpg1&gt; acls/ create iqn.2021-12.cn.erika.iscsi:kvm-ubuntu.client
Created Node ACL for iqn.2021-12.cn.erika.iscsi:kvm-ubuntu.client
Created mapped LUN 0.
/iscsi/iqn.20....storage/tpg1&gt; cd acls/iqn.2021-12.cn.erika.iscsi:kvm-ubuntu.client/
/iscsi/iqn.20...ubuntu.client&gt; set auth userid=e
Parameter userid is now 'e'.
/iscsi/iqn.20...ubuntu.client&gt; set auth password=admin@r00t
Parameter password is now 'admin@r00t'.
/iscsi/iqn.20...ubuntu.client&gt; cd iscsi/iqn.2021-12.cn.erika.iscsi:erika-ge.storage/tpg1/
/iscsi/iqn.20....storage/tpg1&gt; ls
o- tpg1 ...........................................................
o- acls ...........................................................................
| o- iqn.2021-12.cn.erika.iscsi:kvm-ubuntu.client ..............
|   o- mapped_lun0 .................................................
o- luns ...........................................................................
| o- lun0 ......
o- portals .....................................................................
    o- 0.0.0.0:3260 ......................................................................
/iscsi/iqn.20....storage/tpg1&gt; cd /
/&gt; ls
o- / .................................................................................... [...]
o- backstores ......................................................................... [...]
| o- block .............................................................
| o- fileio ............................................................
| | o- demo1 ......
| |   o- alua ..............................................................
| |   o- default_tg_pt_gp ..................................
| o- pscsi .............................................................
| o- ramdisk ...........................................................
o- iscsi ......................................................
| o- iqn.2021-12.cn.erika.iscsi:erika-ge.storage ..................................
|   o- tpg1 .....................................................
|   o- acls .....................................................................
|   | o- iqn.2021-12.cn.erika.iscsi:kvm-ubuntu.client ........
|   |   o- mapped_lun0 ...........................................
|   o- luns .....................................................................
|   | o- lun0
|   o- portals ...............................................................
|       o- 0.0.0.0:3260 ................................................................
o- loopback ....................................................................
o- vhost .......................................................................
o- xen-pvscsi ..................................................................
/&gt; </code></pre>
</div>
<p>设置完成后,配置的客户端iqn后面的中括号里面的文字会变成绿色</p>
<p>然后修改客户端的配置文件/etc/iscsi/initiatorname.iscsi</p>
<p>将InitiatorName=后面的改成上面配置的客户端的iqn</p>
<p>然后修改客户端的配置文件/etc/iscsi/iscsid.conf</p>
<div class="cnblogs_code">
<pre><code># To enable CHAP authentication set node.session.auth.authmethod
# to CHAP. The default is None.
node.session.auth.authmethod = CHAP      # 去掉注释 启用登录认证

# To set a CHAP username and password for initiator
# authentication by the target(s), uncomment the following lines:
node.session.auth.username = e             # 去掉注释 写上用户名
node.session.auth.password = admin@r00t    # 去掉注释 写上密码</code></pre>
</div>
<p>重启服务iscsid,删除节点记录后重新发现并登录</p>
<div class="cnblogs_code">
<pre><code>e@kvm-ubuntu-01:/etc/iscsi$ sudo iscsiadm -m node -T iqn.2021-12.cn.erika.iscsi:erika-ge.storage -o delete
e@kvm-ubuntu-01:/etc/iscsi$ sudo iscsiadm -m discovery -t sendtargets -p 172.20.0.65
172.20.0.65:3260,1 iqn.2021-12.cn.erika.iscsi:erika-ge.storage
e@kvm-ubuntu-01:/etc/iscsi$ sudo iscsiadm -m node -T iqn.2021-12.cn.erika.iscsi:erika-ge.storage -l
Logging in to (multiple)
Login to successful.</code></pre>
</div>
<p>&nbsp;</p>
<p>到这里就结束了 谢谢观看</p>

</div>
<div id="MySignature" role="contentinfo">
    来自1942年冬季攻势中的中央集团军的037号17吨救援拖车<br><br>
来源:https://www.cnblogs.com/panther1942/p/15636533.html
頁: [1]
查看完整版本: 【记录】 iSCSI服务器的搭建与使用[Debian]