gpt4 book ai didi

mount - 如何以编程方式循环挂载?

转载 作者:太空狗 更新时间:2023-10-29 16:54:01 27 4
gpt4 key购买 nike

我最近写了一个guide on how to mount partitions from image files on Raspberry Pi.SE .说明比较复杂,我有点时间,所以想用 a C program 代替它们.我已成功列出图像的分区并计算出适当的偏移量。

在原始指令中,我们需要运行

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

我现在需要在代码中执行此操作。我找到了 mount功能和libmount in util-linux .

我现在找到了loopdev.c在 util-linux 中。是否有一种简单的方法来创建循环设备,或者我是否必须从这段代码中学习并使用 ioctl?

最佳答案

以下函数将循环设备device 绑定(bind)到offset 处的file。成功返回 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. piimg

关于mount - 如何以编程方式循环挂载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com