diff options
Diffstat (limited to 'usr')
| -rw-r--r-- | usr/Kconfig | 96 | ||||
| -rw-r--r-- | usr/Makefile | 24 | ||||
| -rw-r--r-- | usr/gen_init_cpio.c | 108 | ||||
| -rw-r--r-- | usr/initramfs_data.S | 5 | 
4 files changed, 110 insertions, 123 deletions
diff --git a/usr/Kconfig b/usr/Kconfig index c2c7fe2f717..2d4c77eecf2 100644 --- a/usr/Kconfig +++ b/usr/Kconfig @@ -46,7 +46,7 @@ config INITRAMFS_ROOT_GID  	  If you are not sure, leave it set to "0".  config RD_GZIP -	bool "Support initial ramdisks compressed using gzip" if EMBEDDED +	bool "Support initial ramdisks compressed using gzip" if EXPERT  	default y  	depends on BLK_DEV_INITRD  	select DECOMPRESS_GZIP @@ -55,8 +55,8 @@ config RD_GZIP  	  If unsure, say Y.  config RD_BZIP2 -	bool "Support initial ramdisks compressed using bzip2" if EMBEDDED -	default !EMBEDDED +	bool "Support initial ramdisks compressed using bzip2" if EXPERT +	default !EXPERT  	depends on BLK_DEV_INITRD  	select DECOMPRESS_BZIP2  	help @@ -64,87 +64,37 @@ config RD_BZIP2  	  If unsure, say N.  config RD_LZMA -	bool "Support initial ramdisks compressed using LZMA" if EMBEDDED -	default !EMBEDDED +	bool "Support initial ramdisks compressed using LZMA" if EXPERT +	default !EXPERT  	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" if EXPERT +	default !EXPERT +	depends on BLK_DEV_INITRD +	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" if EMBEDDED -	default !EMBEDDED +	bool "Support initial ramdisks compressed using LZO" if EXPERT +	default !EXPERT  	depends on BLK_DEV_INITRD  	select DECOMPRESS_LZO  	help  	  Support loading of a LZO encoded initial ramdisk or cpio buffer  	  If unsure, say N. -choice -	prompt "Built-in initramfs compression mode" if INITRAMFS_SOURCE!="" -	help -	  This option decides 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. - -	  If you have any problems with bzip2 or LZMA compressed -	  initramfs, mail me (Alain Knaff) <alain@knaff.lu>. - -	  High compression options are mostly useful for users who are -	  low on RAM, since it reduces the memory consumption during -	  boot. - -	  If in doubt, select 'gzip' - -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 -	  The old and tried gzip compression. It provides a good balance -	  between compression ratio and decompression speed. - -config INITRAMFS_COMPRESSION_BZIP2 -	bool "Bzip2" -	depends on RD_BZIP2 -	help -	  Its compression ratio and speed is intermediate. -	  Decompression speed is slowest among the four.  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. - -config INITRAMFS_COMPRESSION_LZMA -	bool "LZMA" -	depends on RD_LZMA -	help -	  The most recent compression algorithm. -	  Its ratio is best, decompression speed is between the other -	  three. Compression is slowest. The initramfs size is about 33% -	  smaller with LZMA in comparison to gzip. - -config INITRAMFS_COMPRESSION_LZO -	bool "LZO" -	depends on RD_LZO +config RD_LZ4 +	bool "Support initial ramdisks compressed using LZ4" if EXPERT +	default !EXPERT +	depends on BLK_DEV_INITRD +	select DECOMPRESS_LZ4  	help -	  Its compression ratio is the poorest among the four. The kernel -	  size is about 10% bigger than gzip; however its speed -	  (both compression and decompression) is the fastest. - -endchoice +	  Support loading of a LZ4 encoded initial ramdisk or cpio buffer +	  If unsure, say N. diff --git a/usr/Makefile b/usr/Makefile index 6faa444b708..e767f019acc 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -6,17 +6,23 @@ klibcdirs:;  PHONY += klibcdirs -# Gzip -suffix_$(CONFIG_INITRAMFS_COMPRESSION_GZIP)   = .gz -  # Bzip2 -suffix_$(CONFIG_INITRAMFS_COMPRESSION_BZIP2)  = .bz2 +suffix_$(CONFIG_RD_BZIP2)  = .bz2  # Lzma -suffix_$(CONFIG_INITRAMFS_COMPRESSION_LZMA)   = .lzma +suffix_$(CONFIG_RD_LZMA)   = .lzma + +# XZ +suffix_$(CONFIG_RD_XZ)     = .xz  # Lzo -suffix_$(CONFIG_INITRAMFS_COMPRESSION_LZO)   = .lzo +suffix_$(CONFIG_RD_LZO)    = .lzo + +# Lz4 +suffix_$(CONFIG_RD_LZ4)    = .lz4 + +# Gzip +suffix_$(CONFIG_RD_GZIP)   = .gz  AFLAGS_initramfs_data.o += -DINITRAMFS_IMAGE="usr/initramfs_data.cpio$(suffix_y)" @@ -50,7 +56,10 @@ endif  quiet_cmd_initfs = GEN     $@        cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input) -targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio.lzo initramfs_data.cpio +targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 \ +	initramfs_data.cpio.lzma initramfs_data.cpio.xz \ +	initramfs_data.cpio.lzo initramfs_data.cpio.lz4 \ +	initramfs_data.cpio  # do not try to update files included in initramfs  $(deps_initramfs): ; @@ -63,4 +72,3 @@ $(deps_initramfs): klibcdirs  $(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs  	$(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.d  	$(call if_changed,initfs) - diff --git a/usr/gen_init_cpio.c b/usr/gen_init_cpio.c index b2b3c2d1cf8..225ad244cf8 100644 --- a/usr/gen_init_cpio.c +++ b/usr/gen_init_cpio.c @@ -22,6 +22,7 @@  static unsigned int offset;  static unsigned int ino = 721; +static time_t default_mtime;  struct file_handler {  	const char *type; @@ -102,8 +103,9 @@ static int cpio_mkslink(const char *name, const char *target,  			 unsigned int mode, uid_t uid, gid_t gid)  {  	char s[256]; -	time_t mtime = time(NULL); +	if (name[0] == '/') +		name++;  	sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"  	       "%08X%08X%08X%08X%08X%08X%08X",  		"070701",		/* magic */ @@ -112,7 +114,7 @@ static int cpio_mkslink(const char *name, const char *target,  		(long) uid,		/* uid */  		(long) gid,		/* gid */  		1,			/* nlink */ -		(long) mtime,		/* mtime */ +		(long) default_mtime,	/* mtime */  		(unsigned)strlen(target)+1, /* filesize */  		3,			/* major */  		1,			/* minor */ @@ -150,8 +152,9 @@ static int cpio_mkgeneric(const char *name, unsigned int mode,  		       uid_t uid, gid_t gid)  {  	char s[256]; -	time_t mtime = time(NULL); +	if (name[0] == '/') +		name++;  	sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"  	       "%08X%08X%08X%08X%08X%08X%08X",  		"070701",		/* magic */ @@ -160,7 +163,7 @@ static int cpio_mkgeneric(const char *name, unsigned int mode,  		(long) uid,		/* uid */  		(long) gid,		/* gid */  		2,			/* nlink */ -		(long) mtime,		/* mtime */ +		(long) default_mtime,	/* mtime */  		0,			/* filesize */  		3,			/* major */  		1,			/* minor */ @@ -238,13 +241,14 @@ static int cpio_mknod(const char *name, unsigned int mode,  		       unsigned int maj, unsigned int min)  {  	char s[256]; -	time_t mtime = time(NULL);  	if (dev_type == 'b')  		mode |= S_IFBLK;  	else  		mode |= S_IFCHR; +	if (name[0] == '/') +		name++;  	sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"  	       "%08X%08X%08X%08X%08X%08X%08X",  		"070701",		/* magic */ @@ -253,7 +257,7 @@ static int cpio_mknod(const char *name, unsigned int mode,  		(long) uid,		/* uid */  		(long) gid,		/* gid */  		1,			/* nlink */ -		(long) mtime,		/* mtime */ +		(long) default_mtime,	/* mtime */  		0,			/* filesize */  		3,			/* major */  		1,			/* minor */ @@ -299,22 +303,22 @@ static int cpio_mkfile(const char *name, const char *location,  	int retval;  	int rc = -1;  	int namesize; -	int i; +	unsigned int i;  	mode |= S_IFREG; -	retval = stat (location, &buf); -	if (retval) { -		fprintf (stderr, "File %s could not be located\n", location); -		goto error; -	} -  	file = open (location, O_RDONLY);  	if (file < 0) {  		fprintf (stderr, "File %s could not be opened for reading\n", location);  		goto error;  	} +	retval = fstat(file, &buf); +	if (retval) { +		fprintf(stderr, "File %s could not be stat()'ed\n", location); +		goto error; +	} +  	filebuf = malloc(buf.st_size);  	if (!filebuf) {  		fprintf (stderr, "out of memory\n"); @@ -332,6 +336,8 @@ static int cpio_mkfile(const char *name, const char *location,  		/* data goes on last link */  		if (i == nlinks) size = buf.st_size; +		if (name[0] == '/') +			name++;  		namesize = strlen(name) + 1;  		sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"  		       "%08lX%08X%08X%08X%08X%08X%08X", @@ -375,27 +381,20 @@ error:  static char *cpio_replace_env(char *new_location)  { -       char expanded[PATH_MAX + 1]; -       char env_var[PATH_MAX + 1]; -       char *start; -       char *end; - -       for (start = NULL; (start = strstr(new_location, "${")); ) { -               end = strchr(start, '}'); -               if (start < end) { -                       *env_var = *expanded = '\0'; -                       strncat(env_var, start + 2, end - start - 2); -                       strncat(expanded, new_location, start - new_location); -                       strncat(expanded, getenv(env_var), PATH_MAX); -                       strncat(expanded, end + 1, PATH_MAX); -                       strncpy(new_location, expanded, PATH_MAX); -               } else -                       break; -       } - -       return new_location; -} +	char expanded[PATH_MAX + 1]; +	char *start, *end, *var; + +	while ((start = strstr(new_location, "${")) && +	       (end = strchr(start + 2, '}'))) { +		*start = *end = 0; +		var = getenv(start + 2); +		snprintf(expanded, sizeof expanded, "%s%s%s", +			 new_location, var ? var : "", end + 1); +		strcpy(new_location, expanded); +	} +	return new_location; +}  static int cpio_mkfile_line(const char *line)  { @@ -452,7 +451,7 @@ static int cpio_mkfile_line(const char *line)  static void usage(const char *prog)  {  	fprintf(stderr, "Usage:\n" -		"\t%s <cpio_list>\n" +		"\t%s [-t <timestamp>] <cpio_list>\n"  		"\n"  		"<cpio_list> is a file containing newline separated entries that\n"  		"describe the files to be included in the initramfs archive:\n" @@ -483,7 +482,11 @@ static void usage(const char *prog)  		"nod /dev/console 0600 0 0 c 5 1\n"  		"dir /root 0700 0 0\n"  		"dir /sbin 0755 0 0\n" -		"file /sbin/kinit /usr/src/klibc/kinit/kinit 0755 0 0\n", +		"file /sbin/kinit /usr/src/klibc/kinit/kinit 0755 0 0\n" +		"\n" +		"<timestamp> is time in seconds since Epoch that will be used\n" +		"as mtime for symlinks, special files and directories. The default\n" +		"is to use the current time for these entries.\n",  		prog);  } @@ -521,17 +524,42 @@ int main (int argc, char *argv[])  	char *args, *type;  	int ec = 0;  	int line_nr = 0; +	const char *filename; + +	default_mtime = time(NULL); +	while (1) { +		int opt = getopt(argc, argv, "t:h"); +		char *invalid; + +		if (opt == -1) +			break; +		switch (opt) { +		case 't': +			default_mtime = strtol(optarg, &invalid, 10); +			if (!*optarg || *invalid) { +				fprintf(stderr, "Invalid timestamp: %s\n", +						optarg); +				usage(argv[0]); +				exit(1); +			} +			break; +		case 'h': +		case '?': +			usage(argv[0]); +			exit(opt == 'h' ? 0 : 1); +		} +	} -	if (2 != argc) { +	if (argc - optind != 1) {  		usage(argv[0]);  		exit(1);  	} - -	if (!strcmp(argv[1], "-")) +	filename = argv[optind]; +	if (!strcmp(filename, "-"))  		cpio_list = stdin; -	else if (! (cpio_list = fopen(argv[1], "r"))) { +	else if (!(cpio_list = fopen(filename, "r"))) {  		fprintf(stderr, "ERROR: unable to open '%s': %s\n\n", -			argv[1], strerror(errno)); +			filename, strerror(errno));  		usage(argv[0]);  		exit(1);  	} diff --git a/usr/initramfs_data.S b/usr/initramfs_data.S index 792a750d944..c14322d1c0c 100644 --- a/usr/initramfs_data.S +++ b/usr/initramfs_data.S @@ -22,14 +22,15 @@  */  #include <linux/stringify.h> +#include <asm-generic/vmlinux.lds.h>  .section .init.ramfs,"a"  __irf_start:  .incbin __stringify(INITRAMFS_IMAGE)  __irf_end:  .section .init.ramfs.info,"a" -.globl __initramfs_size -__initramfs_size: +.globl VMLINUX_SYMBOL(__initramfs_size) +VMLINUX_SYMBOL(__initramfs_size):  #ifdef CONFIG_64BIT  	.quad __irf_end - __irf_start  #else  | 
