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?


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.


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ć.


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)

9

ls /sys/block


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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.