summaryrefslogtreecommitdiffstats
path: root/lua/examples/create_disk.lua
blob: 2dfc1fc2566f963310c2d0c2986647c351ab9083 (plain)
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
66
-- Example showing how to create a disk image.

require "guestfs"

output = "disk.img"

g = Guestfs.create ()

-- Create a raw-format sparse disk image, 512 MB in size.
file = io.open (output, "w")
file:seek ("set", 512 * 1024 * 1024)
file:write (' ')
file:close ()

-- Set the trace flag so that we can see each libguestfs call.
g:set_trace (true)

-- Attach the disk image to libguestfs.
g:add_drive (output, { format = "raw", readonly = false })

-- Run the libguestfs back-end.
g:launch ()

-- Get the list of devices.  Because we only added one drive
-- above, we expect that this list should contain a single
-- element.
devices = g:list_devices ()
if table.getn (devices) ~= 1 then
   error "expected a single device from list-devices"
end

-- Partition the disk as one single MBR partition.
g:part_disk (devices[1], "mbr")

-- Get the list of partitions.  We expect a single element, which
-- is the partition we have just created.
partitions = g:list_partitions ()
if table.getn (partitions) ~= 1 then
   error "expected a single partition from list-partitions"
end

-- Create a filesystem on the partition.
g:mkfs ("ext4", partitions[1])

-- Now mount the filesystem so that we can add files.
g:mount (partitions[1], "/")

-- Create some files and directories.
g:touch ("/empty")
message = "Hello, world\n"
g:write ("/hello", message)
g:mkdir ("/foo")

-- This one uploads the local file /etc/resolv.conf into
-- the disk image.
g:upload ("/etc/resolv.conf", "/foo/resolv.conf")

-- Because we wrote to the disk and we want to detect write
-- errors, call g:shutdown.  You don't need to do this:
-- g:close will do it implicitly.
g:shutdown ()

-- 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.
g:close ()