【问题标题】:Find all storage devices attached to a Linux machine [closed]查找连接到 Linux 机器的所有存储设备 [关闭]
【发布时间】:2017-05-21 22:20:50
【问题描述】:

我需要查找连接到给定机器的所有可写存储设备,无论是否已安装。

这样做的愚蠢方法是尝试 /dev 中对应于可写设备 (hd* and sd*) 的每个条目......

有没有更好的解决方案,还是我应该坚持这个?

【问题讨论】:

  • 使用libsysfs,这是向内核查询各种附加设备的推荐方法。
  • 既然你说它们可能被挂载了,我猜你想要一个分区列表,而不仅仅是磁盘?
  • 分区也很好,是的:) .. 如果我知道分区,我也会知道哪些物理设备可用
  • 既然Unix & Linux现在可用,这个问题应该迁移到那里
  • @warren - 哦不。他们仍然应该关闭。当您作为帖子所有者希望此移动时,您应该将其标记为版主注意。您希望它移动的事实会带来一些影响。

标签: linux bash shell


【解决方案1】:

/proc/partitions 将列出系统识别的所有块设备和分区。然后,您可以尝试使用file -s <device> 来确定分区上存在哪种文件系统(如果有)。

【讨论】:

  • 这会忽略 CD/DVD 驱动器(我知道它们通常不可写)
  • 在 shell 中可以做的事情是有一定限制的。大多数其他评分较高的建议要么在 shell 中不起作用,除非 dbus 正在运行,否则将不起作用,或者将列出实际不存在/未配置的设备。这比检查所有 /dev 设备要快。
  • lsblk 这个更好
  • /proc/partitions 也为您提供 Cygwin 中的驱动器号。
【解决方案2】:

您始终可以使用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 的工作原理是我自己很想了解的。

【讨论】:

  • 不确定你是否知道fdisk -l 是如何工作的,但我想你可能想知道:它读取/proc/partitions,然后遍历/sys/dev/block/*,其中包含一组指向设备在 sysfs 中的真实代表。您可以通过在strace 下运行fdisk 找到此信息:)
  • 太棒了!谢谢。 (OT:看到这个问题被锁定真是糟透了。应该有一个“投票恢复锁定”按钮)。
  • 有 3k 代表及更高的用户(“重新打开”按钮)。
  • 哦,真的吗?然后我必须尽快达到 3k。
  • 是的,请参阅privileges page 了解更多代表可以做的事情的完整列表。
【解决方案3】:

你也可以试试 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)

另外,文件 -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)

【讨论】:

    【解决方案4】:

    ls /sys/block

    【讨论】:

    • 不列出分区。我不确定这是否是原始问题想要的。
    • 我从来不知道 /sys/block - 虽然它也列出了不可写的设备,例如 DVD 驱动器
    • 确实它没有列出分区——你可以检查子目录,查找所有子目录至少包含名为“dev”、“stat”和“uevent”的文件以及名为“holders”的子目录。 DVD 仍然是存储类设备 :)
    • moocha,你为什么不扩大你的答案呢?
    • @warren - 大概 /dev/dvd 只是 /dev/sd* 或 /dev/hd* 设备的别名,所以无论如何你都会遇到这个问题。
    【解决方案5】:

    使用 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
    

    【讨论】:

      【解决方案6】:

      现代 linux 系统通常只会在 /dev 中包含现有设备的条目,因此按照您的建议通过 hda* 和 sda* 会工作得很好。

      否则,您可以使用 /proc 中的某些内容。快速浏览一下,我会说 /proc/partitions 看起来可以满足您的需求。

      【讨论】:

        【解决方案7】:

        libsysfs 看起来确实很有用,但不是直接来自 shell 脚本。它附带了一个名为 systool 的程序,它可以做你想做的事,尽管直接在 /sys 中查找可能比使用另一个程序为你做这件事更容易。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-01
          • 2013-09-23
          • 2018-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-04
          • 2012-10-15
          相关资源
          最近更新 更多