Знайти всі пристрої зберігання даних, приєднані до машини Linux [закрито]


109

У мене є потреба знайти всі записувані пристрої зберігання даних, приєднані до певної машини, незалежно від того, вони встановлені чи ні .

Дурним способом зробити це було б спробувати кожен запис у /devвідповідності до записуваних пристроїв ( hd* and sd*) ......

Чи є краще рішення чи я повинен дотримуватися цього?


Використовуйте libsysfs , рекомендований спосіб запитувати ядро ​​про приєднані пристрої всіх типів.
Девід Шмітт

Оскільки ви говорите про них, можливо, вони змонтовані, я думаю, ви хочете список розділів, а не лише дисків?
Марк Бейкер

розділи теж добре, так :). Якщо я знаю розділи, я також буду знати, які доступні фізичні пристрої
warren

2
Оскільки Unix та Linux тепер доступні, це питання слід перенести туди
warren

3
@warren - о ні. Їх все одно слід закрити. Оскільки ви, як власник допису, бажаєте, щоб це перемістилося, ви повинні позначити його для уваги модератора. Те, що ви хочете, щоб він перемістився, матиме певну вагу.
ChrisF

Відповіді:


79

/proc/partitionsвідобразить список усіх блокових пристроїв та розділів, які система розпізнає. Потім можна спробувати file -s <device>визначити, яка файлова система присутня на розділі, якщо така є.


4
Наприклад, це опускає приводи CD / DVD (я знаю, що вони зазвичай не
підлягають

Існує певне обмеження щодо того, що можна зробити з оболонки. Більшість інших пропозицій, які мають більш високий рейтинг, або не працюють з оболонки, не працюватимуть, поки не запущений dbus, або перерахують пристрої, які насправді відсутні / налаштовані. Це просто швидше, ніж перевірка всіх пристроїв / dev.
Стів Бейкер

5
lsblk цей краще
emj365

1
/ proc / розділи також надають літеру диска в Cygwin.
катріел

72

Ви завжди можете зробити те, fdisk -lщо, здається, працює досить добре, навіть на дивних настройках, таких як EC2 xvda пристрої.

Ось дамп для екземпляра 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

Поки mountкаже:

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)

І /proc/partitionsкаже:

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

Бічна примітка

Як fdisk -lпрацює, я хотів би знати сам.


9
Не впевнений, чи ви коли-небудь розробляли, як це fdisk -lпрацює, але я подумав, що ви, можливо, хочете дізнатися: він читає, /proc/partitionsа потім повторює, /sys/dev/block/*який містить набір символьних посилань на справжній репр пристрою в sysfs. Дізнатися цю інформацію можна, запустивши fdiskпід strace:)

1
Чудово! Дякую. (OT: Відмовляється, щоб це запитання було заблоковано. Кнопка "голосування за скасування блокування" повинна бути голосовою)
Максим Векслер

1
є для користувачів 3k повтор і вище (кнопка "повторно відкрити").

о, справді? Тоді я повинен досягти 3k якомога швидше.
Максим Векслер

так, перегляньте сторінку привілеїв для повного переліку речей, які ви можете зробити з більшою кількістю представників.

35

Ви також можете спробувати lsblk ... знаходиться в util-linux ... але у мене теж питання

fdisk -l /dev/sdl

результату немає

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 - це добре, але не так добре ... здається, він не може "бачити" все

в моєму конкретному прикладі у мене є палиця, в якій також є вбудований картридер, і я бачу лише паличку за допомогою 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)

але не карта (карта, яка / dev / sdl)

також файли -еефективні ...

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)

це приємно ... АЛЕ

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

щоб побачити інформацію про диск, до якого не можна отримати доступ до fdisk, можна скористатися розділеним:

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


не перелічує розділи. Я не впевнений, цього хотіли оригінальні запитання чи ні.
Марк Бейкер

1
Я ніколи не знав про / sys / block - хоча він також перераховує пристрої, які не підлягають запису, як-от привід DVD
warren

1
Дійсно, він не перераховує розділи - ви можете перевірити підкаталоги, шукаючи всі підкаталоги, що містять мінімум файлів з назвою "dev", "stat" та "uevent" та підкаталоги з "holders". DVD-диски все ще є пристроями класу зберігання :)
Mihai Limbășan

3
moocha, чому б ти не розширив свою відповідь трохи?
SpoonMeiser

2
@warren - імовірно, / dev / dvd буде просто псевдонімом пристрою / dev / sd * або / dev / hd *, тому у вас все одно виникне ця проблема.
SpoonMeiser

7

Використання HAL (ядро 2.6.17 і вище):


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

Сучасні системи Linux зазвичай мають записи в / dev лише для існуючих пристроїв, тому проходження через hda * та sda *, як ви пропонуєте, буде працювати досить добре.

В іншому випадку ви можете використовувати щось у / proc, яке ви можете використовувати. Швидкий погляд там, я б сказав, що / proc / розділи виглядають так, що вони можуть робити все, що вам потрібно.


2

libsysfs виглядає потенційно корисним, але не безпосередньо зі сценарію оболонки. Існує програма, яка поставляється разом із цим, називається systool, яка буде робити те, що ви хочете, хоча, можливо, простіше просто заглянути в / sys, а не використовувати іншу програму, щоб зробити це за вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.