[Libguestfs] [PATCH supermin] init: Delete initramfs files before chrooting into the appliance.

Richard W.M. Jones rjones at redhat.com
Tue Jun 14 15:18:26 UTC 2016


On Tue, Jun 14, 2016 at 04:09:13PM +0100, Richard W.M. Jones wrote:
> After supermin has finished running, the initramfs files sit around
> occupying swappable memory but serving no further purpose.

s/swappable/non-swappable/

> 
> This saves a little memory, at the cost of about 1ms of extra boot
> time.
> ---
>  init/init.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 48 insertions(+), 2 deletions(-)
> 
> diff --git a/init/init.c b/init/init.c
> index 733d66e..5ac53e9 100644
> --- a/init/init.c
> +++ b/init/init.c
> @@ -1,5 +1,5 @@
>  /* supermin-helper reimplementation in C.
> - * Copyright (C) 2009-2014 Red Hat Inc.
> + * Copyright (C) 2009-2016 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
> @@ -80,6 +80,7 @@ static void mount_proc (void);
>  static void print_uptime (void);
>  static void read_cmdline (void);
>  static void insmod (const char *filename);
> +static void delete_initramfs_files (void);
>  static void show_directory (const char *dir);
>  
>  static char cmdline[1024];
> @@ -264,9 +265,12 @@ main ()
>      exit (EXIT_FAILURE);
>    }
>  
> +  if (!quiet)
> +    fprintf (stderr, "supermin: deleting initramfs files\n");
> +  delete_initramfs_files ();
> +
>    /* Note that pivot_root won't work.  See the note in
>     * Documentation/filesystems/ramfs-rootfs-initramfs.txt
> -   * We could remove the old initramfs files, but let's not bother.
>     */
>    if (!quiet)
>      fprintf (stderr, "supermin: chroot\n");
> @@ -396,6 +400,48 @@ read_cmdline (void)
>      cmdline[len-1] = '\0';
>  }
>  
> +/* By deleting the files in the initramfs before we chroot, we save a
> + * little bit of memory (or quite a lot of memory if the user is using
> + * unstripped kmods).
> + *
> + * We only delete files in the root directory.  We don't delete
> + * directories because they only take a tiny amount of space and
> + * because we must not delete any mountpoints, especially not /root
> + * where we are about to chroot.
> + *
> + * We don't recursively look for files because that would be too
> + * complex and risky, and the normal supermin initramfs doesn't have
> + * any files except in the root directory.
> + */
> +static void
> +delete_initramfs_files (void)
> +{
> +  DIR *dir;
> +  struct dirent *d;
> +  struct stat statbuf;
> +
> +  if (chdir ("/") == -1) {
> +    perror ("chdir: /");
> +    return;
> +  }
> +
> +  dir = opendir (".");
> +  if (!dir) {
> +    perror ("opendir: /");
> +    return;
> +  }
> +
> +  while ((d = readdir (dir)) != NULL) {
> +    /* "." and ".." are directories, so the S_ISREG test ignores them. */
> +    if (lstat (d->d_name, &statbuf) >= 0 && S_ISREG (statbuf.st_mode)) {
> +      if (unlink (d->d_name) == -1)
> +        perror (d->d_name);
> +    }
> +  }
> +
> +  closedir (dir);
> +}
> +
>  /* Display a directory on stderr.  This is used for debugging only. */
>  static char
>  dirtype (int dt)
> -- 
> 2.7.4
> 
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the Libguestfs mailing list