12

最近、Raspberry Pi.SE でイメージ ファイルからパーティションをマウントする方法に関するガイドを書きました。命令がややこしく、時間があるのでCプログラムに置き換えたい。イメージのパーティションを一覧表示し、適切なオフセットを計算しました。

元の手順では、実行する必要がありました

$ sudo mount -o loop,offset=80740352 debian6-19-04-2012.img /mnt

これをコードで行う必要があります。util-linux でマウント機能とlibmountを見つけました。

util-linux でloopdev.cを見つけました。ループ デバイスを作成する簡単な方法はありますか? または、このコードから学習して ioctl を使用する必要がありますか?

4

1 に答える 1

14

device次の関数は、ループ デバイスをfileat にバインドしますoffset。成功した場合は 0、それ以外の場合は 1 を返します。

int loopdev_setup_device(const char * file, uint64_t offset, const char * device) {
  int file_fd = open(file, O_RDWR);
  int device_fd = -1; 

  struct loop_info64 info;

  if(file_fd < 0) {
    fprintf(stderr, "Failed to open backing file (%s).\n", file);
    goto error;
  }

  if((device_fd = open(device, O_RDWR)) < 0) {
    fprintf(stderr, "Failed to open device (%s).\n", device);
    goto error;
  }

  if(ioctl(device_fd, LOOP_SET_FD, file_fd) < 0) {
    fprintf(stderr, "Failed to set fd.\n");
    goto error;
  }

  close(file_fd);
  file_fd = -1; 

  memset(&info, 0, sizeof(struct loop_info64)); /* Is this necessary? */
  info.lo_offset = offset;
  /* info.lo_sizelimit = 0 => max avilable */
  /* info.lo_encrypt_type = 0 => none */

  if(ioctl(device_fd, LOOP_SET_STATUS64, &info)) {
    fprintf(stderr, "Failed to set info.\n");
    goto error;
  }

  close(device_fd);
  device_fd = -1; 

  return 0;

  error:
    if(file_fd >= 0) {
      close(file_fd);
    }   
    if(device_fd >= 0) {
      ioctl(device_fd, LOOP_CLR_FD, 0); 
      close(device_fd);
    }   
    return 1;
}

参考文献

  1. linux/loop.h
  2. ピミング
于 2012-07-09T20:12:54.287 に答える