summaryrefslogtreecommitdiffstats
path: root/make-initramfs.sh.in
blob: 6ff6e6982302579ab19b1b29fefcbb55a627a4b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/bin/bash -
# @configure_input@
# Copyright (C) 2009 Red Hat Inc.
#
# 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, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

# This is called from the Makefile to build the initramfs.

set -e

unset CDPATH

# If you want to do some extra debugging and diagnosis of the
# initramfs image, then uncomment this line.  This makes the image
# larger.
debug=yes

modules="-i kernel -i bash -i coreutils -i lvm2 -i ntfs-3g -i util-linux-ng -i MAKEDEV -i net-tools -i augeas-libs -i file"

if [ "x$debug" = "xyes" ]; then
    modules="$modules -i module-init-tools -i procps -i strace -i iputils"
fi

# Decide on names for the final output.  These have to match Makefile.am.
output=initramfs.@REPO@.@host_cpu@.img
koutput=vmlinuz.@REPO@.@host_cpu@
rm -f $output
rm -f $koutput

# Create the basic initramfs.
@FEBOOTSTRAP@ $modules -u @UPDATES@ @REPO@ initramfs @MIRROR@

# /sysroot is where the guest root filesystem will be mounted.
mkdir initramfs/sysroot

# Create /tmp if it is missing.
mkdir -p initramfs/tmp
@FEBOOTSTRAP_RUN@ initramfs -- chmod 0777 /tmp

# Make a safe 'install_file' function to install files into the
# filesystem.  XXX We need a 'febootstrap-install' utility.
# Usage: install_file <local-file> <target-pathname> mode owner[.group]
install_file ()
{
    cp "$1" initramfs/"$2"
    # Get the inode of the new file and remove it from fakeroot.log.
    ino=$(ls -i initramfs/"$2" | awk '{print $1}')
    cp initramfs/fakeroot.log fakeroot.log.old
    grep -v "ino=$ino," fakeroot.log.old > initramfs/fakeroot.log
    rm fakeroot.log.old
    # Set mode, owner and group as desired.
    @FEBOOTSTRAP_RUN@ initramfs -- chmod "$3" "$2"
    @FEBOOTSTRAP_RUN@ initramfs -- chown "$4" "$2"
}

# Nuke some stuff.  The kernel pulls mkinitrd and plymouth which pulls in
# all of Python.  Sheez.
find initramfs -name '*plymouth*' -print0 | xargs -0 rm -rf
find initramfs -name '*python*' -print0 | xargs -0 rm -rf

# Modules take up nearly half of the image.  It's a rough guess that
# we don't need many drivers (which take up most of the space).
find initramfs/lib/modules/*/kernel \
  -name '*.ko' \
  -a ! -name 'mii.ko' \
  -a ! -name '8139cp.ko' \
  -a ! -name 'ext2.ko' \
  -a ! -name 'ext4.ko' \
  -a ! -name 'crc16.ko' \
  -a ! -name 'jbd2.ko' \
  -a ! -name 'fuse.ko' \
  -a -delete

# Pull the kernel out into the current directory.  We don't want it in
# the initramfs image.
mv initramfs/boot/vmlinuz* $koutput
rm -rf initramfs/boot

# Minimize the image.
@FEBOOTSTRAP_MINIMIZE@ initramfs

# Add some missing configuration files.
if [ ! -f initramfs/etc/hosts ]; then
    cat > hosts.new <<'__EOF__'
127.0.0.1 guestfs localhost.localdomain localhost
::1       localhost6.localdomain6 localhost6
__EOF__
    install_file hosts.new /etc/hosts 0644 root.root
    rm hosts.new
fi

if [ ! -f initramfs/etc/fstab ]; then
    @FEBOOTSTRAP_RUN@ initramfs -- touch /etc/fstab
fi

echo nameserver 10.0.2.3 > resolv.conf.new
install_file resolv.conf.new /etc/resolv.conf 0644 root.root
rm resolv.conf.new

# Create the init script.
cat > init.new <<'__EOF__'
#!/bin/sh
PATH=/sbin:/usr/sbin:$PATH
MAKEDEV mem null port zero core full ram tty console fd \
  hda hdb hdc hdd sda sdb sdc sdd loop sd
mount -t proc /proc /proc
mount -t sysfs /sys /sys
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
modprobe 8139cp
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 10.0.2.10
/sbin/route add default gw 10.0.2.2
lvm vgscan --ignorelockingfailure
lvm vgchange -ay --ignorelockingfailure
__EOF__

if [ "x$debug" != "xyes" ]; then
    echo exec guestfsd -f >> init.new
else
    echo guestfsd >> init.new
    echo exec bash -i >> init.new
fi

install_file init.new /init 0755 root.root
rm init.new

# Copy the daemon into the filesystem.
install_file @abs_builddir@/daemon/guestfsd /sbin/guestfsd 0755 root.root

# Generate final image.
@FEBOOTSTRAP_TO_INITRAMFS@ initramfs > $output-t
mv $output-t $output
ls -lh $output
ls -lh $koutput