1、前言:

1.1、你是否有这样的需求:

现在的电脑游戏和应用程序越来越大,比如黑猴刚刚开放预载,需要100g+空间,即开心游戏内容应该很足,又因为电脑空间不足而难受,舍不得删除现有的东西,但是又没有多余的盘位,smb等协议虽然能挂载网络硬盘,但很多程序或者游戏安装到这种网络硬盘启动会报错,那有什么办法可以解决这个问题吗?

答案就是通过iSCSI协议挂载NAS的存储空间,电脑可以将这种协议挂载的硬盘完全识别成本地硬盘,除了盘本身不在电脑里,使用上和内置物理硬盘完全一致,比如下图,F,G就是挂载的iSCSI盘,和其他物理硬盘显示一样,而SMB挂载则显示在网络位置中。甚至可以通过iSCSI挂载来实现无盘系统(比如网吧就是类似这种方法实现的)。

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

​​​

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

stgt项目地址:https://github.com/wtnb75/docker-stgt

老K修改后的项目地址:https://github.com/bilibili-koryking/iscsi-docker

3、部署前准备:

3.1、进入SSH root用户下

依然是按照我之前的教程,进入ssh 的root用户下。

iSCSI可以挂载我们的物理硬盘分区,也可以挂载虚拟硬盘文件,挂载物理硬盘读写效率更好,但需要是未使用状态的盘(类似于虚拟机硬盘直通),虚拟磁盘文件方式挂载则更加方便,直接在NAS中创建或使用已有的虚拟磁盘文件就行了。

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

3.2、物理挂载准备

3.2.1、检查磁盘状态

如上所说必须要是当前未使用状态的盘,因为初次挂载到pc会对其进行格式化,已使用的盘直接进行物理挂载会在重启NAS后app端显示存储池损毁。

PS:如果后面跟着操作的时候不小心挂载错了,不要重启,不要重启,不要重启,马上备份数据,还有得救。

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

3.2.2、找到未使用状态盘的设备名称

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

3.2.3、磁盘分区

我这里未使用的盘是sdb,则对应的设备路径就是/dev/sdb,执行fdisk /dev/sdb,各位小伙伴则用自己找到的盘名替换这里的sdb。

PS:如果准备整盘挂载,那就无需进行磁盘分区,直接记住/dev/sd(a,b,c...替换成你自己未使用盘的设备名)就行了。

fdisk /dev/sdb

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

3.3、虚拟磁盘挂载准备

3.3.1、确定虚拟磁盘文件存放目录

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

极空间和绿联云老系统则需要创建后到ssh中执行以下命令查找绝对路径。

> find /mnt -type d -iname "virtual_disk" #绿联云老系统执行这个

> find /tmp -type d -iname "virtual_disk" #极空间执行这个 ​

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

再执行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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

chmod 777 virtual_disk.img

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

4、部署:

4.1、docker compose方式部署

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

填入一个不冲突的项目名称,也是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 #网络不好就删掉这行开头的#把上一行开头加个#,失效了就自己再换个源地址 ​

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

出现类似下图样式就表示部署成功了。

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

5、挂载到电脑:

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

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

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

6、扩展操作:

如果你懂tgt的使用,或者有更多的需求,仍然可以进入到iscsi-docker容器终端中,使用tgt的命令进行更多配置。

比如如下命令就是查看当前target配置情况(挂载遇到问题可以到这里查看下lun信息对不对,再对比下lsblk的信息并修改容器创建的命令)。

tgtadm --mode target --op show

iSCSI or SMB?一起部署一个iSCSI服务端,将NAS空间挂载成真正的电脑硬盘

其他一些命令(更多用法可以到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方式挂载还是有一点麻烦且有一定局限性的。

最后,大家觉得有用的话,记得点个关注点个赞,我们下期再见。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

,

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。