3,537 瀏覽數

Disk Device

硬碟的相關資訊可以去哪裡看,除了 fdisk , lsscsi 外,還有比較詳細的資訊可以去哪裡查詢嗎?這一篇來看一下與硬碟裝置相關的資訊要如何查詢!

root@ubuntu:~# lsscsi
[3:0:0:0]    cd/dvd  NECVMWar VMware SATA CD01 1.00  /dev/sr0 
[32:0:0:0]   disk    VMware,  VMware Virtual S 1.0   /dev/sda 
[32:0:1:0]   disk    VMware,  VMware Virtual S 1.0   /dev/sdb 

這些詳細的資訊都可以透過指令 #udevadm (以前會透過 #udevinfo) 來查詢, 先來了解一下什麼是 sysfs 與 udev?
sysfs – 核心 2.6 後的新檔案系統,裝置名稱還是存放在 /dev/ 目錄下但是多了一個 /sys/ 的目錄 (該目錄是可瀏覽的),裡面存放當前硬體相對應的基本資訊.udev 則是透過 /sys/ 目錄的資訊創建出相對應的硬體設備節點 /dev/.

udev – 是管理目錄 /dev 的新方法,傳統的方式需要在 /dev/ 預先產生可能用不到的裝置名稱,udev 主要是依賴於 sysfs 提供的資訊與用戶提供的規則(Rule) 來創建相對應於系統中存在的 /dev 設備節點名稱.

更多關於 sysfs 與 udev 請參考 http://benjr.tw/10632

直接來看看 #udevadm 的使用

root@ubuntu:~# udevadm info --query=all --name=sda
P: /devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda
N: sda
S: disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: DEVLINKS=/dev/disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: DEVNAME=/dev/sda
E: DEVPATH=/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda
E: DEVTYPE=disk
E: ID_BUS=scsi
E: ID_MODEL=VMware_Virtual_S
E: ID_MODEL_ENC=VMware\x20Virtual\x20S
E: ID_PART_TABLE_TYPE=dos
E: ID_PART_TABLE_UUID=ddcb3e72
E: ID_PATH=pci-0000:00:10.0-scsi-0:0:0:0
E: ID_PATH_TAG=pci-0000_00_10_0-scsi-0_0_0_0
E: ID_REVISION=1.0
E: ID_SCSI=1
E: ID_TYPE=disk
E: ID_VENDOR=VMware_
E: ID_VENDOR_ENC=VMware\x2c\x20
E: MAJOR=8
E: MINOR=0
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: USEC_INITIALIZED=3247022

udevadm info options 常用的參數
-q, –query=TYPE
使用 all 可以查詢全部的資訊,可用的參數有 name(N), symlink(S), path(P), property(E) 他們也分別代表第一個字元的分類.
-n, –name=FILE
名稱 sda 同 /dev/sda .

上面的輸出訊息,一樣可以直接看檔案來查詢目前所有的硬碟裝置 (路徑 /dev/disk) 的 by-id / by-label / by-path / by-uuid 命名規則並依序的擺放.

想要更詳細的資訊可以使用下面參數
-a, –attribute-walk
會列出指定設備所有 udev 規則中使用的 sysfs properties (屬性),並會沿著上一層一連串的列印所有設備,直到 udev 規則的根目錄.

root@ubuntu:~# udevadm info --attribute-walk --name=sda

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{alignment_offset}=="0"
    ATTR{capability}=="50"
    ATTR{discard_alignment}=="0"
    ATTR{events}==""
    ATTR{events_async}==""
    ATTR{events_poll_msecs}=="-1"
    ATTR{ext_range}=="256"
    ATTR{inflight}=="       0        0"
    ATTR{range}=="16"
    ATTR{removable}=="0"
    ATTR{ro}=="0"
    ATTR{size}=="41943040"
    ATTR{stat}=="   60435      148  1614742    31348     5615    11689  1132704    36720        0    20996    67764"

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host32/target32:0:0/32:0:0:0':
    KERNELS=="32:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{device_blocked}=="0"
    ATTRS{device_busy}=="0"
    ATTRS{dh_state}=="detached"
    ATTRS{eh_timeout}=="10"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_media_change}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{inquiry}==""
    ATTRS{iocounterbits}=="32"
    ATTRS{iodone_cnt}=="0x1024e"
    ATTRS{ioerr_cnt}=="0x6"
    ATTRS{iorequest_cnt}=="0x1024e"
    ATTRS{model}=="VMware Virtual S"
    ATTRS{queue_depth}=="32"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{queue_type}=="simple"
    ATTRS{rev}=="1.0 "
    ATTRS{scsi_level}=="3"
    ATTRS{state}=="running"
    ATTRS{timeout}=="30"
    ATTRS{type}=="0"
    ATTRS{vendor}=="VMware, "

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host32/target32:0:0':
    KERNELS=="target32:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:10.0/host32':
    KERNELS=="host32"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:10.0':
    KERNELS=="0000:00:10.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="mptspi"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x010000"
    ATTRS{config}==""
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{d3cold_allowed}=="0"
    ATTRS{device}=="0x0030"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="17"
    ATTRS{local_cpulist}=="0"
    ATTRS{local_cpus}=="00000000,00000000,00000000,00000001"
    ATTRS{msi_bus}=="1"
    ATTRS{numa_node}=="-1"
    ATTRS{subsystem_device}=="0x1976"
    ATTRS{subsystem_vendor}=="0x15ad"
    ATTRS{vendor}=="0x1000"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

SATA / SAS Link Speed 一樣可以透過 sysfs 提供的資料來查詢.
SATA
這個 /sys/class/ata_link/link# 目錄下的幾個檔案都是與 SATA 速度相關的(路徑可以能會不同,可以直接用 find 尋找下面這幾個檔案).

  • hw_sata_spd_limit : Maximum speed supported by the connected SATA device.
  • sata_spd_limit : Maximum speed imposed by libata.
  • sata_spd : Current speed of the link [1.5, 3Gps,…].
# cat /sys/class/ata_link/link1/sata_spd
3.0 Gbps

SATA 為 3Gbps (SATA 2.0 的裝置),換算時需注意 20% overhead (每八個位元的資料串上用十位元來加以編碼).

  • Generation 1(1.5 Gbit/s) = (1.5G*0.8)/8 = 150 MByte/s
  • Generation 2( 3 Gbit/s) = (3G*0.8)/8 = 300 MByte/s
  • Generation 3( 6 Gbit/s) = (6G*0.8)/8 = 600 MByte/s

SAS
目錄 /sys/class/sas_phy/phy-0\:0/ 下的這幾個檔案都是與 SAS 速度相關的 (路徑可以能會不同,可以直接用 find 尋找下面這幾個檔案).

  • maximum_linkrate
  • maximum_linkrate_hw : 硬體支援最高的速度.
  • minimum_linkrate
  • minimum_linkrate_hw : 硬體支援最低的速度.
  • negotiated_linkrate 目前硬碟的速度
#cat /sys/class/sas_phy/phy-0\:0/maximum_linkrate
6.0 Gbit

SAS 為 6Gbps (SAS 2.0 的裝置),換算時需注意 20% overhead (每八個位元的資料串上用十位元來加以編碼).

  • Generation 1(3 Gbit/s) = 2.4 Gbit/s (3*0.8) = 300 MByte/s
  • Generation 2(6 Gbit/s) = 4.8 Gbit/s (6*0.8) = 600 MByte/s
  • Generation 3(12 Gbit/s) = 9.6 Gbit/s (12*0.8) = 1200 MByte/s

發表迴響