早前写过一篇【利用Raid卡工具获取逻辑盘是否为SSD】的文章,大概讲述了如何通过raid卡工具判断一个逻辑磁盘对应物理磁盘是否为SSD,当时主要提到了megacli和sas3ircu这两种工具,核心是如何通过raid卡工具定位到逻辑磁盘对应的物理磁盘的位置,当时的方式现在看来在有些场景会存在缺陷。

当时的方案主要是先通过lspci获取raid卡型号,然后找到对应的raid卡型号,紧接着通过lsscsi命令获取逻辑磁盘的targetid,再通过raid卡工具根据targetid定位到对应的物理盘。当时的方案在多controller的场景下存在问题,可能会出现重复target id的情况,所以这时候只能再借助controller id来定位唯一的磁盘了。总而言之,想真正定位逻辑磁盘对应的物理磁盘,就必须要获取到磁盘的controller id,enclosure id和slot number,有了这三个参数,便可以获取该磁盘的信息,或者对该物理磁盘进行点灯、响音和做raid等操作。

那么,具体如何定位逻辑磁盘的物理位置呢?且看下文分析

获取 raid 卡信息

通过lspci命令可以获取到操作系统上所有raid卡信息,我们可以看到每个raid卡最前面都有一串数字,比如第一行是02:00.0,第二行是03:00.0,这里的02和03表示的是raid卡的busid,即raid卡控制器在pci总线上的id。

[root@tony ~]# lspci | grep "LSI Logic"

02:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3008 [Fury] (rev 02)

03:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)

获取磁盘 pcipath

在linux中,一切皆文件,每个文件都有自己的唯一标识,对于磁盘而言,pcipath就是它的唯一标识,pci总线上面有很多控制器,比如scsi控制器,而磁盘又存在于scsi控制器上,所以我们可以在lsscsi命令获取到的scsi设备列表中查看到操作系统上的磁盘信息。

以sda为例,我们可以在/dev/disk/by-path目录下查看到磁盘的pcipath

[root@tony ~]# ll /dev/disk/by-path/

total 4

lrwxrwxrwx 1 root root 9 May 11 10:30 pci-0000:02:00.0-scsi-0:2:0:0 -> ../../sda

lrwxrwxrwx 1 root root 10 May 11 10:30 pci-0000:02:00.0-scsi-0:2:0:0-part1 -> ../../sda1

lrwxrwxrwx 1 root root 10 May 11 10:30 pci-0000:02:00.0-scsi-0:2:0:0-part2 -> ../../sda2

lrwxrwxrwx 1 root root 9 May 11 16:22 pci-0000:02:00.0-scsi-0:2:1:0 -> ../../sdb

lrwxrwxrwx 1 root root 9 May 11 16:22 pci-0000:02:00.0-scsi-0:2:10:0 -> ../../sdk

由于在linux中,udev是用户态的设备管理,所以我们也可以通过udev获取。

[root@tony ~]# udevadm info --query=symlink --name=sda

disk/by-id/scsi-36509a4c0ac86790022337b9105005435 disk/by-id/wwn-0x6509a4c0ac86790022337b9105005435 disk/by-path/pci-0000:02:00.0-scsi-0:2:0:0

这边我们可以得到磁盘sda的pcipath为pci-0000:02:00.0-scsi-0:2:0:0,02就是磁盘的raid卡的bus id,后面的00表示channel id,再后面的0:2:0:0就和lsscsi获取的一样了,其中2就表示target id。

所以通过bud id,我们可以获取到磁盘对应的raid卡型号,根据对应的raid卡工具操作磁盘。这边我们只讨论megaraid,所以工具也就是megacli了。

获取 controller id

上面我们获取到了磁盘的target id和对应raid卡的bus id,而对于megacli工具而言,每个raid卡都有一个与之对应的controller。

[root@tony ~]# /opt/MegaRAID/MegaCli/MegaCli64 -AdpGetPciInfo -aall -NoLog

PCI information for Controller 0

--------------------------------

Bus Number : 2

Device Number : 0

Function Number : 0

PCI information for Controller 1

--------------------------------

Bus Number : 3

Device Number : 0

Function Number : 0

Exit Code: 0x00

这边我们可以看到megacli获取到了两个controller,也就对应上面lspci获取到的两张raid卡。细心的朋友可以发现这边有一个Bus Number,分别为2和3,而我们上面获取到了raid卡的bus id分别为02和03,没错,这边的Bus Number和bus id是对应的,只是Bus number没有自动填补成两位数,所以我们可以通过bus id得到sda所对应的controller为0。

注意:

原本系统中版本8.07.07的megacli工具获取raid卡信息的时候会存在问题,每次Bus Number都会变化,我们只要升级megacli即可,我这边是把megacli升级到了8.07.14版本。

获取磁盘组

此时,我们拥有了controller id,可以获取该controller下所有的磁盘组信息。

[root@tony ~]# /opt/MegaRAID_new/MegaCli/MegaCli64 -LdPdInfo -a0 -NoLog

Adapter #0

Number of Virtual Disks: 13

Virtual Drive: 0 (Target Id: 0)

Name :

RAID Level : Primary-1, Secondary-0, RAID Level Qualifier-0

Size : 558.375 GB

Sector Size : 512

Is VD emulated : No

Mirror Data : 558.375 GB

State : Optimal

Strip Size : 64 KB

Number Of Drives : 2

Span Depth : 1

Default Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU

Current Cache Policy: WriteThrough, ReadAheadNone, Direct, No Write Cache if Bad BBU

Default Access Policy: Read/Write

Current Access Policy: Read/Write

Disk Cache Policy : Disk's Default

Encryption Type : None

Default Power Savings Policy: Controller Defined

Current Power Savings Policy: None

Can spin up in 1 minute: Yes

LD has drives that support T10 power conditions: Yes

LD's IO profile supports MAX power savings with cached writes: No

Bad Blocks Exist: No

Is VD Cached: No

Number of Spans: 1

Span: 0 - Number of PDs: 2

PD: 0 Information

Enclosure Device ID: 32

Slot Number: 12

Drive's position: DiskGroup: 0, Span: 0, Arm: 0

Enclosure position: 1

Device Id: 12

WWN: 50000398181A974C

Sequence Number: 2

Media Error Count: 0

Other Error Count: 0

Predictive Failure Count: 0

Last Predictive Failure Event Seq Number: 0

PD Type: SAS

...

...

然后我们可以根据target id获取对应的磁盘组信息,target id与上面的Target Id所对应,这样我们可以过滤得到唯一的磁盘组信息。这边我们可以看到sda对应Target Id为0的磁盘组,该raid类型为raid1,虚拟磁盘组中有两块物理盘,然后我们可以获取这两块物理盘的enclosure id和slot number,这样再加上前文的controller id,我们就可以完完全全地定位到具体一块磁盘的物理位置。

一键定位

针对这种需求,本人根据以上逻辑写了一个简单的脚本可以一键获取磁盘的定位。

[root@tony ~]# ./get_disk_location.py sda

['0:32:12', '0:32:13']

这边0:32:12分别表示磁盘的controller id,enclosure id和slot number。

总结

之前的做法大部分场景可行,但是在一些场合偶尔会发现问题,总感觉还是不够靠谱,身边的人还有通过sda,sdb这种排列顺序来查找和megacli中显示磁盘的对应关系的,就更不靠谱了。linux操作系统是可以识别到具体硬件设备的,所以是肯定存在方法识别硬件对应的逻辑设备的,本文通过pcipath获取到设备的唯一标识,然后根据pcipath中的bus id和megacli中的cobtroller建立连接,最后通过target id锁定唯一磁盘组中的磁盘信息。

通过这种方式,我们不需要肉眼判断,也不需要顾虑部分场景方案不适用,这完全就是操作系统使用的方式,使用这种最基础,最底层的方式实现,真是让人豁然开朗。这跟看源码类似,了解一个功能的背后具体实现,你才知道最正确的姿势,不用去碰,去凑,这种感觉真好。

给大家推荐一本书《Linux设备驱动程序》,这本书详细讲解了linux中各种设备与驱动的细节,很底层也很枯燥,不过看完后应该会很有收获。希望大家在使用各种已有工具和框架的基础上,多去了解背后的实现机制,这样可以帮助我们更好地实现更深层次的需求。

Refer

megacli通过盘符定位物理盘_Megaraid 磁盘定位相关推荐

  1. linux绑定盘符吗,Linux盘符绑定实现原理.PDF

    Linux盘符绑定实现原理 Linux盘符绑定实现原理 正一 2016.7.25 目 录  Linux盘符的分配  Linux内核IDR机制  Linux盘符绑定 Linux盘符的分配 sd_ ...

  2. 软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart

    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart 参考文章: (1)软碟通 UltraISO U启替代品 Win32D ...

  3. 关于傲梅分区助手之后盘符错乱以及盘符互换的解决办法

    关于傲梅分区助手之后盘符错乱以及盘符互换的解决办法 相信大家一定遇到过电脑c盘中内存不足的问题 下面来说说我的情况吧,我的电脑是戴尔的xps15-9550乞丐版,只有一个256g的固态 随着软件的越来 ...

  4. U盘问题,插入时只有声音,没有显示,在”计算机管理”的“磁盘管理”中,上面看不到盘符”H:”,下面可以看到”磁盘1 可移动无媒

    问题:U盘问题,插入时只有声音,没有显示,在"计算机管理"的"磁盘管理"中,上面看不到盘符"H:",下面可以看到"磁盘1 可移动无 ...

  5. 计算机c盘和u盘区别,用U盘进入pe后C盘被占用怎么办|C盘盘符被U盘占用解决方法...

    通过U盘pe启动盘安装系统是一个不错的选择,在pe环境下,用户可以执行各种操作,包括引导修复.硬盘分区.安装系统等等.在pe下经常遇到的一个问题就是C盘盘符被U盘占用,U盘盘符变成C盘,原本系统盘C盘 ...

  6. win7打开计算机没盘符,计算机U盘盘符不显示怎么办?Win7系统U盘不显解决办法...

    虽说win7系统相对于XP系统来说是一大进步,但它也有一些不良的地方.有时候,当你的U盘插入到电脑里面,却显示不出U盘的盘符,u盘盘符不显示怎么办.一般来说,电脑不显U盘盘符有两种情况,一种就是电脑本 ...

  7. win7计算机u盘不显示盘符,win7 u盘不显示盘符怎么办?Win7 u盘盘符不显现象的解决办法介绍...

    虽说win7系统相对于XP系统来说是一大进步,但它也有一些不良的地方.有时候,当你的U盘插入到电脑里面,却显示不出U盘的盘符,u盘盘符不显示怎么办.一般来说,电脑不显U盘盘符有两种情况,一种就是电脑本 ...

  8. megacli通过盘符定位物理盘_柴少鹏的官方网站

    一.Megacli介绍 工作中偶尔会用到MegaCli这个工具,之前的博文里面也提到过这个工具,这里对于用法详细的记录一下. 通过LSI公司提供的MegaCli工具, 可以实现对RAID卡和硬盘的监控 ...

  9. megacli通过盘符定位物理盘_MegaCli使用

    0.前沿介绍 1. lsscsi -s 查看盘符对应关系 2. 查看物理槽位占用情况 3.查看适配器(控制器)个数 4.查看控制器序号,名称,序列号 5.查看所有逻辑层次磁盘详细信息 6.查看所有物理 ...

  10. megacli通过盘符定位物理盘_megacli命令使用指南

    Dell 服务器常用管理命令总结 准备 新版本的 MegaCli-1.01.24... 更换硬盘前必须使用 umount 命令将故障硬盘的挂载移除,否则插入新硬盘后会有盘符漂移 故障. 软件包安装完成 ...

最新文章

  1. 多个SSH key对应多个Host: Github, Bitbucket
  2. linux安全策略与实例pdf,实验一:Linux用户管理与安全策略.pdf
  3. B18_NumPy副本和视图(视图或浅拷贝、副本或深拷贝、深浅拷贝)
  4. python2安装mysql-python报错(以后直接安装pymysl就行)
  5. php 获取警告信息,获取PHP警告错误信息的解决方法_PHP教程
  6. p图软件pⅰc_惊爆软件:王者荣耀P图大神,助力少年国服梦
  7. 【加解密学习笔记:第一天】操作系统基础知识
  8. sqlserver 还原bak文件 查看不到_SQL server中用T-SQL语句实现(建库,分离,附加,备份,还原)...
  9. 转:数字对讲机常识介绍
  10. composer 设置版本号_composer 安装及使用
  11. 网络安全学习--007--漏洞分析简介
  12. tushare基本用法
  13. STM3库文件 hal_uart.c的使用
  14. 易封装app网站打包工具软件v2.0版本
  15. Linux dos攻击服务器,Linux服务器如何防止DoS攻击
  16. 对话诊断(X)2022IJCAI-My nose is running.Are you also coughing?:Building a Medical Diagnosis Agent with
  17. 电子产品使用感受之--小米床头灯第二代使用体验分享
  18. matlab中imag什么意思,Matlab基本函数-imag函数
  19. 关于.9图失效以及.9图不可以错过的细节点
  20. 首都师范 博弈论 6 1 7逆向归纳法应用2 斯塔克伯格模型

热门文章

  1. dbc2000 v2.0官方版
  2. Python快速下载M3U8电影
  3. 如何成为一名AI人工智能算法工程师?
  4. AI 诊断新算法,可提前十年查出老年痴呆症;济南酒店推行“人脸识别”,没带证件也可住店...
  5. Basic开发笔记:Basic语言介绍、环境搭建、基本语法示例与程序实例
  6. 淘宝网打开很慢、特别慢的完美解决方法
  7. html5微博个人资料页面,仿新浪微博个人主页html网站模板
  8. 村村响农村广播-盐池县农村IP广播案例
  9. Air应用:Splus微博,wing微博
  10. LAMMPS分子动力学模拟技术与应用 第一性原理计算方法及应用