您好,登錄后才能下訂單哦!
tgt服務端流程是怎樣的,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Figure1 tgt流程圖
安裝tgt包:
yum --enablerepo=epel -y install scsi-target-utils
安裝完成后,啟動 TGT 服務:
# service tgtd start
如果想在系統啟動時自動啟動 TGT 服務,可以使用如下命令:
# chkconfig tgtd on
如果想確認 TGT 服務是否啟動,可以用 # servicetgtd status 查看服務狀態;當然,也可以查詢 TGT 服務占用的端口:
# netstat -anlpt | grep 3260
其中,3260 是 TGT 服務的監聽端口。結果如下:
創建Target:
tgtadm --lld iscsi --mode target --op new --tid 2--targetname iqn.2012-12.com.example:server.target
查詢Target:
tgtadm --lld iscsi--mode target --op show
查詢詳細信息:
tgtadm --lld iscsi--mode target --op show --tid 2
創建用作LUN的文件:
ddif=/dev/zero of=/home/lun.bin count=0 obs=1 seek=1G
添加LUN:(需要關閉SELinux,否則報錯invalid)
tgtadm --lld iscsi--mode logicalunit --op new --tid 2 --lun 1 --backing-store /home/lun.bin
修改配置文件需要重啟機器:
修改/etc/selinux/config 文件
將SELINUX=enforcing改為SELINUX=disabled
重啟機器即可
設置訪問權限all:(服務端權限要設到具體IP,否則客戶端discover失敗)
tgtadm --lldiscsi --mode target --op bind --tid 2 -I all
tgtadm --lld iscsi--mode target --op bind --tid 2 -I 192.168.56.103
iscsi initiator 連接(需要關閉服務端防火墻)
systemctl stop firewalld.service
systemctl disable firewalld.service
iscsiadm -m discovery -t sendtargets -p 192.168.56.102
登錄:
iscsiadm -m node --login
#登錄某一個
#iscsiadm --mode node --targetname iqn.2012-10.net.cpd:san.target01 --portal 172.16.201.200 --login
查看核對登錄信息
iscsiadm -m session -o show
登陸后,fdisk -l 能看到iscsi掛載的服務端設備,然后可以當做正常磁盤設備一樣使用。
配置tgt編譯環境:
去掉doc相關編譯,網絡連接問題會卡住,
find -name Makefile | xargs grep O2 -R--colour
make DEBUG=yes
make install
然后就可以gdb調試了~
tgt流程分析:
http://www.sysnote.org/2014/08/23/tgt-arch/
/usr/sbin/tgtd -f
tgt鎖:
/var/run/tgtd/socket.0.lock
清理鎖:
rm -f /var/run/tgtd/*
殺掉tgtd進程:
kill -9 pid
帶debug信息調試:
gdb -args /usr/sbin/tgtd -f -d 1
執行:
tgtadm --lld iscsi --mode target --op new --tid 2--targetname iqn.2012-12.com.example:server.target
觸發:
mgmt_event_handler
main ->ipc_init -> tgt_event_add (mgmt_event_handler )
通過socket來觸發事件:/var/run/tgtd/socket.0
tgtadm 的ipc_mgmt_connect觸發了tgtd的事件mgmt_event_handler
main -> ipc_mgmt_req -> ipc_mgmt_connect
ipc_mgmt_req -> ipc_mgmt_rsp -> ipc_mgmt_connect
用來連接進程。
多次觸發:
mtask_recv_send_handler 來進行進程間通信。
mtask_recv_send_handler ->mtask_received->mtask_execute ->target_mgmt ->tgt_target_create->tgt_device_create
backing 為 0,不會啟動bs工作線程
用來進行具體操作。
執行:
tgtadm --lld iscsi --mode logicalunit --op new --tid 2--lun 1 --backing-store /home/lun.bin
觸發:
mgmt_event_handler(添加了管理事件處理)
mtask_recv_send_handler ->mtask_received->mtask_execute -> device_mgmt -> tgt_device_create ->bs_rdwr_init ->bs_thread_open->bs_thread_worker_fn
在執行new 后端時,會調用 bs_rdwr_init從而開啟bs_thread_worker_fn.
創建設備時,創建了16個bs工作線程。
3260是監聽端口
getaddrinfo 來獲取socketaddr結構鏈表
https://baike.baidu.com/item/getaddrinfo/9021771
main ->bs_init ->bs_init_signalfd (bs_sig_request_done)
信號量對應的處理函數是bs_sig_request_done。
初始化后scsi_cmd_perform中才能根據操作碼op來找到對應的操作cmd_perform。
bs_thread_worker_fn 中的 info 和 bs_thread_cmd_submit 中的 info 是指向同一塊內存x單元(gdb證實)
bs_thread_worker_fn 中從info->pending_list上取下cmd
bs_rdwr_request從設備句柄fd里讀出信息到scsi的buffer中,這個函數應該是底層塊設備的具體操作了。
iscsi_tx_handler ->iscsi_task_tx_start-> iscsi_data_rsp_build 將讀取的數據存在conn->rsp.data中
以上基本上就是一個完整的服務端讀操作,響應給客戶端的流程細節。
服務端上數據的讀或寫是由客戶端控制的req->cdb傳值給cmd->scb
bs_rdwr_request 中根據cmd->scb[0]來對塊設備進行操作。
關于tgt服務端流程是怎樣的問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。