clinuxblock-device

How do I read/write a block device?


How do I read/write a block device? I heard I read/write like a normal file so I setup a loop device by doing

sudo losetup /dev/loop4 ~/file

Then I ran the app on the file then the loop device

sudo ./a.out file
sudo ./a.out /dev/loop4

The file executed perfectly. The loop device reads 0 bytes. In both cases I got FP==3 and off==0. The file correctly gets the string length and prints the string while the loop gets me 0 and prints nothing

How do I read/write to a block device?

#include <fcntl.h>
#include <cstdio>
#include <unistd.h>

int main(int argc, char *argv[]) {
    char str[1000];

    if(argc<2){
        printf("Error args\n");
        return 0;
    }

    int fp = open(argv[1], O_RDONLY);
    printf("FP=%d\n", fp);
    if(fp<=0) {
        perror("Error opening file");
        return(-1);
    }
    off_t off = lseek(fp, 0, SEEK_SET);
    ssize_t len = read(fp, str, sizeof str);
    str[len]=0;
    printf("%d, %d=%s\n", len, static_cast<int>(off), str);

    close(fp);
}

Solution

  • The losetup seems to map file in 512-byte sectors. If file size is not multiples of 512, then the rest will be truncated.

    When mapping a file to /dev/loopX with losetup, for fiile which is smaller than 512 bytes it gives us following warning:

    Warning: file is smaller than 512 bytes;
     the loop device may be useless or invisible for system tools.
    

    For file which the size cannot be divided by 512:

    Warning: file does not fit into a 512-byte sector;
     the end of the file will be ignored
    

    This warning was added since util-linux ver 2.22 in this commit