判斷 /dev/sdx 的裝置類型 - Linux

Table of Contents

各位先進好
小弟最近有個工作
需要用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 哪裡 的相關資訊呢?

跨檔案分析也可以喔~

先謝謝大家^^

--

All Comments

Tom avatarTom2017-10-21
lsblk -S 似乎不錯
Mary avatarMary2017-10-21
一般 usb 是可以拔除的,通常可以看
/sys/block/sd[a-z]/removable 檔案內容是 0 or 1
Necoo avatarNecoo2017-10-26
我的 sdc 是 usb 可是 removable 是 0 耶
Candice avatarCandice2017-10-28
那換個方式,ls -l 看一下 /dev/disk/by-id/usb*
Dorothy avatarDorothy2017-10-31
你用什麼系統為何沒 /dev/disk ? 這已經是 udev 通用的
Cara avatarCara2017-11-02
你該不會是特別的嵌入式系統 ?
Hamiltion avatarHamiltion2017-11-05
lsblk 都沒有,感覺你的系統是客置化特別版本
David avatarDavid2017-11-05
busybox吧?不是完整的coreutils
Aaliyah avatarAaliyah2017-11-08
我的外接硬碟removable參數是0
你要不要測一下外接硬碟看看
Donna avatarDonna2017-11-08
udevadm info -n /dev/sdb --attribute-walk |grep
usb-storage 有找到東西就是 USB 隨身碟
Yedda avatarYedda2017-11-12
或者 cat /sys/block/sdb/removable
Lucy avatarLucy2017-11-12
啊 .. 上面有人推過了 orz
Odelette avatarOdelette2017-11-13
Jessica avatarJessica2017-11-15
Line 3286
Jake avatarJake2017-11-17
Busybox啊 沒udev的話
一個方法是分析dmesg
或者可以試試
Isla avatarIsla2017-11-21
readlink -f /sys/block/sdX/device
device的路徑如果有usb就是usb
Jacob avatarJacob2017-11-21
內接則應該會是ata 除非你走SAS XD
喔 PCIe的手上沒得試 所以我也不確定(?
Eden avatarEden2017-11-22
PCIe 的會叫 nvme0n1 吧