Commit 187ada2d authored by Martin Schlemmer's avatar Martin Schlemmer Committed by Linus Torvalds

[PATCH] Select cpio_list or source directory for initramfs image

Attached is a patch that adds CONFIG_INITRAMFS_SOURCE, enabling you to
either specify a file as cpio_list, or a directory to generate a list from.

It depreciate the INITRAMFS_LIST environment variable introduced not long
ago.

There are some issues (suggestions/patches welcome) that I am not
sure about:
1) I put the menu entry under block devices, but I am not sure if
   this is the correct location?
2) There might be a better (or more correct) way to do this with
   kbuild?
3) Variable names and especially help text needs some love.
4) I am not sure if I am duplicating work in progress?
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6fa95f2b
......@@ -348,6 +348,32 @@ config BLK_DEV_INITRD
"real" root file system, etc. See <file:Documentation/initrd.txt>
for details.
config INITRAMFS_SOURCE
string "Source directory of cpio_list"
default ""
help
This can be set to either a directory containing files, etc to be
included in the initramfs archive, or a file containing newline
separated entries.
If it is a file, it should be in the following format:
# a comment
file <name> <location> <mode> <uid> <gid>
dir <name> <mode> <uid> <gid>
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
Where:
<name> name of the file/dir/nod in the archive
<location> location of the file in the current filesystem
<mode> mode/permissions of the file
<uid> user id (0=root)
<gid> group id (0=root)
<dev_type> device type (b=block, c=character)
<maj> major number of nod
<min> minor number of nod
If you are not sure, leave it blank.
config LBD
bool "Support for Large Block Devices"
depends on X86 || MIPS32 || PPC32 || ARCH_S390_31 || SUPERH
......
#!/bin/bash
# Copyright (C) Martin Schlemmer <azarah@nosferatu.za.org>
# Released under the terms of the GNU GPL
#
# A script to generate newline separated entries (to stdout) from a directory's
# contents suitable for use as a cpio_list for gen_init_cpio.
#
# Arguements: $1 -- the source directory
#
# TODO: Add support for symlinks, sockets and pipes when gen_init_cpio
# supports them.
usage() {
echo "Usage: $0 initramfs-source-dir"
exit 1
}
srcdir=$(echo "$1" | sed -e 's://*:/:g')
if [ "$#" -gt 1 -o ! -d "${srcdir}" ]; then
usage
fi
filetype() {
local argv1="$1"
if [ -f "${argv1}" ]; then
echo "file"
elif [ -d "${argv1}" ]; then
echo "dir"
elif [ -b "${argv1}" -o -c "${argv1}" ]; then
echo "nod"
else
echo "invalid"
fi
return 0
}
parse() {
local location="$1"
local name="${location/${srcdir}//}"
local mode="$2"
local uid="$3"
local gid="$4"
local ftype=$(filetype "${location}")
local str="${mode} ${uid} ${gid}"
[ "${ftype}" == "invalid" ] && return 0
[ "${location}" == "${srcdir}" ] && return 0
case "${ftype}" in
"file")
str="${ftype} ${name} ${location} ${str}"
;;
"nod")
local dev_type=
local maj=$(LC_ALL=C ls -l "${location}" | \
gawk '{sub(/,/, "", $5); print $5}')
local min=$(LC_ALL=C ls -l "${location}" | \
gawk '{print $6}')
if [ -b "${location}" ]; then
dev_type="b"
else
dev_type="c"
fi
str="${ftype} ${name} ${str} ${dev_type} ${maj} ${min}"
;;
*)
str="${ftype} ${name} ${str}"
;;
esac
echo "${str}"
return 0
}
find "${srcdir}" -printf "%p %m %U %G\n" | \
while read x; do
parse ${x}
done
exit 0
......@@ -8,7 +8,7 @@ clean-files := initramfs_data.cpio.gz
# If you want a different list of files in the initramfs_data.cpio
# then you can either overwrite the cpio_list in this directory
# or set INITRAMFS_LIST to another filename.
INITRAMFS_LIST ?= $(obj)/initramfs_list
INITRAMFS_LIST := $(obj)/initramfs_list
# initramfs_data.o contains the initramfs_data.cpio.gz image.
# The image is included using .incbin, a dependency which is not
......@@ -23,6 +23,24 @@ $(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE
# Commented out for now
# initramfs-y := $(obj)/root/hello
quiet_cmd_gen_list = GEN_INITRAMFS_LIST $@
cmd_gen_list = $(shell \
if test -f $(CONFIG_INITRAMFS_SOURCE); then \
if [ $(CONFIG_INITRAMFS_SOURCE) != $@ ]; then \
echo 'cp -f $(CONFIG_INITRAMFS_SOURCE) $@'; \
else \
echo 'echo Using shipped $@'; \
fi; \
elif test -d $(CONFIG_INITRAMFS_SOURCE); then \
echo 'scripts/gen_initramfs_list.sh $(CONFIG_INITRAMFS_SOURCE) > $@'; \
else \
echo 'echo Using shipped $@'; \
fi)
$(INITRAMFS_LIST): FORCE
$(call cmd,gen_list)
quiet_cmd_cpio = CPIO $@
cmd_cpio = ./$< $(INITRAMFS_LIST) > $@
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment