红联Linux门户
Linux帮助

Linux上每个SCSI设备的最大LUN数目是多少

发布时间:2016-05-17 15:52:38来源:blog.csdn.net/quqi99作者:quqi99

SCSI、Host、Target、LUN等概念

在物理上说是SCSI总线是计算机内部与外设进行通讯的总线,SCSI设备就是采用SCSI总线标准的设备。
SCSI总线上可挂接的设备数量是有限的,一般为6个或15个,使用target ID(也有称为SCSI ID的)来描述这些设备,设备一加入系统,就会有一个target ID。
但设备很多,为了使用和描述更多设备引入了LUN(Logical Unit Number)的概念,故LUN ID不等于某个设备,只是个号码而已。
LUN只是一个虚拟的对象。比如一个阵列柜,Host那边看作是一个target device,那为了某些特殊需要,我们要将磁盘阵列柜的磁盘空间划分成若干个小的单元给主机来用,于是就产生了一些什么逻辑驱动器的说法,也就是比target device级别更低的逻辑对象,我们习惯于把这些更小的磁盘资源称之为LUN0,LUN1,LUN2……什么的。而操作系统的机制使然,操作系统识别的最小存储对象级别就是LUN Device,这是一个逻辑对象,所以很多时候被称之为Logical Device。


为什么每个scsi设备的最大LUN数目是256

最开始采用16位,前8位表示主设备号,后8位表示从设备号,这意味着最多只有256个主设备与256个从设备可用。
后来改用32位表示,在外部提供了一种兼容模式(在内部仍然采用前20位表示从设备号,后12位表示主设备号,内核提供了dev_t相关的函数进行外部表示法与内部表示法之前的转换),前8位表示从设备号,8~19位共12位表示主设备号(如果主设备数少于256时是兼容的),20~31共12位表示剩下的从设备号。


但能不能利用超过255个的LUN呢?理论上可以,实际上困难重重。不过随着技术的发展,采取多SCSI卡,而不是多LUN的方式占了上风。而且多LUN的情况不在SCSI协议标准里,因此导致早期非常多的设备在支持多LUN上非常糟糕,包括像IBM,HP,HITACHI,NEC等国际知名品牌。出现的故障一般是两种:一来是导致SCSI卡被锁定,从而系统处于停滞状态,无法继续后面的操作;第二种是会导致SCSI总线重置(reset),这就会使得inquiry命令重复使用。

Enable more than 1 scsi device per adapter. Support for multiple LUNs per device is standard in Linux 2.6 kernels. Currently, the maximum number of LUNs that can be scanned for each device is 256.


sda和sdb的major number都是8,sda的minor number是0开始, sdb的minor number是16开始(因为每个磁盘最多16个分区)
hua@node1:~$ ls -l /dev/sd*
brw-rw---- 1 root disk 8,  0 Apr 28 15:43 /dev/sda
brw-rw---- 1 root disk 8,  1 Apr 26 16:02 /dev/sda1
brw-rw---- 1 root disk 8, 10 Apr 26 16:02 /dev/sda10
brw-rw---- 1 root disk 8,  2 Apr 26 16:02 /dev/sda2
brw-rw---- 1 root disk 8,  5 Apr 26 16:02 /dev/sda5
brw-rw---- 1 root disk 8,  6 Apr 26 16:02 /dev/sda6
brw-rw---- 1 root disk 8,  7 Apr 26 16:02 /dev/sda7
brw-rw---- 1 root disk 8,  8 Apr 26 16:02 /dev/sda8
brw-rw---- 1 root disk 8,  9 Apr 26 16:02 /dev/sda9
brw-rw---- 1 root disk 8, 16 Apr 28 15:43 /dev/sdb


SCSI的major号是8, 65--71, 136--143。所以Linux系统内可以用的SCSI Disk可以是多少个:(1+(71-65)+(143-136))*16=16*16=256

hua@node1:~$ cat /proc/devices |grep sd
8 sd
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd


vi linux/drivers/scsi/sd.c
/*
* Device no to disk mapping:
*
*       major         disc2     disc  p1
*   |............|.............|....|....| <- dev_t
*    31        20 19          8 7  4 3  0
*
* Inside a major, we have 16k disks, however mapped non-
* contiguously. The first 16 disks are for major0, the next
* ones with major1, ... Disk 256 is for major0 again, disk 272
* for major1, ...
* As we stay compatible with our numbering scheme, we can reuse
* the well-know SCSI majors 8, 65--71, 136--143.
*/
static int sd_major(int major_idx)
{
switch (major_idx) {
case 0:
return SCSI_DISK0_MAJOR;
case 1 ... 7:
return SCSI_DISK1_MAJOR + major_idx - 1;
case 8 ... 15:
return SCSI_DISK8_MAJOR + major_idx - 8;
default:
BUG();
return 0;    /* shut up gcc */
}
}


附录一,一些相关的常用命令

可以使用的scsi设备: sudo lsscsi
可以使用的块设备:sudo fdisk -l
做多路径用到的块设备:sudo multipath -ll


附录二,修改LUN数目

1, Check the current settings for scsi_mod.max_luns with the following command:
cat /sys/module/scsi_mod/parameters/max_luns

2, Create /etc/modprobe.d/lun.conf, please add the folloing line.
NOTE: a plain 'max_lun' is incorrect for any LUN value higher than 255.
options scsi_mod max_luns=1024

3, Build the initail ramdisk to implement the change.
sudo update-initramfs -k all -t -u

4, Reboot the system, and check the settings for scsi_mod.max_luns with the following command:
cat /sys/module/scsi_mod/parameters/max_luns


附录三,OpenStack中如何使用virtio-scsi

IMG=$(nova image-list|grep trusty | awk '{print $2}')
glance image-update --property hw_scsi_model=virtio-scsi --property hw_disk_bus=scsi
nova keypair-add --pub-key ~/.ssh/id_rsa.pub defaultkey
nova boot --key_name defaultkey --image $IMG --flavor 2 newvm
nova volume-create --display-name testvol 10
nova volume-attach $VM $VOLID /dev/hdb 
VOLID=$(nova volume-list |grep testvol | awk '{print $2}')
VM=$(nova list |grep newvm| awk '{print $2}')


本文永久更新地址:http://www.linuxdiyf.com/linux/20730.html