X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=TODO;h=a0e83907f2d608eaba41f2cff76ce0ad9fa27de1;hp=f3ee67913e1648b1cc564efc20a40173358f5d18;hb=abb7365d4df7b945846a9f6189bbbd70e10122d1;hpb=3496c6c3dfb5ef4ab93f6aae86512665a37b23cf diff --git a/TODO b/TODO index f3ee679..a0e8390 100644 --- a/TODO +++ b/TODO @@ -1,86 +1,261 @@ -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 and simple strings in other +languages that can handle 8 bit clean strings. -BufferIn and BufferOut should turn into 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 - - 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 bind tests +------------------- + +Complete the bind tests - must test the return values and error cases. + +virt-inspector - make libvirt XML +--------------------------------- + +It should be possible to generate libvirt XML from virt-inspector +data, at least partially. This would be just another output type so: + + 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" +----------------------- + +Instead of running guestfsd (the daemon) inside qemu, there should be +an option to just run guestfsd directly. + +The architecture in this mode would look like: + + +------------------+ + | main program | + |------------------| + | libguestfs | + +--------^---------+ + | | reply + cmd | | + +----v-------------+ + | guestfsd | + +------------------+ + +Notes: + +(1) This only makes sense if we are running as root. + +(2) There is no console / kernel messages in this configuration, but +we might consider capturing stderr from the daemon. + +(3) guestfs_config and guestfs_add_drive become no-ops. + +Obviously in this configuration, commands are run directly on the +local machine's disks. You could just run the commands themselves +directly, but libguestfs provides a convenient API and language +bindings. Also deals with tricky stuff like parsing the output of the +LVM commands. Also we get to leverage other code such as +virt-inspector. + +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? + +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 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: -Complete the bindings tests - must test the return values and -error cases. + perl -MSys::Guestfs::One -e 'inspect("guest.img"); cat ("/etc/fstab");' ----------------------------------------------------------------------- +How would editing files work? -For virt-inspector: +ntfsclone +--------- - - Make a libvirt XML config +Useful imaging tool: +http://man.linux-ntfs.org/ntfsclone.8.html - - Test over available OSes +Standard images +--------------- - - Add 'reged' / NT registry support. +Equip guestfish with some standard images that it can load +quickly, eg: ----------------------------------------------------------------------- + load ext2 -Use virtio_blk by default. It's faster and more natural. -Unfortunately it seems like this will rename all devices - see next -item. +Maybe it's better to create these on the fly? ----------------------------------------------------------------------- +virt-rescue pty +--------------- -"Device independent" naming for devices. +See: +http://search.cpan.org/~rgiersig/IO-Tty-1.08/Pty.pm +http://www.perlmonks.org/index.pl?node_id=582185 -With a Fedora-based appliance, using libata driver, devices have -"SCSI" names like /dev/sda. +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). -With an EPEL-based appliance, using old ide driver, devices have names -like /dev/hda. +Windows-based daemon/appliance +------------------------------ -If we use virtio_blk, devices will have names like /dev/vda. +See discussion on list: +https://www.redhat.com/archives/libguestfs/2009-November/msg00165.html -What a mess. +qemu locking +------------ -So the idea would be to add a device independent naming scheme, such -as the one used by grub: +Add -drive file=...,lock=exclusive and -drive file=...,lock=shared - "(hdX)" X = 0 means 'a', X = 1 means 'b' and so on. - "(hdX,Y)" Device X, partition Y (in grub, this counts from 0 which is - deeply confusing). +Change libguestfs and libvirt to do the right thing, so that multiple +instances of qemu cannot stomp on each other. -There would have to be a very simple rule. If guestfsd was expecting -a /dev block device or partition name, then the alternate form can be -used, and we would just look it up using the normal output of -guestfs_list_devices. +virt-disk-explore +----------------- -Maybe best is to use /dev/sda as the "standard" naming. That -shouldn't cause conflicts in the appliance because we tightly control -what drivers are available. +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/ -Note there's a lot of hackery that currently exists in tests.c which -could be *removed* if we made this change. +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. -Open: Should the substitution be done in the library layer or in the -daemon? +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