##// END OF EJS Templates
Merge pull request #159 from burnbabyburn/refactor_mergeable...
drtyhlpr -
r386:ba5db7d5fd01 Fusion
parent child
Show More
@@ -1,499 +1,494
1 1 # rpi23-gen-image
2 2 ## Introduction
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 `jessie`, `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```).
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 The script has been tested using the default `crossbuild-essential-armhf` toolchain meta package on Debian Linux `jessie` and `stretch` build systems. Please check the [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains) for further information.
13
14 If a Debian Linux `jessie` build system is used it will be required to add the [Debian Cross-toolchains repository](http://emdebian.org/tools/debian/) first:
15
16 ```
17 echo "deb http://emdebian.org/tools/debian/ jessie main" > /etc/apt/sources.list.d/crosstools.list
18 sudo -u nobody wget -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
19 dpkg --add-architecture armhf
20 apt-get update
21 ```
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.
22 13
23 14 ## Command-line parameters
24 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.
25 16
26 17 ##### Command-line examples:
27 18 ```shell
28 19 ENABLE_UBOOT=true ./rpi23-gen-image.sh
29 20 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
30 21 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
31 22 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
32 23 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
33 24 ENABLE_MINBASE=true ./rpi23-gen-image.sh
34 25 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
35 26 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
36 27 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
37 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
38 29 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
39 30 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
40 31 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
41 32 ```
42 33
43 34 ## Configuration template files
44 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.
45 36
46 37 ##### Command-line examples:
47 38 ```shell
48 39 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
49 40 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
50 41 ```
51 42
52 43 ## Supported parameters and settings
53 44 #### APT settings:
54 45 ##### `APT_SERVER`="ftp.debian.org"
55 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.
56 47
57 48 ##### `APT_PROXY`=""
58 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.
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.
59 50
60 51 ##### `APT_INCLUDES`=""
61 52 A comma separated list of additional packages to be installed by debootstrap during bootstrapping.
62 53
63 54 ##### `APT_INCLUDES_LATE`=""
64 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.
65 56
66 57 ---
67 58
68 59 #### General system settings:
60 ##### `SET_ARCH`=32
61 Set Architecture to default 32bit. If you want to to compile 64bit (RPI3 or RPI3+) set it to `64`. This Option will set every needed crosscompiler or boeard specific option for a successful build.
62 If you want to change e.g. cross-compiler -> Templates alwys override defaults
63
69 64 ##### `RPI_MODEL`=2
70 65 Specifiy the target Raspberry Pi hardware model. The script at this time supports the following Raspberry Pi models:
71 66 `0` = Used for Raspberry Pi 0 and Raspberry Pi 0 W
72 67 `1` = Used for Pi 1 model A and B
73 68 `1P` = Used for Pi 1 model B+ and A+
74 69 `2` = Used for Pi 2 model B
75 70 `3` = Used for Pi 3 model B
76 71 `3P` = Used for Pi 3 model B+
77 72 `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` or `3P` is used.
78 73
79 ##### `RELEASE`="jessie"
80 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases "jessie", "stretch" and "buster". `BUILD_KERNEL`=true will automatically be set if the Debian releases `stretch` or `buster` are used.
74 ##### `RELEASE`="buster"
75 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.
81 76
82 77 ##### `RELEASE_ARCH`="armhf"
83 78 Set the desired Debian release architecture.
84 79
85 80 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
86 81 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
87 82
88 83 ##### `PASSWORD`="raspberry"
89 84 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
90 85
91 86 ##### `USER_PASSWORD`="raspberry"
92 87 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.
93 88
94 89 ##### `DEFLOCAL`="en_US.UTF-8"
95 90 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`.
96 91
97 92 ##### `TIMEZONE`="Europe/Berlin"
98 93 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.
99 94
100 95 ##### `EXPANDROOT`=true
101 96 Expand the root partition and filesystem automatically on first boot.
102 97
103 98 ##### `ENABLE_QEMU`=false
104 99 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.
105 100
106 101 ---
107 102
108 103 #### Keyboard settings:
109 104 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.
110 105
111 106 ##### `XKB_MODEL`=""
112 107 Set the name of the model of your keyboard type.
113 108
114 109 ##### `XKB_LAYOUT`=""
115 110 Set the supported keyboard layout(s).
116 111
117 112 ##### `XKB_VARIANT`=""
118 113 Set the supported variant(s) of the keyboard layout(s).
119 114
120 115 ##### `XKB_OPTIONS`=""
121 116 Set extra xkb configuration options.
122 117
123 118 ---
124 119
125 120 #### Networking settings (DHCP):
126 121 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`.`
127 122
128 123 ##### `ENABLE_DHCP`=true
129 124 Set the system to use DHCP. This requires an DHCP server.
130 125
131 126 ---
132 127
133 128 #### Networking settings (static):
134 129 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`.
135 130
136 131 ##### `NET_ADDRESS`=""
137 132 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
138 133
139 134 ##### `NET_GATEWAY`=""
140 135 Set the IP address for the default gateway.
141 136
142 137 ##### `NET_DNS_1`=""
143 138 Set the IP address for the first DNS server.
144 139
145 140 ##### `NET_DNS_2`=""
146 141 Set the IP address for the second DNS server.
147 142
148 143 ##### `NET_DNS_DOMAINS`=""
149 144 Set the default DNS search domains to use for non fully qualified host names.
150 145
151 146 ##### `NET_NTP_1`=""
152 147 Set the IP address for the first NTP server.
153 148
154 149 ##### `NET_NTP_2`=""
155 150 Set the IP address for the second NTP server.
156 151
157 152 ---
158 153
159 154 #### Basic system features:
160 155 ##### `ENABLE_CONSOLE`=true
161 156 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.
162 157
163 158 ##### `ENABLE_I2C`=false
164 159 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.
165 160
166 161 ##### `ENABLE_SPI`=false
167 162 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.
168 163
169 164 ##### `ENABLE_IPV6`=true
170 165 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
171 166
172 167 ##### `ENABLE_SSHD`=true
173 168 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.
174 169
175 170 ##### `ENABLE_NONFREE`=false
176 171 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.
177 172
178 173 ##### `ENABLE_WIRELESS`=false
179 174 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`.
180 175
181 176 ##### `ENABLE_RSYSLOG`=true
182 177 If set to false, disable and uninstall rsyslog (so logs will be available only
183 178 in journal files)
184 179
185 180 ##### `ENABLE_SOUND`=true
186 181 Enable sound hardware and install Advanced Linux Sound Architecture.
187 182
188 183 ##### `ENABLE_HWRANDOM`=true
189 184 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
190 185
191 186 ##### `ENABLE_MINGPU`=false
192 187 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
193 188
194 189 ##### `ENABLE_DBUS`=true
195 190 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
196 191
197 192 ##### `ENABLE_XORG`=false
198 193 Install Xorg open-source X Window System.
199 194
200 195 ##### `ENABLE_WM`=""
201 196 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`.
202 197
203 198 ##### `ENABLE_SYSVINIT`=false
204 199 Support for halt,init,poweroff,reboot,runlevel,shutdown,telinit commands
205 200
206 201 ---
207 202
208 203 #### Advanced system features:
209 204 ##### `ENABLE_MINBASE`=false
210 205 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
211 206
212 207 ##### `ENABLE_REDUCE`=false
213 208 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
214 209
215 210 ##### `ENABLE_UBOOT`=false
216 211 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.
217 212
218 213 ##### `UBOOTSRC_DIR`=""
219 214 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.
220 215
221 216 ##### `ENABLE_FBTURBO`=false
222 217 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.
223 218
224 219 ##### `FBTURBOSRC_DIR`=""
225 220 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.
226 221
227 222 ##### `ENABLE_VIDEOCORE`=false
228 223 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.
229 224
230 225 ##### `VIDEOCORESRC_DIR`=""
231 226 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.
232 227
233 228 ##### `ENABLE_IPTABLES`=false
234 229 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
235 230
236 231 ##### `ENABLE_USER`=true
237 232 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
238 233
239 234 ##### `USER_NAME`=pi
240 235 Non-root user to create. Ignored if `ENABLE_USER`=false
241 236
242 237 ##### `ENABLE_ROOT`=false
243 238 Set root user password so root login will be enabled
244 239
245 240 ##### `ENABLE_HARDNET`=false
246 241 Enable IPv4/IPv6 network stack hardening settings.
247 242
248 243 ##### `ENABLE_SPLITFS`=false
249 244 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
250 245
251 246 ##### `CHROOT_SCRIPTS`=""
252 247 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.
253 248
254 249 ##### `ENABLE_INITRAMFS`=false
255 250 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.
256 251
257 252 ##### `ENABLE_IFNAMES`=true
258 253 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.
259 254
260 255 ##### `DISABLE_UNDERVOLT_WARNINGS`=
261 256 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.
262 257
263 258 ---
264 259
265 260 #### SSH settings:
266 261 ##### `SSH_ENABLE_ROOT`=false
267 262 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`.
268 263
269 264 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
270 265 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
271 266
272 267 ##### `SSH_LIMIT_USERS`=false
273 268 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).
274 269
275 270 ##### `SSH_ROOT_PUB_KEY`=""
276 271 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`.
277 272
278 273 ##### `SSH_USER_PUB_KEY`=""
279 274 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.
280 275
281 276 ---
282 277
283 278 #### Kernel compilation:
284 279 ##### `BUILD_KERNEL`=false
285 280 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.
286 281
287 282 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
288 283 This sets the cross compile enviornment for the compiler.
289 284
290 285 ##### `KERNEL_ARCH`="arm"
291 286 This sets the kernel architecture for the compiler.
292 287
293 288 ##### `KERNEL_IMAGE`="kernel7.img"
294 289 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.
295 290
296 291 ##### `KERNEL_BRANCH`=""
297 292 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
298 293
299 294 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
300 295 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.
301 296
302 297 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
303 298 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
304 299
305 300 ##### `KERNEL_REDUCE`=false
306 301 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
307 302
308 303 ##### `KERNEL_THREADS`=1
309 304 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.
310 305
311 306 ##### `KERNEL_HEADERS`=true
312 307 Install kernel headers with built kernel.
313 308
314 309 ##### `KERNEL_MENUCONFIG`=false
315 310 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
316 311
317 312 ##### `KERNEL_OLDDEFCONFIG`=false
318 313 Run `make olddefconfig` to automatically set all new kernel configuration options to their recommended default values.
319 314
320 315 ##### `KERNEL_CCACHE`=false
321 316 Compile the kernel using ccache. This speeds up kernel recompilation by caching previous compilations and detecting when the same compilation is being done again.
322 317
323 318 ##### `KERNEL_REMOVESRC`=true
324 319 Remove all kernel sources from the generated OS image after it was built and installed.
325 320
326 321 ##### `KERNELSRC_DIR`=""
327 322 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.
328 323
329 324 ##### `KERNELSRC_CLEAN`=false
330 325 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.
331 326
332 327 ##### `KERNELSRC_CONFIG`=true
333 328 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.
334 329
335 330 ##### `KERNELSRC_USRCONFIG`=""
336 331 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
337 332
338 333 ##### `KERNELSRC_PREBUILT`=false
339 334 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.
340 335
341 336 ##### `RPI_FIRMWARE_DIR`=""
342 337 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.
343 338
344 339 ---
345 340
346 341 #### Reduce disk usage:
347 342 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
348 343
349 344 ##### `REDUCE_APT`=true
350 345 Configure APT to use compressed package repository lists and no package caching files.
351 346
352 347 ##### `REDUCE_DOC`=true
353 348 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
354 349
355 350 ##### `REDUCE_MAN`=true
356 351 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
357 352
358 353 ##### `REDUCE_VIM`=false
359 354 Replace `vim-tiny` package by `levee` a tiny vim clone.
360 355
361 356 ##### `REDUCE_BASH`=false
362 357 Remove `bash` package and switch to `dash` shell (experimental).
363 358
364 359 ##### `REDUCE_HWDB`=true
365 360 Remove PCI related hwdb files (experimental).
366 361
367 362 ##### `REDUCE_SSHD`=true
368 363 Replace `openssh-server` with `dropbear`.
369 364
370 365 ##### `REDUCE_LOCALE`=true
371 366 Remove all `locale` translation files.
372 367
373 368 ---
374 369
375 370 #### Encrypted root partition:
376 371 ##### `ENABLE_CRYPTFS`=false
377 372 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 373
379 374 ##### `CRYPTFS_PASSWORD`=""
380 375 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
381 376
382 377 ##### `CRYPTFS_MAPPING`="secure"
383 378 Set name of dm-crypt managed device-mapper mapping.
384 379
385 380 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
386 381 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
387 382
388 383 ##### `CRYPTFS_XTSKEYSIZE`=512
389 384 Sets key size in bits. The argument has to be a multiple of 8.
390 385
391 386 ---
392 387
393 388 #### Build settings:
394 389 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
395 390 Set a path to a working directory used by the script to generate an image.
396 391
397 392 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
398 393 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 394
400 395 ## Understanding the script
401 396 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 397
403 398 | Script | Description |
404 399 | --- | --- |
405 400 | `10-bootstrap.sh` | Debootstrap basic system |
406 401 | `11-apt.sh` | Setup APT repositories |
407 402 | `12-locale.sh` | Setup Locales and keyboard settings |
408 403 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
409 404 | `14-fstab.sh` | Setup fstab and initramfs |
410 405 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
411 406 | `20-networking.sh` | Setup Networking |
412 407 | `21-firewall.sh` | Setup Firewall |
413 408 | `30-security.sh` | Setup Users and Security settings |
414 409 | `31-logging.sh` | Setup Logging |
415 410 | `32-sshd.sh` | Setup SSH and public keys |
416 411 | `41-uboot.sh` | Build and Setup U-Boot |
417 412 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
418 413 | `50-firstboot.sh` | First boot actions |
419 414 | `99-reduce.sh` | Reduce the disk space usage |
420 415
421 416 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 417
423 418 | Directory | Description |
424 419 | --- | --- |
425 420 | `apt` | APT management configuration files |
426 421 | `boot` | Boot and RPi2/3 configuration files |
427 422 | `dpkg` | Package Manager configuration |
428 423 | `etc` | Configuration files and rc scripts |
429 424 | `firstboot` | Scripts that get executed on first boot |
430 425 | `initramfs` | Initramfs scripts |
431 426 | `iptables` | Firewall configuration files |
432 427 | `locales` | Locales configuration |
433 428 | `modules` | Kernel Modules configuration |
434 429 | `mount` | Fstab configuration |
435 430 | `network` | Networking configuration files |
436 431 | `sysctl.d` | Swapping and Network Hardening configuration |
437 432 | `xorg` | fbturbo Xorg driver configuration |
438 433
439 434 ## Custom packages and scripts
440 435 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 436
442 437 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
443 438
444 439 ## Logging of the bootstrapping process
445 440 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 441
447 442 ```shell
448 443 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
449 444 ```
450 445
451 446 ## Flashing the image file
452 447 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 448
454 449 ##### Flashing examples:
455 450 ```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
451 bmaptool copy ./images/buster/2017-01-23-rpi3-buster.img /dev/mmcblk0
452 dd bs=4M if=./images/buster/2017-01-23-rpi3-buster.img of=/dev/mmcblk0
458 453 ```
459 454 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
460 455 ```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
456 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-frmw.img /dev/mmcblk0
457 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-root.img /dev/sdc
463 458 ```
464 459
465 460 ## QEMU emulation
466 461 Start QEMU full system emulation:
467 462 ```shell
468 463 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 464 ```
470 465
471 466 Start QEMU full system emulation and output to console:
472 467 ```shell
473 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=ttyAMA0,115200 init=/bin/systemd" -serial stdio
474 469 ```
475 470
476 471 Start QEMU full system emulation with SMP and output to console:
477 472 ```shell
478 473 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 474 ```
480 475
481 476 Start QEMU full system emulation with cryptfs, initramfs and output to console:
482 477 ```shell
483 478 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 479 ```
485 480
486 481 ## Weekly image builds
487 482 The image files are provided by JRWR'S I/O PORT and are built once a Sunday at midnight UTC!
488 483 * [Debian Stretch Raspberry Pi2/3 Weekly Image Builds](https://jrwr.io/doku.php?id=projects:debianpi)
489 484
490 485 ## External links and references
491 486 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
492 487 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
493 488 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
494 489 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
495 490 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
496 491 * [U-BOOT git repository](https://git.denx.de/?p=u-boot.git;a=summary)
497 492 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
498 493 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
499 494 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,41 +1,41
1 1 #
2 2 # Debootstrap basic system
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 VARIANT=""
9 9 COMPONENTS="main"
10 10
11 11 # Use non-free Debian packages if needed
12 12 if [ "$ENABLE_NONFREE" = true ] ; then
13 13 COMPONENTS="main,non-free,contrib"
14 14 fi
15 15
16 16 # Use minbase bootstrap variant which only includes essential packages
17 17 if [ "$ENABLE_MINBASE" = true ] ; then
18 18 VARIANT="--variant=minbase"
19 19 fi
20 20
21 21 # Base debootstrap (unpack only)
22 http_proxy=${APT_PROXY} debootstrap "${APT_EXCLUDES}" --arch="${RELEASE_ARCH}" --foreign ${VARIANT} --components="${COMPONENTS}" --include="${APT_INCLUDES}" "${RELEASE}" "${R}" "http://${APT_SERVER}/debian"
22 http_proxy=${APT_PROXY} debootstrap ${APT_EXCLUDES} --arch="${RELEASE_ARCH}" --foreign ${VARIANT} --components="${COMPONENTS}" --include="${APT_INCLUDES}" "${RELEASE}" "${R}" "http://${APT_SERVER}/debian"
23 23
24 24 # Copy qemu emulator binary to chroot
25 25 install -m 755 -o root -g root "${QEMU_BINARY}" "${R}${QEMU_BINARY}"
26 26
27 27 # Copy debian-archive-keyring.pgp
28 28 mkdir -p "${R}/usr/share/keyrings"
29 29 install_readonly /usr/share/keyrings/debian-archive-keyring.gpg "${R}/usr/share/keyrings/debian-archive-keyring.gpg"
30 30
31 31 # Complete the bootstrapping process
32 32 chroot_exec /debootstrap/debootstrap --second-stage
33 33
34 34 # Mount required filesystems
35 35 mount -t proc none "${R}/proc"
36 36 mount -t sysfs none "${R}/sys"
37 37
38 38 # Mount pseudo terminal slave if supported by Debian release
39 39 if [ -d "${R}/dev/pts" ] ; then
40 40 mount --bind /dev/pts "${R}/dev/pts"
41 41 fi
@@ -1,55 +1,39
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 if [ "$BUILD_KERNEL" = false ] ; then
15 # Install APT pinning configuration for flash-kernel package
16 install_readonly files/apt/flash-kernel "${ETC_DIR}/apt/preferences.d/flash-kernel"
17
18 # Install APT sources.list
19 install_readonly files/apt/sources.list "${ETC_DIR}/apt/sources.list"
20 echo "deb ${COLLABORA_URL} ${RELEASE} rpi2" >> "${ETC_DIR}/apt/sources.list"
21
22 # Upgrade collabora package index and install collabora keyring
23 chroot_exec apt-get -qq -y update
24 chroot_exec apt-get -qq -y --allow-unauthenticated install collabora-obs-archive-keyring
25 else # BUILD_KERNEL=true
26 # Install APT sources.list
27 install_readonly files/apt/sources.list "${ETC_DIR}/apt/sources.list"
28
29 # Use specified APT server and release
30 sed -i "s/\/ftp.debian.org\//\/${APT_SERVER}\//" "${ETC_DIR}/apt/sources.list"
31 sed -i "s/ jessie/ ${RELEASE}/" "${ETC_DIR}/apt/sources.list"
32 fi
33
34 # Allow the installation of non-free Debian packages
35 if [ "$ENABLE_NONFREE" = true ] ; then
36 sed -i "s/ contrib/ contrib non-free/" "${ETC_DIR}/apt/sources.list"
15 echo "Downloading precompiled kernel"
16 echo "error: not configured"
17 exit 1;
18 # BUILD_KERNEL=true
19 else
20 echo "No precompiled kernel repositories were added"
37 21 fi
38 22
39 23 # Upgrade package index and update all installed packages and changed dependencies
40 24 chroot_exec apt-get -qq -y update
41 25 chroot_exec apt-get -qq -y -u dist-upgrade
42 26
43 27 if [ "$APT_INCLUDES_LATE" ] ; then
44 28 chroot_exec apt-get -qq -y install "$(echo "$APT_INCLUDES_LATE" |tr , ' ')"
45 29 fi
46 30
47 31 if [ -d packages ] ; then
48 32 for package in packages/*.deb ; do
49 33 cp "$package" "${R}"/tmp
50 34 chroot_exec dpkg --unpack /tmp/"$(basename "$package")"
51 35 done
52 36 fi
53 37 chroot_exec apt-get -qq -y -f install
54 38
55 39 chroot_exec apt-get -qq -y check
@@ -1,194 +1,189
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_SPLITFS" = true ] ; then
45 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
45 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1 init=/bin/systemd"
46 46 else
47 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
47 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1 init=/bin/systemd"
48 48 fi
49 49
50 50 # Add encrypted root partition to cmdline.txt
51 51 if [ "$ENABLE_CRYPTFS" = true ] ; then
52 52 if [ "$ENABLE_SPLITFS" = true ] ; then
53 53 CMDLINE=$(echo "${CMDLINE}" | sed "s/sda1/mapper\/${CRYPTFS_MAPPING} cryptdevice=\/dev\/sda1:${CRYPTFS_MAPPING}/")
54 54 else
55 55 CMDLINE=$(echo "${CMDLINE}" | sed "s/mmcblk0p2/mapper\/${CRYPTFS_MAPPING} cryptdevice=\/dev\/mmcblk0p2:${CRYPTFS_MAPPING}/")
56 56 fi
57 57 fi
58 58
59 59 # Add serial console support
60 60 if [ "$ENABLE_CONSOLE" = true ] ; then
61 61 CMDLINE="${CMDLINE} console=ttyAMA0,115200 kgdboc=ttyAMA0,115200"
62 62 fi
63 63
64 64 # Remove IPv6 networking support
65 65 if [ "$ENABLE_IPV6" = false ] ; then
66 66 CMDLINE="${CMDLINE} ipv6.disable=1"
67 67 fi
68 68
69 69 # Automatically assign predictable network interface names
70 70 if [ "$ENABLE_IFNAMES" = false ] ; then
71 71 CMDLINE="${CMDLINE} net.ifnames=0"
72 72 else
73 73 CMDLINE="${CMDLINE} net.ifnames=1"
74 74 fi
75 75
76 # Set init to systemd if required by Debian release
77 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
78 CMDLINE="${CMDLINE} init=/bin/systemd"
79 fi
80
81 76 # Install firmware boot cmdline
82 77 echo "${CMDLINE}" > "${BOOT_DIR}/cmdline.txt"
83 78
84 79 # Install firmware config
85 80 install_readonly files/boot/config.txt "${BOOT_DIR}/config.txt"
86 81
87 82 # Setup minimal GPU memory allocation size: 16MB (no X)
88 83 if [ "$ENABLE_MINGPU" = true ] ; then
89 84 echo "gpu_mem=16" >> "${BOOT_DIR}/config.txt"
90 85 fi
91 86
92 87 # Setup boot with initramfs
93 88 if [ "$ENABLE_INITRAMFS" = true ] ; then
94 89 echo "initramfs initramfs-${KERNEL_VERSION} followkernel" >> "${BOOT_DIR}/config.txt"
95 90 fi
96 91
97 92 # Disable RPi3 Bluetooth and restore ttyAMA0 serial device
98 93 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
99 94 if [ "$ENABLE_CONSOLE" = true ] && [ "$ENABLE_UBOOT" = false ] ; then
100 95 echo "dtoverlay=pi3-disable-bt" >> "${BOOT_DIR}/config.txt"
101 96 echo "enable_uart=1" >> "${BOOT_DIR}/config.txt"
102 97 else
103 98 # Create temporary directory for Bluetooth sources
104 99 temp_dir=$(as_nobody mktemp -d)
105 100
106 101 # Fetch Bluetooth sources
107 102 as_nobody git -C "${temp_dir}" clone "${BLUETOOTH_URL}"
108 103
109 104 # Copy downloaded sources
110 105 mv "${temp_dir}/pi-bluetooth" "${R}/tmp/"
111 106
112 107 # Set permissions
113 108 chown -R root:root "${R}/tmp/pi-bluetooth"
114 109
115 110 # Install files to chroot
116 111 # Install tools
117 112 install_readonly "${R}/tmp/pi-bluetooth/usr/bin/btuart" "${R}/usr/bin/btuart"
118 113 install_readonly "${R}/tmp/pi-bluetooth/usr/bin/bthelper" "${R}/usr/bin/bthelper"
119 114
120 115 # Install bluetooth udev rule
121 116 install_readonly "${R}/tmp/pi-bluetooth/lib/udev/rules.d/90-pi-bluetooth.rules" "${LIB_DIR}/udev/rules.d/90-pi-bluetooth.rules"
122 117 #aur
123 118 #install_readonly "${R}/tmp/pi-bluetooth/50-bluetooth-hci-auto-poweron.rules" "${ETC_DIR}/udev/rules.d/50-bluetooth-hci-auto-poweron.rules"
124 119
125 120 # Install Firmware Flash file and apropiate licence
126 121 mkdir "${ETC_DIR}/firmware/"
127 122
128 123 #aur https://aur.archlinux.org/packages/pi-bluetooth/
129 124 #install_readonly "${R}/tmp/pi-bluetooth/LICENCE.broadcom_bcm43xx" "${ETC_DIR}/firmware/LICENCE.broadcom_bcm43xx"
130 125 #install_readonly "${R}/tmp/pi-bluetooth/BCM43430A1.hcd" "${ETC_DIR}/firmware/BCM43430A1.hcd"
131 126
132 127 wget -O "${R}/tmp/pi-bluetooth/LICENCE.broadcom_bcm43xx" https://aur.archlinux.org/cgit/aur.git/plain/LICENCE.broadcom_bcm43xx?h=pi-bluetooth
133 128 wget -O "${R}/tmp/pi-bluetooth/BCM43430A1.hcd" https://aur.archlinux.org/cgit/aur.git/plain/BCM43430A1.hcd?h=pi-bluetooth
134 129
135 130 # Install systemd service for bluetooth
136 131 #install_readonly "${R}/tmp/pi-bluetooth/brcm43438.service" "${ETC_DIR}/systemd/system/brcm43438.service"
137 132
138 133 # Remove temporary directory
139 134 #rm -fr "${temp_dir}"
140 135
141 136 # Get /dev/serial back for compability
142 137 # Raspberry-sys-mod package
143 138 wget -O "${ETC_DIR}/udev/rules.d/99-com.rules" https://raw.githubusercontent.com/RPi-Distro/raspberrypi-sys-mods/master/etc.armhf/udev/rules.d/99-com.rules
144 139
145 140 fi
146 141 fi
147 142
148 143 # Create firmware configuration and cmdline symlinks
149 144 ln -sf firmware/config.txt "${R}/boot/config.txt"
150 145 ln -sf firmware/cmdline.txt "${R}/boot/cmdline.txt"
151 146
152 147 # Install and setup kernel modules to load at boot
153 148 mkdir -p "${LIB_DIR}/modules-load.d/"
154 149 install_readonly files/modules/rpi2.conf "${LIB_DIR}/modules-load.d/rpi2.conf"
155 150
156 151 # Load hardware random module at boot
157 152 if [ "$ENABLE_HWRANDOM" = true ] && [ "$BUILD_KERNEL" = false ] ; then
158 153 sed -i "s/^# bcm2708_rng/bcm2708_rng/" "${LIB_DIR}/modules-load.d/rpi2.conf"
159 154 fi
160 155
161 156 # Load sound module at boot
162 157 if [ "$ENABLE_SOUND" = true ] ; then
163 158 sed -i "s/^# snd_bcm2835/snd_bcm2835/" "${LIB_DIR}/modules-load.d/rpi2.conf"
164 159 else
165 160 echo "dtparam=audio=off" >> "${BOOT_DIR}/config.txt"
166 161 fi
167 162
168 163 # Enable I2C interface
169 164 if [ "$ENABLE_I2C" = true ] ; then
170 165 echo "dtparam=i2c_arm=on" >> "${BOOT_DIR}/config.txt"
171 166 sed -i "s/^# i2c-bcm2708/i2c-bcm2708/" "${LIB_DIR}/modules-load.d/rpi2.conf"
172 167 sed -i "s/^# i2c-dev/i2c-dev/" "${LIB_DIR}/modules-load.d/rpi2.conf"
173 168 fi
174 169
175 170 # Enable SPI interface
176 171 if [ "$ENABLE_SPI" = true ] ; then
177 172 echo "dtparam=spi=on" >> "${BOOT_DIR}/config.txt"
178 173 echo "spi-bcm2708" >> "${LIB_DIR}/modules-load.d/rpi2.conf"
179 174 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ]; then
180 175 sed -i "s/spi-bcm2708/spi-bcm2835/" "${LIB_DIR}/modules-load.d/rpi2.conf"
181 176 fi
182 177 fi
183 178
184 179 # Disable RPi2/3 under-voltage warnings
185 180 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
186 181 echo "avoid_warnings=${DISABLE_UNDERVOLT_WARNINGS}" >> "${BOOT_DIR}/config.txt"
187 182 fi
188 183
189 184 # Install kernel modules blacklist
190 185 mkdir -p "${ETC_DIR}/modprobe.d/"
191 186 install_readonly files/modules/raspi-blacklist.conf "${ETC_DIR}/modprobe.d/raspi-blacklist.conf"
192 187
193 188 # Install sysctl.d configuration files
194 189 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 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 70 if [ "$ENABLE_WIRELESS" = true ] ; then
71 71 mv -v "${ETC_DIR}/systemd/network/wlan.network" "${LIB_DIR}/systemd/network/11-wlan.network"
72 72 fi
73 73 rm -fr "${ETC_DIR}/systemd/network"
74 fi
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 14 chroot_exec update-alternatives --verbose --set iptables /usr/sbin/iptables-legacy
16 fi
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 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
35 fi
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
49 # Purge bash and update alternatives
50 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
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,81 +1,77
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
66 # Install COMPILER_PACKAGES in chroot
70 67 chroot_exec apt-get -q -y --allow-unauthenticated --no-install-recommends install ${COMPILER_PACKAGES}
71 68 fi
72 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 }
@@ -1,797 +1,787
1 1 #!/bin/sh
2
3 2 ########################################################################
4 3 # rpi23-gen-image.sh 2015-2017
5 4 #
6 # Advanced Debian "jessie", "stretch" and "buster" bootstrap script for RPi2/3
5 # Advanced Debian "stretch" and "buster" bootstrap script for RPi2/3
7 6 #
8 7 # This program is free software; you can redistribute it and/or
9 8 # modify it under the terms of the GNU General Public License
10 9 # as published by the Free Software Foundation; either version 2
11 10 # of the License, or (at your option) any later version.
12 11 #
13 12 # Copyright (C) 2015 Jan Wagner <mail@jwagner.eu>
14 13 #
15 14 # Big thanks for patches and enhancements by 20+ github contributors!
16 15 ########################################################################
17 16
18 17 # Are we running as root?
19 18 if [ "$(id -u)" -ne "0" ] ; then
20 19 echo "error: this script must be executed with root privileges!"
21 20 exit 1
22 21 fi
23 22
24 23 # Check if ./functions.sh script exists
25 24 if [ ! -r "./functions.sh" ] ; then
26 25 echo "error: './functions.sh' required script not found!"
27 26 exit 1
28 27 fi
29 28
30 29 # Load utility functions
31 30 . ./functions.sh
32 31
33 32 # Load parameters from configuration template file
34 33 if [ -n "$CONFIG_TEMPLATE" ] ; then
35 34 use_template
36 35 fi
37 36
38 37 # Introduce settings
39 38 set -e
40 39 echo -n -e "\n#\n# RPi2/3 Bootstrap Settings\n#\n"
41 40 set -x
42 41
43 42 # Raspberry Pi model configuration
44 43 RPI_MODEL=${RPI_MODEL:=2}
45 44
46 #bcm2708-rpi-0-w.dtb (Used for Pi 0 and PI 0W)
47 RPI0_DTB_FILE=${RPI0_DTB_FILE:=bcm2708-rpi-0-w.dtb}
48 RPI0_UBOOT_CONFIG=${RPI0_UBOOT_CONFIG:=rpi_defconfig}
49
50 #bcm2708-rpi-b.dtb (Used for Pi 1 model A and B)
51 RPI1_DTB_FILE=${RPI1_DTB_FILE:=bcm2708-rpi-b.dtb}
52 RPI1_UBOOT_CONFIG=${RPI1_UBOOT_CONFIG:=rpi_defconfig}
53
54 #bcm2708-rpi-b-plus.dtb (Used for Pi 1 model B+ and A+)
55 RPI1P_DTB_FILE=${RPI1P_DTB_FILE:=bcm2708-rpi-b-plus.dtb}
56 RPI1P_UBOOT_CONFIG=${RPI1P_UBOOT_CONFIG:=rpi_defconfig}
57
58 #bcm2709-rpi-2-b.dtb (Used for Pi 2 model B)
59 RPI2_DTB_FILE=${RPI2_DTB_FILE:=bcm2709-rpi-2-b.dtb}
60 RPI2_UBOOT_CONFIG=${RPI2_UBOOT_CONFIG:=rpi_2_defconfig}
61
62 #bcm2710-rpi-3-b.dtb (Used for Pi 3 model B)
63 RPI3_DTB_FILE=${RPI3_DTB_FILE:=bcm2710-rpi-3-b.dtb}
64 RPI3_UBOOT_CONFIG=${RPI3_UBOOT_CONFIG:=rpi_3_32b_defconfig}
65
66 #bcm2710-rpi-3-b-plus.dtb (Used for Pi 3 model B+)
67 RPI3P_DTB_FILE=${RPI3P_DTB_FILE:=bcm2710-rpi-3-b-plus.dtb}
68 RPI3P_UBOOT_CONFIG=${RPI3P_UBOOT_CONFIG:=rpi_3_32b_defconfig}
69
70 45 # Debian release
71 RELEASE=${RELEASE:=jessie}
72 KERNEL_ARCH=${KERNEL_ARCH:=arm}
73 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
74 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
75 COLLABORA_KERNEL=${COLLABORA_KERNEL:=3.18.0-trunk-rpi2}
76 if [ "$KERNEL_ARCH" = "arm64" ] ; then
77 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
78 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
79 fi
80
81 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
82 #RASPBERRY PI 1, PI ZERO, PI ZERO W, AND COMPUTE MODULE DEFAULT Kernel BUILD CONFIGURATION
83 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
84 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
85 else
86 #RASPBERRY PI 2, PI 3, PI 3+, AND COMPUTE MODULE 3 DEFAULT Kernel BUILD CONFIGURATION
87 #https://www.raspberrypi.org/documentation/linux/kernel/building.md
88 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
89 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
90 fi
46 RELEASE=${RELEASE:=buster}
91 47
92 if [ "$RELEASE_ARCH" = "arm64" ] ; then
93 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
94 else
95 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
96 fi
48 #Kernel Branch
97 49 KERNEL_BRANCH=${KERNEL_BRANCH:=""}
98 50
99 51 # URLs
100 52 KERNEL_URL=${KERNEL_URL:=https://github.com/raspberrypi/linux}
101 53 FIRMWARE_URL=${FIRMWARE_URL:=https://github.com/raspberrypi/firmware/raw/master/boot}
102 54 WLAN_FIRMWARE_URL=${WLAN_FIRMWARE_URL:=https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm}
103 55 COLLABORA_URL=${COLLABORA_URL:=https://repositories.collabora.co.uk/debian}
104 56 FBTURBO_URL=${FBTURBO_URL:=https://github.com/ssvb/xf86-video-fbturbo.git}
105 57 UBOOT_URL=${UBOOT_URL:=https://git.denx.de/u-boot.git}
106 VIDEOCORE_URL=${VIDEOCORE_URL=https://github.com/raspberrypi/userland}
58 VIDEOCORE_URL=${VIDEOCORE_URL:=https://github.com/raspberrypi/userland}
107 59 BLUETOOTH_URL=${BLUETOOTH_URL:=https://github.com/RPi-Distro/pi-bluetooth.git}
108 60
109 61 # Build directories
110 62 BASEDIR=${BASEDIR:=$(pwd)/images/${RELEASE}}
111 63 BUILDDIR="${BASEDIR}/build"
112 64
113 65 # Prepare date string for default image file name
114 66 DATE="$(date +%Y-%m-%d)"
115 67 if [ -z "$KERNEL_BRANCH" ] ; then
116 68 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
117 69 else
118 70 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
119 71 fi
120 72
121 73 # Chroot directories
122 74 R="${BUILDDIR}/chroot"
123 75 ETC_DIR="${R}/etc"
124 76 LIB_DIR="${R}/lib"
125 77 BOOT_DIR="${R}/boot/firmware"
126 78 KERNEL_DIR="${R}/usr/src/linux"
127 79 WLAN_FIRMWARE_DIR="${LIB_DIR}/firmware/brcm"
128 80
129 81 # Firmware directory: Blank if download from github
130 82 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
131 83
132 84 # General settings
85 SET_ARCH=${SET_ARCH:=32}
133 86 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
134 87 PASSWORD=${PASSWORD:=raspberry}
135 88 USER_PASSWORD=${USER_PASSWORD:=raspberry}
136 89 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
137 90 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
138 91 EXPANDROOT=${EXPANDROOT:=true}
139 92
140 93 # Keyboard settings
141 94 XKB_MODEL=${XKB_MODEL:=""}
142 95 XKB_LAYOUT=${XKB_LAYOUT:=""}
143 96 XKB_VARIANT=${XKB_VARIANT:=""}
144 97 XKB_OPTIONS=${XKB_OPTIONS:=""}
145 98
146 99 # Network settings (DHCP)
147 100 ENABLE_DHCP=${ENABLE_DHCP:=true}
148 101
149 102 # Network settings (static)
150 103 NET_ADDRESS=${NET_ADDRESS:=""}
151 104 NET_GATEWAY=${NET_GATEWAY:=""}
152 105 NET_DNS_1=${NET_DNS_1:=""}
153 106 NET_DNS_2=${NET_DNS_2:=""}
154 107 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
155 108 NET_NTP_1=${NET_NTP_1:=""}
156 109 NET_NTP_2=${NET_NTP_2:=""}
157 110
158 111 # APT settings
159 112 APT_PROXY=${APT_PROXY:=""}
160 113 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
161 114
162 115 # Feature settings
163 116 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
164 117 ENABLE_I2C=${ENABLE_I2C:=false}
165 118 ENABLE_SPI=${ENABLE_SPI:=false}
166 119 ENABLE_IPV6=${ENABLE_IPV6:=true}
167 120 ENABLE_SSHD=${ENABLE_SSHD:=true}
168 121 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
169 122 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
170 123 ENABLE_SOUND=${ENABLE_SOUND:=true}
171 124 ENABLE_DBUS=${ENABLE_DBUS:=true}
172 125 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
173 126 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
174 127 ENABLE_XORG=${ENABLE_XORG:=false}
175 128 ENABLE_WM=${ENABLE_WM:=""}
176 129 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
177 130 ENABLE_USER=${ENABLE_USER:=true}
178 131 USER_NAME=${USER_NAME:="pi"}
179 132 ENABLE_ROOT=${ENABLE_ROOT:=false}
180 133 ENABLE_QEMU=${ENABLE_QEMU:=false}
181 134 ENABLE_SYSVINIT=${ENABLE_SYSVINIT:=false}
182 135
183 136 # SSH settings
184 137 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
185 138 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
186 139 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
187 140 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
188 141 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
189 142
190 143 # Advanced settings
191 144 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
192 145 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
193 146 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
194 147 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
195 148 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
196 149 ENABLE_VIDEOCORE=${ENABLE_VIDEOCORE:=true}
197 150 VIDEOCORESRC_DIR=${VIDEOCORESRC_DIR:=""}
198 151 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
199 152 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
200 153 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
201 154 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
202 155 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
203 156 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
204 157 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
205 158
206 159 # Kernel compilation settings
207 BUILD_KERNEL=${BUILD_KERNEL:=false}
160 BUILD_KERNEL=${BUILD_KERNEL:=true}
208 161 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
209 162 KERNEL_THREADS=${KERNEL_THREADS:=1}
210 163 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
211 164 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
212 165 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
213 166 KERNEL_OLDDEFCONFIG=${KERNEL_OLDDEFCONFIG:=false}
214 167 KERNEL_CCACHE=${KERNEL_CCACHE:=false}
215 168
216 if [ "$KERNEL_ARCH" = "arm64" ] ; then
217 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
218 else
219 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
220 fi
221
222 169 # Kernel compilation from source directory settings
223 170 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
224 171 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
225 172 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
226 173 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
227 174
228 175 # Reduce disk usage settings
229 176 REDUCE_APT=${REDUCE_APT:=true}
230 177 REDUCE_DOC=${REDUCE_DOC:=true}
231 178 REDUCE_MAN=${REDUCE_MAN:=true}
232 179 REDUCE_VIM=${REDUCE_VIM:=false}
233 180 REDUCE_BASH=${REDUCE_BASH:=false}
234 181 REDUCE_HWDB=${REDUCE_HWDB:=true}
235 182 REDUCE_SSHD=${REDUCE_SSHD:=true}
236 183 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
237 184
238 185 # Encrypted filesystem settings
239 186 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
240 187 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
241 188 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
242 189 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
243 190 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
244 191
245 192 # Chroot scripts directory
246 193 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
247 194
248 195 # Packages required in the chroot build environment
249 196 APT_INCLUDES=${APT_INCLUDES:=""}
250 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils"
197 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils,locales,keyboard-configuration,console-setup"
251 198
252 199 #Packages to exclude from chroot build environment
253 200 APT_EXCLUDES=${APT_EXCLUDES:=""}
254 201
255 202 # Packages required for bootstrapping
256 203 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
257 204 MISSING_PACKAGES=""
258 205
259 206 # Packages installed for c/c++ build environment in chroot (keep empty)
260 207 COMPILER_PACKAGES=""
261 208
262 209 set +x
263 210
264 211 #If init and systemd-sysv are wanted e.g. halt/reboot/shutdown scripts
265 212 if [ "$ENABLE_SYSVINIT" = false ] ; then
266 213 APT_EXCLUDES="--exclude=${APT_EXCLUDES},init,systemd-sysv"
267 214 fi
268 215
269 # Set Raspberry Pi model specific configuration
270 if [ "$RPI_MODEL" = 0 ] ; then
271 DTB_FILE=${RPI0_DTB_FILE}
272 UBOOT_CONFIG=${RPI0_UBOOT_CONFIG}
273 elif [ "$RPI_MODEL" = 1 ] ; then
274 DTB_FILE=${RPI1_DTB_FILE}
275 UBOOT_CONFIG=${RPI1_UBOOT_CONFIG}
276 elif [ "$RPI_MODEL" = 1P ] ; then
277 DTB_FILE=${RPI1P_DTB_FILE}
278 UBOOT_CONFIG=${RPI1P_UBOOT_CONFIG}
279 elif [ "$RPI_MODEL" = 2 ] ; then
280 DTB_FILE=${RPI2_DTB_FILE}
281 UBOOT_CONFIG=${RPI2_UBOOT_CONFIG}
282 elif [ "$RPI_MODEL" = 3 ] ; then
283 DTB_FILE=${RPI3_DTB_FILE}
284 UBOOT_CONFIG=${RPI3_UBOOT_CONFIG}
285 elif [ "$RPI_MODEL" = 3P ] ; then
286 DTB_FILE=${RPI3P_DTB_FILE}
287 UBOOT_CONFIG=${RPI3P_UBOOT_CONFIG}
216 #Check if apt-cacher-ng has its default port open on and set APT_PROXY
217 if [ -n "$(lsof -i :3142)" ] ; then
218 HTTP_PROXY=http://127.0.0.1:3142/
219 fi
220
221 #make script easier and more stable to use with convenient setup switch. Just setup SET_ARCH and RPI_MODEL and your good to go!
222 if [ -n "$SET_ARCH" ] ; then
223 echo "Setting Architecture specific settings"
224 ##################################
225 # 64 bit config
226 ##################################
227 if [ "$SET_ARCH" = 64 ] ; then
228 echo "64 bit mode selected - Setting up enviroment"
229 # 64 bit depended settings
230 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
231 KERNEL_ARCH=${KERNEL_ARCH:=arm64}
232 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
233
234 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
235 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
236 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
237 RELEASE_ARCH=${RELEASE_ARCH:=arm64}
238 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
239 CROSS_COMPILE=${CROSS_COMPILE:=aarch64-linux-gnu-}
288 240 else
289 echo "error: Raspberry Pi model ${RPI_MODEL} is not supported!"
241 echo "error: Only Raspberry PI 3 and 3B+ support 64bit"
290 242 exit 1
291 243 fi
244 fi
292 245
293 # Check if the internal wireless interface is supported by the RPi model
294 if [ "$ENABLE_WIRELESS" = true ] && ([ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] || [ "$RPI_MODEL" = 2 ]); then
246 ##################################
247 # 32 bit config
248 ##################################
249 if [ "$SET_ARCH" = 32 ] ; then
250 echo "32 bit mode selected - Setting up enviroment"
251 #General 32bit configuration
252 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
253 KERNEL_ARCH=${KERNEL_ARCH:=arm}
254 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
255
256 #Raspberry setting grouped by board compability
257 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
258 echo "Setting settings for bcm2835 Raspberry PI boards"
259 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
260 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
261 RELEASE_ARCH=${RELEASE_ARCH:=armel}
262 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel.img}
263 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabi-}
264 fi
265 if [ "$RPI_MODEL" = 2 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
266 echo "Setting settings for bcm2837 Raspberry PI boards"
267 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
268 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
269 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
270 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
271 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
272 fi
273 fi
274 #SET_ARCH not set
275 else
276 echo "error: Please set '32' or '64' as value for SET_ARCH"
277 exit 1
278 fi
279
280 #Device specific configuration and uboot-config
281 echo "Select DTB-File"
282 case "$RPI_MODEL" in
283 0)
284 DTB_FILE=${DTB_FILE:=bcm2708-rpi-0-w.dtb}
285 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
286 ;;
287 1)
288 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b.dtb}
289 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
290 ;;
291 1P)
292 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b-plus.dtb}
293 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
294 ;;
295 2)
296 DTB_FILE=${DTB_FILE:=bcm2709-rpi-2-b.dtb}
297 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_2_defconfig}
298 ;;
299 3)
300 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
301 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
302 ;;
303 3P)
304 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
305 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
306 ;;
307 *)
308 echo "error: Raspberry Pi model $RPI_MODEL is not supported!"
309 exit 1
310 ;;
311 esac
312 echo "$DTB_FILE selected"
295 313
314 # Check if the internal wireless interface is supported by the RPi model
315 if [ "$ENABLE_WIRELESS" = true ] ; then
316 if [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] || [ "$RPI_MODEL" = 2 ] ; then
296 317 echo "error: The selected Raspberry Pi model has no internal wireless interface"
297 318 exit 1
319 else
320 echo "Raspberry Pi $RPI_MODEL has WIFI support"
321 fi
298 322 fi
299 323
300 324 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
301 325 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
302 326 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
303 327 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
304 328 exit 1
305 329 fi
306 330 fi
307 331
308 # Build RPi2/3 Linux kernel if required by Debian release
309 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
310 BUILD_KERNEL=true
311 fi
312
313 # Add packages required for kernel cross compilation
314 if [ "$BUILD_KERNEL" = true ] ; then
315 if [ "$KERNEL_ARCH" = "arm" ] ; then
316 if [ "$RELEASE_ARCH" = "armel" ]; then
317 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
318 fi
319 if [ "$RELEASE_ARCH" = "armhf" ]; then
320 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
321 fi
322 fi
323 if [ "$RELEASE_ARCH" = "arm64" ]; then
324 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
325 fi
326 fi
327
328 332 if [ "$ENABLE_VIDEOCORE" = true ] ; then
329 333 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cmake"
330 334 fi
331 335
332 336 # Add libncurses5 to enable kernel menuconfig
333 337 if [ "$KERNEL_MENUCONFIG" = true ] ; then
334 338 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses-dev"
335 339 fi
336 340
337 341 # Add ccache compiler cache for (faster) kernel cross (re)compilation
338 342 if [ "$KERNEL_CCACHE" = true ] ; then
339 343 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} ccache"
340 344 fi
341 345
342 346 # Add cryptsetup package to enable filesystem encryption
343 347 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
344 348 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
345 349 APT_INCLUDES="${APT_INCLUDES},cryptsetup,busybox,console-setup"
346 350
347 351 if [ -z "$CRYPTFS_PASSWORD" ] ; then
348 352 echo "error: no password defined (CRYPTFS_PASSWORD)!"
349 353 exit 1
350 354 fi
351 355 ENABLE_INITRAMFS=true
352 356 fi
353 357
354 358 # Add initramfs generation tools
355 359 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
356 360 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
357 361 fi
358 362
359 363 # Add device-tree-compiler required for building the U-Boot bootloader
360 364 if [ "$ENABLE_UBOOT" = true ] ; then
361 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex"
365 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex,bc"
362 366 fi
363 367
364 368 # Check if root SSH (v2) public key file exists
365 369 if [ -n "$SSH_ROOT_PUB_KEY" ] ; then
366 370 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
367 371 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
368 372 exit 1
369 373 fi
370 374 fi
371 375
372 376 # Check if $USER_NAME SSH (v2) public key file exists
373 377 if [ -n "$SSH_USER_PUB_KEY" ] ; then
374 378 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
375 379 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
376 380 exit 1
377 381 fi
378 382 fi
379 383
380 384 # Check if all required packages are installed on the build system
381 385 for package in $REQUIRED_PACKAGES ; do
382 386 if [ "$(dpkg-query -W -f='${Status}' $package)" != "install ok installed" ] ; then
383 387 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
384 388 fi
385 389 done
386 390
387 391 # If there are missing packages ask confirmation for install, or exit
388 392 if [ -n "$MISSING_PACKAGES" ] ; then
389 393 echo "the following packages needed by this script are not installed:"
390 394 echo "$MISSING_PACKAGES"
391 395
392 396 printf "\ndo you want to install the missing packages right now? [y/n] "
393 397 read -r confirm
394 398 [ "$confirm" != "y" ] && exit 1
395 399
396 400 # Make sure all missing required packages are installed
397 401 apt-get -qq -y install "${MISSING_PACKAGES}"
398 402 fi
399 403
400 404 # Check if ./bootstrap.d directory exists
401 405 if [ ! -d "./bootstrap.d/" ] ; then
402 406 echo "error: './bootstrap.d' required directory not found!"
403 407 exit 1
404 408 fi
405 409
406 410 # Check if ./files directory exists
407 411 if [ ! -d "./files/" ] ; then
408 412 echo "error: './files' required directory not found!"
409 413 exit 1
410 414 fi
411 415
412 416 # Check if specified KERNELSRC_DIR directory exists
413 417 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
414 418 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
415 419 exit 1
416 420 fi
417 421
418 422 # Check if specified UBOOTSRC_DIR directory exists
419 423 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
420 424 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
421 425 exit 1
422 426 fi
423 427
424 428 # Check if specified VIDEOCORESRC_DIR directory exists
425 429 if [ -n "$VIDEOCORESRC_DIR" ] && [ ! -d "$VIDEOCORESRC_DIR" ] ; then
426 430 echo "error: '${VIDEOCORESRC_DIR}' specified directory not found (VIDEOCORESRC_DIR)!"
427 431 exit 1
428 432 fi
429 433
430 434 # Check if specified FBTURBOSRC_DIR directory exists
431 435 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
432 436 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
433 437 exit 1
434 438 fi
435 439
436 440 # Check if specified CHROOT_SCRIPTS directory exists
437 441 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
438 442 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
439 443 exit 1
440 444 fi
441 445
442 446 # Check if specified device mapping already exists (will be used by cryptsetup)
443 447 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
444 448 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
445 449 exit 1
446 450 fi
447 451
448 452 # Don't clobber an old build
449 453 if [ -e "$BUILDDIR" ] ; then
450 454 echo "error: directory ${BUILDDIR} already exists, not proceeding"
451 455 exit 1
452 456 fi
453 457
454 458 # Setup chroot directory
455 459 mkdir -p "${R}"
456 460
457 461 # Check if build directory has enough of free disk space >512MB
458 462 if [ "$(df --output=avail "${BUILDDIR}" | sed "1d")" -le "524288" ] ; then
459 463 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
460 464 exit 1
461 465 fi
462 466
463 467 set -x
464 468
465 469 # Call "cleanup" function on various signals and errors
466 470 trap cleanup 0 1 2 3 6
467 471
468 472 # Add required packages for the minbase installation
469 473 if [ "$ENABLE_MINBASE" = true ] ; then
470 474 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
471 475 fi
472 476
473 # Add required locales packages
474 if [ "$DEFLOCAL" != "en_US.UTF-8" ] || ([ -n XKB_MODEL ] || [ -n XKB_LAYOUT ] || [ -n XKB_VARIANT ] || [ -n XKB_OPTIONS ]); then
475 APT_INCLUDES="${APT_INCLUDES},locales,keyboard-configuration,console-setup"
476 fi
477
478 477 # Add parted package, required to get partprobe utility
479 478 if [ "$EXPANDROOT" = true ] ; then
480 479 APT_INCLUDES="${APT_INCLUDES},parted"
481 480 fi
482 481
483 482 # Add dbus package, recommended if using systemd
484 483 if [ "$ENABLE_DBUS" = true ] ; then
485 484 APT_INCLUDES="${APT_INCLUDES},dbus"
486 485 fi
487 486
488 487 # Add iptables IPv4/IPv6 package
489 488 if [ "$ENABLE_IPTABLES" = true ] ; then
490 489 APT_INCLUDES="${APT_INCLUDES},iptables,iptables-persistent"
491 490 fi
492 491
493 492 # Add openssh server package
494 493 if [ "$ENABLE_SSHD" = true ] ; then
495 494 APT_INCLUDES="${APT_INCLUDES},openssh-server"
496 495 fi
497 496
498 497 # Add alsa-utils package
499 498 if [ "$ENABLE_SOUND" = true ] ; then
500 499 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
501 500 fi
502 501
503 502 # Add rng-tools package
504 503 if [ "$ENABLE_HWRANDOM" = true ] ; then
505 504 APT_INCLUDES="${APT_INCLUDES},rng-tools"
506 505 fi
507 506
508 507 # Add fbturbo video driver
509 508 if [ "$ENABLE_FBTURBO" = true ] ; then
510 509 # Enable xorg package dependencies
511 510 ENABLE_XORG=true
512 511 fi
513 512
514 513 # Add user defined window manager package
515 514 if [ -n "$ENABLE_WM" ] ; then
516 515 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
517 516
518 517 # Enable xorg package dependencies
519 518 ENABLE_XORG=true
520 519 fi
521 520
522 521 # Add xorg package
523 522 if [ "$ENABLE_XORG" = true ] ; then
524 523 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
525 524 fi
526 525
527 526 # Replace selected packages with smaller clones
528 527 if [ "$ENABLE_REDUCE" = true ] ; then
529 528 # Add levee package instead of vim-tiny
530 529 if [ "$REDUCE_VIM" = true ] ; then
531 530 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
532 531 fi
533 532
534 533 # Add dropbear package instead of openssh-server
535 534 if [ "$REDUCE_SSHD" = true ] ; then
536 535 APT_INCLUDES="$(echo "${APT_INCLUDES}" | sed "s/openssh-server/dropbear/")"
537 536 fi
538 537 fi
539 538
540 if [ "$RELEASE" != "jessie" ] ; then
541 APT_INCLUDES="${APT_INCLUDES},libnss-systemd"
542 fi
543
544 539 # Configure kernel sources if no KERNELSRC_DIR
545 540 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
546 541 KERNELSRC_CONFIG=true
547 542 fi
548 543
549 544 # Configure reduced kernel
550 545 if [ "$KERNEL_REDUCE" = true ] ; then
551 546 KERNELSRC_CONFIG=false
552 547 fi
553 548
554 549 # Configure qemu compatible kernel
555 550 if [ "$ENABLE_QEMU" = true ] ; then
556 551 DTB_FILE=vexpress-v2p-ca15_a7.dtb
557 552 UBOOT_CONFIG=vexpress_ca15_tc2_defconfig
558 553 KERNEL_DEFCONFIG="vexpress_defconfig"
559 554 if [ "$KERNEL_MENUCONFIG" = false ] ; then
560 555 KERNEL_OLDDEFCONFIG=true
561 556 fi
562 557 fi
563 558
564 559 # Execute bootstrap scripts
565 560 for SCRIPT in bootstrap.d/*.sh; do
566 561 head -n 3 "$SCRIPT"
567 562 . "$SCRIPT"
568 563 done
569 564
570 565 ## Execute custom bootstrap scripts
571 566 if [ -d "custom.d" ] ; then
572 567 for SCRIPT in custom.d/*.sh; do
573 568 . "$SCRIPT"
574 569 done
575 570 fi
576 571
577 572 # Execute custom scripts inside the chroot
578 573 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
579 574 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
580 575 chroot_exec /bin/bash -x <<'EOF'
581 576 for SCRIPT in /chroot_scripts/* ; do
582 577 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
583 578 $SCRIPT
584 579 fi
585 580 done
586 581 EOF
587 582 rm -rf "${R}/chroot_scripts"
588 583 fi
589 584
590 585 # Remove c/c++ build environment from the chroot
591 586 chroot_remove_cc
592 587
593 # Remove apt-utils
594 if [ "$RELEASE" = "jessie" ] ; then
595 chroot_exec apt-get purge -qq -y --force-yes apt-utils
596 fi
597
598 588 # Generate required machine-id
599 589 MACHINE_ID=$(dbus-uuidgen)
600 590 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
601 591 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
602 592
603 593 # APT Cleanup
604 594 chroot_exec apt-get -y clean
605 595 chroot_exec apt-get -y autoclean
606 596 chroot_exec apt-get -y autoremove
607 597
608 598 # Unmount mounted filesystems
609 599 umount -l "${R}/proc"
610 600 umount -l "${R}/sys"
611 601
612 602 # Clean up directories
613 603 rm -rf "${R}/run/*"
614 604 rm -rf "${R}/tmp/*"
615 605
616 606 # Clean up files
617 607 rm -f "${ETC_DIR}/ssh/ssh_host_*"
618 608 rm -f "${ETC_DIR}/dropbear/dropbear_*"
619 609 rm -f "${ETC_DIR}/apt/sources.list.save"
620 610 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
621 611 rm -f "${ETC_DIR}/*-"
622 612 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
623 613 rm -f "${ETC_DIR}/resolv.conf"
624 614 rm -f "${R}/root/.bash_history"
625 615 rm -f "${R}/var/lib/urandom/random-seed"
626 616 rm -f "${R}/initrd.img"
627 617 rm -f "${R}/vmlinuz"
628 618 rm -f "${R}${QEMU_BINARY}"
629 619
630 620 if [ "$ENABLE_QEMU" = true ] ; then
631 621 # Setup QEMU directory
632 622 mkdir "${BASEDIR}/qemu"
633 623
634 624 # Copy kernel image to QEMU directory
635 625 install_readonly "${BOOT_DIR}/${KERNEL_IMAGE}" "${BASEDIR}/qemu/${KERNEL_IMAGE}"
636 626
637 627 # Copy kernel config to QEMU directory
638 628 install_readonly "${R}/boot/config-${KERNEL_VERSION}" "${BASEDIR}/qemu/config-${KERNEL_VERSION}"
639 629
640 630 # Copy kernel dtbs to QEMU directory
641 631 for dtb in "${BOOT_DIR}/"*.dtb ; do
642 632 if [ -f "${dtb}" ] ; then
643 633 install_readonly "${dtb}" "${BASEDIR}/qemu/"
644 634 fi
645 635 done
646 636
647 637 # Copy kernel overlays to QEMU directory
648 638 if [ -d "${BOOT_DIR}/overlays" ] ; then
649 639 # Setup overlays dtbs directory
650 640 mkdir "${BASEDIR}/qemu/overlays"
651 641
652 642 for dtb in "${BOOT_DIR}/overlays/"*.dtb ; do
653 643 if [ -f "${dtb}" ] ; then
654 644 install_readonly "${dtb}" "${BASEDIR}/qemu/overlays/"
655 645 fi
656 646 done
657 647 fi
658 648
659 649 # Copy u-boot files to QEMU directory
660 650 if [ "$ENABLE_UBOOT" = true ] ; then
661 651 if [ -f "${BOOT_DIR}/u-boot.bin" ] ; then
662 652 install_readonly "${BOOT_DIR}/u-boot.bin" "${BASEDIR}/qemu/u-boot.bin"
663 653 fi
664 654 if [ -f "${BOOT_DIR}/uboot.mkimage" ] ; then
665 655 install_readonly "${BOOT_DIR}/uboot.mkimage" "${BASEDIR}/qemu/uboot.mkimage"
666 656 fi
667 657 if [ -f "${BOOT_DIR}/boot.scr" ] ; then
668 658 install_readonly "${BOOT_DIR}/boot.scr" "${BASEDIR}/qemu/boot.scr"
669 659 fi
670 660 fi
671 661
672 662 # Copy initramfs to QEMU directory
673 663 if [ -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" ] ; then
674 664 install_readonly "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" "${BASEDIR}/qemu/initramfs-${KERNEL_VERSION}"
675 665 fi
676 666 fi
677 667
678 668 # Calculate size of the chroot directory in KB
679 669 CHROOT_SIZE=$(expr "$(du -s "${R}" | awk '{ print $1 }')")
680 670
681 671 # Calculate the amount of needed 512 Byte sectors
682 672 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
683 673 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
684 674 ROOT_OFFSET=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}")
685 675
686 676 # The root partition is EXT4
687 677 # This means more space than the actual used space of the chroot is used.
688 678 # As overhead for journaling and reserved blocks 35% are added.
689 679 ROOT_SECTORS=$(expr "$(expr "${CHROOT_SIZE}" + "${CHROOT_SIZE}" \/ 100 \* 35)" \* 1024 \/ 512)
690 680
691 681 # Calculate required image size in 512 Byte sectors
692 682 IMAGE_SECTORS=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}")
693 683
694 684 # Prepare image file
695 685 if [ "$ENABLE_SPLITFS" = true ] ; then
696 686 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count="${TABLE_SECTORS}"
697 687 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek="${FRMW_SECTORS}"
698 688 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count="${TABLE_SECTORS}"
699 689 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek="${ROOT_SECTORS}"
700 690
701 691 # Write firmware/boot partition tables
702 692 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
703 693 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
704 694 EOM
705 695
706 696 # Write root partition table
707 697 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
708 698 ${TABLE_SECTORS},${ROOT_SECTORS},83
709 699 EOM
710 700
711 701 # Setup temporary loop devices
712 702 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME"-frmw.img)"
713 703 ROOT_LOOP="$(losetup -o 1M -f --show "$IMAGE_NAME"-root.img)"
714 704 else # ENABLE_SPLITFS=false
715 705 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count="${TABLE_SECTORS}"
716 706 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek="${IMAGE_SECTORS}"
717 707
718 708 # Write partition table
719 709 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
720 710 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
721 711 ${ROOT_OFFSET},${ROOT_SECTORS},83
722 712 EOM
723 713
724 714 # Setup temporary loop devices
725 715 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME".img)"
726 716 ROOT_LOOP="$(losetup -o 65M -f --show "$IMAGE_NAME".img)"
727 717 fi
728 718
729 719 if [ "$ENABLE_CRYPTFS" = true ] ; then
730 720 # Create dummy ext4 fs
731 721 mkfs.ext4 "$ROOT_LOOP"
732 722
733 723 # Setup password keyfile
734 724 touch .password
735 725 chmod 600 .password
736 726 echo -n ${CRYPTFS_PASSWORD} > .password
737 727
738 728 # Initialize encrypted partition
739 729 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
740 730
741 731 # Open encrypted partition and setup mapping
742 732 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
743 733
744 734 # Secure delete password keyfile
745 735 shred -zu .password
746 736
747 737 # Update temporary loop device
748 738 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
749 739
750 740 # Wipe encrypted partition (encryption cipher is used for randomness)
751 741 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count="$(blockdev --getsz "${ROOT_LOOP}")"
752 742 fi
753 743
754 744 # Build filesystems
755 745 mkfs.vfat "$FRMW_LOOP"
756 746 mkfs.ext4 "$ROOT_LOOP"
757 747
758 748 # Mount the temporary loop devices
759 749 mkdir -p "$BUILDDIR/mount"
760 750 mount "$ROOT_LOOP" "$BUILDDIR/mount"
761 751
762 752 mkdir -p "$BUILDDIR/mount/boot/firmware"
763 753 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
764 754
765 755 # Copy all files from the chroot to the loop device mount point directory
766 756 rsync -a "${R}/" "$BUILDDIR/mount/"
767 757
768 758 # Unmount all temporary loop devices and mount points
769 759 cleanup
770 760
771 761 # Create block map file(s) of image(s)
772 762 if [ "$ENABLE_SPLITFS" = true ] ; then
773 763 # Create block map files for "bmaptool"
774 764 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
775 765 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
776 766
777 767 # Image was successfully created
778 768 echo "$IMAGE_NAME-frmw.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
779 769 echo "$IMAGE_NAME-root.img ($(expr \( "${TABLE_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
780 770 else
781 771 # Create block map file for "bmaptool"
782 772 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
783 773
784 774 # Image was successfully created
785 775 echo "$IMAGE_NAME.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
786 776
787 777 # Create qemu qcow2 image
788 778 if [ "$ENABLE_QEMU" = true ] ; then
789 779 QEMU_IMAGE=${QEMU_IMAGE:=${BASEDIR}/qemu/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
790 780 QEMU_SIZE=16G
791 781
792 782 qemu-img convert -f raw -O qcow2 "$IMAGE_NAME".img "$QEMU_IMAGE".qcow2
793 783 qemu-img resize "$QEMU_IMAGE".qcow2 $QEMU_SIZE
794 784
795 785 echo "$QEMU_IMAGE.qcow2 ($QEMU_SIZE)" ": successfully created"
796 786 fi
797 787 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant