@@ -5,7 +5,7 | |||
|
5 | 5 | ## Build dependencies |
|
6 | 6 | The following list of Debian packages must be installed on the build system because they are essentially required for the bootstrapping process. The script will check if all required packages are installed and missing packages will be installed automatically if confirmed by the user. |
|
7 | 7 | |
|
8 | ```debootstrap debian-archive-keyring qemu-user-static dosfstools rsync bmap-tools whois git-core``` | |
|
8 | ```debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git-core``` | |
|
9 | 9 | |
|
10 | 10 | ## Command-line parameters |
|
11 | 11 | The script accepts certain command-line parameters to enable or disable specific OS features, services and configuration settings. These parameters are passed to the `rpi2-gen-image.sh` script via (simple) shell-variables. Unlike environment shell-variables (simple) shell-variables are defined at the beginning of the command-line call of the `rpi2-gen-image.sh` script. |
@@ -19,6 +19,7 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi2-gen-image.sh | |||
|
19 | 19 | APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi2-gen-image.sh |
|
20 | 20 | ENABLE_MINBASE=true ./rpi2-gen-image.sh |
|
21 | 21 | BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi2-gen-image.sh |
|
22 | BUILD_KERNEL=true KERNEL_SRCDIR=/tmp/linux ./rpi2-gen-image.sh | |
|
22 | 23 | ``` |
|
23 | 24 | |
|
24 | 25 | #### APT settings: |
@@ -158,7 +159,10 Path to a directory with scripts that should be run in the chroot before the ima | |||
|
158 | 159 | |
|
159 | 160 | #### Kernel compilation: |
|
160 | 161 | ##### `BUILD_KERNEL`=false |
|
161 |
Build and install the latest RPi2 |
|
|
162 | Build and install the latest RPi2 Linux kernel. Currently only the default RPi2 kernel configuration is used. Detailed configuration parameters for customizing the kernel and minor bug fixes still need to get implemented. feel free to help. | |
|
163 | ||
|
164 | ##### `KERNEL_SRCDIR`="" | |
|
165 | Path to a directory of [RaspberryPi Linux kernel] sources (https://github.com/raspberrypi/linux) that will be copied, configured, build and installed inside the chroot. | |
|
162 | 166 | |
|
163 | 167 | ##### `KERNEL_THREADS`=1 |
|
164 | 168 | Number of parallel kernel building threads. If the parameter is left untouched the script will automatically determine the number of CPU cores to set the number of parallel threads to speed the kernel compilation. |
@@ -169,8 +173,14 Install kernel headers with built kernel. | |||
|
169 | 173 | ##### `KERNEL_MENUCONFIG`=false |
|
170 | 174 | Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated. |
|
171 | 175 | |
|
176 | ##### `KERNEL_CONFIGSRC`=true | |
|
177 | Run `make bcm2709_defconfig` (and optional `make menuconfig`) to configure the kernel sources before building. This setting is automatically set to `true` if no existing kernel sources directory was specified using `KERNEL_SRCDIR`. | |
|
178 | ||
|
179 | ##### `KERNEL_CLEANSRC`=false | |
|
180 | Clean the existing kernel sources directory `KERNEL_SRCDIR` (using `make mrproper`) after it was copied to the chroot and before the compilation of the kernel has started. This setting will be ignored if no `KERNEL_SRCDIR` was specified. | |
|
181 | ||
|
172 | 182 | ##### `KERNEL_RMSRC`=true |
|
173 |
Remove all kernel sources from the generated OS image after |
|
|
183 | Remove all kernel sources from the generated OS image after it was built and installed. | |
|
174 | 184 | |
|
175 | 185 | ## Understanding the script |
|
176 | 186 | The functions of this script that are required for the different stages of the bootstrapping are split up into single files located inside the `bootstrap.d` directory. During the bootstrapping every script in this directory gets executed in lexicographical order: |
@@ -27,3 +27,4 sed -i "s/ jessie/ ${RELEASE}/" $R/etc/apt/sources.list | |||
|
27 | 27 | # Upgrade package index and update all installed packages and changed dependencies |
|
28 | 28 | chroot_exec apt-get -qq -y update |
|
29 | 29 | chroot_exec apt-get -qq -y -u dist-upgrade |
|
30 | chroot_exec apt-get -qq -y check |
@@ -7,32 +7,55 | |||
|
7 | 7 | |
|
8 | 8 | # Fetch and build latest raspberry kernel |
|
9 | 9 | if [ "$BUILD_KERNEL" = true ] ; then |
|
10 | # Fetch current raspberrypi kernel sources | |
|
11 | git -C $R/usr/src clone --depth=1 https://github.com/raspberrypi/linux | |
|
10 | # Setup source directory | |
|
11 | mkdir -p $R/usr/src | |
|
12 | 12 | |
|
13 | # Load default raspberry kernel configuration | |
|
14 | make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} bcm2709_defconfig | |
|
13 | # Copy existing kernel sources into chroot directory | |
|
14 | if [ -n "$KERNEL_SRCDIR" ] && [ -d "$KERNEL_SRCDIR" ] ; then | |
|
15 | # Copy kernel sources | |
|
16 | cp -r "${KERNEL_SRCDIR}" "${R}/usr/src" | |
|
17 | ||
|
18 | # Clean the kernel sources | |
|
19 | if [ "$KERNEL_CLEANSRC" = true ] ; then | |
|
20 | make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} mrproper | |
|
21 | fi | |
|
22 | else # KERNEL_SRCDIR="" | |
|
23 | # Fetch current raspberrypi kernel sources | |
|
24 | git -C $R/usr/src clone --depth=1 https://github.com/raspberrypi/linux | |
|
25 | fi | |
|
15 | 26 | |
|
16 | 27 | # Calculate optimal number of kernel building threads |
|
17 | if [ "$KERNEL_THREADS" = 1 ] ; then | |
|
18 |
if [ - |
|
|
28 | if [ "$KERNEL_THREADS" = "1" ] ; then | |
|
29 | if [ -r /proc/cpuinfo ] ; then | |
|
19 | 30 | KERNEL_THREADS=$(grep -c processor /proc/cpuinfo) |
|
20 | 31 | fi |
|
21 | 32 | fi |
|
22 | 33 | |
|
23 | # Start menu-driven kernel configuration (interactive) | |
|
24 | if [ "$KERNEL_MENUCONFIG" = true ] ; then | |
|
25 |
make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} |
|
|
34 | if [ "$KERNEL_CONFIGSRC" = true ] ; then | |
|
35 | # Load default raspberry kernel configuration | |
|
36 | make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} ${KERNEL_DEFCONFIG} | |
|
37 | ||
|
38 | # Start menu-driven kernel configuration (interactive) | |
|
39 | if [ "$KERNEL_MENUCONFIG" = true ] ; then | |
|
40 | make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} menuconfig | |
|
41 | fi | |
|
26 | 42 | fi |
|
27 | 43 | |
|
28 | 44 | # Cross compile kernel and modules |
|
29 | 45 | make -C $R/usr/src/linux -j${KERNEL_THREADS} ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} zImage modules dtbs |
|
30 | 46 | |
|
47 | # Check if kernel compilation was successful | |
|
48 | if [ ! -r $R/usr/src/linux/arch/${KERNEL_ARCH}/boot/zImage ] ; then | |
|
49 | echo "error: kernel compilation failed!" | |
|
50 | cleanup | |
|
51 | exit 1 | |
|
52 | fi | |
|
53 | ||
|
31 | 54 | # Install kernel modules |
|
32 | 55 | make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} INSTALL_MOD_PATH=../../.. modules_install |
|
33 | 56 | |
|
34 | 57 | # Install kernel headers |
|
35 | if [ "$KERNEL_HEADERS" = true ]; then | |
|
58 | if [ "$KERNEL_HEADERS" = true ] ; then | |
|
36 | 59 | make -C $R/usr/src/linux ARCH=${KERNEL_ARCH} CROSS_COMPILE=${CROSS_COMPILE} INSTALL_HDR_PATH=../.. headers_install |
|
37 | 60 | fi |
|
38 | 61 | |
@@ -47,7 +70,7 if [ "$BUILD_KERNEL" = true ] ; then | |||
|
47 | 70 | cp $R/usr/src/linux/arch/${KERNEL_ARCH}/boot/dts/overlays/README $R/boot/firmware/overlays/ |
|
48 | 71 | |
|
49 | 72 | # Remove kernel sources |
|
50 | if [ "$KERNEL_RMSRC" = true ]; then | |
|
73 | if [ "$KERNEL_RMSRC" = true ] ; then | |
|
51 | 74 | rm -fr $R/usr/src/linux |
|
52 | 75 | fi |
|
53 | 76 |
@@ -15,10 +15,10 if [ "$ENABLE_USER" = true ] ; then | |||
|
15 | 15 | fi |
|
16 | 16 | |
|
17 | 17 | # Setup root password or not |
|
18 | if [ "$ENABLE_ROOT" = true ]; then | |
|
18 | if [ "$ENABLE_ROOT" = true ] ; then | |
|
19 | 19 | chroot_exec usermod -p "${ENCRYPTED_PASSWORD}" root |
|
20 | 20 | |
|
21 | if [ "$ENABLE_ROOT_SSH" = true ]; then | |
|
21 | if [ "$ENABLE_ROOT_SSH" = true ] ; then | |
|
22 | 22 | sed -i "s|[#]*PermitRootLogin.*|PermitRootLogin yes|g" $R/etc/ssh/sshd_config |
|
23 | 23 | fi |
|
24 | 24 | else |
@@ -6,8 +6,8 | |||
|
6 | 6 | . ./functions.sh |
|
7 | 7 | |
|
8 | 8 | # Disable rsyslog |
|
9 | if [ "$ENABLE_RSYSLOG" = false ]; then | |
|
9 | if [ "$ENABLE_RSYSLOG" = false ] ; then | |
|
10 | 10 | sed -i "s|[#]*ForwardToSyslog=yes|ForwardToSyslog=no|g" $R/etc/systemd/journald.conf |
|
11 | 11 | chroot_exec systemctl disable rsyslog |
|
12 |
chroot_exec apt-get |
|
|
12 | chroot_exec apt-get -qq -y --force-yes purge rsyslog | |
|
13 | 13 | fi |
@@ -6,8 +6,8 | |||
|
6 | 6 | . ./functions.sh |
|
7 | 7 | |
|
8 | 8 | # Install gcc/c++ build environment inside the chroot |
|
9 | if [ "$ENABLE_UBOOT" = true ] || [ "$ENABLE_FBTURBO" = true ]; then | |
|
10 |
chroot_exec apt-get |
|
|
9 | if [ "$ENABLE_UBOOT" = true ] || [ "$ENABLE_FBTURBO" = true ] ; then | |
|
10 | chroot_exec apt-get -q -y --force-yes --no-install-recommends install linux-compiler-gcc-4.9-arm g++ make bc | |
|
11 | 11 | fi |
|
12 | 12 | |
|
13 | 13 | # Fetch and build U-Boot bootloader |
@@ -10,7 +10,7 if [ "$ENABLE_FBTURBO" = true ] ; then | |||
|
10 | 10 | git -C $R/tmp clone https://github.com/ssvb/xf86-video-fbturbo.git |
|
11 | 11 | |
|
12 | 12 | # Install Xorg build dependencies |
|
13 |
chroot_exec apt-get |
|
|
13 | chroot_exec apt-get -q -y --no-install-recommends install xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev | |
|
14 | 14 | |
|
15 | 15 | # Build and install fbturbo driver inside chroot |
|
16 | 16 | chroot_exec /bin/bash -x <<'EOF' |
@@ -25,10 +25,10 EOF | |||
|
25 | 25 | install_readonly files/xorg/99-fbturbo.conf $R/usr/share/X11/xorg.conf.d/99-fbturbo.conf |
|
26 | 26 | |
|
27 | 27 | # Remove Xorg build dependencies |
|
28 |
chroot_exec apt-get -q -y purge |
|
|
28 | chroot_exec apt-get -qq -y --auto-remove purge xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev | |
|
29 | 29 | fi |
|
30 | 30 | |
|
31 | 31 | # Remove gcc/c++ build environment from the chroot |
|
32 | if [ "$ENABLE_UBOOT" = true ] || [ "$ENABLE_FBTURBO" = true ]; then | |
|
33 |
chroot_exec apt-get -y - |
|
|
32 | if [ "$ENABLE_UBOOT" = true ] || [ "$ENABLE_FBTURBO" = true ] ; then | |
|
33 | chroot_exec apt-get -qq -y --auto-remove purge bc binutils cpp cpp-4.9 g++ g++-4.9 gcc gcc-4.9 libasan1 libatomic1 libc-dev-bin libc6-dev libcloog-isl4 libgcc-4.9-dev libgomp1 libisl10 libmpc3 libmpfr4 libstdc++-4.9-dev libubsan0 linux-compiler-gcc-4.9-arm linux-libc-dev make | |
|
34 | 34 | fi |
@@ -15,6 +15,12 | |||
|
15 | 15 | # Copyright (C) 2015 Luca Falavigna <dktrkranz@debian.org> |
|
16 | 16 | ######################################################################## |
|
17 | 17 | |
|
18 | # Check if ./functions.sh script exists | |
|
19 | if [ ! -r "./functions.sh" ] ; then | |
|
20 | echo "error: './functions.sh' required script not found. please reinstall the latest script version!" | |
|
21 | exit 1 | |
|
22 | fi | |
|
23 | ||
|
18 | 24 | # Load utility functions |
|
19 | 25 | . ./functions.sh |
|
20 | 26 | |
@@ -29,6 +35,7 KERNEL_ARCH=${KERNEL_ARCH:=arm} | |||
|
29 | 35 | RELEASE_ARCH=${RELEASE_ARCH:=armhf} |
|
30 | 36 | CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-} |
|
31 | 37 | COLLABORA_KERNEL=${COLLABORA_KERNEL:=3.18.0-trunk-rpi2} |
|
38 | KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig} | |
|
32 | 39 | QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static} |
|
33 | 40 | |
|
34 | 41 | # Build settings |
@@ -90,9 +97,12 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false} | |||
|
90 | 97 | |
|
91 | 98 | # Kernel compilation settings |
|
92 | 99 | BUILD_KERNEL=${BUILD_KERNEL:=false} |
|
100 | KERNEL_SRCDIR=${KERNEL_SRCDIR:=""} | |
|
93 | 101 | KERNEL_THREADS=${KERNEL_THREADS:=1} |
|
94 | 102 | KERNEL_HEADERS=${KERNEL_HEADERS:=true} |
|
95 | 103 | KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false} |
|
104 | KERNEL_CLEANSRC=${KERNEL_CLEANSRC:=false} | |
|
105 | KERNEL_CONFIGSRC=${KERNEL_CONFIGSRC:=true} | |
|
96 | 106 | KERNEL_RMSRC=${KERNEL_RMSRC:=true} |
|
97 | 107 | |
|
98 | 108 | # Image chroot path |
@@ -107,16 +117,40 MISSING_PACKAGES="" | |||
|
107 | 117 | |
|
108 | 118 | # Packages required in the chroot build environment |
|
109 | 119 | APT_INCLUDES=${APT_INCLUDES:=""} |
|
110 | APT_INCLUDES="${APT_INCLUDES},apt-transport-https,ca-certificates,debian-archive-keyring,dialog,sudo" | |
|
120 | APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo" | |
|
111 | 121 | |
|
112 | 122 | set +x |
|
113 | 123 | |
|
114 | 124 | # Are we running as root? |
|
115 | 125 | if [ "$(id -u)" -ne "0" ] ; then |
|
116 | echo "this script must be executed with root privileges" | |
|
126 | echo "error: this script must be executed with root privileges!" | |
|
117 | 127 | exit 1 |
|
118 | 128 | fi |
|
119 | 129 | |
|
130 | # Check if ./bootstrap.d directory exists | |
|
131 | if [ ! -d "./bootstrap.d/" ] ; then | |
|
132 | echo "error: './bootstrap.d' required directory not found. please reinstall the latest script version!" | |
|
133 | exit 1 | |
|
134 | fi | |
|
135 | ||
|
136 | # Check if ./files directory exists | |
|
137 | if [ ! -d "./files/" ] ; then | |
|
138 | echo "error: './files' required directory not found. please reinstall the latest script version!" | |
|
139 | exit 1 | |
|
140 | fi | |
|
141 | ||
|
142 | # Check if specified KERNEL_SRCDIR directory exists | |
|
143 | if [ -n "$KERNEL_SRCDIR" ] && [ ! -d "$KERNEL_SRCDIR" ] ; then | |
|
144 | echo "error: ${KERNEL_SRCDIR} (KERNEL_SRCDIR) specified directory not found!" | |
|
145 | exit 1 | |
|
146 | fi | |
|
147 | ||
|
148 | # Check if specified CHROOT_SCRIPTS directory exists | |
|
149 | if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then | |
|
150 | echo "error: ${CHROOT_SCRIPTS} (CHROOT_SCRIPTS) specified directory not found!" | |
|
151 | exit 1 | |
|
152 | fi | |
|
153 | ||
|
120 | 154 | # Add packages required for kernel cross compilation |
|
121 | 155 | if [ "$BUILD_KERNEL" = true ] ; then |
|
122 | 156 | REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf" |
@@ -148,11 +182,22 fi | |||
|
148 | 182 | apt-get -qq -y install ${REQUIRED_PACKAGES} |
|
149 | 183 | |
|
150 | 184 | # Don't clobber an old build |
|
151 | if [ -e "$BUILDDIR" ]; then | |
|
152 | echo "directory $BUILDDIR already exists, not proceeding" | |
|
185 | if [ -e "$BUILDDIR" ] ; then | |
|
186 | echo "error: directory ${BUILDDIR} already exists, not proceeding" | |
|
187 | exit 1 | |
|
188 | fi | |
|
189 | ||
|
190 | # Check if build directory has enough of free disk space >512MB | |
|
191 | if [ "$(df --output=avail ${BUILDDIR} | sed "1d")" -le "524288" ] ; then | |
|
192 | echo "error: ${BUILDDIR} not enough space left on this partition to generate the output image!" | |
|
153 | 193 | exit 1 |
|
154 | 194 | fi |
|
155 | 195 | |
|
196 | # Warn if build directory has low free disk space <1024MB | |
|
197 | if [ "$(df --output=avail ${BUILDDIR} | sed "1d")" -le "1048576" ] ; then | |
|
198 | echo `df -h --output=avail ${BUILDDIR} | sed "1 s|.*Avail|warning: $partition is low on free space:|"` | |
|
199 | fi | |
|
200 | ||
|
156 | 201 | set -x |
|
157 | 202 | |
|
158 | 203 | # Call "cleanup" function on various signals and errors |
@@ -198,10 +243,6 if [ "$ENABLE_HWRANDOM" = true ] ; then | |||
|
198 | 243 | APT_INCLUDES="${APT_INCLUDES},rng-tools" |
|
199 | 244 | fi |
|
200 | 245 | |
|
201 | if [ "$ENABLE_USER" = true ]; then | |
|
202 | APT_INCLUDES="${APT_INCLUDES},sudo" | |
|
203 | fi | |
|
204 | ||
|
205 | 246 | # Add fbturbo video driver |
|
206 | 247 | if [ "$ENABLE_FBTURBO" = true ] ; then |
|
207 | 248 | # Enable xorg package dependencies |
@@ -221,27 +262,42 if [ "$ENABLE_XORG" = true ] ; then | |||
|
221 | 262 | APT_INCLUDES="${APT_INCLUDES},xorg" |
|
222 | 263 | fi |
|
223 | 264 | |
|
224 | ## Main bootstrap | |
|
225 | for i in bootstrap.d/*.sh; do | |
|
226 | head -n 3 $i | |
|
227 | . $i | |
|
265 | # Set KERNEL_CONFIGSRC=true | |
|
266 | if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNEL_SRCDIR" ] ; then | |
|
267 | KERNEL_CONFIGSRC=true | |
|
268 | fi | |
|
269 | ||
|
270 | ## MAIN bootstrap | |
|
271 | for SCRIPT in bootstrap.d/*.sh; do | |
|
272 | # Execute bootstrap scripts (lexicographical order) | |
|
273 | head -n 3 $SCRIPT | |
|
274 | . $SCRIPT | |
|
228 | 275 | done |
|
229 | 276 | |
|
230 | 277 | ## Custom bootstrap scripts |
|
231 | if [ -d "custom.d" ]; then | |
|
232 | for i in custom.d/*.sh; do | |
|
233 | . $i | |
|
278 | if [ -d "custom.d" ] ; then | |
|
279 | # Execute custom bootstrap scripts (lexicographical order) | |
|
280 | for SCRIPT in custom.d/*.sh; do | |
|
281 | . $SCRIPT | |
|
234 | 282 | done |
|
235 | 283 | fi |
|
236 | 284 | |
|
237 | 285 | # Invoke custom scripts |
|
238 |
if [ -n "$ |
|
|
286 | if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then | |
|
239 | 287 | cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts" |
|
240 | LANG=C chroot $R bash -c 'for SCRIPT in /chroot_scripts/*; do if [ -f $SCRIPT -a -x $SCRIPT ]; then $SCRIPT; fi done;' | |
|
288 | # Execute scripts inside the chroot (lexicographical order) | |
|
289 | chroot_exec /bin/bash -x <<'EOF' | |
|
290 | for SCRIPT in /chroot_scripts/* ; do | |
|
291 | if [ -f $SCRIPT -a -x $SCRIPT ] ; then | |
|
292 | $SCRIPT | |
|
293 | fi | |
|
294 | done | |
|
295 | EOF | |
|
241 | 296 | rm -rf "${R}/chroot_scripts" |
|
242 | 297 | fi |
|
243 | 298 | |
|
244 | 299 | ## Cleanup |
|
300 | chroot_exec apt-get purge -q -y --force-yes apt-utils | |
|
245 | 301 | chroot_exec apt-get -y clean |
|
246 | 302 | chroot_exec apt-get -y autoclean |
|
247 | 303 | chroot_exec apt-get -y autoremove |
General Comments 0
Vous devez vous connecter pour laisser un commentaire.
Se connecter maintenant