How can I list the hard drive and all its partitions including size from terminal?

I have Ubuntu server 12.04 installed with no GUI. I would like to list my hard drive and it's partitions along with how big each partition is using the command line.


Solution 1:

Here are a few ways:

  • If you have an MBR partition table:

    terdon@oregano ~ $ sudo fdisk -l
    Disk /dev/sda: 500.1 GB, 500107862016 bytes
    255 heads, 63 sectors/track, 60801 cylinders, total 976773168 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: 0x4b66b5d5
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1              63       80324       40131   de  Dell Utility
    /dev/sda2   *       81920    30801919    15360000    7  HPFS/NTFS/exFAT
    /dev/sda3        30801920   194643539    81920810    7  HPFS/NTFS/exFAT
    /dev/sda4       194643601   976773119   391064759+   f  W95 Ext'd (LBA)
    /dev/sda5       194643603   198836504     2096451    c  W95 FAT32 (LBA)
    /dev/sda6       342951936   960387071   308717568   83  Linux
    /dev/sda7       198840320   342949887    72054784   83  Linux
    /dev/sda8       960389120   976773119     8192000   82  Linux swap / Solaris
    

    or sudo sfdidk -l

    These do not give particularly human readable output though. The next choices are better.

  • For both GPT and MBR partition tables:

    terdon@oregano ~ $ sudo parted -l
    Model: ATA ST9500420AS (scsi)
    Disk /dev/sda: 500GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End     Size    Type      File system     Flags
     1      32.3kB  41.1MB  41.1MB  primary   fat16           diag
     2      41.9MB  15.8GB  15.7GB  primary   ntfs            boot
     3      15.8GB  99.7GB  83.9GB  primary   ntfs
     4      99.7GB  500GB   400GB   extended                  lba
     5      99.7GB  102GB   2147MB  logical   fat32           lba
     7      102GB   176GB   73.8GB  logical   ext4
     6      176GB   492GB   316GB   logical   ext4
     8      492GB   500GB   8389MB  logical   linux-swap(v1)
    
    
    Model: ST950032 5AS (scsi)
    Disk /dev/sdb: 500GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End    Size   Type     File system  Flags
     1      32.3kB  500GB  500GB  primary  ntfs
    
  • lsblk

    terdon@oregano ~ $ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0 465.8G  0 disk 
    ├─sda1   8:1    0  39.2M  0 part 
    ├─sda2   8:2    0  14.7G  0 part 
    ├─sda3   8:3    0  78.1G  0 part 
    ├─sda4   8:4    0     1K  0 part 
    ├─sda5   8:5    0     2G  0 part 
    ├─sda6   8:6    0 294.4G  0 part /home
    ├─sda7   8:7    0  68.7G  0 part /
    └─sda8   8:8    0   7.8G  0 part [SWAP]
    sdb      8:16   0 465.8G  0 disk 
    └─sdb1   8:17   0 465.8G  0 part /test
    sr0     11:0    1  1024M  0 rom  
    
  • Install inxi then run

    terdon@oregano ~ $ inxi -D
    Drives:    HDD Total Size: 1000.2GB (70.1% used) 1: id: /dev/sda model: ST9500420AS size: 500.1GB 
               2: id: /dev/sdb model: 5AS size: 500.1GB 
    

Solution 2:

Here's couple of other approaches:

lshw

The short version of lshw conveniently lists the size of disks in the description

sudo lshw -short | awk '/disk|volume/'            
/0/1/0.0.0    /dev/sda    disk        120GB Radeon R7
/0/1/0.0.0/1  /dev/sda1   volume      111GiB EXT4 volume
/0/2/0.0.0    /dev/cdrom  disk        DVDRAM GT20N

And for more detailed info use lshw -class volume,disk

udiscsctl

udiscsctl has info option which coupled with -b (for block-device) flag, can show detailed information. Using a simple for loop and awk, we can make it show partition and size information specifically. Here is my example:

$ for device in /dev/sd* ; do udisksctl info  -b $device | awk '/[[:blank:]]Device:/; /Size/' ;done                
    Device:                     /dev/sda
    Size:                       120034123776
    Device:                     /dev/sda1
    Size:                       120032591872
    Size:               120032591872

df command

df command shows information about all currently mounted filesystems. Again, we can use this command directly, but also clean up the output using awk

df -h | awk 'NR==1 ;/\/dev\/sd*/'                                                                                
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       110G   68G   37G  66% /

Here we just print the header and use -h flag that makes size be printed in human-readable format

/sys/class/block/sd* files

Inside /sys/class/block/ folder you will find files related to block devices( which typically refer to physical memory devices ) . In particular we want to focus on any file that starts with sd letters.

For instance, I have one hard drive with only one partition. Thus /sys/class/block/sda refers to my whole hard-drive, while /sys/class/block/sda1 refers to my Ubuntu partition.

Inside each folder for each device, you will find the size file , which lists how many blocks of 512 MB there are on the device. So the true size is number of blocks x 521.

Again, with little command line magic, we get:

$ for device in /sys/class/block/sd*; do printf "%s " $device; bc <<< "$(cat $device/size)*512" ; done             
/sys/class/block/sda 120034123776
/sys/class/block/sda1 120032591872

Or a bit shorter with awk:

$ awk '{print substr(FILENAME,18)" "$1*512}' /sys/class/block/sd*/size                                             
sda/size 120034123776
sda1/size 120032591872