Richard W.M. Jones
2011-Jul-12 12:38 UTC
[Libguestfs] [PATCH 0/2] Add /dev/mapper/* paths to guestfish tab completion.
When you open a LUKS device, you have to associate it with a "raw" device mapper device (eg. /dev/mapper/lukstest). Previously there has been no way through the API to list such devices after they have been created. Also they are not revealed when you tab-complete /dev paths in guestfish. These two patches fix this. The first patch adds a new API called guestfs_list_dm_devices which lists all device mapper devices that are not associated with LVs. We don't want to return LVs here because we prefer to use the "/dev/VG/LV" notation for these throughout the rest of the API. The second patch extends guestfish so that tab completion includes /dev/mapper paths. Future work: Returning filesystems on opened LUKS devices from guestfs_list_filesystems. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org
Richard W.M. Jones
2011-Jul-12 12:39 UTC
[Libguestfs] [PATCH 1/2] New API: list-dm-devices (RHBZ#688062).
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v -------------- next part -------------->From 81ada70b277c4115a97ee9418f131591dc07e290 Mon Sep 17 00:00:00 2001From: "Richard W.M. Jones" <rjones at redhat.com> Date: Tue, 12 Jul 2011 13:26:25 +0100 Subject: [PATCH 1/2] New API: list-dm-devices (RHBZ#688062). List device mapper devices. --- daemon/lvm.c | 80 ++++++++++++++++++++++++++++- generator/generator_actions.ml | 18 ++++++- regressions/Makefile.am | 1 + regressions/test-luks-list.sh | 111 ++++++++++++++++++++++++++++++++++++++++ src/MAX_PROC_NR | 2 +- 5 files changed, 209 insertions(+), 3 deletions(-) create mode 100755 regressions/test-luks-list.sh diff --git a/daemon/lvm.c b/daemon/lvm.c index dbca20b..eaa6bce 100644 --- a/daemon/lvm.c +++ b/daemon/lvm.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009-2011 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include <string.h> #include <unistd.h> #include <sys/stat.h> +#include <dirent.h> #include "daemon.h" #include "c-ctype.h" @@ -763,3 +764,80 @@ do_lvm_canonical_lv_name (const char *device) return canonical; /* caller frees */ } + +/* List everything in /dev/mapper which *isn't* an LV (RHBZ#688062). */ +char ** +do_list_dm_devices (void) +{ + char **ret = NULL; + int size = 0, alloc = 0; + struct dirent *d; + DIR *dir; + int r; + + dir = opendir ("/dev/mapper"); + if (!dir) { + reply_with_perror ("opendir: /dev/mapper"); + return NULL; + } + + while (1) { + errno = 0; + d = readdir (dir); + if (d == NULL) break; + + /* Ignore . and .. */ + if (STREQ (d->d_name, ".") || STREQ (d->d_name, "..")) + continue; + + /* Ignore /dev/mapper/control which is used internally by dm. */ + if (STREQ (d->d_name, "control")) + continue; + + size_t len = strlen (d->d_name); + char devname[len+64]; + + snprintf (devname, len+64, "/dev/mapper/%s", d->d_name); + + /* Ignore dm devices which are LVs. */ + r = lv_canonical (devname, NULL); + if (r == -1) { + free_stringslen (ret, size); + closedir (dir); + return NULL; + } + if (r) + continue; + + /* Not an LV, so add it. */ + if (add_string (&ret, &size, &alloc, devname) == -1) { + closedir (dir); + return NULL; + } + } + + /* Did readdir fail? */ + if (errno != 0) { + reply_with_perror ("readdir: /dev/mapper"); + free_stringslen (ret, size); + closedir (dir); + return NULL; + } + + /* Close the directory handle. */ + if (closedir (dir) == -1) { + reply_with_perror ("closedir: /dev/mapper"); + free_stringslen (ret, size); + return NULL; + } + + /* Sort the output (may be empty). */ + if (ret != NULL) + sort_strings (ret, size); + + /* NULL-terminate the list. */ + if (add_string (&ret, &size, &alloc, NULL) == -1) + return NULL; + + return ret; +} diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 54cdd15..aedbeda 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -5574,7 +5574,10 @@ encrypted to the underlying C<device> respectively. If this block device contains LVM volume groups, then calling C<guestfs_vgscan> followed by C<guestfs_vg_activate_all> -will make them visible."); +will make them visible. + +Use C<guestfs_list_dm_devices> to list all device mapper +devices."); ("luks_open_ro", (RErr, [Device "device"; Key "key"; String "mapname"], []), 258, [Optional "luks"], [], @@ -5986,6 +5989,19 @@ If required, C<trans=virtio> will be automatically added to the options. Any other options required can be passed in the optional C<options> parameter."); + ("list_dm_devices", (RStringList "devices", [], []), 287, [], + [], + "list device mapper devices", + "\ +List all device mapper devices. + +The returned list contains C</dev/mapper/*> devices, eg. ones created +by a previous call to C<guestfs_luks_open>. + +Device mapper devices which correspond to logical volumes are I<not> +returned in this list. Call C<guestfs_lvs> if you want to list logical +volumes."); + ] let all_functions = non_daemon_functions @ daemon_functions diff --git a/regressions/Makefile.am b/regressions/Makefile.am index 9c181bd..fada841 100644 --- a/regressions/Makefile.am +++ b/regressions/Makefile.am @@ -45,6 +45,7 @@ TESTS = \ test-inspect-fstab.sh \ test-launch-race.pl \ test-luks.sh \ + test-luks-list.sh \ test-lvm-filtering.sh \ test-lvm-mapping.pl \ test-noexec-stack.pl \ diff --git a/regressions/test-luks-list.sh b/regressions/test-luks-list.sh new file mode 100755 index 0000000..9c51464 --- /dev/null +++ b/regressions/test-luks-list.sh @@ -0,0 +1,111 @@ +#!/bin/bash - +# libguestfs +# Copyright (C) 2011 Red Hat Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +# Test LUKS devices appear in the output of list-dm-devices. + +set -e + +[ -n "$SKIP_TEST_LUKS_SH" ] && { + echo "test-luks-list.sh skipped (environment variable set)" + exit 0 +} + +rm -f test1.img test.output + +../fish/guestfish --keys-from-stdin > test.output <<'EOF' +sparse test1.img 1G +run +part-init /dev/sda mbr +part-add /dev/sda p 64 1048575 +part-add /dev/sda p 1048576 -64 + +# Create LUKS device with key "key0" in slot 0. +luks-format /dev/sda1 0 +key0 + +# Create some unrelated LVs. +pvcreate /dev/sda2 +vgcreate VG /dev/sda2 +lvcreate LV1 /dev/VG 100 +lvcreate LV2 /dev/VG 200 +lvcreate LV3 /dev/VG 100 + +# Open the device as 'lukstest'. +luks-open /dev/sda1 lukstest +key0 + +# List devices, '/dev/mapper/lukstest' should appear. +echo test 1 +list-dm-devices + +# Close the device. +luks-close /dev/mapper/lukstest + +# List devices, '/dev/mapper/lukstest' should not appear. +echo test 2 +list-dm-devices + +# Open the device again. +luks-open /dev/sda1 lukstest +key0 + +# Check no LVs appear in list-dm-devices output. +echo test 3 +list-dm-devices + +# Check LUKS device doesn't appear in any of the other lists. +echo test 4 +list-devices | sed 's,^/dev/[hv]d,/dev/sd,' +echo test 5 +list-partitions | sed 's,^/dev/[hv]d,/dev/sd,' +echo test 6 +lvs +echo test 7 +vgs +echo test 8 +pvs | sed 's,^/dev/[hv]d,/dev/sd,' + +EOF + +# Expected vs actual output. +if [ "$(cat test.output)" != "\ +test 1 +/dev/mapper/lukstest +test 2 +test 3 +/dev/mapper/lukstest +test 4 +/dev/sda +test 5 +/dev/sda1 +/dev/sda2 +test 6 +/dev/VG/LV1 +/dev/VG/LV2 +/dev/VG/LV3 +test 7 +VG +test 8 +/dev/sda2" ]; then + echo "test-luks-list.sh: Unexpected output from test:" + cat test.output + echo "[end of output]" + exit 1 +fi + +rm -f test1.img test.output diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index c20f657..209ac45 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -286 +287 -- 1.7.5.2
Richard W.M. Jones
2011-Jul-12 12:39 UTC
[Libguestfs] [PATCH 2/2] fish: Show device mapper device in tab completion (RHBZ#688062).
-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://et.redhat.com/~rjones/virt-df/ -------------- next part -------------->From a8faf9fc808c9f64e21c397ce45f4092f3030fc7 Mon Sep 17 00:00:00 2001From: "Richard W.M. Jones" <rjones at redhat.com> Date: Tue, 12 Jul 2011 13:31:42 +0100 Subject: [PATCH 2/2] fish: Show device mapper device in tab completion (RHBZ#688062). With this change:><fs> luks-open /dev/vda1 lukstestEnter key or passphrase ("key"):><fs> ll /dev/<TAB>/dev/mapper/lukstest /dev/vda /dev/vda1 --- fish/destpaths.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/fish/destpaths.c b/fish/destpaths.c index 5ed93ec..3c90517 100644 --- a/fish/destpaths.c +++ b/fish/destpaths.c @@ -155,6 +155,9 @@ complete_dest_paths_generator (const char *text, int state) strs = guestfs_lvs (g); APPEND_STRS_AND_FREE; + + strs = guestfs_list_dm_devices (g); + APPEND_STRS_AND_FREE; } if (len < 1 || text[0] == '/') { -- 1.7.5.2
Reasonably Related Threads
- [libguestfs PATCH 0/3] test "/dev/mapper/VG-LV" with "--key"
- [libguestfs PATCH 3/3] LUKS-on-LVM inspection test: test /dev/mapper/VG-LV translation
- [guestfs-tools PATCH 0/3] test "/dev/mapper/VG-LV" with "--key"
- [PATCH 1/7] New APIs: cryptsetup-open and cryptsetup-close.
- [PATCH v2 1/7] New APIs: cryptsetup-open and cryptsetup-close.