1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#!/usr/bin/env escript
%%! -smp enable -sname create_disk debug verbose
% Example showing how to create a disk image.
main(_) ->
Output = "disk.img",
{ok, G} = guestfs:create(),
% Create a raw-format sparse disk image, 512 MB in size.
{ok, File} = file:open(Output, [raw, write, binary]),
{ok, _} = file:position(File, 512 * 1024 * 1024 - 1),
ok = file:write(File, " "),
ok = file:close(File),
% Set the trace flag so that we can see each libguestfs call.
ok = guestfs:set_trace(G, true),
% Set the autosync flag so that the disk will be synchronized
% automatically when the libguestfs handle is closed.
ok = guestfs:set_autosync(G, true),
% Attach the disk image to libguestfs.
ok = guestfs:add_drive_opts(G, Output,
[{format, "raw"}, {readonly, false}]),
% Run the libguestfs back-end.
ok = guestfs:launch(G),
% Get the list of devices. Because we only added one drive
% above, we expect that this list should contain a single
% element.
[Device] = guestfs:list_devices(G),
% Partition the disk as one single MBR partition.
ok = guestfs:part_disk(G, Device, "mbr"),
% Get the list of partitions. We expect a single element, which
% is the partition we have just created.
[Partition] = guestfs:list_partitions(G),
% Create a filesystem on the partition.
ok = guestfs:mkfs(G, "ext4", Partition),
% Now mount the filesystem so that we can add files. *)
ok = guestfs:mount_options(G, "", Partition, "/"),
% Create some files and directories. *)
ok = guestfs:touch(G, "/empty"),
Message = "Hello, world\n",
ok = guestfs:write(G, "/hello", Message),
ok = guestfs:mkdir(G, "/foo"),
% This one uploads the local file /etc/resolv.conf into
% the disk image.
ok = guestfs:upload(G, "/etc/resolv.conf", "/foo/resolv.conf"),
% Because 'autosync' was set (above) we can just close the handle
% and the disk contents will be synchronized. You can also do
% this manually by calling guestfs:umount_all and guestfs:sync.
%
% Note also that handles are automatically closed if they are
% reaped by the garbage collector. You only need to call close
% if you want to close the handle right away.
ok = guestfs:close(G).
|