##// END OF EJS Templates
Added: KEEP_APT_PROXY
drtyhlpr -
r538:782219f11ef8
parent child
Show More
@@ -1,532 +1,535
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 all Raspberry Pi computers. The script at this time supports the bootstrapping of the Debian (armhf/armel) releases `stretch` and `buster`. Raspberry Pi 0/1/2/3 images are generated for 32-bit mode only. Raspberry Pi 3 supports 64-bit images that can be generated using custom configuration parameters (```templates/rpi3-stretch-arm64-4.14.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 Raspberry 3 this is mandatory. Kernel compilation and linking will be performed on the build system using an ARM (armhf/armel) cross-compiler toolchain.
11 11
12 12 The script has been tested using the default `crossbuild-essential-armhf` and `crossbuild-essential-armel` toolchain meta packages on Debian Linux `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"
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 ##### `KEEP_APT_PROXY`=false
52 Keep the APT_PROXY settings used in the bootsrapping process in the generated image.
53
51 54 ##### `APT_INCLUDES`=""
52 55 A comma-separated list of additional packages to be installed by debootstrap during bootstrapping.
53 56
54 57 ##### `APT_INCLUDES_LATE`=""
55 58 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 59
57 60 ---
58 61
59 62 #### General system settings:
60 63 ##### `SET_ARCH`=32
61 64 Set Architecture to default 32bit. If you want to compile 64-bit (RPI3 or RPI3+) set it to `64`. This option will set every needed cross-compiler or board specific option for a successful build.
62 65
63 66 ##### `RPI_MODEL`=2
64 67 Specify the target Raspberry Pi hardware model. The script at this time supports the following Raspberry Pi models:
65 68 - `0` = Raspberry Pi 0 and Raspberry Pi 0 W
66 69 - `1` = Raspberry Pi 1 model A and B
67 70 - `1P` = Raspberry Pi 1 model B+ and A+
68 71 - `2` = Raspberry Pi 2 model B
69 72 - `3` = Raspberry Pi 3 model B
70 73 - `3P` = Raspberry Pi 3 model B+
71 74
72 75 ##### `RELEASE`="buster"
73 76 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases `stretch` and `buster`.
74 77
75 78 ##### `RELEASE_ARCH`="armhf"
76 79 Set the desired Debian release architecture.
77 80
78 81 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
79 82 Set system hostname. It's recommended that the hostname is unique in the corresponding subnet.
80 83
81 84 ##### `PASSWORD`="raspberry"
82 85 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
83 86
84 87 ##### `USER_PASSWORD`="raspberry"
85 88 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.
86 89
87 90 ##### `DEFLOCAL`="en_US.UTF-8"
88 91 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`.
89 92
90 93 ##### `TIMEZONE`="Europe/Berlin"
91 94 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.
92 95
93 96 ##### `EXPANDROOT`=true
94 97 Expand the root partition and filesystem automatically on first boot.
95 98
96 99 ##### `ENABLE_QEMU`=false
97 100 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.
98 101
99 102 ---
100 103
101 104 #### Keyboard settings:
102 105 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.
103 106
104 107 ##### `XKB_MODEL`=""
105 108 Set the name of the model of your keyboard type.
106 109
107 110 ##### `XKB_LAYOUT`=""
108 111 Set the supported keyboard layout(s).
109 112
110 113 ##### `XKB_VARIANT`=""
111 114 Set the supported variant(s) of the keyboard layout(s).
112 115
113 116 ##### `XKB_OPTIONS`=""
114 117 Set extra xkb configuration options.
115 118
116 119 ---
117 120
118 121 #### Networking settings (DHCP):
119 122 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`.`
120 123
121 124 ##### `ENABLE_DHCP`=true
122 125 Set the system to use DHCP. This requires an DHCP server.
123 126
124 127 ---
125 128
126 129 #### Networking settings (static):
127 130 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`.
128 131
129 132 ##### `NET_ADDRESS`=""
130 133 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
131 134
132 135 ##### `NET_GATEWAY`=""
133 136 Set the IP address for the default gateway.
134 137
135 138 ##### `NET_DNS_1`=""
136 139 Set the IP address for the first DNS server.
137 140
138 141 ##### `NET_DNS_2`=""
139 142 Set the IP address for the second DNS server.
140 143
141 144 ##### `NET_DNS_DOMAINS`=""
142 145 Set the default DNS search domains to use for non fully qualified hostnames.
143 146
144 147 ##### `NET_NTP_1`=""
145 148 Set the IP address for the first NTP server.
146 149
147 150 ##### `NET_NTP_2`=""
148 151 Set the IP address for the second NTP server.
149 152
150 153 ---
151 154
152 155 #### Basic system features:
153 156 ##### `ENABLE_CONSOLE`=true
154 157 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. On RPI `0` `3` `3P` the CPU speed is locked at lowest speed.
155 158
156 159 ##### `ENABLE_PRINTK`=false
157 160 Enables printing kernel messages to konsole. printk is `3 4 1 3` as in raspbian.
158 161
159 162 ##### `ENABLE_BLUETOOTH`=false
160 163 Enable onboard Bluetooth interface on the RPi0/3/3P. See: [Configuring the GPIO serial port on Raspbian jessie and stretch](https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/).
161 164
162 165 ##### `ENABLE_MINIUART_OVERLAY`=false
163 166 Enable Bluetooth to use this. Adds overlay to swap UART0 with UART1. Enabling (slower) Bluetooth and full speed serial console. - RPI `0` `3` `3P` have a fast `hardware UART0` (ttyAMA0) and a `mini UART1` (ttyS0)! RPI `1` `1P` `2` only have a `hardware UART0`. `UART0` is considered better, because is faster and more stable than `mini UART1`. By default the Bluetooth modem is mapped to the `hardware UART0` and `mini UART` is used for console. The `mini UART` is a problem for the serial console, because its baudrate depends on the CPU frequency, which is changing on runtime. Resulting in a volatile baudrate and thus in an unusable serial console.
164 167
165 168 ##### `ENABLE_TURBO`=false
166 169 Enable Turbo mode. This setting locks cpu at the highest frequency. As setting ENABLE_CONSOLE=true locks RPI to lowest CPU speed, this is can be used additionally to lock cpu hat max speed. Need a good power supply and probably cooling for the Raspberry PI.
167 170
168 171 ##### `ENABLE_I2C`=false
169 172 Enable I2C interface on the RPi 0/1/2/3. Please check the [RPi 0/1/2/3 pinout diagrams](https://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
170 173
171 174 ##### `ENABLE_SPI`=false
172 175 Enable SPI interface on the RPi 0/1/2/3. Please check the [RPi 0/1/2/3 pinout diagrams](https://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
173 176
174 177 ##### `ENABLE_IPV6`=true
175 178 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
176 179
177 180 ##### `ENABLE_SSHD`=true
178 181 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.
179 182
180 183 ##### `ENABLE_NONFREE`=false
181 184 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.
182 185
183 186 ##### `ENABLE_WIRELESS`=false
184 187 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`.
185 188
186 189 ##### `ENABLE_RSYSLOG`=true
187 190 If set to false, disable and uninstall rsyslog (so logs will be available only in journal files)
188 191
189 192 ##### `ENABLE_SOUND`=true
190 193 Enable sound hardware and install Advanced Linux Sound Architecture.
191 194
192 195 ##### `ENABLE_HWRANDOM`=true
193 196 Enable Hardware Random Number Generator. Strong random numbers are important for most network-based communications that use encryption. It's recommended to be enabled.
194 197
195 198 ##### `ENABLE_MINGPU`=false
196 199 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
197 200
198 201 ##### `ENABLE_DBUS`=true
199 202 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
200 203
201 204 ##### `ENABLE_XORG`=false
202 205 Install Xorg open-source X Window System.
203 206
204 207 ##### `ENABLE_WM`=""
205 208 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`.
206 209
207 210 ##### `ENABLE_SYSVINIT`=false
208 211 Support for halt,init,poweroff,reboot,runlevel,shutdown,telinit commands
209 212
210 213 ---
211 214
212 215 #### Advanced system features:
213 216 ##### `ENABLE_SYSTEMDSWAP`=false
214 217 Enables [Systemd-swap service](https://github.com/Nefelim4ag/systemd-swap). Usefull if `KERNEL_ZSWAP` is enabled.
215 218
216 219 ##### `ENABLE_MINBASE`=false
217 220 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
218 221
219 222 ##### `ENABLE_REDUCE`=false
220 223 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
221 224
222 225 ##### `ENABLE_UBOOT`=false
223 226 Replace the default RPi 0/1/2/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.
224 227
225 228 ##### `UBOOTSRC_DIR`=""
226 229 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.
227 230
228 231 ##### `ENABLE_FBTURBO`=false
229 232 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.
230 233
231 234 ##### `FBTURBOSRC_DIR`=""
232 235 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.
233 236
234 237 ##### `ENABLE_VIDEOCORE`=false
235 238 Install and enable the [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.
236 239
237 240 ##### `VIDEOCORESRC_DIR`=""
238 241 Path to a directory (`userland`) of [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.
239 242
240 243 ##### `ENABLE_NEXMON`=false
241 244 Install and enable the [Source code for a C-based firmware patching framework for Broadcom/Cypress WiFi chips that enables you to write your own firmware patches, for example, to enable monitor mode with radiotap headers and frame injection](https://github.com/seemoo-lab/nexmon.git).
242 245
243 246 ##### `NEXMONSRC_DIR`=""
244 247 Path to a directory (`nexmon`) 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.
245 248
246 249 ##### `ENABLE_IPTABLES`=false
247 250 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
248 251
249 252 ##### `ENABLE_USER`=true
250 253 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, the username will be `pi`.
251 254
252 255 ##### `USER_NAME`=pi
253 256 Non-root user to create. Ignored if `ENABLE_USER`=false
254 257
255 258 ##### `ENABLE_ROOT`=false
256 259 Set root user password so root login will be enabled
257 260
258 261 ##### `ENABLE_HARDNET`=false
259 262 Enable IPv4/IPv6 network stack hardening settings.
260 263
261 264 ##### `ENABLE_SPLITFS`=false
262 265 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
263 266
264 267 ##### `CHROOT_SCRIPTS`=""
265 268 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.
266 269
267 270 ##### `ENABLE_INITRAMFS`=false
268 271 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.
269 272
270 273 ##### `ENABLE_IFNAMES`=true
271 274 Enable automatic assignment of predictable, stable network interface names for all local Ethernet, WLAN interfaces. This might create complex and long interface names.
272 275
273 276 ##### `DISABLE_UNDERVOLT_WARNINGS`=
274 277 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.
275 278
276 279 ---
277 280
278 281 #### SSH settings:
279 282 ##### `SSH_ENABLE_ROOT`=false
280 283 Enable password-based root login via SSH. This may be a security risk with the default password set, use only in trusted environments. `ENABLE_ROOT` must be set to `true`.
281 284
282 285 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
283 286 Disable password-based SSH authentication. Only public key based SSH (v2) authentication will be supported.
284 287
285 288 ##### `SSH_LIMIT_USERS`=false
286 289 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).
287 290
288 291 ##### `SSH_ROOT_PUB_KEY`=""
289 292 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`.
290 293
291 294 ##### `SSH_USER_PUB_KEY`=""
292 295 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.
293 296
294 297 ---
295 298
296 299 #### Kernel compilation:
297 300 ##### `BUILD_KERNEL`=true
298 301 Build and install the latest RPi 0/1/2/3 Linux kernel. Currently only the default RPi 0/1/2/3 kernel configuration is used.
299 302
300 303 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
301 304 This sets the cross-compile environment for the compiler.
302 305
303 306 ##### `KERNEL_ARCH`="arm"
304 307 This sets the kernel architecture for the compiler.
305 308
306 309 ##### `KERNEL_IMAGE`="kernel7.img"
307 310 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.
308 311
309 312 ##### `KERNEL_BRANCH`=""
310 313 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
311 314
312 315 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
313 316 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.
314 317
315 318 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
316 319 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
317 320
318 321 ##### `KERNEL_REDUCE`=false
319 322 Reduce the size of the generated kernel by removing unwanted devices, network and filesystem drivers (experimental).
320 323
321 324 ##### `KERNEL_THREADS`=1
322 325 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.
323 326
324 327 ##### `KERNEL_HEADERS`=true
325 328 Install kernel headers with the built kernel.
326 329
327 330 ##### `KERNEL_MENUCONFIG`=false
328 331 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
329 332
330 333 ##### `KERNEL_OLDDEFCONFIG`=false
331 334 Run `make olddefconfig` to automatically set all new kernel configuration options to their recommended default values.
332 335
333 336 ##### `KERNEL_CCACHE`=false
334 337 Compile the kernel using ccache. This speeds up kernel recompilation by caching previous compilations and detecting when the same compilation is being done again.
335 338
336 339 ##### `KERNEL_REMOVESRC`=true
337 340 Remove all kernel sources from the generated OS image after it was built and installed.
338 341
339 342 ##### `KERNELSRC_DIR`=""
340 343 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.
341 344
342 345 ##### `KERNELSRC_CLEAN`=false
343 346 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.
344 347
345 348 ##### `KERNELSRC_CONFIG`=true
346 349 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.
347 350
348 351 ##### `KERNELSRC_USRCONFIG`=""
349 352 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
350 353
351 354 ##### `KERNELSRC_PREBUILT`=false
352 355 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.
353 356
354 357 ##### `RPI_FIRMWARE_DIR`=""
355 358 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.
356 359
357 360 ##### `KERNEL_DEFAULT_GOV`="ONDEMAND"
358 361 Set the default cpu governor at kernel compilation. Supported values are: PERFORMANCE POWERSAVE USERSPACE ONDEMAND CONSERVATIVE SCHEDUTIL
359 362
360 363 ##### `KERNEL_NF`=false
361 364 Enable Netfilter modules as kernel modules
362 365
363 366 ##### `KERNEL_VIRT`=false
364 367 Enable Kernel KVM support (/dev/kvm)
365 368
366 369 ##### `KERNEL_ZSWAP`=false
367 370 Enable Kernel Zswap support. Best use on high RAM load and mediocre CPU load usecases
368 371
369 372 ##### `KERNEL_BPF`=true
370 373 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]
371 374
372 375 ##### `KERNEL_SECURITY`=false
373 376 Enables Apparmor, integrity subsystem, auditing
374 377 ---
375 378
376 379 #### Reduce disk usage:
377 380 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
378 381
379 382 ##### `REDUCE_APT`=true
380 383 Configure APT to use compressed package repository lists and no package caching files.
381 384
382 385 ##### `REDUCE_DOC`=true
383 386 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
384 387
385 388 ##### `REDUCE_MAN`=true
386 389 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
387 390
388 391 ##### `REDUCE_VIM`=false
389 392 Replace `vim-tiny` package by `levee` a tiny vim clone.
390 393
391 394 ##### `REDUCE_BASH`=false
392 395 Remove `bash` package and switch to `dash` shell (experimental).
393 396
394 397 ##### `REDUCE_HWDB`=true
395 398 Remove PCI related hwdb files (experimental).
396 399
397 400 ##### `REDUCE_SSHD`=true
398 401 Replace `openssh-server` with `dropbear`.
399 402
400 403 ##### `REDUCE_LOCALE`=true
401 404 Remove all `locale` translation files.
402 405
403 406 ---
404 407
405 408 #### Encrypted root partition:
406 409 ##### `ENABLE_CRYPTFS`=false
407 410 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.
408 411
409 412 ##### `CRYPTFS_PASSWORD`=""
410 413 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
411 414
412 415 ##### `CRYPTFS_MAPPING`="secure"
413 416 Set name of dm-crypt managed device-mapper mapping.
414 417
415 418 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
416 419 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
417 420
418 421 ##### `CRYPTFS_XTSKEYSIZE`=512
419 422 Sets key size in bits. The argument has to be a multiple of 8.
420 423
421 424 ##### `CRYPTFS_DROPBEAR`=false
422 425 Enable Dropbear Initramfs support
423 426
424 427 ##### `CRYPTFS_DROPBEAR_PUBKEY`=""
425 428 Provide path to dropbear Public RSA-OpenSSH Key
426 429
427 430 ---
428 431
429 432 #### Build settings:
430 433 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
431 434 Set a path to a working directory used by the script to generate an image.
432 435
433 436 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
434 437 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.
435 438
436 439 ## Understanding the script
437 440 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:
438 441
439 442 | Script | Description |
440 443 | --- | --- |
441 444 | `10-bootstrap.sh` | Debootstrap basic system |
442 445 | `11-apt.sh` | Setup APT repositories |
443 446 | `12-locale.sh` | Setup Locales and keyboard settings |
444 447 | `13-kernel.sh` | Build and install RPi 0/1/2/3 Kernel |
445 448 | `14-fstab.sh` | Setup fstab and initramfs |
446 449 | `15-rpi-config.sh` | Setup RPi 0/1/2/3 config and cmdline |
447 450 | `20-networking.sh` | Setup Networking |
448 451 | `21-firewall.sh` | Setup Firewall |
449 452 | `30-security.sh` | Setup Users and Security settings |
450 453 | `31-logging.sh` | Setup Logging |
451 454 | `32-sshd.sh` | Setup SSH and public keys |
452 455 | `41-uboot.sh` | Build and Setup U-Boot |
453 456 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
454 457 | `43-videocore.sh` | Build and Setup videocore libraries |
455 458 | `50-firstboot.sh` | First boot actions |
456 459 | `99-reduce.sh` | Reduce the disk space usage |
457 460
458 461 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.
459 462
460 463 | Directory | Description |
461 464 | --- | --- |
462 465 | `apt` | APT management configuration files |
463 466 | `boot` | Boot and RPi 0/1/2/3 configuration files |
464 467 | `dpkg` | Package Manager configuration |
465 468 | `etc` | Configuration files and rc scripts |
466 469 | `firstboot` | Scripts that get executed on first boot |
467 470 | `initramfs` | Initramfs scripts |
468 471 | `iptables` | Firewall configuration files |
469 472 | `locales` | Locales configuration |
470 473 | `modules` | Kernel Modules configuration |
471 474 | `mount` | Fstab configuration |
472 475 | `network` | Networking configuration files |
473 476 | `sysctl.d` | Swapping and Network Hardening configuration |
474 477 | `xorg` | fbturbo Xorg driver configuration |
475 478
476 479 ## Custom packages and scripts
477 480 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`.
478 481
479 482 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
480 483
481 484 ## Logging of the bootstrapping process
482 485 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:
483 486
484 487 ```shell
485 488 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
486 489 ```
487 490
488 491 ## Flashing the image file
489 492 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 RPi 0/1/2/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`.
490 493
491 494 ##### Flashing examples:
492 495 ```shell
493 496 bmaptool copy ./images/buster/2017-01-23-rpi3-buster.img /dev/mmcblk0
494 497 dd bs=4M if=./images/buster/2017-01-23-rpi3-buster.img of=/dev/mmcblk0
495 498 ```
496 499 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
497 500 ```shell
498 501 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-frmw.img /dev/mmcblk0
499 502 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-root.img /dev/sdc
500 503 ```
501 504
502 505 ## QEMU emulation
503 506 Start QEMU full system emulation:
504 507 ```shell
505 508 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"
506 509 ```
507 510
508 511 Start QEMU full system emulation and output to console:
509 512 ```shell
510 513 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
511 514 ```
512 515
513 516 Start QEMU full system emulation with SMP and output to console:
514 517 ```shell
515 518 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
516 519 ```
517 520
518 521 Start QEMU full system emulation with cryptfs, initramfs and output to console:
519 522 ```shell
520 523 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
521 524 ```
522 525
523 526 ## External links and references
524 527 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
525 528 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
526 529 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
527 530 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
528 531 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
529 532 * [U-BOOT git repository](https://git.denx.de/?p=u-boot.git;a=summary)
530 533 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
531 534 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
532 535 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,40 +1,40
1 1 #
2 2 # Setup APT repositories
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Install and setup APT proxy configuration
9 9 if [ -z "$APT_PROXY" ] ; then
10 10 install_readonly files/apt/10proxy "${ETC_DIR}/apt/apt.conf.d/10proxy"
11 11 sed -i "s/\"\"/\"${APT_PROXY}\"/" "${ETC_DIR}/apt/apt.conf.d/10proxy"
12 12 fi
13 13
14 14 # Install APT sources.list
15 15 install_readonly files/apt/sources.list "${ETC_DIR}/apt/sources.list"
16 16
17 17 # Use specified APT server and release
18 18 sed -i "s/\/ftp.debian.org\//\/${APT_SERVER}\//" "${ETC_DIR}/apt/sources.list"
19 sed -i "s/ jessie/ ${RELEASE}/" "${ETC_DIR}/apt/sources.list"
19 sed -i "s/ stretch/ ${RELEASE}/" "${ETC_DIR}/apt/sources.list"
20 20
21 21 # Upgrade package index and update all installed packages and changed dependencies
22 22 chroot_exec apt-get -qq -y update
23 23 chroot_exec apt-get -qq -y -u dist-upgrade
24 24
25 25 # Install additional packages
26 26 if [ "$APT_INCLUDES_LATE" ] ; then
27 27 chroot_exec apt-get -qq -y install "$(echo "$APT_INCLUDES_LATE" |tr , ' ')"
28 28 fi
29 29
30 30 # Install Debian custom packages
31 31 if [ -d packages ] ; then
32 32 for package in packages/*.deb ; do
33 33 cp "$package" "${R}"/tmp
34 34 chroot_exec dpkg --unpack /tmp/"$(basename "$package")"
35 35 done
36 36 fi
37 37
38 38 chroot_exec apt-get -qq -y -f install
39 39
40 40 chroot_exec apt-get -qq -y check
@@ -1,8 +1,8
1 deb http://ftp.debian.org/debian jessie main contrib
2 #deb-src http://ftp.debian.org/debian jessie main contrib
1 deb http://ftp.debian.org/debian stretch main contrib
2 #deb-src http://ftp.debian.org/debian stretch main contrib
3 3
4 deb http://ftp.debian.org/debian/ jessie-updates main contrib
5 #deb-src http://ftp.debian.org/debian/ jessie-updates main contrib
4 deb http://ftp.debian.org/debian/ stretch-updates main contrib
5 #deb-src http://ftp.debian.org/debian/ stretch-updates main contrib
6 6
7 deb http://security.debian.org/ jessie/updates main contrib
8 #deb-src http://security.debian.org/ jessie/updates main contrib
7 deb http://security.debian.org/ stretch/updates main contrib
8 #deb-src http://security.debian.org/ stretch/updates main contrib
@@ -1,859 +1,864
1 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 Raspberry Pi
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# RPi 0/1/2/3 Bootstrap Settings\n#\n"
40 40 set -x
41 41
42 42 # Raspberry Pi model configuration
43 43 RPI_MODEL=${RPI_MODEL:=2}
44 44
45 45 # Debian release
46 46 RELEASE=${RELEASE:=buster}
47 47
48 48 # Kernel Branch
49 49 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 BLUETOOTH_URL=${BLUETOOTH_URL:=https://github.com/RPi-Distro/pi-bluetooth.git}
60 60 NEXMON_URL=${NEXMON_URL:=https://github.com/seemoo-lab/nexmon.git}
61 61 SYSTEMDSWAP_URL=${SYSTEMDSWAP_URL:=https://github.com/Nefelim4ag/systemd-swap.git}
62 62
63 63 # Kernel deb packages for 32bit kernel
64 64 RPI_32_KERNEL_URL=${RPI_32_KERNEL_URL:=https://github.com/hypriot/rpi-kernel/releases/download/v4.14.34/raspberrypi-kernel_20180422-141901_armhf.deb}
65 65 RPI_32_KERNELHEADER_URL=${RPI_32_KERNELHEADER_URL:=https://github.com/hypriot/rpi-kernel/releases/download/v4.14.34/raspberrypi-kernel-headers_20180422-141901_armhf.deb}
66 66 # Kernel has KVM and zswap enabled - use if KERNEL_* parameters and precompiled kernel are used
67 67 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}
68 68 # Default precompiled 64bit kernel
69 69 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}
70 70 # Generic
71 71 RPI3_64_KERNEL_URL=${RPI3_64_KERNEL_URL:=$RPI3_64_DEF_KERNEL_URL}
72 72 # Kali kernel src - used if ENABLE_NEXMON=true (they patch the wlan kernel modul)
73 73 KALI_KERNEL_URL=${KALI_KERNEL_URL:=https://github.com/Re4son/re4son-raspberrypi-linux.git}
74 74
75 75 # Build directories
76 76 WORKDIR=$(pwd)
77 77 BASEDIR=${BASEDIR:=${WORKDIR}/images/${RELEASE}}
78 78 BUILDDIR="${BASEDIR}/build"
79 79
80 80 # Chroot directories
81 81 R="${BUILDDIR}/chroot"
82 82 ETC_DIR="${R}/etc"
83 83 LIB_DIR="${R}/lib"
84 84 BOOT_DIR="${R}/boot/firmware"
85 85 KERNEL_DIR="${R}/usr/src/linux"
86 86 WLAN_FIRMWARE_DIR="${LIB_DIR}/firmware/brcm"
87 87 BLUETOOTH_FIRMWARE_DIR="${ETC_DIR}/firmware/bt"
88 88
89 89 # Firmware directory: Blank if download from github
90 90 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
91 91
92 92 # General settings
93 93 SET_ARCH=${SET_ARCH:=32}
94 94 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
95 95 PASSWORD=${PASSWORD:=raspberry}
96 96 USER_PASSWORD=${USER_PASSWORD:=raspberry}
97 97 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
98 98 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
99 99 EXPANDROOT=${EXPANDROOT:=true}
100 100
101 101 # Keyboard settings
102 102 XKB_MODEL=${XKB_MODEL:=""}
103 103 XKB_LAYOUT=${XKB_LAYOUT:=""}
104 104 XKB_VARIANT=${XKB_VARIANT:=""}
105 105 XKB_OPTIONS=${XKB_OPTIONS:=""}
106 106
107 107 # Network settings (DHCP)
108 108 ENABLE_DHCP=${ENABLE_DHCP:=true}
109 109
110 110 # Network settings (static)
111 111 NET_ADDRESS=${NET_ADDRESS:=""}
112 112 NET_GATEWAY=${NET_GATEWAY:=""}
113 113 NET_DNS_1=${NET_DNS_1:=""}
114 114 NET_DNS_2=${NET_DNS_2:=""}
115 115 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
116 116 NET_NTP_1=${NET_NTP_1:=""}
117 117 NET_NTP_2=${NET_NTP_2:=""}
118 118
119 119 # APT settings
120 120 APT_PROXY=${APT_PROXY:=""}
121 121 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
122 KEEP_APT_PROXY=${KEEP_APT_PROXY:=false}
122 123
123 124 # Feature settings
124 125 ENABLE_PRINTK=${ENABLE_PRINTK:=false}
125 126 ENABLE_BLUETOOTH=${ENABLE_BLUETOOTH:=false}
126 127 ENABLE_MINIUART_OVERLAY=${ENABLE_MINIUART_OVERLAY:=false}
127 128 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
128 129 ENABLE_I2C=${ENABLE_I2C:=false}
129 130 ENABLE_SPI=${ENABLE_SPI:=false}
130 131 ENABLE_IPV6=${ENABLE_IPV6:=true}
131 132 ENABLE_SSHD=${ENABLE_SSHD:=true}
132 133 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
133 134 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
134 135 ENABLE_SOUND=${ENABLE_SOUND:=true}
135 136 ENABLE_DBUS=${ENABLE_DBUS:=true}
136 137 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
137 138 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
138 139 ENABLE_XORG=${ENABLE_XORG:=false}
139 140 ENABLE_WM=${ENABLE_WM:=""}
140 141 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
141 142 ENABLE_USER=${ENABLE_USER:=true}
142 143 USER_NAME=${USER_NAME:="pi"}
143 144 ENABLE_ROOT=${ENABLE_ROOT:=false}
144 145 ENABLE_QEMU=${ENABLE_QEMU:=false}
145 146 ENABLE_SYSVINIT=${ENABLE_SYSVINIT:=false}
146 147
147 148 # SSH settings
148 149 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
149 150 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
150 151 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
151 152 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
152 153 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
153 154
154 155 # Advanced settings
155 156 ENABLE_SYSTEMDSWAP=${ENABLE_SYSTEMDSWAP:=false}
156 157 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
157 158 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
158 159 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
159 160 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
160 161 ENABLE_UBOOTUSB=${ENABLE_UBOOTUSB=false}
161 162 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
162 163 ENABLE_VIDEOCORE=${ENABLE_VIDEOCORE:=false}
163 164 ENABLE_NEXMON=${ENABLE_NEXMON:=false}
164 165 VIDEOCORESRC_DIR=${VIDEOCORESRC_DIR:=""}
165 166 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
166 167 NEXMONSRC_DIR=${NEXMONSRC_DIR:=""}
167 168 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
168 169 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
169 170 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
170 171 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
171 172 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
172 173 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
173 174
174 175 # Kernel compilation settings
175 176 BUILD_KERNEL=${BUILD_KERNEL:=true}
176 177 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
177 178 KERNEL_THREADS=${KERNEL_THREADS:=1}
178 179 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
179 180 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
180 181 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
181 182 KERNEL_OLDDEFCONFIG=${KERNEL_OLDDEFCONFIG:=false}
182 183 KERNEL_CCACHE=${KERNEL_CCACHE:=false}
183 184 KERNEL_ZSWAP=${KERNEL_ZSWAP:=false}
184 185 KERNEL_VIRT=${KERNEL_VIRT:=false}
185 186 KERNEL_BPF=${KERNEL_BPF:=false}
186 187 KERNEL_DEFAULT_GOV=${KERNEL_DEFAULT_GOV:=powersave}
187 188 KERNEL_SECURITY=${KERNEL_SECURITY:=false}
188 189 KERNEL_NF=${KERNEL_NF:=false}
189 190
190 191 # Kernel compilation from source directory settings
191 192 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
192 193 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
193 194 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
194 195 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
195 196
196 197 # Reduce disk usage settings
197 198 REDUCE_APT=${REDUCE_APT:=true}
198 199 REDUCE_DOC=${REDUCE_DOC:=true}
199 200 REDUCE_MAN=${REDUCE_MAN:=true}
200 201 REDUCE_VIM=${REDUCE_VIM:=false}
201 202 REDUCE_BASH=${REDUCE_BASH:=false}
202 203 REDUCE_HWDB=${REDUCE_HWDB:=true}
203 204 REDUCE_SSHD=${REDUCE_SSHD:=true}
204 205 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
205 206
206 207 # Encrypted filesystem settings
207 208 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
208 209 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
209 210 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
210 211 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
211 212 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
212 213 #Dropbear-initramfs supports unlocking encrypted filesystem via SSH on bootup
213 214 CRYPTFS_DROPBEAR=${CRYPTFS_DROPBEAR:=false}
214 215 #Provide your own Dropbear Public RSA-OpenSSH Key otherwise it will be generated
215 216 CRYPTFS_DROPBEAR_PUBKEY=${CRYPTFS_DROPBEAR_PUBKEY:=""}
216 217
217 218 # Chroot scripts directory
218 219 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
219 220
220 221 # Packages required in the chroot build environment
221 222 APT_INCLUDES=${APT_INCLUDES:=""}
222 223 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils,locales,keyboard-configuration,console-setup,libnss-systemd"
223 224
224 225 # Packages to exclude from chroot build environment
225 226 APT_EXCLUDES=${APT_EXCLUDES:=""}
226 227
227 228 # Packages required for bootstrapping
228 229 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
229 230 MISSING_PACKAGES=""
230 231
231 232 # Packages installed for c/c++ build environment in chroot (keep empty)
232 233 COMPILER_PACKAGES=""
233 234
234 235 # Check if apt-cacher-ng has port 3142 open and set APT_PROXY
235 236 APT_CACHER_RUNNING=$(lsof -i :3142 | cut -d ' ' -f3 | uniq | sed '/^\s*$/d')
236 237 if [ "${APT_CACHER_RUNNING}" = "apt-cacher-ng" ] ; then
237 238 APT_PROXY=http://127.0.0.1:3142/
238 239 fi
239 240
240 241 # Setup architecture specific settings
241 242 if [ -n "$SET_ARCH" ] ; then
242 243 # 64-bit configuration
243 244 if [ "$SET_ARCH" = 64 ] ; then
244 245 # General 64-bit depended settings
245 246 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
246 247 KERNEL_ARCH=${KERNEL_ARCH:=arm64}
247 248 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
248 249
249 250 # Raspberry Pi model specific settings
250 251 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
251 252 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
252 253 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
253 254 RELEASE_ARCH=${RELEASE_ARCH:=arm64}
254 255 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
255 256 CROSS_COMPILE=${CROSS_COMPILE:=aarch64-linux-gnu-}
256 257 else
257 258 echo "error: Only Raspberry PI 3 and 3B+ support 64-bit"
258 259 exit 1
259 260 fi
260 261 fi
261 262
262 263 # 32-bit configuration
263 264 if [ "$SET_ARCH" = 32 ] ; then
264 265 # General 32-bit dependend settings
265 266 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
266 267 KERNEL_ARCH=${KERNEL_ARCH:=arm}
267 268 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
268 269
269 270 # Raspberry Pi model specific settings
270 271 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
271 272 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
272 273 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
273 274 RELEASE_ARCH=${RELEASE_ARCH:=armel}
274 275 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel.img}
275 276 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabi-}
276 277 fi
277 278
278 279 # Raspberry Pi model specific settings
279 280 if [ "$RPI_MODEL" = 2 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
280 281 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
281 282 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
282 283 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
283 284 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
284 285 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
285 286 fi
286 287 fi
287 288 # SET_ARCH not set
288 289 else
289 290 echo "error: Please set '32' or '64' as value for SET_ARCH"
290 291 exit 1
291 292 fi
292 293 # Device specific configuration and U-Boot configuration
293 294 case "$RPI_MODEL" in
294 295 0)
295 296 DTB_FILE=${DTB_FILE:=bcm2708-rpi-0-w.dtb}
296 297 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
297 298 ;;
298 299 1)
299 300 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b.dtb}
300 301 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
301 302 ;;
302 303 1P)
303 304 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b-plus.dtb}
304 305 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
305 306 ;;
306 307 2)
307 308 DTB_FILE=${DTB_FILE:=bcm2709-rpi-2-b.dtb}
308 309 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_2_defconfig}
309 310 ;;
310 311 3)
311 312 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
312 313 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
313 314 ;;
314 315 3P)
315 316 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
316 317 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
317 318 ;;
318 319 *)
319 320 echo "error: Raspberry Pi model $RPI_MODEL is not supported!"
320 321 exit 1
321 322 ;;
322 323 esac
323 324
324 325 if [ "$ENABLE_UBOOTUSB" = true ] ; then
325 326 if [ "$ENABLE_UBOOT" = false ] ; then
326 327 echo "error: Enabling UBOOTUSB requires u-boot to be enabled"
327 328 exit 1
328 329 fi
329 330 if [ "$RPI_MODEL" != 3 ] || [ "$RPI_MODEL" != 3P ] ; then
330 331 echo "error: Enabling UBOOTUSB requires Raspberry 3"
331 332 exit 1
332 333 fi
333 334 fi
334 335
335 336 # Raspberry PI 0,3,3P with Bluetooth and Wifi onboard
336 337 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
337 338 # Include bluetooth packages on supported boards
338 339 if [ "$ENABLE_BLUETOOTH" = true ] ; then
339 340 APT_INCLUDES="${APT_INCLUDES},bluetooth,bluez"
340 341 fi
341 342 if [ "$ENABLE_WIRELESS" = true ] ; then
342 343 APT_INCLUDES="${APT_INCLUDES},wireless-tools,crda,wireless-regdb"
343 344 fi
344 345 else # Raspberry PI 1,1P,2 without Wifi and bluetooth onboard
345 346 # Check if the internal wireless interface is not supported by the RPi model
346 347 if [ "$ENABLE_WIRELESS" = true ] || [ "$ENABLE_BLUETOOTH" = true ]; then
347 348 echo "error: The selected Raspberry Pi model has no integrated interface for wireless or bluetooth"
348 349 exit 1
349 350 fi
350 351 fi
351 352
352 353 if [ "$BUILD_KERNEL" = false ] && [ "$ENABLE_NEXMON" = true ]; then
353 354 echo "error: You have to compile kernel sources, if you want to enable nexmon"
354 355 exit 1
355 356 fi
356 357
357 358 # Prepare date string for default image file name
358 359 DATE="$(date +%Y-%m-%d)"
359 360 if [ -z "$KERNEL_BRANCH" ] ; then
360 361 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
361 362 else
362 363 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
363 364 fi
364 365
365 366 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
366 367 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
367 368 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
368 369 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
369 370 exit 1
370 371 fi
371 372 fi
372 373
373 374 # Add cmake to compile videocore sources
374 375 if [ "$ENABLE_VIDEOCORE" = true ] ; then
375 376 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cmake"
376 377 fi
377 378
378 379 # Add deps for nexmon
379 380 if [ "$ENABLE_NEXMON" = true ] ; then
380 381 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libgmp3-dev gawk qpdf bison flex make autoconf automake build-essential libtool"
381 382 fi
382 383
383 384 # Add libncurses5 to enable kernel menuconfig
384 385 if [ "$KERNEL_MENUCONFIG" = true ] ; then
385 386 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses-dev"
386 387 fi
387 388
388 389 # Add ccache compiler cache for (faster) kernel cross (re)compilation
389 390 if [ "$KERNEL_CCACHE" = true ] ; then
390 391 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} ccache"
391 392 fi
392 393
393 394 # Add cryptsetup package to enable filesystem encryption
394 395 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
395 396 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
396 397 APT_INCLUDES="${APT_INCLUDES},cryptsetup,busybox,console-setup"
397 398
398 399 # If cryptfs,dropbear and initramfs are enabled include dropbear-initramfs package
399 400 if [ "$CRYPTFS_DROPBEAR" = true ] && [ "$ENABLE_INITRAMFS" = true ]; then
400 401 APT_INCLUDES="${APT_INCLUDES},dropbear-initramfs"
401 402 fi
402 403
403 404 if [ -z "$CRYPTFS_PASSWORD" ] ; then
404 405 echo "error: no password defined (CRYPTFS_PASSWORD)!"
405 406 exit 1
406 407 fi
407 408 ENABLE_INITRAMFS=true
408 409 fi
409 410
410 411 # Add initramfs generation tools
411 412 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
412 413 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
413 414 fi
414 415
415 416 # Add device-tree-compiler required for building the U-Boot bootloader
416 417 if [ "$ENABLE_UBOOT" = true ] ; then
417 418 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex,bc"
418 419 fi
419 420
420 421 # Check if root SSH (v2) public key file exists
421 422 if [ -n "$SSH_ROOT_PUB_KEY" ] ; then
422 423 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
423 424 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
424 425 exit 1
425 426 fi
426 427 fi
427 428
428 429 # Check if $USER_NAME SSH (v2) public key file exists
429 430 if [ -n "$SSH_USER_PUB_KEY" ] ; then
430 431 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
431 432 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
432 433 exit 1
433 434 fi
434 435 fi
435 436
436 437 if [ "$ENABLE_NEXMON" = true ] && [ -n "$KERNEL_BRANCH" ] ; then
437 438 echo "error: Please unset KERNEL_BRANCH if using ENABLE_NEXMON"
438 439 exit 1
439 440 fi
440 441
441 442 # Check if all required packages are installed on the build system
442 443 for package in $REQUIRED_PACKAGES ; do
443 444 if [ "$(dpkg-query -W -f='${Status}' "$package")" != "install ok installed" ] ; then
444 445 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
445 446 fi
446 447 done
447 448
448 449 # If there are missing packages ask confirmation for install, or exit
449 450 if [ -n "$MISSING_PACKAGES" ] ; then
450 451 echo "the following packages needed by this script are not installed:"
451 452 echo "$MISSING_PACKAGES"
452 453
453 454 printf "\ndo you want to install the missing packages right now? [y/n] "
454 455 read -r confirm
455 456 [ "$confirm" != "y" ] && exit 1
456 457
457 458 # Make sure all missing required packages are installed
458 459 apt-get -qq -y install `echo "${MISSING_PACKAGES}" | sed "s/ //"`
459 460 fi
460 461
461 462 # Check if ./bootstrap.d directory exists
462 463 if [ ! -d "./bootstrap.d/" ] ; then
463 464 echo "error: './bootstrap.d' required directory not found!"
464 465 exit 1
465 466 fi
466 467
467 468 # Check if ./files directory exists
468 469 if [ ! -d "./files/" ] ; then
469 470 echo "error: './files' required directory not found!"
470 471 exit 1
471 472 fi
472 473
473 474 # Check if specified KERNELSRC_DIR directory exists
474 475 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
475 476 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
476 477 exit 1
477 478 fi
478 479
479 480 # Check if specified UBOOTSRC_DIR directory exists
480 481 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
481 482 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
482 483 exit 1
483 484 fi
484 485
485 486 # Check if specified VIDEOCORESRC_DIR directory exists
486 487 if [ -n "$VIDEOCORESRC_DIR" ] && [ ! -d "$VIDEOCORESRC_DIR" ] ; then
487 488 echo "error: '${VIDEOCORESRC_DIR}' specified directory not found (VIDEOCORESRC_DIR)!"
488 489 exit 1
489 490 fi
490 491
491 492 # Check if specified FBTURBOSRC_DIR directory exists
492 493 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
493 494 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
494 495 exit 1
495 496 fi
496 497
497 498 # Check if specified NEXMONSRC_DIR directory exists
498 499 if [ -n "$NEXMONSRC_DIR" ] && [ ! -d "$NEXMONSRC_DIR" ] ; then
499 500 echo "error: '${NEXMONSRC_DIR}' specified directory not found (NEXMONSRC_DIR)!"
500 501 exit 1
501 502 fi
502 503
503 504 # Check if specified CHROOT_SCRIPTS directory exists
504 505 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
505 506 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
506 507 exit 1
507 508 fi
508 509
509 510 # Check if specified device mapping already exists (will be used by cryptsetup)
510 511 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
511 512 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
512 513 exit 1
513 514 fi
514 515
515 516 # Don't clobber an old build
516 517 if [ -e "$BUILDDIR" ] ; then
517 518 echo "error: directory ${BUILDDIR} already exists, not proceeding"
518 519 exit 1
519 520 fi
520 521
521 522 # Setup chroot directory
522 523 mkdir -p "${R}"
523 524
524 525 # Check if build directory has enough of free disk space >512MB
525 526 if [ "$(df --output=avail "${BUILDDIR}" | sed "1d")" -le "524288" ] ; then
526 527 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
527 528 exit 1
528 529 fi
529 530
530 531 set -x
531 532
532 533 # Call "cleanup" function on various signals and errors
533 534 trap cleanup 0 1 2 3 6
534 535
535 536 # Add required packages for the minbase installation
536 537 if [ "$ENABLE_MINBASE" = true ] ; then
537 538 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
538 539 fi
539 540
540 541 # Add parted package, required to get partprobe utility
541 542 if [ "$EXPANDROOT" = true ] ; then
542 543 APT_INCLUDES="${APT_INCLUDES},parted"
543 544 fi
544 545
545 546 # Add dbus package, recommended if using systemd
546 547 if [ "$ENABLE_DBUS" = true ] ; then
547 548 APT_INCLUDES="${APT_INCLUDES},dbus"
548 549 fi
549 550
550 551 # Add iptables IPv4/IPv6 package
551 552 if [ "$ENABLE_IPTABLES" = true ] ; then
552 553 APT_INCLUDES="${APT_INCLUDES},iptables,iptables-persistent"
553 554 fi
554 555 # Add apparmor for KERNEL_SECURITY
555 556 if [ "$KERNEL_SECURITY" = true ] ; then
556 557 APT_INCLUDES="${APT_INCLUDES},apparmor,apparmor-utils,apparmor-profiles,apparmor-profiles-extra,libapparmor-perl"
557 558 fi
558 559
559 560 # Add openssh server package
560 561 if [ "$ENABLE_SSHD" = true ] ; then
561 562 APT_INCLUDES="${APT_INCLUDES},openssh-server"
562 563 fi
563 564
564 565 # Add alsa-utils package
565 566 if [ "$ENABLE_SOUND" = true ] ; then
566 567 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
567 568 fi
568 569
569 570 # Add rng-tools package
570 571 if [ "$ENABLE_HWRANDOM" = true ] ; then
571 572 APT_INCLUDES="${APT_INCLUDES},rng-tools"
572 573 fi
573 574
574 575 # Add fbturbo video driver
575 576 if [ "$ENABLE_FBTURBO" = true ] ; then
576 577 # Enable xorg package dependencies
577 578 ENABLE_XORG=true
578 579 fi
579 580
580 581 # Add user defined window manager package
581 582 if [ -n "$ENABLE_WM" ] ; then
582 583 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
583 584
584 585 # Enable xorg package dependencies
585 586 ENABLE_XORG=true
586 587 fi
587 588
588 589 # Add xorg package
589 590 if [ "$ENABLE_XORG" = true ] ; then
590 591 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
591 592 fi
592 593
593 594 # Replace selected packages with smaller clones
594 595 if [ "$ENABLE_REDUCE" = true ] ; then
595 596 # Add levee package instead of vim-tiny
596 597 if [ "$REDUCE_VIM" = true ] ; then
597 598 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
598 599 fi
599 600
600 601 # Add dropbear package instead of openssh-server
601 602 if [ "$REDUCE_SSHD" = true ] ; then
602 603 APT_INCLUDES="$(echo "${APT_INCLUDES}" | sed "s/openssh-server/dropbear/")"
603 604 fi
604 605 fi
605 606
606 607 # Configure systemd-sysv exclude to make halt/reboot/shutdown scripts available
607 608 if [ "$ENABLE_SYSVINIT" = false ] ; then
608 609 APT_EXCLUDES="--exclude=${APT_EXCLUDES},init,systemd-sysv"
609 610 fi
610 611
611 612 # Configure kernel sources if no KERNELSRC_DIR
612 613 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
613 614 KERNELSRC_CONFIG=true
614 615 fi
615 616
616 617 # Configure reduced kernel
617 618 if [ "$KERNEL_REDUCE" = true ] ; then
618 619 KERNELSRC_CONFIG=false
619 620 fi
620 621
621 622 # Configure qemu compatible kernel
622 623 if [ "$ENABLE_QEMU" = true ] ; then
623 624 DTB_FILE=vexpress-v2p-ca15_a7.dtb
624 625 UBOOT_CONFIG=vexpress_ca15_tc2_defconfig
625 626 KERNEL_DEFCONFIG="vexpress_defconfig"
626 627 if [ "$KERNEL_MENUCONFIG" = false ] ; then
627 628 KERNEL_OLDDEFCONFIG=true
628 629 fi
629 630 fi
630 631
631 632 # Execute bootstrap scripts
632 633 for SCRIPT in bootstrap.d/*.sh; do
633 634 head -n 3 "$SCRIPT"
634 635 . "$SCRIPT"
635 636 done
636 637
637 638 ## Execute custom bootstrap scripts
638 639 if [ -d "custom.d" ] ; then
639 640 for SCRIPT in custom.d/*.sh; do
640 641 . "$SCRIPT"
641 642 done
642 643 fi
643 644
644 645 # Execute custom scripts inside the chroot
645 646 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
646 647 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
647 648 chroot_exec /bin/bash -x <<'EOF'
648 649 for SCRIPT in /chroot_scripts/* ; do
649 650 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
650 651 $SCRIPT
651 652 fi
652 653 done
653 654 EOF
654 655 rm -rf "${R}/chroot_scripts"
655 656 fi
656 657
657 658 # Remove c/c++ build environment from the chroot
658 659 chroot_remove_cc
659 660
660 661 # Generate required machine-id
661 662 MACHINE_ID=$(dbus-uuidgen)
662 663 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
663 664 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
664 665
665 666 # APT Cleanup
666 667 chroot_exec apt-get -y clean
667 668 chroot_exec apt-get -y autoclean
668 669 chroot_exec apt-get -y autoremove
669 670
670 671 # Unmount mounted filesystems
671 672 umount -l "${R}/proc"
672 673 umount -l "${R}/sys"
673 674
674 675 # Clean up directories
675 676 rm -rf "${R}/run/*"
676 677 rm -rf "${R}/tmp/*"
677 678
679 # Clean up APT proxy settings
680 if [ "$KEEP_APT_PROXY" = false ] ; then
681 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
682 fi
683
678 684 # Clean up files
679 685 rm -f "${ETC_DIR}/ssh/ssh_host_*"
680 686 rm -f "${ETC_DIR}/dropbear/dropbear_*"
681 687 rm -f "${ETC_DIR}/apt/sources.list.save"
682 688 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
683 689 rm -f "${ETC_DIR}/*-"
684 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
685 690 rm -f "${ETC_DIR}/resolv.conf"
686 691 rm -f "${R}/root/.bash_history"
687 692 rm -f "${R}/var/lib/urandom/random-seed"
688 693 rm -f "${R}/initrd.img"
689 694 rm -f "${R}/vmlinuz"
690 695 rm -f "${R}${QEMU_BINARY}"
691 696
692 697 if [ "$ENABLE_QEMU" = true ] ; then
693 698 # Setup QEMU directory
694 699 mkdir "${BASEDIR}/qemu"
695 700
696 701 # Copy kernel image to QEMU directory
697 702 install_readonly "${BOOT_DIR}/${KERNEL_IMAGE}" "${BASEDIR}/qemu/${KERNEL_IMAGE}"
698 703
699 704 # Copy kernel config to QEMU directory
700 705 install_readonly "${R}/boot/config-${KERNEL_VERSION}" "${BASEDIR}/qemu/config-${KERNEL_VERSION}"
701 706
702 707 # Copy kernel dtbs to QEMU directory
703 708 for dtb in "${BOOT_DIR}/"*.dtb ; do
704 709 if [ -f "${dtb}" ] ; then
705 710 install_readonly "${dtb}" "${BASEDIR}/qemu/"
706 711 fi
707 712 done
708 713
709 714 # Copy kernel overlays to QEMU directory
710 715 if [ -d "${BOOT_DIR}/overlays" ] ; then
711 716 # Setup overlays dtbs directory
712 717 mkdir "${BASEDIR}/qemu/overlays"
713 718
714 719 for dtb in "${BOOT_DIR}/overlays/"*.dtb ; do
715 720 if [ -f "${dtb}" ] ; then
716 721 install_readonly "${dtb}" "${BASEDIR}/qemu/overlays/"
717 722 fi
718 723 done
719 724 fi
720 725
721 726 # Copy u-boot files to QEMU directory
722 727 if [ "$ENABLE_UBOOT" = true ] ; then
723 728 if [ -f "${BOOT_DIR}/u-boot.bin" ] ; then
724 729 install_readonly "${BOOT_DIR}/u-boot.bin" "${BASEDIR}/qemu/u-boot.bin"
725 730 fi
726 731 if [ -f "${BOOT_DIR}/uboot.mkimage" ] ; then
727 732 install_readonly "${BOOT_DIR}/uboot.mkimage" "${BASEDIR}/qemu/uboot.mkimage"
728 733 fi
729 734 if [ -f "${BOOT_DIR}/boot.scr" ] ; then
730 735 install_readonly "${BOOT_DIR}/boot.scr" "${BASEDIR}/qemu/boot.scr"
731 736 fi
732 737 fi
733 738
734 739 # Copy initramfs to QEMU directory
735 740 if [ -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" ] ; then
736 741 install_readonly "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" "${BASEDIR}/qemu/initramfs-${KERNEL_VERSION}"
737 742 fi
738 743 fi
739 744
740 745 # Calculate size of the chroot directory in KB
741 746 CHROOT_SIZE=$(expr "$(du -s "${R}" | awk '{ print $1 }')")
742 747
743 748 # Calculate the amount of needed 512 Byte sectors
744 749 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
745 750 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
746 751 ROOT_OFFSET=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}")
747 752
748 753 # The root partition is EXT4
749 754 # This means more space than the actual used space of the chroot is used.
750 755 # As overhead for journaling and reserved blocks 35% are added.
751 756 ROOT_SECTORS=$(expr "$(expr "${CHROOT_SIZE}" + "${CHROOT_SIZE}" \/ 100 \* 35)" \* 1024 \/ 512)
752 757
753 758 # Calculate required image size in 512 Byte sectors
754 759 IMAGE_SECTORS=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}")
755 760
756 761 # Prepare image file
757 762 if [ "$ENABLE_SPLITFS" = true ] ; then
758 763 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count="${TABLE_SECTORS}"
759 764 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek="${FRMW_SECTORS}"
760 765 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count="${TABLE_SECTORS}"
761 766 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek="${ROOT_SECTORS}"
762 767
763 768 # Write firmware/boot partition tables
764 769 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
765 770 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
766 771 EOM
767 772
768 773 # Write root partition table
769 774 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
770 775 ${TABLE_SECTORS},${ROOT_SECTORS},83
771 776 EOM
772 777
773 778 # Setup temporary loop devices
774 779 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME"-frmw.img)"
775 780 ROOT_LOOP="$(losetup -o 1M -f --show "$IMAGE_NAME"-root.img)"
776 781 else # ENABLE_SPLITFS=false
777 782 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count="${TABLE_SECTORS}"
778 783 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek="${IMAGE_SECTORS}"
779 784
780 785 # Write partition table
781 786 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
782 787 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
783 788 ${ROOT_OFFSET},${ROOT_SECTORS},83
784 789 EOM
785 790
786 791 # Setup temporary loop devices
787 792 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME".img)"
788 793 ROOT_LOOP="$(losetup -o 65M -f --show "$IMAGE_NAME".img)"
789 794 fi
790 795
791 796 if [ "$ENABLE_CRYPTFS" = true ] ; then
792 797 # Create dummy ext4 fs
793 798 mkfs.ext4 "$ROOT_LOOP"
794 799
795 800 # Setup password keyfile
796 801 touch .password
797 802 chmod 600 .password
798 803 echo -n ${CRYPTFS_PASSWORD} > .password
799 804
800 805 # Initialize encrypted partition
801 806 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
802 807
803 808 # Open encrypted partition and setup mapping
804 809 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
805 810
806 811 # Secure delete password keyfile
807 812 shred -zu .password
808 813
809 814 # Update temporary loop device
810 815 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
811 816
812 817 # Wipe encrypted partition (encryption cipher is used for randomness)
813 818 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count="$(blockdev --getsz "${ROOT_LOOP}")"
814 819 fi
815 820
816 821 # Build filesystems
817 822 mkfs.vfat "$FRMW_LOOP"
818 823 mkfs.ext4 "$ROOT_LOOP"
819 824
820 825 # Mount the temporary loop devices
821 826 mkdir -p "$BUILDDIR/mount"
822 827 mount "$ROOT_LOOP" "$BUILDDIR/mount"
823 828
824 829 mkdir -p "$BUILDDIR/mount/boot/firmware"
825 830 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
826 831
827 832 # Copy all files from the chroot to the loop device mount point directory
828 833 rsync -a "${R}/" "$BUILDDIR/mount/"
829 834
830 835 # Unmount all temporary loop devices and mount points
831 836 cleanup
832 837
833 838 # Create block map file(s) of image(s)
834 839 if [ "$ENABLE_SPLITFS" = true ] ; then
835 840 # Create block map files for "bmaptool"
836 841 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
837 842 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
838 843
839 844 # Image was successfully created
840 845 echo "$IMAGE_NAME-frmw.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
841 846 echo "$IMAGE_NAME-root.img ($(expr \( "${TABLE_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
842 847 else
843 848 # Create block map file for "bmaptool"
844 849 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
845 850
846 851 # Image was successfully created
847 852 echo "$IMAGE_NAME.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
848 853
849 854 # Create qemu qcow2 image
850 855 if [ "$ENABLE_QEMU" = true ] ; then
851 856 QEMU_IMAGE=${QEMU_IMAGE:=${BASEDIR}/qemu/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
852 857 QEMU_SIZE=16G
853 858
854 859 qemu-img convert -f raw -O qcow2 "$IMAGE_NAME".img "$QEMU_IMAGE".qcow2
855 860 qemu-img resize "$QEMU_IMAGE".qcow2 $QEMU_SIZE
856 861
857 862 echo "$QEMU_IMAGE.qcow2 ($QEMU_SIZE)" ": successfully created"
858 863 fi
859 864 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant