const Guestfs = imports.gi.Guestfs; const Gio = imports.gi.Gio; var output = "disk.img"; var g = new Guestfs.Session (); // Create a raw-format sparse disk image, 512 MB in size. var file = Gio.file_new_for_path (output); var stream = file.replace (null, false, Gio.FileCreateFlags.NONE, null, null); stream.truncate (512 * 1024 * 1024, null); stream.close(); // Set the trace flag so that we can see each libguestfs call. g.set_trace (1); // Set the autosync flag so that the disk will be synchronized // automatically when the libguestfs handle is closed. g.set_autosync (1); // Attach the disk image to libguestfs. g.add_drive (file.get_path (), Guestfs.AddDriveOpts.OPTS_FORMAT, "raw"); // 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. var devices = g.list_devices (); if (devices.length != 1) { throw { name : "RuntimeError", message : "expected a single device from list-devices" }; } // Partition the disk as one single MBR partition. g.part_disk (devices[0], "mbr"); // Get the list of partitions. We expect a single element, which // is the partition we have just created. var partitions = g.list_partitions (); if (partitions.length != 1) { throw { name : "RuntimeError", message : "expected a single partition from list-partitions" }; } // Create a filesystem on the partition. g.mkfs ("ext4", partitions[0]); // Now mount the filesystem so that we can add files. g.mount_options ("", partitions[0], "/"); // Create some files and directories. g.touch ("/empty"); var 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", null); // 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 g.umount_all() and g.sync(). g.close ();