Disks and File System

In this section you will learn how to get disks information, file system information, disk I/O stats and file system stats:

For function reference and examples we assume, that we imported systeminformation as follows:

    const si = require('systeminformation');

## Disk Layout, Block Devices and Disks IO

All functions in this section return a promise or can be called with a callback function (parameter cb in the function reference)

Function | Result object | Linux | BSD | Mac | Win | Sun | Comments
--- | --- | --- | --- | --- | --- | --- | ---
si.diskLayout(cb) | [{...}] | X |  | X | X |  | physical disk layout (array)
| [0].device | X |  | X |  |  | e.g. /dev/sda
| [0].type | X |  | X | X |  | HD, SSD, NVMe
| [0].name | X |  | X | X |  | disk name
| [0].vendor | X |  |  | X |  | vendor/producer
| [0].size | X |  | X | X |  | size in bytes
| [0].totalCylinders |  |  |  | X |  | total cylinders
| [0].totalHeads |  |  |  | X |  | total heads
| [0].totalTracks |  |  |  | X |  | total tracks
| [0].totalSectors |  |  |  | X |  | total sectors
| [0].tracksPerCylinder |  |  |  | X |  | tracks per cylinder
| [0].sectorsPerTrack |  |  |  | X |  | sectors per track
| [0].bytesPerSector |  |  |  | X |  | bytes per sector
| [0].firmwareRevision | X |  | X | X |  | firmware revision
| [0].serialNum | X |  | X | X |  | serial number
| [0].interfaceType | X |  |  | X |  | SATA, PCIe, ...
| [0].smartStatus | X |  | X | X |  | S.M.A.R.T Status (see Known Issues)
| [0].temperature | X |  |  |  |  | S.M.A.R.T temperature (if available)
| [0].smartData | X |  |  | X |  | full S.M.A.R.T data from smartctl requires at least smartmontools 7.0 (see Known Issues)
| ##### Example
    const si = require('systeminformation');
    si.diskLayout().then(data => console.log(data));
    [
      {
        device: '/dev/nvme0n1',
        type: 'NVMe',
        name: 'SAMSUNG xxxxxxxxxxxx-xxxx',
        vendor: 'Samsung',
        size: 1024209543168,
        bytesPerSector: null,
        totalCylinders: null,
        totalHeads: null,
        totalSectors: null,
        totalTracks: null,
        tracksPerCylinder: null,
        sectorsPerTrack: null,
        firmwareRevision: '',
        serialNum: '...serial....',
        interfaceType: 'PCIe',
        smartStatus: 'unknown',
        smartData: {
          json_format_version: [Array],
          smartctl: [Object],
          device: [Object],
          model_name: 'SAMSUNG xxxxxxxxxxxx-xxxx',
          serial_number: '...serial....',             // full structure
          ...                                         // see index.d.ts
        }
      },
      {
        ...
      }
    ]
si.blockDevices(cb) | [{...}] | X |  | X | X |  | returns array of disks, partitions, raids and roms
| [0].name | X |  | X | X |  | name
| [0].type | X |  | X | X |  | type
| [0].fsType | X |  | X | X |  | file system type (e.g. ext4)
| [0].mount | X |  | X | X |  | mount point
| [0].size | X |  | X | X |  | size in bytes
| [0].physical | X |  | X | X |  | physical type (HDD, SSD, CD/DVD)
| [0].uuid | X |  | X | X |  | UUID
| [0].label | X |  | X | X |  | label
| [0].model | X |  | X |  |  | model
| [0].serial | X |  |  | X |  | serial
| [0].removable | X |  | X | X |  | serial
| [0].protocol | X |  | X |  |  | protocol (SATA, PCI-Express, ...)
| ##### Example
    const si = require('systeminformation');
    si.blockDevices().then(data => console.log(data));
    [
      {
        name: 'nvme0n1',
        type: 'disk',
        fsType: '',
        mount: '',
        size: 1024209543168,
        physical: 'SSD',
        uuid: '',
        label: '',
        model: 'SAMSUNG xxxxxxxxxxxx-xxxx',
        serial: '... serial ...',
        removable: false,
        protocol: 'nvme',
        group: undefined
      },
      {
        ...
      }
    ]
si.disksIO(cb) | {...} | X |  | X |  |  | current transfer stats
| rIO | X |  | X |  |  | read IOs on all mounted drives
| wIO | X |  | X |  |  | write IOs on all mounted drives
| tIO | X |  | X |  |  | write IOs on all mounted drives
| rIO_sec | X |  | X |  |  | read IO per sec (* see notes)
| wIO_sec | X |  | X |  |  | write IO per sec (* see notes)
| tIO_sec | X |  | X |  |  | total IO per sec (* see notes)
| rWaitTime | X |  |  |  |  | read IO request time
| wWaitTime | X |  |  |  |  | write IO request time
| tWaitTime | X |  |  |  |  | total IO request time
| rWaitPercent | X |  |  |  |  | read IO request time percent
| wWaitPercent | X |  |  |  |  | write IO request time percent
| tWaitPercent | X |  |  |  |  | total IO request time percent
| ms | X |  | X |  |  | interval length (for per second values)
| ##### Example
    const si = require('systeminformation');
    setInterval(function() {
      si.disksIO().then(data => {
        console.log(data);
      })
    }, 1000)
    {                           // first call
      rIO: 899825,
      wIO: 932331,
      tIO: 1832156,
      rIO_sec: null,
      wIO_sec: null,
      tIO_sec: null,
      ms: 0
    }
    {                           // second call
      rIO: 899863,
      wIO: 932331,
      tIO: 1832194,
      rIO_sec: 38.5395537525355,
      wIO_sec: 0,
      tIO_sec: 38.5395537525355,
      ms: 986
    }...

## File System and File System Stats

Function | Result object | Linux | BSD | Mac | Win | Sun | Comments
--- | --- | --- | --- | --- | --- | --- | ---
si.fsSize(cb) | [{...}] | X | X | X | X |  | returns array of mounted file systems
| [0].fs | X | X | X | X |  | name of file system
| [0].type | X | X | X | X |  | type of file system
| [0].size | X | X | X | X |  | sizes in bytes
| [0].used | X | X | X | X |  | used in bytes
| [0].available | X | X | X | X |  | available in bytes
| [0].use | X | X | X | X |  | used in %
| [0].mount | X | X | X | X |  | mount point
| ##### Example
    const si = require('systeminformation');
    si.fsSize().then(data => console.log(data));
    [
      {
        fs: '/dev/md2',
        type: 'ext4',
        size: 972577361920,
        used: 59142635520,
        available: 913434726400,
        use: 6.08,
        mount: '/'
      },
      {
        ...
      }
    ]
si.fsOpenFiles(cb) | {...} | X | X | X |  |  | count max/allocated file descriptors
| max | X | X | X |  |  | count max
| allocated | X | X | X |  |  | count allocated
| available | X | X | X |  |  | count available
| ##### Example
    const si = require('systeminformation');
    si.fsOpenFiles().then(data => console.log(data));
    {
      max: 6566555,
      allocated: 1856,
      available: 0
    }
si.fsStats(cb) | {...} | X |  | X |  |  | current transfer stats
| rx | X |  | X |  |  | bytes read since startup
| wx | X |  | X |  |  | bytes written since startup
| tx | X |  | X |  |  | total bytes read + written since startup
| rx_sec | X |  | X |  |  | bytes read / second (* see notes)
| wx_sec | X |  | X |  |  | bytes written / second (* see notes)
| tx_sec | X |  | X |  |  | total bytes reads + written / second
| ms | X |  | X |  |  | interval length (for per second values)
| ##### Example
    const si = require('systeminformation');
    setInterval(function() {
      si.fsStats().then(data => {
        console.log(data);
      })
    }, 1000)
    {                             // first call
      rx: 14015849472,
      wx: 15316003328,
      tx: 29331852800,
      rx_sec: null,
      wx_sec: null,
      tx_sec: null,
      ms: 0
    }
    {                             // second call
      rx: 14015849472,
      wx: 15316007424,
      tx: 29331856896,
      rx_sec: 0,
      wx_sec: 4083.748753738784,
      tx_sec: 4083.748753738784,
      ms: 1003
    }...

#### Getting correct stats values

In disksIO() and fsStats() the results / sec. values (rx_sec, IOPS, ...) are calculated correctly beginning with the second call of the function. It is determined by calculating the difference of transferred bytes / IOs divided by the time between two calls of the function.

The first time you are calling one of this functions, you will get -1 for transfer rates. The second time, you should then get statistics based on the time between the two calls ...

So basically, if you e.g. need a values for filesystem stats stats every second, your code should look like this:

    const si = require('systeminformation');

    setInterval(function() {
        si.fsStats().then(data => {
            console.log(data);
        })
    }, 1000)

Beginning with the second call, you get file system transfer values per second.