कैसे पता करें कि / dev / sdX एक कनेक्टेड USB या HDD है?


23

मुझे कैसे पता चलेगा कि स्थानीय एचडीडी या यूएसबी कुंजी है या नहीं? मैं रूट विशेषाधिकारों के बिना ऐसा करने का एक तरीका पसंद करूंगा।/dev/sdX

ठीक है, udevadmबहुत मदद की:

स्थानीय HDD के लिए:

udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata

USB कुंजी के लिए:

udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb

जवाबों:


15

रूट विशेषाधिकारों के बिना बताने के कुछ तरीके हैं, उनमें से कई पेचीदा / हैक हैं:

का उपयोग कर /dev/disk/by-id:

find /dev/disk/by-id/ -lname '*sdX'

अगर यह किसी चीज़ के साथ प्रतिक्रिया करता है /dev/disk/by-id/usb-blah-blah-blah, तो यह एक USB डिस्क है। अन्य उपसर्गों शामिल ata, dm, memstick, scsi, आदि

का उपयोग करना /dev/disk/by-pathकाफी अलग नहीं है:

find /dev/disk/by-path/ -lname '*sdX'

आपको कुछ ऐसा मिलेगा /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0। यह डिवाइस पथ को डिस्क पर ले जाता है। इस स्थिति में, एक मोटा रास्ता PCI → USB → डिस्क है। (ध्यान दें -usb-)।

Udv का उपयोग करना (मैं डेबियन को चलाता हूं। मेरा udevadmवह तरीका है /sbinजो मेरे पर नहीं है $PATH- आपका कहीं और हो सकता है, आपके घर पर $PATH)

/sbin/udevadm info --query=all --name=sdX | grep ID_BUS

डिवाइस पर आपको बस प्रकार मिलेगा। | grep ID_BUSजानकारी की पूरी सूची के लिए निकालें (आपको जोड़ने की आवश्यकता हो सकती है |less)।

यदि आपने lshwस्थापित किया है, तो ह्यूजेंस का जवाब भी काम कर सकता है :

lshw -class disk -class storage | less

और अपने डिस्क के लिए आउटपुट के माध्यम से देखें। में less, /sdX का प्रयास करें और पूर्ववर्ती, bus infoरेखाओं को देखें - पहले वाला सिर्फ कहेगा scsi@…, लेकिन इससे पहले की कई पंक्तियां अधिक ज्ञानवर्धक होंगी। हालांकि, आपको वास्तव में इसे सुपरसुसर के रूप में चलाना चाहिए ताकि यह उपयुक्त न हो। (लक्षण: लैपटॉप पर मैंने इसे आज़माया, इसने SATA डिस्क को सूचीबद्ध किया लेकिन USB एक को नहीं - sudoसूचीबद्ध दोनों के साथ चल रहा है )

अन्य भी हैं, इन लोगों की तुलना में कम या ज्यादा प्रत्यक्ष।


वहाँ एक आंतरिक SATA ड्राइव बनाम एक बाहरी SATA ड्राइव के अलावा बताने के तरीके हैं esatap?
CMCDragonkai

10

मैं एक समाधान जानता हूं, लेकिन, दुख की बात है कि इसके लिए मूल विशेषाधिकार की आवश्यकता है। वैसे भी, आप अभी भी इसे उपयोगी पा सकते हैं:

sudo lshw -class disk -class storage

प्रत्येक डिवाइस के लिए यह तार्किक नाम (जैसे, /dev/sda) और बस की जानकारी को प्रिंट करेगा , जो कि USB डिवाइस के मामले में 'usb @ 1: 2' जैसा होगा।

नमूना उत्पादन:

[...]
  *-storage
       description: SATA controller
       physical id: d
       bus info: pci@0000:00:0d.0
       configuration: driver=ahci latency=64
[...]
     *-disk:0
          description: ATA Disk
          physical id: 0
          bus info: scsi@2:0.0.0
          logical name: /dev/sda
[...]
  *-scsi
       physical id: 3
       bus info: usb@1:2
       configuration: driver=usb-storage
     *-disk
          description: SCSI Disk
          physical id: 0.0.0
          bus info: scsi@6:0.0.0
          logical name: /dev/sdc
[...]

8

आप उपयोग कर सकते हैं lsblk:

lsblk -do नाम, ट्रॅन
NAME TRAN
sda  sata
sdb  sata
sdd  usb

जहां -dया --nodepsसाधन दासों को नहीं छापते हैं और -o name,tranया --output name,tranउपकरण और उपकरण परिवहन के प्रकार की सूची का नाम है। rmआउटपुट कॉलम की सूची में यह देखने के लिए जोड़ें कि कौन से उपकरण हटाने योग्य हैं ( 1यदि true):

lsblk --nodeps --output NAME, TRAN, RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

मैं इसके जवाब में देख रहा था
एडुआर्ड फ्लोरिंसक्यू

4

इसके लिए रूट विशेषाधिकारों की आवश्यकता नहीं है (लेकिन इनमें से कई कमांड्स का उपयोग करते हैं और बशीज़ पर निर्भर करते हैं, इसलिए वे सभी POSIX-compliant गोले में काम नहीं करेंगे):

एक के बारे में पूछने के लिए एक त्वरित तरीका है :sdX

grep -H . /sys/block/sda/{capability,uevent,removable,device/{model,type,vendor,uevent}}
/sys/block/sda/capability:52
/sys/block/sda/uevent:MAJOR=8
/sys/block/sda/uevent:MINOR=0
/sys/block/sda/uevent:DEVNAME=sda
/sys/block/sda/uevent:DEVTYPE=disk
/sys/block/sda/removable:0
/sys/block/sda/device/model:WDC WD360GD-00FN
/sys/block/sda/device/type:0
/sys/block/sda/device/vendor:ATA     
/sys/block/sda/device/uevent:DEVTYPE=scsi_device
/sys/block/sda/device/uevent:DRIVER=sd
/sys/block/sda/device/uevent:MODALIAS=scsi:t-0x00

वास्तव में दिलचस्प फ़ाइल है capability। मेरे डेबियन पर, मेरे पास एक genhd.hफाइल है, इसलिए:

eval $(sed -ne '
   s/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p
  ' /usr/src/linux-headers-2.6.32-5-common-openvz/include/linux/genhd.h)
diskCapa=$(</sys/block/sda/capability)
for i in ${!GENHD_FLAGS[@]};do
    (( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
  done
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO

diskCapa=$(</sys/block/sdd/capability)
    for i in ${!GENHD_FLAGS[@]};do
    (( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
  done
REMOVABLE
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO

सब पर, केवल अगर झंडा removableसेट है जानने के लिए :

grep REMOVABL /usr/src/linux-headers-3.2.0-4-common/include/linux/genhd.h 
#define GENHD_FL_REMOVABLE                      1

इसलिए

for disk in sd{a,b,c,d,e,f,g,h} ; do
 (( $(< /sys/block/$disk/capability ) & 1 ))  &&  echo $disk is removable
done

परीक्षण करके काम करता है कि क्या capabilityमूल्य (जो मेरे sdaउदाहरण में 52 है , ऊपर) है1 बिट सेट है (यानी, क्या यह एक विषम संख्या है)।

लेकिन लिनक्स सभी झंडे को प्रस्तुत करता है /sys, इसलिए पूछ रहा है/sys/block/sdX/removable बहुत आसान है! ;-)

तो एक USB कुंजी हो सकती है removable, लेकिन चूंकि बहुत सारे हटाने योग्य डिवाइस हैं, इसलिए मैं यह सुनिश्चित करना पसंद करूंगा कि माध्यम का आकार 0 से अधिक हो (जैसे कि एक अनलोड सीडी-रोम ट्रे, नमूना के लिए) और यह कि डिवाइस में नहीं है उपयोग: यह देखते हुए कि sdX/trace/enableयह बाँधा नहीं गया है:

नोट: यह सब अच्छी तरह से bash v4.2 + पर परीक्षण किया गया है।

तहत , आप इसे बहुत जल्दी और कुशल तरीके से उपयोग कर सकते हैं:

for disk in /sys/block/* ; do
    [ -f "$disk/removable" ]    && [ $(<"$disk/removable") -gt 0 ]   &&
    [ -f "$disk/size" ]         && [ $(<"$disk/size") -gt 0 ]        &&
    [ -f "$disk/trace/enable" ] && [ -z "$(<"$disk/trace/enable")" ] &&
    echo "${disk##*/} $(($(<"$disk/size")/1953125))G $(<"$disk/device/model")"
  done

मेरे सिस्टम पर, 4 USB कुंजी हैं, लेकिन उनमें से एक ( sde) पहले से ही घुड़सवार है, इसलिए पिछले कमांड आउटपुट:

sdd 8G Trans-It Drive
sdf 7G Storage Media
sdg 4G silicon-power

मेरी स्क्रिप्ट:

थोड़ा फ़ंक्शन है जिसे मैंने उन्नत डेबियन लाइव स्थापित करने के लिए लिखा था।

#!/bin/bash

txtsize() {
    local _c=$1 _i=0 _a=(b K M G T P)
    while [ ${#_c} -gt 3 ] ; do
        ((_i++))
        _c=$((_c>>10))
      done
    _c=000$(( ( $1*1000 ) >> ( 10*_i ) ))
    ((_i+=${3:-0}))
    printf -v ${2:-REPLY} "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}

# पहला भाग केवल मानव पठनीय आकार का प्रतिपादन करता है। वहां समारोह शुरू होता है।

chooseFreeUsbKey() {
    local _lUdisk _lUsize _lUdialog=dialog # whiptail # gdialog
    local -A _lUdevices
    unset ${1:-REPLY}
    for _lUdisk in /sys/block/*; do
        [ -f $_lUdisk/removable ] && [ $(<$_lUdisk/removable) -gt 0 ] &&
        [ -f $_lUdisk/size ] && [ $(<$_lUdisk/size) -gt 0 ] &&
        txtsize $(<$_lUdisk/size)*512 _lUsize &&
        [ -f $_lUdisk/trace/enable ] && [ -z "$(<$_lUdisk/trace/enable)" ] &&
        _lUdevices[${_lUdisk##*/}]="$_lUsize $(<$_lUdisk/device/model)"
    done
    case ${#_lUdevices[@]} in
        0 ) ;; # echo Sorry no key found. ;;
        1 ) IFS read -a ${1:-REPLY} \
            <<< "${!_lUdevices[@]}§${_lUdevices[@]%% *}§${_lUdevices[@]#* }";;
        * ) declare -a menu
           for _lUdisk in ${!_lUdevices[@]}; do
               menu+=($_lUdisk "${_lUdevices[$_lUdisk]}")
           done
           _lUdisk=$($_lUdialog --menu "Choose a USB stick" \
               $((LINES-3)) $((COLUMNS-3)) $((LINES-8)) \
               "${menu[@]}" 2>&1 >/dev/tty)
           IFS read -a ${1:-REPLY} \
           <<< "$_lUdisk§${_lUdevices[$_lUdisk]%% *}§${_lUdevices[$_lUdisk]#* }"
    esac
}

यह उत्तर देता है, एक सरणी के रूप में, पहले तर्क के रूप में या चर को दिए गए चर को $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

echo "${stick[1]}"
7.26G

echo "${stick[2]}"
Storage Media

(अंतिम फ़ील्ड में स्थान हो सकते हैं।)


मेरे उत्तर के पहले भाग को और अधिक पठनीय बनाने के लिए @StephaneChazelas को धन्यवाद।
एफ। होरी

1
(१) आप घुंघराले ब्रेसिज़ क्यों पहनते हैं? क्या आपका मतलब है …,device/{model,type,vendor,uevent}? (२) क्या आप अपने जेनएचडी कमांड और अपने "ट्रेस / इनेबल" कमांड को समझा सकते हैं? (3) आपका [ $(( $(< $file ) & 1 )) -ne 0 ]परीक्षण सरल (छोटा) किया जा सकता है (( $(< $file ) & 1 ))
जी-मैन ने कहा कि 'रिइनेटेट मोनिका'

इसके लिए @ जी-मैन (1) हां, +1! मुझे समझ नहीं आ रहा है कि इस टिपो को कैसे पेश किया गया। (2) जेनेरिक हार्ड डिस्क हैडर फ़ाइल में मौजूद होना चाहिए /usr/src/*/include/linux। कोशिश करो sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h। (३) हाँ।
एफ। होरी

0

मेरा सुझाव है कि बस ( hdparmया lshwजिसे आपको स्थापित करने की आवश्यकता हो), और sudoइसे रूट के रूप में निष्पादित करने के लिए उपयोग करें।

sudo hdparm -I /dev/sda
sudo lshw -short -C disk
sudo lshw -class disk -class storage

आप सभी को जानकारी देनी चाहिए।


एक आभासी डिस्क पर HDParm:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
टिम

खैर, मैंने कहा कि यह वर्चुअल डिस्क के साथ काम करना चाहिए
एइटबिटोनी

0

का मूल्य पढ़ें /sys/block/sdX/removable

उदाहरण के लिए:

$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1

/dev/sdc एक USB कुंजी है (यह एसडी कार्ड या कोई अन्य हटाने योग्य मीडिया हो सकता है)।


यह F. Hauri के उत्तर की जानकारी को डुप्लिकेट करता है और कोई नई सामग्री नहीं जोड़ता है। कृपया कोई उत्तर पोस्ट न करें जब तक कि आप किसी भी मौजूदा उत्तर में नहीं मिले नए पहलुओं को जोड़ सकें।
जी-मैन का कहना है कि 'मोनिका की बहाली'

0

dmesg सबसे आसान तरीका है:

dmesg | grep sd X

( आपके डिवाइस का नाम है, उदा )sdXsda

ऊपर दिए गए कमांड से, आप निम्नलिखित देखेंगे:

  • संलग्न SCSI डिस्क (हार्ड डिस्क)
  • संलग्न SCSI हटाने योग्य डिस्क (हटाने योग्य मीडिया; जैसे, USB फ्लैश ड्राइव)

dmesgकर्नेल के वृत्ताकार संदेश बफ़र को पढ़ता है इसलिए यह समाधान केवल रीबूट के बाद अपेक्षाकृत हाल ही में काम करेगा
रोइमा

0

आप SD, USB और SATA डिवाइस नोड प्राप्त करने के लिए नीचे दिए गए कमांड का उपयोग कर सकते हैं।

usb_device="/dev/`ls -lR /dev/disk/by-id/  | grep ^l | grep 'usb' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

sata_device="/dev/`ls -lR /dev/disk/by-id/ | grep ^l | grep 'ata' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

sd_device="/dev/`ls -lR /dev/disk/by-id/   | grep ^l | grep 'mmc' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"

1
(1) यह मेरे लिए स्पष्ट नहीं है कि यह प्रश्न का उत्तर कैसे देता है, जो है, "किसी भी विशेष के लिए /dev/sdX, मुझे कैसे पता चल सकता है कि यह एक स्थानीय एचडीडी या यूएसबी कुंजी है?" कृपया बताएं कि ओपी आपके आदेशों का उपयोग कैसे कर सकता है? दृढ़ निश्चय। (२) हम ऐसे उत्तर देना पसंद करते हैं जो कमांड देते हैं और उन उत्तरों के बारे में बताते हैं जो केवल कमांड प्रदान करते हैं। कृपया बताएं कि आप क्या कर रहे हैं। कृपया टिप्पणियों में प्रतिक्रिया न दें; इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें। … (Cont'd)
जी-मैन कहते हैं

(Cont'd)… (3)  awkएक बहुत शक्तिशाली उपकरण है। कई शुरुआती उत्तर देते हैं कि एक करते हैं grepऔर इसके उत्पादन में पाइप करते हैं awk। यह शायद ही कभी आवश्यक है; awkपैटर्न मिलान कर सकते हैं और मदद के बिना वांछित इनपुट का चयन कर सकते हैं grep। आपके पास दो grepकमांड का एक पाइप लाइन है awk, और फिर एक दूसरी awk कमांड है। यह बहुत सरल किया जा सकता है; प्रयास करें। (4) इसके अलावा, स्पष्टता के लिए, आप परिवर्तन करना चाह सकते हैं `…`करने के लिए $(…)- देखना यह , यह , और यह
जी-मैन ने कहा कि 'रिइनेटेट मोनिका'

0

मैं आलसी हूँ, inxi मुझे यह आसानी से बताता है:

inxi -D
Drives:    HDD Total Size: 1220.3GB (33.2% used)
           ID-1: /dev/sda model: ST380817AS size: 80.0GB
           ID-2: /dev/sdb model: WDC_WD1003FZEX size: 1000.2GB
           ID-3: USB /dev/sdc model: USB_Flash_Drive size: 140.0GB

मेरा मानना ​​है कि यह मुझे यह भी बताता है कि क्या यह फायरफॉक्स और शायद एक अन्य प्रकार है, लेकिन मुझे डबल चेक करना होगा, उन प्रकारों का थोड़ी देर में उपयोग नहीं किया है।

यह भी मुझे -p का उपयोग करके बताता है कि यदि विभाजन दूरस्थ हैं, जैसे सांबा या nfs mounts।


-1

USB डिवाइस में प्लग करने के बाद, dmesgएक कंसोल विंडो में चलाएँ । आपको कुछ संकेत प्रदान किए जाएंगे।

उदाहरण के लिए यह "डिवाइस प्लग इन, मास स्टोरेज / देव / sdd" की तर्ज पर कुछ कहेगा।


2
कृपया अपने उत्तर को उपयोगी बनाने के लिए अधिक जानकारी / स्पष्टीकरण प्रदान करें।
जॉर्ज एम

2
कैसे एक सवाल का जवाब देते समय अपमान नहीं किया जा रहा है?
शादुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.