P2[向NAS借一点空间]_iSCSI配置之Docker一键部署

P2_iSCSI配置之Docker一键部署

[!NOTE]

书接上回 P1_部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘 - DUTYC博客 ,在本地宿主机部署了iSCSI服务,但是配置过程过于繁琐,且对生产环境来讲有比较大的风险,这一次我们使用docker容器来部署,减轻工作量.部分教程参考自Docker实战-ISCSI_docker iscsi-CSDN博客

1.环境准备

1.1安装docker

  • 更新系统软件包

首先,确保你的系统软件包是最新的。打开终端并运行以下命令:

1
sudo yum update -y
  • 设置 Docker 的仓库

在安装新版本的 Docker 之前,需要设置 Docker 的官方稳定仓库。

1
2
3
4
5
6
7
# 安装一些必要的包,使得 yum 可以使用基于 HTTPS 的仓库
sudo yum install -y yum-utils

# 设置 Docker 的稳定版仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
  • 安装 Docker 引擎

现在你可以从设置好的稳定仓库中安装最新版本的 Docker 引擎了:

1
sudo yum install docker-ce docker-ce-cli containerd.io

如果有多个 Docker 版本可用,你也可以通过指定确切的版本号来安装特定版本的 Docker:

1
2
3
4
5
# 列出可用的 Docker 版本
yum list docker-ce --showduplicates | sort -r

# 使用版本号替换 <VERSION_STRING> 来安装特定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  • 配置Docker 使用加速器镜像源
1
2
mkdir /etc/docker/
vim /etc/docker/daemon.json

​ 添加镜像加速地址,注意镜像加速地址可能会失效,测试地址有效后再配置

1
2
3
4
5
{
"registry-mirrors": [
"https://docker.xuanyuan.me"
]
}

​ 重新加载docker服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 启动 Docker 并设置开机自启

安装完成后,启动 Docker,并将其配置为随系统启动。

1
2
sudo systemctl start docker
sudo systemctl enable docker
  • 确认Docker组件已经启动:
1
ps aux | grep docker

2.部署iSCSI docker服务端

  • 下载iSCSI Docker镜像:
1
docker pull wtnb75/stgt
  • 运行iSCSI容器: 下面的命令将启动一个名为stgt的容器,该容器会作为iSCSI服务端运行,并映射端口3260以允许客户端连接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run \
--restart unless-stopped
--detach \
--name stgt \
--restart unless-stopped \
--net host \
--privileged \
--volume /etc/target:/etc/target \
--volume /run/lvm:/run/lvm \
--volume /lib/modules:/lib/modules \
--volume /sys/kernel/config:/sys/kernel/config \
--volume /dev:/dev \
--volume /vol2/1000/iscsi_img:/vol2/1000/iscsi_img(使用自己的img镜像所在的文件目录,并非.img文件的路径) \
wtnb75/stgt
  • 创建Target:
1
docker exec stgt tgtadm --mode target --op new --tid 1 --targetname iqn.2025-02.com.comsys:iscsi.fcdisk(名字自己定)
  • 创建LUN(这里假设你有一个硬盘镜像文件/vol2/1000/iscsi_img/storage.img,或者一个硬盘分区):
方式一: 使用.img硬盘镜像文件创建,如果没有现成的镜像文件,可以先通过dd或者truncate命令创建一个:
1
2
3
4
#使用dd命令创建
dd if=/dev/zero of=/vol2/1000/iscsi_img/storage.img bs=1M count=1024 # 创建一个1GB大小的镜像文件,记得使用自己的路径
#或者使用truncate 命令,truncate 命令不会立即分配实际的磁盘空间,而是通过稀疏文件的方式标记文件大小,这意味着文件的实际占用空间会随着数据写入而逐渐增加
truncate -s 2G /vol2/1000/iscsi_img/storage.img
1
2
#创建LUN
docker exec stgt tgtadm --mode logicalunit --op new --tid 1 --lun 1 --backing-store /vol2/1000/iscsi_img/storage.img

[!NOTE]

可以后期增加 .img 文件的大小,详情请见文章末尾

方式二: 使用硬盘分区创建,分区为/dev/adb1,请根据实际情况调整
1
2
 # 注意ISCSI通过提供块设备(例如硬盘或分区)的方式进行工作,不能直接共享一个文件系统目录
docker exec stgt tgtadm --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb1
  • 授权: 允许特定网段内的客户端访问iSCSI Target。
1
docker exec stgt tgtadm --mode target --op bind --tid 1 --initiator-address 192.168.0.105   #(客户端IP)
  • 查看已定义的信息:
1
docker exec stgt tgtadm --mode target --op show
  • 输出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@learn 1000]# docker exec stgt tgtadm --mode target --op show
Target 1: iqn.2017-04.com.comsys:iscsi.fcdisk
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: 2147 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: /vol2/1000/iscsi_img/storage.img
Backing store flags:
Account information:
ACL information:
192.168.0.105
  • 开放防火墙3260端口

确保服务器上的防火墙允许iSCSI通信,默认情况下,iSCSI使用3260端口。可以暂时关闭防火墙

1
2
#在CentOS/RHEL系统上: 
systemctl stop firewalld

或者,只开放特定端口:

1
2
firewall-cmd --zone=public --add-port=3260/tcp --permanent
firewall-cmd --reload

3. 在客户端(如 Windows 11)挂载 iSCSI Target

4.服务端查看通过iSCSI挂载到Windows 的磁盘上放入的文件

参考 P1_部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘 - DUTYC博客 第5章节

5.后期调整.img文件的大小

[!IMPORTANT]

最好在一个非生产环境中测试整个过程,以避免意外的数据丢失或其他问题。

步骤 1: 增加 .img 文件的大小

首先,增加 .img 文件的物理大小。假设想将其扩展到 50GB:

1
truncate -s 50G /vol2/1000/iscsi_img/storage.img

或使用 dd(实际分配空间):

1
dd if=/dev/zero bs=1M count=0 seek=50G of=/vol2/1000/iscsi_img/storage.img

加载 .img 文件为循环设备

接下来,将 .img 文件加载为一个循环设备:

1
losetup -f --show /vol2/1000/iscsi_img/storage.img

这将返回一个循环设备名称,例如 /dev/loop0

调整 NTFS 分区大小

由于 .img 文件包含的是 NTFS 文件系统,我们需要使用 ntfsresize 来调整文件系统的大小。在此之前,请确保安装了 ntfs-3g 工具包,它包含了 ntfsresize

1
yum install ntfs-3g -y

检查文件系统的一致性

在调整大小之前,建议先检查文件系统的完整性:

1
ntfsfix /dev/loop0

虽然 ntfsfix 主要用于修复NTFS文件系统中的错误,但在某些情况下,它也能帮助确保文件系统处于良好的状态以便进行调整。

调整文件系统大小

现在可以使用 ntfsresize 来调整文件系统的大小。请注意,ntfsresize 不会自动调整分区表,因此我们只需关注文件系统本身:

1
2
ntfsresize -i /dev/loop0   # 查看当前文件系统信息
ntfsresize --force /dev/loop0 # 调整文件系统以占用所有可用空间

注意:ntfsresize 在执行操作前会进行一次模拟运行并询问是否继续,使用 --force 参数可以直接执行调整,但请谨慎使用。

更新 iSCSI Target 配置

理论上,在扩展 .img 文件和调整文件系统大小后,iSCSI Target 应该已经能够识别新的容量。但是,为了确保客户端能看到全部可用空间,可能需要在客户端上重新扫描或重新连接 iSCSI Target。

6.总结

[!NOTE]

以上步骤详细描述了如何在 Linux (NAS)上安装docker部署 iSCSI Target。每个环境可能有其特定的需求或限制,请根据实际情况调整上述步骤; 如果有任何问题或需要进一步的帮助,请询问我们

邮箱:dutyc.studio@qq.com 作者Github : Persistence


P2[向NAS借一点空间]_iSCSI配置之Docker一键部署
http://blog.dutyc.top/2025/02/15/P2-iSCSI配置之Docker一键部署/
作者
DUTYC Studio
发布于
2025年2月15日
许可协议