Linux 시스템에 연결된 모든 저장 장치 찾기 [닫기]


109

마운트 여부에 관계없이 주어진 머신에 연결된 쓰기 가능한 저장 장치를 모두 찾아야합니다 .

이를 수행하는 멋진 방법 은 쓰기 가능한 장치 에 해당하는 모든 항목 을 시도/dev 하는 것입니다 ( hd* and sd*) ......

더 나은 솔루션이 있습니까, 아니면이 솔루션을 고수해야합니까?


모든 종류의 연결된 장치에 대해 커널을 쿼리하는 권장 방법 인 libsysfs를 사용하십시오 .
David Schmitt

마운트 될 수 있다고 말했기 때문에 디스크뿐만 아니라 파티션 목록을 원하십니까?
Mark Baker

파티션도 괜찮습니다. 예 :) .. 파티션을 알고 있다면 어떤 물리적 장치를 사용할 수 있는지도 알 수 있습니다
warren

2
이후 유닉스 및 리눅스를 사용할 수 있습니다,이 질문이 마이그레이션해야
워렌

3
@warren-오 안돼. 여전히 닫혀 있어야합니다. 게시물 소유자는이를 이동하기를 원하므로 운영자의주의를 끌도록 플래그를 지정해야합니다. 당신이 그것을 움직이기를 원한다는 사실은 약간의 무게를 지닐 것입니다.
ChrisF

답변:


79

/proc/partitions시스템이 인식하는 모든 블록 장치와 파티션을 나열합니다. 그런 다음를 사용 file -s <device>하여 파티션에 어떤 종류의 파일 시스템이 있는지 확인할 수 있습니다 .


4
예를 들어 이것은 CD / DVD 드라이브를 생략합니다 (일반적으로 쓰기가 불가능하다는 것을 알고 있습니다)
pixelbeat

셸에서 할 수있는 작업에는 제한이 있습니다. 더 높은 등급의 다른 제안 대부분은 셸에서 작동하지 않거나, dbus가 실행 중이 아니면 작동하지 않거나, 실제로 존재 / 구성되지 않은 장치를 나열합니다. 이것은 모든 / dev 장치를 확인하는 것보다 빠릅니다.
Steve Baker

5
이 하나 더 lsblk
emj365

1
/ proc / partitions는 Cygwin에서도 드라이브 문자를 제공합니다.
katriel

72

fdisk -lEC2 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작동 하는지 는 확실하지 않지만 알고 싶을 것이라고 생각했습니다 . sysfs에서 장치의 실제 재현에 대한 심볼릭 링크 집합을 읽고 /proc/partitions반복 /sys/dev/block/*합니다. 당신은 실행하여이 정보를 찾을 수 있습니다 fdisk아래에 strace:)

1
큰! 감사. (OT :이 질문이 잠겨있는 것을보고 짜증이납니다. "잠금을 되돌리려면 투표"버튼이 있어야합니다.)
Maxim Veksler 2013

1
3k rep 이상의 사용자를위한 것입니다 ( "다시 열기"버튼).

오 정말? 그런 다음 가능한 빨리 3K에 도달해야합니다.
Maxim Veksler 2013

더 많은 담당자와 함께 할 수있는 작업의 전체 목록은 권한 페이지 를 참조하십시오 .

35

lsblk 를 시도해 볼 수도 있습니다 ... 유틸리티 리눅스에 있습니다 ...하지만 질문이 있습니다.

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는 비효율적입니다 ...

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를 사용할 수 있습니다.

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


파티션을 나열하지 않습니다. 그것이 원래의 질문이 원했던 것인지 아닌지 확실하지 않습니다.
Mark Baker

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 / partitions가 필요한 것을 할 수 있다고 말했을 것입니다.


2

libsysfs는 잠재적으로 유용 해 보이지만 쉘 스크립트에서 직접 가져온 것은 아닙니다. 원하는 것을 할 수있는 systool이라는 프로그램이 있습니다. 다른 프로그램을 사용하는 것보다 / sys를 직접 보는 것이 더 쉬울 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.