Linux最多支援的SCSI Disk的數目

來源:互聯網
上載者:User

關於題目:
想這個標題我想了很久?想了如下幾個標題,
A:Linux最多支援的SCSI LUN是多少個?
B:Linux最多支援的SAN儲存盤的個數是多少?
當我在查證了N圈之後,決定用現在這個標題。至於為什麼稍後再給出答案。

實際情況:
事情本來很簡單,那天客戶打電話說擴容LVM。當時想了一下環境,無非就是儲存划過來的盤,通過兩個HBA卡,採用了SuSE內建的多重路徑軟體Multipath-tools實現的。過程無非不就是控制一下HA的環境,然後設PV,加到VG,然後擴LV。再次跟客戶確認了一下,客戶強調這次用了兩台儲存劃盤過來。打電話問老大,兩個儲存是否會有影響,老大說不會。於是回答客戶OK,沒有問題。周五過去討論一下細節。當時就擴容的大小溝通了一下,擴到2.5T,當前只有400G左右。儲存劃的單個盤只有15G大小。想想無非就是劃的盤多點。然後回去查查資料確認一下,到底支援多少個裝置。當時沒有做數學題,換算一下到底是多少個盤,這真是一個非常大的失敗,而這也最終成為這次事件的起點。雖然沒有具體換算有多少個,但是我心裡清楚,必須要確定系統內到底支援多少個划過來的SCSI Luns.於是帶著這個問題就開始了查詢工作。

關於引用連結、事件程序:
[寫在前面的KOOK名言:無論一個連結有多麼官方,也不要輕易相信。這是我失敗的教訓。如果你問我應該相信什麼,去看源碼吧!]
為了確認Linux到底支援多少個存放裝置,我開始我的google曆程。以關鍵字"linux maximum scsi disk luns multiple scsi_mod sd_mod"等關鍵字多次配比。依次發現下面的連結。 

第I階段:出錯階段 (關鍵字: linux support maximum luns)
A:http://kbase.redhat.com/faq/docs/DOC-3293
看了一下文章,無非就是修改模組scsi_mod,加入max_luns=512,然後重做引導的initrd鏡像,將模組參數變化加入到initrd裡面。這肯定沒有什麼問題啊。可以搞定。

B:http://download.qlogic.com/sf/62552/ibm_dd_ds4kfc1_8.01.06_linux2.6_anycpu.txt
看了一下,找到讓我眼睛一亮的一段。
7.1 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.

C:源碼檔案/usr/src/linux/drivers/scsi/scsi_scan.c
#define MAX_SCSI_LUNS   512

看到上面的引用連結後,我的感覺是,這豈不是完全沒有問題。我帶著這樣的結論就去客戶那裡擴容了,4組HA的環境,分別擴容。先幹掉了那個容量最大的那一組。擴容的時候是系統lsscsi認到330個盤,multipath處理後的盤165個,當時做起來還算順利,就是發現系統重新啟動時間過長。在開機自我測試 (POST)的時候在devices-mapper那裡停留過久、大概要10分鐘。整個開機時間大概要不到30分鐘。當時粗粗算了一下。系統太久沒有重啟,檔案系統超期做了自檢。所以加上這個也沒太以為意。事實上,系統已經給了我警告。後面的三組,盤數較少沒有超過100的,輕車熟路,非常快的就做完了。早晨6點出門,到客戶那裡8點開始,做到下午1點多,收了擴容後主機狀態的support的日誌,收其中最多Lun那組其中一台主機的時候,由於Bastion Host逾時,指令碼中斷,結果竟然造成主機失去響應,HA控制其自動重啟。重啟後系統正常,檢查運行狀態正常。回家已經4點多了。

晚間10點接到客戶電話,系統異常,部分應用提示部分檔案發送不完整。從客戶的描述上看,應該是IO異常,造成資料檔案不完整。趕緊開啟日誌查看。我靠,真的不正常。lsscsi的輸出為330個sd*檔案,但是fdisk -l的輸出只有256個磁碟裝置。再看多重路徑multipath的底層裝置,有的兩條路徑正常,有的只有一條路徑。統計加和256。崩潰。到了現場做如下嘗試:

A:grub增加核心引導參數
max_scsi_luns = 512
結果:重啟系統,問題依舊

B:修改scsi_mod的參數,max_luns=512

具體步驟如下:
1:修改/etc/modprobe.conf.local ,新增
options scsi_mod max_luns=512 
2:建立鏡像
/sbin/mk_initrd
3:檢查鏡像,將鏡像解壓後,檢查後如下輸出。
grep scsi_mod linuxrc 

echo "Loading kernel/drivers/scsi/scsi_mod.ko $extra_scsi_params max_luns=512"
insmod /lib/modules/2.6.5-7.315-bigsmp/kernel/drivers/scsi/scsi_mod.ko $extra_scsi_params max_luns=512

結果:重啟系統,問題依舊

客戶不能再等了,一會天亮了,就該處理業務了,3點多,決定將擴容容量降低,降到系統可認到的256個以下。於是將備份檔案,刪除LV,VG,PV,重啟系統。儲存重新劃盤。重建LVM,還原檔案。中間還穿插了VG重建出錯、一次網卡載入順序變化,網路不通的插曲。真是應了那句禍不單行啊。還好,天亮之前,系統復原了。在客戶的賓館睡到下午,系統運行正常。於是打車回家。

事實上事情還沒有結束,當我晚上11點準備再睡覺的時候,客戶的電話再次響起。當時的一個感覺就是崩潰啊!這後來的事情就不寫到這個裡面了。回頭我再寫一篇日誌寫後面的事情。

第II階段:分析階段 (關鍵字: linux scsi_mod sd_mod devices scsi disk maximum)
當我靜下來仔細看日誌的時候,仔細查看系統檔案,一點一點的雲霧漸漸撥開,但是有些地方還是不明白。
1:系統可以看到330個盤
A:lsscsi可以看到330個sd*裝置
B:cat /proc/partition內的sd*裝置為330個
C:cat /proc/scsi/qla2xxx/0、1 裡面檢測到裝置分別為165個

2 系統可以用的裝置為256個
A:fdisk -l 輸出可以使用的塊裝置為 256
B:lsmod顯示sd_mod 被使用為256
C:multipath -ll的輸出中,真正用到的塊裝置為256。

進入為什麼階段?
1:lsscsi為什麼可以識別?
http://sg.danny.cz/scsi/lsscsi.html
2:為什麼lsmod裡面sd_mod只有256個。

下面看一下為什麼是這樣的,SCSI這個東東回到本質上來,在物理上說是SCSI匯流排是電腦內部與外設進行通訊的匯流排,SCSI裝置就是採用SCSI匯流排標準的裝置。既然到了,這裡那Linux裡面關於這個最底層的支援是哪個東東?來查看一下。最基礎的模組就是scsi_mod,什麼意思?所有符合SCSI匯流排裝置都需要調用這個模組。至於依賴他的模組有哪些,可以看看,cciss是HP硬碟的、st是scsi tape的,qla2xxx是qlogic hba卡的,sd_mod則是我們看到的scsi disk裝置sd*了。

[root@server /]# lsmod
Module                  Size  Used by
sg                     54176  0 
st                     57500  0 
sr_mod                 33316  0 
cdrom                  55196  2 sr_mod,ide_cd
dm_round_robin         19968  1 
dm_multipath           37512  2 dm_round_robin
dm_mod                 73600  46 dm_multipath
qla2300               141056  0 
qla2xxx               365496  169 qla2300
firmware_class         25984  1 qla2xxx
scsi_transport_fc      23296  1 qla2xxx
cciss                  73796  7 
sd_mod                 37888  256 
scsi_mod              134852  8 osst,sg,st,sr_mod,qla2xxx,scsi_transport_fc,cciss,sd_mod 

# /sbin/modinfo scsi_mod
parm:           scsi_logging_level:a bit mask of logging levels (int)
license:        GPL
description:    SCSI core
parm:           inq_timeout:Timeout (in seconds) waiting for devices to answer INQUIRY. Default is 5. Some non-compliant devices need more. (int)
parm:           max_report_luns:REPORT LUNS maximum number of LUNS received (should be between 1 and 16384) (int)
parm:           max_luns:last scsi LUN (should be between 1 and 2^32-1) (int)
parm:           default_dev_flags:scsi default device flag integer value (int)
parm:           dev_flags:Given scsi_dev_flags=vendor:model:flags[,v:m:f] add black/white list entries for vendor and model with an integer value of flags to the scsi device info list (string)
depends:        
supported:      yes
vermagic:       2.6.5-7.246-bigsmp SMP PENTIUMII REGPARM gcc-3.3 

# /sbin/modinfo sd_mod
description:    SCSI disk (sd) driver
author:         Eric Youngdale
license:        GPL
depends:        scsi_mod
supported:      yes
vermagic:       2.6.5-7.246-bigsmp SMP PENTIUMII REGPARM gcc-3.3 

通過上面的說明看出一些端倪沒有?scsi_mod模組支援了所有硬體上支援scsi匯流排的裝置,是最底層的驅動,而我們想知道Linux支援最多的scsi disk的數目的sd_mod模組這個裡面竟然不帶參數。我靠!最後一招去看源碼吧。

查看sd_mod這個模組的源碼檔案:/usr/src/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 */
    }
}
找到這裡,終於知道為什麼只有256個檔案可以用了。查看核心文檔/usr/src/linux/Documentation/devices.txt,找到了major為8,65-71,136-143的定義部分,保留給scsi disk的。

 

再查看一下記憶體裡面的輸出()。關於檔案/proc/devices的bolock部分。
Block devices:
  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
自己查一下是不是16個major,這意味著什嗎?看看/usr/src/linux/Documentation/devices.txt裡面的定義。major為8,65-71,136-143(共16個),而minor可以用到256個。而分區限制在16以內,其實就是15個分區。

下面就是結論了:Linux系統內可以用的SCSI Disk可以是多少個?就是major * minor / partitions = 16 * 256 / 16 = 256個。所以,對於儲存划過來的盤,由於通過兩個HBA卡走的,所以本來應該是165 * 2 =330個,但是實際上系統只能用其中的256個。這樣上面的就都成立了。由於sd_mod自身的限制,讓我們無法使用其全部的盤。而像HBA卡的驅動,直接使用的是scsi_mod模組,其自身就可以識別到所有的LUN,但是就是系統不能用而已。

看到這裡好像是結束,但是事情並沒有結束。我google到下面的連結。
SCSI disk limitations on Linux
http://publib.boulder.ibm.com/infocenter/dsichelp/ds8000ic/index.jsp?topic=/com.ibm.storage.ssic.help.doc/f2c_linuxscsilimit_2hsag9.html

Newer kernels are moving to a dynamic configuration method that will use any available major numbers after the first 16 reserved major numbers have been used. The latest SuSE SLES 8 kernel errata includes this change and imposes a limit of no more than 144 major numbers allocated to SCSI disk devices. Thus these kernels can support up to 2304 disk devices.

In general, the following formula provides the maximum number of devices for Linux host systems: Number of devices = (number of major numbers) x (number of minor numbers) ÷ (number of partitions). For example, Number of devices = 8 x 256 ÷ 16 = 128 or Number of devices = 144 x 256 ÷ 16 = 2304.

For the Linux 2.6 kernels the number of major and minor bits has been increased to 12 and 20 bits respectively, thus Linux 2.6 kernels can support thousands of disks. There is still the limitation of only up to 15 partitions per disk.

看完了,我新的問題來了,核心如何用到那些尚未定義的,可用的major的。我再次看了日誌,略去其它,僅抽取major為16的裝置,發現如下:
這是正常的裝置,major是sd_mod裡面定義的,minor也是16的整數倍,而且小於256
   8    0 sda
   8   16 sdb
   8   32 sdc
   8   48 sdd
   8   64 sde
   8   80 sdf
   8   96 sdg
   8  112 sdh
   8  128 sdi
   8  144 sdj
   8  160 sdk
   8  176 sdl
   8  192 sdm
   8  208 sdn
   8  224 sdo
   8  240 sdp
對於非正常的sd裝置,如下:
   8  256 sdiw
   8  272 sdix
   8  288 sdiy
   8  304 sdiz
   8  320 sdja
   8  336 sdjb
   8  352 sdjc
   8  368 sdjd
   8  384 sdje
   8  400 sdjf
   8  416 sdjg
   8  432 sdjh
   8  448 sdji
   8  464 sdjj
   8  480 sdjk
   8  496 sdjl

我崩潰了,問題仍然沒有結束。就我目前的理解程度,實在是無法瞭解了。這些無效的sd*裝置的major和minor是怎麼分配的?文檔中描述的,超出sd_mod定義的16個,核心保留的可用的major是如何分配和使用的。而我又如何可以讓系統使用超過256個的SCSI disk裝置呢?

本文連結:http://linux.52zhe.info/read.php/237.htm
本文作者:kook(若就部落格內所涉及的技術問題交流,請用下面的MSN或Gmail聯絡我)
連絡方式:(MSN:kook#live.com) (Google talk:kookliu)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.