如何使用在Linux上建構iSCSI的Copy On Write鏡像系統
iSCSI系統是一種SAN(Storage Area Network)的應用,在客戶端應用起來就跟普通的硬碟一般,可開機、可以做任何內接硬碟可以做到的事情。透過iSCSI SAN遠端開機,我們可以很簡單的在伺服器端管理系統,諸如系統還原、備份等等,若您的環境有很多台相同規格或不同規格的機器,透過網路硬碟開機,可以很簡單的管理這些機器。
本文的應用,是在伺服器端使用SSD來建置提供客戶端網路開機的硬碟鏡像,也就是使用一份較大空間的SSD於上面建置供多個不同的硬體開機的系統磁碟,客戶端可透過多種方法來遠端開機,但本文不會提及何種開機方式,只有講到如何使用鏡像系統,網路開機的文件請自行尋找。 為降低SSD磁碟空間的開銷,本文使用磁碟快照的技術來建置多個不同系統的系統磁碟,使用這個方法可以令這些不同磁碟的鏡像使用相同的檔案,藉以節省SSD空間的使用量。
如上圖所示,客戶端的作業系統被安裝在原始鏡像系統,我們再從原始鏡像系統中使用Copy On Write(COW)技術製作衍生快照,客戶端是連接上衍生快照2與衍生快照3來當作系統磁碟開機,這種技術是要覆寫檔案時,才會把更動的部分寫在衍生快照區,當存取未更動的檔案時則使用原始鏡像中的檔案,這種方式可以大大的減低伺服器端的檔案系統開銷。
當然您可以使用標準的Linux作業系統來製作這種系統,為簡化建置,本文使用Synology的系統為範本來建立這樣的應用。先開啟SSH的功能,開啟的方法為:
- 打開控制台。
- 點選「終端機 & SNMP」。
- 啟動SSH功能。
> sudo su
再輸入您登入的這個帳號的密碼,切換到 root 身份。
iSCSI設定
開啟選單 -> iSCSI Manager 點選 LUN 這個頁面,再點選新增。
請注意,這邊我們在 Thin Provisioning 不使用新的功能,它內建的功能沒辦法建立衍生鏡像,所以我們要用SSH自己操作。
這邊我們讓它順便幫我們建立iSCSI target並連結。
這邊直接下一步。
此時我們登入SSH,切換到root帳號後,檢視根目錄
# ls /
bin dev initrd lib64 proc sbin tmpRoot var.defaults
boot etc lib lost+found root sys usr volume1
config etc.defaults lib32 mnt run tmp var
我們看到 volume1這個目錄,這個就是磁碟陣列的掛載點,再看看內部:
# ls /volume1/
@appstore @cloudsync @eaDir @iSCSI @sharesnap @tmp
@cloudstation @database homes @S2S tftp_root
這些 @開頭的都是btrfs的掛載點,其中 iSCSI 這個目錄就是我們要操作的位置,以下的位置皆於此目錄中操作:
# cd /volume1/\@iSCSI/LUN/BLUN_THICK/
# ls
4d02abcf-690a-4e5a-bcfd-abe766a7652f
/volume1/\@iSCSI/LUN/BLUN_THICK/ 就是我們的工作目錄,每當從圖形界面建立一個新的iSCSI LUN時,在這個目錄下就會新增加一個16進制長串文字的目錄,所以這個
4d02abcf-690a-4e5a-bcfd-abe766a7652f目錄就對應到前面於圖形界面中建立的LUN1,看看裡面的檔案:
# ls -l
total 134217728
-rw-r--r-- 1 root root 137438953472 Jan 6 17:37 LUN-1_00000
-rw-r--r-- 1 root root 549755813888 Jan 6 17:37 ROD
裡面只有兩個檔案,LUN-1_0000就是鏡像檔案,這時你可以在客戶端把這個磁碟掛載起來安裝作業系統,所有的操作都會儲存在這個檔案裡面,這邊不對這個部分多描述,我們只簡單的將他掛載起來,放一個檔案進去驗證。
這時我們要在客戶端與伺服器端斷開這個LUN以避免不小心編輯到,請注意,當這個檔案衍生出任何的鏡像以後,這個檔案就不應該被編輯,否則衍生的鏡像會壞掉。
關閉檔案總管視窗,並斷開客戶端的iSCSI連結,在伺服器端的iSCSI Manager中點選LUN頁面點選LUN1->動作 -> 編輯-> 連結 -> 將 Target - 1已連結前面的打勾去掉,這樣整個LUN1就完全從系統中斷開了。
接著我們要從LUN1鏡像出LUN2與LUN3。我們在伺服器端的iSCSI Manager的LUN頁面新建一個LUN2:
但此時先不和iSCSI target連結。
待建立完成後,我們回到終端機SSH上看新建立的LUN2於何處:
# ls /volume1/@iSCSI/LUN/BLUN_THICK
06d72394-fec9-4cf6-8820-5cd16f6aaa7a 4d02abcf-690a-4e5a-bcfd-abe766a7652f
這時我們看到多了一個06d72394-fec9-4cf6-8820-5cd16f6aaa7a的目錄,這個就是新的LUN2所在的位置,檢視目錄內容可以看到一個LUN-2_00000的檔案,這個就是新建的LUN2。
# cd 06d72394-fec9-4cf6-8820-5cd16f6aaa7a
# ls -l
total 134217728
-rw-r--r-- 1 root root 137438953472 Jan 6 20:53 LUN-2_00000
-rw-r--r-- 1 root root 549755813888 Jan 6 20:53 ROD
這時我們要用指令把LUN-1鏡像到這個LUN-2_00000檔案:
# rm LUN-2_00000
# cp --reflink=always ../4d02abcf-690a-4e5a-bcfd-abe766a7652f/LUN-1_00000 LUN-2_00000
上面這兩行指令是把原來的LUN-2_00000刪除,再從LUN-1鏡像到LUN-2來,--reflink=always就是使用Copy On Write(COW)的方式將檔案鏡像過來,在cp指令的說明中有這一段
When --reflink[=always] is specified, perform a lightweight copy, where the data blocks are copied only when modified.
接下來再用相同的方式建立LUN-3,從LUN-1鏡像到LUN-3。
建立完成後,可以用指令察看這些鏡像檔案
# btrfs subvolume list -a /volume1/
ID 257 gen 42503 top level 5 path <FS_TREE>/@syno
ID 259 gen 42480 top level 257 path @syno/@iSCSI
ID 263 gen 42196 top level 257 path @syno/homes
ID 449 gen 42190 top level 257 path @syno/@sharesnap
ID 450 gen 42190 top level 449 path <FS_TREE>/@syno/@sharesnap/homes
ID 451 gen 39813 top level 450 path <FS_TREE>/@syno/@sharesnap/homes/GMT+08-2019.01.01-04.00.29
...
ID 563 gen 42189 top level 450 path <FS_TREE>/@syno/@sharesnap/homes/GMT+08-2019.01.06-04.00.02
ID 564 gen 42455 top level 259 path <FS_TREE>/@syno/@iSCSI/LUN/BLUN_THICK/4d02abcf-690a-4e5a-bcfd-abe766a7652f
ID 574 gen 42494 top level 259 path <FS_TREE>/@syno/@iSCSI/LUN/BLUN_THICK/06d72394-fec9-4cf6-8820-5cd16f6aaa7a
ID 588 gen 42494 top level 259 path <FS_TREE>/@syno/@iSCSI/LUN/BLUN_THICK/de8f1294-ebd3-4715-88a1-931ea32fa36e
其中最後的三個項目就是我們所新建出來的鏡像。
完成後從iSCSI Manager中點選Target -> 新增
建立一個新的 iSCSI Target-2。
此處連結到現有的LUN-2,再用一樣的方法建立新的 iSCSI target-3,連結到LUN-3。
如此我們就有了3個target,如此當你從客戶端連接上Target-2或Target-3時,會發現剛剛複製進Target-1的檔案已經在Target-2的LUN2與Target-3的LUN3中。
要注意,因為這三個LUN其實是來自於同一個LUN-1,若您在同一台客戶端連接了任二個LUN,後面連接的LUN會被屏蔽。
如上圖,磁碟2是連接iSCSI target-2而取得的磁碟,連接後直接掛載上了系統,而磁碟3則是之後連接iSCSI target-3所取得的磁碟,顯示是有問題的離線磁碟,只要客戶端發現到連接的磁碟是來自於同一個鏡像,就會被屏蔽。反之若先連接iSCSI target-3取得磁碟,再連接iSCSI target-2取得第二個磁碟,第二個磁碟一樣會發生相同的狀況。
至此我們已經完成這個教學,我們可以在伺服器端用類似的方法為客戶端快速的建立系統磁碟,若客戶端需要做系統還原,只需從LUN-1中重新鏡像出系統磁碟供客戶端使用,鏡像中還能繼續生出鏡像,多種玩法大家自己去挖掘,祝你們大家好運!
沒有留言:
張貼留言