mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-22 07:03:38 +00:00
This command run over the source: perl -pi.bak -e 's/(20[01][0-9])-2018/$1-2019/g' `git ls-files`
418 lines
11 KiB
Plaintext
418 lines
11 KiB
Plaintext
=head1 NAME
|
||
|
||
virt-edit - Edit a file in a virtual machine
|
||
|
||
=head1 SYNOPSIS
|
||
|
||
virt-edit [--options] -d domname file [file ...]
|
||
|
||
virt-edit [--options] -a disk.img [-a disk.img ...] file [file ...]
|
||
|
||
virt-edit [-d domname|-a disk.img] file -e 'expr'
|
||
|
||
Old-style:
|
||
|
||
virt-edit domname file
|
||
|
||
virt-edit disk.img [disk.img ...] file
|
||
|
||
=head1 DESCRIPTION
|
||
|
||
C<virt-edit> is a command line tool to edit C<file> where each C<file>
|
||
exists in the named virtual machine (or disk image).
|
||
|
||
Multiple filenames can be given, in which case they are each edited in
|
||
turn. Each filename must be a full path, starting at the root
|
||
directory (starting with '/').
|
||
|
||
If you want to just view a file, use L<virt-cat(1)>.
|
||
|
||
For more complex cases you should look at the L<guestfish(1)> tool
|
||
(see L</USING GUESTFISH> below).
|
||
|
||
C<virt-edit> cannot be used to create a new file. L<guestfish(1)> can
|
||
do that and much more.
|
||
|
||
=head1 EXAMPLES
|
||
|
||
Edit the named files interactively:
|
||
|
||
virt-edit -d mydomain /boot/grub/grub.conf
|
||
|
||
virt-edit -d mydomain /etc/passwd
|
||
|
||
For Windows guests, some Windows paths are understood:
|
||
|
||
virt-edit -d mywindomain 'c:\autoexec.bat'
|
||
|
||
If Perl is installed, you can also edit files non-interactively (see
|
||
L</NON-INTERACTIVE EDITING> below).
|
||
To change the init default level to 5:
|
||
|
||
virt-edit -d mydomain /etc/inittab -e 's/^id:.*/id:5:initdefault:/'
|
||
|
||
=head1 OPTIONS
|
||
|
||
=over 4
|
||
|
||
=item B<--help>
|
||
|
||
Display brief help.
|
||
|
||
=item B<-a> file
|
||
|
||
=item B<--add> file
|
||
|
||
Add I<file> which should be a disk image from a virtual machine. If
|
||
the virtual machine has multiple block devices, you must supply all of
|
||
them with separate I<-a> options.
|
||
|
||
The format of the disk image is auto-detected. To override this and
|
||
force a particular format use the I<--format=..> option.
|
||
|
||
=item B<-a> URI
|
||
|
||
=item B<--add> URI
|
||
|
||
Add a remote disk. See L<guestfish(1)/ADDING REMOTE STORAGE>.
|
||
|
||
=item B<-b> EXTENSION
|
||
|
||
=item B<--backup> EXTENSION
|
||
|
||
Create a backup of the original file I<in the guest disk image>.
|
||
The backup has the original filename with C<extension> added.
|
||
|
||
Usually the first character of C<extension> would be a dot C<.>
|
||
so you would write:
|
||
|
||
virt-edit -b .orig [etc]
|
||
|
||
By default, no backup file is made.
|
||
|
||
=item B<-c> URI
|
||
|
||
=item B<--connect> URI
|
||
|
||
If using libvirt, connect to the given I<URI>. If omitted, then we
|
||
connect to the default libvirt hypervisor.
|
||
|
||
If you specify guest block devices directly, then libvirt is not used
|
||
at all.
|
||
|
||
=item B<-d> GUEST
|
||
|
||
=item B<--domain> GUEST
|
||
|
||
Add all the disks from the named libvirt guest. Domain UUIDs can be
|
||
used instead of names.
|
||
|
||
=item B<--echo-keys>
|
||
|
||
When prompting for keys and passphrases, virt-edit normally turns
|
||
echoing off so you cannot see what you are typing. If you are not
|
||
worried about Tempest attacks and there is no one else in the room you
|
||
can specify this flag to see what you are typing.
|
||
|
||
=item B<-e> EXPR
|
||
|
||
=item B<--edit> EXPR
|
||
|
||
=item B<--expr> EXPR
|
||
|
||
Instead of launching the external editor, non-interactively
|
||
apply the Perl expression C<EXPR> to each line in the file.
|
||
See L</NON-INTERACTIVE EDITING> below.
|
||
|
||
Be careful to properly quote the expression to prevent it from
|
||
being altered by the shell.
|
||
|
||
Note that this option is only available when Perl 5 is installed.
|
||
|
||
=item B<--format=raw|qcow2|..>
|
||
|
||
=item B<--format>
|
||
|
||
The default for the I<-a> option is to auto-detect the format of the
|
||
disk image. Using this forces the disk format for I<-a> options which
|
||
follow on the command line. Using I<--format> with no argument
|
||
switches back to auto-detection for subsequent I<-a> options.
|
||
|
||
For example:
|
||
|
||
virt-edit --format=raw -a disk.img file
|
||
|
||
forces raw format (no auto-detection) for F<disk.img>.
|
||
|
||
virt-edit --format=raw -a disk.img --format -a another.img file
|
||
|
||
forces raw format (no auto-detection) for F<disk.img> and reverts to
|
||
auto-detection for F<another.img>.
|
||
|
||
If you have untrusted raw-format guest disk images, you should use
|
||
this option to specify the disk format. This avoids a possible
|
||
security problem with malicious guests (CVE-2010-3851).
|
||
|
||
=item B<--key> SELECTOR
|
||
|
||
Specify a key for LUKS, to automatically open a LUKS device when using
|
||
the inspection. C<SELECTOR> can be in one of the following formats:
|
||
|
||
=over 4
|
||
|
||
=item B<--key> C<DEVICE>:key:KEY_STRING
|
||
|
||
Use the specified C<KEY_STRING> as passphrase.
|
||
|
||
=item B<--key> C<DEVICE>:file:FILENAME
|
||
|
||
Read the passphrase from F<FILENAME>.
|
||
|
||
=back
|
||
|
||
=item B<--keys-from-stdin>
|
||
|
||
Read key or passphrase parameters from stdin. The default is
|
||
to try to read passphrases from the user by opening F</dev/tty>.
|
||
|
||
=item B<-m> dev[:mountpoint[:options[:fstype]]]
|
||
|
||
=item B<--mount> dev[:mountpoint[:options[:fstype]]]
|
||
|
||
Mount the named partition or logical volume on the given mountpoint.
|
||
|
||
If the mountpoint is omitted, it defaults to F</>.
|
||
|
||
Specifying any mountpoint disables the inspection of the guest and
|
||
the mount of its root and all of its mountpoints, so make sure
|
||
to mount all the mountpoints needed to work with the filenames
|
||
given as arguments.
|
||
|
||
If you don’t know what filesystems a disk image contains, you can
|
||
either run guestfish without this option, then list the partitions,
|
||
filesystems and LVs available (see L</list-partitions>,
|
||
L</list-filesystems> and L</lvs> commands), or you can use the
|
||
L<virt-filesystems(1)> program.
|
||
|
||
The third (and rarely used) part of the mount parameter is the list of
|
||
mount options used to mount the underlying filesystem. If this is not
|
||
given, then the mount options are either the empty string or C<ro>
|
||
(the latter if the I<--ro> flag is used). By specifying the mount
|
||
options, you override this default choice. Probably the only time you
|
||
would use this is to enable ACLs and/or extended attributes if the
|
||
filesystem can support them:
|
||
|
||
-m /dev/sda1:/:acl,user_xattr
|
||
|
||
Using this flag is equivalent to using the C<mount-options> command.
|
||
|
||
The fourth part of the parameter is the filesystem driver to use, such
|
||
as C<ext3> or C<ntfs>. This is rarely needed, but can be useful if
|
||
multiple drivers are valid for a filesystem (eg: C<ext2> and C<ext3>),
|
||
or if libguestfs misidentifies a filesystem.
|
||
|
||
=item B<-v>
|
||
|
||
=item B<--verbose>
|
||
|
||
Enable verbose messages for debugging.
|
||
|
||
=item B<-V>
|
||
|
||
=item B<--version>
|
||
|
||
Display version number and exit.
|
||
|
||
=item B<-x>
|
||
|
||
Enable tracing of libguestfs API calls.
|
||
|
||
=back
|
||
|
||
=head1 OLD-STYLE COMMAND LINE ARGUMENTS
|
||
|
||
Previous versions of virt-edit allowed you to write either:
|
||
|
||
virt-edit disk.img [disk.img ...] file
|
||
|
||
or
|
||
|
||
virt-edit guestname file
|
||
|
||
whereas in this version you should use I<-a> or I<-d> respectively
|
||
to avoid the confusing case where a disk image might have the same
|
||
name as a guest.
|
||
|
||
For compatibility the old style is still supported.
|
||
|
||
=head1 NON-INTERACTIVE EDITING
|
||
|
||
C<virt-edit> normally calls out to C<$EDITOR> (or vi) so
|
||
the system administrator can interactively edit the file.
|
||
|
||
There are two ways also to use C<virt-edit> from scripts in order to
|
||
make automated edits to files. (Note that although you I<can> use
|
||
C<virt-edit> like this, it’s less error-prone to write scripts
|
||
directly using the libguestfs API and Augeas for configuration file
|
||
editing.)
|
||
|
||
The first method is to temporarily set C<$EDITOR> to any script or
|
||
program you want to run. The script is invoked as C<$EDITOR tmpfile>
|
||
and it should update C<tmpfile> in place however it likes.
|
||
|
||
The second method is to use the I<-e> parameter of C<virt-edit> to run
|
||
a short Perl snippet in the style of L<sed(1)>. For example to
|
||
replace all instances of C<foo> with C<bar> in a file:
|
||
|
||
virt-edit -d domname filename -e 's/foo/bar/'
|
||
|
||
The full power of Perl regular expressions can be used (see
|
||
L<perlre(1)>). For example to delete root’s password you could do:
|
||
|
||
virt-edit -d domname /etc/passwd -e 's/^root:.*?:/root::/'
|
||
|
||
What really happens is that the snippet is evaluated as a Perl
|
||
expression for each line of the file. The line, including the final
|
||
C<\n>, is passed in C<$_> and the expression should update C<$_> or
|
||
leave it unchanged.
|
||
|
||
To delete a line, set C<$_> to the empty string. For example, to
|
||
delete the C<apache> user account from the password file you can do:
|
||
|
||
virt-edit -d mydomain /etc/passwd -e '$_ = "" if /^apache:/'
|
||
|
||
To insert a line, prepend or append it to C<$_>. However appending
|
||
lines to the end of the file is rather difficult this way since there
|
||
is no concept of "last line of the file" - your expression just
|
||
doesn't get called again. You might want to use the first method
|
||
(setting C<$EDITOR>) if you want to do this.
|
||
|
||
The variable C<$lineno> contains the current line number.
|
||
As is traditional, the first line in the file is number C<1>.
|
||
|
||
The return value from the expression is ignored, but the expression
|
||
may call C<die> in order to abort the whole program, leaving the
|
||
original file untouched.
|
||
|
||
Remember when matching the end of a line that C<$_> may contain the
|
||
final C<\n>, or (for DOS files) C<\r\n>, or if the file does not end
|
||
with a newline then neither of these. Thus to match or substitute
|
||
some text at the end of a line, use this regular expression:
|
||
|
||
/some text(\r?\n)?$/
|
||
|
||
Alternately, use the perl C<chomp> function, being careful not to
|
||
chomp C<$_> itself (since that would remove all newlines from the
|
||
file):
|
||
|
||
my $m = $_; chomp $m; $m =~ /some text$/
|
||
|
||
=head1 WINDOWS PATHS
|
||
|
||
C<virt-edit> has a limited ability to understand Windows drive letters
|
||
and paths (eg. F<E:\foo\bar.txt>).
|
||
|
||
If and only if the guest is running Windows then:
|
||
|
||
=over 4
|
||
|
||
=item *
|
||
|
||
Drive letter prefixes like C<C:> are resolved against the
|
||
Windows Registry to the correct filesystem.
|
||
|
||
=item *
|
||
|
||
Any backslash (C<\>) characters in the path are replaced
|
||
with forward slashes so that libguestfs can process it.
|
||
|
||
=item *
|
||
|
||
The path is resolved case insensitively to locate the file
|
||
that should be edited.
|
||
|
||
=back
|
||
|
||
There are some known shortcomings:
|
||
|
||
=over 4
|
||
|
||
=item *
|
||
|
||
Some NTFS symbolic links may not be followed correctly.
|
||
|
||
=item *
|
||
|
||
NTFS junction points that cross filesystems are not followed.
|
||
|
||
=back
|
||
|
||
=head1 USING GUESTFISH
|
||
|
||
L<guestfish(1)> is a more powerful, lower level tool which you can use
|
||
when C<virt-edit> doesn't work.
|
||
|
||
Using C<virt-edit> is approximately equivalent to doing:
|
||
|
||
guestfish --rw -i -d domname edit /file
|
||
|
||
where C<domname> is the name of the libvirt guest, and F</file> is the
|
||
full path to the file.
|
||
|
||
The command above uses libguestfs’s guest inspection feature and so
|
||
does not work on guests that libguestfs cannot inspect, or on things
|
||
like arbitrary disk images that don't contain guests. To edit a file
|
||
on a disk image directly, use:
|
||
|
||
guestfish --rw -a disk.img -m /dev/sda1 edit /file
|
||
|
||
where F<disk.img> is the disk image, F</dev/sda1> is the filesystem
|
||
within the disk image to edit, and F</file> is the full path to the
|
||
file.
|
||
|
||
C<virt-edit> cannot create new files. Use the guestfish commands
|
||
C<touch>, C<write> or C<upload> instead:
|
||
|
||
guestfish --rw -i -d domname touch /newfile
|
||
|
||
guestfish --rw -i -d domname write /newfile "new content"
|
||
|
||
guestfish --rw -i -d domname upload localfile /newfile
|
||
|
||
=head1 ENVIRONMENT VARIABLES
|
||
|
||
=over 4
|
||
|
||
=item C<EDITOR>
|
||
|
||
If set, this string is used as the editor. It may contain arguments,
|
||
eg. C<"emacs -nw">
|
||
|
||
If not set, C<vi> is used.
|
||
|
||
=back
|
||
|
||
=head1 EXIT STATUS
|
||
|
||
This program returns 0 if successful, or non-zero if there was an
|
||
error.
|
||
|
||
=head1 SEE ALSO
|
||
|
||
L<guestfs(3)>,
|
||
L<guestfish(1)>,
|
||
L<virt-cat(1)>,
|
||
L<virt-copy-in(1)>,
|
||
L<virt-tar-in(1)>,
|
||
L<http://libguestfs.org/>,
|
||
L<perl(1)>,
|
||
L<perlre(1)>.
|
||
|
||
=head1 AUTHOR
|
||
|
||
Richard W.M. Jones L<http://people.redhat.com/~rjones/>
|
||
|
||
=head1 COPYRIGHT
|
||
|
||
Copyright (C) 2009-2019 Red Hat Inc.
|