exodist has asked for the wisdom of the Perl Monks concerning the following question:

I need my script to get the size (Preferably in bytes) of a hard drive, I tried this: my $Size = (-s "/dev/sda4"); but it always sets $Size to 0.
  • Comment on get the size of a special device (drive)

Replies are listed 'Best First'.
Re: get the size of a special device (drive)
by blazar (Canon) on May 30, 2007 at 21:18 UTC
    I need my script to get the size (Preferably in bytes) of a hard drive, I tried this: my $Size = (-s "/dev/sda4"); but it always sets $Size to 0.

    Since this seems very OS-specific it may be sensible to use OS-specific tools. Anyway a module like Sys::Filesystem seems like a good start. I found it with a few seconds' CPAN search for Linux device. Other searches may return more appropriate results for you.

      Unfortunately what I am writing is a filesystem... But I went browsing through /proc and found /proc/partitions, when I cat that it shows partitions and sizes in blocks (1024 bytes each I believe) Is this standard and reliable from linux system to linux system?
        Unfortunately what I am writing is a filesystem... But I went browsing through /proc and found /proc/partitions, when I cat that it shows partitions and sizes in blocks (1024 bytes each I believe) Is this standard and reliable from linux system to linux system?

        I think something changed between 2.4 and 2.6, but I wouldn't take my own word as the ultimate Truth™ as I'm far from being an expert...

Re: get the size of a special device (drive)
by Joost (Canon) on May 30, 2007 at 21:21 UTC
      /sys/block/*drivename*/size is useful, it looks liek it uses 512k block size?
Re: get the size of a special device (drive)
by almut (Canon) on May 31, 2007 at 00:07 UTC

    You could also parse the output of good ol' fdisk — e.g. fdisk -l -u /dev/hda  (-u to display the info in units of sectors (the size of which it'll tell you, too)). Problem might be (depending on context) that it'll need to be run as root...

Re: get the size of a special device (drive)
by BrowserUk (Patriarch) on May 31, 2007 at 00:16 UTC
Re: get the size of a special device (drive)
by Util (Priest) on May 31, 2007 at 03:20 UTC

    I don't have SCSI (sdX) drives on my system, but my IDE drive sizes are easy to determine.

    $ cat /proc/ide/ide0/hda/capacity 78165360 $ cat /proc/ide/ide0/hdb/capacity 40718160 $ cat /proc/ide/ide1/hdd/capacity 241254720

    Trimmed output from `cfdisk` Disk Drive: /dev/hda Size: 40020664320 bytes, 40.0 GB Disk Drive: /dev/hdb Size: 20847697920 bytes, 20.8 GB Disk Drive: /dev/hdd Size: 123522416640 bytes, 123.5 GB

    The /proc/ide/ideX/hdX/capacity size is in 512 byte blocks, and matches *exactly* (after multiplying by 512) with the size reported by `cfdisk`. Hopefully, there are analogous /proc/scsi/*/capacity files.

    Update: the `capacity` files I describe above exactly match the `/sys/block/*drivename*/size` files that Joost mentioned. The `size` files are easier to navigate to. I can confirm that the units are exact 512 byte blocks.

      Thank you, using /sys/block/DriveName/size is my plan now. Since it has been confirmed it uses b12byte block size both for me and for others here I am going to trust it until I find reasons I shouldn't.