Pull in all upstream patches since 5.1.13.
- Choose providers better (RHBZ#1266918). - Use autopatch.
This commit is contained in:
parent
1287017bff
commit
22a6b3ebe7
53
0001-utils-import-parse_size-from-libguestfs.patch
Normal file
53
0001-utils-import-parse_size-from-libguestfs.patch
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
From b6cf15d8f38270d6d6c9df2c8589829c9a3ad176 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pino Toscano <ptoscano@redhat.com>
|
||||||
|
Date: Mon, 13 Jul 2015 17:32:33 +0200
|
||||||
|
Subject: [PATCH 1/7] utils: import parse_size from libguestfs
|
||||||
|
|
||||||
|
---
|
||||||
|
src/utils.ml | 21 +++++++++++++++++++++
|
||||||
|
src/utils.mli | 3 +++
|
||||||
|
2 files changed, 24 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/utils.ml b/src/utils.ml
|
||||||
|
index 3e81c21..7ae24bd 100644
|
||||||
|
--- a/src/utils.ml
|
||||||
|
+++ b/src/utils.ml
|
||||||
|
@@ -204,3 +204,24 @@ let compare_architecture a1 a2 =
|
||||||
|
exit 1
|
||||||
|
in
|
||||||
|
compare (index_of_architecture a1) (index_of_architecture a2)
|
||||||
|
+
|
||||||
|
+(* Parse a size field, eg. "10G". *)
|
||||||
|
+let parse_size =
|
||||||
|
+ let const_re = Str.regexp "^\\([.0-9]+\\)\\([bKMG]\\)$" in
|
||||||
|
+ fun field ->
|
||||||
|
+ let matches rex = Str.string_match rex field 0 in
|
||||||
|
+ let sub i = Str.matched_group i field in
|
||||||
|
+ let size_scaled f = function
|
||||||
|
+ | "b" -> Int64.of_float f
|
||||||
|
+ | "K" -> Int64.of_float (f *. 1024.)
|
||||||
|
+ | "M" -> Int64.of_float (f *. 1024. *. 1024.)
|
||||||
|
+ | "G" -> Int64.of_float (f *. 1024. *. 1024. *. 1024.)
|
||||||
|
+ | _ -> assert false
|
||||||
|
+ in
|
||||||
|
+
|
||||||
|
+ if matches const_re then (
|
||||||
|
+ size_scaled (float_of_string (sub 1)) (sub 2)
|
||||||
|
+ ) else (
|
||||||
|
+ eprintf "supermin: cannot parse size field '%s'\n" field;
|
||||||
|
+ exit 1
|
||||||
|
+ )
|
||||||
|
diff --git a/src/utils.mli b/src/utils.mli
|
||||||
|
index 5de940d..7896e34 100644
|
||||||
|
--- a/src/utils.mli
|
||||||
|
+++ b/src/utils.mli
|
||||||
|
@@ -90,3 +90,6 @@ val compare_version : string -> string -> int
|
||||||
|
|
||||||
|
val compare_architecture : string -> string -> int
|
||||||
|
(** Compare two architecture strings. *)
|
||||||
|
+
|
||||||
|
+val parse_size : string -> int64
|
||||||
|
+(** Parse a size field, eg. [10G] *)
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
184
0002-Add-size-for-ext2-filesystem.patch
Normal file
184
0002-Add-size-for-ext2-filesystem.patch
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
From 92bc55b54a17d368b43241394ace1d862899f9d7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pino Toscano <ptoscano@redhat.com>
|
||||||
|
Date: Mon, 13 Jul 2015 17:33:34 +0200
|
||||||
|
Subject: [PATCH 2/7] Add --size for ext2 filesystem
|
||||||
|
|
||||||
|
Add a --size option to setting the size of the ext2 filesystem,
|
||||||
|
so it is possible to create ext2 appliances with smaller disk images.
|
||||||
|
|
||||||
|
The default is like the previously hardcoded value of 4GB.
|
||||||
|
---
|
||||||
|
src/build.ml | 4 ++--
|
||||||
|
src/ext2.ml | 19 ++++++++++---------
|
||||||
|
src/prepare.ml | 2 +-
|
||||||
|
src/supermin.ml | 9 +++++++--
|
||||||
|
src/supermin.pod | 15 +++++++++++++++
|
||||||
|
5 files changed, 35 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/build.ml b/src/build.ml
|
||||||
|
index d7d0781..fb2e6d3 100644
|
||||||
|
--- a/src/build.ml
|
||||||
|
+++ b/src/build.ml
|
||||||
|
@@ -59,7 +59,7 @@ and string_of_file_content = function
|
||||||
|
|
||||||
|
let rec build debug
|
||||||
|
(copy_kernel, dtb_wildcard, format, host_cpu,
|
||||||
|
- packager_config, tmpdir, use_installed)
|
||||||
|
+ packager_config, tmpdir, use_installed, size)
|
||||||
|
inputs outputdir =
|
||||||
|
if debug >= 1 then
|
||||||
|
printf "supermin: build: %s\n%!" (String.concat " " inputs);
|
||||||
|
@@ -210,7 +210,7 @@ let rec build debug
|
||||||
|
and initrd = outputdir // "initrd" in
|
||||||
|
let kernel_version, modpath =
|
||||||
|
Kernel.build_kernel debug host_cpu dtb_wildcard copy_kernel kernel dtb in
|
||||||
|
- Ext2.build_ext2 debug basedir files modpath kernel_version appliance;
|
||||||
|
+ Ext2.build_ext2 debug basedir files modpath kernel_version appliance size;
|
||||||
|
Ext2_initrd.build_initrd debug tmpdir modpath initrd
|
||||||
|
|
||||||
|
and read_appliance debug basedir appliance = function
|
||||||
|
diff --git a/src/ext2.ml b/src/ext2.ml
|
||||||
|
index d5c26a7..79539a3 100644
|
||||||
|
--- a/src/ext2.ml
|
||||||
|
+++ b/src/ext2.ml
|
||||||
|
@@ -23,26 +23,27 @@ open Utils
|
||||||
|
open Ext2fs
|
||||||
|
open Package_handler
|
||||||
|
|
||||||
|
-(* The ext2 image that we build always has a fixed size, and we 'hope'
|
||||||
|
- * that the files fit in (otherwise we'll get an error). Note that
|
||||||
|
- * the file is sparsely allocated.
|
||||||
|
+(* The ext2 image that we build has a size of 4GB if not specified,
|
||||||
|
+ * and we 'hope' that the files fit in (otherwise we'll get an error).
|
||||||
|
+ * Note that the file is sparsely allocated.
|
||||||
|
*
|
||||||
|
* The downside of allocating a very large initial disk is that the
|
||||||
|
* fixed overhead of ext2 is larger (since ext2 calculates it based on
|
||||||
|
* the size of the disk). For a 4GB disk the overhead is
|
||||||
|
* approximately 66MB.
|
||||||
|
- *
|
||||||
|
- * In future, make this configurable, or determine it from the input
|
||||||
|
- * files (XXX).
|
||||||
|
*)
|
||||||
|
-let appliance_size = 4L *^ 1024L *^ 1024L *^ 1024L
|
||||||
|
+let default_appliance_size = 4L *^ 1024L *^ 1024L *^ 1024L
|
||||||
|
|
||||||
|
-let build_ext2 debug basedir files modpath kernel_version appliance =
|
||||||
|
+let build_ext2 debug basedir files modpath kernel_version appliance size =
|
||||||
|
if debug >= 1 then
|
||||||
|
printf "supermin: ext2: creating empty ext2 filesystem '%s'\n%!" appliance;
|
||||||
|
|
||||||
|
let fd = openfile appliance [O_WRONLY;O_CREAT;O_TRUNC;O_NOCTTY] 0o644 in
|
||||||
|
- LargeFile.ftruncate fd appliance_size;
|
||||||
|
+ let size =
|
||||||
|
+ match size with
|
||||||
|
+ | None -> default_appliance_size
|
||||||
|
+ | Some s -> s in
|
||||||
|
+ LargeFile.ftruncate fd size;
|
||||||
|
close fd;
|
||||||
|
|
||||||
|
let cmd =
|
||||||
|
diff --git a/src/prepare.ml b/src/prepare.ml
|
||||||
|
index 75f21dc..7e522e9 100644
|
||||||
|
--- a/src/prepare.ml
|
||||||
|
+++ b/src/prepare.ml
|
||||||
|
@@ -22,7 +22,7 @@ open Package_handler
|
||||||
|
open Utils
|
||||||
|
|
||||||
|
let prepare debug (copy_kernel, dtb_wildcard, format, host_cpu,
|
||||||
|
- packager_config, tmpdir, use_installed)
|
||||||
|
+ packager_config, tmpdir, use_installed, size)
|
||||||
|
inputs outputdir =
|
||||||
|
if debug >= 1 then
|
||||||
|
printf "supermin: prepare: %s\n%!" (String.concat " " inputs);
|
||||||
|
diff --git a/src/supermin.ml b/src/supermin.ml
|
||||||
|
index 14261d6..9623229 100644
|
||||||
|
--- a/src/supermin.ml
|
||||||
|
+++ b/src/supermin.ml
|
||||||
|
@@ -94,6 +94,7 @@ let main () =
|
||||||
|
let outputdir = ref "" in
|
||||||
|
let packager_config = ref "" in
|
||||||
|
let use_installed = ref false in
|
||||||
|
+ let size = ref None in
|
||||||
|
|
||||||
|
let set_debug () = incr debug in
|
||||||
|
|
||||||
|
@@ -118,6 +119,8 @@ let main () =
|
||||||
|
exit 1
|
||||||
|
in
|
||||||
|
|
||||||
|
+ let set_size arg = size := Some (parse_size arg) in
|
||||||
|
+
|
||||||
|
let error_supermin_5 () =
|
||||||
|
eprintf "supermin: *** error: This is supermin version 5.\n";
|
||||||
|
eprintf "supermin: *** It looks like you are looking for supermin version 4.\n";
|
||||||
|
@@ -143,6 +146,7 @@ let main () =
|
||||||
|
"-o", Arg.Set_string outputdir, "OUTPUTDIR Set output directory";
|
||||||
|
"--packager-config", Arg.Set_string packager_config, "CONFIGFILE Set packager config file";
|
||||||
|
"--prepare", Arg.Unit set_prepare_mode, " Prepare a supermin appliance";
|
||||||
|
+ "--size", Arg.String set_size, " Set the size of the ext2 filesystem";
|
||||||
|
"--use-installed", Arg.Set use_installed, " Use installed files instead of accessing network";
|
||||||
|
"-v", Arg.Unit set_debug, " Enable debugging messages";
|
||||||
|
"--verbose", Arg.Unit set_debug, ditto;
|
||||||
|
@@ -165,6 +169,7 @@ let main () =
|
||||||
|
let packager_config =
|
||||||
|
match !packager_config with "" -> None | s -> Some s in
|
||||||
|
let use_installed = !use_installed in
|
||||||
|
+ let size = !size in
|
||||||
|
|
||||||
|
let format =
|
||||||
|
match mode, !format with
|
||||||
|
@@ -184,7 +189,7 @@ let main () =
|
||||||
|
|
||||||
|
debug, mode, if_newer, inputs, lockfile, outputdir,
|
||||||
|
(copy_kernel, dtb_wildcard, format, host_cpu,
|
||||||
|
- packager_config, tmpdir, use_installed) in
|
||||||
|
+ packager_config, tmpdir, use_installed, size) in
|
||||||
|
|
||||||
|
if debug >= 1 then printf "supermin: version: %s\n" Config.package_version;
|
||||||
|
|
||||||
|
@@ -192,7 +197,7 @@ let main () =
|
||||||
|
* This fails with an error if one could not be located.
|
||||||
|
*)
|
||||||
|
let () =
|
||||||
|
- let (_, _, _, _, packager_config, tmpdir, _) = args in
|
||||||
|
+ let (_, _, _, _, packager_config, tmpdir, _, _) = args in
|
||||||
|
let settings = {
|
||||||
|
debug = debug;
|
||||||
|
tmpdir = tmpdir;
|
||||||
|
diff --git a/src/supermin.pod b/src/supermin.pod
|
||||||
|
index f2e8446..f9b7395 100644
|
||||||
|
--- a/src/supermin.pod
|
||||||
|
+++ b/src/supermin.pod
|
||||||
|
@@ -189,6 +189,9 @@ appliance to C<OUTPUTDIR/initrd>, and the ext2 filesystem image to
|
||||||
|
C<OUTPUTDIR/root>. (Where C<OUTPUTDIR> is specified by the I<-o>
|
||||||
|
option).
|
||||||
|
|
||||||
|
+The filesystem (C<OUTPUTDIR/root>) has a default size of 4 GB
|
||||||
|
+(see also the I<--size> option).
|
||||||
|
+
|
||||||
|
=back
|
||||||
|
|
||||||
|
=item B<--host-cpu> CPU
|
||||||
|
@@ -283,6 +286,18 @@ However this option is useful in some controlled situations: for
|
||||||
|
example when using supermin inside a freshly installed chroot, or if
|
||||||
|
you have no network access during the build.
|
||||||
|
|
||||||
|
+=item B<--size> SIZE
|
||||||
|
+
|
||||||
|
+(I<--build> mode only)
|
||||||
|
+
|
||||||
|
+Select the size of the output ext2 filesystem, where the size can be
|
||||||
|
+specified using common names such as C<32G> (32 gigabytes) etc.
|
||||||
|
+
|
||||||
|
+If the size is not specified, a default size of 4 GB is used.
|
||||||
|
+
|
||||||
|
+To specify size in bytes, the number must be followed by the lowercase
|
||||||
|
+letter I<b>, eg: S<C<--size 10737418240b>>.
|
||||||
|
+
|
||||||
|
=item B<-v>
|
||||||
|
|
||||||
|
=item B<--verbose>
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
217
0003-docs-Use-F-for-filenames-instead-of-C.patch
Normal file
217
0003-docs-Use-F-for-filenames-instead-of-C.patch
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
From d4615d38b2ccbf47642457887d2f4b1a514ee456 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pino Toscano <ptoscano@redhat.com>
|
||||||
|
Date: Tue, 14 Jul 2015 08:57:44 +0200
|
||||||
|
Subject: [PATCH 3/7] docs: Use F<> for filenames instead of C<>
|
||||||
|
|
||||||
|
---
|
||||||
|
src/supermin.pod | 60 ++++++++++++++++++++++++++++----------------------------
|
||||||
|
1 file changed, 30 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/supermin.pod b/src/supermin.pod
|
||||||
|
index f9b7395..53d1b11 100644
|
||||||
|
--- a/src/supermin.pod
|
||||||
|
+++ b/src/supermin.pod
|
||||||
|
@@ -46,7 +46,7 @@ For example:
|
||||||
|
|
||||||
|
creates a supermin appliance containing the packages C<bash> and
|
||||||
|
C<coreutils>. Specifically, it creates some files in directory
|
||||||
|
-C<supermin.d>. This directory I<is> the supermin appliance. (See
|
||||||
|
+F<supermin.d>. This directory I<is> the supermin appliance. (See
|
||||||
|
L</SUPERMIN APPLIANCES> below).
|
||||||
|
|
||||||
|
It is intended that the I<--prepare> step is done on a central build
|
||||||
|
@@ -60,8 +60,8 @@ builds the full appliance from the supermin appliance:
|
||||||
|
|
||||||
|
supermin --build --format ext2 supermin.d -o appliance.d
|
||||||
|
|
||||||
|
-This will create files called C<appliance.d/kernel>,
|
||||||
|
-C<appliance.d/root> etc, which is the full sized bootable appliance.
|
||||||
|
+This will create files called F<appliance.d/kernel>,
|
||||||
|
+F<appliance.d/root> etc, which is the full sized bootable appliance.
|
||||||
|
|
||||||
|
It is intended that the I<--build> step is done on the end user's
|
||||||
|
machine at the last second before the appliance is needed. The
|
||||||
|
@@ -112,7 +112,7 @@ a separate program called C<supermin-helper>.
|
||||||
|
(I<--build> mode only)
|
||||||
|
|
||||||
|
Copy the kernel (and device tree, if created) instead of symlinking to
|
||||||
|
-the kernel in C</boot>.
|
||||||
|
+the kernel in F</boot>.
|
||||||
|
|
||||||
|
This is fractionally slower, but is necessary if you want to change
|
||||||
|
the permissions or SELinux label on the kernel or device tree.
|
||||||
|
@@ -124,7 +124,7 @@ the permissions or SELinux label on the kernel or device tree.
|
||||||
|
If specified, search for a device tree which is compatible with the
|
||||||
|
selected kernel and the name of which matches the given wildcard. You
|
||||||
|
can use a wildcard such as C<vexpress-*a9*.dtb> which would match
|
||||||
|
-C<vexpress-v2p-ca9.dtb>.
|
||||||
|
+F<vexpress-v2p-ca9.dtb>.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
@@ -170,7 +170,7 @@ Possible formats are:
|
||||||
|
|
||||||
|
A directory tree in the host filesystem.
|
||||||
|
|
||||||
|
-The filesystem tree is written to C<OUTPUTDIR> (ie. the I<-o> option).
|
||||||
|
+The filesystem tree is written to F<OUTPUTDIR> (ie. the I<-o> option).
|
||||||
|
|
||||||
|
This is called a C<chroot> because you could literally L<chroot(1)>
|
||||||
|
into this directory afterwards, although it's a better idea to use a
|
||||||
|
@@ -183,13 +183,13 @@ assumed that you will be running the appliance using the host kernel.
|
||||||
|
|
||||||
|
An ext2 filesystem disk image.
|
||||||
|
|
||||||
|
-The output kernel is written to C<OUTPUTDIR/kernel>, the device tree
|
||||||
|
-(if using) to C<OUTPUTDIR/dtb>, a small initramfs which can mount the
|
||||||
|
-appliance to C<OUTPUTDIR/initrd>, and the ext2 filesystem image to
|
||||||
|
-C<OUTPUTDIR/root>. (Where C<OUTPUTDIR> is specified by the I<-o>
|
||||||
|
+The output kernel is written to F<OUTPUTDIR/kernel>, the device tree
|
||||||
|
+(if using) to F<OUTPUTDIR/dtb>, a small initramfs which can mount the
|
||||||
|
+appliance to F<OUTPUTDIR/initrd>, and the ext2 filesystem image to
|
||||||
|
+F<OUTPUTDIR/root>. (Where F<OUTPUTDIR> is specified by the I<-o>
|
||||||
|
option).
|
||||||
|
|
||||||
|
-The filesystem (C<OUTPUTDIR/root>) has a default size of 4 GB
|
||||||
|
+The filesystem (F<OUTPUTDIR/root>) has a default size of 4 GB
|
||||||
|
(see also the I<--size> option).
|
||||||
|
|
||||||
|
=back
|
||||||
|
@@ -210,7 +210,7 @@ The output directory is checked and it is I<not> rebuilt unless it
|
||||||
|
needs to be.
|
||||||
|
|
||||||
|
This is done by consulting the dates of the host package database
|
||||||
|
-(C</var/lib/rpm> etc), the input supermin files, and the output
|
||||||
|
+(F</var/lib/rpm> etc), the input supermin files, and the output
|
||||||
|
directory. The operation is only carried out if either the host
|
||||||
|
package database or the input supermin files are newer than the output
|
||||||
|
directory.
|
||||||
|
@@ -248,9 +248,9 @@ B<Any previous contents of the output directory are deleted>, and a
|
||||||
|
new output directory is created.
|
||||||
|
|
||||||
|
The output directory is created (nearly) atomically by constructing a
|
||||||
|
-temporary directory called something like C<OUTPUTDIR.abc543>, then
|
||||||
|
+temporary directory called something like F<OUTPUTDIR.abc543>, then
|
||||||
|
renaming the old output directory (if present) and deleting it, and
|
||||||
|
-then renaming the temporary directory to C<OUTPUTDIR>. By combining
|
||||||
|
+then renaming the temporary directory to F<OUTPUTDIR>. By combining
|
||||||
|
this option with I<--lock> you can ensure that multiple parallel runs
|
||||||
|
of supermin do not conflict with each other.
|
||||||
|
|
||||||
|
@@ -262,10 +262,10 @@ Set the configuration file for the package manager. This allows you
|
||||||
|
to specify alternate software repositories.
|
||||||
|
|
||||||
|
For ArchLinux, this sets the pacman configuration file (default
|
||||||
|
-C</etc/pacman.conf>). See L<pacman.conf(5)>.
|
||||||
|
+F</etc/pacman.conf>). See L<pacman.conf(5)>.
|
||||||
|
|
||||||
|
For Yum/RPM distributions, this sets the yum configuration file
|
||||||
|
-(default C</etc/yum.conf>). See L<yum.conf(5)>.
|
||||||
|
+(default F</etc/yum.conf>). See L<yum.conf(5)>.
|
||||||
|
|
||||||
|
=item B<--prepare>
|
||||||
|
|
||||||
|
@@ -336,8 +336,8 @@ Print the package name and version number, and exit.
|
||||||
|
Supermin appliances consist of just enough information to be able to
|
||||||
|
build an appliance containing the same operating system (Linux
|
||||||
|
version, distro, release etc) as the host OS. Since the host and
|
||||||
|
-appliance share many common files such as C</bin/bash> and
|
||||||
|
-C</lib/libc.so> there is no reason to ship these files in the
|
||||||
|
+appliance share many common files such as F</bin/bash> and
|
||||||
|
+F</lib/libc.so> there is no reason to ship these files in the
|
||||||
|
appliance. They can simply be read from the host on demand when the
|
||||||
|
appliance is launched. Therefore to save space we just store the
|
||||||
|
names of the packages we want from the host, and copy those in (plus
|
||||||
|
@@ -350,20 +350,20 @@ skeleton base image which contains these files and the outline
|
||||||
|
directory structure.
|
||||||
|
|
||||||
|
Therefore the supermin appliance normally consists of at least two
|
||||||
|
-control files (C<packages> and C<base.tar.gz>).
|
||||||
|
+control files (F<packages> and F<base.tar.gz>).
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
-=item B<packages>
|
||||||
|
+=item F<packages>
|
||||||
|
|
||||||
|
The list of packages to be copied from the host. Dependencies are
|
||||||
|
resolved automatically.
|
||||||
|
|
||||||
|
The file is plain text, one package name per line.
|
||||||
|
|
||||||
|
-=item B<base.tar>
|
||||||
|
+=item F<base.tar>
|
||||||
|
|
||||||
|
-=item B<base.tar.gz>
|
||||||
|
+=item F<base.tar.gz>
|
||||||
|
|
||||||
|
This tar file (which may be compressed) contains the skeleton
|
||||||
|
filesystem. Mostly it contains directories and a few configuration
|
||||||
|
@@ -372,7 +372,7 @@ files.
|
||||||
|
All paths in the tar file should be relative to the root directory of
|
||||||
|
the appliance.
|
||||||
|
|
||||||
|
-=item B<hostfiles>
|
||||||
|
+=item F<hostfiles>
|
||||||
|
|
||||||
|
Any other files that are to be copied from the host. This is a plain
|
||||||
|
text file with one pathname per line.
|
||||||
|
@@ -382,7 +382,7 @@ is created, eg:
|
||||||
|
|
||||||
|
/etc/yum.repos.d/*.repo
|
||||||
|
|
||||||
|
-would copy all of the C<*.repo> files into the appliance.
|
||||||
|
+would copy all of the F<*.repo> files into the appliance.
|
||||||
|
|
||||||
|
Each pathname in the file should start with a C</> character.
|
||||||
|
|
||||||
|
@@ -392,7 +392,7 @@ However you may drop one or more of these files into the supermin
|
||||||
|
appliance directory if you want to copy random unpackaged files into
|
||||||
|
the full appliance.
|
||||||
|
|
||||||
|
-=item B<excludefiles>
|
||||||
|
+=item F<excludefiles>
|
||||||
|
|
||||||
|
A list of filenames, directory names, or wildcards prefixed by C<->
|
||||||
|
which are excluded from the final appliance.
|
||||||
|
@@ -427,9 +427,9 @@ directories passed to it. A common layout could look like this:
|
||||||
|
supermin.d/zz-hostfiles
|
||||||
|
|
||||||
|
In this way extra files can be added to the appliance just by creating
|
||||||
|
-another tar file (C<extra.tar.gz> in the example above) and dropping
|
||||||
|
+another tar file (F<extra.tar.gz> in the example above) and dropping
|
||||||
|
it into the directory, and additional host files can be added
|
||||||
|
-(C<zz-hostfiles> in the example above). When the appliance is
|
||||||
|
+(F<zz-hostfiles> in the example above). When the appliance is
|
||||||
|
constructed, the extra files will appear in the appliance.
|
||||||
|
|
||||||
|
=head2 MINIMIZING THE SUPERMIN APPLIANCE
|
||||||
|
@@ -481,7 +481,7 @@ then you should do something like this:
|
||||||
|
=head2 ENFORCING AVAILABILITY OF PACKAGES
|
||||||
|
|
||||||
|
Supermin builds the appliance by copying in the packages listed in
|
||||||
|
-C<packages>. For this to work those packages must be available. We
|
||||||
|
+F<packages>. For this to work those packages must be available. We
|
||||||
|
usually enforce this by adding requirements (eg. RPM C<Requires:>
|
||||||
|
lines) on the package that uses the supermin appliance, so that
|
||||||
|
package cannot be installed without pulling in the dependent packages
|
||||||
|
@@ -497,14 +497,14 @@ If this environment variable is set, then automatic selection of the
|
||||||
|
kernel is bypassed and this kernel is used.
|
||||||
|
|
||||||
|
The environment variable should point to a kernel file,
|
||||||
|
-eg. C</boot/vmlinuz-3.0.x86_64>
|
||||||
|
+eg. F</boot/vmlinuz-3.0.x86_64>
|
||||||
|
|
||||||
|
=item SUPERMIN_MODULES
|
||||||
|
|
||||||
|
This specifies the kernel modules directory to use.
|
||||||
|
|
||||||
|
The environment variable should point to a module directory,
|
||||||
|
-eg. C</lib/modules/3.0.x86_64/>
|
||||||
|
+eg. F</lib/modules/3.0.x86_64/>
|
||||||
|
|
||||||
|
=item SUPERMIN_DTB
|
||||||
|
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
25
0004-rpm-rpm_is_available-function-can-be-noalloc.patch
Normal file
25
0004-rpm-rpm_is_available-function-can-be-noalloc.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
From f7707b743152b96af204e7ef55b33fca7d91bab0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Tue, 13 Oct 2015 12:42:05 +0100
|
||||||
|
Subject: [PATCH 4/7] rpm: rpm_is_available function can be "noalloc".
|
||||||
|
|
||||||
|
---
|
||||||
|
src/librpm.ml | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/librpm.ml b/src/librpm.ml
|
||||||
|
index dc80286..4eeba77 100644
|
||||||
|
--- a/src/librpm.ml
|
||||||
|
+++ b/src/librpm.ml
|
||||||
|
@@ -16,7 +16,7 @@
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*)
|
||||||
|
|
||||||
|
-external rpm_is_available : unit -> bool = "supermin_rpm_is_available"
|
||||||
|
+external rpm_is_available : unit -> bool = "supermin_rpm_is_available" "noalloc"
|
||||||
|
|
||||||
|
external rpm_version : unit -> string = "supermin_rpm_version"
|
||||||
|
external rpm_vercmp : string -> string -> int = "supermin_rpm_vercmp" "noalloc"
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
62
0005-rpm-Add-some-documentation-to-librpm.mli.patch
Normal file
62
0005-rpm-Add-some-documentation-to-librpm.mli.patch
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
From 9515c554ca9e725c4094cbbcd9f37bb316a2529f Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Tue, 13 Oct 2015 12:48:03 +0100
|
||||||
|
Subject: [PATCH 5/7] rpm: Add some documentation to librpm.mli.
|
||||||
|
|
||||||
|
---
|
||||||
|
src/librpm.mli | 21 +++++++++++++++++++++
|
||||||
|
1 file changed, 21 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/librpm.mli b/src/librpm.mli
|
||||||
|
index da73911..5229be6 100644
|
||||||
|
--- a/src/librpm.mli
|
||||||
|
+++ b/src/librpm.mli
|
||||||
|
@@ -16,17 +16,28 @@
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*)
|
||||||
|
|
||||||
|
+(** Wrappers around [librpm] functions. *)
|
||||||
|
+
|
||||||
|
val rpm_is_available : unit -> bool
|
||||||
|
+(** Returns [true] iff librpm is supported. If this returns [false],
|
||||||
|
+ then all other functions will abort. *)
|
||||||
|
|
||||||
|
val rpm_version : unit -> string
|
||||||
|
+(** The linked version of librpm. *)
|
||||||
|
+
|
||||||
|
val rpm_vercmp : string -> string -> int
|
||||||
|
+(** Compare two RPM version strings using RPM version compare rules. *)
|
||||||
|
|
||||||
|
type t
|
||||||
|
+(** The librpm handle. *)
|
||||||
|
|
||||||
|
exception Multiple_matches of int
|
||||||
|
|
||||||
|
val rpm_open : ?debug:int -> t
|
||||||
|
+(** Open the librpm (transaction set) handle. *)
|
||||||
|
val rpm_close : t -> unit
|
||||||
|
+(** Explicitly close the handle. The handle can also be closed by
|
||||||
|
+ the garbage collector if it becomes unreachable. *)
|
||||||
|
|
||||||
|
type rpm_t = {
|
||||||
|
name : string;
|
||||||
|
@@ -44,6 +55,16 @@ type rpmfile_t = {
|
||||||
|
| FileConfig
|
||||||
|
|
||||||
|
val rpm_installed : t -> string -> rpm_t array
|
||||||
|
+(** Return the list of packages matching the name
|
||||||
|
+ (similar to [rpm -q name]). *)
|
||||||
|
+
|
||||||
|
val rpm_pkg_requires : t -> string -> string array
|
||||||
|
+(** Return the requires of a package (similar to [rpm -qR]). *)
|
||||||
|
+
|
||||||
|
val rpm_pkg_whatprovides : t -> string -> string array
|
||||||
|
+(** Return what package(s) provide a particular requirement
|
||||||
|
+ (similar to [rpm -q --whatprovides]). *)
|
||||||
|
+
|
||||||
|
val rpm_pkg_filelist : t -> string -> rpmfile_t array
|
||||||
|
+(** Return the list of files contained in a package, and attributes of
|
||||||
|
+ those files (similar to [rpm -ql]). *)
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
82
0006-rpm-Flush-debugging-messages-in-C-code.patch
Normal file
82
0006-rpm-Flush-debugging-messages-in-C-code.patch
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
From a843495409d2d1cf1cd966470b57d336d7ad04d4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Tue, 13 Oct 2015 13:40:56 +0100
|
||||||
|
Subject: [PATCH 6/7] rpm: Flush debugging messages in C code.
|
||||||
|
|
||||||
|
Because C and OCaml use different implementations of stdio, and
|
||||||
|
because C stdout is not line-buffered, we can get mixed up debugging
|
||||||
|
messages.
|
||||||
|
|
||||||
|
Partially fix this by using fflush (stdout) after printing C debugging
|
||||||
|
messages (this doesn't completely fix it because we'd have to do the
|
||||||
|
same in OCaml code too).
|
||||||
|
|
||||||
|
This slows down debugging output, but it's only used when debugging so
|
||||||
|
we don't care about that.
|
||||||
|
---
|
||||||
|
src/librpm-c.c | 28 ++++++++++++++++++++--------
|
||||||
|
1 file changed, 20 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/librpm-c.c b/src/librpm-c.c
|
||||||
|
index fc847d6..3bd25a2 100644
|
||||||
|
--- a/src/librpm-c.c
|
||||||
|
+++ b/src/librpm-c.c
|
||||||
|
@@ -202,8 +202,11 @@ supermin_rpm_installed (value rpmv, value pkgv)
|
||||||
|
caml_raise_not_found ();
|
||||||
|
|
||||||
|
count = rpmdbGetIteratorCount (iter);
|
||||||
|
- if (data.debug >= 2)
|
||||||
|
- printf ("supermin: rpm: installed: %d occurrences for '%s'\n", count, String_val (pkgv));
|
||||||
|
+ if (data.debug >= 2) {
|
||||||
|
+ printf ("supermin: rpm: installed: %d occurrences for '%s'\n",
|
||||||
|
+ count, String_val (pkgv));
|
||||||
|
+ fflush (stdout);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
rv = caml_alloc (count, 0);
|
||||||
|
i = 0;
|
||||||
|
@@ -287,8 +290,11 @@ supermin_rpm_pkg_requires (value rpmv, value pkgv)
|
||||||
|
caml_raise_not_found ();
|
||||||
|
|
||||||
|
count = rpmdbGetIteratorCount (iter);
|
||||||
|
- if (data.debug >= 2)
|
||||||
|
- printf ("supermin: rpm: pkg_requires: %d occurrences for '%s'\n", count, String_val (pkgv));
|
||||||
|
+ if (data.debug >= 2) {
|
||||||
|
+ printf ("supermin: rpm: pkg_requires: %d occurrences for '%s'\n",
|
||||||
|
+ count, String_val (pkgv));
|
||||||
|
+ fflush (stdout);
|
||||||
|
+ }
|
||||||
|
if (count != 1)
|
||||||
|
librpm_raise_multiple_matches (count);
|
||||||
|
|
||||||
|
@@ -351,8 +357,11 @@ supermin_rpm_pkg_whatprovides (value rpmv, value pkgv)
|
||||||
|
caml_raise_not_found ();
|
||||||
|
|
||||||
|
count = rpmdbGetIteratorCount (iter);
|
||||||
|
- if (data.debug >= 2)
|
||||||
|
- printf ("supermin: rpm: pkg_whatprovides: %d occurrences for '%s'\n", count, String_val (pkgv));
|
||||||
|
+ if (data.debug >= 2) {
|
||||||
|
+ printf ("supermin: rpm: pkg_whatprovides: %d occurrences for '%s'\n",
|
||||||
|
+ count, String_val (pkgv));
|
||||||
|
+ fflush (stdout);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
rv = caml_alloc (count, 0);
|
||||||
|
i = 0;
|
||||||
|
@@ -398,8 +407,11 @@ supermin_rpm_pkg_filelist (value rpmv, value pkgv)
|
||||||
|
caml_raise_not_found ();
|
||||||
|
|
||||||
|
count = rpmdbGetIteratorCount (iter);
|
||||||
|
- if (data.debug >= 2)
|
||||||
|
- printf ("supermin: rpm: pkg_filelist: %d occurrences for '%s'\n", count, String_val (pkgv));
|
||||||
|
+ if (data.debug >= 2) {
|
||||||
|
+ printf ("supermin: rpm: pkg_filelist: %d occurrences for '%s'\n",
|
||||||
|
+ count, String_val (pkgv));
|
||||||
|
+ fflush (stdout);
|
||||||
|
+ }
|
||||||
|
if (count != 1)
|
||||||
|
librpm_raise_multiple_matches (count);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
123
0007-rpm-Choose-providers-better-RHBZ-1266918.patch
Normal file
123
0007-rpm-Choose-providers-better-RHBZ-1266918.patch
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
From 17b724b5d345f5e9d622bcadf27c57baa102bbba Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Tue, 13 Oct 2015 13:42:57 +0100
|
||||||
|
Subject: [PATCH 7/7] rpm: Choose providers better (RHBZ#1266918).
|
||||||
|
|
||||||
|
In the referenced bug, a customer had installed a web browser called
|
||||||
|
'palemoon'. The RPM of this web browser provides and requires various
|
||||||
|
core libraries, such as:
|
||||||
|
|
||||||
|
Provides: libnss3.so()(64bit) # normally provided by 'nss'
|
||||||
|
Requires: libxul.so()(64bit) # normally provided by 'firefox'
|
||||||
|
|
||||||
|
Our previous algorithm -- inherited from the days when we used to run
|
||||||
|
'rpm' commands -- takes every provider of a particular requirement and
|
||||||
|
adds it to a big list, so if any other package requires
|
||||||
|
'libnss3.so()(64bit)', then both 'nss' and 'palemoon' are added to the
|
||||||
|
package list.
|
||||||
|
|
||||||
|
Yum used to handle this differently - it used to only pick the package
|
||||||
|
with the shortest name. Later on, before yum was retired, it had a
|
||||||
|
more complex decision algorithm described here:
|
||||||
|
http://yum.baseurl.org/wiki/CompareProviders
|
||||||
|
|
||||||
|
This change makes supermin use the shortest name algorithm, so in the
|
||||||
|
case above, it always picks 'nss' over 'palemoon'.
|
||||||
|
|
||||||
|
There is a second possible problem which is not fixed by the current
|
||||||
|
patch set: If a package both provides and requires the same
|
||||||
|
dependency, we should ignore that dependency. For example, 'palemoon'
|
||||||
|
both Provides and Requires 'libxul.so()(64bit)', so if 'palemoon' is
|
||||||
|
pulled in, then 'firefox' would not be an additional requirement.
|
||||||
|
Because we store all the packages in a big list, we lose track of
|
||||||
|
where a dependency originates from, so it is not easy to implement
|
||||||
|
this second change.
|
||||||
|
---
|
||||||
|
src/rpm.ml | 64 ++++++++++++++++++++++++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 48 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/rpm.ml b/src/rpm.ml
|
||||||
|
index 4d31472..1db47b6 100644
|
||||||
|
--- a/src/rpm.ml
|
||||||
|
+++ b/src/rpm.ml
|
||||||
|
@@ -210,8 +210,51 @@ let rpm_package_name pkg =
|
||||||
|
let rpm_get_package_database_mtime () =
|
||||||
|
(lstat "/var/lib/rpm/Packages").st_mtime
|
||||||
|
|
||||||
|
-(* Memo of resolved provides. *)
|
||||||
|
-let rpm_providers = Hashtbl.create 13
|
||||||
|
+(* Return the best provider of a particular RPM requirement.
|
||||||
|
+ *
|
||||||
|
+ * There may be multiple, or no providers. In case there are multiple,
|
||||||
|
+ * choose the one with the shortest name (as yum used to).
|
||||||
|
+ *
|
||||||
|
+ * We could do better here: http://yum.baseurl.org/wiki/CompareProviders
|
||||||
|
+ *)
|
||||||
|
+let provider =
|
||||||
|
+ (* Memo of resolved provides. *)
|
||||||
|
+ let rpm_providers = Hashtbl.create 13 in
|
||||||
|
+ fun req ->
|
||||||
|
+ try Hashtbl.find rpm_providers req
|
||||||
|
+ with Not_found ->
|
||||||
|
+ let ret =
|
||||||
|
+ try
|
||||||
|
+ (* 'providers' here is an array of just package names. *)
|
||||||
|
+ let providers = rpm_pkg_whatprovides (get_rpm ()) req in
|
||||||
|
+ let providers = Array.to_list providers in
|
||||||
|
+ (* --whatprovides will return duplicate identical packages, so: *)
|
||||||
|
+ let providers = sort_uniq providers in
|
||||||
|
+ (* Only packages which are actually installed: *)
|
||||||
|
+ let providers =
|
||||||
|
+ List.filter (fun name -> rpm_package_of_string name <> None)
|
||||||
|
+ providers in
|
||||||
|
+
|
||||||
|
+ match providers with
|
||||||
|
+ | [] -> None
|
||||||
|
+ | [name] ->
|
||||||
|
+ Some name
|
||||||
|
+ | names ->
|
||||||
|
+ if !settings.debug >= 2 then
|
||||||
|
+ printf "supermin: rpm: multiple providers: requirement %s: providers: %s\n"
|
||||||
|
+ req (String.concat " " names);
|
||||||
|
+ let cmp name1 name2 =
|
||||||
|
+ let len1 = String.length name1 and len2 = String.length name2 in
|
||||||
|
+ if len1 <> len2 then compare len1 len2
|
||||||
|
+ else compare name1 name2 in
|
||||||
|
+ let names = List.sort cmp names in
|
||||||
|
+ let best_name = List.hd names in
|
||||||
|
+ if !settings.debug >= 2 then
|
||||||
|
+ printf "supermin: rpm: multiple providers: picked %s\n" best_name;
|
||||||
|
+ Some best_name
|
||||||
|
+ with Not_found -> None in
|
||||||
|
+ Hashtbl.add rpm_providers req ret;
|
||||||
|
+ ret
|
||||||
|
|
||||||
|
let rpm_get_all_requires pkgs =
|
||||||
|
let get pkg =
|
||||||
|
@@ -226,20 +269,9 @@ let rpm_get_all_requires pkgs =
|
||||||
|
rpm_pkg_requires (get_rpm ()) (rpm_package_to_string pkg) in
|
||||||
|
let pkgs' = Array.fold_left (
|
||||||
|
fun set x ->
|
||||||
|
- try
|
||||||
|
- let provides =
|
||||||
|
- try Hashtbl.find rpm_providers x
|
||||||
|
- with Not_found ->
|
||||||
|
- let p = rpm_pkg_whatprovides (get_rpm ()) x in
|
||||||
|
- Hashtbl.add rpm_providers x p;
|
||||||
|
- p in
|
||||||
|
- Array.fold_left (
|
||||||
|
- fun newset p ->
|
||||||
|
- match rpm_package_of_string p with
|
||||||
|
- | None -> newset
|
||||||
|
- | Some x -> StringSet.add p newset
|
||||||
|
- ) set provides
|
||||||
|
- with Not_found -> set
|
||||||
|
+ match provider x with
|
||||||
|
+ | None -> set
|
||||||
|
+ | Some p -> StringSet.add p set
|
||||||
|
) StringSet.empty reqs in
|
||||||
|
pkgs'
|
||||||
|
in
|
||||||
|
--
|
||||||
|
2.5.0
|
||||||
|
|
@ -6,7 +6,7 @@
|
|||||||
Summary: Tool for creating supermin appliances
|
Summary: Tool for creating supermin appliances
|
||||||
Name: supermin
|
Name: supermin
|
||||||
Version: 5.1.13
|
Version: 5.1.13
|
||||||
Release: 3%{?dist}
|
Release: 4%{?dist}
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
|
|
||||||
%if 0%{?rhel} >= 7
|
%if 0%{?rhel} >= 7
|
||||||
@ -16,6 +16,15 @@ ExclusiveArch: x86_64
|
|||||||
URL: http://people.redhat.com/~rjones/supermin/
|
URL: http://people.redhat.com/~rjones/supermin/
|
||||||
Source0: http://libguestfs.org/download/supermin/%{name}-%{version}.tar.gz
|
Source0: http://libguestfs.org/download/supermin/%{name}-%{version}.tar.gz
|
||||||
|
|
||||||
|
# All upstream patches since 5.1.13.
|
||||||
|
Patch0001: 0001-utils-import-parse_size-from-libguestfs.patch
|
||||||
|
Patch0002: 0002-Add-size-for-ext2-filesystem.patch
|
||||||
|
Patch0003: 0003-docs-Use-F-for-filenames-instead-of-C.patch
|
||||||
|
Patch0004: 0004-rpm-rpm_is_available-function-can-be-noalloc.patch
|
||||||
|
Patch0005: 0005-rpm-Add-some-documentation-to-librpm.mli.patch
|
||||||
|
Patch0006: 0006-rpm-Flush-debugging-messages-in-C-code.patch
|
||||||
|
Patch0007: 0007-rpm-Choose-providers-better-RHBZ-1266918.patch
|
||||||
|
|
||||||
BuildRequires: /usr/bin/pod2man
|
BuildRequires: /usr/bin/pod2man
|
||||||
BuildRequires: rpm
|
BuildRequires: rpm
|
||||||
BuildRequires: rpm-devel
|
BuildRequires: rpm-devel
|
||||||
@ -85,6 +94,7 @@ from supermin appliances.
|
|||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
%autopatch -p1
|
||||||
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -128,6 +138,11 @@ make check || {
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Oct 13 2015 Richard W.M. Jones <rjones@redhat.com> - 5.1.13-4
|
||||||
|
- Pull in all upstream patches since 5.1.13.
|
||||||
|
- Choose providers better (RHBZ#1266918).
|
||||||
|
- Use autopatch.
|
||||||
|
|
||||||
* Mon Jul 27 2015 Richard W.M. Jones <rjones@redhat.com> - 5.1.13-3
|
* Mon Jul 27 2015 Richard W.M. Jones <rjones@redhat.com> - 5.1.13-3
|
||||||
- Bump version to rebuild against new RPM in Rawhide.
|
- Bump version to rebuild against new RPM in Rawhide.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user