1、前言:
1.1、你是否有這樣的需求:
現(xiàn)在的電腦游戲和應(yīng)用程序越來越大,比如黑猴剛剛開放預(yù)載,需要100g+空間,即開心游戲內(nèi)容應(yīng)該很足,又因為電腦空間不足而難受,舍不得刪除現(xiàn)有的東西,但是又沒有多余的盤位,smb等協(xié)議雖然能掛載網(wǎng)絡(luò)硬盤,但很多程序或者游戲安裝到這種網(wǎng)絡(luò)硬盤啟動會報錯,那有什么辦法可以解決這個問題嗎?
答案就是通過iSCSI協(xié)議掛載nas的存儲空間,電腦可以將這種協(xié)議掛載的硬盤完全識別成本地硬盤,除了盤本身不在電腦里,使用上和內(nèi)置物理硬盤完全一致,比如下圖,F(xiàn),G就是掛載的iSCSI盤,和其他物理硬盤顯示一樣,而SMB掛載則顯示在網(wǎng)絡(luò)位置中。甚至可以通過iSCSI掛載來實現(xiàn)無盤系統(tǒng)(比如網(wǎng)吧就是類似這種方法實現(xiàn)的)。
?
???
1.2、iSCSI和SMB優(yōu)劣
當(dāng)然在不同的應(yīng)用場景下iscsi和smb都有各自的優(yōu)劣,所以還是需要針對自己實際的使用場景出發(fā),來進(jìn)行選擇。
SMB:可以多設(shè)備掛載分享,同步操作,但安裝應(yīng)用程序打開可能會報錯,在進(jìn)行多設(shè)備文件讀寫操作時選擇這種更好。
iSCSI:可以安裝應(yīng)用程序甚至是系統(tǒng),有更好的讀寫性能,但是多個windows同時掛載可能會導(dǎo)致數(shù)據(jù)錯亂,也無法實時看到文件變化,最好是一個存儲掛載給一個設(shè)備進(jìn)行使用,所以作為程序或游戲庫要更好。
2、本教程目的&申明:
2.1、目的
現(xiàn)在新勢力的成品NAS系統(tǒng)大多原生只支持將存儲通過SMB,webDAV等協(xié)議掛載到其他的設(shè)備,iSCSI協(xié)議目前只有傳統(tǒng)品牌NAS才原生支持,對有這個需要的小伙伴來說多少有點不方便,老K本教程就是通過docker部署tgt來實現(xiàn)啟動iSCSI的服務(wù)端,讓原生不支持iSCSI協(xié)議掛載的NAS可以將存儲通過這個協(xié)議掛載到其他設(shè)備。
2.2、申明
本教程適配綠聯(lián)私有云新老系統(tǒng),極空間等支持docker的機(jī)器,操作有一定風(fēng)險,需要理解透徹后再進(jìn)行操作,配合視頻教程觀看效果更佳。
另外此項目老K基于fujita/tgt和wtnb75/docker-stgt的基礎(chǔ)進(jìn)行整和修改,如需轉(zhuǎn)載請將以上兩個項目一起帶上。
tgt項目地址:https://github.com/fujita/tgt
stgt項目地址:https://github.com/wtnb75/docker-stgt
老K修改后的項目地址:https://github.com/bilibili-koryking/iscsi-docker
3、部署前準(zhǔn)備:
3.1、進(jìn)入SSH root用戶下
依然是按照我之前的教程,進(jìn)入ssh 的root用戶下。
iSCSI可以掛載我們的物理硬盤分區(qū),也可以掛載虛擬硬盤文件,掛載物理硬盤讀寫效率更好,但需要是未使用狀態(tài)的盤(類似于虛擬機(jī)硬盤直通),虛擬磁盤文件方式掛載則更加方便,直接在NAS中創(chuàng)建或使用已有的虛擬磁盤文件就行了。
?
?
3.2、物理掛載準(zhǔn)備
3.2.1、檢查磁盤狀態(tài)
如上所說必須要是當(dāng)前未使用狀態(tài)的盤,因為初次掛載到pc會對其進(jìn)行格式化,已使用的盤直接進(jìn)行物理掛載會在重啟NAS后app端顯示存儲池?fù)p毀。
PS:如果后面跟著操作的時候不小心掛載錯了,不要重啟,不要重啟,不要重啟,馬上備份數(shù)據(jù),還有得救。
?
?
所有盤都已使用,可以備份數(shù)據(jù)后刪除存儲池,或者重置存儲,回到未使用狀態(tài),要不然就直接查看后面3.3虛擬磁盤文件掛載的章節(jié)。
?
?
3.2.2、找到未使用狀態(tài)盤的設(shè)備名稱
ssh中輸入lsblk查看,下圖sdb分了兩個區(qū),我們先找到他的大存儲分區(qū)(看SIZE列的大?。?,比如這里就是sdb2,這個大分區(qū)沒有創(chuàng)建子分區(qū)(看樹結(jié)構(gòu)有沒有下層分區(qū))且后面沒有創(chuàng)建掛載點(看MOUNTPOINTS列有沒有掛載路徑),則sdb就是未被使用的硬盤設(shè)備,其他sda,nvme0n1的大分區(qū)都創(chuàng)建了一個或多個掛載點,這種就是已經(jīng)創(chuàng)建了存儲池的盤,至于nvme1n1(6800以上使用m2做系統(tǒng)盤的機(jī)型,名稱可能會根據(jù)你插入m2的數(shù)量變化)或者mmcblk0(老綠聯(lián)云,極空間,4800等使用emmc的機(jī)型)這種創(chuàng)建了p1,p2,p3,p4...的,這個是系統(tǒng)盤,千萬,千萬,千萬不要動。
?
?
3.2.3、磁盤分區(qū)
我這里未使用的盤是sdb,則對應(yīng)的設(shè)備路徑就是/dev/sdb,執(zhí)行fdisk /dev/sdb,各位小伙伴則用自己找到的盤名替換這里的sdb。
PS:如果準(zhǔn)備整盤掛載,那就無需進(jìn)行磁盤分區(qū),直接記住/dev/sd(a,b,c...替換成你自己未使用盤的設(shè)備名)就行了。
fdisk /dev/sdb
?
?
因為sdb2已經(jīng)占用了所有的空間,我們需要先將sdb2分區(qū)的空間釋放出來,執(zhí)行完fdisk /dev/sdb后,我們會進(jìn)入fdisk工具中,先輸入d(表示我們要刪除分區(qū)),在輸入2(表示刪除第2個分區(qū),也就是sdb2),再輸入w(保存操作并推出fdisk工具,如果上面步驟有輸入錯了的,這里輸入q,表示直接退出,不保存操作)。
?
?
執(zhí)行l(wèi)sblk看下,sdb下,只剩下一個分區(qū)了,這個分區(qū)是磁盤系統(tǒng)分區(qū),可以按照上面的操作給刪掉也可以不管他,反正15g也無所謂。
?
?
繼續(xù)執(zhí)行fdisk /dev/sdb,進(jìn)入fdisk工具,先輸入n(表示創(chuàng)建分區(qū)),再輸入2(表示創(chuàng)建一個新的第2分區(qū)也就是sdb2,如果之前刪掉了sdb1,則這里輸入1),下面輸入的32000000(表示這個分區(qū)的起始塊序號,可以不輸入直接回車或者使把提示的默認(rèn)塊序號復(fù)制粘貼進(jìn)去),21251757055(表示結(jié)束的塊序號,一個塊512個字節(jié)大小,根據(jù)自己想要分區(qū)的空間大小,自己算下應(yīng)該是多少),如果有紅字提示什么簽名,直接輸入y確認(rèn)。繼續(xù)n創(chuàng)建分區(qū),直到分完所有塊,輸入w保存并退出fdisk工具。
?
?
再次執(zhí)行l(wèi)sblk,可以看到已經(jīng)多了兩個分區(qū)了,將準(zhǔn)備掛載的分區(qū)名稱都記下(比如這里就是/dev/sdb2,/dev/sdb3),到這一步物理磁盤掛載準(zhǔn)備就做完了,如果無需虛擬磁盤掛載則直接跳轉(zhuǎn)到第4章節(jié)查看部署步驟,如果也需要虛擬磁盤掛載那就繼續(xù)按順序查看。
?
?
3.3、虛擬磁盤掛載準(zhǔn)備
3.3.1、確定虛擬磁盤文件存放目錄
虛擬磁盤掛載則和物理磁盤掛載相反,需要盤在系統(tǒng)中已經(jīng)使用,我們先在app中對應(yīng)盤中創(chuàng)建一個目錄,用以放虛擬磁盤文件,綠聯(lián)云新系統(tǒng)直接在目錄上右鍵屬性,點擊位置后的復(fù)制即可獲取到絕對路徑。
?
?
極空間和綠聯(lián)云老系統(tǒng)則需要創(chuàng)建后到ssh中執(zhí)行以下命令查找絕對路徑。
> find /mnt -type d -iname "virtual_disk" #綠聯(lián)云老系統(tǒng)執(zhí)行這個
> find /tmp -type d -iname "virtual_disk" #極空間執(zhí)行這個 ?
再執(zhí)行cd 找到的絕對路徑,進(jìn)入對應(yīng)的目錄下,比如綠聯(lián)云老系統(tǒng)就是如下命令。
cd /mnt/dm-0/.ugreen_nas/82095/docker/iscsi-docker/virtual_disk
3.3.2、創(chuàng)建虛擬磁盤文件
到目錄下后,直接執(zhí)行以下命令創(chuàng)建虛擬磁盤文件(綠聯(lián)云老系統(tǒng)無法直接創(chuàng)建,可以去其他虛擬機(jī)軟件里創(chuàng)建后上傳到這個目錄里),文件可以創(chuàng)建多個,也可以在多個目錄創(chuàng)建。
qemu-img create -f raw virtual_disk.img 100G
?
?
執(zhí)行以下命令加個權(quán)限,防止后面docker使用不了。
chmod 777 virtual_disk.img
?
?
4、部署:
4.1、docker compose方式部署
綠聯(lián)云新系統(tǒng)現(xiàn)在內(nèi)置了docker compose(部署了portainer,dockge,1panel的小伙伴也能參考部署),直接打開docker>項目,點擊創(chuàng)建。
?
?
填入一個不沖突的項目名稱,也是docker文件夾下的目錄名稱,將以下compose命令根據(jù)要求修改后填入進(jìn)去,仔細(xì)檢查掛載的目錄和盤,確認(rèn)無誤后再點擊立即部署。
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 #改成自己找到的物理磁盤分區(qū),有多個分區(qū)繼續(xù)添加lundev(x) #- lundev2=/dev/sda4 - lundev3=/virtual_disk/virtual_disk.img #有多個虛擬磁盤,繼續(xù)添加lundev(x),改成映射到容器內(nèi)的虛擬磁盤路徑 #- lundev4=/virtual_disk2/virtua2_disk.img - ip_address=192.168.66.0/24 #改成自己的網(wǎng)段 image: koryking/iscsi-docker #image: docker.1panel.dev/koryking/iscsi-docker #網(wǎng)絡(luò)不好就刪掉這行開頭的#把上一行開頭加個#,失效了就自己再換個源地址 ?
?
部署日志中出現(xiàn)如下內(nèi)容后就表示已經(jīng)部署完成了,點擊完成關(guān)閉彈框。
?
?
4.2、docker run方式部署
直接在ssh的root用戶下執(zhí)行以下命令,需要改動的地方,參考上面綠聯(lián)云新系統(tǒng)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
出現(xiàn)類似下圖樣式就表示部署成功了。
?
?
5、掛載到電腦:
電腦上直接win+r打開運行,輸入iscsicpl,點擊確定,第一次打開會有個彈框直接確定。
?
?
目標(biāo)中填入nasip,點擊快速連接,彈框中確認(rèn)下是否和自己的targetname一致,狀態(tài)是不是已連接,點擊完成關(guān)閉彈框。
?
?
再次win+r,輸入compmgmt.msc確認(rèn),進(jìn)入計算機(jī)管理頁面,點到磁盤管理,初次掛載會彈框發(fā)現(xiàn)了新的磁盤,點擊確定(物理磁盤掛載的情況,點擊確定前,請務(wù)必再次對比下自己的容器配置和lsblk中的信息,檢查下是不是掛載對了)。
?
?
找到未分配空間的盤,右鍵,新建簡單卷。
?
?
根據(jù)提示一路下一步就可以創(chuàng)建成本地磁盤了。
?
?
先別急著結(jié)束,一定要記得再回到iSCSI發(fā)起程序中,選擇卷和設(shè)備頁簽,點擊自動配置,再點擊確定,將盤符給固定一下,不然后續(xù)如果重啟機(jī)器或者添加空間,可能會出現(xiàn)沖突導(dǎo)致掛載失敗的問題。
?
?
6、擴(kuò)展操作:
如果你懂tgt的使用,或者有更多的需求,仍然可以進(jìn)入到iscsi-docker容器終端中,使用tgt的命令進(jìn)行更多配置。
比如如下命令就是查看當(dāng)前target配置情況(掛載遇到問題可以到這里查看下lun信息對不對,再對比下lsblk的信息并修改容器創(chuàng)建的命令)。
tgtadm --mode target --op show
?
?
其他一些命令(更多用法可以到tgt的倉庫中查看tgt文檔),這里就不再贅述了:
#創(chuàng)建target tgtadm --mode target --op new --tid 1 --targetname koryking #創(chuàng)建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的答案自然是全部都需要,根據(jù)不同的應(yīng)用場景選擇不同的協(xié)議,也希望各大新勢力官方能盡快更新支持iSCSI協(xié)議,畢竟docker方式掛載還是有一點麻煩且有一定局限性的。
最后,大家覺得有用的話,記得點個關(guān)注點個贊,我們下期再見。
作者聲明本文無利益相關(guān),歡迎值友理性交流,和諧討論~
,