一台 64 位 Linux 机器最多可以连接多少个硬盘?我并不关心实用性,因为我的情况涉及虚拟机。
答案1
Linux 并没有对硬盘的数量进行任意限制。
另外,来自Debian 邮件列表中的这篇文章:
这很简单。/dev/sdz 之后是 /dev/sdaa。而且,我刚刚通过在我的笔记本电脑上创建并登录 800 个 ISCSI 目标进行了测试,/dev/sdzz 之后是 /dev/sdaaa。:)
和这篇博文:
对于现代 Linux 内核下的 SATA 和 SCSI 驱动器,适用上述相同方法,只是导出名称的代码可以在 sdzzz 之外正常工作,理论上直到 sd 后跟 29 个 z!
所以,理论上存在限制,但实际上却是无法达到的。
答案2
事实上,Linux 的抽象 SCSI 子系统所暴露的驱动器数量是有限制的,其中包括 SATA 和 USB 驱动器。这是因为设备文件是用主/次设备号对来标记的,而为 SCSI 子系统分配的方案有这个隐含的限制。
https://www.kernel.org/doc/Documentation/devices.txt
分配了以下主要操作码:8、65 至 71 和 128 至 135,总共分配了 16 个块。次要操作码限制为 256 个可能值(范围为 0..255)。每个磁盘获得 16 个连续的次要操作码,其中第一个代表整个磁盘,接下来的 15 个代表分区。
let major = number of major allocated opcodes = 16
let minor = number of minor opcodes per major opcode = 256
let parts = number of minor opcodes per disk = 16
major * (minor / parts) = 16 * (256 / 16) = 256 possible drives
我以前见过有人把 128 写成极限。我认为 Linux 最近使用的是 128..135,这可以解释这种差异。
命名方案 ( /dev/sdbz7
) 由用户空间选择,而不是由 Linux 内核选择。在大多数情况下,这些由 udev、eudev 或 mdev 管理(尽管过去它们是手动创建的)。我不知道他们的命名方案。不一定依赖所有基于 Linux 的系统以相同的方式命名设备,因为系统管理员可以修改设备命名策略。
答案3
这RHEL 技术的功能和限制页面建议使用足够新的内核至少 10000 个(请参阅“设备路径的最大数量(“sd”设备)”行)。这个数量大于 @luiji-maryo 提到的数量,因为:
- 如果配置为允许,则可以为设备动态分配主/次设备号(请参阅https://www.kernel.org/doc/Documentation/devices.txt了解详情)。
- 次要 Linux 设备号可能比 8 位值大得多。
向自己展示这一点的一种方法是使用scsi_debug
模块:
modprobe scsi_debug max_luns=10 num_tgts=128
在主流 Linux 发行版上稍等片刻后,您现在应该有 1280 个 SCSI 磁盘。您可以使用
ls -l <pathtodisk>
查看它们的主要/次要号码。
注意(1):虚拟化软件通常具有低得多(几百甚至更少,例如vSphere 6.0 限制) 对可以连接到 VM 的控制器的最大数量以及可以挂载这些控制器的最大磁盘数量进行限制,因此您不太可能以这种方式达到 Linux 的限制。
注意(2):两者皆可澳大利亚国家石油公司和新加坡限制它们自己(分别通过BSG_MAX_DEVS
和SG_MAX_DEVS
)最多 32768 个设备。即使你不知何故不需要磁盘本身的 /dev/ 条目,如果没有这些额外的设备,你也会很难发送更专业的 SCSI 命令。
答案4
答案来自内核源代码是262144(可能是 1048576)。
- SCSI 磁盘有 16 个主数字:8、65..71、128..135。
- 在内核为次设备号保留的 20 位中,内核使用 4 位来枚举分区。
- 由于历史原因,磁盘不是连续枚举的。135:240 之后是 8:256、...、65:256、...、135:496、8:512、... 等。
我不太清楚为什么内核源代码中的注释说每个主磁盘有“16k 个磁盘”,而其余 16 个次磁盘理论上就足以容纳 64k 个磁盘,从而为我们提供 1M 个磁盘。我想还没有人尝试过超过 262k 个磁盘。
磁盘 262143 ( ) 的设备名称135:262128
为/dev/sdnwtl
。