搭建iSCSI服务

前言
iSCSI(Internet Small Computer System Interface)是一种基于因特网及 SCSI-3 协议下的存储技术,
简单来说就是把网络上的硬盘通过网线挂载成电脑的本地硬盘,方便扩容。
我搭建 iSCSI 服务主要是给我的 Windows 系统存储扩容。
普通情况下,机械硬盘顺序读写速度通常为 150-190MB/s,
我选择将其安装到另一台电脑(要有千兆网卡),通过 Ubuntu 系统部署为 iSCSI 服务,然后接入到千兆局域网,
Windows 系统的电脑通过网络使用该硬盘(和本地硬盘一样的使用方法),速度也可以达到千兆局域网的上限 125MB/s
接下来就是简单的搭建过程
硬件处理
将硬盘插入主板,然后开机,先查看一下硬盘信息
1  | sudo fdisk -l  | 
找到你的新硬盘,硬盘一般按顺序起名,例如从第一个硬盘开始起名:/dev/sda、/dev/sdb、/dev/sdc……
/dev/sda 一般是系统盘,我的新硬盘是第二个,所以是 /dev/sdb
格式化硬盘并分区
注意:如果你的硬盘只想通过 iSCSI 提供给 Windows 系统使用,请忽略此处内容,直接参考Windows-格式化硬盘并分区
注意:进行此处操作时,请关闭 iSCSI 服务
1  | sudo parted /dev/sdb mklabel gpt # 初始化磁盘为GPT格式  | 
刷新分区表,强制内核重新读取分区信息
1  | sudo partprobe /dev/sdb  | 
格式化分区为 exFAT
1  | # 安装exFAT支持包(Ubuntu 22.04默认未集成exFAT驱动)  | 
验证文件系统格式化结果
1  | lsblk -f /dev/sdb # 应显示文件系统类型为exfat  | 
临时挂载测试
1  | sudo mkdir /mnt/exfat_disk # 创建挂载点  | 
持久化挂载
1  | # 获取硬盘UUID  | 
Ubuntu 安装 tgt
注意,如果还要对硬盘进行格式化,请先停止 tgt 服务,否则会出现数据不一致/丢失的情况
Ubuntu 官方推荐使用 tgt 作为 iSCSI 目标服务
1  | sudo apt update  | 
然后创建配置文件
1  | sudo vim /etc/tgt/conf.d/iscsi.conf  | 
写入配置内容
1  | <target iqn.2025-05.yourdomain:storage.sdb>  | 
这里的 iqn.2025-05.yourdomain:storage.sdb 相当于该配置的 id,后续会使用到。
重启服务并验证配置,
如果想让不同的分区被不同的电脑挂载,就需要添加多个
1  | sudo systemctl restart tgt  | 
开放 iSCSI 端口,iSCSI 默认使用 TCP 3260端口,这里可以通过宝塔面板配置
Windows 客户端挂载 
打开 iSCSI 发起程序,在  发现  标签页点击 发现门户,输入 Ubuntu 服务器 IP 和端口(默认 3260),
在 目标 标签页选择发现的 IQN(如 _iqn.2025-05.yourdomain:storage.sdb_),点击 连接
格式化硬盘并分区
上一步完成后,如果你的新硬盘已经格式化并分区,就可以直接在 此电脑 中看到该硬盘,
如果看不到,说明硬盘的格式化工作或分区工作没做好,
可以在控制面板中搜索 创建并格式化硬盘分区 或者 磁盘管理,打开后查看该硬盘,
这里推荐 傲梅分区助手 ,傲梅分区助手(百度网盘) 
已知问题
文件系统识别失败
可能由于 Windows 和 Ubuntu 对于文件系统(exFAT、NTFS 等)的支持不统一,导致在 Windows 上格式化的文件系统无法在 Ubuntu 上挂载,而在 Ubuntu 上格式化的文件系统无法被 Windows 识别。
该问题可以通过关闭 tgt 服务后再格式化硬盘来解决
1  | sudo sync && sudo systemctl stop tgtd # 同步硬盘后停止 tgt 服务  | 
在 Ubuntu 格式化为 exFAT 格式,Ubuntu 可以正常识别,但是在 Windows 上无法识别,可能会导致无法添加盘符和后续问题,通过以下方法解决。
在 windows 上运行 diskpart 命令。
1  | diskpart  | 
数据丢失
服务器 rtcwake 时,可能导致硬盘休眠,导致数据丢失。
该问题可以通过关闭写入缓存来避免数据丢失,但会降低性能。参考 。
如果你不想关闭写入缓存(写入缓存帮助还是挺大的),那么可以先同步缓存,再休眠。
创建一个刷盘服务,关键是要在 rtcwake 之前执行刷盘
1  | # 创建刷盘服务文件 /etc/systemd/system/tgt-flush.service  | 
创建完成之后,执行下面的命令,就可以安全地使 iSCSI 进入休眠了
1  | systemctl start tgt-flush # 触发TGT缓存刷盘  | 
- 标题: 搭建iSCSI服务
 - 作者: 木头的喵喵拖孩
 - 创建于: 2025-05-21 21:10:26
 - 更新于: 2025-06-08 18:38:43
 - 链接: https://blog.xx-xx.top/2025/05/21/搭建iSCSI服务/
 - 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。