iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘
1、前言:
1.1、你是否有这样的需求:
现在的电脑游戏和应用程序越来越大,比如黑猴刚刚开放预载,需要100g+空间,即开心游戏内容应该很足,又因为电脑空间不足而难受,舍不得删除现有的东西,但是又没有多余的盘位,smb等协议虽然能挂载网络硬盘,但很多程序或者游戏安装到这种网络硬盘启动会报错,那有什么办法可以解决这个问题吗?
答案就是通过iSCSI协议挂载NAS的存储空间,电脑可以将这种协议挂载的硬盘完全识别成本地硬盘,除了盘本身不在电脑里,使用上和内置物理硬盘完全一致,比如下图,F,G就是挂载的iSCSI盘,和其他物理硬盘显示一样,而SMB挂载则显示在网络位置中。甚至可以通过iSCSI挂载来实现无盘系统(比如网吧就是类似这种方法实现的)。

1.2、iSCSI和SMB优劣
当然在不同的应用场景下iscsi和smb都有各自的优劣,所以还是需要针对自己实际的使用场景出发,来进行选择。
SMB:可以多设备挂载分享,同步操作,但安装应用程序打开可能会报错,在进行多设备文件读写操作时选择这种更好。
iSCSI:可以安装应用程序甚至是系统,有更好的读写性能,但是多个windows同时挂载可能会导致数据错乱,也无法实时看到文件变化,最好是一个存储挂载给一个设备进行使用,所以作为程序或游戏库要更好。
2、本教程目的&申明:
2.1、目的
现在新势力的成品NAS系统大多原生只支持将存储通过SMB,webDAV等协议挂载到其他的设备,iSCSI协议目前只有传统品牌NAS才原生支持,对有这个需要的小伙伴来说多少有点不方便,老K本教程就是通过docker部署tgt来实现启动iSCSI的服务端,让原生不支持iSCSI协议挂载的NAS可以将存储通过这个协议挂载到其他设备。
2.2、申明
本教程适配绿联私有云新老系统,极空间等支持docker的机器,操作有一定风险,需要理解透彻后再进行操作,配合视频教程观看效果更佳。
另外此项目老K基于fujita/tgt和wtnb75/docker-stgt的基础进行整和修改,如需转载请将以上两个项目一起带上。
tgt项目地址:https://github.com/fujita/tgt
老K修改后的项目地址:https://github.com/bilibili-koryking/iscsi-docker
3、部署前准备:
3.1、进入SSH root用户下
依然是按照我之前的教程,进入ssh 的root用户下。
iSCSI可以挂载我们的物理硬盘分区,也可以挂载虚拟硬盘文件,挂载物理硬盘读写效率更好,但需要是未使用状态的盘(类似于虚拟机硬盘直通),虚拟磁盘文件方式挂载则更加方便,直接在NAS中创建或使用已有的虚拟磁盘文件就行了。

3.2、物理挂载准备
3.2.1、检查磁盘状态
如上所说必须要是当前未使用状态的盘,因为初次挂载到pc会对其进行格式化,已使用的盘直接进行物理挂载会在重启NAS后app端显示存储池损毁。
PS:如果后面跟着操作的时候不小心挂载错了,不要重启,不要重启,不要重启,马上备份数据,还有得救。

所有盘都已使用,可以备份数据后删除存储池,或者重置存储,回到未使用状态,要不然就直接查看后面3.3虚拟磁盘文件挂载的章节。

3.2.2、找到未使用状态盘的设备名称
ssh中输入lsblk查看,下图sdb分了两个区,我们先找到他的大存储分区(看SIZE列的大小),比如这里就是sdb2,这个大分区没有创建子分区(看树结构有没有下层分区)且后面没有创建挂载点(看MOUNTPOINTS列有没有挂载路径),则sdb就是未被使用的硬盘设备,其他sda,nvme0n1的大分区都创建了一个或多个挂载点,这种就是已经创建了存储池的盘,至于nvme1n1(6800以上使用m2做系统盘的机型,名称可能会根据你插入m2的数量变化)或者mmcblk0(老绿联云,极空间,4800等使用emmc的机型)这种创建了p1,p2,p3,p4...的,这个是系统盘,千万,千万,千万不要动。

3.2.3、磁盘分区
我这里未使用的盘是sdb,则对应的设备路径就是/dev/sdb,执行fdisk /dev/sdb,各位小伙伴则用自己找到的盘名替换这里的sdb。
PS:如果准备整盘挂载,那就无需进行磁盘分区,直接记住/dev/sd(a,b,c...替换成你自己未使用盘的设备名)就行了。
fdisk /dev/sdb

因为sdb2已经占用了所有的空间,我们需要先将sdb2分区的空间释放出来,执行完fdisk /dev/sdb后,我们会进入fdisk工具中,先输入d(表示我们要删除分区),在输入2(表示删除第2个分区,也就是sdb2),再输入w(保存操作并推出fdisk工具,如果上面步骤有输入错了的,这里输入q,表示直接退出,不保存操作)。

执行lsblk看下,sdb下,只剩下一个分区了,这个分区是磁盘系统分区,可以按照上面的操作给删掉也可以不管他,反正15g也无所谓。

继续执行fdisk /dev/sdb,进入fdisk工具,先输入n(表示创建分区),再输入2(表示创建一个新的第2分区也就是sdb2,如果之前删掉了sdb1,则这里输入1),下面输入的32000000(表示这个分区的起始块序号,可以不输入直接回车或者使把提示的默认块序号复制粘贴进去),21251757055(表示结束的块序号,一个块512个字节大小,根据自己想要分区的空间大小,自己算下应该是多少),如果有红字提示什么签名,直接输入y确认。继续n创建分区,直到分完所有块,输入w保存并退出fdisk工具。

再次执行lsblk,可以看到已经多了两个分区了,将准备挂载的分区名称都记下(比如这里就是/dev/sdb2,/dev/sdb3),到这一步物理磁盘挂载准备就做完了,如果无需虚拟磁盘挂载则直接跳转到第4章节查看部署步骤,如果也需要虚拟磁盘挂载那就继续按顺序查看。

3.3、虚拟磁盘挂载准备
3.3.1、确定虚拟磁盘文件存放目录
虚拟磁盘挂载则和物理磁盘挂载相反,需要盘在系统中已经使用,我们先在app中对应盘中创建一个目录,用以放虚拟磁盘文件,绿联云新系统直接在目录上右键属性,点击位置后的复制即可获取到绝对路径。

极空间和绿联云老系统则需要创建后到ssh中执行以下命令查找绝对路径。
> find /mnt -type d -iname "virtual_disk" #绿联云老系统执行这个
> find /tmp -type d -iname "virtual_disk" #极空间执行这个

再执行cd 找到的绝对路径,进入对应的目录下,比如绿联云老系统就是如下命令。
cd /mnt/dm-0/.ugreen_nas/82095/docker/iscsi-docker/virtual_disk
3.3.2、创建虚拟磁盘文件
到目录下后,直接执行以下命令创建虚拟磁盘文件(绿联云老系统无法直接创建,可以去其他虚拟机软件里创建后上传到这个目录里),文件可以创建多个,也可以在多个目录创建。
qemu-img create -f raw virtual_disk.img 100G

执行以下命令加个权限,防止后面docker使用不了。
chmod 777 virtual_disk.img

4、部署:
4.1、docker compose方式部署
绿联云新系统现在内置了docker compose(部署了portainer,dockge,1panel的小伙伴也能参考部署),直接打开docker>项目,点击创建。

填入一个不冲突的项目名称,也是docker文件夹下的目录名称,将以下compose命令根据要求修改后填入进去,仔细检查挂载的目录和盘,确认无误后再点击立即部署。
services: iscsi-docker: container_name: iscsi-docker restart: unless-stopped network_mode: host privileged: true volumes: - /run/lvm:/run/lvm - /lib/modules:/lib/modules - /sys/kernel/config:/sys/kernel/config - /dev:/dev #无物理磁盘挂载则删掉这行 - /volume1/iscsi/virtual_disk:/virtual_disk #无虚拟磁盘挂载则删掉这行,有的话则冒号左边替换成自己的绝对路径 #- /volume2/iscsi/virtual_disk:/virtual_disk2 #虚拟磁盘文件在多个目录就挂载多个目录 environment: - targetname=koryking #target名称,自定义一个 - lundev1=/dev/sda3 #改成自己找到的物理磁盘分区,有多个分区继续添加lundev(x) #- lundev2=/dev/sda4 - lundev3=/virtual_disk/virtual_disk.img #有多个虚拟磁盘,继续添加lundev(x),改成映射到容器内的虚拟磁盘路径 #- lundev4=/virtual_disk2/virtua2_disk.img - ip_address=192.168.66.0/24 #改成自己的网段 image: koryking/iscsi-docker #image: docker.1panel.dev/koryking/iscsi-docker #网络不好就删掉这行开头的#把上一行开头加个#,失效了就自己再换个源地址

部署日志中出现如下内容后就表示已经部署完成了,点击完成关闭弹框。

4.2、docker run方式部署
直接在ssh的root用户下执行以下命令,需要改动的地方,参考上面绿联云新系统compose命令的改动点。
docker run -d --net host --name iscsi-docker --restart unless-stopped --privileged -v /run/lvm:/run/lvm -v /lib/modules:/lib/modules -v /sys/kernel/config:/sys/kernel/config -v /dev:/dev -v /tmp/zfsv3/sata13/1888888888/data/virtual_disk:/virtual_disk -e targetname=koryking11 -e lundev2=/virtual_disk/virtual_disk.img -e lundev2=/dev/sda2 -e ip_address=192.168.66.0/24 docker.1panel.dev/koryking/iscsi-docker
出现类似下图样式就表示部署成功了。

5、挂载到电脑:
电脑上直接win+r打开运行,输入iscsicpl,点击确定,第一次打开会有个弹框直接确定。

目标中填入nasip,点击快速连接,弹框中确认下是否和自己的targetname一致,状态是不是已连接,点击完成关闭弹框。

再次win+r,输入compmgmt.msc确认,进入计算机管理页面,点到磁盘管理,初次挂载会弹框发现了新的磁盘,点击确定(物理磁盘挂载的情况,点击确定前,请务必再次对比下自己的容器配置和lsblk中的信息,检查下是不是挂载对了)。

找到未分配空间的盘,右键,新建简单卷。

根据提示一路下一步就可以创建成本地磁盘了。

先别急着结束,一定要记得再回到iSCSI发起程序中,选择卷和设备页签,点击自动配置,再点击确定,将盘符给固定一下,不然后续如果重启机器或者添加空间,可能会出现冲突导致挂载失败的问题。

6、扩展操作:
如果你懂tgt的使用,或者有更多的需求,仍然可以进入到iscsi-docker容器终端中,使用tgt的命令进行更多配置。
比如如下命令就是查看当前target配置情况(挂载遇到问题可以到这里查看下lun信息对不对,再对比下lsblk的信息并修改容器创建的命令)。
tgtadm --mode target --op show

其他一些命令(更多用法可以到tgt的仓库中查看tgt文档),这里就不再赘述了:
#创建target tgtadm --mode target --op new --tid 1 --targetname koryking #创建lun tgtadm --mode logicalunit --op new --tid 1 --lun 1 --backing-store /dev/sdb #放开防火墙 tgtadm --mode logicalunit --op new --tid 1 --lun $i --backing-store 192.168.66.0/24
7、最后:
iSCSI or SMB的答案自然是全部都需要,根据不同的应用场景选择不同的协议,也希望各大新势力官方能尽快更新支持iSCSI协议,毕竟docker方式挂载还是有一点麻烦且有一定局限性的。
最后,大家觉得有用的话,记得点个关注点个赞,我们下期再见。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

koryking
校验提示文案
威廉的珂学家
校验提示文案
wangxingcs
校验提示文案
kokle
校验提示文案
BillGor
校验提示文案
值友6600759880
校验提示文案
值友8714209111
校验提示文案
哆啦做A梦
校验提示文案
蓝色泡泡龙
校验提示文案
威廉的珂学家
校验提示文案
值友8714209111
校验提示文案
哆啦做A梦
校验提示文案
wangxingcs
校验提示文案
值友6600759880
校验提示文案
kokle
校验提示文案
蓝色泡泡龙
校验提示文案
BillGor
校验提示文案
koryking
校验提示文案