Standard utility cannot do this. Take C and qcow2 image format doc and write something like
#define ntohll(x) (((uint64_t)(ntohl((uint32_t)((x << 32) >> 32))) << 32) | ntohl(((uint32_t)(x >> 32))))
/* change filename in qcow2 */
int backing_file_patch(const char *in_file, const char *new_backing_file) {
int f;
uint64_t backing_file_offset;
uint32_t backing_file_size;
if ((f = open(in_file, O_RDWR)) == -1) {
perror("open");
goto error;
}
if (lseek(f, 8, SEEK_SET) == (off_t)-1) {
perror("lseek");
goto error;
}
if (read(f, &backing_file_offset, sizeof(backing_file_offset)) == -1) {
perror("read");
goto error;
}
backing_file_offset = ntohll(backing_file_offset);
backing_file_size = strlen(new_backing_file);
backing_file_size = htonl(backing_file_size);
/* update backing_file_size */
if (write(f, &backing_file_size, sizeof(backing_file_size)) == -1) {
perror("write");
goto error;
}
/* update path */
if (lseek(f, backing_file_offset, SEEK_SET) == (off_t)-1) {
perror("lseek");
goto error;
}
if (write(f, new_backing_file, strlen(new_backing_file)) == -1) {
perror("write");
goto error;
}
close(f);
return 0;
error:
close(f);
return 1;
}
To test this
/usr/sbin/xm block-attach 0 tap:qcow2:/home/test/vm_drive_C_snapshot.qcow2 /dev/xvda w 0 /bin/ntfs-3g -o dev_offset=7340032,rw,noatime,force,entry_timeout=60000,negative_timeout=60000,attr_timeout=60000,ac_attr_timeout=60000 /dev/xvda exposedCleanup
/bin/umount exposed /usr/sbin/xm block-detach 0 51712
No comments:
Post a Comment