搭建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
2
sudo parted /dev/sdb mklabel gpt  # 初始化磁盘为GPT格式
sudo parted /dev/sdb mkpart primary 1MiB 100% # 设置起始为1MiB(自动对齐4K物理扇区),创建完整空间的分区(如/dev/sdb1)

刷新分区表,强制内核重新读取分区信息

1
sudo partprobe /dev/sdb

格式化分区为 exFAT

1
2
3
4
5
6
# 安装exFAT支持包(Ubuntu 22.04默认未集成exFAT驱动)
sudo apt update
sudo apt install exfat-fuse exfatprogs

# 格式化
sudo mkfs.exfat /dev/sdb1

验证文件系统格式化结果

1
lsblk -f /dev/sdb  # 应显示文件系统类型为exfat

临时挂载测试

1
2
3
4
5
sudo mkdir /mnt/exfat_disk  # 创建挂载点
sudo mount /dev/sdb1 /mnt/exfat_disk

sudo unmount /mnt/exfat_disk # 卸载挂载点(通过文件路径)
suso unmount /dev/sdb1 # 卸载挂载点(通过硬盘盘名)

持久化挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 获取硬盘UUID
sudo blkid /dev/sdb1 # 输出示例:/dev/sdb1: UUID="ABCD-1234" TYPE="exfat"
# 获取用户uid和gid
id -u $USER # 输出示例:1000
id -g $USER # 输出示例:1000

# 修改/etc/fstab文件
sudo vim /etc/fstab
# 添加一行,后面两个0分别代表:备份表及:无需备份;检查顺序:无需检查
UUID=ABCD-1234 /mnt/iscsi exfat defaults,uid=1000,gid=1000 0 0

# 测试挂载
sudo mount -a # 若无错误则配置正确

# 确认挂载状态
lsblk -f /dev/sdb1

Ubuntu 安装 tgt

注意,如果还要对硬盘进行格式化,请先停止 tgt 服务,否则会出现数据不一致/丢失的情况

Ubuntu 官方推荐使用 tgt 作为 iSCSI 目标服务

1
2
sudo apt update
sudo apt install tgt

然后创建配置文件

1
sudo vim /etc/tgt/conf.d/iscsi.conf

写入配置内容

1
2
3
4
5
6
7
8
9
10
11
12
<target iqn.2025-05.yourdomain:storage.sdb>
backing-store /dev/sdb # 指向新硬盘
# backing-store /dev/sdb1 # 指向新硬盘分区

write-cache off # 关闭写入缓存,可以防止异常断电时数据丢失
# write-cache on # 启用写入缓存提升性能

allow-in-use yes # 允许多客户端同时挂载(需注意数据一致性)

initiator-address ALL # 允许所有IP访问(生产环境建议限制IP段)
# initiator-address 192.168.1.100 # 限制访问权限(示例仅允许指定IP)
</target>

这里的 iqn.2025-05.yourdomain:storage.sdb 相当于该配置的 id,后续会使用到。
重启服务并验证配置,

如果想让不同的分区被不同的电脑挂载,就需要添加多个标签,然后设置对应的允许访问 ip

1
2
sudo systemctl restart tgt
sudo tgtadm --mode target --op show # 查看目标状态

开放 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
2
3
4
5
6
7
8
9
10
11
diskpart
list disk # 确认目标磁盘编号
select disk X # 选择目标磁盘(X 为编号)
list partition # 列出所有分区
select partition Y # 选择问题分区(Y 为编号)
detail partition # 查看当前分区类型标识

set id=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 # GPT设置分区类型为 exFAT
set id=07 override # ​​MBR磁盘设置分区类型为 exFAT​​(override参数强制覆盖)

assign letter=Z # 设置盘符

数据丢失

服务器 rtcwake 时,可能导致硬盘休眠,导致数据丢失。

该问题可以通过关闭写入缓存来避免数据丢失,但会降低性能。参考
如果你不想关闭写入缓存(写入缓存帮助还是挺大的),那么可以先同步缓存,再休眠。

创建一个刷盘服务,关键是要在 rtcwake 之前执行刷盘

1
2
3
4
5
6
7
8
# 创建刷盘服务文件 /etc/systemd/system/tgt-flush.service
[Unit]
Description=Force TGT cache flush
Before=rtcwake.service

[Service]
Type=oneshot
ExecStart=/usr/bin/sudo /usr/sbin/tgt-admin --update ALL

创建完成之后,执行下面的命令,就可以安全地使 iSCSI 进入休眠了

1
2
3
4
systemctl start tgt-flush # 触发TGT缓存刷盘
sync # 二次内核级同步
echo 3 > /proc/sys/vm/drop_caches # 清除页面缓存
rtcwake -m mem -s 1800 # 执行挂起
  • 标题: 搭建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 进行许可。