|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Re-reading domain configs on domain restart
On Thu, Feb 23, 2012 at 3:16 PM, Ian Campbell <Ian.Campbell@xxxxxxxxxx> wrote:
> On Thu, 2012-02-23 at 11:17 +0000, Ian Campbell wrote:
>> As another (hopefully simple) idea how about a "xl dom-set-config" or
>> similar which (only) updates the config stashed in the userinfo to be
>> used on reboot? I would specifically exclude the possibility of this
>> reconfiguring the running domain for simplicity.
>
> I've only lightly tested the following, but it seemed to do what I
> expected (I used it to change memory from 512 to 1024 for a Windows VM
> on reboot).
>
> I think there might be a better name, that better reflects the fact that
> it doesn't actually change the config right now, any ideas?
> "domain-config-override"?
>
> Thoughts on the general concept?
Is the config used for anything other than a reboot? If so, it might
lead to unexpected behavior, if for example, I want to change config
option X on reboot, but it's read (and acted on) before I get done
with my various changes. It would be good if the user could be sure
that none of the changes would have any effect until the next reboot.
I think the concept of having a "config-on-reboot" is a good one. For
convenience, would it make sense to add a parameter to "xl reboot" to
take an argument (-c for example) that will do the config override
before issuing the reboot command?
-George
>
> Ian.
> 8<-------------------------------------------------------
>
> xl: provide a command to set the saved configuration for a running domain
>
> Pickup this new configuration on reboot.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r 8b82b7435b7d -r 063d98ba8309 docs/man/xl.pod.1
> --- a/docs/man/xl.pod.1 Thu Feb 23 12:31:18 2012 +0000
> +++ b/docs/man/xl.pod.1 Thu Feb 23 15:14:29 2012 +0000
> @@ -148,6 +148,31 @@ soon as it is run.
>
> =back
>
> +=item B<config-update> B<domid> [I<configfile>] [I<OPTIONS>]
> +
> +Update the saved configuration for a running domain. This has no
> +immediate effect but will be applied when the guest is next
> +restarted. This command is useful to ensure that runtime modifications
> +made to the guest will be preserved when the guest is restarted.
> +
> +I<configfile> has to be an absolute path to a file.
> +
> +B<OPTIONS>
> +
> +=over 4
> +
> +=item B<-f=FILE>, B<--defconfig=FILE>
> +
> +Use the given configuration file.
> +
> +=item B<key=value>
> +
> +It is possible to pass I<key=value> pairs on the command line to provide
> +options as if they were written in the configuration file; these override
> +whatever is in the I<configfile>.
> +
> +=back
> +
> =item B<console> [I<OPTIONS>] I<domain-id>
>
> Attach to domain I<domain-id>'s console. If you've set up your domains to
> diff -r 8b82b7435b7d -r 063d98ba8309 tools/libxl/xl.h
> --- a/tools/libxl/xl.h Thu Feb 23 12:31:18 2012 +0000
> +++ b/tools/libxl/xl.h Thu Feb 23 15:14:29 2012 +0000
> @@ -50,6 +50,7 @@ int main_reboot(int argc, char **argv);
> int main_list(int argc, char **argv);
> int main_list_vm(int argc, char **argv);
> int main_create(int argc, char **argv);
> +int main_config_update(int argc, char **argv);
> int main_button_press(int argc, char **argv);
> int main_vcpupin(int argc, char **argv);
> int main_vcpuset(int argc, char **argv);
> diff -r 8b82b7435b7d -r 063d98ba8309 tools/libxl/xl_cmdimpl.c
> --- a/tools/libxl/xl_cmdimpl.c Thu Feb 23 12:31:18 2012 +0000
> +++ b/tools/libxl/xl_cmdimpl.c Thu Feb 23 15:14:29 2012 +0000
> @@ -1201,11 +1201,31 @@ skip_vfb:
> xlu_cfg_destroy(config);
> }
>
> +static void reload_domain_config(libxl_ctx *ctx, uint32_t domid,
> + uint8_t **config_data, int *config_len)
> +{
> + uint8_t *t_data;
> + int ret, t_len;
> +
> + ret = libxl_userdata_retrieve(ctx, domid, "xl", &t_data, &t_len);
> + if (ret) {
> + LOG("failed to retrieve guest configuration (rc=%d). "
> + "reusing old configuration", ret);
> + return;
> + }
> +
> + free(*config_data);
> + *config_data = t_data;
> + *config_len = t_len;
> +}
> +
> /* Returns 1 if domain should be restarted,
> * 2 if domain should be renamed then restarted, or 0 */
> static int handle_domain_death(libxl_ctx *ctx, uint32_t domid,
> libxl_event *event,
> + uint8_t **config_data, int *config_len,
> libxl_domain_config *d_config)
> +
> {
> int restart = 0;
> libxl_action_on_shutdown action;
> @@ -1260,10 +1280,13 @@ static int handle_domain_death(libxl_ctx
> break;
>
> case LIBXL_ACTION_ON_SHUTDOWN_RESTART_RENAME:
> + reload_domain_config(ctx, domid, config_data, config_len);
> restart = 2;
> break;
>
> case LIBXL_ACTION_ON_SHUTDOWN_RESTART:
> + reload_domain_config(ctx, domid, config_data, config_len);
> +
> restart = 1;
> /* fall-through */
> case LIBXL_ACTION_ON_SHUTDOWN_DESTROY:
> @@ -1748,7 +1771,9 @@ start:
> LOG("Domain %d has shut down, reason code %d 0x%x", domid,
> event->u.domain_shutdown.shutdown_reason,
> event->u.domain_shutdown.shutdown_reason);
> - switch (handle_domain_death(ctx, domid, event, &d_config)) {
> + switch (handle_domain_death(ctx, domid, event,
> + (uint8_t **)&config_data,
> &config_len,
> + &d_config)) {
> case 2:
> if (!preserve_domain(ctx, domid, event, &d_config)) {
> /* If we fail then exit leaving the old domain in place.
> */
> @@ -1785,6 +1810,12 @@ start:
> d_config.c_info.name = strdup(common_domname);
> }
>
> + /* Reparse the configuration in case it has changed */
> + libxl_domain_config_dispose(&d_config);
> + memset(&d_config, 0, sizeof(d_config));
> + parse_config_data(config_file, config_data, config_len,
> + &d_config);
> +
> /*
> * XXX FIXME: If this sleep is not there then domain
> * re-creation fails sometimes.
> @@ -3394,6 +3425,120 @@ int main_create(int argc, char **argv)
> return 0;
> }
>
> +int main_config_update(int argc, char **argv)
> +{
> + const char *filename = NULL;
> + char *p;
> + char extra_config[1024];
> + void *config_data = 0;
> + int config_len = 0;
> + libxl_domain_config d_config;
> + int opt, rc;
> + int option_index = 0;
> + int debug = 0;
> + static struct option long_options[] = {
> + {"help", 0, 0, 'h'},
> + {"defconfig", 1, 0, 'f'},
> + {0, 0, 0, 0}
> + };
> +
> + if (argc < 2) {
> + fprintf(stderr, "xl config-update requires a domain argument\n");
> + help("config-update");
> + exit(1);
> + }
> +
> + find_domain(argv[1]);
> + argc--; argv++;
> +
> + if (argv[1] && argv[1][0] != '-' && !strchr(argv[1], '=')) {
> + filename = argv[1];
> + argc--; argv++;
> + }
> +
> + while (1) {
> + opt = getopt_long(argc, argv, "dhqf:", long_options, &option_index);
> + if (opt == -1)
> + break;
> +
> + switch (opt) {
> + case 'd':
> + debug = 1;
> + break;
> + case 'f':
> + filename = optarg;
> + break;
> + case 'h':
> + help("create");
> + return 0;
> + default:
> + fprintf(stderr, "option `%c' not supported.\n", optopt);
> + break;
> + }
> + }
> +
> + extra_config[0] = '\0';
> + for (p = extra_config; optind < argc; optind++) {
> + if (strchr(argv[optind], '=') != NULL) {
> + p += snprintf(p, sizeof(extra_config) - (p - extra_config),
> + "%s\n", argv[optind]);
> + } else if (!filename) {
> + filename = argv[optind];
> + } else {
> + help("create");
> + return 2;
> + }
> + }
> + if (filename) {
> + free(config_data); config_data = 0;
> + rc = libxl_read_file_contents(ctx, filename,
> + &config_data, &config_len);
> + if (rc) { fprintf(stderr, "Failed to read config file: %s: %s\n",
> + filename, strerror(errno)); return ERROR_FAIL; }
> + if (strlen(extra_config)) {
> + if (config_len > INT_MAX - (strlen(extra_config) + 2 + 1)) {
> + fprintf(stderr, "Failed to attach extra configration\n");
> + exit(1);
> + }
> + /* allocate space for the extra config plus two EOLs plus \0 */
> + config_data = realloc(config_data, config_len
> + + strlen(extra_config) + 2 + 1);
> + if (!config_data) {
> + fprintf(stderr, "Failed to realloc config_data\n");
> + exit(1);
> + }
> + config_len += sprintf(config_data + config_len, "\n%s\n",
> + extra_config);
> + }
> + } else {
> + fprintf(stderr, "Config file not specified\n");
> + exit(1);
> + }
> +
> + memset(&d_config, 0x00, sizeof(d_config));
> +
> + parse_config_data(filename, config_data, config_len, &d_config);
> +
> + if (debug || dryrun_only)
> + printf_info(default_output_format, -1, &d_config);
> +
> + if (!dryrun_only) {
> + fprintf(stderr, "setting dom%d configuration\n", domid);
> + rc = libxl_userdata_store(ctx, domid, "xl",
> + config_data, config_len);
> + if (rc) {
> + fprintf(stderr, "failed to update configuration\n");
> + exit(1);
> + }
> + }
> +
> + libxl_domain_config_dispose(&d_config);
> +
> + free(config_data);
> +
> + return 0;
> +}
> +
> static void button_press(const char *p, const char *b)
> {
> libxl_trigger trigger;
> @@ -3917,7 +4062,6 @@ static int sched_credit_domain_set(
> {
> int rc;
>
> -
> rc = libxl_sched_credit_domain_set(ctx, domid, scinfo);
> if (rc)
> fprintf(stderr, "libxl_sched_credit_domain_set failed.\n");
> diff -r 8b82b7435b7d -r 063d98ba8309 tools/libxl/xl_cmdtable.c
> --- a/tools/libxl/xl_cmdtable.c Thu Feb 23 12:31:18 2012 +0000
> +++ b/tools/libxl/xl_cmdtable.c Thu Feb 23 15:14:29 2012 +0000
> @@ -32,6 +32,15 @@ struct cmd_spec cmd_table[] = {
> "-d Enable debug messages.\n"
> "-e Do not wait in the background for the death of
> the domain."
> },
> + { "config-update",
> + &main_config_update, 1,
> + "Update a running domain's saved configuration, used when rebuilding "
> + "the domain after reboot",
> + "<Domain> <ConfigFile> [options] [vars]",
> + "-h Print this help.\n"
> + "-f FILE, --defconfig=FILE\n Use the given
> configuration file.\n"
> + "-d Enable debug messages.\n"
> + },
> { "list",
> &main_list, 0,
> "List information about all/some domains",
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |