Znajdź wszystkie urządzenia pamięci masowej podłączone do komputera z systemem Linux [zamknięte]

109

Muszę znaleźć wszystkie zapisywalne urządzenia magazynujące podłączone do danej maszyny, niezależnie od tego , czy są zamontowane , czy nie .

Najgłupszym sposobem na zrobienie tego byłoby wypróbowanie każdego wpisu /devodpowiadającego zapisywalnym urządzeniom ( hd* and sd*) ......

Czy jest lepsze rozwiązanie, czy powinienem trzymać się tego?

królikarnia
źródło
Użyj libsysfs , zalecanego sposobu, aby zapytać jądro o podłączone urządzenia wszelkiego rodzaju.
David Schmitt,
Skoro mówisz o tym, że być może są montowane, myślę, że potrzebujesz listy partycji, a nie tylko dysków?
Mark Baker,
partycje też są w porządku, tak :) .. jeśli znam partycje, będę również wiedział, jakie fizyczne urządzenia są dostępne
warren
2
ponieważ Unix i Linux są już dostępne, to pytanie powinno zostać przeniesione tam
warren
3
@warren - o nie. Nadal powinny być zamknięte. Ponieważ Ty, jako właściciel posta, chcesz, aby ten wpis został przeniesiony, powinieneś oznaczyć go jako moderatora. Fakt, że chcesz go przenieść, będzie miał pewną wagę.
ChrisF

Odpowiedzi:

79

/proc/partitionswyświetli listę wszystkich urządzeń blokowych i partycji, które system rozpoznaje. Następnie możesz spróbować użyć, file -s <device>aby określić, jaki rodzaj systemu plików znajduje się na partycji, jeśli taki istnieje.

Steve Baker
źródło
4
To pomija na przykład napędy CD / DVD (wiem, że zwykle nie są one zapisywalne)
pixelbeat
Istnieje pewien limit tego, co można zrobić z powłoki. Większość innych sugestii, które są wyżej oceniane, albo nie działa z powłoki, nie działa, chyba że dbus jest uruchomiony, lub wyświetla listę urządzeń, które nie są faktycznie obecne / skonfigurowane. Jest to po prostu szybsze niż sprawdzanie wszystkich urządzeń / dev.
Steve Baker
5
lsblk, ten jest lepszy
emj365
1
/ proc / partitions podaje również literę dysku w Cygwin.
katriel
72

Zawsze możesz to zrobić fdisk -l co wydaje się działać całkiem nieźle, nawet na dziwnych konfiguracjach, takich jak urządzenia EC2 xvda.

Oto zrzut dla instancji m1.large:

root@ip-10-126-247-82:~# fdisk -l

Disk /dev/xvda1: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda1 doesn't contain a valid partition table

Disk /dev/xvda2: 365.0 GB, 365041287168 bytes
255 heads, 63 sectors/track, 44380 cylinders, total 712971264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda2 doesn't contain a valid partition table

Disk /dev/xvda3: 939 MB, 939524096 bytes
255 heads, 63 sectors/track, 114 cylinders, total 1835008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda3 doesn't contain a valid partition table

Podczas gdy mountmówi:

root@ip-10-126-247-82:~# mount
/dev/xvda1 on / type ext4 (rw)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/xvda2 on /mnt type ext3 (rw)

I /proc/partitionsmówi:

root@ip-10-126-247-82:~# cat /proc/partitions
major minor  #blocks  name

 202        1   10485760 xvda1
 202        2  356485632 xvda2
 202        3     917504 xvda3

Dygresja

Jak fdisk -ldziała, chciałbym sam się dowiedzieć.

Maxim Veksler
źródło
9
Nie jestem pewien, czy kiedykolwiek dowiedziałeś się, jak to fdisk -ldziała, ale pomyślałem, że możesz chcieć wiedzieć: czyta, /proc/partitionsa następnie iteruje, przez /sys/dev/block/*co zawiera zestaw dowiązań symbolicznych do prawdziwego odwzorowania urządzeń w sysfs. Możesz znaleźć te informacje, uruchamiając fdiskpod strace:)
1
Wspaniały! Dzięki. (OT: do bani widzieć to pytanie zablokowane. Powinien pojawić się przycisk „głosuj za cofnięciem blokady”).
Maxim Veksler,
1
jest dostępny dla użytkowników 3k rep i wyższych (przycisk „otwórz ponownie”).
naprawdę? Następnie muszę jak najszybciej dotrzeć do 3 km.
Maxim Veksler,
tak, zobacz stronę uprawnień , aby zapoznać się z pełną listą rzeczy, które możesz zrobić z większą liczbą przedstawicieli.
35

możesz także spróbować lsblk ... jest w util-linux ... ale mam też pytanie

fdisk -l /dev/sdl

brak wyników

grep sdl /proc/partitions      
   8      176   15632384 sdl
   8      177   15628288 sdl1

lsblk | grep sdl
sdl       8:176  1  14.9G  0 disk  
`-sdl1    8:177  1  14.9G  0 part  

fdisk jest dobry, ale niezbyt dobry… wygląda na to, że nie może „widzieć” wszystkiego

w moim konkretnym przykładzie mam pendrive z wbudowanym czytnikiem kart i widzę go tylko przy użyciu fdisk:

fdisk -l /dev/sdk

Disk /dev/sdk: 15.9 GB, 15931539456 bytes
255 heads, 63 sectors/track, 1936 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xbe24be24

   Device Boot      Start         End      Blocks   Id  System
/dev/sdk1   *        8192    31116287    15554048    c  W95 FAT32 (LBA)

ale nie karta (karta jest / dev / sdl)

również file -s jest nieefektywne ...

file -s /dev/sdl1
/dev/sdl1: sticky x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 255, hidden sectors 8192, dos < 4.0 BootSector (0x0)

to miłe ... ALE

fdisk -l /dev/sdb
/dev/sdb1            2048   156301487    78149720   fd  Linux raid autodetect
/dev/sdb2       156301488   160086527     1892520   82  Linux swap / Solaris

file -s /dev/sdb1
/dev/sdb1: sticky \0

aby zobaczyć informacje o dysku, do którego fdisk nie może uzyskać dostępu, możesz użyć parted:

parted /dev/sdl print

Model: Mass Storage Device (scsi)
Disk /dev/sdl: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  16.0GB  16.0GB  primary  ntfs




arted /dev/sdb print 
Model: ATA Maxtor 6Y080P0 (scsi)
Disk /dev/sdb: 82.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  80.0GB  80.0GB  primary                  raid
 2      80.0GB  82.0GB  1938MB  primary  linux-swap(v1)
Czarnoksiężnik
źródło
9

ls /sys/block

Mihai Limbășan
źródło
nie wyświetla partycji. Nie jestem pewien, czy o to chodziło w pierwotnym pytaniu, czy nie.
Mark Baker,
1
Nigdy nie wiedziałem o / sys / block - chociaż zawiera również listę urządzeń, których nie można zapisywać, takich jak napęd DVD
warren
1
Rzeczywiście, nie wyświetla partycji - możesz jednak sprawdzić podkatalogi, szukając wszystkich podkatalogów, które zawierają co najmniej pliki o nazwach „dev”, „stat” i „uevent” oraz podkatalogi o nazwie „holders”. Płyty DVD są nadal urządzeniami klasy pamięci :)
Mihai Limbășan
3
moocha, może trochę rozszerzysz swoją odpowiedź?
SpoonMeiser
2
@warren - prawdopodobnie / dev / dvd będzie po prostu aliasem dla urządzenia / dev / sd * lub / dev / hd *, więc i tak miałbyś ten problem.
SpoonMeiser
7

Korzystanie z HAL (jądro 2.6.17 i nowsze):


#! /bin/bash
hal-find-by-property --key volume.fsusage --string filesystem |
while read udi ; do
    # ignore optical discs
    if [[ "$(hal-get-property --udi $udi --key volume.is_disc)" == "false" ]]; then
        dev=$(hal-get-property --udi $udi --key block.device)   
        fs=$(hal-get-property --udi $udi --key volume.fstype) 
        echo $dev": "$fs
    fi 
done
ZungBang
źródło
4

Nowoczesne systemy linuxowe zwykle mają wpisy w / dev tylko dla istniejących urządzeń, więc przejście przez hda * i sda *, jak sugerujesz, działałoby całkiem dobrze.

W przeciwnym razie w / proc może być coś, czego możesz użyć. Po szybkim spojrzeniu na to, powiedziałbym, że / proc / partitions wygląda na to, że może zrobić to, czego potrzebujesz.

Mark Baker
źródło
2

libsysfs wygląda na potencjalnie przydatne, ale nie bezpośrednio ze skryptu powłoki. Jest dołączony do niego program o nazwie systool, który zrobi to, co chcesz, chociaż może być łatwiej po prostu zajrzeć bezpośrednio do / sys niż używać innego programu, który zrobi to za Ciebie.

Mark Baker
źródło