Temukan semua perangkat penyimpanan yang terpasang ke mesin Linux [tertutup]

109

Saya memiliki kebutuhan untuk menemukan semua perangkat penyimpanan yang dapat ditulis yang terpasang ke mesin tertentu, baik dipasang maupun tidak .

Cara tolol untuk melakukan ini adalah dengan mencoba setiap entri /devyang sesuai dengan perangkat yang dapat ditulis ( hd* and sd*) ......

Apakah ada solusi yang lebih baik, atau haruskah saya tetap menggunakan yang ini?

warren
sumber
Gunakan libsysfs , cara yang disarankan untuk menanyakan kernel tentang semua jenis perangkat yang terpasang.
David Schmitt
Karena Anda berbicara tentang mereka mungkin sedang dipasang, saya kira Anda ingin daftar partisi, bukan hanya disk?
Mark Baker
partisi juga baik-baik saja, ya :) .. jika saya tahu partisi, saya juga akan tahu perangkat fisik apa yang tersedia
warren
2
karena Unix & Linux sekarang tersedia, pertanyaan ini harus dipindahkan ke sana
warren
3
@warren - oh tidak. Mereka masih harus ditutup. Karena Anda sebagai pemilik postingan menginginkan ini dipindahkan, Anda harus menandainya untuk perhatian moderator. Fakta bahwa Anda ingin memindahkannya akan membawa beban.
ChrisF

Jawaban:

79

/proc/partitionsakan mencantumkan semua perangkat blok dan partisi yang dikenali sistem. Anda kemudian dapat mencoba menggunakan file -s <device>untuk menentukan jenis sistem file apa yang ada di partisi, jika ada.

Steve Baker
sumber
4
Ini menghilangkan drive CD / DVD misalnya (saya tahu mereka biasanya tidak dapat ditulis)
pixelbeat
Ada semacam batasan tentang apa yang dapat Anda lakukan dari shell. Sebagian besar saran lain yang berperingkat lebih tinggi tidak berfungsi dari shell, tidak akan berfungsi kecuali dbus sedang berjalan, atau akan mencantumkan perangkat yang sebenarnya tidak ada / dikonfigurasi. Ini lebih cepat daripada memeriksa semua perangkat / dev.
Steve Baker
5
lsblk yang ini lebih baik
emj365
1
/ proc / partitions memberi Anda huruf drive di Cygwin juga.
katriel
72

Anda selalu dapat melakukan fdisk -lyang tampaknya berfungsi dengan baik, bahkan pada pengaturan aneh seperti perangkat EC2 xvda.

Berikut ini dump untuk instance 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

Sementara mountmengatakan:

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)

Dan /proc/partitionsberkata:

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

Catatan Samping

Bagaimana fdisk -lbekerja adalah sesuatu yang ingin saya ketahui sendiri.

Maxim Veksler
sumber
9
Tidak yakin apakah Anda pernah mengetahui cara fdisk -lkerjanya, tetapi saya pikir Anda mungkin ingin tahu: ini membaca /proc/partitionsdan kemudian melakukan iterasi /sys/dev/block/*yang berisi satu set symlink ke repr perangkat yang sebenarnya di sysfs. Anda dapat menemukan informasi ini dengan menjalankan fdiskbawah strace:)
1
Bagus! Terima kasih. (OT: Menyebalkan melihat pertanyaan ini terkunci. Harus ada tombol "pilih untuk mengembalikan kunci").
Maxim Veksler
1
ada untuk pengguna dengan rep 3k dan lebih tinggi (tombol "buka kembali").
Oh benarkah? Maka saya harus mencapai 3k secepat mungkin.
Maxim Veksler
ya, lihat halaman hak istimewa untuk daftar lengkap hal-hal yang dapat Anda lakukan dengan lebih banyak perwakilan.
35

Anda juga dapat mencoba lsblk ... di util-linux ... tetapi saya punya pertanyaan juga

fdisk -l /dev/sdl

tidak ada hasil

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 bagus tapi tidak terlalu bagus ... sepertinya fdisk tidak bisa "melihat" semuanya

dalam contoh khusus saya, saya memiliki tongkat yang juga memiliki pembaca kartu di dalamnya dan saya hanya dapat melihat tongkat menggunakan 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)

tetapi bukan kartunya (kartu menjadi / dev / sdl)

juga, file -s tidak efisien ...

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)

itu bagus ... TAPI

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

untuk melihat informasi tentang disk yang tidak dapat diakses oleh fdisk, anda dapat menggunakan 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)
Sang penyihir
sumber
9

ls /sys/block

Mihai Limbășan
sumber
tidak mencantumkan partisi. Saya tidak yakin apakah itu yang diinginkan pertanyaan awal atau tidak.
Mark Baker
1
Saya tidak pernah tahu tentang / sys / block - meskipun itu juga mencantumkan perangkat yang tidak dapat ditulis, seperti drive DVD
warren
1
Memang itu tidak mencantumkan partisi - Anda dapat memeriksa subdirektorinya, mencari semua subdirektori yang memiliki file minimum bernama "dev", "stat" dan "uevent" dan subdirektori bernama "holder". DVD masih merupakan perangkat kelas penyimpanan :)
Mihai Limbășan
3
moocha, kenapa tidak Anda memperluas jawaban Anda sedikit?
SpoonMeiser
2
@warren - mungkin / dev / dvd hanya akan menjadi alias untuk perangkat / dev / sd * atau / dev / hd *, jadi Anda akan mengalami masalah ini.
SpoonMeiser
7

Menggunakan HAL (kernel 2.6.17 dan yang lebih baru):


#! /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
sumber
4

Sistem linux modern biasanya hanya memiliki entri di / dev untuk perangkat yang ada, jadi melalui hda * dan sda * seperti yang Anda sarankan akan bekerja dengan cukup baik.

Jika tidak, mungkin ada sesuatu di / proc yang bisa Anda gunakan. Dari sekilas melihat di sana, saya telah mengatakan / proc / partisi sepertinya bisa melakukan apa yang Anda butuhkan.

Mark Baker
sumber
2

libsysfs memang terlihat berpotensi berguna, tetapi tidak langsung dari skrip shell. Ada program yang menyertainya bernama systool yang akan melakukan apa yang Anda inginkan, meskipun mungkin lebih mudah untuk hanya melihat / sys secara langsung daripada menggunakan program lain untuk melakukannya untuk Anda.

Mark Baker
sumber