/ Dev / sdX'in bağlı bir USB veya HDD olup olmadığını nasıl anlarım?


23

Yerel bir HDD veya USB anahtarı olup olmadığını nasıl bilebilirim ? Kök ayrıcalıkları olmadan bunu yapmanın bir yolunu tercih ederim./dev/sdX

Tamam, udevadmçok yardımcı oldu:

Yerel HDD için:

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

USB anahtarı için:

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

Yanıtlar:


15

Kök ayrıcalıkları olmadan söylemenin birkaç yolu var, birçoğu zor / kesik:

Kullanarak /dev/disk/by-id:

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

Bu gibi bir şeyle yanıt verirse /dev/disk/by-id/usb-blah-blah-blah, o zaman bir USB disktir. Diğer ön ekler dahil ata, dm, memstick, scsi, vs.

Kullanımı /dev/disk/by-pathönemli ölçüde farklı değil:

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

Gibi bir şey elde edersiniz /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0. Bu, diske giden aygıt yolunu gösterir. Bu durumda, zorlu bir yol PCI → USB → disktir. (not edin -usb-).

Udev kullanmak (Debian'ı çalıştırıyorum. Benimki udevadmiçinde /sbindeğil $PATH- seninki senin dışında başka bir yerde olabilir $PATH):

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

Cihazın açık olduğu otobüs tipini alacaksınız. | grep ID_BUSBilgilerin tam listesi için kaldırın (eklemeniz gerekebilir |less).

Eğer varsa lshwkurulu, Huygens' cevabı olabilir ayrıca çalışır:

lshw -class disk -class storage | less

Ve diskinizin çıkışına bakın. İçinde sdX'i lessdeneyin /ve önceki bus infosatırlara bakın - birincisi sadece söyleyecektir scsi@…, ancak ondan önceki birkaç satır daha aydınlatıcı olacaktır. Ancak, gerçekten gerektiğini bunun uygun olmayabilir bu yüzden süper kullanıcı olarak bu çalıştırın. (belirtiler: Ben denediğim dizüstü bilgisayarda SATA diskini listeledi, ancak USB olanı değil - sudoher ikisi de listeleniyor)

Bunlardan daha fazla veya daha az doğrudan olan başkaları da var.


Bağlı bir harici SATA sürücüye karşı bir dahili SATA sürücüyü ayırt etmenin yolları var esatapmı?
CMCDragonkai

10

Bir çözüm biliyorum, ama ne yazık ki, kök ayrıcalığını gerektiriyor. Her neyse, yine de yararlı bulabilirsiniz:

sudo lshw -class disk -class storage

Her cihaz için /dev/sda, bir USB cihazı için 'usb @ 1: 2' gibi bir şey olacak olan mantıksal adı (örn. ) Ve veriyolu bilgilerini yazdıracaktır .

Örnek çıktı:

[...]
  *-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

Kullanabilirsin lsblk :

lsblk - ad, tran
NAME TRAN
sda  sata
sdb  sata
sdd  usb

burada -dveya --nodepsaraçlar, köleleri yazdırmaz ve -o name,tranveya --output name,tranliste yalnızca cihazın ve cihazın taşıma türünün adını belirtir. rmHangi aygıtların çıkarılabilir olduğunu görmek için çıkış sütunları listesine ekleyin ( 1eğer true):

lsblk --nodeps - çıkış NAME, TRAN, RM
NAME TRAN   RM
sda  sata    0
sdb  sata    0
sdd  usb     1

Cevaplarda bunu arıyordum
Eduard Florinescu

4

Bunun kök ayrıcalıklarına ihtiyacı yoktur (ancak bu komutların çoğu kullanır ve temellere dayanır, bu nedenle tüm POSIX uyumlu mermilerde çalışmaz):

Şunun hakkında sormanın hızlı bir yolu var :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

Gerçekten ilginç dosyasıdır capability. Debian'ımda bir genhd.hdosya var.

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

Hiç, sadece bayrak removableayarlanıp ayarlanmadığını bilmek için :

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

yani

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

capability(benim sdaörneğimde 52 olan) değerin 1bit kümesine sahip olup olmadığını (yani tek bir sayı olup olmadığını ) test ederek çalışır .

Fakat Linux tüm bayrakları içeriyor /sys, bu yüzden sormak /sys/block/sdX/removableçok daha kolay! ;-)

Bir USB anahtar olabilir Yani removablebir sürü bulunmasından ötürü, fakat çıkarılabilir aygıtlar, bunu sağlamak için tercih ediyorum boyut ortamın (örnek için, yüksüz bir CD-ROM tepsi gibi) 0'dan büyükse ve bu cihaz olduğu değil de kullanın: sdX/trace/enableBağlanmayan izlemede :

Not: Bütün bunlar bash v4.2 + 'da iyi bir şekilde test edilmiştir.

altında , bu çok hızlı ve verimli bir şekilde kullanabilirsiniz:

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

Sistemimde 4 adet USB anahtarı var, ancak bunlardan biri ( sde) zaten monte edilmiş, bu yüzden önceki komut çıktı:

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

Benim betiğim:

Debian Live'ı yükseltmek için yazdığım küçük bir işlevi var.

#!/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]}
}

# İlk bölüm sadece insan tarafından okunabilir bir boyut verir. İşlev orada başlar.

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
}

Bu, bir dizi olarak cevabı ilk argüman olarak verilen değişkene veya değişkene atar $REPLY:

chooseFreeUsbKey stick

echo "$stick"
sdf

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

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

(Son alan boşluk içerebilir.)


Cevabımın ilk bölümünü daha okunaklı hale getirdiği için @ StephaneChazelas'a teşekkür ederim.
F. Hauri,

1
(1) Neden iç içe geçmiş kaşlı ayraçlarınız var? Şunu musunuz …,device/{model,type,vendor,uevent}? (2) Lütfen GENHD komutlarınızı ve “trace / enable” komutlarını açıklayabilir misiniz? (3) [ $(( $(< $file ) & 1 )) -ne 0 ]Testiniz basitleştirilebilir (kısaltılabilir) (( $(< $file ) & 1 )).
G-Man,

@ G-Man (1) Evet, bunun için +1! Bu tipo nasıl tanıtıldı anlamıyorum. (2) Genel sabit disk başlık dosyasının içinde bulunması gerekir /usr/src/*/include/linux. Dene sed -ne 's/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p;' /usr/src/*/include/linux/genhd.h. (3) Evet.
F. Hauri

0

Ben sadece kullanmanız hdparmveya lshw(kurmanız gerekebilecek) ve sudoroot olarak çalıştırmanız önerilir .

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

hepsi size bilgi vermeli.


sanal diskteki hdparm:hdparm -i /dev/sda /dev/sda: HDIO_DRIVE_CMD(identify) failed: Invalid exchange HDIO_GET_IDENTITY failed: Invalid argument
Tim

Olması gerektiğini söyledim ve burada sanal disklerle çalışıyor.
EightBitTony

0

Sadece değerini oku /sys/block/sdX/removable.

Örneğin:

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

/dev/sdc bir USB anahtarıdır (bir SD kart veya başka bir çıkarılabilir medya olabilir).


Bu, F. Hauri'nin cevabındaki bilgiyi kopyalar ve yeni içerik eklemez. Mevcut cevaplarda bulunmayan yeni yönleri ekleyemiyorsanız lütfen cevap göndermeyin.
G-Man,

0

dmesg en kolay yöntem:

dmesg | grep sd X

( örneğin, cihazınızın adı )sdXsda

Yukarıdaki komuttan aşağıdakileri göreceksiniz:

  • Bağlı SCSI diski (sabit disk)
  • Takılı SCSI çıkarılabilir diski (çıkarılabilir ortam; örneğin, USB flash sürücü)

dmesgçekirdeğin dairesel ileti arabelleğini okur, bu nedenle bu çözüm yalnızca yeniden başlatıldıktan sonra nispeten yakın zamanda çalışacaktır
roaima

0

SD, USB ve SATA aygıt düğümlerini almak için aşağıdaki komutları kullanabilirsiniz.

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) “Bunun, herhangi /dev/sdXbir yerel için yerel bir HDD mi yoksa bir USB anahtar mı olduğunu nasıl bilebilirim?” Sorusunu nasıl cevapladığı bana açık değil. ”Lütfen OP'nin komutlarınızı nasıl kullanabileceğini açıklayın. belirleme. (2) Biz komutları veren cevapları tercih ediyoruz ve sadece komutları veren cevapları açıklıyoruz . Lütfen ne yaptığınızı açıklayın. Lütfen yorumlara cevap vermeyin; cevabınızı daha net ve daha eksiksiz hale getirmek için düzenleyin . … (Devam ediyor)
G-Man '10

(Devam ediyor)… (3)  awkçok güçlü bir araçtır. Birçok yeni başlayanlar, a'yı yapan grepve çıkışını ileten cevaplar yayınlar awk. Bu nadiren gereklidir; awkdesen eşleştirmesi yapabilir ve istenilen girişi, yardım almadan seçebilirsiniz grep. İki grepkomuttan oluşan bir boru hattınız var awk, sonradan ikinci bir awk komutla paylaştınız. Bu büyük ölçüde basitleştirilebilir; deneyin lütfen. (4) Ayrıca, netlik için, değişikliğe isteyebilirsiniz `…`için $(…)- bkz bu , bu ve bu .
G-Man,

0

Tembelim, inxi bana bunu kolayca söylüyor:

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

Ayrıca firewire ve belki başka bir tür olup olmadığını söyler, ancak bir süre sonra bu türleri kullanmadım, iki kez kontrol etmek zorundayım.

Ayrıca, eğer bölmeler uzaksa, samba veya nfs mounts gibi -p kullanmamı söylüyor.


-1

USB cihazını taktıktan sonra, dmesg , bir konsol penceresinde . Size bazı ipuçları verilecektir.

Örneğin, "Cihaz takılı, toplu depolama / dev / sdd" satırları boyunca bir şeyler söyleyecektir.


2
Lütfen cevabınızı yararlı kılmak için daha fazla bilgi / açıklama sağlayın.
George M,

2
Bir soruya cevap verirken hakaret etmeme ne dersin?
Shadur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.