mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	Commitdb2aa7fd15("initramfs: allow again choice of the embedded initram compression algorithm") introduced the possibility to select the initramfs compression algorithm from Kconfig and while this is a nice feature it broke the use case described below. Here is what my build system does: - kernel is initially configured not to have an initramfs included - build the user space root file system - re-configure the kernel to have an initramfs included (CONFIG_INITRAMFS_SOURCE="/path/to/romfs") and set relevant CONFIG_INITRAMFS options, in my case, no compression option (CONFIG_INITRAMFS_COMPRESSION_NONE) - kernel is re-built with these options -> kernel+initramfs image is copied - kernel is re-built again without these options -> kernel image is copied Building a kernel without an initramfs means setting this option: CONFIG_INITRAMFS_SOURCE="" (and this one only) whereas building a kernel with an initramfs means setting these options: CONFIG_INITRAMFS_SOURCE="/home/fainelli/work/uclinux-rootfs/romfs /home/fainelli/work/uclinux-rootfs/misc/initramfs.dev" CONFIG_INITRAMFS_ROOT_UID=1000 CONFIG_INITRAMFS_ROOT_GID=1000 CONFIG_INITRAMFS_COMPRESSION_NONE=y CONFIG_INITRAMFS_COMPRESSION="" Commitdb2aa7fd15("initramfs: allow again choice of the embedded initram compression algorithm") is problematic because CONFIG_INITRAMFS_COMPRESSION which is used to determine the initramfs_data.cpio extension/compression is a string, and due to how Kconfig works it will evaluate in order, how to assign it. Setting CONFIG_INITRAMFS_COMPRESSION_NONE with CONFIG_INITRAMFS_SOURCE="" cannot possibly work (because of the depends on INITRAMFS_SOURCE!="" imposed on CONFIG_INITRAMFS_COMPRESSION ) yet we still get CONFIG_INITRAMFS_COMPRESSION assigned to ".gz" because CONFIG_RD_GZIP=y is set in my kernel, even when there is no initramfs being built. So we basically end-up generating two initramfs_data.cpio* files, one without extension, and one with .gz. This causes usr/Makefile to track usr/initramfs_data.cpio.gz, and not usr/initramfs_data.cpio anymore, that is also largely problematic after9e3596b0c6("kbuild: initramfs cleanup, set target from Kconfig") because we used to track all possible initramfs_data files in the $(targets) variable before that commit. The end result is that the kernel with an initramfs clearly does not contain what we expect it to, it has a stale initramfs_data.cpio file built into it, and we keep re-generating an initramfs_data.cpio.gz file which is not the one that we want to include in the kernel image proper. The fix consists in hiding CONFIG_INITRAMFS_COMPRESSION when CONFIG_INITRAMFS_SOURCE="". This puts us back in a state to the pre-4.10 behavior where we can properly disable and re-enable initramfs within the same kernel .config file, and be in control of what CONFIG_INITRAMFS_COMPRESSION is set to. Fixes:db2aa7fd15("initramfs: allow again choice of the embedded initram compression algorithm") Fixes:9e3596b0c6("kbuild: initramfs cleanup, set target from Kconfig") Link: http://lkml.kernel.org/r/20170521033337.6197-1-f.fainelli@gmail.com Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Acked-by: Nicholas Piggin <npiggin@gmail.com> Cc: P J P <ppandit@redhat.com> Cc: Paul Bolle <pebolle@tiscali.nl> Cc: Michal Marek <mmarek@suse.cz> Cc: Daniel Thompson <daniel.thompson@linaro.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			238 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			238 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#
 | 
						|
# Configuration for initramfs
 | 
						|
#
 | 
						|
 | 
						|
config INITRAMFS_SOURCE
 | 
						|
	string "Initramfs source file(s)"
 | 
						|
	default ""
 | 
						|
	help
 | 
						|
	  This can be either a single cpio archive with a .cpio suffix or a
 | 
						|
	  space-separated list of directories and files for building the
 | 
						|
	  initramfs image.  A cpio archive should contain a filesystem archive
 | 
						|
	  to be used as an initramfs image.  Directories should contain a
 | 
						|
	  filesystem layout to be included in the initramfs image.  Files
 | 
						|
	  should contain entries according to the format described by the
 | 
						|
	  "usr/gen_init_cpio" program in the kernel tree.
 | 
						|
 | 
						|
	  When multiple directories and files are specified then the
 | 
						|
	  initramfs image will be the aggregate of all of them.
 | 
						|
 | 
						|
	  See <file:Documentation/early-userspace/README> for more details.
 | 
						|
 | 
						|
	  If you are not sure, leave it blank.
 | 
						|
 | 
						|
config INITRAMFS_FORCE
 | 
						|
	bool "Ignore the initramfs passed by the bootloader"
 | 
						|
	depends on CMDLINE_EXTEND || CMDLINE_FORCE
 | 
						|
	help
 | 
						|
	  This option causes the kernel to ignore the initramfs image
 | 
						|
	  (or initrd image) passed to it by the bootloader. This is
 | 
						|
	  analogous to CMDLINE_FORCE, which is found on some architectures,
 | 
						|
	  and is useful if you cannot or don't want to change the image
 | 
						|
	  your bootloader passes to the kernel.
 | 
						|
 | 
						|
config INITRAMFS_ROOT_UID
 | 
						|
	int "User ID to map to 0 (user root)"
 | 
						|
	depends on INITRAMFS_SOURCE!=""
 | 
						|
	default "0"
 | 
						|
	help
 | 
						|
	  This setting is only meaningful if the INITRAMFS_SOURCE is
 | 
						|
	  contains a directory.  Setting this user ID (UID) to something
 | 
						|
	  other than "0" will cause all files owned by that UID to be
 | 
						|
	  owned by user root in the initial ramdisk image.
 | 
						|
 | 
						|
	  If you are not sure, leave it set to "0".
 | 
						|
 | 
						|
config INITRAMFS_ROOT_GID
 | 
						|
	int "Group ID to map to 0 (group root)"
 | 
						|
	depends on INITRAMFS_SOURCE!=""
 | 
						|
	default "0"
 | 
						|
	help
 | 
						|
	  This setting is only meaningful if the INITRAMFS_SOURCE is
 | 
						|
	  contains a directory.  Setting this group ID (GID) to something
 | 
						|
	  other than "0" will cause all files owned by that GID to be
 | 
						|
	  owned by group root in the initial ramdisk image.
 | 
						|
 | 
						|
	  If you are not sure, leave it set to "0".
 | 
						|
 | 
						|
config RD_GZIP
 | 
						|
	bool "Support initial ramdisks compressed using gzip"
 | 
						|
	depends on BLK_DEV_INITRD
 | 
						|
	default y
 | 
						|
	select DECOMPRESS_GZIP
 | 
						|
	help
 | 
						|
	  Support loading of a gzip encoded initial ramdisk or cpio buffer.
 | 
						|
	  If unsure, say Y.
 | 
						|
 | 
						|
config RD_BZIP2
 | 
						|
	bool "Support initial ramdisks compressed using bzip2"
 | 
						|
	default y
 | 
						|
	depends on BLK_DEV_INITRD
 | 
						|
	select DECOMPRESS_BZIP2
 | 
						|
	help
 | 
						|
	  Support loading of a bzip2 encoded initial ramdisk or cpio buffer
 | 
						|
	  If unsure, say N.
 | 
						|
 | 
						|
config RD_LZMA
 | 
						|
	bool "Support initial ramdisks compressed using LZMA"
 | 
						|
	default y
 | 
						|
	depends on BLK_DEV_INITRD
 | 
						|
	select DECOMPRESS_LZMA
 | 
						|
	help
 | 
						|
	  Support loading of a LZMA encoded initial ramdisk or cpio buffer
 | 
						|
	  If unsure, say N.
 | 
						|
 | 
						|
config RD_XZ
 | 
						|
	bool "Support initial ramdisks compressed using XZ"
 | 
						|
	depends on BLK_DEV_INITRD
 | 
						|
	default y
 | 
						|
	select DECOMPRESS_XZ
 | 
						|
	help
 | 
						|
	  Support loading of a XZ encoded initial ramdisk or cpio buffer.
 | 
						|
	  If unsure, say N.
 | 
						|
 | 
						|
config RD_LZO
 | 
						|
	bool "Support initial ramdisks compressed using LZO"
 | 
						|
	default y
 | 
						|
	depends on BLK_DEV_INITRD
 | 
						|
	select DECOMPRESS_LZO
 | 
						|
	help
 | 
						|
	  Support loading of a LZO encoded initial ramdisk or cpio buffer
 | 
						|
	  If unsure, say N.
 | 
						|
 | 
						|
config RD_LZ4
 | 
						|
	bool "Support initial ramdisks compressed using LZ4"
 | 
						|
	default y
 | 
						|
	depends on BLK_DEV_INITRD
 | 
						|
	select DECOMPRESS_LZ4
 | 
						|
	help
 | 
						|
	  Support loading of a LZ4 encoded initial ramdisk or cpio buffer
 | 
						|
	  If unsure, say N.
 | 
						|
 | 
						|
choice
 | 
						|
	prompt "Built-in initramfs compression mode"
 | 
						|
	depends on INITRAMFS_SOURCE!=""
 | 
						|
	optional
 | 
						|
	help
 | 
						|
	  This option allows you to decide by which algorithm the builtin
 | 
						|
	  initramfs will be compressed.  Several compression algorithms are
 | 
						|
	  available, which differ in efficiency, compression and
 | 
						|
	  decompression speed.  Compression speed is only relevant
 | 
						|
	  when building a kernel.  Decompression speed is relevant at
 | 
						|
	  each boot. Also the memory usage during decompression may become
 | 
						|
	  relevant on memory constrained systems. This is usually based on the
 | 
						|
	  dictionary size of the algorithm with algorithms like XZ and LZMA
 | 
						|
	  featuring large dictionary sizes.
 | 
						|
 | 
						|
	  High compression options are mostly useful for users who are
 | 
						|
	  low on RAM, since it reduces the memory consumption during
 | 
						|
	  boot.
 | 
						|
 | 
						|
	  Keep in mind that your build system needs to provide the appropriate
 | 
						|
	  compression tool to compress the generated initram cpio file for
 | 
						|
	  embedding.
 | 
						|
 | 
						|
	  If in doubt, select 'None'
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_NONE
 | 
						|
	bool "None"
 | 
						|
	help
 | 
						|
	  Do not compress the built-in initramfs at all. This may sound wasteful
 | 
						|
	  in space, but, you should be aware that the built-in initramfs will be
 | 
						|
	  compressed at a later stage anyways along with the rest of the kernel,
 | 
						|
	  on those architectures that support this. However, not compressing the
 | 
						|
	  initramfs may lead to slightly higher memory consumption during a
 | 
						|
	  short time at boot, while both the cpio image and the unpacked
 | 
						|
	  filesystem image will be present in memory simultaneously
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_GZIP
 | 
						|
	bool "Gzip"
 | 
						|
	depends on RD_GZIP
 | 
						|
	help
 | 
						|
	  Use the old and well tested gzip compression algorithm. Gzip provides
 | 
						|
	  a good balance between compression ratio and decompression speed and
 | 
						|
	  has a reasonable compression speed. It is also more likely to be
 | 
						|
	  supported by your build system as the gzip tool is present by default
 | 
						|
	  on most distros.
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_BZIP2
 | 
						|
	bool "Bzip2"
 | 
						|
	depends on RD_BZIP2
 | 
						|
	help
 | 
						|
	  It's compression ratio and speed is intermediate. Decompression speed
 | 
						|
	  is slowest among the choices. The initramfs size is about 10% smaller
 | 
						|
	  with bzip2, in comparison to gzip. Bzip2 uses a large amount of
 | 
						|
	  memory. For modern kernels you will need at least 8MB RAM or more for
 | 
						|
	  booting.
 | 
						|
 | 
						|
	  If you choose this, keep in mind that you need to have the bzip2 tool
 | 
						|
	  available to be able to compress the initram.
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_LZMA
 | 
						|
	bool "LZMA"
 | 
						|
	depends on RD_LZMA
 | 
						|
	help
 | 
						|
	  This algorithm's compression ratio is best but has a large dictionary
 | 
						|
	  size which might cause issues in memory constrained systems.
 | 
						|
	  Decompression speed is between the other choices. Compression is
 | 
						|
	  slowest. The initramfs size is about 33% smaller with LZMA in
 | 
						|
	  comparison to gzip.
 | 
						|
 | 
						|
	  If you choose this, keep in mind that you may need to install the xz
 | 
						|
	  or lzma tools to be able to compress the initram.
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_XZ
 | 
						|
	bool "XZ"
 | 
						|
	depends on RD_XZ
 | 
						|
	help
 | 
						|
	  XZ uses the LZMA2 algorithm and has a large dictionary which may cause
 | 
						|
	  problems on memory constrained systems. The initramfs size is about
 | 
						|
	  30% smaller with XZ in comparison to gzip. Decompression speed is
 | 
						|
	  better than that of bzip2 but worse than gzip and LZO. Compression is
 | 
						|
	  slow.
 | 
						|
 | 
						|
	  If you choose this, keep in mind that you may need to install the xz
 | 
						|
	  tool to be able to compress the initram.
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_LZO
 | 
						|
	bool "LZO"
 | 
						|
	depends on RD_LZO
 | 
						|
	help
 | 
						|
	  It's compression ratio is the second poorest amongst the choices. The
 | 
						|
	  kernel size is about 10% bigger than gzip. Despite that, it's
 | 
						|
	  decompression speed is the second fastest and it's compression speed
 | 
						|
	  is quite fast too.
 | 
						|
 | 
						|
	  If you choose this, keep in mind that you may need to install the lzop
 | 
						|
	  tool to be able to compress the initram.
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION_LZ4
 | 
						|
	bool "LZ4"
 | 
						|
	depends on RD_LZ4
 | 
						|
	help
 | 
						|
	  It's compression ratio is the poorest amongst the choices. The kernel
 | 
						|
	  size is about 15% bigger than gzip; however its decompression speed
 | 
						|
	  is the fastest.
 | 
						|
 | 
						|
	  If you choose this, keep in mind that most distros don't provide lz4
 | 
						|
	  by default which could cause a build failure.
 | 
						|
 | 
						|
endchoice
 | 
						|
 | 
						|
config INITRAMFS_COMPRESSION
 | 
						|
	depends on INITRAMFS_SOURCE!=""
 | 
						|
	string
 | 
						|
	default ""      if INITRAMFS_COMPRESSION_NONE
 | 
						|
	default ".gz"   if INITRAMFS_COMPRESSION_GZIP
 | 
						|
	default ".bz2"  if INITRAMFS_COMPRESSION_BZIP2
 | 
						|
	default ".lzma" if INITRAMFS_COMPRESSION_LZMA
 | 
						|
	default ".xz"   if INITRAMFS_COMPRESSION_XZ
 | 
						|
	default ".lzo"  if INITRAMFS_COMPRESSION_LZO
 | 
						|
	default ".lz4"  if INITRAMFS_COMPRESSION_LZ4
 | 
						|
	default ".gz"   if RD_GZIP
 | 
						|
	default ".lz4"  if RD_LZ4
 | 
						|
	default ".lzo"  if RD_LZO
 | 
						|
	default ".xz"   if RD_XZ
 | 
						|
	default ".lzma" if RD_LZMA
 | 
						|
	default ".bz2"  if RD_BZIP2
 | 
						|
	default ""
 |