[問題] 判斷 /dev/sdx 的裝置類型

作者: awpadam (adam!)   2017-10-19 14:20:12
各位先進好
小弟最近有個工作
需要用C語言去找到linux下,硬碟的/dev/ 的sd 之編號
小弟對linux很陌生
我們的環境下,主機上只可能插有 兩個usb碟 和 一個硬碟
所以ls /dev/sd*
之後
可能長成
/dev/sda /dev/sda1 /dev/sdb /dev/sdb1
這個樣子
這時候我插了一個硬碟和一個usb
且sda是硬碟,sdb是usb
我的工作就是利用C語言去找出 sda 這個字串
當然硬碟不可能永遠都是sda,如果先插usb再插硬碟
硬碟就可能變成sdb或sdc等等
我目前是先用C語言讀取 /proc/partitions 這個檔案
可以找到類似這樣的資訊
major minor #blocks name
8 0 488386584 sda
8 16 15646720 sdb
8 17 15646688 sdb1
然後判斷 sda的 blocks 比sdb的 blocks 還要大,所以回傳sda字串
但是我想說這個方法感覺很怪異
如果哪一天插了一個小容量的硬碟和一個大容量的usb
就馬上會回傳錯誤的sdx了
所以想請問版上前輩,有沒有什麼linux的command或者哪一個linux的檔案
有在紀錄著 usb 和 hd 掛載在 /dev/sdx 哪裡 的相關資訊呢?
跨檔案分析也可以喔~
先謝謝大家^^
作者: lantw44 (#######################)   2017-10-19 14:24:00
lsblk -S 似乎不錯
作者: kenduest (小州)   2017-10-19 14:25:00
一般 usb 是可以拔除的,通常可以看/sys/block/sd[a-z]/removable 檔案內容是 0 or 1
作者: lantw44 (#######################)   2017-10-19 14:27:00
我的 sdc 是 usb 可是 removable 是 0 耶
作者: kenduest (小州)   2017-10-19 14:34:00
那換個方式,ls -l 看一下 /dev/disk/by-id/usb*你用什麼系統為何沒 /dev/disk ? 這已經是 udev 通用的你該不會是特別的嵌入式系統 ?lsblk 都沒有,感覺你的系統是客置化特別版本
作者: brli7848 (無理阿?)   2017-10-19 15:11:00
busybox吧?不是完整的coreutils
作者: filiaslayers (司馬雲)   2017-10-19 15:23:00
我的外接硬碟removable參數是0你要不要測一下外接硬碟看看
作者: Bencrie   2017-10-19 15:48:00
udevadm info -n /dev/sdb --attribute-walk |grepusb-storage 有找到東西就是 USB 隨身碟或者 cat /sys/block/sdb/removable啊 .. 上面有人推過了 orz
作者: kingofsdtw (不能閒下來!!)   2017-10-21 14:32:00
作者: danny8376 (釣到一隻猴子@_@)   2017-10-22 01:40:00
Busybox啊 沒udev的話一個方法是分析dmesg或者可以試試readlink -f /sys/block/sdX/devicedevice的路徑如果有usb就是usb內接則應該會是ata 除非你走SAS XD喔 PCIe的手上沒得試 所以我也不確定(?
作者: Bencrie   2017-10-22 02:31:00
PCIe 的會叫 nvme0n1 吧

Links booklink

Contact Us: admin [ a t ] ucptt.com