You are writing some sort of C or C++ program. You want to determine the size of a block device, for example of /dev/hda2. You are using lseek or lseek64 but you run into one problem:
lseek does not work for raw devices like /dev/raw/raw1 since they are character devices. Seeking works, but always returns 0.
The following solution is tested on Kernel 2.6.4 (SuSE 9.1): Use the ioctl() method BLKGETSIZE on the device:
#include <fcntl.h>
#include <linux/fs.h>
main(int argc, char **argv)
{
int fd;
unsigned long numblocks=0;
fd = open(argv[1], O_RDONLY);
ioctl(fd, BLKGETSIZE, &numblocks);
close(fd);
printf("Number of blocks: %lu, this makes %.3f GB\n",
numblocks,
(double)numblocks * 512.0 / (1024 * 1024 * 1024));
}
Write the upper code into a file getsize.c and compile it:
> gcc -o getsize getsize.c
Now you can run it (as root):
# ./getsize /dev/raw/raw2 Number of blocks: 312581808, this makes 149.051 GB # ./getsize /dev/hdd Number of blocks: 90069840, this makes 42.949 GB
Keywords: rawdevice raw device blocksize size determine ioctl blkgetsize lseek lseek64 linux26 Author: Mathias Kettner
| Tauschzone MK |