本指南包括所需软件的安装步骤。这个指南涵盖了从安装必要的软件包到配置 iSCSI Target 并在客户端挂载使用的基本流程
前言:
[!NOTE]
为解决电脑空间不足且程序、游戏无法安装到smb共享的网络硬盘的问题,可通过iSCSI协议挂载NAS存储空间,使电脑将其识别为本地硬盘,实际使用上与物理硬盘一致
1. 安装必要的软件
服务端配置(Linux 系统)
-
安装
targetcli
和相关工具:-
对于基于 Red Hat 的系统(如 CentOS、RHEL、Fedora):
sudo yum install targetcli
-
对于基于 Debian 的系统(如 Ubuntu):
sudo apt-get update sudo apt-get install targetcli-fb
-
-
安装
ntfs-3g
工具(用于挂载 NTFS 文件系统):-
对于基于 Red Hat 的系统:
sudo yum install ntfs-3g
-
对于基于 Debian 的系统:
sudo apt-get install ntfs-3g
-
-
安装
lsof
和psmisc
包(用于查找和终止占用文件系统的进程):-
对于基于 Red Hat 的系统:
sudo yum install lsof psmisc
-
对于基于 Debian 的系统:
sudo apt-get install lsof psmisc
-
2. 创建后端存储
-
进入
targetcli
shell:sudo targetcli
-
创建文件IO存储对象
(以/home/iscsi_disk.img 路径下的img镜像为例,大小为2GB):
/> cd /backstores/fileio /backstores/fileio> create file_or_dev=/home/iscsi_disk.img name=my_iscsi_disk size=2G
3. 配置 iSCSI Target
-
创建一个新的 iSCSI Target
(使用合适的 IQN,例如iqn.2025-02.com.example:server.target0)#名字而已,随意
/> cd /iscsi /iscsi> create iqn.2025-02.com.example:server.target0
-
进入新创建的 Target 的 TPG:
/iscsi> cd iqn.2025-02.com.example:server.target0/tpg1
-
添加 LUN
(将之前创建的文件IO存储对象添加为 LUN):
/iscsi/iqn.20...rget0/tpg1> luns/ create /backstores/fileio/my_iscsi_disk
-
配置访问控制(ACL)
(根据需要设置客户端IQN):Windows的ISCSI客户端中"配置"页面查看
/iscsi/iqn.20...rget0/tpg1> acls/ create iqn.1991-05.com.microsoft:desktop-tcn6g45(换成自己的)
-
禁用认证(如果适用):
/iscsi/iqn.20...rget0/tpg1> set attribute authentication=0
-
启用 TPG
(通常默认已启用):
/iscsi/iqn.20...rget0/tpg1> enable
-
保存配置:
/> cd / /> saveconfig /> exit
[!IMPORTANT]
请确保防火墙开放 3260 端口
-
配置防火墙规则以允许3260开放
sudo firewall-cmd --zone=public --add-port=3260/tcp --permanent sudo firewall-cmd --reload
[!NOTE]
(万不得已的情况下请使用此方法) 彻底关闭防火墙(请勿在生产环境中使用此命令 ,适用于CentOS 7 或 RHEL 7 及其衍生版本)
停止
firewalld
服务:sudo systemctl stop firewalld
禁用
firewalld
服务,使其不会在系统启动时自动启动:sudo systemctl disable firewalld
- 重新加载 LIO 服务配置
-
重启 LIO 服务: 如果需要应用新的配置或者重启 LIO 服务,可以使用以下命令:
sudo systemctl restart target
-
开机自启动 LIO 服务: 使用下面的命令确保
target
服务会在系统启动时自动运行:sudo systemctl enable target
-
检查 LIO 服务状态: 若要查看
target
服务的状态,可以使用:sudo systemctl status target
4. 在客户端(如 Windows 11)挂载 iSCSI Target
-
在 Windows 中使用 iSCSI Initiator 连接到服务器上的 iSCSI Target。#具体参考csdn文章
-
初始化并格式化磁盘(如果新添加)。
-
验证连接:确保可以读写数据到新挂载的卷。
5.服务端查看通过iSCSI挂载到Windows 的磁盘上放入的文件
使用 parted
查看分区信息
sudo parted /home/iscsi_disk.img unit s print
命令输出如下:
[root@learn home]# sudo parted /home/iscsi_disk.img unit s print
Model: (file)
Disk /home/iscsi_disk.img: 4194304s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name 标志
1 34s 32767s 32734s Microsoft reserved partition msftres
2 32768s 4190207s 4157440s ntfs Basic data partition
[root@learn home]#
根据提供的 parted
输出,/home/iscsi_disk.img
文件包含两个分区:
- Microsoft reserved partition(微软保留分区),从第34个扇区开始,到第32767个扇区结束。
- Basic data partition(基本数据分区),从第32768个扇区开始,到第4190207个扇区结束,文件系统类型为 NTFS。
为了在服务端查看第二个分区(即 NTFS 分区)中的文件内容,我们需要计算正确的偏移量,并使用该偏移量挂载这个分区。
确认分区偏移量
确保使用的偏移量是正确的。根据 parted
的输出,第二个分区(NTFS 分区)从第 32768 扇区开始,每个扇区大小为 512 字节。因此,偏移量应为:
偏移量 = 32768 * 512 = 16777216 字节
我们可以再次确认分区表和偏移量是否正确:
sudo parted /home/iscsi_disk.img unit s print
首先,使用 losetup
将 .img
文件关联到一个循环设备,并列出所有循环设备以确认是否正确关联:
sudo losetup -P -f --show /home/iscsi_disk.img
这个命令会自动找到并分配一个空闲的循环设备,并且 -P
参数会自动扫描分区表并创建相应的设备节点(如 /dev/loop0p1
, /dev/loop0p2
等)。
然后,列出所有循环设备:
lsblk
应该能看到类似 /dev/loop0p1
和 /dev/loop0p2
这样的设备节点。其中 /dev/loop0p2
应该对应于的 NTFS 分区。
[!IMPORTANT]
NTFS 分区有时候会处于不安全的状态。具体来说,Windows 可能没有完全关闭该分区(例如通过快速启动或休眠功能),这导致了文件系统元数据仍然保存在 Windows 缓存中。因此,Linux 系统会拒绝以读写模式挂载该分区。所以要使用只读模式挂载
尝试只读挂载 (方法二选一)
如果你只是想查看文件而不需要修改它们,可以尝试以只读模式挂载:
sudo mount -o ro,loop,offset=16777216 /home/iscsi_disk.img /mnt
- 或者直接挂载已识别的分区:
sudo mount -t ntfs-3g -o ro /dev/loop0p2 /mnt
-
完成后的清理工作:
sudo umount /mnt sudo losetup -d /dev/loop0
6. 解决挂载点忙的问题
如果遇到挂载点忙的问题,可以使用以下命令查找并终止占用该挂载点的进程:
-
查找占用
/mnt
的进程:sudo fuser -m /mnt sudo lsof /mnt
-
终止相关进程:
sudo kill -9 PID
将PID替换为你找到的实际进程ID。
7.总结
[!NOTE]
以上步骤详细描述了如何在 Linux 服务器上安装必要的软件、配置 iSCSI Target、以及如何在客户端挂载和使用该 Target。同时也包含了如何在服务端查看通过 iSCSI 挂载的卷中的文件。每个环境可能有其特定的需求或限制,请根据实际情况调整上述步骤; 如果有任何问题或需要进一步的帮助,请询问我们
邮箱:dutyc.studio@outlook.com 作者Github