Compare commits
416 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27d75aee6d | ||
|
|
7adc61bd28 | ||
|
|
895518e9b7 | ||
|
|
8c9c012302 | ||
|
|
bba1b606ea | ||
|
|
12272cf017 | ||
|
|
3ac14b503c | ||
|
|
e7046fe55b | ||
|
|
1084cf6b17 | ||
|
|
737237a79e | ||
|
|
1edc00676a | ||
|
|
90bb4d2baf | ||
|
|
877a247a54 | ||
|
|
9cb066543f | ||
|
|
10655b63e0 | ||
|
|
af1ea247c4 | ||
|
|
83dda87efe | ||
|
|
6fa34707b2 | ||
|
|
82cadaec7f | ||
|
|
9eeb0986a8 | ||
|
|
c5c2923895 | ||
|
|
ad9f3a5f15 | ||
|
|
e602e8ba97 | ||
|
|
17b450096e | ||
|
|
712bdd9c94 | ||
|
|
5bc9c98e58 | ||
|
|
091dfaf12e | ||
|
|
aa5924b4a3 | ||
|
|
c399a6571d | ||
|
|
6a0f5623dc | ||
|
|
a92e54d898 | ||
|
|
de1ecfc738 | ||
|
|
0209f60e48 | ||
|
|
f00974982e | ||
|
|
383ca87990 | ||
|
|
698d9ad820 | ||
|
|
1317c346ab | ||
|
|
0893711f75 | ||
|
|
bc325acc76 | ||
|
|
958e08bd81 | ||
|
|
797a521575 | ||
|
|
d165325dd3 | ||
|
|
a1eed9c04c | ||
|
|
1fc58abcdd | ||
|
|
566608b2fc | ||
|
|
04ee36056b | ||
|
|
00b17b7430 | ||
|
|
67218f97d2 | ||
|
|
d0aaeeedab | ||
|
|
b4cbc4fbfc | ||
|
|
655a9a1be9 | ||
|
|
64a8335772 | ||
|
|
b0b5282cc0 | ||
|
|
f7d93df6a3 | ||
|
|
884fa6683d | ||
|
|
97c01ad3a0 | ||
|
|
d08c746e96 | ||
|
|
ff5b9715aa | ||
|
|
969d54fb5a | ||
|
|
9a92c16bc3 | ||
|
|
edf1795145 | ||
|
|
3f27c698db | ||
|
|
0e0e918557 | ||
|
|
0b9d476db9 | ||
|
|
83f3f8ba76 | ||
|
|
74d7816935 | ||
|
|
481bf76bda | ||
|
|
8f1a2c16fd | ||
|
|
a05db77608 | ||
|
|
9077713557 | ||
|
|
dff1c1d431 | ||
|
|
df317de3c7 | ||
|
|
dfc275f11d | ||
|
|
7feb33cf01 | ||
|
|
ad7b6d94c1 | ||
|
|
1b88c17833 | ||
|
|
2592e5fc60 | ||
|
|
608cf467fa | ||
|
|
18d0372353 | ||
|
|
4bc6624556 | ||
|
|
4098de8c52 | ||
|
|
706a26efde | ||
|
|
aad58ab4ed | ||
|
|
199875924f | ||
|
|
de83481787 | ||
|
|
a8d4e14528 | ||
|
|
79af29a9b7 | ||
|
|
ca0111fc5a | ||
|
|
89084e10d2 | ||
|
|
deb6124adb | ||
|
|
266db04dfd | ||
|
|
1b8e34eb45 | ||
|
|
181f457c59 | ||
|
|
3a2a7734bd | ||
|
|
43a1d7a110 | ||
|
|
da7b003571 | ||
|
|
345e2a7513 | ||
|
|
9ee8f6de71 | ||
|
|
eb5bfa36cc | ||
|
|
e48d79759a | ||
|
|
e42b2838a8 | ||
|
|
cd66355dd5 | ||
|
|
ac1e012eb1 | ||
|
|
ab2d1d568e | ||
|
|
0d42c50ccc | ||
|
|
78db150555 | ||
|
|
57a9beeac9 | ||
|
|
7c85e98f6f | ||
|
|
15f0fe6b03 | ||
|
|
ef0dbaea60 | ||
|
|
007cc47bef | ||
|
|
6414c52e4d | ||
|
|
b81ea517da | ||
|
|
47191e3da1 | ||
|
|
67766db26b | ||
|
|
25ec33956f | ||
|
|
7f1b9ab599 | ||
|
|
72d1e2e1de | ||
|
|
f4541eac6e | ||
|
|
cd873a392d | ||
|
|
509077f1d6 | ||
|
|
36ce025ec9 | ||
|
|
e2d237c476 | ||
|
|
5370766302 | ||
|
|
5e7e03448a | ||
|
|
f3d71cb4e8 | ||
|
|
1ebe4be020 | ||
|
|
e1d896a8a1 | ||
|
|
dd756afd60 | ||
|
|
5fe1618c69 | ||
|
|
191ba1199e | ||
|
|
3618f7a33c | ||
|
|
9f346950b8 | ||
|
|
f1cce8400e | ||
|
|
cb2b302101 | ||
|
|
fd4b4a4b62 | ||
|
|
5454a28797 | ||
|
|
19312656d8 | ||
|
|
c3704e0200 | ||
|
|
f8b1780c7d | ||
|
|
06dd88ce06 | ||
|
|
68f61c4dfc | ||
|
|
6140dbc2f0 | ||
|
|
a64cbbf92a | ||
|
|
8f14a2c354 | ||
|
|
8f8c5740d5 | ||
|
|
1dfae674ee | ||
|
|
ea7571f662 | ||
|
|
75f10447a6 | ||
|
|
079cc475fb | ||
|
|
c913345514 | ||
|
|
1d510c3e2c | ||
|
|
3c86bbd78e | ||
|
|
0e746eddb8 | ||
|
|
c0052f0c34 | ||
|
|
f1b5b138be | ||
|
|
9613879357 | ||
|
|
d15a8071b1 | ||
|
|
4ab8c7248f | ||
|
|
1783711e2f | ||
|
|
ce0a8a8976 | ||
|
|
e598e60d7c | ||
|
|
75e77be87a | ||
|
|
8a7ee9b294 | ||
|
|
7f0f202975 | ||
|
|
7c2b529975 | ||
|
|
4c4ca3eda2 | ||
|
|
3336b47a09 | ||
|
|
461e5bef9c | ||
|
|
51cdb68f09 | ||
|
|
d2bb9986b2 | ||
|
|
5106bb9547 | ||
|
|
97290932ce | ||
|
|
419bada284 | ||
|
|
65d9d766a2 | ||
|
|
ed16a793e0 | ||
|
|
b5435eeae3 | ||
|
|
37b78c5d2f | ||
|
|
c6fc8008f3 | ||
|
|
5f98d3ef87 | ||
|
|
04309c70cd | ||
|
|
489fcddcb7 | ||
|
|
6f05a2f91c | ||
|
|
9386c1d522 | ||
|
|
1a2b1681de | ||
|
|
05680b55f6 | ||
|
|
e2c24718cf | ||
|
|
db62beac35 | ||
|
|
58d553dcbd | ||
|
|
6c323aeaf2 | ||
|
|
941da64078 | ||
|
|
4c961db464 | ||
|
|
34629afce6 | ||
|
|
689bd7669a | ||
|
|
2be2382c8f | ||
|
|
8df9b2daac | ||
|
|
bc142755f6 | ||
|
|
0b4e08f0b4 | ||
|
|
c8896d32cb | ||
|
|
af41447287 | ||
|
|
6b72a37644 | ||
|
|
85d3203b3a | ||
|
|
f1ab20704e | ||
|
|
baa2e3c243 | ||
|
|
1ead53a482 | ||
|
|
d4725ab61b | ||
|
|
063aa237e0 | ||
|
|
8f17229bff | ||
|
|
6ab119c488 | ||
|
|
a6a11a65c9 | ||
|
|
8f6ba6d789 | ||
|
|
f331cc95d3 | ||
|
|
928729ea6e | ||
|
|
9da4883de4 | ||
|
|
b091b5dde2 | ||
|
|
cc9dde2cb7 | ||
|
|
8c3b34551e | ||
|
|
3c91923901 | ||
|
|
16a560c22f | ||
|
|
4a269d5cf9 | ||
|
|
175743174b | ||
|
|
e38829eec1 | ||
|
|
4fa48327db | ||
|
|
97b5f69cda | ||
|
|
d494fdb90a | ||
|
|
070ac54283 | ||
|
|
d8408afe21 | ||
|
|
7e7de18823 | ||
|
|
0c9b3562af | ||
|
|
cbf97ecfad | ||
|
|
49700015ed | ||
|
|
1a5193c66e | ||
|
|
2f9953e2d1 | ||
|
|
4caba8df2f | ||
|
|
1aa43ac92e | ||
|
|
30d986c2bc | ||
|
|
3b8eaf5cc4 | ||
|
|
9cc996f109 | ||
|
|
374f82f47f | ||
|
|
cfa88f9c57 | ||
|
|
99c563d97c | ||
|
|
a211636966 | ||
|
|
a759a6527c | ||
|
|
1ece913403 | ||
|
|
7dba19275f | ||
|
|
c0f168d644 | ||
|
|
8e5955c8cd | ||
|
|
b0858dfd8d | ||
|
|
b40248ac63 | ||
|
|
84c3a4792e | ||
|
|
60355566b1 | ||
|
|
c519d3e43e | ||
|
|
17b1123681 | ||
|
|
813ffc39ae | ||
|
|
f38735b278 | ||
|
|
21dc46bc2f | ||
|
|
aa4afaf185 | ||
|
|
2909764dcc | ||
|
|
bde6f7fba6 | ||
|
|
b509da932d | ||
|
|
7b18e47f5e | ||
|
|
e37dfc33c2 | ||
|
|
fabfd2fbe9 | ||
|
|
dd205f300a | ||
|
|
42818e7e23 | ||
|
|
b43882fe67 | ||
|
|
cbdfa80fe9 | ||
|
|
d33d482cf7 | ||
|
|
91d83514c4 | ||
|
|
c822e8c6ce | ||
|
|
b8ac2c8b68 | ||
|
|
47cd88a1cc | ||
|
|
24fa0807a5 | ||
|
|
6ee5b15245 | ||
|
|
85c51621ab | ||
|
|
ed63a04553 | ||
|
|
959f22e6d8 | ||
|
|
5c1ab310eb | ||
|
|
2b9f5a19f6 | ||
|
|
48bb17705f | ||
|
|
128db1e9aa | ||
|
|
8e247b706c | ||
|
|
d8b20c846c | ||
|
|
22b8a21feb | ||
|
|
450c22c188 | ||
|
|
35680038b9 | ||
|
|
e9087981ae | ||
|
|
29e15986f0 | ||
|
|
5156cc7e12 | ||
|
|
01e2244a84 | ||
|
|
2a5c0ae43b | ||
|
|
13c5e911e4 | ||
|
|
60f7297fe5 | ||
|
|
4a2fec1fb1 | ||
|
|
ca6d3c66e5 | ||
|
|
f17a33dea6 | ||
|
|
955f13fda6 | ||
|
|
6f261cafba | ||
|
|
90a710c93d | ||
|
|
19a21be689 |
||
|
|
3f9aa057a9 | ||
|
|
2404f718a0 | ||
|
|
6ae06d4e94 | ||
|
|
3c0504323e | ||
|
|
19ec0fbda7 | ||
|
|
033157bb4e | ||
|
|
82f97b22c2 | ||
|
|
b0b57c62cc | ||
|
|
c7c4488f6a | ||
|
|
a1ee2d74f3 | ||
|
|
11ab21d8a6 | ||
|
|
bcb8b1c0b4 | ||
|
|
d7c0a1924e | ||
|
|
b92cecbe15 | ||
|
|
bd1cb7ffa5 | ||
|
|
1ec687372d | ||
|
|
60b4ea1cc1 | ||
|
|
4cd4ff292b | ||
|
|
ddebce8014 | ||
|
|
c317bc4a01 | ||
|
|
c1eec06fc3 | ||
|
|
00ee4d8211 | ||
|
|
2c9d3e4854 | ||
|
|
e311dbaaf6 | ||
|
|
b870831bd1 | ||
|
|
95e46234b5 | ||
|
|
ba9ed0975e | ||
|
|
f129ad178f | ||
|
|
a120fa3b9e | ||
|
|
0f49172c3c | ||
|
|
8dbfe7ab9e | ||
|
|
c6cf73a4e4 | ||
|
|
18c433882a | ||
|
|
04a92597b7 | ||
|
|
4cbc2d5ccb | ||
|
|
7bf2744f0e | ||
|
|
1da42b70a5 | ||
|
|
b57feae1af | ||
|
|
8a46035427 | ||
|
|
0fc7c3e4db | ||
|
|
c251db3ac8 | ||
|
|
f034e58d54 | ||
|
|
02bf5b3c16 | ||
|
|
fcdb74bc43 | ||
|
|
e67c8965a4 | ||
|
|
4d1f692eeb | ||
|
|
7e3a9dd192 | ||
|
|
fb05053661 | ||
|
|
605bf58332 | ||
|
|
f8c98eab62 | ||
|
|
6657479671 | ||
|
|
75bec837bb | ||
|
|
90a1a50306 | ||
|
|
c495bb10bf |
||
|
|
fde194480e | ||
|
|
a088a41fff | ||
|
|
ca07dae173 | ||
|
|
a2e437013a | ||
|
|
c12622ca03 | ||
|
|
802f1260a8 | ||
|
|
b3901f5d4a | ||
|
|
250df0e22f | ||
|
|
98a22571d6 | ||
|
|
9362d4e48c | ||
|
|
78f43cd786 | ||
|
|
5a408f5bb6 | ||
|
|
d5790479a7 | ||
|
|
c483e7c7c1 | ||
|
|
48421ed08e | ||
|
|
5829977618 | ||
|
|
2624e9cee2 | ||
|
|
252b7e902e | ||
|
|
2e5c1fa3be | ||
|
|
6cd3388a5c | ||
|
|
1d53743969 | ||
|
|
bfca8190ac | ||
|
|
a65ce5f485 | ||
|
|
a151621171 | ||
|
|
b33fa370d0 | ||
|
|
7c48de4082 | ||
|
|
bd815fe52b | ||
|
|
02b97ca4fe | ||
|
|
b2e667438f | ||
|
|
c7aa6a9556 | ||
|
|
768b0905ad | ||
|
|
85a051511c | ||
|
|
042f8d5407 | ||
|
|
44d4f2b62e | ||
|
|
bc25764f3b | ||
|
|
66b3f9f867 | ||
|
|
dd46ffb390 | ||
|
|
bf91135584 | ||
|
|
fa32854257 | ||
|
|
4d67ac5ae8 | ||
|
|
343b3dc3a0 | ||
|
|
eff54a4628 | ||
|
|
559e0ff2ba | ||
|
|
d75f43946b | ||
|
|
8278d4f686 | ||
|
|
b15921b88d | ||
|
|
d331572aa7 | ||
|
|
2f067e943f | ||
|
|
44ca54113a | ||
|
|
b34bc35715 | ||
|
|
2c179a1ef7 | ||
|
|
5b3d4bfa77 | ||
|
|
b12ceb145a | ||
|
|
0c5c45106f | ||
|
|
67718b0ac8 | ||
|
|
cc69908e53 | ||
|
|
8a53c8a8c3 | ||
|
|
683d98cd6d | ||
|
|
43320b299b | ||
|
|
96537d9508 | ||
|
|
9bb13a3a1f | ||
|
|
778c71f0ae |
20 changed files with 1467 additions and 3188 deletions
|
|
@ -1,126 +0,0 @@
|
|||
From 2e70ca8b362e53976717a7519052faeffc31d4f2 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Thu, 2 Mar 2017 12:42:46 +0000
|
||||
Subject: [PATCH 01/10] generator: Deprecate direct mode (guestfs_set_direct,
|
||||
guestfs_get_direct).
|
||||
|
||||
(cherry picked from commit 26948d5cb17391a32856b18b8a5d6ae58a179507)
|
||||
---
|
||||
generator/actions_properties.ml | 28 ----------------------------
|
||||
generator/actions_properties_deprecated.ml | 30 ++++++++++++++++++++++++++++++
|
||||
rescue/rescue.c | 3 +++
|
||||
test-tool/test-tool.c | 1 -
|
||||
4 files changed, 33 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/generator/actions_properties.ml b/generator/actions_properties.ml
|
||||
index 8f6455b81..87144b14f 100644
|
||||
--- a/generator/actions_properties.ml
|
||||
+++ b/generator/actions_properties.ml
|
||||
@@ -260,34 +260,6 @@ C<guestfs_set_event_callback>)." };
|
||||
Return the command trace flag." };
|
||||
|
||||
{ defaults with
|
||||
- name = "set_direct"; added = (1, 0, 72);
|
||||
- style = RErr, [Bool "direct"], [];
|
||||
- fish_alias = ["direct"]; config_only = true;
|
||||
- blocking = false;
|
||||
- shortdesc = "enable or disable direct appliance mode";
|
||||
- longdesc = "\
|
||||
-If the direct appliance mode flag is enabled, then stdin and
|
||||
-stdout are passed directly through to the appliance once it
|
||||
-is launched.
|
||||
-
|
||||
-One consequence of this is that log messages aren't caught
|
||||
-by the library and handled by C<guestfs_set_log_message_callback>,
|
||||
-but go straight to stdout.
|
||||
-
|
||||
-You probably don't want to use this unless you know what you
|
||||
-are doing.
|
||||
-
|
||||
-The default is disabled." };
|
||||
-
|
||||
- { defaults with
|
||||
- name = "get_direct"; added = (1, 0, 72);
|
||||
- style = RBool "direct", [], [];
|
||||
- blocking = false;
|
||||
- shortdesc = "get direct appliance mode flag";
|
||||
- longdesc = "\
|
||||
-Return the direct appliance mode flag." };
|
||||
-
|
||||
- { defaults with
|
||||
name = "set_recovery_proc"; added = (1, 0, 77);
|
||||
style = RErr, [Bool "recoveryproc"], [];
|
||||
fish_alias = ["recovery-proc"]; config_only = true;
|
||||
diff --git a/generator/actions_properties_deprecated.ml b/generator/actions_properties_deprecated.ml
|
||||
index def17b926..53277822e 100644
|
||||
--- a/generator/actions_properties_deprecated.ml
|
||||
+++ b/generator/actions_properties_deprecated.ml
|
||||
@@ -125,6 +125,36 @@ Return the current backend.
|
||||
|
||||
See C<guestfs_set_backend> and L<guestfs(3)/BACKEND>." };
|
||||
|
||||
+ { defaults with
|
||||
+ name = "set_direct"; added = (1, 0, 72);
|
||||
+ style = RErr, [Bool "direct"], [];
|
||||
+ deprecated_by = Deprecated_no_replacement;
|
||||
+ fish_alias = ["direct"]; config_only = true;
|
||||
+ blocking = false;
|
||||
+ shortdesc = "enable or disable direct appliance mode";
|
||||
+ longdesc = "\
|
||||
+If the direct appliance mode flag is enabled, then stdin and
|
||||
+stdout are passed directly through to the appliance once it
|
||||
+is launched.
|
||||
+
|
||||
+One consequence of this is that log messages aren't caught
|
||||
+by the library and handled by C<guestfs_set_log_message_callback>,
|
||||
+but go straight to stdout.
|
||||
+
|
||||
+You probably don't want to use this unless you know what you
|
||||
+are doing.
|
||||
+
|
||||
+The default is disabled." };
|
||||
+
|
||||
+ { defaults with
|
||||
+ name = "get_direct"; added = (1, 0, 72);
|
||||
+ style = RBool "direct", [], [];
|
||||
+ deprecated_by = Deprecated_no_replacement;
|
||||
+ blocking = false;
|
||||
+ shortdesc = "get direct appliance mode flag";
|
||||
+ longdesc = "\
|
||||
+Return the direct appliance mode flag." };
|
||||
+
|
||||
]
|
||||
|
||||
let daemon_functions = [
|
||||
diff --git a/rescue/rescue.c b/rescue/rescue.c
|
||||
index 45967b2ad..b692e5a07 100644
|
||||
--- a/rescue/rescue.c
|
||||
+++ b/rescue/rescue.c
|
||||
@@ -295,9 +295,12 @@ main (int argc, char *argv[])
|
||||
usage (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
+#pragma GCC diagnostic push
|
||||
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
/* Setting "direct mode" is required for the rescue appliance. */
|
||||
if (guestfs_set_direct (g, 1) == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
+#pragma GCC diagnostic pop
|
||||
|
||||
{
|
||||
/* The libvirt backend doesn't support direct mode. As a temporary
|
||||
diff --git a/test-tool/test-tool.c b/test-tool/test-tool.c
|
||||
index 20e2a32fa..2ae266d7d 100644
|
||||
--- a/test-tool/test-tool.c
|
||||
+++ b/test-tool/test-tool.c
|
||||
@@ -224,7 +224,6 @@ main (int argc, char *argv[])
|
||||
p = guestfs_get_cachedir (g);
|
||||
printf ("guestfs_get_cachedir: %s\n", p ? : "(null)");
|
||||
free (p);
|
||||
- printf ("guestfs_get_direct: %d\n", guestfs_get_direct (g));
|
||||
p = guestfs_get_hv (g);
|
||||
printf ("guestfs_get_hv: %s\n", p);
|
||||
free (p);
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,185 +0,0 @@
|
|||
From 0fb454a7887727f7319fecc0caf2d55af3390062 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Thu, 2 Mar 2017 11:06:27 +0000
|
||||
Subject: [PATCH 02/10] New API: internal-get-console-socket to support
|
||||
virt-rescue.
|
||||
|
||||
This API intended for use by virt-rescue only gets the file descriptor
|
||||
of the console socket.
|
||||
|
||||
(cherry picked from commit 84c9f98c2e09a459ced3c7e85191f2e47d149a52)
|
||||
---
|
||||
generator/actions_core.ml | 11 +++++++
|
||||
generator/actions_properties_deprecated.ml | 4 +--
|
||||
lib/Makefile.am | 1 +
|
||||
lib/conn-socket.c | 16 +++++++++-
|
||||
lib/guestfs-internal.h | 3 ++
|
||||
lib/rescue.c | 47 ++++++++++++++++++++++++++++++
|
||||
6 files changed, 79 insertions(+), 3 deletions(-)
|
||||
create mode 100644 lib/rescue.c
|
||||
|
||||
diff --git a/generator/actions_core.ml b/generator/actions_core.ml
|
||||
index 5e487df02..259ca9051 100644
|
||||
--- a/generator/actions_core.ml
|
||||
+++ b/generator/actions_core.ml
|
||||
@@ -1722,6 +1722,17 @@ call it returns a simple true/false boolean result, instead
|
||||
of throwing an exception if a feature is not found. For
|
||||
other documentation see C<guestfs_available>." };
|
||||
|
||||
+ { defaults with
|
||||
+ name = "internal_get_console_socket"; added = (1, 37, 1);
|
||||
+ style = RInt "fd", [], [];
|
||||
+ visibility = VInternal;
|
||||
+ test_excuse = "writing to the socket may block";
|
||||
+ shortdesc = "get the appliance console socket";
|
||||
+ longdesc = "\
|
||||
+This call is used by L<virt-rescue(1)> to write directly to
|
||||
+appliance console (for passing through keystrokes). It should
|
||||
+not normally be used by other libguestfs users." };
|
||||
+
|
||||
]
|
||||
|
||||
let daemon_functions = [
|
||||
diff --git a/generator/actions_properties_deprecated.ml b/generator/actions_properties_deprecated.ml
|
||||
index 53277822e..f36509e75 100644
|
||||
--- a/generator/actions_properties_deprecated.ml
|
||||
+++ b/generator/actions_properties_deprecated.ml
|
||||
@@ -128,7 +128,7 @@ See C<guestfs_set_backend> and L<guestfs(3)/BACKEND>." };
|
||||
{ defaults with
|
||||
name = "set_direct"; added = (1, 0, 72);
|
||||
style = RErr, [Bool "direct"], [];
|
||||
- deprecated_by = Deprecated_no_replacement;
|
||||
+ deprecated_by = Replaced_by "internal_get_console_socket";
|
||||
fish_alias = ["direct"]; config_only = true;
|
||||
blocking = false;
|
||||
shortdesc = "enable or disable direct appliance mode";
|
||||
@@ -149,7 +149,7 @@ The default is disabled." };
|
||||
{ defaults with
|
||||
name = "get_direct"; added = (1, 0, 72);
|
||||
style = RBool "direct", [], [];
|
||||
- deprecated_by = Deprecated_no_replacement;
|
||||
+ deprecated_by = Replaced_by "internal_get_console_socket";
|
||||
blocking = false;
|
||||
shortdesc = "get direct appliance mode flag";
|
||||
longdesc = "\
|
||||
diff --git a/lib/Makefile.am b/lib/Makefile.am
|
||||
index 22974187f..c3e013a52 100644
|
||||
--- a/lib/Makefile.am
|
||||
+++ b/lib/Makefile.am
|
||||
@@ -117,6 +117,7 @@ libguestfs_la_SOURCES = \
|
||||
private-data.c \
|
||||
proto.c \
|
||||
qemu.c \
|
||||
+ rescue.c \
|
||||
stringsbuf.c \
|
||||
structs-compare.c \
|
||||
structs-copy.c \
|
||||
diff --git a/lib/conn-socket.c b/lib/conn-socket.c
|
||||
index 2cd261a2b..8ecfed856 100644
|
||||
--- a/lib/conn-socket.c
|
||||
+++ b/lib/conn-socket.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* libguestfs
|
||||
- * Copyright (C) 2013 Red Hat Inc.
|
||||
+ * Copyright (C) 2013-2017 Red Hat Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -397,6 +397,19 @@ handle_log_message (guestfs_h *g,
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static int
|
||||
+get_console_sock (guestfs_h *g, struct connection *connv)
|
||||
+{
|
||||
+ struct connection_socket *conn = (struct connection_socket *) connv;
|
||||
+
|
||||
+ if (conn->console_sock == -1) {
|
||||
+ error (g, _("console socket not connected"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ return conn->console_sock;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
free_conn_socket (guestfs_h *g, struct connection *connv)
|
||||
{
|
||||
@@ -418,6 +431,7 @@ static struct connection_ops ops = {
|
||||
.read_data = read_data,
|
||||
.write_data = write_data,
|
||||
.can_read_data = can_read_data,
|
||||
+ .get_console_sock = get_console_sock,
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
|
||||
index 949cacfef..51f532a1b 100644
|
||||
--- a/lib/guestfs-internal.h
|
||||
+++ b/lib/guestfs-internal.h
|
||||
@@ -373,6 +373,9 @@ struct connection_ops {
|
||||
* Returns: 1 = yes, 0 = no, -1 = error
|
||||
*/
|
||||
int (*can_read_data) (guestfs_h *g, struct connection *);
|
||||
+
|
||||
+ /* Get the console socket (to support virt-rescue). */
|
||||
+ int (*get_console_sock) (guestfs_h *g, struct connection *);
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/lib/rescue.c b/lib/rescue.c
|
||||
new file mode 100644
|
||||
index 000000000..ae7811a31
|
||||
--- /dev/null
|
||||
+++ b/lib/rescue.c
|
||||
@@ -0,0 +1,47 @@
|
||||
+/* libguestfs
|
||||
+ * Copyright (C) 2017 Red Hat Inc.
|
||||
+ *
|
||||
+ * This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library 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
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with this library; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
+ */
|
||||
+
|
||||
+/**
|
||||
+ * Support for virt-rescue(1).
|
||||
+ */
|
||||
+
|
||||
+#include <config.h>
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <errno.h>
|
||||
+#include <libintl.h>
|
||||
+
|
||||
+#include "guestfs.h"
|
||||
+#include "guestfs-internal.h"
|
||||
+#include "guestfs-internal-actions.h"
|
||||
+
|
||||
+int
|
||||
+guestfs_impl_internal_get_console_socket (guestfs_h *g)
|
||||
+{
|
||||
+ if (!g->conn) {
|
||||
+ error (g, _("no console socket, the handle must be launched"));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!g->conn->ops->get_console_sock)
|
||||
+ NOT_SUPPORTED (g, -1,
|
||||
+ _("connection class does not support getting the console socket"));
|
||||
+
|
||||
+ return g->conn->ops->get_console_sock (g, g->conn);
|
||||
+}
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
From e1f952372e3df410295c60ddbad24d45b93551af Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 3 Mar 2017 10:14:20 +0000
|
||||
Subject: [PATCH 03/10] lib: Return EPIPE for "appliance closed the connection
|
||||
unexpectedly".
|
||||
|
||||
(cherry picked from commit 8af9acd4e31e9880e14735b2242c496ee017c0d9)
|
||||
---
|
||||
lib/errors.c | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/lib/errors.c b/lib/errors.c
|
||||
index c2af611ee..ace6a89cf 100644
|
||||
--- a/lib/errors.c
|
||||
+++ b/lib/errors.c
|
||||
@@ -358,12 +358,15 @@ void
|
||||
guestfs_int_unexpected_close_error (guestfs_h *g)
|
||||
{
|
||||
if (g->verbose)
|
||||
- error (g, _("appliance closed the connection unexpectedly, see earlier error messages"));
|
||||
+ guestfs_int_error_errno (g, EPIPE,
|
||||
+ _("appliance closed the connection unexpectedly, "
|
||||
+ "see earlier error messages"));
|
||||
else
|
||||
- error (g, _(
|
||||
- "appliance closed the connection unexpectedly.\n"
|
||||
- "This usually means the libguestfs appliance crashed.\n"
|
||||
- DEBUG_ADVICE));
|
||||
+ guestfs_int_error_errno (g, EPIPE,
|
||||
+ _("appliance closed the connection unexpectedly.\n"
|
||||
+ "This usually means the libguestfs appliance "
|
||||
+ "crashed.\n"
|
||||
+ DEBUG_ADVICE));
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,533 +0,0 @@
|
|||
From 20acc6cf3ebf873497e0be95bd5d3daad56cecd5 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Thu, 2 Mar 2017 13:46:48 +0000
|
||||
Subject: [PATCH 04/10] rescue: Modify virt-rescue so it doesn't use direct
|
||||
mode (RHBZ#1152819, RHBZ#1171654).
|
||||
|
||||
Instead of using "direct mode" (which was basically a quick hack),
|
||||
virt-rescue now launches the appliance with a running daemon.
|
||||
|
||||
The daemon doesn't do much -- there is still a bash shell which the
|
||||
user interacts with. The daemon is there simply to provide the
|
||||
initial GUESTFS_LAUNCH_FLAG message and to handle shutdown a bit more
|
||||
gracefully.
|
||||
|
||||
To interact with the shell, and replacing direct mode, virt-rescue now
|
||||
prints out log messages (the output of the shell), and sends input
|
||||
typed by the user directly to the console socket. This uses the
|
||||
guestfs_internal_get_console_socket API added previously. Most of the
|
||||
complexity behind this is hidden in virt-rescue.
|
||||
|
||||
This fully fixes the handling of ^C (RHBZ#1152819). Also there were
|
||||
earlier reports that full screen commands like 'vim' didn't work well,
|
||||
(RHBZ#1171654), but in this version vim appears to work fine, albeit
|
||||
only using 80x24 of the screen because of the serial console.
|
||||
|
||||
(cherry picked from commit 32d60801443647b3523b9374c431fefdbf054e3c)
|
||||
---
|
||||
appliance/init | 91 ++++++++--------
|
||||
rescue/Makefile.am | 1 +
|
||||
rescue/rescue.c | 306 +++++++++++++++++++++++++++++++++++++++++++++--------
|
||||
3 files changed, 312 insertions(+), 86 deletions(-)
|
||||
|
||||
diff --git a/appliance/init b/appliance/init
|
||||
index 8a26e1a02..810f84d22 100755
|
||||
--- a/appliance/init
|
||||
+++ b/appliance/init
|
||||
@@ -159,59 +159,62 @@ if test "$guestfs_verbose" = 1 && test "$guestfs_boot_analysis" != 1; then
|
||||
echo -n "uptime: "; cat /proc/uptime
|
||||
fi
|
||||
|
||||
-if ! test "$guestfs_rescue" = 1; then
|
||||
- # Run the daemon.
|
||||
- cmd="guestfsd"
|
||||
- eval `grep -Eo 'guestfs_channel=[^[:space:]]+' /proc/cmdline`
|
||||
- if test "x$guestfs_channel" != "x"; then
|
||||
+# Run the daemon.
|
||||
+cmd="guestfsd"
|
||||
+eval `grep -Eo 'guestfs_channel=[^[:space:]]+' /proc/cmdline`
|
||||
+if test "x$guestfs_channel" != "x"; then
|
||||
cmd="$cmd --channel $guestfs_channel"
|
||||
- fi
|
||||
- if test "$guestfs_verbose" = 1; then
|
||||
+fi
|
||||
+if test "$guestfs_verbose" = 1; then
|
||||
cmd="$cmd --verbose"
|
||||
- fi
|
||||
- if test "$guestfs_network" = 1; then
|
||||
+fi
|
||||
+if test "$guestfs_network" = 1; then
|
||||
cmd="$cmd --network"
|
||||
- fi
|
||||
- echo $cmd
|
||||
- $cmd
|
||||
+fi
|
||||
+if ! test "$guestfs_rescue" = 1; then
|
||||
+ echo $cmd
|
||||
+ $cmd
|
||||
else
|
||||
- # Run virt-rescue shell.
|
||||
+ # Run virt-rescue shell.
|
||||
|
||||
- # Get name of the serial port, from console= passed by libguestfs.
|
||||
- guestfs_serial=$(grep -Eo 'console=[^[:space:]]+' /proc/cmdline |
|
||||
- sed s/console=//)
|
||||
+ # We need a daemon, even in virt-rescue.
|
||||
+ $cmd &
|
||||
|
||||
- # Remove LD_PRELOAD=libSegFault set above.
|
||||
- unset LD_PRELOAD
|
||||
+ # Get name of the serial port, from console= passed by libguestfs.
|
||||
+ guestfs_serial=$(grep -Eo 'console=[^[:space:]]+' /proc/cmdline |
|
||||
+ sed s/console=//)
|
||||
|
||||
- :> $HOME/.bashrc
|
||||
- grep -Eo 'TERM=[^[:space:]]+' /proc/cmdline >> $HOME/.bashrc
|
||||
- echo "PS1='><rescue> '" >> $HOME/.bashrc
|
||||
- echo "export TERM PS1" >> $HOME/.bashrc
|
||||
+ # Remove LD_PRELOAD=libSegFault set above.
|
||||
+ unset LD_PRELOAD
|
||||
|
||||
- # The shell is opened by default on /dev/console, which (on Linux)
|
||||
- # is not a controlling terminal, causing job control to fail. For
|
||||
- # how we work around this, see:
|
||||
- # https://busybox.net/FAQ.html#job_control
|
||||
- run_bash_with_ctty ()
|
||||
- {
|
||||
- setsid bash -c \
|
||||
- "exec bash </dev/$guestfs_serial >/dev/$guestfs_serial 2>&1"
|
||||
- }
|
||||
+ :> $HOME/.bashrc
|
||||
+ grep -Eo 'TERM=[^[:space:]]+' /proc/cmdline >> $HOME/.bashrc
|
||||
+ echo "PS1='><rescue> '" >> $HOME/.bashrc
|
||||
+ echo "export TERM PS1" >> $HOME/.bashrc
|
||||
|
||||
- echo
|
||||
- echo "------------------------------------------------------------"
|
||||
- echo
|
||||
- echo "Welcome to virt-rescue, the libguestfs rescue shell."
|
||||
- echo
|
||||
- echo "Note: The contents of / are the rescue appliance."
|
||||
- echo "You have to mount the guest's partitions under /sysroot"
|
||||
- echo "before you can examine them."
|
||||
- echo
|
||||
- run_bash_with_ctty
|
||||
- echo
|
||||
- echo "virt-rescue: Syncing the disk now before exiting ..."
|
||||
- echo
|
||||
+ # The shell is opened by default on /dev/console, which (on Linux)
|
||||
+ # is not a controlling terminal, causing job control to fail. For
|
||||
+ # how we work around this, see:
|
||||
+ # https://busybox.net/FAQ.html#job_control
|
||||
+ run_bash_with_ctty ()
|
||||
+ {
|
||||
+ setsid bash -c \
|
||||
+ "exec bash </dev/$guestfs_serial >/dev/$guestfs_serial 2>&1"
|
||||
+ }
|
||||
+
|
||||
+ echo
|
||||
+ echo "------------------------------------------------------------"
|
||||
+ echo
|
||||
+ echo "Welcome to virt-rescue, the libguestfs rescue shell."
|
||||
+ echo
|
||||
+ echo "Note: The contents of / (root) are the rescue appliance."
|
||||
+ echo "You have to mount the guest's partitions under /sysroot"
|
||||
+ echo "before you can examine them."
|
||||
+ echo
|
||||
+ run_bash_with_ctty
|
||||
+ echo
|
||||
+ echo "virt-rescue: Syncing the disk now before exiting ..."
|
||||
+ echo
|
||||
fi
|
||||
|
||||
sync
|
||||
diff --git a/rescue/Makefile.am b/rescue/Makefile.am
|
||||
index 7919aafd5..99d4b79ae 100644
|
||||
--- a/rescue/Makefile.am
|
||||
+++ b/rescue/Makefile.am
|
||||
@@ -30,6 +30,7 @@ virt_rescue_SOURCES = \
|
||||
|
||||
virt_rescue_CPPFLAGS = \
|
||||
-DGUESTFS_WARN_DEPRECATED=1 \
|
||||
+ -DGUESTFS_PRIVATE=1 \
|
||||
-DLOCALEBASEDIR=\""$(datadir)/locale"\" \
|
||||
-I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \
|
||||
-I$(top_srcdir)/lib -I$(top_builddir)/lib \
|
||||
diff --git a/rescue/rescue.c b/rescue/rescue.c
|
||||
index b692e5a07..b145dcd40 100644
|
||||
--- a/rescue/rescue.c
|
||||
+++ b/rescue/rescue.c
|
||||
@@ -23,21 +23,32 @@
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
+#include <fcntl.h>
|
||||
#include <getopt.h>
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
+#include <signal.h>
|
||||
+#include <termios.h>
|
||||
+#include <poll.h>
|
||||
#include <locale.h>
|
||||
#include <assert.h>
|
||||
#include <libintl.h>
|
||||
|
||||
+#include "full-write.h"
|
||||
+#include "getprogname.h"
|
||||
#include "ignore-value.h"
|
||||
#include "xvasprintf.h"
|
||||
-#include "getprogname.h"
|
||||
|
||||
#include "guestfs.h"
|
||||
#include "options.h"
|
||||
#include "display-options.h"
|
||||
|
||||
+static void log_message_callback (guestfs_h *g, void *opaque, uint64_t event, int event_handle, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len);
|
||||
+static void do_rescue (int sock);
|
||||
+static void raw_tty (void);
|
||||
+static void restore_tty (void);
|
||||
+static void tstp_handler (int sig);
|
||||
+static void cont_handler (int sig);
|
||||
static void add_scratch_disks (int n, struct drv **drvs);
|
||||
static void do_suggestion (struct drv *drvs);
|
||||
|
||||
@@ -54,6 +65,9 @@ int inspector = 0;
|
||||
int in_guestfish = 0;
|
||||
int in_virt_rescue = 1;
|
||||
|
||||
+/* Old terminal settings. */
|
||||
+static struct termios old_termios;
|
||||
+
|
||||
static void __attribute__((noreturn))
|
||||
usage (int status)
|
||||
{
|
||||
@@ -135,6 +149,8 @@ main (int argc, char *argv[])
|
||||
int memsize = 0;
|
||||
int smp = 0;
|
||||
int suggest = 0;
|
||||
+ char *append_full;
|
||||
+ int sock;
|
||||
|
||||
g = guestfs_create ();
|
||||
if (g == NULL)
|
||||
@@ -295,30 +311,6 @@ main (int argc, char *argv[])
|
||||
usage (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
-#pragma GCC diagnostic push
|
||||
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
- /* Setting "direct mode" is required for the rescue appliance. */
|
||||
- if (guestfs_set_direct (g, 1) == -1)
|
||||
- exit (EXIT_FAILURE);
|
||||
-#pragma GCC diagnostic pop
|
||||
-
|
||||
- {
|
||||
- /* The libvirt backend doesn't support direct mode. As a temporary
|
||||
- * workaround, force the appliance backend, but warn about it.
|
||||
- */
|
||||
- CLEANUP_FREE char *backend = guestfs_get_backend (g);
|
||||
- if (backend) {
|
||||
- if (STREQ (backend, "libvirt") ||
|
||||
- STRPREFIX (backend, "libvirt:")) {
|
||||
- fprintf (stderr, _("%s: warning: virt-rescue doesn't work with the libvirt backend\n"
|
||||
- "at the moment. As a workaround, forcing backend = 'direct'.\n"),
|
||||
- getprogname ());
|
||||
- if (guestfs_set_backend (g, "direct") == -1)
|
||||
- exit (EXIT_FAILURE);
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
/* Set other features. */
|
||||
if (memsize > 0)
|
||||
if (guestfs_set_memsize (g, memsize) == -1)
|
||||
@@ -330,16 +322,15 @@ main (int argc, char *argv[])
|
||||
if (guestfs_set_smp (g, smp) == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
- {
|
||||
- /* Kernel command line must include guestfs_rescue=1 (see
|
||||
- * appliance/init) as well as other options.
|
||||
- */
|
||||
- CLEANUP_FREE char *append_full = xasprintf ("guestfs_rescue=1%s%s",
|
||||
- append ? " " : "",
|
||||
- append ? append : "");
|
||||
- if (guestfs_set_append (g, append_full) == -1)
|
||||
- exit (EXIT_FAILURE);
|
||||
- }
|
||||
+ /* Kernel command line must include guestfs_rescue=1 (see
|
||||
+ * appliance/init) as well as other options.
|
||||
+ */
|
||||
+ append_full = xasprintf ("guestfs_rescue=1%s%s",
|
||||
+ append ? " " : "",
|
||||
+ append ? append : "");
|
||||
+ if (guestfs_set_append (g, append_full) == -1)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ free (append_full);
|
||||
|
||||
/* Add drives. */
|
||||
add_drives (drvs);
|
||||
@@ -347,22 +338,253 @@ main (int argc, char *argv[])
|
||||
/* Free up data structures, no longer needed after this point. */
|
||||
free_drives (drvs);
|
||||
|
||||
- /* Run the appliance. This won't return until the user quits the
|
||||
- * appliance.
|
||||
+ /* Add an event handler to print "log messages". These will be the
|
||||
+ * output of the appliance console during launch and shutdown.
|
||||
+ * After launch, we will read the console messages directly from the
|
||||
+ * socket and they won't be passed through the event callback.
|
||||
*/
|
||||
- if (!verbose)
|
||||
- guestfs_set_error_handler (g, NULL, NULL);
|
||||
+ if (guestfs_set_event_callback (g, log_message_callback,
|
||||
+ GUESTFS_EVENT_APPLIANCE, 0, NULL) == -1)
|
||||
+ exit (EXIT_FAILURE);
|
||||
|
||||
- /* We expect launch to fail, so ignore the return value, and don't
|
||||
- * bother with explicit guestfs_shutdown either.
|
||||
+ /* Run the appliance. */
|
||||
+ if (guestfs_launch (g) == -1)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+
|
||||
+ sock = guestfs_internal_get_console_socket (g);
|
||||
+ if (sock == -1)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+
|
||||
+ /* Try to set all sockets to non-blocking. */
|
||||
+ if (fcntl (STDIN_FILENO, F_SETFL, O_NONBLOCK) == -1)
|
||||
+ perror ("could not set stdin to non-blocking");
|
||||
+ if (fcntl (STDOUT_FILENO, F_SETFL, O_NONBLOCK) == -1)
|
||||
+ perror ("could not set stdout to non-blocking");
|
||||
+ if (fcntl (sock, F_SETFL, O_NONBLOCK) == -1)
|
||||
+ perror ("could not set console socket to non-blocking");
|
||||
+
|
||||
+ /* Save the initial state of the tty so we always have the original
|
||||
+ * state to go back to.
|
||||
+ */
|
||||
+ if (tcgetattr (STDIN_FILENO, &old_termios) == -1) {
|
||||
+ perror ("tcgetattr: stdin");
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+
|
||||
+ /* Put stdin in raw mode so that we can receive ^C and other
|
||||
+ * special keys.
|
||||
+ */
|
||||
+ raw_tty ();
|
||||
+
|
||||
+ /* Restore the tty settings when the process exits. */
|
||||
+ atexit (restore_tty);
|
||||
+
|
||||
+ /* Catch tty stop and cont signals so we can cleanup.
|
||||
+ * See https://www.gnu.org/software/libc/manual/html_node/Signaling-Yourself.html
|
||||
*/
|
||||
- ignore_value (guestfs_launch (g));
|
||||
+ signal (SIGTSTP, tstp_handler);
|
||||
+ signal (SIGCONT, cont_handler);
|
||||
+
|
||||
+ do_rescue (sock);
|
||||
+
|
||||
+ restore_tty ();
|
||||
+
|
||||
+ /* Shut down the appliance. */
|
||||
+ guestfs_push_error_handler (g, NULL, NULL);
|
||||
+ if (guestfs_shutdown (g) == -1) {
|
||||
+ const char *err;
|
||||
+
|
||||
+ /* Ignore "appliance closed the connection unexpectedly" since
|
||||
+ * this can happen if the user reboots the appliance.
|
||||
+ */
|
||||
+ if (guestfs_last_errno (g) == EPIPE)
|
||||
+ goto next;
|
||||
|
||||
+ /* Otherwise it's a real error. */
|
||||
+ err = guestfs_last_error (g);
|
||||
+ fprintf (stderr, "libguestfs: error: %s\n", err);
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+ next:
|
||||
+ guestfs_pop_error_handler (g);
|
||||
guestfs_close (g);
|
||||
|
||||
exit (EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
+static void
|
||||
+log_message_callback (guestfs_h *g, void *opaque, uint64_t event,
|
||||
+ int event_handle, int flags,
|
||||
+ const char *buf, size_t buf_len,
|
||||
+ const uint64_t *array, size_t array_len)
|
||||
+{
|
||||
+ if (buf_len > 0) {
|
||||
+ ignore_value (full_write (STDOUT_FILENO, buf, buf_len));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* This is the main loop for virt-rescue. We read and write
|
||||
+ * directly to the console socket.
|
||||
+ */
|
||||
+#define BUFSIZE 4096
|
||||
+static char rbuf[BUFSIZE]; /* appliance -> local tty */
|
||||
+static char wbuf[BUFSIZE]; /* local tty -> appliance */
|
||||
+
|
||||
+static void
|
||||
+do_rescue (int sock)
|
||||
+{
|
||||
+ size_t rlen = 0;
|
||||
+ size_t wlen = 0;
|
||||
+
|
||||
+ while (sock >= 0 || rlen > 0) {
|
||||
+ struct pollfd fds[3];
|
||||
+ nfds_t nfds = 2;
|
||||
+ int r;
|
||||
+ ssize_t n;
|
||||
+
|
||||
+ fds[0].fd = STDIN_FILENO;
|
||||
+ fds[0].events = 0;
|
||||
+ if (BUFSIZE-wlen > 0)
|
||||
+ fds[0].events = POLLIN;
|
||||
+ fds[0].revents = 0;
|
||||
+
|
||||
+ fds[1].fd = STDOUT_FILENO;
|
||||
+ fds[1].events = 0;
|
||||
+ if (rlen > 0)
|
||||
+ fds[1].events |= POLLOUT;
|
||||
+ fds[1].revents = 0;
|
||||
+
|
||||
+ if (sock >= 0) {
|
||||
+ fds[2].fd = sock;
|
||||
+ fds[2].events = 0;
|
||||
+ if (BUFSIZE-rlen > 0)
|
||||
+ fds[2].events |= POLLIN;
|
||||
+ if (wlen > 0)
|
||||
+ fds[2].events |= POLLOUT;
|
||||
+ fds[2].revents = 0;
|
||||
+ nfds++;
|
||||
+ }
|
||||
+
|
||||
+ r = poll (fds, nfds, -1);
|
||||
+ if (r == -1) {
|
||||
+ if (errno == EINTR || errno == EAGAIN)
|
||||
+ continue;
|
||||
+ perror ("poll");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* Input from local tty. */
|
||||
+ if ((fds[0].revents & POLLIN) != 0) {
|
||||
+ assert (BUFSIZE-wlen > 0);
|
||||
+ n = read (STDIN_FILENO, wbuf+wlen, BUFSIZE-wlen);
|
||||
+ if (n == -1) {
|
||||
+ if (errno == EINTR || errno == EAGAIN)
|
||||
+ continue;
|
||||
+ perror ("read");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (n == 0) {
|
||||
+ /* We don't expect this to happen. Maybe the whole tty went away?
|
||||
+ * Anyway, we should exit as soon as possible.
|
||||
+ */
|
||||
+ return;
|
||||
+ }
|
||||
+ if (n > 0)
|
||||
+ wlen += n;
|
||||
+ }
|
||||
+
|
||||
+ /* Log message from appliance. */
|
||||
+ if (nfds > 2 && (fds[2].revents & POLLIN) != 0) {
|
||||
+ assert (BUFSIZE-rlen > 0);
|
||||
+ n = read (sock, rbuf+rlen, BUFSIZE-rlen);
|
||||
+ if (n == -1) {
|
||||
+ if (errno == EINTR || errno == EAGAIN)
|
||||
+ continue;
|
||||
+ if (errno == ECONNRESET)
|
||||
+ goto appliance_closed;
|
||||
+ perror ("read");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (n == 0) {
|
||||
+ appliance_closed:
|
||||
+ sock = -1;
|
||||
+ /* Don't actually close the socket, because it's owned by
|
||||
+ * the guestfs handle.
|
||||
+ */
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (n > 0)
|
||||
+ rlen += n;
|
||||
+ }
|
||||
+
|
||||
+ /* Write log messages to local tty. */
|
||||
+ if ((fds[1].revents & POLLOUT) != 0) {
|
||||
+ assert (rlen > 0);
|
||||
+ n = write (STDOUT_FILENO, rbuf, rlen);
|
||||
+ if (n == -1) {
|
||||
+ perror ("write");
|
||||
+ continue;
|
||||
+ }
|
||||
+ rlen -= n;
|
||||
+ memmove (rbuf, rbuf+n, rlen);
|
||||
+ }
|
||||
+
|
||||
+ /* Write commands to the appliance. */
|
||||
+ if (nfds > 2 && (fds[2].revents & POLLOUT) != 0) {
|
||||
+ assert (wlen > 0);
|
||||
+ n = write (sock, wbuf, wlen);
|
||||
+ if (n == -1) {
|
||||
+ perror ("write");
|
||||
+ continue;
|
||||
+ }
|
||||
+ wlen -= n;
|
||||
+ memmove (wbuf, wbuf+n, wlen);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Put the tty in raw mode. */
|
||||
+static void
|
||||
+raw_tty (void)
|
||||
+{
|
||||
+ struct termios termios;
|
||||
+
|
||||
+ if (tcgetattr (STDIN_FILENO, &termios) == -1) {
|
||||
+ perror ("tcgetattr: stdin");
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+ cfmakeraw (&termios);
|
||||
+ if (tcsetattr (STDIN_FILENO, TCSANOW, &termios) == -1) {
|
||||
+ perror ("tcsetattr: stdin");
|
||||
+ exit (EXIT_FAILURE);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Restore the tty to (presumably) cooked mode as it was when
|
||||
+ * the program was started.
|
||||
+ */
|
||||
+static void
|
||||
+restore_tty (void)
|
||||
+{
|
||||
+ tcsetattr (STDIN_FILENO, TCSANOW, &old_termios);
|
||||
+}
|
||||
+
|
||||
+/* When we get SIGTSTP, switch back to cooked mode. */
|
||||
+static void
|
||||
+tstp_handler (int sig)
|
||||
+{
|
||||
+ restore_tty ();
|
||||
+ signal (SIGTSTP, SIG_DFL);
|
||||
+ raise (SIGTSTP);
|
||||
+}
|
||||
+
|
||||
+/* When we get SIGCONF, switch to raw mode. */
|
||||
+static void
|
||||
+cont_handler (int sig)
|
||||
+{
|
||||
+ raw_tty ();
|
||||
+}
|
||||
+
|
||||
static void suggest_filesystems (void);
|
||||
|
||||
static int
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,400 +0,0 @@
|
|||
From b308fb2a8d31f5439793b908bbf2e8414ee97897 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 3 Mar 2017 13:52:31 +0000
|
||||
Subject: [PATCH 05/10] rescue: Implement -m and -i options.
|
||||
|
||||
`virt-rescue -a disk -i' does the right thing.
|
||||
|
||||
`-m' was previously an alternate form of `--memsize'. By sniffing the
|
||||
parameter we can make `-m MB' continue to work, while also allowing
|
||||
`-m' to be used as a short form for the `--mount' option.
|
||||
|
||||
This also removes most of the description of `--suggest' from the man
|
||||
page, since it is no longer needed.
|
||||
|
||||
(cherry picked from commit 33d2ae796119ae5dd38e2afcbf1ba4216bd99846)
|
||||
---
|
||||
appliance/init | 12 +++++--
|
||||
rescue/Makefile.am | 3 +-
|
||||
rescue/rescue.c | 87 +++++++++++++++++++++++++++++++++++++-------------
|
||||
rescue/virt-rescue.pod | 80 ++++++++++++++++++++++++++++------------------
|
||||
4 files changed, 126 insertions(+), 56 deletions(-)
|
||||
|
||||
diff --git a/appliance/init b/appliance/init
|
||||
index 810f84d22..968429c4b 100755
|
||||
--- a/appliance/init
|
||||
+++ b/appliance/init
|
||||
@@ -180,6 +180,10 @@ else
|
||||
# We need a daemon, even in virt-rescue.
|
||||
$cmd &
|
||||
|
||||
+ # XXX This gives a bit of time for virt-rescue to connect to the
|
||||
+ # daemon and mount any filesystems.
|
||||
+ sleep 2
|
||||
+
|
||||
# Get name of the serial port, from console= passed by libguestfs.
|
||||
guestfs_serial=$(grep -Eo 'console=[^[:space:]]+' /proc/cmdline |
|
||||
sed s/console=//)
|
||||
@@ -208,8 +212,12 @@ else
|
||||
echo "Welcome to virt-rescue, the libguestfs rescue shell."
|
||||
echo
|
||||
echo "Note: The contents of / (root) are the rescue appliance."
|
||||
- echo "You have to mount the guest's partitions under /sysroot"
|
||||
- echo "before you can examine them."
|
||||
+ if ! test -d "/sysroot/dev"; then
|
||||
+ echo "You have to mount the guest's partitions under /sysroot"
|
||||
+ echo "before you can examine them."
|
||||
+ else
|
||||
+ echo "Use 'cd /sysroot' or 'chroot /sysroot' to see guest filesystems."
|
||||
+ fi
|
||||
echo
|
||||
run_bash_with_ctty
|
||||
echo
|
||||
diff --git a/rescue/Makefile.am b/rescue/Makefile.am
|
||||
index 99d4b79ae..c83c43458 100644
|
||||
--- a/rescue/Makefile.am
|
||||
+++ b/rescue/Makefile.am
|
||||
@@ -35,7 +35,7 @@ virt_rescue_CPPFLAGS = \
|
||||
-I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \
|
||||
-I$(top_srcdir)/lib -I$(top_builddir)/lib \
|
||||
-I$(top_srcdir)/common/options -I$(top_builddir)/common/options \
|
||||
- -I$(top_srcdir)/fish \
|
||||
+ -I$(top_srcdir)/common/windows -I$(top_builddir)/common/windows \
|
||||
-I$(srcdir)/../gnulib/lib -I../gnulib/lib
|
||||
|
||||
virt_rescue_CFLAGS = \
|
||||
@@ -43,6 +43,7 @@ virt_rescue_CFLAGS = \
|
||||
$(LIBXML2_CFLAGS)
|
||||
|
||||
virt_rescue_LDADD = \
|
||||
+ $(top_builddir)/common/windows/libwindows.la \
|
||||
$(top_builddir)/common/options/liboptions.la \
|
||||
$(top_builddir)/common/utils/libutils.la \
|
||||
$(top_builddir)/lib/libguestfs.la \
|
||||
diff --git a/rescue/rescue.c b/rescue/rescue.c
|
||||
index b145dcd40..2b461378d 100644
|
||||
--- a/rescue/rescue.c
|
||||
+++ b/rescue/rescue.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <unistd.h>
|
||||
-#include <fcntl.h>
|
||||
#include <getopt.h>
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
@@ -37,9 +36,11 @@
|
||||
#include "full-write.h"
|
||||
#include "getprogname.h"
|
||||
#include "ignore-value.h"
|
||||
+#include "nonblocking.h"
|
||||
#include "xvasprintf.h"
|
||||
|
||||
#include "guestfs.h"
|
||||
+#include "windows.h"
|
||||
#include "options.h"
|
||||
#include "display-options.h"
|
||||
|
||||
@@ -87,7 +88,9 @@ usage (int status)
|
||||
" -d|--domain guest Add disks from libvirt guest\n"
|
||||
" --format[=raw|..] Force disk format for -a option\n"
|
||||
" --help Display brief help\n"
|
||||
- " -m|--memsize MB Set memory size in megabytes\n"
|
||||
+ " -i|--inspector Automatically mount filesystems\n"
|
||||
+ " -m|--mount dev[:mnt[:opts[:fstype]] Mount dev on mnt (if omitted, /)\n"
|
||||
+ " --memsize MB Set memory size in megabytes\n"
|
||||
" --network Enable network\n"
|
||||
" -r|--ro Access read-only\n"
|
||||
" --scratch[=N] Add scratch disk(s)\n"
|
||||
@@ -116,7 +119,7 @@ main (int argc, char *argv[])
|
||||
|
||||
enum { HELP_OPTION = CHAR_MAX + 1 };
|
||||
|
||||
- static const char options[] = "a:c:d:m:rvVwx";
|
||||
+ static const char options[] = "a:c:d:im:rvVwx";
|
||||
static const struct option long_options[] = {
|
||||
{ "add", 1, 0, 'a' },
|
||||
{ "append", 1, 0, 0 },
|
||||
@@ -124,8 +127,10 @@ main (int argc, char *argv[])
|
||||
{ "domain", 1, 0, 'd' },
|
||||
{ "format", 2, 0, 0 },
|
||||
{ "help", 0, 0, HELP_OPTION },
|
||||
+ { "inspector", 0, 0, 'i' },
|
||||
{ "long-options", 0, 0, 0 },
|
||||
- { "memsize", 1, 0, 'm' },
|
||||
+ { "mount", 1, 0, 'm' },
|
||||
+ { "memsize", 1, 0, 0 },
|
||||
{ "network", 0, 0, 0 },
|
||||
{ "ro", 0, 0, 'r' },
|
||||
{ "rw", 0, 0, 'w' },
|
||||
@@ -140,13 +145,16 @@ main (int argc, char *argv[])
|
||||
};
|
||||
struct drv *drvs = NULL;
|
||||
struct drv *drv;
|
||||
+ struct mp *mps = NULL;
|
||||
+ struct mp *mp;
|
||||
+ char *p;
|
||||
const char *format = NULL;
|
||||
bool format_consumed = true;
|
||||
int c;
|
||||
int option_index;
|
||||
int network = 0;
|
||||
const char *append = NULL;
|
||||
- int memsize = 0;
|
||||
+ int memsize = 0, m;
|
||||
int smp = 0;
|
||||
int suggest = 0;
|
||||
char *append_full;
|
||||
@@ -196,6 +204,10 @@ main (int argc, char *argv[])
|
||||
_("--scratch parameter '%s' should be >= 1"), optarg);
|
||||
add_scratch_disks (n, &drvs);
|
||||
}
|
||||
+ } else if (STREQ (long_options[option_index].name, "memsize")) {
|
||||
+ if (sscanf (optarg, "%d", &memsize) != 1)
|
||||
+ error (EXIT_FAILURE, 0,
|
||||
+ _("could not parse memory size '%s'"), optarg);
|
||||
} else
|
||||
error (EXIT_FAILURE, 0,
|
||||
_("unknown long option: %s (%d)"),
|
||||
@@ -214,10 +226,19 @@ main (int argc, char *argv[])
|
||||
OPTION_d;
|
||||
break;
|
||||
|
||||
+ case 'i':
|
||||
+ OPTION_i;
|
||||
+ break;
|
||||
+
|
||||
case 'm':
|
||||
- if (sscanf (optarg, "%d", &memsize) != 1)
|
||||
- error (EXIT_FAILURE, 0,
|
||||
- _("could not parse memory size '%s'"), optarg);
|
||||
+ /* For backwards compatibility with virt-rescue <= 1.36, we
|
||||
+ * must handle -m <number> as a synonym for --memsize.
|
||||
+ */
|
||||
+ if (sscanf (optarg, "%d", &m) == 1)
|
||||
+ memsize = m;
|
||||
+ else {
|
||||
+ OPTION_m;
|
||||
+ }
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
@@ -288,7 +309,6 @@ main (int argc, char *argv[])
|
||||
* options parsing code. Assert here that they have known-good
|
||||
* values.
|
||||
*/
|
||||
- assert (inspector == 0);
|
||||
assert (keys_from_stdin == 0);
|
||||
assert (echo_keys == 0);
|
||||
assert (live == 0);
|
||||
@@ -332,12 +352,6 @@ main (int argc, char *argv[])
|
||||
exit (EXIT_FAILURE);
|
||||
free (append_full);
|
||||
|
||||
- /* Add drives. */
|
||||
- add_drives (drvs);
|
||||
-
|
||||
- /* Free up data structures, no longer needed after this point. */
|
||||
- free_drives (drvs);
|
||||
-
|
||||
/* Add an event handler to print "log messages". These will be the
|
||||
* output of the appliance console during launch and shutdown.
|
||||
* After launch, we will read the console messages directly from the
|
||||
@@ -347,21 +361,50 @@ main (int argc, char *argv[])
|
||||
GUESTFS_EVENT_APPLIANCE, 0, NULL) == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
- /* Run the appliance. */
|
||||
+ /* Do the guest drives and mountpoints. */
|
||||
+ add_drives (drvs);
|
||||
if (guestfs_launch (g) == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
+ if (inspector)
|
||||
+ inspect_mount ();
|
||||
+ mount_mps (mps);
|
||||
+
|
||||
+ free_drives (drvs);
|
||||
+ free_mps (mps);
|
||||
+
|
||||
+ /* Also bind-mount /dev etc under /sysroot, if -i was given. */
|
||||
+ if (inspector) {
|
||||
+ CLEANUP_FREE_STRING_LIST char **roots;
|
||||
+ int windows;
|
||||
+
|
||||
+ roots = guestfs_inspect_get_roots (g);
|
||||
+ windows = roots && roots[0] && is_windows (g, roots[0]);
|
||||
+ if (!windows) {
|
||||
+ const char *cmd[5] = { "mount", "--rbind", NULL, NULL, NULL };
|
||||
+ char *r;
|
||||
+
|
||||
+ cmd[2] = "/dev"; cmd[3] = "/sysroot/dev";
|
||||
+ r = guestfs_debug (g, "sh", (char **) cmd);
|
||||
+ free (r);
|
||||
+
|
||||
+ cmd[2] = "/proc"; cmd[3] = "/sysroot/proc";
|
||||
+ r = guestfs_debug (g, "sh", (char **) cmd);
|
||||
+ free (r);
|
||||
+
|
||||
+ cmd[2] = "/sys"; cmd[3] = "/sysroot/sys";
|
||||
+ r = guestfs_debug (g, "sh", (char **) cmd);
|
||||
+ free (r);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
sock = guestfs_internal_get_console_socket (g);
|
||||
if (sock == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
/* Try to set all sockets to non-blocking. */
|
||||
- if (fcntl (STDIN_FILENO, F_SETFL, O_NONBLOCK) == -1)
|
||||
- perror ("could not set stdin to non-blocking");
|
||||
- if (fcntl (STDOUT_FILENO, F_SETFL, O_NONBLOCK) == -1)
|
||||
- perror ("could not set stdout to non-blocking");
|
||||
- if (fcntl (sock, F_SETFL, O_NONBLOCK) == -1)
|
||||
- perror ("could not set console socket to non-blocking");
|
||||
+ ignore_value (set_nonblocking_flag (STDIN_FILENO, 1));
|
||||
+ ignore_value (set_nonblocking_flag (STDOUT_FILENO, 1));
|
||||
+ ignore_value (set_nonblocking_flag (sock, 1));
|
||||
|
||||
/* Save the initial state of the tty so we always have the original
|
||||
* state to go back to.
|
||||
diff --git a/rescue/virt-rescue.pod b/rescue/virt-rescue.pod
|
||||
index b8aa32637..b651f84e7 100644
|
||||
--- a/rescue/virt-rescue.pod
|
||||
+++ b/rescue/virt-rescue.pod
|
||||
@@ -6,9 +6,7 @@ virt-rescue - Run a rescue shell on a virtual machine
|
||||
|
||||
virt-rescue [--options] -d domname
|
||||
|
||||
- virt-rescue [--options] -a disk.img [-a disk.img ...]
|
||||
-
|
||||
- virt-rescue --suggest (-d domname | -a disk.img ...)
|
||||
+ virt-rescue [--options] -a disk.img [-a disk.img ...] [-i]
|
||||
|
||||
Old style:
|
||||
|
||||
@@ -26,13 +24,13 @@ machine or disk image.
|
||||
You can run virt-rescue on any virtual machine known to libvirt, or
|
||||
directly on disk image(s):
|
||||
|
||||
- virt-rescue -d GuestName
|
||||
+ virt-rescue -d GuestName -i
|
||||
|
||||
- virt-rescue --ro -a /path/to/disk.img
|
||||
+ virt-rescue --ro -a /path/to/disk.img -i
|
||||
|
||||
virt-rescue -a /dev/sdc
|
||||
|
||||
-For live VMs you I<must> use the --ro option.
|
||||
+For live VMs you I<must> use the I<--ro> option.
|
||||
|
||||
When you run virt-rescue on a virtual machine or disk image, you are
|
||||
placed in an interactive bash shell where you can use many ordinary
|
||||
@@ -41,26 +39,10 @@ rescue appliance. You must mount the virtual machine's filesystems by
|
||||
hand. There is an empty directory called F</sysroot> where you can
|
||||
mount filesystems.
|
||||
|
||||
-You can get virt-rescue to suggest mount commands for you by using the
|
||||
-I<--suggest> option (in another terminal):
|
||||
-
|
||||
- $ virt-rescue --suggest -d Fedora15
|
||||
- Inspecting the virtual machine or disk image ...
|
||||
-
|
||||
- This disk contains one or more operating systems. You can use these
|
||||
- mount commands in virt-rescue (at the ><rescue> prompt) to mount the
|
||||
- filesystems.
|
||||
-
|
||||
- # /dev/vg_f15x32/lv_root is the root of a linux operating system
|
||||
- # type: linux, distro: fedora, version: 15.0
|
||||
- # Fedora release 15 (Lovelock)
|
||||
-
|
||||
- mount /dev/vg_f15x32/lv_root /sysroot/
|
||||
- mount /dev/vda1 /sysroot/boot
|
||||
- mount --bind /dev /sysroot/dev
|
||||
- mount --bind /dev/pts /sysroot/dev/pts
|
||||
- mount --bind /proc /sysroot/proc
|
||||
- mount --bind /sys /sysroot/sys
|
||||
+To automatically mount the virtual machine's filesystems under
|
||||
+F</sysroot> use the I<-i> option. This uses libguestfs inspection to
|
||||
+find the filesystems and mount them in the right place. You can also
|
||||
+mount filesystems individually using the I<-m> option.
|
||||
|
||||
Another way is to list the logical volumes (with L<lvs(8)>) and
|
||||
partitions (with L<parted(8)>) and mount them by hand:
|
||||
@@ -170,7 +152,15 @@ 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<-m> MB
|
||||
+=item B<-i>
|
||||
+
|
||||
+=item B<--inspector>
|
||||
+
|
||||
+Using L<virt-inspector(1)> code, inspect the disks looking for
|
||||
+an operating system and mount filesystems as they would be
|
||||
+mounted on the real virtual machine.
|
||||
+
|
||||
+The filesystems are mounted on F</sysroot> in the rescue environment.
|
||||
|
||||
=item B<--memsize> MB
|
||||
|
||||
@@ -179,6 +169,33 @@ default is set by libguestfs and is small but adequate for running
|
||||
system tools. The occasional program might need more memory. The
|
||||
parameter is specified in megabytes.
|
||||
|
||||
+=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
|
||||
+B<in the guest> (this has nothing to do with mountpoints in the host).
|
||||
+
|
||||
+If the mountpoint is omitted, it defaults to F</>. You have to mount
|
||||
+something on F</>.
|
||||
+
|
||||
+The filesystems are mounted under F</sysroot> in the rescue environment.
|
||||
+
|
||||
+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
|
||||
+
|
||||
+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<--network>
|
||||
|
||||
Enable QEMU user networking in the guest. See L</NETWORK>.
|
||||
@@ -217,9 +234,10 @@ Enable N E<ge> 2 virtual CPUs in the rescue appliance.
|
||||
|
||||
=item B<--suggest>
|
||||
|
||||
-Inspect the disk image and suggest what mount commands should be used
|
||||
-to mount the disks. You should use the I<--suggest> option in a
|
||||
-second terminal, then paste the commands into another virt-rescue.
|
||||
+This option was used in older versions of virt-rescue to suggest what
|
||||
+commands you could use to mount filesystems under F</sysroot>. For
|
||||
+the current version of virt-rescue, it is easier to use the I<-i>
|
||||
+option instead.
|
||||
|
||||
This option implies I<--ro> and is safe to use even if the guest is up
|
||||
or if another virt-rescue is running.
|
||||
@@ -240,7 +258,7 @@ Display version number and exit.
|
||||
|
||||
=item B<--rw>
|
||||
|
||||
-This changes the I<-a> and I<-d> options so that disks are
|
||||
+This changes the I<-a>, I<-d> and I<-m> options so that disks are
|
||||
added and mounts are done read-write.
|
||||
|
||||
See L<guestfish(1)/OPENING DISKS FOR READ AND WRITE>.
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,615 +0,0 @@
|
|||
From 323350c82b49ac4d3519fe7ef9959c79dd9a83db Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 4 Mar 2017 11:47:59 +0000
|
||||
Subject: [PATCH 06/10] rescue: Implement escape sequences.
|
||||
|
||||
This implements a few useful escape sequences:
|
||||
|
||||
><rescue> ^]?
|
||||
virt-rescue escape sequences:
|
||||
^] ? - print this message
|
||||
^] h - print this message
|
||||
^] q - quit virt-rescue
|
||||
^] s - sync the filesystems
|
||||
^] u - unmount filesystems
|
||||
^] x - quit virt-rescue
|
||||
^] z - suspend virt-rescue
|
||||
to pass the escape key through to the rescue shell, type it twice
|
||||
|
||||
^]i
|
||||
|
||||
root device: /dev/sda3
|
||||
product name: Fedora 25 (Twenty Five)
|
||||
type: linux
|
||||
distro: fedora
|
||||
|
||||
^]z
|
||||
[3]+ Stopped ./run virt-rescue --scratch
|
||||
$ fg
|
||||
|
||||
><rescue> ^]u
|
||||
|
||||
unmounting filesystems ...
|
||||
[ 21.158558] XFS (sda3): Unmounting Filesystem
|
||||
|
||||
(cherry picked from commit 3637c42f4e521eb647d7dfae7f48eb1689d0af54)
|
||||
---
|
||||
rescue/Makefile.am | 4 +-
|
||||
rescue/escape.c | 302 +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
rescue/rescue.c | 30 ++++-
|
||||
rescue/rescue.h | 47 ++++++++
|
||||
rescue/virt-rescue.pod | 74 ++++++++++++
|
||||
5 files changed, 454 insertions(+), 3 deletions(-)
|
||||
create mode 100644 rescue/escape.c
|
||||
create mode 100644 rescue/rescue.h
|
||||
|
||||
diff --git a/rescue/Makefile.am b/rescue/Makefile.am
|
||||
index c83c43458..eb60bafa4 100644
|
||||
--- a/rescue/Makefile.am
|
||||
+++ b/rescue/Makefile.am
|
||||
@@ -26,7 +26,9 @@ EXTRA_DIST = \
|
||||
bin_PROGRAMS = virt-rescue
|
||||
|
||||
virt_rescue_SOURCES = \
|
||||
- rescue.c
|
||||
+ escape.c \
|
||||
+ rescue.c \
|
||||
+ rescue.h
|
||||
|
||||
virt_rescue_CPPFLAGS = \
|
||||
-DGUESTFS_WARN_DEPRECATED=1 \
|
||||
diff --git a/rescue/escape.c b/rescue/escape.c
|
||||
new file mode 100644
|
||||
index 000000000..f7f7d84c4
|
||||
--- /dev/null
|
||||
+++ b/rescue/escape.c
|
||||
@@ -0,0 +1,302 @@
|
||||
+/* virt-rescue
|
||||
+ * Copyright (C) 2010-2017 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
+ */
|
||||
+
|
||||
+#include <config.h>
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <string.h>
|
||||
+#include <unistd.h>
|
||||
+#include <signal.h>
|
||||
+#include <locale.h>
|
||||
+#include <libintl.h>
|
||||
+
|
||||
+#include "c-ctype.h"
|
||||
+
|
||||
+#include "guestfs.h"
|
||||
+#include "guestfs-internal-frontend.h"
|
||||
+
|
||||
+#include "rescue.h"
|
||||
+
|
||||
+static void print_help (void);
|
||||
+static void print_inspector (void);
|
||||
+static void crlf (void);
|
||||
+static void print_escape_key (void);
|
||||
+
|
||||
+/* Parse the -e parameter from the command line. */
|
||||
+int
|
||||
+parse_escape_key (const char *arg)
|
||||
+{
|
||||
+ size_t len;
|
||||
+
|
||||
+ if (STREQ (arg, "none"))
|
||||
+ return 0;
|
||||
+
|
||||
+ len = strlen (arg);
|
||||
+ if (arg == 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ switch (arg[0]) {
|
||||
+ case '^':
|
||||
+ if (len == 2 &&
|
||||
+ ((arg[1] >= 'a' && arg[1] <= 'z') ||
|
||||
+ (arg[1] >= 'A' && arg[1] <= '_'))) {
|
||||
+ return c_toupper (arg[1]) - '@';
|
||||
+ }
|
||||
+ else
|
||||
+ return -1;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+/* Print one-line end user description of the escape key.
|
||||
+ *
|
||||
+ * This is printed when virt-rescue starts.
|
||||
+ */
|
||||
+void
|
||||
+print_escape_key_help (void)
|
||||
+{
|
||||
+ crlf ();
|
||||
+ /* Difficult to translate this string. XXX */
|
||||
+ printf ("The virt-rescue escape key is ‘");
|
||||
+ print_escape_key ();
|
||||
+ printf ("’. Type ‘");
|
||||
+ print_escape_key ();
|
||||
+ printf (" h’ for help.");
|
||||
+ crlf ();
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+init_escape_state (struct escape_state *state)
|
||||
+{
|
||||
+ state->in_escape = false;
|
||||
+}
|
||||
+
|
||||
+/* Process escapes in the tty input buffer.
|
||||
+ *
|
||||
+ * This function has a state parameter so that we can handle an escape
|
||||
+ * sequence split over the end of the buffer.
|
||||
+ *
|
||||
+ * Escape sequences are removed from the buffer.
|
||||
+ *
|
||||
+ * Returns true iff virt-rescue should exit.
|
||||
+ */
|
||||
+bool
|
||||
+process_escapes (struct escape_state *state, char *buf, size_t *len)
|
||||
+{
|
||||
+ size_t i;
|
||||
+
|
||||
+ for (i = 0; i < *len; ++i) {
|
||||
+#define DROP_CURRENT_CHAR() \
|
||||
+ memmove (&buf[i], &buf[i+1], --(*len))
|
||||
+#define PRINT_ESC() \
|
||||
+ do { print_escape_key (); putchar (buf[i]); crlf (); } while (0)
|
||||
+
|
||||
+ if (!state->in_escape) {
|
||||
+ if (buf[i] == escape_key) {
|
||||
+ /* Drop the escape key from the buffer and go to escape mode. */
|
||||
+ DROP_CURRENT_CHAR ();
|
||||
+ state->in_escape = true;
|
||||
+ }
|
||||
+ }
|
||||
+ else /* in escape sequence */ {
|
||||
+ if (buf[i] == escape_key) /* ^] ^] means send ^] to rescue shell */
|
||||
+ state->in_escape = false;
|
||||
+ else {
|
||||
+ switch (buf[i]) {
|
||||
+ case '?': case 'h':
|
||||
+ PRINT_ESC ();
|
||||
+ print_help ();
|
||||
+ break;
|
||||
+
|
||||
+ case 'i':
|
||||
+ PRINT_ESC ();
|
||||
+ print_inspector ();
|
||||
+ break;
|
||||
+
|
||||
+ case 'q': case 'x':
|
||||
+ PRINT_ESC ();
|
||||
+ return true /* exit virt-rescue at once */;
|
||||
+
|
||||
+ case 's':
|
||||
+ PRINT_ESC ();
|
||||
+ printf (_("attempting to sync filesystems ..."));
|
||||
+ crlf ();
|
||||
+ guestfs_sync (g);
|
||||
+ break;
|
||||
+
|
||||
+ case 'u':
|
||||
+ PRINT_ESC ();
|
||||
+ printf (_("unmounting filesystems ..."));
|
||||
+ crlf ();
|
||||
+ guestfs_umount_all (g);
|
||||
+ break;
|
||||
+
|
||||
+ case 'z':
|
||||
+ PRINT_ESC ();
|
||||
+ raise (SIGTSTP);
|
||||
+ break;
|
||||
+
|
||||
+ default:
|
||||
+ /* Any unrecognized escape sequence will be dropped. We
|
||||
+ * could be obnoxious and ring the bell, but I hate it when
|
||||
+ * programs do that.
|
||||
+ */
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ /* Drop the escape key and return to non-escape mode. */
|
||||
+ DROP_CURRENT_CHAR ();
|
||||
+ state->in_escape = false;
|
||||
+
|
||||
+ /* The output is line buffered, this is just to make sure
|
||||
+ * everything gets written to stdout before we continue
|
||||
+ * writing to STDOUT_FILENO.
|
||||
+ */
|
||||
+ fflush (stdout);
|
||||
+ }
|
||||
+ } /* in escape sequence */
|
||||
+ } /* for */
|
||||
+
|
||||
+ return false /* don't exit */;
|
||||
+}
|
||||
+
|
||||
+/* This is called when the user types ^] h */
|
||||
+static void
|
||||
+print_help (void)
|
||||
+{
|
||||
+ printf (_("virt-rescue escape sequences:"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" ? - print this message"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" h - print this message"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ if (inspector) {
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" i - print inspection data"));
|
||||
+ crlf ();
|
||||
+ }
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" q - quit virt-rescue"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" s - sync the filesystems"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" u - unmount filesystems"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" x - quit virt-rescue"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ putchar (' ');
|
||||
+ print_escape_key ();
|
||||
+ printf (_(" z - suspend virt-rescue"));
|
||||
+ crlf ();
|
||||
+
|
||||
+ printf (_("to pass the escape key through to the rescue shell, type it twice"));
|
||||
+ crlf ();
|
||||
+}
|
||||
+
|
||||
+/* This is called when the user types ^] i */
|
||||
+static void
|
||||
+print_inspector (void)
|
||||
+{
|
||||
+ CLEANUP_FREE_STRING_LIST char **roots;
|
||||
+ size_t i;
|
||||
+ const char *root;
|
||||
+ char *str;
|
||||
+
|
||||
+ if (inspector) {
|
||||
+ roots = guestfs_inspect_get_roots (g);
|
||||
+ if (roots) {
|
||||
+ crlf ();
|
||||
+ for (i = 0; roots[i] != NULL; ++i) {
|
||||
+ root = roots[i];
|
||||
+ printf (_("root device: %s"), root);
|
||||
+ crlf ();
|
||||
+
|
||||
+ str = guestfs_inspect_get_product_name (g, root);
|
||||
+ if (str) {
|
||||
+ printf (_(" product name: %s"), str);
|
||||
+ crlf ();
|
||||
+ }
|
||||
+ free (str);
|
||||
+
|
||||
+ str = guestfs_inspect_get_type (g, root);
|
||||
+ if (str) {
|
||||
+ printf (_(" type: %s"), str);
|
||||
+ crlf ();
|
||||
+ }
|
||||
+ free (str);
|
||||
+
|
||||
+ str = guestfs_inspect_get_distro (g, root);
|
||||
+ if (str) {
|
||||
+ printf (_(" distro: %s"), str);
|
||||
+ crlf ();
|
||||
+ }
|
||||
+ free (str);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Because the terminal is in raw mode, we have to send CR LF instead
|
||||
+ * of printing just \n.
|
||||
+ */
|
||||
+static void
|
||||
+crlf (void)
|
||||
+{
|
||||
+ putchar ('\r');
|
||||
+ putchar ('\n');
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+print_escape_key (void)
|
||||
+{
|
||||
+ switch (escape_key) {
|
||||
+ case 0:
|
||||
+ printf ("none");
|
||||
+ break;
|
||||
+ case '\x1'...'\x1f':
|
||||
+ putchar ('^');
|
||||
+ putchar (escape_key + '@');
|
||||
+ break;
|
||||
+ default:
|
||||
+ abort ();
|
||||
+ }
|
||||
+}
|
||||
diff --git a/rescue/rescue.c b/rescue/rescue.c
|
||||
index 2b461378d..5281b1161 100644
|
||||
--- a/rescue/rescue.c
|
||||
+++ b/rescue/rescue.c
|
||||
@@ -1,5 +1,5 @@
|
||||
/* virt-rescue
|
||||
- * Copyright (C) 2010-2012 Red Hat Inc.
|
||||
+ * Copyright (C) 2010-2017 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
|
||||
@@ -40,10 +40,14 @@
|
||||
#include "xvasprintf.h"
|
||||
|
||||
#include "guestfs.h"
|
||||
+#include "guestfs-internal-frontend.h"
|
||||
+
|
||||
#include "windows.h"
|
||||
#include "options.h"
|
||||
#include "display-options.h"
|
||||
|
||||
+#include "rescue.h"
|
||||
+
|
||||
static void log_message_callback (guestfs_h *g, void *opaque, uint64_t event, int event_handle, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len);
|
||||
static void do_rescue (int sock);
|
||||
static void raw_tty (void);
|
||||
@@ -65,6 +69,7 @@ const char *libvirt_uri = NULL;
|
||||
int inspector = 0;
|
||||
int in_guestfish = 0;
|
||||
int in_virt_rescue = 1;
|
||||
+int escape_key = '\x1d'; /* ^] */
|
||||
|
||||
/* Old terminal settings. */
|
||||
static struct termios old_termios;
|
||||
@@ -86,6 +91,7 @@ usage (int status)
|
||||
" --append kernelopts Append kernel options\n"
|
||||
" -c|--connect uri Specify libvirt URI for -d option\n"
|
||||
" -d|--domain guest Add disks from libvirt guest\n"
|
||||
+ " -e ^x|none Set or disable escape key (default ^])\n"
|
||||
" --format[=raw|..] Force disk format for -a option\n"
|
||||
" --help Display brief help\n"
|
||||
" -i|--inspector Automatically mount filesystems\n"
|
||||
@@ -119,7 +125,7 @@ main (int argc, char *argv[])
|
||||
|
||||
enum { HELP_OPTION = CHAR_MAX + 1 };
|
||||
|
||||
- static const char options[] = "a:c:d:im:rvVwx";
|
||||
+ static const char options[] = "a:c:d:e:im:rvVwx";
|
||||
static const struct option long_options[] = {
|
||||
{ "add", 1, 0, 'a' },
|
||||
{ "append", 1, 0, 0 },
|
||||
@@ -226,6 +232,12 @@ main (int argc, char *argv[])
|
||||
OPTION_d;
|
||||
break;
|
||||
|
||||
+ case 'e':
|
||||
+ escape_key = parse_escape_key (optarg);
|
||||
+ if (escape_key == -1)
|
||||
+ error (EXIT_FAILURE, 0, _("unrecognized escape key: %s"), optarg);
|
||||
+ break;
|
||||
+
|
||||
case 'i':
|
||||
OPTION_i;
|
||||
break;
|
||||
@@ -428,6 +440,10 @@ main (int argc, char *argv[])
|
||||
signal (SIGTSTP, tstp_handler);
|
||||
signal (SIGCONT, cont_handler);
|
||||
|
||||
+ /* Print the escape key if set. */
|
||||
+ if (escape_key > 0)
|
||||
+ print_escape_key_help ();
|
||||
+
|
||||
do_rescue (sock);
|
||||
|
||||
restore_tty ();
|
||||
@@ -478,6 +494,9 @@ do_rescue (int sock)
|
||||
{
|
||||
size_t rlen = 0;
|
||||
size_t wlen = 0;
|
||||
+ struct escape_state escape_state;
|
||||
+
|
||||
+ init_escape_state (&escape_state);
|
||||
|
||||
while (sock >= 0 || rlen > 0) {
|
||||
struct pollfd fds[3];
|
||||
@@ -534,6 +553,13 @@ do_rescue (int sock)
|
||||
}
|
||||
if (n > 0)
|
||||
wlen += n;
|
||||
+
|
||||
+ /* Process escape sequences in the tty input. If the function
|
||||
+ * returns true, then we exit the loop causing virt-rescue to
|
||||
+ * exit.
|
||||
+ */
|
||||
+ if (escape_key > 0 && process_escapes (&escape_state, wbuf, &wlen))
|
||||
+ return;
|
||||
}
|
||||
|
||||
/* Log message from appliance. */
|
||||
diff --git a/rescue/rescue.h b/rescue/rescue.h
|
||||
new file mode 100644
|
||||
index 000000000..ccffb5eb3
|
||||
--- /dev/null
|
||||
+++ b/rescue/rescue.h
|
||||
@@ -0,0 +1,47 @@
|
||||
+/* virt-rescue
|
||||
+ * Copyright (C) 2010-2017 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
+ */
|
||||
+
|
||||
+#ifndef RESCUE_H
|
||||
+#define RESCUE_H
|
||||
+
|
||||
+#include <stdbool.h>
|
||||
+
|
||||
+#include "guestfs.h"
|
||||
+
|
||||
+extern guestfs_h *g;
|
||||
+extern int read_only;
|
||||
+extern int live;
|
||||
+extern int verbose;
|
||||
+extern int keys_from_stdin;
|
||||
+extern int echo_keys;
|
||||
+extern const char *libvirt_uri;
|
||||
+extern int inspector;
|
||||
+extern int in_guestfish;
|
||||
+extern int in_virt_rescue;
|
||||
+extern int escape_key;
|
||||
+
|
||||
+/* escape.c */
|
||||
+struct escape_state {
|
||||
+ bool in_escape;
|
||||
+};
|
||||
+extern void init_escape_state (struct escape_state *state);
|
||||
+extern bool process_escapes (struct escape_state *state, char *buf, size_t *len);
|
||||
+extern int parse_escape_key (const char *);
|
||||
+extern void print_escape_key_help (void);
|
||||
+
|
||||
+#endif /* RESCUE_H */
|
||||
diff --git a/rescue/virt-rescue.pod b/rescue/virt-rescue.pod
|
||||
index b651f84e7..bd6f954e9 100644
|
||||
--- a/rescue/virt-rescue.pod
|
||||
+++ b/rescue/virt-rescue.pod
|
||||
@@ -128,6 +128,29 @@ not used at all.
|
||||
Add all the disks from the named libvirt guest. Domain UUIDs can be
|
||||
used instead of names.
|
||||
|
||||
+=item B<-e none>
|
||||
+
|
||||
+Disable the escape key.
|
||||
+
|
||||
+=item B<-e> KEY
|
||||
+
|
||||
+Set the escape key to the given key sequence. The default is C<^]>.
|
||||
+To specify the escape key you can use:
|
||||
+
|
||||
+=over 4
|
||||
+
|
||||
+=item C<^x>
|
||||
+
|
||||
+Control key + C<x> key.
|
||||
+
|
||||
+=item C<none>
|
||||
+
|
||||
+I<-e none> means there is no escape key, escapes are disabled.
|
||||
+
|
||||
+=back
|
||||
+
|
||||
+See L</ESCAPE KEY> below for further information.
|
||||
+
|
||||
=item B<--format=raw|qcow2|..>
|
||||
|
||||
=item B<--format>
|
||||
@@ -321,6 +344,57 @@ See L<bash(1)> for more details.
|
||||
|
||||
=back
|
||||
|
||||
+=head1 ESCAPE KEY
|
||||
+
|
||||
+Virt-rescue supports various keyboard escape sequences which are
|
||||
+entered by pressing C<^]> (Control key + C<]> key).
|
||||
+
|
||||
+You can change the escape key using the I<-e> option on the command
|
||||
+line (see above), and you can disable escapes completely using
|
||||
+I<-e none>. The rest of this section assumes the default escape key.
|
||||
+
|
||||
+The following escapes can be used:
|
||||
+
|
||||
+=over 4
|
||||
+
|
||||
+=item C<^] ?>
|
||||
+
|
||||
+=item C<^] h>
|
||||
+
|
||||
+Prints a brief help text about escape sequences.
|
||||
+
|
||||
+=item C<^] i>
|
||||
+
|
||||
+Prints brief libguestfs inspection information for the guest. This
|
||||
+only works if you used I<-i> on the virt-rescue command line.
|
||||
+
|
||||
+=item C<^] q>
|
||||
+
|
||||
+=item C<^] x>
|
||||
+
|
||||
+Quits virt-rescue immediately.
|
||||
+
|
||||
+=item C<^] s>
|
||||
+
|
||||
+Synchronize the filesystems (sync).
|
||||
+
|
||||
+=item C<^] u>
|
||||
+
|
||||
+Unmounts all the filesystems, except for the root (appliance)
|
||||
+filesystems.
|
||||
+
|
||||
+=item C<^] z>
|
||||
+
|
||||
+Suspend virt-rescue (like pressing C<^Z> except that it affects
|
||||
+virt-rescue rather than the program inside the rescue shell).
|
||||
+
|
||||
+=item C<^] ^]>
|
||||
+
|
||||
+Sends the literal character C<^]> (ASCII 0x1d) through to the rescue
|
||||
+shell.
|
||||
+
|
||||
+=back
|
||||
+
|
||||
=head1 CAPTURING CORE DUMPS
|
||||
|
||||
If you are testing a tool inside virt-rescue and the tool (B<not>
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,397 +0,0 @@
|
|||
From 00adeb472c65e30fd2e55599b14d9b2eec2a873d Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 4 Mar 2017 15:35:09 +0000
|
||||
Subject: [PATCH 07/10] rescue: Move --suggest code to separate file.
|
||||
|
||||
Just code motion.
|
||||
|
||||
(cherry picked from commit 5ea17e97e4413c3db4449ded72b9677cce09444f)
|
||||
---
|
||||
rescue/Makefile.am | 3 +-
|
||||
rescue/rescue.c | 144 -------------------------------------------
|
||||
rescue/rescue.h | 5 ++
|
||||
rescue/suggest.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 182 insertions(+), 145 deletions(-)
|
||||
create mode 100644 rescue/suggest.c
|
||||
|
||||
diff --git a/rescue/Makefile.am b/rescue/Makefile.am
|
||||
index eb60bafa4..d478c8e3d 100644
|
||||
--- a/rescue/Makefile.am
|
||||
+++ b/rescue/Makefile.am
|
||||
@@ -28,7 +28,8 @@ bin_PROGRAMS = virt-rescue
|
||||
virt_rescue_SOURCES = \
|
||||
escape.c \
|
||||
rescue.c \
|
||||
- rescue.h
|
||||
+ rescue.h \
|
||||
+ suggest.c
|
||||
|
||||
virt_rescue_CPPFLAGS = \
|
||||
-DGUESTFS_WARN_DEPRECATED=1 \
|
||||
diff --git a/rescue/rescue.c b/rescue/rescue.c
|
||||
index 5281b1161..a1aac53e4 100644
|
||||
--- a/rescue/rescue.c
|
||||
+++ b/rescue/rescue.c
|
||||
@@ -55,7 +55,6 @@ static void restore_tty (void);
|
||||
static void tstp_handler (int sig);
|
||||
static void cont_handler (int sig);
|
||||
static void add_scratch_disks (int n, struct drv **drvs);
|
||||
-static void do_suggestion (struct drv *drvs);
|
||||
|
||||
/* Currently open libguestfs handle. */
|
||||
guestfs_h *g;
|
||||
@@ -654,149 +653,6 @@ cont_handler (int sig)
|
||||
raw_tty ();
|
||||
}
|
||||
|
||||
-static void suggest_filesystems (void);
|
||||
-
|
||||
-static int
|
||||
-compare_keys_len (const void *p1, const void *p2)
|
||||
-{
|
||||
- const char *key1 = * (char * const *) p1;
|
||||
- const char *key2 = * (char * const *) p2;
|
||||
- return strlen (key1) - strlen (key2);
|
||||
-}
|
||||
-
|
||||
-/* virt-rescue --suggest flag does a kind of inspection on the
|
||||
- * drives and suggests mount commands that you should use.
|
||||
- */
|
||||
-static void
|
||||
-do_suggestion (struct drv *drvs)
|
||||
-{
|
||||
- CLEANUP_FREE_STRING_LIST char **roots = NULL;
|
||||
- size_t i;
|
||||
-
|
||||
- /* For inspection, force add_drives to add the drives read-only. */
|
||||
- read_only = 1;
|
||||
-
|
||||
- /* Add drives. */
|
||||
- add_drives (drvs);
|
||||
-
|
||||
- /* Free up data structures, no longer needed after this point. */
|
||||
- free_drives (drvs);
|
||||
-
|
||||
- printf (_("Inspecting the virtual machine or disk image ...\n\n"));
|
||||
- fflush (stdout);
|
||||
-
|
||||
- if (guestfs_launch (g) == -1)
|
||||
- exit (EXIT_FAILURE);
|
||||
-
|
||||
- /* Don't use inspect_mount, since for virt-rescue we should allow
|
||||
- * arbitrary disks and disks with more than one OS on them. Let's
|
||||
- * do this using the basic API instead.
|
||||
- */
|
||||
- roots = guestfs_inspect_os (g);
|
||||
- if (roots == NULL)
|
||||
- exit (EXIT_FAILURE);
|
||||
-
|
||||
- if (roots[0] == NULL) {
|
||||
- suggest_filesystems ();
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- printf (_("This disk contains one or more operating systems. You can use these mount\n"
|
||||
- "commands in virt-rescue (at the ><rescue> prompt) to mount the filesystems.\n\n"));
|
||||
-
|
||||
- for (i = 0; roots[i] != NULL; ++i) {
|
||||
- CLEANUP_FREE_STRING_LIST char **mps = NULL;
|
||||
- CLEANUP_FREE char *type = NULL, *distro = NULL, *product_name = NULL;
|
||||
- int major, minor;
|
||||
- size_t j;
|
||||
-
|
||||
- type = guestfs_inspect_get_type (g, roots[i]);
|
||||
- distro = guestfs_inspect_get_distro (g, roots[i]);
|
||||
- product_name = guestfs_inspect_get_product_name (g, roots[i]);
|
||||
- major = guestfs_inspect_get_major_version (g, roots[i]);
|
||||
- minor = guestfs_inspect_get_minor_version (g, roots[i]);
|
||||
-
|
||||
- printf (_("# %s is the root of a %s operating system\n"
|
||||
- "# type: %s, distro: %s, version: %d.%d\n"
|
||||
- "# %s\n\n"),
|
||||
- roots[i], type ? : "unknown",
|
||||
- type ? : "unknown", distro ? : "unknown", major, minor,
|
||||
- product_name ? : "");
|
||||
-
|
||||
- mps = guestfs_inspect_get_mountpoints (g, roots[i]);
|
||||
- if (mps == NULL)
|
||||
- exit (EXIT_FAILURE);
|
||||
-
|
||||
- /* Sort by key length, shortest key first, so that we end up
|
||||
- * mounting the filesystems in the correct order.
|
||||
- */
|
||||
- qsort (mps, guestfs_int_count_strings (mps) / 2, 2 * sizeof (char *),
|
||||
- compare_keys_len);
|
||||
-
|
||||
- for (j = 0; mps[j] != NULL; j += 2)
|
||||
- printf ("mount %s /sysroot%s\n", mps[j+1], mps[j]);
|
||||
-
|
||||
- /* If it's Linux, print the bind-mounts and a chroot command. */
|
||||
- if (type && STREQ (type, "linux")) {
|
||||
- printf ("mount --rbind /dev /sysroot/dev\n");
|
||||
- printf ("mount --rbind /proc /sysroot/proc\n");
|
||||
- printf ("mount --rbind /sys /sysroot/sys\n");
|
||||
- printf ("\n");
|
||||
- printf ("cd /sysroot\n");
|
||||
- printf ("chroot /sysroot\n");
|
||||
- }
|
||||
-
|
||||
- printf ("\n");
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-/* Inspection failed, so it doesn't contain any OS that we recognise.
|
||||
- * However there might still be filesystems so print some suggestions
|
||||
- * for those.
|
||||
- */
|
||||
-static void
|
||||
-suggest_filesystems (void)
|
||||
-{
|
||||
- size_t i, count;
|
||||
-
|
||||
- CLEANUP_FREE_STRING_LIST char **fses = guestfs_list_filesystems (g);
|
||||
- if (fses == NULL)
|
||||
- exit (EXIT_FAILURE);
|
||||
-
|
||||
- /* Count how many are not swap or unknown. Possibly we should try
|
||||
- * mounting to see which are mountable, but that has a high
|
||||
- * probability of breaking.
|
||||
- */
|
||||
-#define TEST_MOUNTABLE(fs) STRNEQ ((fs), "swap") && STRNEQ ((fs), "unknown")
|
||||
- count = 0;
|
||||
- for (i = 0; fses[i] != NULL; i += 2) {
|
||||
- if (TEST_MOUNTABLE (fses[i+1]))
|
||||
- count++;
|
||||
- }
|
||||
-
|
||||
- if (count == 0) {
|
||||
- printf (_("This disk contains no mountable filesystems that we recognize.\n\n"
|
||||
- "However you can still use virt-rescue on the disk image, to try to mount\n"
|
||||
- "filesystems that are not recognized by libguestfs, or to create partitions,\n"
|
||||
- "logical volumes and filesystems on a blank disk.\n"));
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- printf (_("This disk contains one or more filesystems, but we don't recognize any\n"
|
||||
- "operating system. You can use these mount commands in virt-rescue (at the\n"
|
||||
- "><rescue> prompt) to mount these filesystems.\n\n"));
|
||||
-
|
||||
- for (i = 0; fses[i] != NULL; i += 2) {
|
||||
- printf (_("# %s has type '%s'\n"), fses[i], fses[i+1]);
|
||||
-
|
||||
- if (TEST_MOUNTABLE (fses[i+1]))
|
||||
- printf ("mount %s /sysroot\n", fses[i]);
|
||||
-
|
||||
- printf ("\n");
|
||||
- }
|
||||
-#undef TEST_MOUNTABLE
|
||||
-}
|
||||
-
|
||||
static void add_scratch_disk (struct drv **drvs);
|
||||
|
||||
static void
|
||||
diff --git a/rescue/rescue.h b/rescue/rescue.h
|
||||
index ccffb5eb3..4f5a04a71 100644
|
||||
--- a/rescue/rescue.h
|
||||
+++ b/rescue/rescue.h
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
#include "guestfs.h"
|
||||
|
||||
+#include "options.h"
|
||||
+
|
||||
extern guestfs_h *g;
|
||||
extern int read_only;
|
||||
extern int live;
|
||||
@@ -44,4 +46,7 @@ extern bool process_escapes (struct escape_state *state, char *buf, size_t *len)
|
||||
extern int parse_escape_key (const char *);
|
||||
extern void print_escape_key_help (void);
|
||||
|
||||
+/* suggest.c */
|
||||
+extern void do_suggestion (struct drv *drvs);
|
||||
+
|
||||
#endif /* RESCUE_H */
|
||||
diff --git a/rescue/suggest.c b/rescue/suggest.c
|
||||
new file mode 100644
|
||||
index 000000000..13141ccc2
|
||||
--- /dev/null
|
||||
+++ b/rescue/suggest.c
|
||||
@@ -0,0 +1,175 @@
|
||||
+/* virt-rescue
|
||||
+ * Copyright (C) 2010-2017 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
+ */
|
||||
+
|
||||
+#include <config.h>
|
||||
+
|
||||
+#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <locale.h>
|
||||
+#include <libintl.h>
|
||||
+
|
||||
+#include "guestfs.h"
|
||||
+#include "guestfs-internal-frontend.h"
|
||||
+
|
||||
+#include "options.h"
|
||||
+
|
||||
+#include "rescue.h"
|
||||
+
|
||||
+static void suggest_filesystems (void);
|
||||
+
|
||||
+static int
|
||||
+compare_keys_len (const void *p1, const void *p2)
|
||||
+{
|
||||
+ const char *key1 = * (char * const *) p1;
|
||||
+ const char *key2 = * (char * const *) p2;
|
||||
+ return strlen (key1) - strlen (key2);
|
||||
+}
|
||||
+
|
||||
+/* virt-rescue --suggest flag does a kind of inspection on the
|
||||
+ * drives and suggests mount commands that you should use.
|
||||
+ */
|
||||
+void
|
||||
+do_suggestion (struct drv *drvs)
|
||||
+{
|
||||
+ CLEANUP_FREE_STRING_LIST char **roots = NULL;
|
||||
+ size_t i;
|
||||
+
|
||||
+ /* For inspection, force add_drives to add the drives read-only. */
|
||||
+ read_only = 1;
|
||||
+
|
||||
+ /* Add drives. */
|
||||
+ add_drives (drvs);
|
||||
+
|
||||
+ /* Free up data structures, no longer needed after this point. */
|
||||
+ free_drives (drvs);
|
||||
+
|
||||
+ printf (_("Inspecting the virtual machine or disk image ...\n\n"));
|
||||
+ fflush (stdout);
|
||||
+
|
||||
+ if (guestfs_launch (g) == -1)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+
|
||||
+ /* Don't use inspect_mount, since for virt-rescue we should allow
|
||||
+ * arbitrary disks and disks with more than one OS on them. Let's
|
||||
+ * do this using the basic API instead.
|
||||
+ */
|
||||
+ roots = guestfs_inspect_os (g);
|
||||
+ if (roots == NULL)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+
|
||||
+ if (roots[0] == NULL) {
|
||||
+ suggest_filesystems ();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ printf (_("This disk contains one or more operating systems. You can use these mount\n"
|
||||
+ "commands in virt-rescue (at the ><rescue> prompt) to mount the filesystems.\n\n"));
|
||||
+
|
||||
+ for (i = 0; roots[i] != NULL; ++i) {
|
||||
+ CLEANUP_FREE_STRING_LIST char **mps = NULL;
|
||||
+ CLEANUP_FREE char *type = NULL, *distro = NULL, *product_name = NULL;
|
||||
+ int major, minor;
|
||||
+ size_t j;
|
||||
+
|
||||
+ type = guestfs_inspect_get_type (g, roots[i]);
|
||||
+ distro = guestfs_inspect_get_distro (g, roots[i]);
|
||||
+ product_name = guestfs_inspect_get_product_name (g, roots[i]);
|
||||
+ major = guestfs_inspect_get_major_version (g, roots[i]);
|
||||
+ minor = guestfs_inspect_get_minor_version (g, roots[i]);
|
||||
+
|
||||
+ printf (_("# %s is the root of a %s operating system\n"
|
||||
+ "# type: %s, distro: %s, version: %d.%d\n"
|
||||
+ "# %s\n\n"),
|
||||
+ roots[i], type ? : "unknown",
|
||||
+ type ? : "unknown", distro ? : "unknown", major, minor,
|
||||
+ product_name ? : "");
|
||||
+
|
||||
+ mps = guestfs_inspect_get_mountpoints (g, roots[i]);
|
||||
+ if (mps == NULL)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+
|
||||
+ /* Sort by key length, shortest key first, so that we end up
|
||||
+ * mounting the filesystems in the correct order.
|
||||
+ */
|
||||
+ qsort (mps, guestfs_int_count_strings (mps) / 2, 2 * sizeof (char *),
|
||||
+ compare_keys_len);
|
||||
+
|
||||
+ for (j = 0; mps[j] != NULL; j += 2)
|
||||
+ printf ("mount %s /sysroot%s\n", mps[j+1], mps[j]);
|
||||
+
|
||||
+ /* If it's Linux, print the bind-mounts and a chroot command. */
|
||||
+ if (type && STREQ (type, "linux")) {
|
||||
+ printf ("mount --rbind /dev /sysroot/dev\n");
|
||||
+ printf ("mount --rbind /proc /sysroot/proc\n");
|
||||
+ printf ("mount --rbind /sys /sysroot/sys\n");
|
||||
+ printf ("\n");
|
||||
+ printf ("cd /sysroot\n");
|
||||
+ printf ("chroot /sysroot\n");
|
||||
+ }
|
||||
+
|
||||
+ printf ("\n");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Inspection failed, so it doesn't contain any OS that we recognise.
|
||||
+ * However there might still be filesystems so print some suggestions
|
||||
+ * for those.
|
||||
+ */
|
||||
+static void
|
||||
+suggest_filesystems (void)
|
||||
+{
|
||||
+ size_t i, count;
|
||||
+
|
||||
+ CLEANUP_FREE_STRING_LIST char **fses = guestfs_list_filesystems (g);
|
||||
+ if (fses == NULL)
|
||||
+ exit (EXIT_FAILURE);
|
||||
+
|
||||
+ /* Count how many are not swap or unknown. Possibly we should try
|
||||
+ * mounting to see which are mountable, but that has a high
|
||||
+ * probability of breaking.
|
||||
+ */
|
||||
+#define TEST_MOUNTABLE(fs) STRNEQ ((fs), "swap") && STRNEQ ((fs), "unknown")
|
||||
+ count = 0;
|
||||
+ for (i = 0; fses[i] != NULL; i += 2) {
|
||||
+ if (TEST_MOUNTABLE (fses[i+1]))
|
||||
+ count++;
|
||||
+ }
|
||||
+
|
||||
+ if (count == 0) {
|
||||
+ printf (_("This disk contains no mountable filesystems that we recognize.\n\n"
|
||||
+ "However you can still use virt-rescue on the disk image, to try to mount\n"
|
||||
+ "filesystems that are not recognized by libguestfs, or to create partitions,\n"
|
||||
+ "logical volumes and filesystems on a blank disk.\n"));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ printf (_("This disk contains one or more filesystems, but we don't recognize any\n"
|
||||
+ "operating system. You can use these mount commands in virt-rescue (at the\n"
|
||||
+ "><rescue> prompt) to mount these filesystems.\n\n"));
|
||||
+
|
||||
+ for (i = 0; fses[i] != NULL; i += 2) {
|
||||
+ printf (_("# %s has type '%s'\n"), fses[i], fses[i+1]);
|
||||
+
|
||||
+ if (TEST_MOUNTABLE (fses[i+1]))
|
||||
+ printf ("mount %s /sysroot\n", fses[i]);
|
||||
+
|
||||
+ printf ("\n");
|
||||
+ }
|
||||
+#undef TEST_MOUNTABLE
|
||||
+}
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
From 35f96f0b0c9a3f05b16160338b1a118e2e7862ea Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 24 Mar 2017 22:51:06 +0000
|
||||
Subject: [PATCH 08/10] rescue: docs: It is no longer necessary to mount
|
||||
filesystems by hand.
|
||||
|
||||
Fix the manual page to reflect the new -i option.
|
||||
|
||||
Fixes commit 33d2ae796119ae5dd38e2afcbf1ba4216bd99846.
|
||||
|
||||
(cherry picked from commit c38b48409e067ba973d02bb10273350aa31b558e)
|
||||
---
|
||||
rescue/virt-rescue.pod | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/rescue/virt-rescue.pod b/rescue/virt-rescue.pod
|
||||
index bd6f954e9..dfa74e204 100644
|
||||
--- a/rescue/virt-rescue.pod
|
||||
+++ b/rescue/virt-rescue.pod
|
||||
@@ -35,9 +35,9 @@ For live VMs you I<must> use the I<--ro> option.
|
||||
When you run virt-rescue on a virtual machine or disk image, you are
|
||||
placed in an interactive bash shell where you can use many ordinary
|
||||
Linux commands. What you see in F</> (F</bin>, F</lib> etc) is the
|
||||
-rescue appliance. You must mount the virtual machine's filesystems by
|
||||
-hand. There is an empty directory called F</sysroot> where you can
|
||||
-mount filesystems.
|
||||
+rescue appliance. You must mount the virtual machine's filesystems.
|
||||
+There is an empty directory called F</sysroot> where you can mount
|
||||
+filesystems.
|
||||
|
||||
To automatically mount the virtual machine's filesystems under
|
||||
F</sysroot> use the I<-i> option. This uses libguestfs inspection to
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From bcbb71f280a1c8b9dee6d63ddd75d727d3c73d69 Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Fri, 24 Mar 2017 22:52:02 +0000
|
||||
Subject: [PATCH 09/10] rescue: docs: Note that you can run virt-rescue on
|
||||
disks too.
|
||||
|
||||
(cherry picked from commit 267569f7ad22ad14d9ef4fa27b038469ae115c45)
|
||||
---
|
||||
rescue/virt-rescue.pod | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/rescue/virt-rescue.pod b/rescue/virt-rescue.pod
|
||||
index dfa74e204..5cfbd6e1c 100644
|
||||
--- a/rescue/virt-rescue.pod
|
||||
+++ b/rescue/virt-rescue.pod
|
||||
@@ -69,7 +69,8 @@ Virt-rescue can be used on I<any> disk image file or device, not just
|
||||
a virtual machine. For example you can use it on a blank file if you
|
||||
want to partition that file (although we would recommend using
|
||||
L<guestfish(1)> instead as it is more suitable for this purpose). You
|
||||
-can even use virt-rescue on things like SD cards.
|
||||
+can even use virt-rescue on things like USB drives, SD cards and hard
|
||||
+disks.
|
||||
|
||||
You can get virt-rescue to give you scratch disk(s) to play with.
|
||||
This is useful for testing out Linux utilities (see I<--scratch>).
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
From 495ac58e2af309443f59819403e4cb5780ae721c Mon Sep 17 00:00:00 2001
|
||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||
Date: Sat, 25 Mar 2017 23:34:09 +0000
|
||||
Subject: [PATCH 10/10] rescue: Don't document --suggest option in --help
|
||||
output.
|
||||
|
||||
Also fix the docs test to ignore it.
|
||||
|
||||
Updates/fixes commit 33d2ae796119ae5dd38e2afcbf1ba4216bd99846.
|
||||
|
||||
(cherry picked from commit aa7b7e26c3aa434f2b299055df63c52fb3a2f93f)
|
||||
---
|
||||
rescue/rescue.c | 1 -
|
||||
rescue/test-virt-rescue-docs.sh | 3 ++-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/rescue/rescue.c b/rescue/rescue.c
|
||||
index a1aac53e4..6f9dcd733 100644
|
||||
--- a/rescue/rescue.c
|
||||
+++ b/rescue/rescue.c
|
||||
@@ -101,7 +101,6 @@ usage (int status)
|
||||
" --scratch[=N] Add scratch disk(s)\n"
|
||||
" --selinux For backwards compat only, does nothing\n"
|
||||
" --smp N Enable SMP with N >= 2 virtual CPUs\n"
|
||||
- " --suggest Suggest mount commands for this guest\n"
|
||||
" -v|--verbose Verbose messages\n"
|
||||
" -V|--version Display version and exit\n"
|
||||
" -w|--rw Mount read-write\n"
|
||||
diff --git a/rescue/test-virt-rescue-docs.sh b/rescue/test-virt-rescue-docs.sh
|
||||
index 25f8f6095..e5fbf26f4 100755
|
||||
--- a/rescue/test-virt-rescue-docs.sh
|
||||
+++ b/rescue/test-virt-rescue-docs.sh
|
||||
@@ -21,4 +21,5 @@ set -e
|
||||
$TEST_FUNCTIONS
|
||||
skip_if_skipped
|
||||
|
||||
-$top_srcdir/podcheck.pl virt-rescue.pod virt-rescue
|
||||
+$top_srcdir/podcheck.pl virt-rescue.pod virt-rescue \
|
||||
+ --ignore=--suggest
|
||||
--
|
||||
2.13.2
|
||||
|
||||
|
|
@ -8,8 +8,7 @@ list:
|
|||
|
||||
http://www.redhat.com/mailman/listinfo/libguestfs
|
||||
|
||||
This Fedora package comes with a lot of help and examples to get you
|
||||
started.
|
||||
This package comes with a lot of help and examples to get you started.
|
||||
|
||||
The first place to start are the manual pages. Type:
|
||||
|
||||
|
|
@ -20,19 +19,19 @@ The first place to start are the manual pages. Type:
|
|||
man virt-cat # and other virt-* tools
|
||||
|
||||
If you install the libguestfs-devel package, then in the
|
||||
/usr/share/doc/libguestfs-devel/ directory you will also
|
||||
find:
|
||||
/usr/share/doc/libguestfs-devel/ directory you will find other
|
||||
documentation including:
|
||||
|
||||
- BUGS: list of open bugs in this version
|
||||
|
||||
- ChangeLog: the detailed list of changes in this version
|
||||
- ChangeLog.gz: the detailed list of changes in this version
|
||||
|
||||
- ROADMAP: the roadmap for future versions
|
||||
- HACKING: how to extend libguestfs
|
||||
|
||||
- TODO: ideas for extending libguestfs
|
||||
|
||||
- *.c: example C programs using the API
|
||||
|
||||
- *.xml: example virt-inspector output
|
||||
- *.xml.gz: example virt-inspector output (compressed)
|
||||
|
||||
- *.rng: virt-inspector RelaxNG schema
|
||||
- virt-inspector.rng: virt-inspector RelaxNG schema
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
#!/bin/sh -
|
||||
|
||||
set -e
|
||||
|
||||
rpmdev-bumpspec -c "- Bump and rebuild." libguestfs.spec
|
||||
git diff ||:
|
||||
echo "Press ENTER to commit, push and rebuild."
|
||||
read line
|
||||
fedpkg commit -m "Bump and rebuild." -p
|
||||
fedpkg build
|
||||
56
copy-patches.sh
Executable file
56
copy-patches.sh
Executable file
|
|
@ -0,0 +1,56 @@
|
|||
#!/bin/bash -
|
||||
|
||||
set -e
|
||||
|
||||
# Maintainer script to copy patches from the git repo to the current
|
||||
# directory. It's normally only used downstream (ie. in RHEL). Use
|
||||
# it like this:
|
||||
# ./copy-patches.sh
|
||||
|
||||
rhel_version=9.0.0
|
||||
|
||||
# Check we're in the right directory.
|
||||
if [ ! -f libguestfs.spec ]; then
|
||||
echo "$0: run this from the directory containing 'libguestfs.spec'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
git_checkout=$HOME/d/libguestfs-rhel-$rhel_version
|
||||
if [ ! -d $git_checkout ]; then
|
||||
echo "$0: $git_checkout does not exist"
|
||||
echo "This script is only for use by the maintainer when preparing a"
|
||||
echo "libguestfs release on RHEL."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get the base version of libguestfs.
|
||||
version=`grep '^Version:' libguestfs.spec | awk '{print $2}'`
|
||||
tag="v$version"
|
||||
|
||||
# Remove any existing patches.
|
||||
git rm -f [0-9]*.patch ||:
|
||||
rm -f [0-9]*.patch
|
||||
|
||||
# Get the patches.
|
||||
(cd $git_checkout; rm -f [0-9]*.patch; git format-patch -N --submodule=diff $tag)
|
||||
mv $git_checkout/[0-9]*.patch .
|
||||
|
||||
# Remove any not to be applied.
|
||||
rm -f *NOT-FOR-RPM*.patch
|
||||
|
||||
# Add the patches.
|
||||
git add [0-9]*.patch
|
||||
|
||||
# Print out the patch lines.
|
||||
echo
|
||||
echo "--- Copy the following text into libguestfs.spec file"
|
||||
echo
|
||||
|
||||
echo "# Patches."
|
||||
for f in [0-9]*.patch; do
|
||||
n=`echo $f | awk -F- '{print $1}'`
|
||||
echo "Patch$n: $f"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "--- End of text"
|
||||
6
gating.yaml
Executable file
6
gating.yaml
Executable file
|
|
@ -0,0 +1,6 @@
|
|||
--- !Policy
|
||||
product_versions:
|
||||
- rhel-*
|
||||
decision_context: osci_compose_gate
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: xen-ci.brew-build.tier1.functional}
|
||||
2134
libguestfs.spec
2134
libguestfs.spec
File diff suppressed because it is too large
Load diff
5
rpminspect.yaml
Normal file
5
rpminspect.yaml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
# Ignore copy-patches.sh. It is an internal script we use to
|
||||
# manage the patches.
|
||||
upstream:
|
||||
ignore:
|
||||
- copy-patches.sh
|
||||
4
sources
4
sources
|
|
@ -1,2 +1,2 @@
|
|||
SHA512 (libguestfs-1.36.13.tar.gz) = 7c9799d5d563ffd8296f70a8402582aba85f3bf3c0dcaa18c44ecff5b7f771a3bc3f297aa85a4056351758298c79752d456a4b46e41924ff9acf196c992d51fb
|
||||
SHA512 (libguestfs-1.36.13.tar.gz.sig) = 50bf6282d9c10d7ad455b6a8986c9ada71e886b10c971042c04a8abac50d8d78e5e8a701f1c55188ed0130e82c240141e5dde7094267198b8d5231b35c1beb49
|
||||
SHA512 (libguestfs-1.58.0.tar.gz) = 67abbd37fe64935ae5cca13dbe1860fe2eab9df492fd134eacbdc1831e6034c849855e76118ce0002d3ac83205122947582dbe47b66f12b94dcb51155881501a
|
||||
SHA512 (libguestfs-1.58.0.tar.gz.sig) = e07758ed3901f9ae95dace16cbb4de194dbbde788155efcde7982226785928d1805af6939f201d74770923ad55997f1d465f9594cb81bc2435c0ea882ce546d8
|
||||
|
|
|
|||
10
tests/run-libguestfs-test-tool.sh
Executable file
10
tests/run-libguestfs-test-tool.sh
Executable file
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash -
|
||||
set -e
|
||||
set -x
|
||||
|
||||
# This only makes sure that libguestfs isn't totally broken.
|
||||
|
||||
# Fix libvirt.
|
||||
systemctl restart virtqemud virtsecretd virtstoraged virtnetworkd
|
||||
|
||||
libguestfs-test-tool
|
||||
14
tests/tests.yml
Normal file
14
tests/tests.yml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
# https://fedoraproject.org/wiki/CI/Tests
|
||||
# https://fedoraproject.org/wiki/CI/Standard_Test_Roles
|
||||
- hosts: localhost
|
||||
roles:
|
||||
- role: standard-test-basic
|
||||
tags:
|
||||
- classic
|
||||
required_packages:
|
||||
- libguestfs
|
||||
- libvirt-daemon-kvm
|
||||
tests:
|
||||
- libguestfs-test-tool:
|
||||
dir: .
|
||||
run: ./run-libguestfs-test-tool.sh
|
||||
|
|
@ -7,6 +7,7 @@ obsoletes=1
|
|||
gpgcheck=0
|
||||
assumeyes=1
|
||||
reposdir=/dev/null
|
||||
modulesdir=@PWD@/modules
|
||||
|
||||
[local]
|
||||
name=local
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue