##// END OF EJS Templates
remerge
Unknown -
r385:fa8b2a18246e
parent child
Show More
@@ -1,499 +1,499
1 1 # rpi23-gen-image
2 2 ## Introduction
3 3 `rpi23-gen-image.sh` is an advanced Debian Linux bootstrapping shell script for generating Debian OS images for Raspberry Pi 2 (RPi2) and Raspberry Pi 3 (RPi3) computers. The script at this time supports the bootstrapping of the Debian (armhf) releases `stretch` and `buster`. Raspberry Pi 3 images are generated for 32-bit mode only. Raspberry Pi 3 64-bit images can be generated using custom configuration parameters (```templates/rpi3-stretch-arm64-4.11.y```).
4 4
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 8 ```debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo```
9 9
10 10 It is recommended to configure the `rpi23-gen-image.sh` script to build and install the latest Raspberry Pi Linux kernel. For the RPi3 this is mandatory. Kernel compilation and linking will be performed on the build system using an ARM (armhf) cross-compiler toolchain.
11 11
12 12 The script has been tested using the default `crossbuild-essential-armhf` toolchain meta package on Debian Linux and `stretch` build systems. Please check the [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains) for further information.
13 13
14 14 ## Command-line parameters
15 15 The script accepts certain command-line parameters to enable or disable specific OS features, services and configuration settings. These parameters are passed to the `rpi23-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 `rpi23-gen-image.sh` script.
16 16
17 17 ##### Command-line examples:
18 18 ```shell
19 19 ENABLE_UBOOT=true ./rpi23-gen-image.sh
20 20 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
21 21 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
22 22 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
23 23 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
24 24 ENABLE_MINBASE=true ./rpi23-gen-image.sh
25 25 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
26 26 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
27 27 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
28 28 ENABLE_CRYPTFS=true CRYPTFS_PASSWORD=changeme EXPANDROOT=false ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
29 29 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
30 30 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
31 31 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
32 32 ```
33 33
34 34 ## Configuration template files
35 35 To avoid long lists of command-line parameters and to help to store the favourite parameter configurations the `rpi23-gen-image.sh` script supports so called configuration template files (`CONFIG_TEMPLATE`=template). These are simple text files located in the `./templates` directory that contain the list of configuration parameters that will be used. New configuration template files can be added to the `./templates` directory.
36 36
37 37 ##### Command-line examples:
38 38 ```shell
39 39 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
40 40 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
41 41 ```
42 42
43 43 ## Supported parameters and settings
44 44 #### APT settings:
45 45 ##### `APT_SERVER`="ftp.debian.org/debian"
46 46 Set Debian packages server address. Choose a server from the list of Debian worldwide [mirror sites](https://www.debian.org/mirror/list). Using a nearby server will probably speed-up all required downloads within the bootstrapping process.
47 47
48 48 ##### `APT_PROXY`=""
49 49 Set Proxy server address. Using a local Proxy-Cache like `apt-cacher-ng` will speed-up the bootstrapping process because all required Debian packages will only be downloaded from the Debian mirror site once. If `apt-cacher-ng` is running on default `http://127.0.0.1:3142` it is autodetected and you don't need to set this.
50 50
51 51 ##### `APT_INCLUDES`=""
52 52 A comma separated list of additional packages to be installed by debootstrap during bootstrapping.
53 53
54 54 ##### `APT_INCLUDES_LATE`=""
55 55 A comma separated list of additional packages to be installed by apt after bootstrapping and after APT sources are set up. This is useful for packages with pre-depends, which debootstrap do not handle well.
56 56
57 57 ---
58 58
59 59 #### General system settings:
60 60 ##### `RPI_MODEL`=2
61 61 Specifiy the target Raspberry Pi hardware model. The script at this time supports the following Raspberry Pi models:
62 62 `0` = Used for Raspberry Pi 0 and Raspberry Pi 0 W
63 63 `1` = Used for Pi 1 model A and B
64 64 `1P` = Used for Pi 1 model B+ and A+
65 65 `2` = Used for Pi 2 model B
66 66 `3` = Used for Pi 3 model B
67 67 `3P` = Used for Pi 3 model B+
68 68 `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` or `3P` is used.
69 69
70 70 ##### `RELEASE`="buster"
71 71 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases "stretch" and "buster". `BUILD_KERNEL`=true will automatically be set if the Debian releases `stretch` or `buster` are used.
72 72
73 73 ##### `RELEASE_ARCH`="armhf"
74 74 Set the desired Debian release architecture.
75 75
76 76 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
77 77 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
78 78
79 79 ##### `PASSWORD`="raspberry"
80 80 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
81 81
82 82 ##### `USER_PASSWORD`="raspberry"
83 83 Set password for the created non-root user `USER_NAME`=pi. Ignored if `ENABLE_USER`=false. It's **STRONGLY** recommended that you choose a custom password.
84 84
85 85 ##### `DEFLOCAL`="en_US.UTF-8"
86 86 Set default system locale. This setting can also be changed inside the running OS using the `dpkg-reconfigure locales` command. Please note that on using this parameter the script will automatically install the required packages `locales`, `keyboard-configuration` and `console-setup`.
87 87
88 88 ##### `TIMEZONE`="Europe/Berlin"
89 89 Set default system timezone. All available timezones can be found in the `/usr/share/zoneinfo/` directory. This setting can also be changed inside the running OS using the `dpkg-reconfigure tzdata` command.
90 90
91 91 ##### `EXPANDROOT`=true
92 92 Expand the root partition and filesystem automatically on first boot.
93 93
94 94 ##### `ENABLE_QEMU`=false
95 95 Generate kernel (`vexpress_defconfig`), file system image (`qcow2`) and DTB files that can be used for QEMU full system emulation (`vexpress-A15`). The output files are stored in the `$(pwd)/images/qemu` directory. You can find more information about running the generated image in the QEMU section of this readme file.
96 96
97 97 ---
98 98
99 99 #### Keyboard settings:
100 100 These options are used to configure keyboard layout in `/etc/default/keyboard` for console and Xorg. These settings can also be changed inside the running OS using the `dpkg-reconfigure keyboard-configuration` command.
101 101
102 102 ##### `XKB_MODEL`=""
103 103 Set the name of the model of your keyboard type.
104 104
105 105 ##### `XKB_LAYOUT`=""
106 106 Set the supported keyboard layout(s).
107 107
108 108 ##### `XKB_VARIANT`=""
109 109 Set the supported variant(s) of the keyboard layout(s).
110 110
111 111 ##### `XKB_OPTIONS`=""
112 112 Set extra xkb configuration options.
113 113
114 114 ---
115 115
116 116 #### Networking settings (DHCP):
117 117 This parameter is used to set up networking auto configuration in `/etc/systemd/network/eth.network`. The default location of network configuration files in the Debian `stretch` release was changed to `/lib/systemd/network`.`
118 118
119 119 ##### `ENABLE_DHCP`=true
120 120 Set the system to use DHCP. This requires an DHCP server.
121 121
122 122 ---
123 123
124 124 #### Networking settings (static):
125 125 These parameters are used to set up a static networking configuration in `/etc/systemd/network/eth.network`. The following static networking parameters are only supported if `ENABLE_DHCP` was set to `false`. The default location of network configuration files in the Debian `stretch` release was changed to `/lib/systemd/network`.
126 126
127 127 ##### `NET_ADDRESS`=""
128 128 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
129 129
130 130 ##### `NET_GATEWAY`=""
131 131 Set the IP address for the default gateway.
132 132
133 133 ##### `NET_DNS_1`=""
134 134 Set the IP address for the first DNS server.
135 135
136 136 ##### `NET_DNS_2`=""
137 137 Set the IP address for the second DNS server.
138 138
139 139 ##### `NET_DNS_DOMAINS`=""
140 140 Set the default DNS search domains to use for non fully qualified host names.
141 141
142 142 ##### `NET_NTP_1`=""
143 143 Set the IP address for the first NTP server.
144 144
145 145 ##### `NET_NTP_2`=""
146 146 Set the IP address for the second NTP server.
147 147
148 148 ---
149 149
150 150 #### Basic system features:
151 151 ##### `ENABLE_CONSOLE`=true
152 152 Enable serial console interface. Recommended if no monitor or keyboard is connected to the RPi2/3. In case of problems fe. if the network (auto) configuration failed - the serial console can be used to access the system.
153 153
154 154 ##### `ENABLE_I2C`=false
155 155 Enable I2C interface on the RPi2/3. Please check the [RPi2/3 pinout diagrams](https://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
156 156
157 157 ##### `ENABLE_SPI`=false
158 158 Enable SPI interface on the RPi2/3. Please check the [RPi2/3 pinout diagrams](https://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
159 159
160 160 ##### `ENABLE_IPV6`=true
161 161 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
162 162
163 163 ##### `ENABLE_SSHD`=true
164 164 Install and enable OpenSSH service. The default configuration of the service doesn't allow `root` to login. Please use the user `pi` instead and `su -` or `sudo` to execute commands as root.
165 165
166 166 ##### `ENABLE_NONFREE`=false
167 167 Allow the installation of non-free Debian packages that do not comply with the DFSG. This is required to install closed-source firmware binary blobs.
168 168
169 169 ##### `ENABLE_WIRELESS`=false
170 170 Download and install the [closed-source firmware binary blob](https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm) that is required to run the internal wireless interface of the Raspberry Pi model `3`. This parameter is ignored if the specified `RPI_MODEL` is not `3`.
171 171
172 172 ##### `ENABLE_RSYSLOG`=true
173 173 If set to false, disable and uninstall rsyslog (so logs will be available only
174 174 in journal files)
175 175
176 176 ##### `ENABLE_SOUND`=true
177 177 Enable sound hardware and install Advanced Linux Sound Architecture.
178 178
179 179 ##### `ENABLE_HWRANDOM`=true
180 180 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
181 181
182 182 ##### `ENABLE_MINGPU`=false
183 183 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
184 184
185 185 ##### `ENABLE_DBUS`=true
186 186 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
187 187
188 188 ##### `ENABLE_XORG`=false
189 189 Install Xorg open-source X Window System.
190 190
191 191 ##### `ENABLE_WM`=""
192 192 Install a user defined window manager for the X Window System. To make sure all X related package dependencies are getting installed `ENABLE_XORG` will automatically get enabled if `ENABLE_WM` is used. The `rpi23-gen-image.sh` script has been tested with the following list of window managers: `blackbox`, `openbox`, `fluxbox`, `jwm`, `dwm`, `xfce4`, `awesome`.
193 193
194 194 ---
195 195
196 196 #### Advanced system features:
197 197 ##### `ENABLE_MINBASE`=false
198 198 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
199 199
200 200 ##### `ENABLE_REDUCE`=false
201 201 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
202 202
203 203 ##### `ENABLE_UBOOT`=false
204 204 Replace the default RPi2/3 second stage bootloader (bootcode.bin) with [U-Boot bootloader](https://git.denx.de/?p=u-boot.git;a=summary). U-Boot can boot images via the network using the BOOTP/TFTP protocol.
205 205
206 206 ##### `UBOOTSRC_DIR`=""
207 207 Path to a directory (`u-boot`) of [U-Boot bootloader sources](https://git.denx.de/?p=u-boot.git;a=summary) that will be copied, configured, build and installed inside the chroot.
208 208
209 209 ##### `ENABLE_FBTURBO`=false
210 210 Install and enable the [hardware accelerated Xorg video driver](https://github.com/ssvb/xf86-video-fbturbo) `fbturbo`. Please note that this driver is currently limited to hardware accelerated window moving and scrolling.
211 211
212 212 ##### `FBTURBOSRC_DIR`=""
213 213 Path to a directory (`xf86-video-fbturbo`) of [hardware accelerated Xorg video driver sources](https://github.com/ssvb/xf86-video-fbturbo) that will be copied, configured, build and installed inside the chroot.
214 214
215 215 ##### `ENABLE_VIDEOCORE`=false
216 216 Install and enable the [Source code for ARM side libraries for interfacing to Raspberry Pi GPU](https://github.com/raspberrypi/userland) `vcgencmd`. Please note that this driver is currently limited to hardware accelerated window moving and scrolling.
217 217
218 218 ##### `VIDEOCORESRC_DIR`=""
219 219 Path to a directory (`userland`) of [Source code for ARM side libraries for interfacing to Raspberry Pi GPU](https://github.com/raspberrypi/userland) that will be copied, configured, build and installed inside the chroot.
220 220
221 221 ##### `ENABLE_IPTABLES`=false
222 222 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
223 223
224 224 ##### `ENABLE_USER`=true
225 225 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
226 226
227 227 ##### `USER_NAME`=pi
228 228 Non-root user to create. Ignored if `ENABLE_USER`=false
229 229
230 230 ##### `ENABLE_ROOT`=false
231 231 Set root user password so root login will be enabled
232 232
233 233 ##### `ENABLE_HARDNET`=false
234 234 Enable IPv4/IPv6 network stack hardening settings.
235 235
236 236 ##### `ENABLE_SPLITFS`=false
237 237 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
238 238
239 239 ##### `CHROOT_SCRIPTS`=""
240 240 Path to a directory with scripts that should be run in the chroot before the image is finally built. Every executable file in this directory is run in lexicographical order.
241 241
242 242 ##### `ENABLE_INITRAMFS`=false
243 243 Create an initramfs that that will be loaded during the Linux startup process. `ENABLE_INITRAMFS` will automatically get enabled if `ENABLE_CRYPTFS`=true. This parameter will be ignored if `BUILD_KERNEL`=false.
244 244
245 245 ##### `ENABLE_IFNAMES`=true
246 246 Enable automatic assignment of predictable, stable network interface names for all local Ethernet, WLAN interfaces. This might create complex and long interface names. This parameter is only supported if the Debian releases `stretch` or `buster` are used.
247 247
248 248 ##### `DISABLE_UNDERVOLT_WARNINGS`=
249 249 Disable RPi2/3 under-voltage warnings and overlays. Setting the parameter to `1` will disable the warning overlay. Setting it to `2` will additionally allow RPi2/3 turbo mode when low-voltage is present.
250 250
251 251 ---
252 252
253 253 #### SSH settings:
254 254 ##### `SSH_ENABLE_ROOT`=false
255 255 Enable password root login via SSH. This may be a security risk with default password, use only in trusted environments. `ENABLE_ROOT` must be set to `true`.
256 256
257 257 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
258 258 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
259 259
260 260 ##### `SSH_LIMIT_USERS`=false
261 261 Limit the users that are allowed to login via SSH. Only allow user `USER_NAME`=pi and root if `SSH_ENABLE_ROOT`=true to login. This parameter will be ignored if `dropbear` SSH is used (`REDUCE_SSHD`=true).
262 262
263 263 ##### `SSH_ROOT_PUB_KEY`=""
264 264 Add SSH (v2) public key(s) from specified file to `authorized_keys` file to enable public key based SSH (v2) authentication of user `root`. The specified file can also contain multiple SSH (v2) public keys. SSH protocol version 1 is not supported. `ENABLE_ROOT` **and** `SSH_ENABLE_ROOT` must be set to `true`.
265 265
266 266 ##### `SSH_USER_PUB_KEY`=""
267 267 Add SSH (v2) public key(s) from specified file to `authorized_keys` file to enable public key based SSH (v2) authentication of user `USER_NAME`=pi. The specified file can also contain multiple SSH (v2) public keys. SSH protocol version 1 is not supported.
268 268
269 269 ---
270 270
271 271 #### Kernel compilation:
272 272 ##### `BUILD_KERNEL`=false
273 273 Build and install the latest RPi2/3 Linux kernel. Currently only the default RPi2/3 kernel configuration is used. `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` is used.
274 274
275 275 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
276 276 This sets the cross compile enviornment for the compiler.
277 277
278 278 ##### `KERNEL_ARCH`="arm"
279 279 This sets the kernel architecture for the compiler.
280 280
281 281 ##### `KERNEL_IMAGE`="kernel7.img"
282 282 Name of the image file in the boot partition. If not set, `KERNEL_IMAGE` will be set to "kernel8.img" automatically if building for arm64.
283 283
284 284 ##### `KERNEL_BRANCH`=""
285 285 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
286 286
287 287 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
288 288 Sets the QEMU enviornment for the Debian archive. If not set, `QEMU_BINARY` will be set to "/usr/bin/qemu-aarch64-static" automatically if building for arm64.
289 289
290 290 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
291 291 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
292 292
293 293 ##### `KERNEL_REDUCE`=false
294 294 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
295 295
296 296 ##### `KERNEL_THREADS`=1
297 297 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.
298 298
299 299 ##### `KERNEL_HEADERS`=true
300 300 Install kernel headers with built kernel.
301 301
302 302 ##### `KERNEL_MENUCONFIG`=false
303 303 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
304 304
305 305 ##### `KERNEL_OLDDEFCONFIG`=false
306 306 Run `make olddefconfig` to automatically set all new kernel configuration options to their recommended default values.
307 307
308 308 ##### `KERNEL_CCACHE`=false
309 309 Compile the kernel using ccache. This speeds up kernel recompilation by caching previous compilations and detecting when the same compilation is being done again.
310 310
311 311 ##### `KERNEL_REMOVESRC`=true
312 312 Remove all kernel sources from the generated OS image after it was built and installed.
313 313
314 314 ##### `KERNELSRC_DIR`=""
315 315 Path to a directory (`linux`) of [RaspberryPi Linux kernel sources](https://github.com/raspberrypi/linux) that will be copied, configured, build and installed inside the chroot.
316 316
317 317 ##### `KERNELSRC_CLEAN`=false
318 318 Clean the existing kernel sources directory `KERNELSRC_DIR` (using `make mrproper`) after it was copied to the chroot and before the compilation of the kernel has started. This parameter will be ignored if no `KERNELSRC_DIR` was specified or if `KERNELSRC_PREBUILT`=true.
319 319
320 320 ##### `KERNELSRC_CONFIG`=true
321 321 Run `make bcm2709_defconfig` (and optional `make menuconfig`) to configure the kernel sources before building. This parameter is automatically set to `true` if no existing kernel sources directory was specified using `KERNELSRC_DIR`. This parameter is ignored if `KERNELSRC_PREBUILT`=true.
322 322
323 323 ##### `KERNELSRC_USRCONFIG`=""
324 324 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
325 325
326 326 ##### `KERNELSRC_PREBUILT`=false
327 327 With this parameter set to true the script expects the existing kernel sources directory to be already successfully cross-compiled. The parameters `KERNELSRC_CLEAN`, `KERNELSRC_CONFIG`, `KERNELSRC_USRCONFIG` and `KERNEL_MENUCONFIG` are ignored and no kernel compilation tasks are performed.
328 328
329 329 ##### `RPI_FIRMWARE_DIR`=""
330 330 The directory (`firmware`) containing a local copy of the firmware from the [RaspberryPi firmware project](https://github.com/raspberrypi/firmware). Default is to download the latest firmware directly from the project.
331 331
332 332 ##### `KERNEL_NF`=false
333 333 Enable Netfilter modules as kernel modules
334 334
335 335 ##### `KERNEL_VIRT`=false
336 336 Enable Kernel KVM support (/dev/kvm)
337 337
338 338 ##### `KERNEL_ZSWAP`=false
339 339 Enable Kernel Zswap support. Best use on high RAM load and mediocre CPU load usecases
340 340
341 341 ##### `KERNEL_BPF`=true
342 342 Allow attaching eBPF programs to a cgroup using the bpf syscall (CONFIG_BPF_SYSCALL CONFIG_CGROUP_BPF) [systemd compilations about it - File /lib/systemd/system/systemd-journald.server:36 configures an IP firewall (IPAddressDeny=all), but the local system does not support BPF/cgroup based firewalls]
343 343
344 344 ---
345 345
346 346 #### Reduce disk usage:
347 347 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
348 348
349 349 ##### `REDUCE_APT`=true
350 350 Configure APT to use compressed package repository lists and no package caching files.
351 351
352 352 ##### `REDUCE_DOC`=true
353 353 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
354 354
355 355 ##### `REDUCE_MAN`=true
356 356 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
357 357
358 358 ##### `REDUCE_VIM`=false
359 359 Replace `vim-tiny` package by `levee` a tiny vim clone.
360 360
361 361 ##### `REDUCE_BASH`=false
362 362 Remove `bash` package and switch to `dash` shell (experimental).
363 363
364 364 ##### `REDUCE_HWDB`=true
365 365 Remove PCI related hwdb files (experimental).
366 366
367 367 ##### `REDUCE_SSHD`=true
368 368 Replace `openssh-server` with `dropbear`.
369 369
370 370 ##### `REDUCE_LOCALE`=true
371 371 Remove all `locale` translation files.
372 372
373 373 ---
374 374
375 375 #### Encrypted root partition:
376 376 ##### `ENABLE_CRYPTFS`=false
377 377 Enable full system encryption with dm-crypt. Setup a fully LUKS encrypted root partition (aes-xts-plain64:sha512) and generate required initramfs. The /boot directory will not be encrypted. This parameter will be ignored if `BUILD_KERNEL`=false. `ENABLE_CRYPTFS` is experimental. SSH-to-initramfs is currently not supported but will be soon - feel free to help.
378 378
379 379 ##### `CRYPTFS_PASSWORD`=""
380 380 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
381 381
382 382 ##### `CRYPTFS_MAPPING`="secure"
383 383 Set name of dm-crypt managed device-mapper mapping.
384 384
385 385 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
386 386 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
387 387
388 388 ##### `CRYPTFS_XTSKEYSIZE`=512
389 389 Sets key size in bits. The argument has to be a multiple of 8.
390 390
391 391 ---
392 392
393 393 #### Build settings:
394 394 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
395 395 Set a path to a working directory used by the script to generate an image.
396 396
397 397 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
398 398 Set a filename for the output file(s). Note: the script will create $IMAGE_NAME.img if `ENABLE_SPLITFS`=false or $IMAGE_NAME-frmw.img and $IMAGE_NAME-root.img if `ENABLE_SPLITFS`=true. Note 2: If the KERNEL_BRANCH is not set, the word "CURRENT" is used.
399 399
400 400 ## Understanding the script
401 401 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:
402 402
403 403 | Script | Description |
404 404 | --- | --- |
405 405 | `10-bootstrap.sh` | Debootstrap basic system |
406 406 | `11-apt.sh` | Setup APT repositories |
407 407 | `12-locale.sh` | Setup Locales and keyboard settings |
408 408 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
409 409 | `14-fstab.sh` | Setup fstab and initramfs |
410 410 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
411 411 | `20-networking.sh` | Setup Networking |
412 412 | `21-firewall.sh` | Setup Firewall |
413 413 | `30-security.sh` | Setup Users and Security settings |
414 414 | `31-logging.sh` | Setup Logging |
415 415 | `32-sshd.sh` | Setup SSH and public keys |
416 416 | `41-uboot.sh` | Build and Setup U-Boot |
417 417 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
418 418 | `50-firstboot.sh` | First boot actions |
419 419 | `99-reduce.sh` | Reduce the disk space usage |
420 420
421 421 All the required configuration files that will be copied to the generated OS image are located inside the `files` directory. It is not recommended to modify these configuration files manually.
422 422
423 423 | Directory | Description |
424 424 | --- | --- |
425 425 | `apt` | APT management configuration files |
426 426 | `boot` | Boot and RPi2/3 configuration files |
427 427 | `dpkg` | Package Manager configuration |
428 428 | `etc` | Configuration files and rc scripts |
429 429 | `firstboot` | Scripts that get executed on first boot |
430 430 | `initramfs` | Initramfs scripts |
431 431 | `iptables` | Firewall configuration files |
432 432 | `locales` | Locales configuration |
433 433 | `modules` | Kernel Modules configuration |
434 434 | `mount` | Fstab configuration |
435 435 | `network` | Networking configuration files |
436 436 | `sysctl.d` | Swapping and Network Hardening configuration |
437 437 | `xorg` | fbturbo Xorg driver configuration |
438 438
439 439 ## Custom packages and scripts
440 440 Debian custom packages, i.e. those not in the debian repositories, can be installed by placing them in the `packages` directory. They are installed immediately after packages from the repositories are installed. Any dependencies listed in the custom packages will be downloaded automatically from the repositories. Do not list these custom packages in `APT_INCLUDES`.
441 441
442 442 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
443 443
444 444 ## Logging of the bootstrapping process
445 445 All information related to the bootstrapping process and the commands executed by the `rpi23-gen-image.sh` script can easily be saved into a logfile. The common shell command `script` can be used for this purpose:
446 446
447 447 ```shell
448 448 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
449 449 ```
450 450
451 451 ## Flashing the image file
452 452 After the image file was successfully created by the `rpi23-gen-image.sh` script it can be copied to the microSD card that will be used by the RPi2/3 computer. This can be performed by using the tools `bmaptool` or `dd`. Using `bmaptool` will probably speed-up the copy process because `bmaptool` copies more wisely than `dd`.
453 453
454 454 ##### Flashing examples:
455 455 ```shell
456 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie.img /dev/mmcblk0
457 dd bs=4M if=./images/jessie/2017-01-23-rpi3-jessie.img of=/dev/mmcblk0
456 bmaptool copy ./images/buster/2017-01-23-rpi3-buster.img /dev/mmcblk0
457 dd bs=4M if=./images/buster/2017-01-23-rpi3-buster.img of=/dev/mmcblk0
458 458 ```
459 459 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
460 460 ```shell
461 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-frmw.img /dev/mmcblk0
462 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-root.img /dev/sdc
461 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-frmw.img /dev/mmcblk0
462 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-root.img /dev/sdc
463 463 ```
464 464
465 465 ## QEMU emulation
466 466 Start QEMU full system emulation:
467 467 ```shell
468 468 qemu-system-arm -m 2048M -M vexpress-a15 -cpu cortex-a15 -kernel kernel7.img -no-reboot -dtb vexpress-v2p-ca15_a7.dtb -sd ${IMAGE_NAME}.qcow2 -append "root=/dev/mmcblk0p2 rw rootfstype=ext4 console=tty1"
469 469 ```
470 470
471 471 Start QEMU full system emulation and output to console:
472 472 ```shell
473 473 qemu-system-arm -m 2048M -M vexpress-a15 -cpu cortex-a15 -kernel kernel7.img -no-reboot -dtb vexpress-v2p-ca15_a7.dtb -sd ${IMAGE_NAME}.qcow2 -append "root=/dev/mmcblk0p2 rw rootfstype=ext4 console=ttyAMA0,115200 init=/bin/systemd" -serial stdio
474 474 ```
475 475
476 476 Start QEMU full system emulation with SMP and output to console:
477 477 ```shell
478 478 qemu-system-arm -m 2048M -M vexpress-a15 -cpu cortex-a15 -smp cpus=2,maxcpus=2 -kernel kernel7.img -no-reboot -dtb vexpress-v2p-ca15_a7.dtb -sd ${IMAGE_NAME}.qcow2 -append "root=/dev/mmcblk0p2 rw rootfstype=ext4 console=ttyAMA0,115200 init=/bin/systemd" -serial stdio
479 479 ```
480 480
481 481 Start QEMU full system emulation with cryptfs, initramfs and output to console:
482 482 ```shell
483 483 qemu-system-arm -m 2048M -M vexpress-a15 -cpu cortex-a15 -kernel kernel7.img -no-reboot -dtb vexpress-v2p-ca15_a7.dtb -sd ${IMAGE_NAME}.qcow2 -initrd "initramfs-${KERNEL_VERSION}" -append "root=/dev/mapper/secure cryptdevice=/dev/mmcblk0p2:secure rw rootfstype=ext4 console=ttyAMA0,115200 init=/bin/systemd" -serial stdio
484 484 ```
485 485
486 486 ## Weekly image builds
487 487 The image files are provided by JRWR'S I/O PORT and are built once a Sunday at midnight UTC!
488 488 * [Debian Stretch Raspberry Pi2/3 Weekly Image Builds](https://jrwr.io/doku.php?id=projects:debianpi)
489 489
490 490 ## External links and references
491 491 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
492 492 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
493 493 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
494 494 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
495 495 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
496 496 * [U-BOOT git repository](https://git.denx.de/?p=u-boot.git;a=summary)
497 497 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
498 498 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
499 499 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,214 +1,209
1 1 #
2 2 # Setup RPi2/3 config and cmdline
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 if [ "$BUILD_KERNEL" = true ] ; then
9 9 if [ -n "$RPI_FIRMWARE_DIR" ] && [ -d "$RPI_FIRMWARE_DIR" ] ; then
10 10 # Install boot binaries from local directory
11 11 cp "${RPI_FIRMWARE_DIR}"/boot/bootcode.bin "${BOOT_DIR}"/bootcode.bin
12 12 cp "${RPI_FIRMWARE_DIR}"/boot/fixup.dat "${BOOT_DIR}"/fixup.dat
13 13 cp "${RPI_FIRMWARE_DIR}"/boot/fixup_cd.dat "${BOOT_DIR}"/fixup_cd.dat
14 14 cp "${RPI_FIRMWARE_DIR}"/boot/fixup_x.dat "${BOOT_DIR}"/fixup_x.dat
15 15 cp "${RPI_FIRMWARE_DIR}"/boot/start.elf "${BOOT_DIR}"/start.elf
16 16 cp "${RPI_FIRMWARE_DIR}"/boot/start_cd.elf "${BOOT_DIR}"/start_cd.elf
17 17 cp "${RPI_FIRMWARE_DIR}"/boot/start_x.elf "${BOOT_DIR}"/start_x.elf
18 18 else
19 19 # Create temporary directory for boot binaries
20 20 temp_dir=$(as_nobody mktemp -d)
21 21
22 22 # Install latest boot binaries from raspberry/firmware github
23 23 as_nobody wget -q -O "${temp_dir}/bootcode.bin" "${FIRMWARE_URL}/bootcode.bin"
24 24 as_nobody wget -q -O "${temp_dir}/fixup.dat" "${FIRMWARE_URL}/fixup.dat"
25 25 as_nobody wget -q -O "${temp_dir}/fixup_cd.dat" "${FIRMWARE_URL}/fixup_cd.dat"
26 26 as_nobody wget -q -O "${temp_dir}/fixup_x.dat" "${FIRMWARE_URL}/fixup_x.dat"
27 27 as_nobody wget -q -O "${temp_dir}/start.elf" "${FIRMWARE_URL}/start.elf"
28 28 as_nobody wget -q -O "${temp_dir}/start_cd.elf" "${FIRMWARE_URL}/start_cd.elf"
29 29 as_nobody wget -q -O "${temp_dir}/start_x.elf" "${FIRMWARE_URL}/start_x.elf"
30 30
31 31 # Move downloaded boot binaries
32 32 mv "${temp_dir}/"* "${BOOT_DIR}/"
33 33
34 34 # Remove temporary directory for boot binaries
35 35 rm -fr "${temp_dir}"
36 36
37 37 # Set permissions of the boot binaries
38 38 chown -R root:root "${BOOT_DIR}"
39 39 chmod -R 600 "${BOOT_DIR}"
40 40 fi
41 41 fi
42 42
43 43 # Setup firmware boot cmdline
44 44 if [ "$ENABLE_UBOOTUSB" = true ] ; then
45 45 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/sda2 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
46 46 else
47 47 if [ "$ENABLE_SPLITFS" = true ] ; then
48 48 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
49 49 else
50 50 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
51 51 fi
52 52 fi
53 53
54 54
55 55
56 56 # Add encrypted root partition to cmdline.txt
57 57 if [ "$ENABLE_CRYPTFS" = true ] ; then
58 58 if [ "$ENABLE_SPLITFS" = true ] ; then
59 59 CMDLINE=$(echo "${CMDLINE}" | sed "s/sda1/mapper\/${CRYPTFS_MAPPING} cryptdevice=\/dev\/sda1:${CRYPTFS_MAPPING}/")
60 60 else
61 61 if [ "$ENABLE_UBOOTUSB" = true ] ; then
62 62 CMDLINE=$(echo "${CMDLINE}" | sed "s/sda2/mapper\/${CRYPTFS_MAPPING} cryptdevice=\/dev\/sda2:${CRYPTFS_MAPPING}/")
63 63 else
64 64 CMDLINE=$(echo "${CMDLINE}" | sed "s/mmcblk0p2/mapper\/${CRYPTFS_MAPPING} cryptdevice=\/dev\/mmcblk0p2:${CRYPTFS_MAPPING}/")
65 65 fi
66 66 fi
67 67 fi
68 68
69 69 # Add serial console support
70 70 if [ "$ENABLE_CONSOLE" = true ] ; then
71 71 CMDLINE="${CMDLINE} console=ttyAMA0,115200 kgdboc=ttyAMA0,115200"
72 72 fi
73 73
74 74 # Remove IPv6 networking support
75 75 if [ "$ENABLE_IPV6" = false ] ; then
76 76 CMDLINE="${CMDLINE} ipv6.disable=1"
77 77 fi
78 78
79 79 # Automatically assign predictable network interface names
80 80 if [ "$ENABLE_IFNAMES" = false ] ; then
81 81 CMDLINE="${CMDLINE} net.ifnames=0"
82 82 else
83 83 CMDLINE="${CMDLINE} net.ifnames=1"
84 84 fi
85 85
86 # Set init to systemd if required by Debian release
87 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
88 CMDLINE="${CMDLINE} init=/bin/systemd"
89 fi
90
91 86 # Install firmware boot cmdline
92 87 echo "${CMDLINE}" > "${BOOT_DIR}/cmdline.txt"
93 88
94 89 # Install firmware config
95 90 install_readonly files/boot/config.txt "${BOOT_DIR}/config.txt"
96 91
97 92 # Setup minimal GPU memory allocation size: 16MB (no X)
98 93 if [ "$ENABLE_MINGPU" = true ] ; then
99 94 echo "gpu_mem=16" >> "${BOOT_DIR}/config.txt"
100 95 fi
101 96
102 97 # Setup boot with initramfs
103 98 if [ "$ENABLE_INITRAMFS" = true ] ; then
104 99 echo "initramfs initramfs-${KERNEL_VERSION} followkernel" >> "${BOOT_DIR}/config.txt"
105 100 fi
106 101
107 102 # Disable RPi3 Bluetooth and restore ttyAMA0 serial device
108 103 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] || [ "$RPI_MODEL" = 3P ]; then
109 104 if [ "$ENABLE_CONSOLE" = true ] && [ "$ENABLE_UBOOT" = false ] ; then
110 105 echo "dtoverlay=pi3-disable-bt" >> "${BOOT_DIR}/config.txt"
111 106 echo "enable_uart=1" >> "${BOOT_DIR}/config.txt"
112 107 else
113 108 # Create temporary directory for Bluetooth sources
114 109 temp_dir=$(as_nobody mktemp -d)
115 110
116 111 # Fetch Bluetooth sources
117 112 as_nobody git -C "${temp_dir}" clone "${BLUETOOTH_URL}"
118 113
119 114 # Copy downloaded sources
120 115 mv "${temp_dir}/pi-bluetooth" "${R}/tmp/"
121 116
122 117 # Raspberry-sys-mod package for /dev/serial device needed by bluetooth service
123 118 wget -O "${R}/tmp/pi-bluetooth/99-com.rules" https://raw.githubusercontent.com/RPi-Distro/raspberrypi-sys-mods/master/etc.armhf/udev/rules.d/99-com.rules
124 119
125 120 # Bluetooth firmware from arch aur https://aur.archlinux.org/packages/pi-bluetooth/
126 121 wget -O "${R}/tmp/pi-bluetooth/LICENCE.broadcom_bcm43xx" https://aur.archlinux.org/cgit/aur.git/plain/LICENCE.broadcom_bcm43xx?h=pi-bluetooth
127 122 wget -O "${R}/tmp/pi-bluetooth/BCM43430A1.hcd" https://aur.archlinux.org/cgit/aur.git/plain/BCM43430A1.hcd?h=pi-bluetooth
128 123
129 124 # Set permissions
130 125 chown -R root:root "${R}/tmp/pi-bluetooth"
131 126
132 127 # Install files to chroot
133 128 # Install tools
134 129 install_readonly "${R}/tmp/pi-bluetooth/usr/bin/btuart" "${R}/usr/bin/btuart"
135 130 install_readonly "${R}/tmp/pi-bluetooth/usr/bin/bthelper" "${R}/usr/bin/bthelper"
136 131
137 132 # Install bluetooth udev rule
138 133 install_readonly "${R}/tmp/pi-bluetooth/lib/udev/rules.d/90-pi-bluetooth.rules" "${LIB_DIR}/udev/rules.d/90-pi-bluetooth.rules"
139 134 # aur
140 135 # install_readonly "${R}/tmp/pi-bluetooth/50-bluetooth-hci-auto-poweron.rules" "${ETC_DIR}/udev/rules.d/50-bluetooth-hci-auto-poweron.rules"
141 136
142 137 # Install Firmware Flash file and apropiate licence
143 138 mkdir "${ETC_DIR}/firmware/"
144 139
145 140 # Install firmware and licence
146 141 # install_readonly "${R}/tmp/pi-bluetooth/LICENCE.broadcom_bcm43xx" "${ETC_DIR}/firmware/LICENCE.broadcom_bcm43xx"
147 142 # install_readonly "${R}/tmp/pi-bluetooth/BCM43430A1.hcd" "${ETC_DIR}/firmware/BCM43430A1.hcd"
148 143 install_readonly "${R}/tmp/pi-bluetooth/LICENCE.broadcom_bcm43xx" "${ETC_DIR}/firmware/LICENCE.broadcom_bcm43xx"
149 144 install_readonly "${R}/tmp/pi-bluetooth/BCM43430A1.hcd" "${ETC_DIR}/firmware/LICENCE.broadcom_bcm43xx"
150 145
151 146 # Install systemd service for bluetooth
152 147 # install_readonly "${R}/tmp/pi-bluetooth/brcm43438.service" "${ETC_DIR}/systemd/system/brcm43438.service"
153 148 install_readonly "${R}/tmp/pi-bluetooth/debian/pi-bluetooth.bthelper@.service" "${ETC_DIR}/systemd/system/pi-bluetooth.bthelper@.service"
154 149 install_readonly "${R}/tmp/pi-bluetooth/debian/pi-bluetooth.hciuart.service" "${ETC_DIR}/systemd/system/pi-bluetooth.hciuart.service"
155 150
156 151
157 152 install_readonly "${R}/tmp/pi-bluetooth/99-com.rules" "${ETC_DIR}/udev/rules.d/99-com.rules"
158 153
159 154 # Remove temporary directory
160 155 rm -fr "${temp_dir}"
161 156
162 157 # Get /dev/serial back for compability
163 158
164 159
165 160 fi
166 161 fi
167 162
168 163 # Create firmware configuration and cmdline symlinks
169 164 ln -sf firmware/config.txt "${R}/boot/config.txt"
170 165 ln -sf firmware/cmdline.txt "${R}/boot/cmdline.txt"
171 166
172 167 # Install and setup kernel modules to load at boot
173 168 mkdir -p "${LIB_DIR}/modules-load.d/"
174 169 install_readonly files/modules/rpi2.conf "${LIB_DIR}/modules-load.d/rpi2.conf"
175 170
176 171 # Load hardware random module at boot
177 172 if [ "$ENABLE_HWRANDOM" = true ] && [ "$BUILD_KERNEL" = false ] ; then
178 173 sed -i "s/^# bcm2708_rng/bcm2708_rng/" "${LIB_DIR}/modules-load.d/rpi2.conf"
179 174 fi
180 175
181 176 # Load sound module at boot
182 177 if [ "$ENABLE_SOUND" = true ] ; then
183 178 sed -i "s/^# snd_bcm2835/snd_bcm2835/" "${LIB_DIR}/modules-load.d/rpi2.conf"
184 179 else
185 180 echo "dtparam=audio=off" >> "${BOOT_DIR}/config.txt"
186 181 fi
187 182
188 183 # Enable I2C interface
189 184 if [ "$ENABLE_I2C" = true ] ; then
190 185 echo "dtparam=i2c_arm=on" >> "${BOOT_DIR}/config.txt"
191 186 sed -i "s/^# i2c-bcm2708/i2c-bcm2708/" "${LIB_DIR}/modules-load.d/rpi2.conf"
192 187 sed -i "s/^# i2c-dev/i2c-dev/" "${LIB_DIR}/modules-load.d/rpi2.conf"
193 188 fi
194 189
195 190 # Enable SPI interface
196 191 if [ "$ENABLE_SPI" = true ] ; then
197 192 echo "dtparam=spi=on" >> "${BOOT_DIR}/config.txt"
198 193 echo "spi-bcm2708" >> "${LIB_DIR}/modules-load.d/rpi2.conf"
199 194 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ]; then
200 195 sed -i "s/spi-bcm2708/spi-bcm2835/" "${LIB_DIR}/modules-load.d/rpi2.conf"
201 196 fi
202 197 fi
203 198
204 199 # Disable RPi2/3 under-voltage warnings
205 200 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
206 201 echo "avoid_warnings=${DISABLE_UNDERVOLT_WARNINGS}" >> "${BOOT_DIR}/config.txt"
207 202 fi
208 203
209 204 # Install kernel modules blacklist
210 205 mkdir -p "${ETC_DIR}/modprobe.d/"
211 206 install_readonly files/modules/raspi-blacklist.conf "${ETC_DIR}/modprobe.d/raspi-blacklist.conf"
212 207
213 208 # Install sysctl.d configuration files
214 209 install_readonly files/sysctl.d/81-rpi-vm.conf "${ETC_DIR}/sysctl.d/81-rpi-vm.conf"
@@ -1,134 +1,133
1 1 #
2 2 # Setup Networking
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Install and setup hostname
9 9 install_readonly files/network/hostname "${ETC_DIR}/hostname"
10 sed -i "s/^rpi2-jessie/${HOSTNAME}/" "${ETC_DIR}/hostname"
10 sed -i "s/^RaspberryPI/${HOSTNAME}/" "${ETC_DIR}/hostname"
11 11
12 12 # Install and setup hosts
13 13 install_readonly files/network/hosts "${ETC_DIR}/hosts"
14 sed -i "s/rpi2-jessie/${HOSTNAME}/" "${ETC_DIR}/hosts"
14 sed -i "s/RaspberryPI/${HOSTNAME}/" "${ETC_DIR}/hosts"
15 15
16 16 # Setup hostname entry with static IP
17 17 if [ "$NET_ADDRESS" != "" ] ; then
18 18 NET_IP=$(echo "${NET_ADDRESS}" | cut -f 1 -d'/')
19 19 sed -i "s/^127.0.1.1/${NET_IP}/" "${ETC_DIR}/hosts"
20 20 fi
21 21
22 22 # Remove IPv6 hosts
23 23 if [ "$ENABLE_IPV6" = false ] ; then
24 24 sed -i -e "/::[1-9]/d" -e "/^$/d" "${ETC_DIR}/hosts"
25 25 fi
26 26
27 27 # Install hint about network configuration
28 28 install_readonly files/network/interfaces "${ETC_DIR}/network/interfaces"
29 29
30 30 # Install configuration for interface eth0
31 31 install_readonly files/network/eth.network "${ETC_DIR}/systemd/network/eth.network"
32 32
33 33 # Install configuration for interface wl*
34 34 install_readonly files/network/wlan.network "${ETC_DIR}/systemd/network/wlan.network"
35 35
36 36 #always with dhcp since wpa_supplicant integration is missing
37 37 sed -i -e "s/DHCP=.*/DHCP=yes/" -e "/DHCP/q" "${ETC_DIR}/systemd/network/wlan.network"
38 38
39 39 if [ "$ENABLE_DHCP" = true ] ; then
40 40 # Enable DHCP configuration for interface eth0
41 41 sed -i -e "s/DHCP=.*/DHCP=yes/" -e "/DHCP/q" "${ETC_DIR}/systemd/network/eth.network"
42 42
43 43 # Set DHCP configuration to IPv4 only
44 44 if [ "$ENABLE_IPV6" = false ] ; then
45 45 sed -i "s/DHCP=.*/DHCP=v4/" "${ETC_DIR}/systemd/network/eth.network"
46 46 fi
47 47
48 48 else # ENABLE_DHCP=false
49 49 # Set static network configuration for interface eth0
50 50 sed -i\
51 51 -e "s|DHCP=.*|DHCP=no|"\
52 52 -e "s|Address=\$|Address=${NET_ADDRESS}|"\
53 53 -e "s|Gateway=\$|Gateway=${NET_GATEWAY}|"\
54 54 -e "0,/DNS=\$/ s|DNS=\$|DNS=${NET_DNS_1}|"\
55 55 -e "0,/DNS=\$/ s|DNS=\$|DNS=${NET_DNS_2}|"\
56 56 -e "s|Domains=\$|Domains=${NET_DNS_DOMAINS}|"\
57 57 -e "0,/NTP=\$/ s|NTP=\$|NTP=${NET_NTP_1}|"\
58 58 -e "0,/NTP=\$/ s|NTP=\$|NTP=${NET_NTP_2}|"\
59 59 "${ETC_DIR}/systemd/network/eth.network"
60 60 fi
61 61
62 62 # Remove empty settings from network configuration
63 63 sed -i "/.*=\$/d" "${ETC_DIR}/systemd/network/eth.network"
64 64 # Remove empty settings from wlan configuration
65 65 sed -i "/.*=\$/d" "${ETC_DIR}/systemd/network/wlan.network"
66 66
67 67 # Move systemd network configuration if required by Debian release
68 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
69 mv -v "${ETC_DIR}/systemd/network/eth.network" "${LIB_DIR}/systemd/network/10-eth.network"
70 if [ "$ENABLE_WIRELESS" = true ] ; then
71 mv -v "${ETC_DIR}/systemd/network/wlan.network" "${LIB_DIR}/systemd/network/11-wlan.network"
72 fi
73 rm -fr "${ETC_DIR}/systemd/network"
68 mv -v "${ETC_DIR}/systemd/network/eth.network" "${LIB_DIR}/systemd/network/10-eth.network"
69 # If WLAN is enabled copy wlan configuration too
70 if [ "$ENABLE_WIRELESS" = true ] ; then
71 mv -v "${ETC_DIR}/systemd/network/wlan.network" "${LIB_DIR}/systemd/network/11-wlan.network"
74 72 fi
73 rm -fr "${ETC_DIR}/systemd/network"
75 74
76 75 # Enable systemd-networkd service
77 76 chroot_exec systemctl enable systemd-networkd
78 77
79 78 # Install host.conf resolver configuration
80 79 install_readonly files/network/host.conf "${ETC_DIR}/host.conf"
81 80
82 81 # Enable network stack hardening
83 82 if [ "$ENABLE_HARDNET" = true ] ; then
84 83 # Install sysctl.d configuration files
85 84 install_readonly files/sysctl.d/82-rpi-net-hardening.conf "${ETC_DIR}/sysctl.d/82-rpi-net-hardening.conf"
86 85
87 86 # Setup resolver warnings about spoofed addresses
88 87 sed -i "s/^# spoof warn/spoof warn/" "${ETC_DIR}/host.conf"
89 88 fi
90 89
91 90 # Enable time sync
92 91 if [ "$NET_NTP_1" != "" ] ; then
93 92 chroot_exec systemctl enable systemd-timesyncd.service
94 93 fi
95 94
96 95 # Download the firmware binary blob required to use the RPi3 wireless interface
97 96 if [ "$ENABLE_WIRELESS" = true ] ; then
98 97 if [ ! -d "${WLAN_FIRMWARE_DIR}" ] ; then
99 98 mkdir -p "${WLAN_FIRMWARE_DIR}"
100 99 fi
101 100
102 101 # Create temporary directory for firmware binary blob
103 102 temp_dir=$(as_nobody mktemp -d)
104 103
105 104 # Fetch firmware binary blob for RPI3B+
106 105 if [ "$RPI_MODEL" = 3P ] ; then
107 106 as_nobody wget -q -O "${temp_dir}/brcmfmac43455-sdio.bin" "${WLAN_FIRMWARE_URL}/brcmfmac43455-sdio.bin"
108 107 as_nobody wget -q -O "${temp_dir}/brcmfmac43455-sdio.txt" "${WLAN_FIRMWARE_URL}/brcmfmac43455-sdio.txt"
109 108 as_nobody wget -q -O "${temp_dir}/brcmfmac43455-sdio.clm_blob" "${WLAN_FIRMWARE_URL}/brcmfmac43455-sdio.clm_blob"
110 109 elif [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 0 ] ; then
111 110 # Fetch firmware binary blob for RPI3
112 111 as_nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.bin" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.bin"
113 112 as_nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.txt" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.txt"
114 113 fi
115 114
116 115 # Move downloaded firmware binary blob
117 116 if [ "$RPI_MODEL" = 3P ] ; then
118 117 mv "${temp_dir}/brcmfmac43455-sdio."* "${WLAN_FIRMWARE_DIR}/"
119 118 elif [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 0 ] ; then
120 119 mv "${temp_dir}/brcmfmac43430-sdio."* "${WLAN_FIRMWARE_DIR}/"
121 120 fi
122 121
123 122 # Remove temporary directory for firmware binary blob
124 123 rm -fr "${temp_dir}"
125 124
126 125 # Set permissions of the firmware binary blob
127 126 if [ "$RPI_MODEL" = 3P ] ; then
128 127 chown root:root "${WLAN_FIRMWARE_DIR}/brcmfmac43455-sdio."*
129 128 chmod 600 "${WLAN_FIRMWARE_DIR}/brcmfmac43455-sdio."*
130 129 elif [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 0 ] ; then
131 130 chown root:root "${WLAN_FIRMWARE_DIR}/brcmfmac43430-sdio."*
132 131 chmod 600 "${WLAN_FIRMWARE_DIR}/brcmfmac43430-sdio."*
133 132 fi
134 133 fi
@@ -1,50 +1,48
1 1 #
2 2 # Setup Firewall
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 if [ "$ENABLE_IPTABLES" = true ] ; then
9 9 # Create iptables configuration directory
10 10 mkdir -p "${ETC_DIR}/iptables"
11 11
12 12 # make sure iptables-legacy is the used alternatives
13 13 #iptables-save and -restore are slaves of iptables and thus are set accordingly
14 if ! [ "$RELEASE" = jessie ] ; then
15 chroot_exec update-alternatives --verbose --set iptables /usr/sbin/iptables-legacy
16 fi
14 chroot_exec update-alternatives --verbose --set iptables /usr/sbin/iptables-legacy
17 15
18 16 # Install iptables systemd service
19 17 install_readonly files/iptables/iptables.service "${ETC_DIR}/systemd/system/iptables.service"
20 18
21 19 # Install flush-table script called by iptables service
22 20 install_exec files/iptables/flush-iptables.sh "${ETC_DIR}/iptables/flush-iptables.sh"
23 21
24 22 # Install iptables rule file
25 23 install_readonly files/iptables/iptables.rules "${ETC_DIR}/iptables/iptables.rules"
26 24
27 25 # Reload systemd configuration and enable iptables service
28 26 chroot_exec systemctl daemon-reload
29 27 chroot_exec systemctl enable iptables.service
30 28
31 29 if [ "$ENABLE_IPV6" = true ] ; then
32 30 # Install ip6tables systemd service
33 31 install_readonly files/iptables/ip6tables.service "${ETC_DIR}/systemd/system/ip6tables.service"
34 32
35 33 # Install ip6tables file
36 34 install_exec files/iptables/flush-ip6tables.sh "${ETC_DIR}/iptables/flush-ip6tables.sh"
37 35
38 36 install_readonly files/iptables/ip6tables.rules "${ETC_DIR}/iptables/ip6tables.rules"
39 37
40 38 # Reload systemd configuration and enable iptables service
41 39 chroot_exec systemctl daemon-reload
42 40 chroot_exec systemctl enable ip6tables.service
43 41 fi
44 42
45 43 if [ "$ENABLE_SSHD" = false ] ; then
46 44 # Remove SSHD related iptables rules
47 45 sed -i "/^#/! {/SSH/ s/^/# /}" "${ETC_DIR}/iptables/iptables.rules" 2> /dev/null
48 46 sed -i "/^#/! {/SSH/ s/^/# /}" "${ETC_DIR}/iptables/ip6tables.rules" 2> /dev/null
49 47 fi
50 48 fi
@@ -1,51 +1,47
1 1 #
2 2 # Build and Setup fbturbo Xorg driver
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 if [ "$ENABLE_FBTURBO" = true ] ; then
9 9 # Install c/c++ build environment inside the chroot
10 10 chroot_install_cc
11 11
12 12 # Copy existing fbturbo sources into chroot directory
13 13 if [ -n "$FBTURBOSRC_DIR" ] && [ -d "$FBTURBOSRC_DIR" ] ; then
14 14 # Copy local fbturbo sources
15 15 cp -r "${FBTURBOSRC_DIR}" "${R}/tmp"
16 16 else
17 17 # Create temporary directory for fbturbo sources
18 18 temp_dir=$(as_nobody mktemp -d)
19 19
20 20 # Fetch fbturbo sources
21 21 as_nobody git -C "${temp_dir}" clone "${FBTURBO_URL}"
22 22
23 23 # Move downloaded fbturbo sources
24 24 mv "${temp_dir}/xf86-video-fbturbo" "${R}/tmp/"
25 25
26 26 # Remove temporary directory for fbturbo sources
27 27 rm -fr "${temp_dir}"
28 28 fi
29 29
30 30 # Install Xorg build dependencies
31 if [ "$RELEASE" = "jessie" ] ; then
32 chroot_exec apt-get -q -y --no-install-recommends install xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
33 elif [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
34 chroot_exec apt-get -q -y --no-install-recommends --allow-unauthenticated install xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
35 fi
31 chroot_exec apt-get -q -y --no-install-recommends --allow-unauthenticated install xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
36 32
37 33 # Build and install fbturbo driver inside chroot
38 34 chroot_exec /bin/bash -x <<'EOF'
39 35 cd /tmp/xf86-video-fbturbo
40 36 autoreconf -vi
41 37 ./configure --prefix=/usr
42 38 make
43 39 make install
44 40 EOF
45 41
46 42 # Install fbturbo driver Xorg configuration
47 43 install_readonly files/xorg/99-fbturbo.conf "${R}/usr/share/X11/xorg.conf.d/99-fbturbo.conf"
48 44
49 45 # Remove Xorg build dependencies
50 46 chroot_exec apt-get -qq -y --auto-remove purge xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
51 47 fi
@@ -1,85 +1,76
1 1 #
2 2 # Reduce system disk usage
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Reduce the image size by various operations
9 9 if [ "$ENABLE_REDUCE" = true ] ; then
10 10 if [ "$REDUCE_APT" = true ] ; then
11 11 # Install dpkg configuration file
12 12 if [ "$REDUCE_DOC" = true ] || [ "$REDUCE_MAN" = true ] ; then
13 13 install_readonly files/dpkg/01nodoc "${ETC_DIR}/dpkg/dpkg.cfg.d/01nodoc"
14 14 fi
15 15
16 16 # Install APT configuration files
17 17 install_readonly files/apt/02nocache "${ETC_DIR}/apt/apt.conf.d/02nocache"
18 18 install_readonly files/apt/03compress "${ETC_DIR}/apt/apt.conf.d/03compress"
19 19 install_readonly files/apt/04norecommends "${ETC_DIR}/apt/apt.conf.d/04norecommends"
20 20
21 21 # Remove APT cache files
22 22 rm -fr "${R}/var/cache/apt/pkgcache.bin"
23 23 rm -fr "${R}/var/cache/apt/srcpkgcache.bin"
24 24 fi
25 25
26 26 # Remove all doc files
27 27 if [ "$REDUCE_DOC" = true ] ; then
28 28 find "${R}/usr/share/doc" -depth -type f ! -name copyright -print0 | xargs -0 rm || true
29 29 find "${R}/usr/share/doc" -empty -print0 | xargs -0 rmdir || true
30 30 fi
31 31
32 32 # Remove all man pages and info files
33 33 if [ "$REDUCE_MAN" = true ] ; then
34 34 rm -rf "${R}/usr/share/man" "${R}/usr/share/groff" "${R}/usr/share/info" "${R}/usr/share/lintian" "${R}/usr/share/linda" "${R}/var/cache/man"
35 35 fi
36 36
37 37 # Remove all locale translation files
38 38 if [ "$REDUCE_LOCALE" = true ] ; then
39 39 find "${R}/usr/share/locale" -mindepth 1 -maxdepth 1 ! -name 'en' -print0 | xargs -0 rm -r
40 40 fi
41 41
42 42 # Remove hwdb PCI device classes (experimental)
43 43 if [ "$REDUCE_HWDB" = true ] ; then
44 44 rm -fr "/lib/udev/hwdb.d/20-pci-*"
45 45 fi
46 46
47 47 # Replace bash shell by dash shell (experimental)
48 48 if [ "$REDUCE_BASH" = true ] ; then
49 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
50 echo "Yes, do as I say!" | chroot_exec apt-get purge -qq -y --allow-remove-essential bash
51 else
52 echo "Yes, do as I say!" | chroot_exec apt-get purge -qq -y --force-yes bash
53 fi
54
49 # Purge bash and update alternatives
50 echo "Yes, do as I say!" | chroot_exec apt-get purge -qq -y --allow-remove-essential bash
55 51 chroot_exec update-alternatives --install /bin/bash bash /bin/dash 100
56 52 fi
57 53
58 54 # Remove sound utils and libraries
59 55 if [ "$ENABLE_SOUND" = false ] ; then
60 56 chroot_exec apt-get -qq -y purge alsa-utils libsamplerate0 libasound2 libasound2-data
61 57 fi
62 58
63 # Re-install tools for managing kernel modules
64 if [ "$RELEASE" = "jessie" ] ; then
65 chroot_exec apt-get -qq -y install module-init-tools
66 fi
67
68 59 # Remove GPU kernels
69 60 if [ "$ENABLE_MINGPU" = true ] ; then
70 61 rm -f "${BOOT_DIR}/start.elf"
71 62 rm -f "${BOOT_DIR}/fixup.dat"
72 63 rm -f "${BOOT_DIR}/start_x.elf"
73 64 rm -f "${BOOT_DIR}/fixup_x.dat"
74 65 fi
75 66
76 67 # Remove kernel and initrd from /boot (already in /boot/firmware)
77 68 if [ "$BUILD_KERNEL" = false ] ; then
78 69 rm -f "${R}/boot/vmlinuz-*"
79 70 rm -f "${R}/boot/initrd.img-*"
80 71 fi
81 72
82 73 # Clean APT list of repositories
83 74 rm -fr "${R}/var/lib/apt/lists/*"
84 75 chroot_exec apt-get -qq -y update
85 76 fi
@@ -1,1 +1,1
1 rpi2-jessie
1 RaspberryPI
@@ -1,6 +1,6
1 1 127.0.0.1 localhost
2 127.0.1.1 rpi2-jessie
2 127.0.1.1 RaspberryPI
3 3
4 4 ::1 localhost ip6-localhost ip6-loopback
5 5 ff02::1 ip6-allnodes
6 6 ff02::2 ip6-allrouters
@@ -1,104 +1,100
1 1 # This file contains utility functions used by rpi23-gen-image.sh
2 2
3 3 cleanup (){
4 4 set +x
5 5 set +e
6 6
7 7 # Identify and kill all processes still using files
8 8 echo "killing processes using mount point ..."
9 9 fuser -k "${R}"
10 10 sleep 3
11 11 fuser -9 -k -v "${R}"
12 12
13 13 # Clean up temporary .password file
14 14 if [ -r ".password" ] ; then
15 15 shred -zu .password
16 16 fi
17 17
18 18 # Clean up all temporary mount points
19 19 echo "removing temporary mount points ..."
20 20 umount -l "${R}/proc" 2> /dev/null
21 21 umount -l "${R}/sys" 2> /dev/null
22 22 umount -l "${R}/dev/pts" 2> /dev/null
23 23 umount "$BUILDDIR/mount/boot/firmware" 2> /dev/null
24 24 umount "$BUILDDIR/mount" 2> /dev/null
25 25 cryptsetup close "${CRYPTFS_MAPPING}" 2> /dev/null
26 26 losetup -d "$ROOT_LOOP" 2> /dev/null
27 27 losetup -d "$FRMW_LOOP" 2> /dev/null
28 28 trap - 0 1 2 3 6
29 29 }
30 30
31 31 chroot_exec() {
32 32 # Exec command in chroot
33 33 LANG=C LC_ALL=C DEBIAN_FRONTEND=noninteractive chroot ${R} $*
34 34 }
35 35
36 36 as_nobody() {
37 37 # Exec command as user nobody
38 38 sudo -E -u nobody LANG=C LC_ALL=C $*
39 39 }
40 40
41 41 install_readonly() {
42 42 # Install file with user read-only permissions
43 43 install -o root -g root -m 644 $*
44 44 }
45 45
46 46 install_exec() {
47 47 # Install file with root exec permissions
48 48 install -o root -g root -m 744 $*
49 49 }
50 50
51 51 use_template () {
52 52 # Test if configuration template file exists
53 53 if [ ! -r "./templates/${CONFIG_TEMPLATE}" ] ; then
54 54 echo "error: configuration template ${CONFIG_TEMPLATE} not found"
55 55 exit 1
56 56 fi
57 57
58 58 # Load template configuration parameters
59 59 . "./templates/${CONFIG_TEMPLATE}"
60 60 }
61 61
62 62 chroot_install_cc() {
63 63 # Install c/c++ build environment inside the chroot
64 64 if [ -z "${COMPILER_PACKAGES}" ] ; then
65 65 COMPILER_PACKAGES=$(chroot_exec apt-get -s install g++ make bc | grep "^Inst " | awk -v ORS=" " '{ print $2 }')
66
67 if [ "$RELEASE" = "jessie" ] ; then
68 chroot_exec apt-get -q -y --no-install-recommends install ${COMPILER_PACKAGES}
69 elif [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
70 chroot_exec apt-get -q -y --allow-unauthenticated --no-install-recommends install ${COMPILER_PACKAGES}
71 fi
66 # Install COMPILER_PACKAGES in chroot
67 chroot_exec apt-get -q -y --allow-unauthenticated --no-install-recommends install ${COMPILER_PACKAGES}
72 68 fi
73 69 }
74 70
75 71 chroot_remove_cc() {
76 72 # Remove c/c++ build environment from the chroot
77 73 if [ ! -z "${COMPILER_PACKAGES}" ] ; then
78 74 chroot_exec apt-get -qq -y --auto-remove purge ${COMPILER_PACKAGES}
79 75 COMPILER_PACKAGES=""
80 76 fi
81 77 }
82 78 #GPL v2.0
83 79 #https://github.com/sakaki-/bcmrpi3-kernel-bis/blob/master/conform_config.sh
84 80 # edited with thir param
85 81 #start
86 82 set_kernel_config() {
87 83 # flag as $1, value to set as $2, config must exist at "./.config"
88 84 local TGT="CONFIG_${1}"
89 85 local REP="${2//\//\\/}"
90 86 if grep -q "^${TGT}[^_]" .config; then
91 87 sed -i "s/^\(${TGT}=.*\|# ${TGT} is not set\)/${TGT}=${REP}/" .config
92 88 else
93 89 echo "${TGT}=${2}" >> .config
94 90 fi
95 91 }
96 92
97 93 unset_kernel_config() {
98 94 # unsets flag with the value of $1, config must exist at "./.config"
99 95 local TGT="CONFIG_${1}"
100 96 sed -i "s/^${TGT}=.*/# ${TGT} is not set/" .config
101 97 }
102 98 #
103 99 #end
104 100 #
@@ -1,829 +1,829
1 #!/bin/bash
1 #!/bin/sh
2 2 ########################################################################
3 3 # rpi23-gen-image.sh 2015-2017
4 4 #
5 5 # Advanced Debian "stretch" and "buster" bootstrap script for RPi2/3
6 6 #
7 7 # This program is free software; you can redistribute it and/or
8 8 # modify it under the terms of the GNU General Public License
9 9 # as published by the Free Software Foundation; either version 2
10 10 # of the License, or (at your option) any later version.
11 11 #
12 12 # Copyright (C) 2015 Jan Wagner <mail@jwagner.eu>
13 13 #
14 14 # Big thanks for patches and enhancements by 20+ github contributors!
15 15 ########################################################################
16 16
17 17 # Are we running as root?
18 18 if [ "$(id -u)" -ne "0" ] ; then
19 19 echo "error: this script must be executed with root privileges!"
20 20 exit 1
21 21 fi
22 22
23 23 # Check if ./functions.sh script exists
24 24 if [ ! -r "./functions.sh" ] ; then
25 25 echo "error: './functions.sh' required script not found!"
26 26 exit 1
27 27 fi
28 28
29 29 # Load utility functions
30 30 . ./functions.sh
31 31
32 32 # Load parameters from configuration template file
33 33 if [ -n "$CONFIG_TEMPLATE" ] ; then
34 34 use_template
35 35 fi
36 36
37 37 # Introduce settings
38 38 set -e
39 39 echo -n -e "\n#\n# RPi2/3 Bootstrap Settings\n#\n"
40 40 set -x
41 41
42 42 # Raspberry Pi model configuration
43 43 export RPI_MODEL=${RPI_MODEL:=2}
44 44
45 45 # Debian release
46 46 export RELEASE=${RELEASE:=buster}
47 47
48 48 #Kernel Branch
49 49 export KERNEL_BRANCH=${KERNEL_BRANCH:=""}
50 50
51 51 # URLs
52 52 KERNEL_URL=${KERNEL_URL:=https://github.com/raspberrypi/linux}
53 53 FIRMWARE_URL=${FIRMWARE_URL:=https://github.com/raspberrypi/firmware/raw/master/boot}
54 54 WLAN_FIRMWARE_URL=${WLAN_FIRMWARE_URL:=https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm}
55 55 COLLABORA_URL=${COLLABORA_URL:=https://repositories.collabora.co.uk/debian}
56 56 FBTURBO_URL=${FBTURBO_URL:=https://github.com/ssvb/xf86-video-fbturbo.git}
57 57 UBOOT_URL=${UBOOT_URL:=https://git.denx.de/u-boot.git}
58 58 VIDEOCORE_URL=${VIDEOCORE_URL:=https://github.com/raspberrypi/userland}
59 59 #BIS= Kernel has KVM and zswap enabled
60 60 RPI3_64_BIS_KERNEL_URL=${RPI3_64_BIS_KERNEL_URL:=https://github.com/sakaki-/bcmrpi3-kernel-bis/releases/download/4.14.80.20181113/bcmrpi3-kernel-bis-4.14.80.20181113.tar.xz}
61 61 #default bcmrpi3_defconfig target kernel
62 62 RPI3_64_DEF_KERNEL_URL=${RPI3_64_DEF_KERNEL_URL:=https://github.com/sakaki-/bcmrpi3-kernel/releases/download/4.14.80.20181113/bcmrpi3-kernel-4.14.80.20181113.tar.xz}
63 63 #enhanced kernel
64 64 RPI3_64_KERNEL_URL=${RPI3_64_KERNEL_URL:=$RPI3_64_BIS_KERNEL_URL}
65 65 BLUETOOTH_URL=${BLUETOOTH_URL:=https://github.com/RPi-Distro/pi-bluetooth.git}
66 66
67 67 # Build directories
68 68 BASEDIR=${BASEDIR:=$(pwd)/images/${RELEASE}}
69 69 BUILDDIR="${BASEDIR}/build"
70 70
71 71 # Prepare date string for default image file name
72 72 DATE="$(date +%Y-%m-%d)"
73 73 if [ -z "$KERNEL_BRANCH" ] ; then
74 74 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
75 75 else
76 76 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
77 77 fi
78 78
79 79 # Chroot directories
80 80 R="${BUILDDIR}/chroot"
81 81 ETC_DIR="${R}/etc"
82 82 LIB_DIR="${R}/lib"
83 83 BOOT_DIR="${R}/boot/firmware"
84 84 KERNEL_DIR="${R}/usr/src/linux"
85 85 WLAN_FIRMWARE_DIR="${LIB_DIR}/firmware/brcm"
86 86
87 87 # Firmware directory: Blank if download from github
88 88 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
89 89 # General settings
90 90 SET_ARCH=${SET_ARCH:=32}
91 91 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
92 92 PASSWORD=${PASSWORD:=raspberry}
93 93 USER_PASSWORD=${USER_PASSWORD:=raspberry}
94 94 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
95 95 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
96 96 EXPANDROOT=${EXPANDROOT:=true}
97 97
98 98 # Keyboard settings
99 99 XKB_MODEL=${XKB_MODEL:=""}
100 100 XKB_LAYOUT=${XKB_LAYOUT:=""}
101 101 XKB_VARIANT=${XKB_VARIANT:=""}
102 102 XKB_OPTIONS=${XKB_OPTIONS:=""}
103 103
104 104 # Network settings (DHCP)
105 105 ENABLE_DHCP=${ENABLE_DHCP:=true}
106 106
107 107 # Network settings (static)
108 108 NET_ADDRESS=${NET_ADDRESS:=""}
109 109 NET_GATEWAY=${NET_GATEWAY:=""}
110 110 NET_DNS_1=${NET_DNS_1:=""}
111 111 NET_DNS_2=${NET_DNS_2:=""}
112 112 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
113 113 NET_NTP_1=${NET_NTP_1:=""}
114 114 NET_NTP_2=${NET_NTP_2:=""}
115 115
116 116 # APT settings
117 117 APT_PROXY=${APT_PROXY:=""}
118 118 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
119 119
120 120 # Feature settings
121 121 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
122 122 ENABLE_I2C=${ENABLE_I2C:=false}
123 123 ENABLE_SPI=${ENABLE_SPI:=false}
124 124 ENABLE_IPV6=${ENABLE_IPV6:=true}
125 125 ENABLE_SSHD=${ENABLE_SSHD:=true}
126 126 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
127 127 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
128 128 ENABLE_SOUND=${ENABLE_SOUND:=true}
129 129 ENABLE_DBUS=${ENABLE_DBUS:=true}
130 130 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
131 131 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
132 132 ENABLE_XORG=${ENABLE_XORG:=false}
133 133 ENABLE_WM=${ENABLE_WM:=""}
134 134 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
135 135 ENABLE_USER=${ENABLE_USER:=true}
136 136 USER_NAME=${USER_NAME:="pi"}
137 137 ENABLE_ROOT=${ENABLE_ROOT:=false}
138 138 ENABLE_QEMU=${ENABLE_QEMU:=false}
139 139 ENABLE_SYSVINIT=${ENABLE_SYSVINIT:=false}
140 140
141 141 # SSH settings
142 142 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
143 143 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
144 144 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
145 145 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
146 146 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
147 147
148 148 # Advanced settings
149 149 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
150 150 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
151 151 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
152 152 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
153 153 ENABLE_UBOOTUSB=${ENABLE_UBOOTUSB=false}
154 154 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
155 155 ENABLE_VIDEOCORE=${ENABLE_VIDEOCORE:=true}
156 156 VIDEOCORESRC_DIR=${VIDEOCORESRC_DIR:=""}
157 157 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
158 158 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
159 159 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
160 160 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
161 161 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
162 162 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
163 163 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
164 164
165 165 # Kernel compilation settings
166 166 BUILD_KERNEL=${BUILD_KERNEL:=true}
167 167 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
168 168 KERNEL_THREADS=${KERNEL_THREADS:=1}
169 169 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
170 170 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
171 171 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
172 172 KERNEL_OLDDEFCONFIG=${KERNEL_OLDDEFCONFIG:=false}
173 173 KERNEL_CCACHE=${KERNEL_CCACHE:=false}
174 174 KERNEL_ZSWAP=${KERNEL_ZSWAP:=false}
175 175 KERNEL_VIRT=${KERNEL_VIRT:=false}
176 176 KERNEL_BPF=${KERNEL_BPF:=true}
177 177
178 178 # Kernel compilation from source directory settings
179 179 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
180 180 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
181 181 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
182 182 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
183 183
184 184 # Reduce disk usage settings
185 185 REDUCE_APT=${REDUCE_APT:=true}
186 186 REDUCE_DOC=${REDUCE_DOC:=true}
187 187 REDUCE_MAN=${REDUCE_MAN:=true}
188 188 REDUCE_VIM=${REDUCE_VIM:=false}
189 189 REDUCE_BASH=${REDUCE_BASH:=false}
190 190 REDUCE_HWDB=${REDUCE_HWDB:=true}
191 191 REDUCE_SSHD=${REDUCE_SSHD:=true}
192 192 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
193 193
194 194 # Encrypted filesystem settings
195 195 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
196 196 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
197 197 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
198 198 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
199 199 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
200 200
201 201 # Chroot scripts directory
202 202 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
203 203
204 204 # Packages required in the chroot build environment
205 205 APT_INCLUDES=${APT_INCLUDES:=""}
206 206 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils,locales,keyboard-configuration,console-setup"
207 207
208 208 #Packages to exclude from chroot build environment
209 209 APT_EXCLUDES=${APT_EXCLUDES:=""}
210 210
211 211 # Packages required for bootstrapping
212 212 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo netselect-apt"
213 213 MISSING_PACKAGES=""
214 214
215 215 # Packages installed for c/c++ build environment in chroot (keep empty)
216 216 COMPILER_PACKAGES=""
217 217
218 218 #If init and systemd-sysv are wanted e.g. halt/reboot/shutdown scripts
219 219 if [ "$ENABLE_SYSVINIT" = false ] ; then
220 220 APT_EXCLUDES="--exclude=${APT_EXCLUDES},init,systemd-sysv"
221 221 fi
222 222
223 223 #Check if apt-cacher-ng has its default port open on and set APT_PROXY
224 224 if [ -n "$(lsof -i :3142)" ] ; then
225 225 HTTP_PROXY=http://127.0.0.1:3142/
226 226 fi
227 227
228 228 #ipinfo=$(curl ipinfo.io | grep country )
229 229 #grep -o '\"[^"]*\"' $ipinfo | tr -d '"'
230 230 #grep -Po '"country":.*?[^\\]",' $(curl ipinfo.io | grep country )
231 231 #sed -i "s,http:,https:,g" "${ETC_DIR}/apt/sources.list"
232 232 #autconfigure best apt server to not spam ftp.debian.org
233 233 #rm files/apt/sources.list
234 234 #netselect-apt does not know buster yet
235 235 if [ "$RELEASE" = "buster" ] ; then
236 236 RLS=testing
237 237 else
238 238 RLS="$RELEASE"
239 239 fi
240 240
241 241 if [ -f "$(pwd)/files/apt/sources.list" ] ; then
242 242 rm "$(pwd)/files/apt/sources.list"
243 243 fi
244 244
245 245 if [ "$ENABLE_NONFREE" = true ] ; then
246 246 netselect-apt --arch "$RELEASE_ARCH" --tests 10 --sources --nonfree --outfile "$(pwd)/files/apt/sources.list" -d "$RLS"
247 247 else
248 248 netselect-apt --arch "$RELEASE_ARCH" --tests 10 --sources --outfile "$(pwd)/files/apt/sources.list" -d "$RLS"
249 249 fi
250 250
251 251 #sed and cut the result string so we can use it as APT_SERVER
252 252 APT_SERVER=$(grep -m 1 http files/apt/sources.list | sed "s|http://| |g" | cut -d ' ' -f 3)
253 253 APT_SERVER=${APT_SERVER::-1}
254 254
255 255 #make script easier and more stable to use with convenient setup switch. Just setup SET_ARCH and RPI_MODEL and your good to go!
256 256 if [ -n "$SET_ARCH" ] ; then
257 257 echo "Setting Architecture specific settings"
258 258 ##################################
259 259 # 64 bit config
260 260 ##################################
261 261 if [ "$SET_ARCH" = 64 ] ; then
262 262 echo "64 bit mode selected - Setting up enviroment"
263 263 # 64 bit depended settings
264 264 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
265 265 KERNEL_ARCH=${KERNEL_ARCH:=arm64}
266 266 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
267 267
268 268 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
269 269 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
270 270 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
271 271 RELEASE_ARCH=${RELEASE_ARCH:=arm64}
272 272 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
273 273 CROSS_COMPILE=${CROSS_COMPILE:=aarch64-linux-gnu-}
274 274 else
275 275 echo "error: Only Raspberry PI 3 and 3B+ support 64bit"
276 276 exit 1
277 277 fi
278 278 fi
279 279
280 280 ##################################
281 281 # 32 bit config
282 282 ##################################
283 283 if [ "$SET_ARCH" = 32 ] ; then
284 284 echo "32 bit mode selected - Setting up enviroment"
285 285 #General 32bit configuration
286 286 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
287 287 KERNEL_ARCH=${KERNEL_ARCH:=arm}
288 288 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
289 289
290 290 #Raspberry setting grouped by board compability
291 291 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
292 292 echo "Setting settings for bcm2835 Raspberry PI boards"
293 293 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
294 294 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
295 295 RELEASE_ARCH=${RELEASE_ARCH:=armel}
296 296 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel.img}
297 297 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabi-}
298 298 fi
299 299 if [ "$RPI_MODEL" = 2 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
300 300 echo "Setting settings for bcm2837 Raspberry PI boards"
301 301 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
302 302 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
303 303 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
304 304 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
305 305 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
306 306 fi
307 307 fi
308 308 #SET_ARCH not set
309 309 else
310 310 echo "error: Please set '32' or '64' as value for SET_ARCH"
311 311 exit 1
312 312 fi
313 313
314 314 #Device specific configuration
315 315 echo "Select DTB-File"
316 316 case "$RPI_MODEL" in
317 317 0)
318 318 DTB_FILE=${DTB_FILE:=bcm2708-rpi-0-w.dtb}
319 319 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
320 320 ;;
321 321 1)
322 322 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b.dtb}
323 323 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
324 324 ;;
325 325 1P)
326 326 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b-plus.dtb}
327 327 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
328 328 ;;
329 329 2)
330 330 DTB_FILE=${DTB_FILE:=bcm2709-rpi-2-b.dtb}
331 331 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_2_defconfig}
332 332 ;;
333 333 3)
334 334 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
335 335 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
336 336 ;;
337 337 3P)
338 338 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
339 339 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
340 340 ;;
341 341 *)
342 342 echo "error: Raspberry Pi model $RPI_MODEL is not supported!"
343 343 exit 1
344 344 ;;
345 345 esac
346 346 echo "$DTB_FILE selected"
347 347
348 348 #DEBUG off
349 349 set +x
350 350
351 351 # Check if the internal wireless interface is supported by the RPi model
352 352 if [ "$ENABLE_WIRELESS" = true ] ; then
353 353 if [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] || [ "$RPI_MODEL" = 2 ] ; then
354 354 echo "error: The selected Raspberry Pi model has no internal wireless interface"
355 355 exit 1
356 356 else
357 357 echo "Raspberry Pi $RPI_MODEL has WIFI support"
358 358 fi
359 359 fi
360 360
361 361 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
362 362 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
363 363 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
364 364 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
365 365 exit 1
366 366 fi
367 367 fi
368 368
369 369 if [ "$ENABLE_VIDEOCORE" = true ] ; then
370 370 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cmake"
371 371 fi
372 372
373 373 # Add libncurses5 to enable kernel menuconfig
374 374 if [ "$KERNEL_MENUCONFIG" = true ] ; then
375 375 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses-dev"
376 376 fi
377 377
378 378 # Add ccache compiler cache for (faster) kernel cross (re)compilation
379 379 if [ "$KERNEL_CCACHE" = true ] ; then
380 380 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} ccache"
381 381 fi
382 382
383 383 # Add cryptsetup package to enable filesystem encryption
384 384 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
385 385 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
386 386 APT_INCLUDES="${APT_INCLUDES},cryptsetup,busybox,console-setup"
387 387
388 388 if [ -z "$CRYPTFS_PASSWORD" ] ; then
389 389 echo "error: no password defined (CRYPTFS_PASSWORD)!"
390 390 exit 1
391 391 fi
392 392 ENABLE_INITRAMFS=true
393 393 fi
394 394
395 395 # Add initramfs generation tools
396 396 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
397 397 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
398 398 fi
399 399
400 400 # Add device-tree-compiler required for building the U-Boot bootloader
401 401 if [ "$ENABLE_UBOOT" = true ] ; then
402 402 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex,bc"
403 403 else
404 404 if [ "$ENABLE_UBOOTUSB" = true ] ; then
405 405 echo "error: Enabling UBOOTUSB requires u-boot to be enabled"
406 406 exit 1
407 407 fi
408 408 fi
409 409
410 410 # Check if root SSH (v2) public key file exists
411 411 if [ -n "$SSH_ROOT_PUB_KEY" ] ; then
412 412 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
413 413 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
414 414 exit 1
415 415 fi
416 416 fi
417 417
418 418 # Check if $USER_NAME SSH (v2) public key file exists
419 419 if [ -n "$SSH_USER_PUB_KEY" ] ; then
420 420 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
421 421 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
422 422 exit 1
423 423 fi
424 424 fi
425 425
426 426 # Check if all required packages are installed on the build system
427 427 for package in $REQUIRED_PACKAGES ; do
428 428 if [ "$(dpkg-query -W -f='${Status}' $package)" != "install ok installed" ] ; then
429 429 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
430 430 fi
431 431 done
432 432
433 433 # If there are missing packages ask confirmation for install, or exit
434 434 if [ -n "$MISSING_PACKAGES" ] ; then
435 435 echo "the following packages needed by this script are not installed:"
436 436 echo "$MISSING_PACKAGES"
437 437
438 438 printf "\ndo you want to install the missing packages right now? [y/n] "
439 439 read -r confirm
440 440 [ "$confirm" != "y" ] && exit 1
441 441
442 442 # Make sure all missing required packages are installed
443 443 apt-get -qq -y install "${MISSING_PACKAGES}"
444 444 fi
445 445
446 446 # Check if ./bootstrap.d directory exists
447 447 if [ ! -d "./bootstrap.d/" ] ; then
448 448 echo "error: './bootstrap.d' required directory not found!"
449 449 exit 1
450 450 fi
451 451
452 452 # Check if ./files directory exists
453 453 if [ ! -d "./files/" ] ; then
454 454 echo "error: './files' required directory not found!"
455 455 exit 1
456 456 fi
457 457
458 458 # Check if specified KERNELSRC_DIR directory exists
459 459 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
460 460 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
461 461 exit 1
462 462 fi
463 463
464 464 # Check if specified UBOOTSRC_DIR directory exists
465 465 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
466 466 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
467 467 exit 1
468 468 fi
469 469
470 470 # Check if specified VIDEOCORESRC_DIR directory exists
471 471 if [ -n "$VIDEOCORESRC_DIR" ] && [ ! -d "$VIDEOCORESRC_DIR" ] ; then
472 472 echo "error: '${VIDEOCORESRC_DIR}' specified directory not found (VIDEOCORESRC_DIR)!"
473 473 exit 1
474 474 fi
475 475
476 476 # Check if specified FBTURBOSRC_DIR directory exists
477 477 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
478 478 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
479 479 exit 1
480 480 fi
481 481
482 482 # Check if specified CHROOT_SCRIPTS directory exists
483 483 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
484 484 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
485 485 exit 1
486 486 fi
487 487
488 488 # Check if specified device mapping already exists (will be used by cryptsetup)
489 489 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
490 490 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
491 491 exit 1
492 492 fi
493 493
494 494 # Don't clobber an old build
495 495 if [ -e "$BUILDDIR" ] ; then
496 496 echo "error: directory ${BUILDDIR} already exists, not proceeding"
497 497 exit 1
498 498 fi
499 499
500 500 # Setup chroot directory
501 501 mkdir -p "${R}"
502 502
503 503 # Check if build directory has enough of free disk space >512MB
504 504 if [ "$(df --output=avail "${BUILDDIR}" | sed "1d")" -le "524288" ] ; then
505 505 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
506 506 exit 1
507 507 fi
508 508
509 509 set -x
510 510
511 511 # Call "cleanup" function on various signals and errors
512 512 trap cleanup 0 1 2 3 6
513 513
514 514 # Add required packages for the minbase installation
515 515 if [ "$ENABLE_MINBASE" = true ] ; then
516 516 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
517 517 fi
518 518
519 519 # Add parted package, required to get partprobe utility
520 520 if [ "$EXPANDROOT" = true ] ; then
521 521 APT_INCLUDES="${APT_INCLUDES},parted"
522 522 fi
523 523
524 524 # Add dbus package, recommended if using systemd
525 525 if [ "$ENABLE_DBUS" = true ] ; then
526 526 APT_INCLUDES="${APT_INCLUDES},dbus"
527 527 fi
528 528
529 529 # Add iptables IPv4/IPv6 package
530 530 if [ "$ENABLE_IPTABLES" = true ] ; then
531 531 APT_INCLUDES="${APT_INCLUDES},iptables,iptables-persistent"
532 532 fi
533 533
534 534 # Add openssh server package
535 535 if [ "$ENABLE_SSHD" = true ] ; then
536 536 APT_INCLUDES="${APT_INCLUDES},openssh-server"
537 537 fi
538 538
539 539 # Add alsa-utils package
540 540 if [ "$ENABLE_SOUND" = true ] ; then
541 541 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
542 542 fi
543 543
544 544 # Add rng-tools package
545 545 if [ "$ENABLE_HWRANDOM" = true ] ; then
546 546 APT_INCLUDES="${APT_INCLUDES},rng-tools"
547 547 fi
548 548
549 549 # Add fbturbo video driver
550 550 if [ "$ENABLE_FBTURBO" = true ] ; then
551 551 # Enable xorg package dependencies
552 552 ENABLE_XORG=true
553 553 fi
554 554
555 555 # Add user defined window manager package
556 556 if [ -n "$ENABLE_WM" ] ; then
557 557 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
558 558
559 559 # Enable xorg package dependencies
560 560 ENABLE_XORG=true
561 561 fi
562 562
563 563 # Add xorg package
564 564 if [ "$ENABLE_XORG" = true ] ; then
565 565 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
566 566 fi
567 567
568 568 # Replace selected packages with smaller clones
569 569 if [ "$ENABLE_REDUCE" = true ] ; then
570 570 # Add levee package instead of vim-tiny
571 571 if [ "$REDUCE_VIM" = true ] ; then
572 572 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
573 573 fi
574 574
575 575 # Add dropbear package instead of openssh-server
576 576 if [ "$REDUCE_SSHD" = true ] ; then
577 577 APT_INCLUDES="$(echo "${APT_INCLUDES}" | sed "s/openssh-server/dropbear/")"
578 578 fi
579 579 fi
580 580
581 581 # Configure kernel sources if no KERNELSRC_DIR
582 582 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
583 583 KERNELSRC_CONFIG=true
584 584 fi
585 585
586 586 # Configure reduced kernel
587 587 if [ "$KERNEL_REDUCE" = true ] ; then
588 588 KERNELSRC_CONFIG=false
589 589 fi
590 590
591 591 # Configure qemu compatible kernel
592 592 if [ "$ENABLE_QEMU" = true ] ; then
593 593 DTB_FILE=vexpress-v2p-ca15_a7.dtb
594 594 UBOOT_CONFIG=vexpress_ca15_tc2_defconfig
595 595 KERNEL_DEFCONFIG="vexpress_defconfig"
596 596 if [ "$KERNEL_MENUCONFIG" = false ] ; then
597 597 KERNEL_OLDDEFCONFIG=true
598 598 fi
599 599 fi
600 600
601 601 # Execute bootstrap scripts
602 602 for SCRIPT in bootstrap.d/*.sh; do
603 603 head -n 3 "$SCRIPT"
604 604 . "$SCRIPT"
605 605 done
606 606
607 607 ## Execute custom bootstrap scripts
608 608 if [ -d "custom.d" ] ; then
609 609 for SCRIPT in custom.d/*.sh; do
610 610 . "$SCRIPT"
611 611 done
612 612 fi
613 613
614 614 # Execute custom scripts inside the chroot
615 615 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
616 616 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
617 617 chroot_exec /bin/bash -x <<'EOF'
618 618 for SCRIPT in /chroot_scripts/* ; do
619 619 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
620 620 $SCRIPT
621 621 fi
622 622 done
623 623 EOF
624 624 rm -rf "${R}/chroot_scripts"
625 625 fi
626 626
627 627 # Remove c/c++ build environment from the chroot
628 628 chroot_remove_cc
629 629
630 630 # Generate required machine-id
631 631 MACHINE_ID=$(dbus-uuidgen)
632 632 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
633 633 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
634 634
635 635 # APT Cleanup
636 636 chroot_exec apt-get -y clean
637 637 chroot_exec apt-get -y autoclean
638 638 chroot_exec apt-get -y autoremove
639 639
640 640 # Unmount mounted filesystems
641 641 umount -l "${R}/proc"
642 642 umount -l "${R}/sys"
643 643
644 644 # Clean up directories
645 645 rm -rf "${R}/run/*"
646 646 rm -rf "${R}/tmp/*"
647 647
648 648 # Clean up files
649 649 rm -f "${ETC_DIR}/ssh/ssh_host_*"
650 650 rm -f "${ETC_DIR}/dropbear/dropbear_*"
651 651 rm -f "${ETC_DIR}/apt/sources.list.save"
652 652 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
653 653 rm -f "${ETC_DIR}/*-"
654 654 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
655 655 rm -f "${ETC_DIR}/resolv.conf"
656 656 rm -f "${R}/root/.bash_history"
657 657 rm -f "${R}/var/lib/urandom/random-seed"
658 658 rm -f "${R}/initrd.img"
659 659 rm -f "${R}/vmlinuz"
660 660 rm -f "${R}${QEMU_BINARY}"
661 661
662 662 if [ "$ENABLE_QEMU" = true ] ; then
663 663 # Setup QEMU directory
664 664 mkdir "${BASEDIR}/qemu"
665 665
666 666 # Copy kernel image to QEMU directory
667 667 install_readonly "${BOOT_DIR}/${KERNEL_IMAGE}" "${BASEDIR}/qemu/${KERNEL_IMAGE}"
668 668
669 669 # Copy kernel config to QEMU directory
670 670 install_readonly "${R}/boot/config-${KERNEL_VERSION}" "${BASEDIR}/qemu/config-${KERNEL_VERSION}"
671 671
672 672 # Copy kernel dtbs to QEMU directory
673 673 for dtb in "${BOOT_DIR}/"*.dtb ; do
674 674 if [ -f "${dtb}" ] ; then
675 675 install_readonly "${dtb}" "${BASEDIR}/qemu/"
676 676 fi
677 677 done
678 678
679 679 # Copy kernel overlays to QEMU directory
680 680 if [ -d "${BOOT_DIR}/overlays" ] ; then
681 681 # Setup overlays dtbs directory
682 682 mkdir "${BASEDIR}/qemu/overlays"
683 683
684 684 for dtb in "${BOOT_DIR}/overlays/"*.dtb ; do
685 685 if [ -f "${dtb}" ] ; then
686 686 install_readonly "${dtb}" "${BASEDIR}/qemu/overlays/"
687 687 fi
688 688 done
689 689 fi
690 690
691 691 # Copy u-boot files to QEMU directory
692 692 if [ "$ENABLE_UBOOT" = true ] ; then
693 693 if [ -f "${BOOT_DIR}/u-boot.bin" ] ; then
694 694 install_readonly "${BOOT_DIR}/u-boot.bin" "${BASEDIR}/qemu/u-boot.bin"
695 695 fi
696 696 if [ -f "${BOOT_DIR}/uboot.mkimage" ] ; then
697 697 install_readonly "${BOOT_DIR}/uboot.mkimage" "${BASEDIR}/qemu/uboot.mkimage"
698 698 fi
699 699 if [ -f "${BOOT_DIR}/boot.scr" ] ; then
700 700 install_readonly "${BOOT_DIR}/boot.scr" "${BASEDIR}/qemu/boot.scr"
701 701 fi
702 702 fi
703 703
704 704 # Copy initramfs to QEMU directory
705 705 if [ -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" ] ; then
706 706 install_readonly "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" "${BASEDIR}/qemu/initramfs-${KERNEL_VERSION}"
707 707 fi
708 708 fi
709 709
710 710 # Calculate size of the chroot directory in KB
711 711 CHROOT_SIZE=$(expr "$(du -s "${R}" | awk '{ print $1 }')")
712 712
713 713 # Calculate the amount of needed 512 Byte sectors
714 714 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
715 715 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
716 716 ROOT_OFFSET=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}")
717 717
718 718 # The root partition is EXT4
719 719 # This means more space than the actual used space of the chroot is used.
720 720 # As overhead for journaling and reserved blocks 35% are added.
721 721 ROOT_SECTORS=$(expr "$(expr "${CHROOT_SIZE}" + "${CHROOT_SIZE}" \/ 100 \* 35)" \* 1024 \/ 512)
722 722
723 723 # Calculate required image size in 512 Byte sectors
724 724 IMAGE_SECTORS=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}")
725 725
726 726 # Prepare image file
727 727 if [ "$ENABLE_SPLITFS" = true ] ; then
728 728 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count="${TABLE_SECTORS}"
729 729 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek="${FRMW_SECTORS}"
730 730 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count="${TABLE_SECTORS}"
731 731 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek="${ROOT_SECTORS}"
732 732
733 733 # Write firmware/boot partition tables
734 734 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
735 735 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
736 736 EOM
737 737
738 738 # Write root partition table
739 739 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
740 740 ${TABLE_SECTORS},${ROOT_SECTORS},83
741 741 EOM
742 742
743 743 # Setup temporary loop devices
744 744 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME"-frmw.img)"
745 745 ROOT_LOOP="$(losetup -o 1M -f --show "$IMAGE_NAME"-root.img)"
746 746 else # ENABLE_SPLITFS=false
747 747 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count="${TABLE_SECTORS}"
748 748 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek="${IMAGE_SECTORS}"
749 749
750 750 # Write partition table
751 751 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
752 752 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
753 753 ${ROOT_OFFSET},${ROOT_SECTORS},83
754 754 EOM
755 755
756 756 # Setup temporary loop devices
757 757 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME".img)"
758 758 ROOT_LOOP="$(losetup -o 65M -f --show "$IMAGE_NAME".img)"
759 759 fi
760 760
761 761 if [ "$ENABLE_CRYPTFS" = true ] ; then
762 762 # Create dummy ext4 fs
763 763 mkfs.ext4 "$ROOT_LOOP"
764 764
765 765 # Setup password keyfile
766 766 touch .password
767 767 chmod 600 .password
768 768 echo -n ${CRYPTFS_PASSWORD} > .password
769 769
770 770 # Initialize encrypted partition
771 771 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
772 772
773 773 # Open encrypted partition and setup mapping
774 774 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
775 775
776 776 # Secure delete password keyfile
777 777 shred -zu .password
778 778
779 779 # Update temporary loop device
780 780 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
781 781
782 782 # Wipe encrypted partition (encryption cipher is used for randomness)
783 783 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count="$(blockdev --getsz "${ROOT_LOOP}")"
784 784 fi
785 785
786 786 # Build filesystems
787 787 mkfs.vfat "$FRMW_LOOP"
788 788 mkfs.ext4 "$ROOT_LOOP"
789 789
790 790 # Mount the temporary loop devices
791 791 mkdir -p "$BUILDDIR/mount"
792 792 mount "$ROOT_LOOP" "$BUILDDIR/mount"
793 793
794 794 mkdir -p "$BUILDDIR/mount/boot/firmware"
795 795 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
796 796
797 797 # Copy all files from the chroot to the loop device mount point directory
798 798 rsync -a "${R}/" "$BUILDDIR/mount/"
799 799
800 800 # Unmount all temporary loop devices and mount points
801 801 cleanup
802 802
803 803 # Create block map file(s) of image(s)
804 804 if [ "$ENABLE_SPLITFS" = true ] ; then
805 805 # Create block map files for "bmaptool"
806 806 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
807 807 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
808 808
809 809 # Image was successfully created
810 810 echo "$IMAGE_NAME-frmw.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
811 811 echo "$IMAGE_NAME-root.img ($(expr \( "${TABLE_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
812 812 else
813 813 # Create block map file for "bmaptool"
814 814 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
815 815
816 816 # Image was successfully created
817 817 echo "$IMAGE_NAME.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
818 818
819 819 # Create qemu qcow2 image
820 820 if [ "$ENABLE_QEMU" = true ] ; then
821 821 QEMU_IMAGE=${QEMU_IMAGE:=${BASEDIR}/qemu/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
822 822 QEMU_SIZE=16G
823 823
824 824 qemu-img convert -f raw -O qcow2 "$IMAGE_NAME".img "$QEMU_IMAGE".qcow2
825 825 qemu-img resize "$QEMU_IMAGE".qcow2 $QEMU_SIZE
826 826
827 827 echo "$QEMU_IMAGE.qcow2 ($QEMU_SIZE)" ": successfully created"
828 828 fi
829 829 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant