You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.4 KiB
130 lines
3.4 KiB
#!/bin/bash --norc |
|
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- |
|
# ex: ts=8 sw=4 sts=4 et filetype=sh |
|
# |
|
# Copyright 2009 Red Hat, Inc. All rights reserved. |
|
# |
|
# 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 |
|
# the Free Software Foundation; either version 2 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# This program is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
# |
|
|
|
|
|
dwarning() { |
|
echo "Warning: $@" >&2 |
|
} |
|
|
|
dinfo() { |
|
[[ $beverbose ]] && echo "$@" >&2 |
|
} |
|
|
|
derror() { |
|
echo "Error: $@" >&2 |
|
} |
|
|
|
usage() { |
|
# 80x25 linebreak here ^ |
|
cat << EOF |
|
Usage: $0 [OPTION]... <initramfs> <base image> [<image>...] |
|
Creates initial ramdisk image by concatenating several images from the command |
|
line and /boot/dracut/ |
|
|
|
-f, --force Overwrite existing initramfs file. |
|
-i, --imagedir Directory with additional images to add |
|
(default: /boot/dracut/) |
|
-o, --overlaydir Overlay directory, which contains files that |
|
will be used to create an additional image |
|
--nooverlay Do not use the overlay directory |
|
--noimagedir Do not use the additional image directory |
|
-h, --help This message |
|
--debug Output debug information of the build process |
|
-v, --verbose Verbose output during the build process |
|
EOF |
|
} |
|
|
|
|
|
imagedir=/boot/dracut/ |
|
overlay=/var/lib/dracut/overlay |
|
|
|
while (($# > 0)); do |
|
case $1 in |
|
-f|--force) force=yes;; |
|
-i|--imagedir) imagedir=$2;shift;; |
|
-o|--overlaydir) overlay=$2;shift;; |
|
--nooverlay) no_overlay=yes;shift;; |
|
--noimagedir) no_imagedir=yes;shift;; |
|
-h|--help) usage; exit 1 ;; |
|
--debug) debug="yes";; |
|
-v|--verbose) beverbose="yes";; |
|
-*) printf "\nUnknown option: %s\n\n" "$1" >&2; usage; exit 1;; |
|
*) break ;; |
|
esac |
|
shift |
|
done |
|
|
|
outfile=$1; shift |
|
|
|
if [[ -z $outfile ]]; then |
|
derror "No output file specified." |
|
usage |
|
exit 1 |
|
fi |
|
|
|
baseimage=$1; shift |
|
|
|
if [[ -z $baseimage ]]; then |
|
derror "No base image specified." |
|
usage |
|
exit 1 |
|
fi |
|
|
|
if [[ -f $outfile && ! $force ]]; then |
|
derror "Will not override existing initramfs ($outfile) without --force" |
|
exit 1 |
|
fi |
|
|
|
if [[ ! $no_imagedir && ! -d $imagedir ]]; then |
|
derror "Image directory $overlay is not a directory" |
|
exit 1 |
|
fi |
|
|
|
if [[ ! $no_overlay && ! -d $overlay ]]; then |
|
derror "Overlay $overlay is not a directory" |
|
exit 1 |
|
fi |
|
|
|
if [[ ! $no_overlay ]]; then |
|
ofile="$imagedir/90-overlay.img" |
|
dinfo "Creating image $ofile from directory $overlay" |
|
type pigz &>/dev/null && gzip=pigz || gzip=gzip |
|
( cd "$overlay"; find . |cpio --quiet -H newc -o |$gzip -9 > "$ofile"; ) |
|
fi |
|
|
|
if [[ ! $no_imagedir ]]; then |
|
for i in "$imagedir/"*.img; do |
|
[[ -f $i ]] && images+=("$i") |
|
done |
|
fi |
|
|
|
images+=($@) |
|
|
|
dinfo "Using base image $baseimage" |
|
cat "$baseimage" > "$outfile" |
|
|
|
for i in "${images[@]}"; do |
|
dinfo "Appending $i" |
|
cat "$i" >> "$outfile" |
|
done |
|
|
|
dinfo "Created $outfile" |
|
|
|
exit 0
|
|
|