Commit a3fb0cf9072c4aa89776526592b359b7caea1bb9

Authored by bellard
1 parent ea2384d3

removed unneeded tools


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1038 c046a42c-6fe2-441c-8c8c-71466251a162
cow.h deleted 100644 → 0
1   -/* user mode linux compatible COW file */
2   -#define COW_MAGIC 0x4f4f4f4d /* MOOO */
3   -#define COW_VERSION 2
4   -
5   -struct cow_header_v2 {
6   - uint32_t magic;
7   - uint32_t version;
8   - char backing_file[1024];
9   - int32_t mtime;
10   - uint64_t size;
11   - uint32_t sectorsize;
12   -};
13   -
qemu-mkcow.c deleted 100644 → 0
1   -/*
2   - * create a COW disk image
3   - *
4   - * Copyright (c) 2003 Fabrice Bellard
5   - *
6   - * Permission is hereby granted, free of charge, to any person obtaining a copy
7   - * of this software and associated documentation files (the "Software"), to deal
8   - * in the Software without restriction, including without limitation the rights
9   - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   - * copies of the Software, and to permit persons to whom the Software is
11   - * furnished to do so, subject to the following conditions:
12   - *
13   - * The above copyright notice and this permission notice shall be included in
14   - * all copies or substantial portions of the Software.
15   - *
16   - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19   - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   - * THE SOFTWARE.
23   - */
24   -#include <stdlib.h>
25   -#include <stdio.h>
26   -#include <stdarg.h>
27   -#include <string.h>
28   -#include <getopt.h>
29   -#include <inttypes.h>
30   -#include <unistd.h>
31   -#include <fcntl.h>
32   -#include <signal.h>
33   -#include <time.h>
34   -#include <sys/time.h>
35   -#include <errno.h>
36   -#include <sys/stat.h>
37   -#include <netinet/in.h>
38   -
39   -#include "cow.h"
40   -
41   -#include "bswap.h"
42   -
43   -int cow_create(int cow_fd, const char *image_filename,
44   - int64_t image_sectors)
45   -{
46   - struct cow_header_v2 cow_header;
47   - int fd;
48   - struct stat st;
49   -
50   - memset(&cow_header, 0, sizeof(cow_header));
51   - cow_header.magic = htonl(COW_MAGIC);
52   - cow_header.version = htonl(COW_VERSION);
53   - if (image_filename) {
54   - fd = open(image_filename, O_RDONLY);
55   - if (fd < 0) {
56   - perror(image_filename);
57   - exit(1);
58   - }
59   - image_sectors = lseek64(fd, 0, SEEK_END);
60   - if (fstat(fd, &st) != 0) {
61   - close(fd);
62   - return -1;
63   - }
64   - close(fd);
65   - image_sectors /= 512;
66   - cow_header.mtime = htonl(st.st_mtime);
67   - realpath(image_filename, cow_header.backing_file);
68   - }
69   - cow_header.sectorsize = htonl(512);
70   - cow_header.size = image_sectors * 512;
71   -#ifndef WORDS_BIGENDIAN
72   - cow_header.size = bswap64(cow_header.size);
73   -#endif
74   - write(cow_fd, &cow_header, sizeof(cow_header));
75   - /* resize to include at least all the bitmap */
76   - ftruncate(cow_fd, sizeof(cow_header) + ((image_sectors + 7) >> 3));
77   - lseek(cow_fd, 0, SEEK_SET);
78   - return 0;
79   -}
80   -
81   -void help(void)
82   -{
83   - printf("qemu-mkcow version " QEMU_VERSION ", Copyright (c) 2003 Fabrice Bellard\n"
84   - "usage: qemu-mkcow [-h] [-f disk_image] cow_image [cow_size]\n"
85   - "Create a Copy On Write disk image from an optional raw disk image\n"
86   - "\n"
87   - "-f disk_image set the raw disk image name\n"
88   - "cow_image the created cow_image\n"
89   - "cow_size the create cow_image size in MB if no raw disk image is used\n"
90   - "\n"
91   - "Once the cow_image is created from a raw disk image, you must not modify the original raw disk image\n"
92   - );
93   - exit(1);
94   -}
95   -
96   -int main(int argc, char **argv)
97   -{
98   - const char *image_filename, *cow_filename;
99   - int cow_fd, c, nb_args, simple_image;
100   - int64_t image_size;
101   -
102   - image_filename = NULL;
103   - image_size = 0;
104   - simple_image = 0;
105   - for(;;) {
106   - c = getopt(argc, argv, "hf:s");
107   - if (c == -1)
108   - break;
109   - switch(c) {
110   - case 'h':
111   - help();
112   - break;
113   - case 'f':
114   - image_filename = optarg;
115   - break;
116   - case 's':
117   - simple_image = 1;
118   - break;
119   - }
120   - }
121   - if (!image_filename)
122   - nb_args = 2;
123   - else
124   - nb_args = 1;
125   - if (optind + nb_args != argc)
126   - help();
127   -
128   - cow_filename = argv[optind];
129   - if (nb_args == 2) {
130   - image_size = (int64_t)atoi(argv[optind + 1]) * 2 * 1024;
131   - }
132   -
133   - cow_fd = open(cow_filename, O_RDWR | O_CREAT | O_TRUNC | O_LARGEFILE, 0644);
134   - if (!cow_fd < 0)
135   - return -1;
136   - if (simple_image) {
137   - ftruncate64(cow_fd, image_size * 512);
138   - } else {
139   - if (cow_create(cow_fd, image_filename, image_size) < 0) {
140   - fprintf(stderr, "%s: error while formating\n", cow_filename);
141   - exit(1);
142   - }
143   - }
144   - close(cow_fd);
145   - return 0;
146   -}
vmdk.h deleted 100644 → 0
1   -/*
2   - Copyright (C) Matthew Chapman 2003
3   -
4   - This program is free software; you can redistribute it and/or modify
5   - it under the terms of the GNU General Public License as published by
6   - the Free Software Foundation; either version 2 of the License, or
7   - (at your option) any later version.
8   -
9   - This program is distributed in the hope that it will be useful,
10   - but WITHOUT ANY WARRANTY; without even the implied warranty of
11   - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12   - GNU General Public License for more details.
13   -
14   - You should have received a copy of the GNU General Public License
15   - along with this program; if not, write to the Free Software
16   - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17   -*/
18   -
19   -#define SECTOR_BITS 9
20   -#define SECTOR_SIZE (1 << SECTOR_BITS)
21   -#define SECTOR_MASK (SECTOR_SIZE - 1)
22   -
23   -#define L1_BITS (SECTOR_BITS - 3)
24   -#define L1_SIZE (1 << L1_BITS)
25   -#define L1_MASK (L1_SIZE - 1)
26   -
27   -#define L2_BITS SECTOR_BITS
28   -#define L2_SIZE (1 << L2_BITS)
29   -#define L2_MASK (L2_SIZE - 1)
30   -
31   -#define MIN(x,y) (((x) < (y)) ? (x) : (y))
32   -
33   -struct cowdisk_header
34   -{
35   - uint32_t version;
36   - uint32_t flags;
37   - uint32_t disk_sectors;
38   - uint32_t granularity;
39   - uint32_t l1dir_offset;
40   - uint32_t l1dir_size;
41   - uint32_t file_sectors;
42   - uint32_t cylinders;
43   - uint32_t heads;
44   - uint32_t sectors_per_track;
45   -};
46   -
47   -struct cowdisk_header2
48   -{
49   - uint32_t parent_ts;
50   - uint32_t timestamp;
51   -};
52   -
53   -/* based on vdk 3.1 10-11-2003 by Ken Kato */
54   -
55   -struct vmdisk_header
56   -{
57   - uint32_t version;
58   - uint32_t flags;
59   -
60   - int64_t capacity;
61   - int64_t granularity;
62   - int64_t desc_offset;
63   - int64_t desc_size;
64   - int32_t num_gtes_per_gte;
65   - int64_t rgd_offset;
66   - int64_t gd_offset;
67   - int64_t grain_offset;
68   -
69   - char filler[1];
70   -
71   - char check_bytes[4];
72   -};
vmdk2raw.c deleted 100644 → 0
1   -/*
2   - vmdk2raw: convert vmware images to raw disk images
3   - Copyright (C) Net Integration Technologies 2004
4   - Copyright (C) Matthew Chapman 2003
5   -
6   - This program is free software; you can redistribute it and/or modify
7   - it under the terms of the GNU General Public License as published by
8   - the Free Software Foundation; either version 2 of the License, or
9   - (at your option) any later version.
10   -
11   - This program is distributed in the hope that it will be useful,
12   - but WITHOUT ANY WARRANTY; without even the implied warranty of
13   - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   - GNU General Public License for more details.
15   -
16   - You should have received a copy of the GNU General Public License
17   - along with this program; if not, write to the Free Software
18   - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19   -*/
20   -
21   -#include <stdlib.h>
22   -#include <stdio.h>
23   -#include <unistd.h>
24   -#include <fcntl.h>
25   -#include <inttypes.h>
26   -#include <sys/types.h>
27   -#include <string.h>
28   -#include <sys/stat.h>
29   -#include <errno.h>
30   -#include "vmdk.h"
31   -#include "config-host.h"
32   -
33   -static struct cowdisk_header header;
34   -static struct vmdisk_header header4;
35   -static off64_t disk_limit;
36   -static unsigned int granule_size;
37   -static uint32_t *l1dir;
38   -
39   -static unsigned int cached_l2dir;
40   -static uint32_t l2dir[L2_SIZE];
41   -
42   -static struct vmdk_prm {
43   - uint32_t grain_table_size;
44   - uint32_t sectors_per_grain;
45   - uint32_t sectors_per_table;
46   - uint32_t directory_size;
47   -} vdsk;
48   -
49   -static size_t read_physical(int fd, off64_t offset, size_t length, void *buffer)
50   -{
51   - size_t n;
52   -
53   - if (lseek64(fd, offset, SEEK_SET) == -1) {
54   - printf(" error trying to seek lseek to %lld", offset);
55   - return -1;
56   - }
57   -
58   - n = read(fd, buffer, length);
59   -
60   - if (n == -1) {
61   - printf("read from disk %lld", offset);
62   - return -1;
63   - }
64   -
65   - return n;
66   -}
67   -
68   -static int read_l1dir(int fd, size_t offset, int num)
69   -{
70   - l1dir = malloc(sizeof(*l1dir) * num);
71   - if (!l1dir)
72   - return -1;
73   - return read_physical(fd, offset << SECTOR_BITS, sizeof(*l1dir) * num, (char *)l1dir) != (sizeof(*l1dir) * num);
74   -}
75   -
76   -static int read_l2dir(int fd, size_t offset, int num)
77   -{
78   - return read_physical(fd, offset << SECTOR_BITS, sizeof(l2dir[0]) * num, (char *)l2dir) != sizeof(l2dir);
79   -}
80   -
81   -static size_t copy_virtual(struct vmdk_prm *dsk, int in_fd, int out_fd, off64_t offset, void *buffer, size_t length)
82   -{
83   -
84   - unsigned int granule_offset;
85   - unsigned int grain_index;
86   - unsigned int sector_map_idx;
87   -
88   - granule_offset = offset % granule_size;
89   - length = MIN(length, granule_size - granule_offset);
90   - length = MIN(length, disk_limit - offset);
91   -
92   - sector_map_idx = (offset >> SECTOR_BITS) / dsk->sectors_per_table;
93   -
94   - if (sector_map_idx >= dsk->directory_size) {
95   - fprintf(stderr, "cannot locate grain table for %d in %d\n", sector_map_idx, dsk->directory_size);
96   - return -1;
97   - }
98   -
99   - if (l1dir[sector_map_idx] == 0)
100   - goto zero_fill;
101   -
102   - if (sector_map_idx != cached_l2dir) {
103   - if (read_l2dir(in_fd, l1dir[sector_map_idx], dsk->grain_table_size)) {
104   - fprintf(stderr, "read failed\n");
105   - return -1;
106   - }
107   - cached_l2dir = sector_map_idx;
108   - }
109   -
110   - grain_index = ((offset >> SECTOR_BITS) % dsk->sectors_per_table) / dsk->sectors_per_grain;
111   -
112   - if (grain_index >= dsk->grain_table_size) {
113   - fprintf(stderr, "grain to large");
114   - return -1;
115   - }
116   -
117   - if (l2dir[grain_index] == 0)
118   - goto zero_fill;
119   -
120   - if (read_physical(in_fd, (l2dir[grain_index] << SECTOR_BITS) + granule_offset, length, buffer) != length) {
121   - fprintf(stderr, "read error 2\n");
122   - return -1;
123   - }
124   -
125   - write(out_fd, buffer, length);
126   - return length;
127   -
128   -zero_fill:
129   - /* the last chunk of the file can not be sparse
130   - * or the file will be truncated */
131   - if (offset + length >= disk_limit) {
132   - if (lseek64(out_fd, length-1, SEEK_CUR) == (off_t)-1)
133   - perror("lseek");
134   - /* write the last NULL byte instead of seeking */
135   - const char nil = 0;
136   - write(out_fd, &nil, 1);
137   - } else {
138   - if (lseek64(out_fd, length, SEEK_CUR) == (off_t)-1)
139   - perror("lseek");
140   - }
141   - return length;
142   -}
143   -
144   -static int open_vmdk4(int fd)
145   -{
146   - if (read(fd, &header4, sizeof(header4)) != sizeof(header4)) {
147   - perror("read from disk");
148   - return -1;
149   - }
150   -
151   - granule_size = header4.granularity << SECTOR_BITS;
152   - disk_limit = header4.capacity << SECTOR_BITS;
153   -
154   - cached_l2dir = -1;
155   - vdsk.grain_table_size = header4.num_gtes_per_gte;
156   - vdsk.sectors_per_grain = header4.granularity;
157   - vdsk.sectors_per_table = vdsk.grain_table_size * vdsk.sectors_per_grain;
158   - vdsk.directory_size = (header4.capacity + vdsk.sectors_per_table - 1) / vdsk.sectors_per_table + 1;
159   -
160   - if (read_l1dir(fd, header4.rgd_offset, vdsk.directory_size))
161   - return -1;
162   -
163   - return 0;
164   -
165   -}
166   -
167   -static int open_vmdk3(int fd)
168   -{
169   - if (read(fd, &header, sizeof(header)) != sizeof(header)) {
170   - perror("read from disk\n");
171   - return -1;
172   - }
173   - granule_size = header.granularity << SECTOR_BITS;
174   - vdsk.sectors_per_grain = header.granularity;
175   - vdsk.grain_table_size = L2_SIZE;
176   - vdsk.sectors_per_table = vdsk.grain_table_size * vdsk.sectors_per_grain;
177   - vdsk.directory_size = L1_SIZE;
178   - if (read_l1dir(fd, header.l1dir_offset, L1_SIZE))
179   - return -1;
180   -
181   - disk_limit = header.disk_sectors << SECTOR_BITS;
182   -
183   - return fd;
184   -}
185   -
186   -static int open_vmdk(const char *filename)
187   -{
188   - int fd = open(filename, O_RDONLY | O_LARGEFILE);
189   - if (fd == -1) {
190   - perror(filename);
191   - return -1;
192   - }
193   -
194   - char magic[4];
195   - if (read(fd, &magic, sizeof(magic)) != sizeof(magic)) {
196   - perror("read from disk");
197   - return -1;
198   - }
199   -
200   - if (!memcmp(magic, "KDMV", sizeof(magic))) {
201   - open_vmdk4(fd);
202   - } else if (!memcmp(magic, "COWD", sizeof(magic))) {
203   - open_vmdk3(fd);
204   - } else {
205   - fprintf(stderr, "%s is not a VMware virtual disk image\n", filename);
206   - return -1;
207   - }
208   -
209   - cached_l2dir = -1;
210   - return fd;
211   -}
212   -
213   -static void help(void)
214   -{
215   - printf("vmdk2raw\n"
216   - "usage: vmdk2raw vmware_image output_image\n"
217   - "\n"
218   - "vmware_image a vmware cow image\n"
219   - "output_image the created disk image\n"
220   - );
221   - exit(1);
222   -}
223   -
224   -#define BUF_SIZE 0x10000
225   -static void copy_disk(in_fd, out_fd)
226   -{
227   - char buf[BUF_SIZE];
228   - off64_t i = 0;
229   - int ret;
230   - while (i < disk_limit) {
231   - ret = copy_virtual(&vdsk, in_fd, out_fd, i, buf, sizeof(buf));
232   - if (ret < 0) {
233   - fprintf(stderr, "copying failed\n");
234   - exit(-1);
235   - }
236   - i += ret;
237   - }
238   -}
239   -
240   -int main(int argc, char **argv)
241   -{
242   - int out_fd, in_fd;
243   -
244   - if (argc < 3)
245   - help();
246   -
247   - in_fd = open_vmdk(argv[1]);
248   - if (in_fd < 0) {
249   - return -1;
250   - }
251   -
252   - out_fd = open(argv[2], O_WRONLY | O_LARGEFILE | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
253   - if (out_fd < 0) {
254   - perror(argv[2]);
255   - return -1;
256   - }
257   -
258   - copy_disk(in_fd, out_fd);
259   - close(out_fd);
260   - return 0;
261   -}