todo documentation: remove 'virt-grow/shrink', see virt-resize
[libguestfs.git] / TODO
diff --git a/TODO b/TODO
index b3860b1..a0e8390 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,60 +1,61 @@
-Ideas for the Python bindings:
-https://www.redhat.com/archives/fedora-virt/2009-April/msg00114.html
+TODO list for libguestfs
+======================================================================
 
 
-----------------------------------------------------------------------
+This list contains random ideas and musings on features we could add
+to libguestfs in future.
 
 
-We badly need to actually implement the FTP server mentioned in the
-documentation.
+   - RWMJ
 
 
-Or: Implement a FUSE-based filesystem.  See the FUSE mountlo
-project which does something similar, albeit only to single
-filesystems:
+FUSE API
+--------
 
 
-http://sourceforge.net/project/showfiles.php?group_id=121684&package_id=150116
+The API needs more test coverage, particularly lesser-used system
+calls.
 
 
-----------------------------------------------------------------------
+The big unresolved issue is UID/GID mapping between guest filesystem
+IDs and the host.  It's not easy to automate this because you need
+extra details about the guest itself in order to get to its
+UID->username map (eg. /etc/passwd from the guest).
+
+BufferIn
+--------
+
+BufferIn should turn into <char *, int> and simple strings in other
+languages that can handle 8 bit clean strings.
 
 
-BufferIn and BufferOut should turn into <char *, int> and simple
-strings in other languages that can handle 8 bit clean strings.
 Limit on transfers would still be 2MB for these types.
  - then implement write-file properly
 Limit on transfers would still be 2MB for these types.
  - then implement write-file properly
- - and implement read-file
 
 
-----------------------------------------------------------------------
+febootstrap / debootstrap inside appliance
+------------------------------------------
 
 
-Implement febootstrap command.
+This was originally proposed as a way to install new operating systems
+in the appliance.  However no one has come up with a workable
+solution.
 
 
-----------------------------------------------------------------------
+Haskell bindings
+----------------
 
 Complete the Haskell bindings (see discussion on haskell-cafe).
 
 
 Complete the Haskell bindings (see discussion on haskell-cafe).
 
-----------------------------------------------------------------------
-
-Complete the bindings tests - must test the return values and
-error cases.
-
-----------------------------------------------------------------------
-
-For virt-inspector:
-
- - Make a libvirt XML config
-
- - Test over available OSes
+Complete bind tests
+-------------------
 
 
- - Add 'reged' / NT registry support.
+Complete the bind tests - must test the return values and error cases.
 
 
-----------------------------------------------------------------------
+virt-inspector - make libvirt XML
+---------------------------------
 
 
-Use virtio_blk by default.  It's faster and more natural.
-Unfortunately it seems like this will rename all devices - see next
-item.
+It should be possible to generate libvirt XML from virt-inspector
+data, at least partially.  This would be just another output type so:
 
 
-Note: virtio_blk *IS* supported by all our minimum platforms,
-ie. CentOS 5.3, Fedora 11, Debian.
+ virt-inspector --libvirt guest.img
 
 
-----------------------------------------------------------------------
+Note that recent versions of libvirt/virt-install allow guests to be
+imported, so this is not so useful any more.
 
 "Standalone/local mode"
 
 "Standalone/local mode"
+-----------------------
 
 Instead of running guestfsd (the daemon) inside qemu, there should be
 an option to just run guestfsd directly.
 
 Instead of running guestfsd (the daemon) inside qemu, there should be
 an option to just run guestfsd directly.
@@ -93,29 +94,168 @@ This is mainly useful from live CDs, ie. virt-p2v.
 Should we bother having the daemon at all and just link the guestfsd
 code directly into libguestfs?
 
 Should we bother having the daemon at all and just link the guestfsd
 code directly into libguestfs?
 
-----------------------------------------------------------------------
+Supermin appliance to febootstrap
+---------------------------------
+
+Supermin appliance functionality should be moved into febootstrap.
+
+Ideas for extra commands
+------------------------
+
+  General glibc / core programs:
+    chgrp
+    more mk*temp calls
+
+  ext2 properties:
+    chattr
+    lsattr
+    badblocks
+    blkid
+    debugfs
+    dumpe2fs
+    e2image
+    e2undo
+    filefrag
+    findfs
+    logsave
+    mklost+found
+
+  SELinux:
+    chcat
+    restorecon
+    ch???
+
+  Oddball:
+    pivot_root
+    fts(3) / ftw(3)
+
+Other initrd-* commands
+-----------------------
+
+Such as:
+
+initrd-extract
+initrd-replace
+
+Simple editing of configuration files
+-------------------------------------
+
+Some easy non-Augeas methods to edit configuration files.
+I'm thinking:
+
+  replace /etc/file key value
+
+which would look in /etc/file for any instances of
+
+  key=...
+  key ...
+  key:...
+
+and replace them with
+
+  key=value
+  key value
+  key:value
+
+That would solve about 50% of reconfiguration needs, and for the
+rest you'd use Augeas, 'download'+'upload' or 'edit'.
+
+RWMJ: I had a go at implementing this, but it's quite error-prone to
+do this sort of editing inside the C-based daemon code.  It's far
+better to do it with Augeas, or else to use an external language like
+Perl.
+
+Quick Perl scripts
+------------------
+
+Currently we can't do Perl "one-liners".  ie. The current syntax for
+any short Perl one-liner would be:
+
+  perl -MSys::Guestfs -e '$g = Sys::Guestfs->new(); $g->add_drive ("foo"); $g->launch; $g->mount ("/dev/sda1", "/"); ....'
+
+You can see we're well beyond a single line just getting to the point
+of adding drives and mounting.
+
+First suggestion:
+
+ $h = create ($filename, \"/dev/sda1\" => \"/\");
+
+ $h = create ([$file1, $file2], \"/dev/sda1\" => \"/\");
+
+To mount read-only, add C<ro =E<gt> 1> like this:
+
+ $h = create ($filename, \"/dev/sda1\" => \"/\", ro => 1);
+
+which is equivalent to the following sequence of calls:
+
+ $h = Sys::Guestfs->new ();
+ $h->set_autosync (1);
+ $h->add_drive_ro ($filename);
+ $h->launch ();
+ $h->mount_ro (\"/dev/sda1\", \"/\");
+
+Command-line form would be:
+
+ perl -MSys::Guestfs=:all -e '$_=create("guest.img", "/dev/sda1" => "/"); $_->cat ("/etc/fstab");'
+
+That's not brief enough for one-liners, so we could have an extra
+autogenerated module which creates a Sys::Guestfs handle singleton
+(the handle is an implicit global variable as in guestfish), eg:
+
+ perl -MSys::Guestfs::One -e 'inspect("guest.img"); cat ("/etc/fstab");'
+
+How would editing files work?
+
+ntfsclone
+---------
+
+Useful imaging tool:
+http://man.linux-ntfs.org/ntfsclone.8.html
+
+Standard images
+---------------
+
+Equip guestfish with some standard images that it can load
+quickly, eg:
+
+  load ext2
+
+Maybe it's better to create these on the fly?
+
+virt-rescue pty
+---------------
+
+See:
+http://search.cpan.org/~rgiersig/IO-Tty-1.08/Pty.pm
+http://www.perlmonks.org/index.pl?node_id=582185
 
 
-PPC problems:
+Note that pty requires cooperation inside the C code too (there are
+two sides to a pty, and one has to be handled after the fork).
 
 
-  ppc (32 bit) works with qemu from git, however there is no serial console
+Windows-based daemon/appliance
+------------------------------
 
 
-  ppc64 requires extra parameters:
-    -M mac99 -cpu ppc64
-  however it still fails:
-    invalid/unsupported opcode: 01 - 01 - 1a (06301e83) 00000000018c2738 1
-    invalid bits: 00400000 for opcode: 0b - 19 - 15 (2d746572) 0000000000009230
+See discussion on list:
+https://www.redhat.com/archives/libguestfs/2009-November/msg00165.html
 
 
-  no serial console in ppc or ppc64 because no one can tell us what
-  console=ttyXX option to use
+qemu locking
+------------
 
 
-----------------------------------------------------------------------
+Add -drive file=...,lock=exclusive and -drive file=...,lock=shared
 
 
-Supermin appliance should be moved into febootstrap.
+Change libguestfs and libvirt to do the right thing, so that multiple
+instances of qemu cannot stomp on each other.
 
 
-----------------------------------------------------------------------
+virt-disk-explore
+-----------------
 
 
-guestfish -i (runs inspector)
+For multi-level disk images such as live CDs:
+http://rwmj.wordpress.com/2009/07/15/unpack-the-russian-doll-of-a-f11-live-cd/
 
 
-----------------------------------------------------------------------
+It's possible with libguestfs to recursively look for anything that
+might be a filesystem, mount-{,loop} it and look in those, revealing
+anything in a disk image.
 
 
-guestfish -f
+However this won't work easily for VM disk images in the disk image.
+One would have to download those to the host and launch another
+libguestfs instance.
\ No newline at end of file