Cách cấu hình iSCSI Target và Initiator trong Linux

Tác giả sysadmin, T.M.Hai 30, 2022, 08:41:35 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách cấu hình iSCSI Target và Initiator trong Linux


Với mục tiêu iSCSI, chúng tôi có thể cung cấp quyền truy cập vào bộ lưu trữ đĩa trên máy chủ qua mạng cho bộ khởi tạo iSCSI của máy khách. Sau đó, bộ khởi tạo iSCSI sẽ có thể sử dụng bộ lưu trữ từ máy chủ đích iSCSI như thể nó là một đĩa cục bộ.

Ở đây chúng tôi đề cập đến cách bạn có thể thiết lập cả mục tiêu iSCSI và bộ khởi tạo iSCSI trong Linux và kết nối chúng lại với nhau.

1. Môi trường ví dụ

Trong ví dụ này, chúng tôi sẽ làm việc với hai máy chủ Linux khác nhau, cả hai đều đang chạy CentOS 7.

  • Máy khách: 192.168.1.100: Hệ thống Linux này đóng vai trò là bộ khởi tạo iSCSI, nó sẽ kết nối với mục tiêu iSCSI trên máy chủ qua mạng.
  • Máy chủ: 192.168.1.200: Hệ thống Linux này đóng vai trò là máy chủ mục tiêu iSCSI, nó cung cấp không gian đĩa mà máy khách có thể truy cập qua mạng.

2. Định cấu hình mục tiêu iSCSI

Trước tiên, chúng ta sẽ bắt đầu bằng cách định cấu hình mục tiêu iSCSI trên máy chủ của chúng ta, máy chủ này sẽ cung cấp dung lượng ổ đĩa của nó qua mạng cho máy khách của chúng ta, là thiết bị khởi tạo iSCSI.

Chúng tôi muốn cài đặt gói 'targetcli' trên máy chủ, gói này cung cấp trình bao để xem và sửa đổi cấu hình đích để chúng tôi có thể xuất tài nguyên lưu trữ cục bộ như tệp, ổ đĩa hoặc đĩa RAM sang hệ thống bên ngoài. Bố cục dựa trên cây và điều hướng hoạt động theo cách tương tự như di chuyển qua hệ thống tệp với các lệnh như 'cd' và 'ls' có sẵn.

Mã nguồn [Chọn]
yum install targetcli -y
Sau khi cài đặt, chúng tôi muốn khởi động dịch vụ đích và kích hoạt nó để nó tự động khởi động khi khởi động hệ thống.

Mã nguồn [Chọn]
systemctl start target
systemctl enable target

Để biết thêm thông tin về quản lý dịch vụ cơ bản với systemctl, hãy xem hướng dẫn của chúng tôi tại đây.

Bây giờ chúng ta có thể chạy lệnh targetcli, theo sau là ls từ bên trong dấu nhắc targetcli để biết những gì có sẵn.

Mã nguồn [Chọn]
[root@server ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb41
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- /.................................... [...]
  o- backstores......................... [...]
  | o- block............. [Storage Objects: 0]
  | o- fileio............ [Storage Objects: 0]
  | o- pscsi............. [Storage Objects: 0]
  | o- ramdisk........... [Storage Objects: 0]
  o- iscsi....................... [Targets: 0]
  o- loopback.................... [Targets: 0]

Lệnh targetcli cung cấp hoàn thành tab, vì vậy nếu bạn gặp khó khăn, chỉ cần nhấn tab một vài lần để xem các tùy chọn khả dụng. Những thứ này sẽ thay đổi tùy thuộc vào cấp độ của hệ thống phân cấp mà bạn đang ở và giống như hệ thống tệp, bạn luôn có thể truy cập bằng 'cd..'.

2.1. Tạo Backstore

Điều đầu tiên được liệt kê là các backstore. Backstores cung cấp các cách khác nhau để lưu trữ dữ liệu cục bộ sẽ được xuất sang hệ thống bên ngoài. Các tùy chọn khả dụng là block, fileio, pscsi và ramdisk. Trong ví dụ của chúng tôi, chúng tôi sẽ trình bày cả tùy chọn khối và tệp vì chúng khá phổ biến.

Kho lưu trữ khối đơn giản là một thiết bị khối Linux, chẳng hạn như ổ cứng như /dev/sdc.

Kho lưu trữ fileio là một tệp trên hệ thống tệp đã được tạo với kích thước được xác định trước, nhìn chung hiệu suất của một tệp không tốt bằng kho lưu trữ khối.

Để tạo một kho lưu trữ, hãy nhập lệnh backstores, sau đó nhập loại mà bạn muốn tạo, chẳng hạn như fileio. Nếu bạn gặp khó khăn, hãy hoàn thành tab. Ở đây chúng ta đang tạo backstore fileio testfile, điều này sẽ tạo một tệp /tmp/fileio 500MB trên đĩa, trong đó write_back=false nói đơn giản là không sử dụng bất kỳ bộ nhớ đệm nào sẽ làm giảm hiệu suất nhưng sẽ giảm khả năng mất dữ liệu – một lựa chọn tốt hơn trong quá trình sản xuất môi trường.

Mã nguồn [Chọn]
/> backstores/fileio create testfile /tmp/fileio 500M write_back=false
Created fileio testfile with size 524288000

Nếu bạn đang sử dụng thiết bị khối chứ không phải tệp, lệnh sẽ giống như thế này. Trong ví dụ này, chúng tôi đang sử dụng đĩa /dev/sdc làm kho lưu trữ của chúng tôi.

Mã nguồn [Chọn]
/> backstores/block create name=block dev=/dev/sdc
Created block storage object block using /dev/sdc.

Sau khi hoàn tất, nếu bạn phát lại lệnh 'ls' và các cửa hàng dự phòng sẽ được liệt kê.

Mã nguồn [Chọn]
/> ls
o- /...................................................... [...]
  o- backstores........................................... [...]
  | o- block............................... [Storage Objects: 1]
  | | o- block....... [/dev/sdc (1.0GiB) write-thru deactivated]
  | o- fileio.............................. [Storage Objects: 1]
  | | o- testfile.. [/tmp/fileio (500.0MiB) write-thru deactivated]
  | o- pscsi............................... [Storage Objects: 0]
  | o- ramdisk............................. [Storage Objects: 0]
  o- iscsi......................................... [Targets: 0]
  o- loopback...................................... [Targets: 0]

2.2. Tạo iSCSI Target và Portal

Tiếp theo, chúng tôi muốn tự tạo mục tiêu iSCSI thực tế, bắt đầu bằng cách di chuyển vào đường dẫn iSCSI như hình bên dưới. Bạn không cần thêm lệnh 'cd' để truy cập nó, tuy nhiên, lệnh đó cũng hoạt động tốt.

Mã nguồn [Chọn]
/> iscsi/
Khi ở đây, chúng ta có thể tạo mục tiêu iSCSI với một IQN cụ thể (iqn.2016-01.com.example) và tên mục tiêu iSCSI (mục tiêu).

Mã nguồn [Chọn]
/iscsi> create iqn.2016-01.com.example:target
Created target iqn.2016-01.com.example:target.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

Ngoài ra, bạn chỉ có thể tự nhập 'tạo' và nó sẽ tự động sử dụng IQN và tên mục tiêu mặc định, bạn không phải chọn những thứ này theo cách thủ công tuy nhiên tùy chọn này rất hay.

Bây giờ nếu chúng ta chạy lại 'ls', chúng ta sẽ thấy mục tiêu iSCSI được liệt kê.

Mã nguồn [Chọn]
/iscsi> ls
o- iscsi............................. [Targets: 1]
  o- iqn.2016-01.com.example:target..... [TPGs: 1]
    o- tpg1................ [no-gen-acls, no-auth]
      o- acls........................... [ACLs: 0]
      o- luns........................... [LUNs: 0]
      o- portals..................... [Portals: 1]
        o- 0.0.0.0:3260...................... [OK]

Như chúng ta có thể thấy ở đây, một cổng thông tin đã được tạo. Kể từ RHEL 7.1, sau khi mục tiêu đã được đặt, một cổng thông tin mặc định cũng sẽ được định cấu hình, cổng này sẽ lắng nghe trên cổng TCP 3260 trên 0.0.0.0.

2.3. Tạo LUN

Tiếp theo, chúng tôi muốn tạo một LUN với backstore đã xác định trước đó.

Trước tiên, hãy di chuyển vào nhóm cổng mục tiêu (TPG) vừa được tạo.

Mã nguồn [Chọn]
/iscsi> iqn.2016-01.com.example:target/tpg1/
Sau đó, chúng ta có thể tạo LUN, chỉ định bất kỳ backstore nào mà chúng ta đã tạo trước đó. Theo mặc định, một LUN được tạo theo cách này sẽ được áp dụng quyền đọc-ghi. Ở đây chúng ta tạo một LUN cho cả fileio và block backstore.

Mã nguồn [Chọn]
/iscsi/iqn.20...e:target/tpg1> luns/ create /backstores/fileio/testfile
Created LUN 0.

/iscsi/iqn.20...e:target/tpg1> luns/ create /backstores/block/block
Created LUN 1.

Bây giờ nếu chúng ta thực thi 'ls', chúng ta sẽ thấy cả hai LUN của chúng ta hiện diện.

Mã nguồn [Chọn]
/iscsi/iqn.20...e:target/tpg1> ls
o- tpg1.................... [no-gen-acls, no-auth]
  o- acls............................... [ACLs: 0]
  o- luns............................... [LUNs: 2]
  | o- lun0....... [fileio/testfile (/tmp/fileio)]
  | o- lun1.............. [block/block (/dev/sdc)]
  o- portals......................... [Portals: 1]
    o- 0.0.0.0:3260.......................... [OK]

2.4. Tạo ACL

Bây giờ chúng ta cần định cấu hình danh sách kiểm soát truy cập (ACL) để xác định các bộ khởi tạo thực sự được phép kết nối với mục tiêu iSCSI.

Để thực hiện việc này, hãy truy cập hệ thống máy khách sẽ là trình khởi tạo iSCSI của chúng tôi và lấy nội dung của tệp /etc/iscsi/initiatorname.iscsi – bạn có thể chỉnh sửa tệp này nếu muốn, nếu không thì để mặc định cũng được. Điều này sẽ hoạt động miễn là những gì chúng tôi định cấu hình trong ACL của mình trên máy chủ đích iSCSI giống với nội dung của tệp này trên máy khách khởi tạo iSCSI.

Mã nguồn [Chọn]
[root@client ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:5bf95f78165

Bây giờ, chúng tôi đã có tên của người khởi tạo từ hệ thống máy khách, chúng tôi nhập phần ACL trên máy chủ trong TPG.

Mã nguồn [Chọn]
/iscsi/iqn.20...e:target/tpg1> acls/
Bây giờ hãy tạo ACL bằng cách chỉ định tên bộ khởi tạo được tìm thấy trên hệ thống máy khách.

Mã nguồn [Chọn]
/iscsi/iqn.20...get/tpg1/acls> create iqn.1994-05.com.redhat:5bf95f78165
Created Node ACL for iqn.1994-05.com.redhat:5bf95f78165
Created mapped LUN 1.
Created mapped LUN 0.

Lưu ý rằng tất cả các LUN đã được tạo trong mục tiêu iSCSI này sẽ tự động được ánh xạ tới ACL.

Mã nguồn [Chọn]
/iscsi/iqn.20...get/tpg1/acls> ls
o- acls........................................ [ACLs: 1]
  o- iqn.1994-05.com.redhat:5bf95f78165..[Mapped LUNs: 2]
    o- mapped_lun0.............. [lun0 fileio/file1 (rw)]
    o- mapped_lun1............... [lun1 block/block (rw)]

Đó là tất cả cấu hình cần thiết, chúng ta có thể sử dụng 'cd' để đi tới thư mục gốc của mục tiêu iSCSI và sau đó sử dụng 'ls' để xem tất cả cấu hình.

Mã nguồn [Chọn]
/iscsi/iqn.20...get/tpg1/acls> cd../..

/iscsi/iqn.20...xample:target> ls
o- iqn.2016-01.com.example:target.......................... [TPGs: 1]
  o- tpg1..................................... [no-gen-acls, no-auth]
    o- acls................................................ [ACLs: 1]
    | o- iqn.1994-05.com.redhat:5bf95f78165......... [Mapped LUNs: 2]
    |   o- mapped_lun0................... [lun0 fileio/testfile (rw)]
    |   o- mapped_lun1....................... [lun1 block/block (rw)]
    o- luns................................................ [LUNs: 2]
    | o- lun0........................ [fileio/testfile (/tmp/fileio)]
    | o- lun1............................... [block/block (/dev/sdc)]
    o- portals.......................................... [Portals: 1]
      o- 0.0.0.0:3260........................................... [OK]

2.5. Lưu thay đổi

Để lưu cấu hình, chỉ cần thoát ra và thao tác này sẽ ghi mọi thứ vào tệp /etc/target/saveconfig.json như hình bên dưới.

Mã nguồn [Chọn]
/iscsi/iqn.20...xample:target> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

2.6. Quy tắc tường lửa iSCSI

Sau khi hoàn tất, máy chủ mục tiêu sẽ lắng nghe trên cổng TCP 3260 như hình bên dưới.

Mã nguồn [Chọn]
[root@server ~]# netstat -antup | grep 3260
tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      -

Bây giờ chúng ta cần cho phép lưu lượng truy cập qua tường lửa trên cổng này.

Mã nguồn [Chọn]
[root@server ~]# firewall-cmd --permanent --add-port=3260/tcp
success
[root@server ~]# firewall-cmd --reload
success

Mục tiêu iSCSI của chúng tôi hiện đã sẵn sàng chấp nhận các kết nối từ bộ khởi tạo iSCSI trên hệ thống máy khách của chúng tôi (iqn.1994-05.com.redhat:5bf95f78165).

3. Định cấu hình iSCSI Initiator

Bây giờ mục tiêu iSCSI đã được định cấu hình và thiết lập, chúng ta có thể tiến hành định cấu hình bộ khởi tạo iSCSI ở phía máy khách để kết nối với mục tiêu iSCSI.

Bộ khởi tạo sẽ cần cài đặt gói iscsi-initiator-utils trước khi kết nối, hãy cài đặt gói này trước như minh họa bên dưới.

Mã nguồn [Chọn]
yum install iscsi-initiator-utils -y
Tiếp theo hãy đảm bảo bắt đầu và kích hoạt cả iscsid và iscsi. Lưu ý rằng bạn có thể sẽ cần phải khởi động lại những thứ này nếu bạn chỉnh sửa IQN của bộ khởi tạo sau này.

Mã nguồn [Chọn]
systemctl enable iscsid iscsi
systemctl start iscsid iscsi

Chúng tôi sẽ kết nối với tên bộ khởi tạo được chỉ định trong tệp /etc/iscsi/initiatorname.iscsi, nếu bạn sửa đổi tên này, bạn cũng sẽ cần cập nhật ACL trên mục tiêu iSCSI vì nó cần phải giống nhau ở cả hai phía.

Tiếp theo, chúng ta có thể thực hiện khám phá đối với địa chỉ IP của máy chủ mục tiêu để xem mục tiêu iSCSI nào đang được cung cấp. Trong trường hợp này 192.168.1.200 là máy chủ mục tiêu iSCSI của chúng tôi.

Mã nguồn [Chọn]
[root@client ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.200
192.168.1.200:3260,1 iqn.2016-01.com.example:target

Từ hệ thống máy khách, chúng ta có thể thấy rằng mục tiêu có sẵn, tiếp theo chúng ta muốn đăng nhập vào nó để sử dụng nó.

Mã nguồn [Chọn]
[root@client ~]# iscsiadm -m node -T iqn.2016-01.com.example:target -l
Logging in to [iface: default, target: iqn.2016-01.com.example:target, portal: 192.168.1.200,3260] (multiple)
Login to [iface: default, target: iqn.2016-01.com.example:target, portal: 192.168.1.200,3260] successful.

Từ ứng dụng khách, chúng tôi có thể xem tất cả các phiên iSCSI đang hoạt động như hình bên dưới.

Mã nguồn [Chọn]
[root@client mnt]# iscsiadm -m session -P 0
tcp: [1] 192.168.1.200:3260,1 iqn.2016-01.com.example:target (non-flash)

Chúng tôi cũng có thể thay đổi -P 0 thành 1,2 hoặc 3 để tăng mức độ thông tin.

Fileio và khối đĩa được chia sẻ từ mục tiêu iSCSI hiện có sẵn cho bộ khởi tạo iSCSI, như minh họa bên dưới. Trong trường hợp này, đĩa cục bộ /dev/sdb là tệp fileio của chúng tôi trên máy chủ đích trong /tmp/fileio, trong khi đĩa cục bộ /dev/sdc là đĩa khối /dev/sdc trên máy chủ đích.

Mã nguồn [Chọn]
[root@client ~]# lsblk --scsi
NAME HCTL       TYPE VENDOR   MODEL             REV  TRAN
sda  2:0:0:0    disk VMware,  VMware Virtual S 1.0   spi
sdb  3:0:0:0    disk LIO-ORG  testfile         4.0   iscsi
sdc  3:0:0:1    disk LIO-ORG  block            4.0   iscsi
sr0  1:0:0:0    rom  NECVMWar VMware IDE CDR10 1.00  ata

Cả hai đĩa này hiện có thể sử dụng được như thể chúng là những đĩa được gắn cục bộ bình thường vào hệ thống máy khách.

Mã nguồn [Chọn]
[root@client ~]# fdisk -l
Disk /dev/sdb: 524 MB, 524288000 bytes, 409600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 8388608 bytes

Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 4194304 bytes

Chúng ta có thể phân vùng hoặc đặt hệ thống tệp vào chúng như thể chúng là đĩa cục bộ.

Mã nguồn [Chọn]
[root@client ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=256    agcount=4, agsize=12800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=51200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@client ~]# mkfs.xfs /dev/sdc
...

Từ đó, chúng tôi có thể gắn chúng ở bất cứ đâu theo yêu cầu, ở đây chúng tôi gắn vào /mnt để thử nghiệm và thấy rằng nó có sẵn để sử dụng.

Mã nguồn [Chọn]
[root@client ~]# mount /dev/sdb /mnt

[root@client ~]# mkdir /mnt2

[root@client ~]# mount /dev/sdc /mnt2

[root@client ~]# df -h | grep mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        497M   11M  486M   6% /mnt
/dev/sdc       1014M   33M  982M   4% /mnt2

Sau đó, chúng tôi có thể thêm chúng vào /etc/fstab để tự động gắn chúng trong khi khởi động hệ thống.

Để đăng xuất khỏi mục tiêu iSCSI, trước tiên hãy ngắt kết nối các ổ đĩa.

Mã nguồn [Chọn]
[root@client /]# umount /mnt
[root@client /]# umount /mnt2

Sau đó thực hiện đăng xuất thực tế, sau đó, chúng tôi xác nhận không có phiên hoạt động nào.

Mã nguồn [Chọn]
[root@client ~]# iscsiadm -m node -u
Logging out of session [sid: 1, target: iqn.2016-01.com.example:target, portal: 192.168.1.200,3260]
Logout of [sid: 1, target: iqn.2016-01.com.example:target, portal: 192.168.1.200,3260] successful.

[root@client ~]# iscsiadm -m session -P 0
iscsiadm: No active sessions.

Tại thời điểm này, nếu chúng tôi khởi động lại hệ thống máy khách, nó sẽ tự động đăng nhập lại vào mục tiêu iSCSI, vì vậy nếu bạn đã thiết lập tự động gắn qua /etc/fstab thì nó sẽ được gắn đúng cách. Sau đó, nếu chúng ta khởi động lại máy chủ đích iSCSI, nó sẽ tự động khởi động dịch vụ đích, làm cho mục tiêu iSCSI khả dụng khi khởi động hệ thống.

4. Mẹo bổ sung

Vâng đó là khá một chút quá nhớ! May mắn thay, hầu hết tất cả các thông tin này đều có sẵn trong các trang hướng dẫn targetcli và iscsiadm, vì vậy hãy ghi nhớ những thông tin này nếu bạn gặp khó khăn.

Mã nguồn [Chọn]
man targetcli
man iscsiadm

Bây giờ chúng tôi đã chỉ cho bạn cách định cấu hình mục tiêu iSCSI đầu tiên trên máy chủ sẽ xuất dung lượng lưu trữ của nó qua mạng, sau đó thiết lập bộ khởi tạo iSCSI trên hệ thống máy khách để kết nối với máy chủ mục tiêu. Sau khi được kết nối, máy khách khởi tạo iSCSI có thể sử dụng các đĩa được xuất trên máy chủ đích iSCSI như thể chúng được gắn cục bộ. Điều này bao gồm thực hiện các hoạt động như phân vùng hoặc tạo hệ thống tệp, sau đó gắn đĩa và truy cập chúng qua mạng để đọc và ghi dữ liệu qua iSCSI.