##// END OF EJS Templates
Merge branch 'drtyhlpr-master'
vidal -
r188:3a4cc3acfea1 Fusion
parent child
Show More
@@ -0,0 +1,15
1 # Configuration template file used by rpi23-gen-image.sh
2 # Debian Stretch using the Arm64 for kernel compilation and Debian distribution.
3
4 RPI_MODEL=3
5 RELEASE=stretch
6 BUILD_KERNEL=true
7 KERNEL_ARCH=arm64
8 RELEASE_ARCH=arm64
9 CROSS_COMPILE=aarch64-linux-gnu-
10 QEMU_BINARY=/usr/bin/qemu-aarch64-static
11 KERNEL_DEFCONFIG=bcmrpi3_defconfig
12 KERNEL_BIN_IMAGE=Image
13 KERNEL_IMAGE=kernel8.img
14 KERNEL_BRANCH=rpi-4.11.y
15 ENABLE_WIRELESS=true
@@ -1,425 +1,452
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` and `stretch`. Raspberry Pi 3 images are currently generated for 32-bit mode only.
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` and `stretch`. 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 mandetory. Kernel compilation and linking will be performed on the build system using an ARM (armhf) cross-compiler toolchain.
11 11
12 12 The script has been tested using the default `crossbuild-essential-armhf` toolchain meta package on Debian Linux `jessie` and `stretch` build systems. Please check the [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains) for further information.
13 13
14 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 15
16 16 ```
17 17 echo "deb http://emdebian.org/tools/debian/ jessie main" > /etc/apt/sources.list.d/crosstools.list
18 18 sudo -u nobody wget -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
19 19 dpkg --add-architecture armhf
20 20 apt-get update
21 21 ```
22 22
23 23 ## Command-line parameters
24 24 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 25
26 #####Command-line examples:
26 ##### Command-line examples:
27 27 ```shell
28 28 ENABLE_UBOOT=true ./rpi23-gen-image.sh
29 29 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
30 30 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
31 31 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
32 32 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
33 33 ENABLE_MINBASE=true ./rpi23-gen-image.sh
34 34 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
35 35 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
36 36 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
37 37 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 38 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
39 39 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
40 40 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
41 41 ```
42 42
43 43 ## Configuration template files
44 44 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 45
46 #####Command-line examples:
46 ##### Command-line examples:
47 47 ```shell
48 48 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
49 49 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
50 50 ```
51 51
52 52 ## Supported parameters and settings
53 53 #### APT settings:
54 54 ##### `APT_SERVER`="ftp.debian.org"
55 55 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 56
57 57 ##### `APT_PROXY`=""
58 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.
59 59
60 60 ##### `APT_INCLUDES`=""
61 A comma separated list of additional packages to be installed during bootstrapping.
61 A comma separated list of additional packages to be installed by debootstrap during bootstrapping.
62
63 ##### `APT_INCLUDES_LATE`=""
64 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.
62 65
63 66 ---
64 67
65 68 #### General system settings:
66 69 ##### `RPI_MODEL`=2
67 70 Specifiy the target Raspberry Pi hardware model. The script at this time supports the Raspberry Pi models `2` and `3`. `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` is used.
68 71
69 72 ##### `RELEASE`="jessie"
70 73 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases "jessie" and "stretch". `BUILD_KERNEL`=true will automatically be set if the Debian release `stretch` is used.
71 74
75 ##### `RELEASE_ARCH`="armhf"
76 Set the desired Debian release architecture.
77
72 78 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
73 79 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
74 80
75 81 ##### `PASSWORD`="raspberry"
76 82 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
77 83
78 84 ##### `USER_PASSWORD`="raspberry"
79 85 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.
80 86
81 87 ##### `DEFLOCAL`="en_US.UTF-8"
82 88 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`.
83 89
84 90 ##### `TIMEZONE`="Europe/Berlin"
85 91 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.
86 92
87 93 ##### `EXPANDROOT`=true
88 94 Expand the root partition and filesystem automatically on first boot.
89 95
90 96 ---
91 97
92 #### Keyboard settings:
98 #### Keyboard settings:
93 99 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.
94 100
95 101 ##### `XKB_MODEL`=""
96 102 Set the name of the model of your keyboard type.
97 103
98 104 ##### `XKB_LAYOUT`=""
99 105 Set the supported keyboard layout(s).
100 106
101 107 ##### `XKB_VARIANT`=""
102 108 Set the supported variant(s) of the keyboard layout(s).
103 109
104 110 ##### `XKB_OPTIONS`=""
105 111 Set extra xkb configuration options.
106 112
107 113 ---
108 114
109 115 #### Networking settings (DHCP):
110 116 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`.`
111 117
112 #####`ENABLE_DHCP`=true
118 ##### `ENABLE_DHCP`=true
113 119 Set the system to use DHCP. This requires an DHCP server.
114 120
115 121 ---
116 122
117 123 #### Networking settings (static):
118 124 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`.
119 125
120 #####`NET_ADDRESS`=""
126 ##### `NET_ADDRESS`=""
121 127 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
122 128
123 #####`NET_GATEWAY`=""
129 ##### `NET_GATEWAY`=""
124 130 Set the IP address for the default gateway.
125 131
126 #####`NET_DNS_1`=""
132 ##### `NET_DNS_1`=""
127 133 Set the IP address for the first DNS server.
128 134
129 #####`NET_DNS_2`=""
135 ##### `NET_DNS_2`=""
130 136 Set the IP address for the second DNS server.
131 137
132 #####`NET_DNS_DOMAINS`=""
138 ##### `NET_DNS_DOMAINS`=""
133 139 Set the default DNS search domains to use for non fully qualified host names.
134 140
135 #####`NET_NTP_1`=""
141 ##### `NET_NTP_1`=""
136 142 Set the IP address for the first NTP server.
137 143
138 #####`NET_NTP_2`=""
144 ##### `NET_NTP_2`=""
139 145 Set the IP address for the second NTP server.
140 146
141 147 ---
142 148
143 149 #### Basic system features:
144 150 ##### `ENABLE_CONSOLE`=true
145 151 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.
146 152
147 153 ##### `ENABLE_I2C`=false
148 154 Enable I2C interface on the RPi2/3. Please check the [RPi2/3 pinout diagrams](http://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
149 155
150 156 ##### `ENABLE_SPI`=false
151 157 Enable SPI interface on the RPi2/3. Please check the [RPi2/3 pinout diagrams](http://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
152 158
153 159 ##### `ENABLE_IPV6`=true
154 160 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
155 161
156 162 ##### `ENABLE_SSHD`=true
157 163 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.
158 164
159 165 ##### `ENABLE_NONFREE`=false
160 166 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.
161 167
162 168 ##### `ENABLE_WIRELESS`=false
163 169 Download and install the [closed-source firmware binary blob](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/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`.
164 170
165 171 ##### `ENABLE_RSYSLOG`=true
166 172 If set to false, disable and uninstall rsyslog (so logs will be available only
167 173 in journal files)
168 174
169 175 ##### `ENABLE_SOUND`=true
170 176 Enable sound hardware and install Advanced Linux Sound Architecture.
171 177
172 178 ##### `ENABLE_HWRANDOM`=true
173 179 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
174 180
175 181 ##### `ENABLE_MINGPU`=false
176 182 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
177 183
178 184 ##### `ENABLE_DBUS`=true
179 185 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
180 186
181 187 ##### `ENABLE_XORG`=false
182 188 Install Xorg open-source X Window System.
183 189
184 190 ##### `ENABLE_WM`=""
185 191 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`.
186 192
187 193 ---
188 194
189 195 #### Advanced system features:
190 196 ##### `ENABLE_MINBASE`=false
191 197 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
192 198
193 199 ##### `ENABLE_REDUCE`=false
194 200 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
195 201
196 202 ##### `ENABLE_UBOOT`=false
197 203 Replace the default RPi2/3 second stage bootloader (bootcode.bin) with [U-Boot bootloader](http://git.denx.de/?p=u-boot.git;a=summary). U-Boot can boot images via the network using the BOOTP/TFTP protocol.
198 204
199 205 ##### `UBOOTSRC_DIR`=""
200 206 Path to a directory (`u-boot`) of [U-Boot bootloader sources](http://git.denx.de/?p=u-boot.git;a=summary) that will be copied, configured, build and installed inside the chroot.
201 207
202 208 ##### `ENABLE_FBTURBO`=false
203 209 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.
204 210
205 211 ##### `FBTURBOSRC_DIR`=""
206 212 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.
207 213
208 214 ##### `ENABLE_IPTABLES`=false
209 215 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
210 216
211 217 ##### `ENABLE_USER`=true
212 218 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
213 219
214 220 ##### `USER_NAME`=pi
215 221 Non-root user to create. Ignored if `ENABLE_USER`=false
216 222
217 223 ##### `ENABLE_ROOT`=false
218 224 Set root user password so root login will be enabled
219 225
220 226 ##### `ENABLE_HARDNET`=false
221 227 Enable IPv4/IPv6 network stack hardening settings.
222 228
223 229 ##### `ENABLE_SPLITFS`=false
224 230 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
225 231
226 232 ##### `CHROOT_SCRIPTS`=""
227 233 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.
228 234
229 235 ##### `ENABLE_INITRAMFS`=false
230 236 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.
231 237
232 238 ##### `ENABLE_IFNAMES`=true
233 239 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 release `stretch` is used.
234 240
235 241 ##### `DISABLE_UNDERVOLT_WARNINGS`=
236 242 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.
237 243
238 244 ---
239 245
240 246 #### SSH settings:
241 247 ##### `SSH_ENABLE_ROOT`=false
242 248 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`.
243 249
244 250 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
245 251 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
246 252
247 253 ##### `SSH_LIMIT_USERS`=false
248 254 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).
249 255
250 256 ##### `SSH_ROOT_PUB_KEY`=""
251 257 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`.
252 258
253 259 ##### `SSH_USER_PUB_KEY`=""
254 260 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.
255 261
256 262 ---
257 263
258 264 #### Kernel compilation:
259 265 ##### `BUILD_KERNEL`=false
260 266 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.
261 267
268 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
269 This sets the cross compile enviornment for the compiler.
270
271 ##### `KERNEL_ARCH`="arm"
272 This sets the kernel architecture for the compiler.
273
274 ##### `KERNEL_IMAGE`="kernel7.img"
275 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.
276
277 ##### `KERNEL_BRANCH`=""
278 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
279
280 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
281 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.
282
283 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
284 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
285
262 286 ##### `KERNEL_REDUCE`=false
263 287 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
264 288
265 289 ##### `KERNEL_THREADS`=1
266 290 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.
267 291
268 292 ##### `KERNEL_HEADERS`=true
269 293 Install kernel headers with built kernel.
270 294
271 295 ##### `KERNEL_MENUCONFIG`=false
272 296 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
273 297
274 298 ##### `KERNEL_REMOVESRC`=true
275 299 Remove all kernel sources from the generated OS image after it was built and installed.
276 300
277 301 ##### `KERNELSRC_DIR`=""
278 302 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.
279 303
280 304 ##### `KERNELSRC_CLEAN`=false
281 305 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.
282 306
283 307 ##### `KERNELSRC_CONFIG`=true
284 308 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.
285 309
286 310 ##### `KERNELSRC_USRCONFIG`=""
287 311 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
288 312
289 313 ##### `KERNELSRC_PREBUILT`=false
290 314 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.
291 315
292 316 ##### `RPI_FIRMWARE_DIR`=""
293 317 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.
294 318
295 319 ---
296 320
297 321 #### Reduce disk usage:
298 322 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
299 323
300 324 ##### `REDUCE_APT`=true
301 325 Configure APT to use compressed package repository lists and no package caching files.
302 326
303 327 ##### `REDUCE_DOC`=true
304 328 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
305 329
306 330 ##### `REDUCE_MAN`=true
307 331 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
308 332
309 333 ##### `REDUCE_VIM`=false
310 334 Replace `vim-tiny` package by `levee` a tiny vim clone.
311 335
312 336 ##### `REDUCE_BASH`=false
313 337 Remove `bash` package and switch to `dash` shell (experimental).
314 338
315 339 ##### `REDUCE_HWDB`=true
316 340 Remove PCI related hwdb files (experimental).
317 341
318 342 ##### `REDUCE_SSHD`=true
319 343 Replace `openssh-server` with `dropbear`.
320 344
321 345 ##### `REDUCE_LOCALE`=true
322 346 Remove all `locale` translation files.
323 347
324 348 ---
325 349
326 350 #### Encrypted root partition:
327 351 ##### `ENABLE_CRYPTFS`=false
328 352 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.
329 353
330 354 ##### `CRYPTFS_PASSWORD`=""
331 355 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
332 356
333 357 ##### `CRYPTFS_MAPPING`="secure"
334 358 Set name of dm-crypt managed device-mapper mapping.
335 359
336 360 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
337 361 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
338 362
339 363 ##### `CRYPTFS_XTSKEYSIZE`=512
340 364 Sets key size in bits. The argument has to be a multiple of 8.
341 365
342 366 ---
343 367
344 368 #### Build settings:
345 369 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
346 370 Set a path to a working directory used by the script to generate an image.
347 371
348 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}
349 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.
372 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
373 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.
350 374
351 375 ## Understanding the script
352 376 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:
353 377
354 378 | Script | Description |
355 379 | --- | --- |
356 380 | `10-bootstrap.sh` | Debootstrap basic system |
357 381 | `11-apt.sh` | Setup APT repositories |
358 382 | `12-locale.sh` | Setup Locales and keyboard settings |
359 383 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
360 384 | `14-fstab.sh` | Setup fstab and initramfs |
361 385 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
362 386 | `20-networking.sh` | Setup Networking |
363 387 | `21-firewall.sh` | Setup Firewall |
364 388 | `30-security.sh` | Setup Users and Security settings |
365 389 | `31-logging.sh` | Setup Logging |
366 390 | `32-sshd.sh` | Setup SSH and public keys |
367 391 | `41-uboot.sh` | Build and Setup U-Boot |
368 392 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
369 393 | `50-firstboot.sh` | First boot actions |
370 394 | `99-reduce.sh` | Reduce the disk space usage |
371 395
372 396 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.
373 397
374 398 | Directory | Description |
375 399 | --- | --- |
376 400 | `apt` | APT management configuration files |
377 401 | `boot` | Boot and RPi2/3 configuration files |
378 402 | `dpkg` | Package Manager configuration |
379 403 | `etc` | Configuration files and rc scripts |
380 404 | `firstboot` | Scripts that get executed on first boot |
381 405 | `initramfs` | Initramfs scripts |
382 406 | `iptables` | Firewall configuration files |
383 407 | `locales` | Locales configuration |
384 408 | `modules` | Kernel Modules configuration |
385 409 | `mount` | Fstab configuration |
386 410 | `network` | Networking configuration files |
387 411 | `sysctl.d` | Swapping and Network Hardening configuration |
388 412 | `xorg` | fbturbo Xorg driver configuration |
389 413
390 414 ## Custom packages and scripts
391 415 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`.
392 416
393 417 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
394 418
395 419 ## Logging of the bootstrapping process
396 420 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:
397 421
398 422 ```shell
399 423 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
400 424 ```
401 425
402 426 ## Flashing the image file
403 427 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`.
404 428
405 #####Flashing examples:
429 ##### Flashing examples:
406 430 ```shell
407 431 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie.img /dev/mmcblk0
408 432 dd bs=4M if=./images/jessie/2017-01-23-rpi3-jessie.img of=/dev/mmcblk0
409 433 ```
410 434 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
411 435 ```shell
412 436 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-frmw.img /dev/mmcblk0
413 437 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-root.img /dev/sdc
414 438 ```
439 ## Weekly image builds
440 The image files are provided by JRWR'S I/O PORT and are built once a Sunday at midnight UTC!
441 * [Debian Stretch Raspberry Pi2/3 Weekly Image Builds](https://jrwr.io/doku.php?id=projects:debianpi)
415 442
416 443 ## External links and references
417 444 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
418 445 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
419 446 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
420 447 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
421 448 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
422 449 * [U-BOOT git repository](http://git.denx.de/?p=u-boot.git;a=summary)
423 450 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
424 451 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
425 452 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,47 +1,47
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 EXCLUDES=""
11 11
12 12 # Use non-free Debian packages if needed
13 13 if [ "$ENABLE_NONFREE" = true ] ; then
14 14 COMPONENTS="main,non-free"
15 15 fi
16 16
17 17 # Use minbase bootstrap variant which only includes essential packages
18 18 if [ "$ENABLE_MINBASE" = true ] ; then
19 19 VARIANT="--variant=minbase"
20 20 fi
21 21
22 22 # Exclude packages if required by Debian release
23 23 if [ "$RELEASE" = "stretch" ] ; then
24 24 EXCLUDES="--exclude=init,systemd-sysv"
25 25 fi
26 26
27 27 # Base debootstrap (unpack only)
28 28 http_proxy=${APT_PROXY} debootstrap ${EXCLUDES} --arch="${RELEASE_ARCH}" --foreign ${VARIANT} --components="${COMPONENTS}" --include="${APT_INCLUDES}" "${RELEASE}" "${R}" "http://${APT_SERVER}/debian"
29 29
30 30 # Copy qemu emulator binary to chroot
31 install_exec "${QEMU_BINARY}" "${R}${QEMU_BINARY}"
31 install -m 755 -o root -g root "${QEMU_BINARY}" "${R}${QEMU_BINARY}"
32 32
33 33 # Copy debian-archive-keyring.pgp
34 34 mkdir -p "${R}/usr/share/keyrings"
35 35 install_readonly /usr/share/keyrings/debian-archive-keyring.gpg "${R}/usr/share/keyrings/debian-archive-keyring.gpg"
36 36
37 37 # Complete the bootstrapping process
38 38 chroot_exec /debootstrap/debootstrap --second-stage
39 39
40 40 # Mount required filesystems
41 41 mount -t proc none "${R}/proc"
42 42 mount -t sysfs none "${R}/sys"
43 43
44 44 # Mount pseudo terminal slave if supported by Debian release
45 45 if [ -d "${R}/dev/pts" ] ; then
46 46 mount --bind /dev/pts "${R}/dev/pts"
47 47 fi
@@ -1,51 +1,55
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 15 # Install APT pinning configuration for flash-kernel package
16 16 install_readonly files/apt/flash-kernel "${ETC_DIR}/apt/preferences.d/flash-kernel"
17 17
18 18 # Install APT sources.list
19 19 install_readonly files/apt/sources.list "${ETC_DIR}/apt/sources.list"
20 20 echo "deb ${COLLABORA_URL} ${RELEASE} rpi2" >> "${ETC_DIR}/apt/sources.list"
21 21
22 22 # Upgrade collabora package index and install collabora keyring
23 23 chroot_exec apt-get -qq -y update
24 24 chroot_exec apt-get -qq -y --allow-unauthenticated install collabora-obs-archive-keyring
25 25 else # BUILD_KERNEL=true
26 26 # Install APT sources.list
27 27 install_readonly files/apt/sources.list "${ETC_DIR}/apt/sources.list"
28 28
29 29 # Use specified APT server and release
30 30 sed -i "s/\/ftp.debian.org\//\/${APT_SERVER}\//" "${ETC_DIR}/apt/sources.list"
31 31 sed -i "s/ jessie/ ${RELEASE}/" "${ETC_DIR}/apt/sources.list"
32 32 fi
33 33
34 34 # Allow the installation of non-free Debian packages
35 35 if [ "$ENABLE_NONFREE" = true ] ; then
36 36 sed -i "s/ contrib/ contrib non-free/" "${ETC_DIR}/apt/sources.list"
37 37 fi
38 38
39 39 # Upgrade package index and update all installed packages and changed dependencies
40 40 chroot_exec apt-get -qq -y update
41 41 chroot_exec apt-get -qq -y -u dist-upgrade
42 42
43 if [ "$APT_INCLUDES_LATE" ] ; then
44 chroot_exec apt-get -qq -y install $(echo $APT_INCLUDES_LATE |tr , ' ')
45 fi
46
43 47 if [ -d packages ] ; then
44 48 for package in packages/*.deb ; do
45 49 cp $package ${R}/tmp
46 50 chroot_exec dpkg --unpack /tmp/$(basename $package)
47 51 done
48 52 fi
49 53 chroot_exec apt-get -qq -y -f install
50 54
51 55 chroot_exec apt-get -qq -y check
@@ -1,172 +1,183
1 1 #
2 2 # Build and Setup RPi2/3 Kernel
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Fetch and build latest raspberry kernel
9 9 if [ "$BUILD_KERNEL" = true ] ; then
10 10 # Setup source directory
11 11 mkdir -p "${R}/usr/src"
12 12
13 13 # Copy existing kernel sources into chroot directory
14 14 if [ -n "$KERNELSRC_DIR" ] && [ -d "$KERNELSRC_DIR" ] ; then
15 15 # Copy kernel sources
16 16 cp -r "${KERNELSRC_DIR}" "${R}/usr/src"
17 17
18 18 # Clean the kernel sources
19 19 if [ "$KERNELSRC_CLEAN" = true ] && [ "$KERNELSRC_PREBUILT" = false ] ; then
20 20 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" mrproper
21 21 fi
22 22 else # KERNELSRC_DIR=""
23 23 # Create temporary directory for kernel sources
24 temp_dir=$(sudo -u nobody mktemp -d)
24 temp_dir=$(as_nobody mktemp -d)
25 25
26 26 # Fetch current RPi2/3 kernel sources
27 sudo -u nobody git -C "${temp_dir}" clone --depth=1 "${KERNEL_URL}"
28
27 if [ -z "${KERNEL_BRANCH}" ] ; then
28 as_nobody -u nobody git -C "${temp_dir}" clone --depth=1 "${KERNEL_URL}"
29 else
30 as_nobody -u nobody git -C "${temp_dir}" clone --depth=1 --branch "${KERNEL_BRANCH}" "${KERNEL_URL}"
31 fi
32
29 33 # Copy downloaded kernel sources
30 34 mv "${temp_dir}/linux" "${R}/usr/src/"
31 35
32 36 # Remove temporary directory for kernel sources
33 37 rm -fr "${temp_dir}"
34 38
35 39 # Set permissions of the kernel sources
36 40 chown -R root:root "${R}/usr/src"
37 41 fi
38 42
39 43 # Calculate optimal number of kernel building threads
40 44 if [ "$KERNEL_THREADS" = "1" ] && [ -r /proc/cpuinfo ] ; then
41 45 KERNEL_THREADS=$(grep -c processor /proc/cpuinfo)
42 46 fi
43 47
44 48 # Configure and build kernel
45 49 if [ "$KERNELSRC_PREBUILT" = false ] ; then
46 50 # Remove device, network and filesystem drivers from kernel configuration
47 51 if [ "$KERNEL_REDUCE" = true ] ; then
48 52 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
49 53 sed -i\
50 54 -e "s/\(^CONFIG_SND.*\=\).*/\1n/"\
51 55 -e "s/\(^CONFIG_SOUND.*\=\).*/\1n/"\
52 56 -e "s/\(^CONFIG_AC97.*\=\).*/\1n/"\
53 57 -e "s/\(^CONFIG_VIDEO_.*\=\).*/\1n/"\
54 58 -e "s/\(^CONFIG_MEDIA_TUNER.*\=\).*/\1n/"\
55 59 -e "s/\(^CONFIG_DVB.*\=\)[ym]/\1n/"\
56 60 -e "s/\(^CONFIG_REISERFS.*\=\).*/\1n/"\
57 61 -e "s/\(^CONFIG_JFS.*\=\).*/\1n/"\
58 62 -e "s/\(^CONFIG_XFS.*\=\).*/\1n/"\
59 63 -e "s/\(^CONFIG_GFS2.*\=\).*/\1n/"\
60 64 -e "s/\(^CONFIG_OCFS2.*\=\).*/\1n/"\
61 65 -e "s/\(^CONFIG_BTRFS.*\=\).*/\1n/"\
62 66 -e "s/\(^CONFIG_HFS.*\=\).*/\1n/"\
63 67 -e "s/\(^CONFIG_JFFS2.*\=\)[ym]/\1n/"\
64 68 -e "s/\(^CONFIG_UBIFS.*\=\).*/\1n/"\
65 69 -e "s/\(^CONFIG_SQUASHFS.*\=\)[ym]/\1n/"\
66 70 -e "s/\(^CONFIG_W1.*\=\)[ym]/\1n/"\
67 71 -e "s/\(^CONFIG_HAMRADIO.*\=\).*/\1n/"\
68 72 -e "s/\(^CONFIG_CAN.*\=\).*/\1n/"\
69 73 -e "s/\(^CONFIG_IRDA.*\=\).*/\1n/"\
70 74 -e "s/\(^CONFIG_BT_.*\=\).*/\1n/"\
71 75 -e "s/\(^CONFIG_WIMAX.*\=\)[ym]/\1n/"\
72 76 -e "s/\(^CONFIG_6LOWPAN.*\=\).*/\1n/"\
73 77 -e "s/\(^CONFIG_IEEE802154.*\=\).*/\1n/"\
74 78 -e "s/\(^CONFIG_NFC.*\=\).*/\1n/"\
75 79 -e "s/\(^CONFIG_FB_TFT=.*\=\).*/\1n/"\
76 80 -e "s/\(^CONFIG_TOUCHSCREEN.*\=\).*/\1n/"\
77 81 -e "s/\(^CONFIG_USB_GSPCA_.*\=\).*/\1n/"\
78 82 -e "s/\(^CONFIG_DRM.*\=\).*/\1n/"\
79 83 "${KERNEL_DIR}/.config"
80 84 fi
81 85
82 86 if [ "$KERNELSRC_CONFIG" = true ] ; then
83 87 # Load default raspberry kernel configuration
84 88 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
85 89
86 90 if [ ! -z "$KERNELSRC_USRCONFIG" ] ; then
87 91 cp $KERNELSRC_USRCONFIG ${KERNEL_DIR}/.config
88 92 fi
89 93
90 94 # Start menu-driven kernel configuration (interactive)
91 95 if [ "$KERNEL_MENUCONFIG" = true ] ; then
92 96 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" menuconfig
93 97 fi
94 98 fi
95 99
96 100 # Cross compile kernel and modules
97 make -C "${KERNEL_DIR}" -j${KERNEL_THREADS} ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" zImage modules dtbs
101 make -C "${KERNEL_DIR}" -j${KERNEL_THREADS} ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_BIN_IMAGE}" modules dtbs
98 102 fi
99 103
100 104 # Check if kernel compilation was successful
101 if [ ! -r "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/zImage" ] ; then
102 echo "error: kernel compilation failed! (zImage not found)"
105 if [ ! -r "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" ] ; then
106 echo "error: kernel compilation failed! (kernel image not found)"
103 107 cleanup
104 108 exit 1
105 109 fi
106 110
107 111 # Install kernel modules
108 112 if [ "$ENABLE_REDUCE" = true ] ; then
109 113 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=../../.. modules_install
110 114 else
111 115 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_PATH=../../.. modules_install
112 116
113 117 # Install kernel firmware
114 118 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_FW_PATH=../../../lib firmware_install
115 119 fi
116 120
117 121 # Install kernel headers
118 122 if [ "$KERNEL_HEADERS" = true ] && [ "$KERNEL_REDUCE" = false ] ; then
119 123 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_HDR_PATH=../.. headers_install
120 124 fi
121 125
122 126 # Prepare boot (firmware) directory
123 127 mkdir "${BOOT_DIR}"
124 128
125 129 # Get kernel release version
126 130 KERNEL_VERSION=`cat "${KERNEL_DIR}/include/config/kernel.release"`
127 131
128 132 # Copy kernel configuration file to the boot directory
129 133 install_readonly "${KERNEL_DIR}/.config" "${R}/boot/config-${KERNEL_VERSION}"
130 134
131 135 # Copy dts and dtb device tree sources and binaries
132 136 mkdir "${BOOT_DIR}/overlays"
133 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/"*.dtb "${BOOT_DIR}/"
137
138 # Ensure the proper .dtb is located
139 if [ "$KERNEL_ARCH" = "arm" ] ; then
140 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/"*.dtb "${BOOT_DIR}/"
141 else
142 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/broadcom/"*.dtb "${BOOT_DIR}/"
143 fi
144
134 145 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/"*.dtb* "${BOOT_DIR}/overlays/"
135 146 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/README" "${BOOT_DIR}/overlays/README"
136 147
137 148 if [ "$ENABLE_UBOOT" = false ] ; then
138 # Convert and copy zImage kernel to the boot directory
139 "${KERNEL_DIR}/scripts/mkknlimg" "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/zImage" "${BOOT_DIR}/${KERNEL_IMAGE}"
149 # Convert and copy kernel image to the boot directory
150 "${KERNEL_DIR}/scripts/mkknlimg" "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
140 151 else
141 # Copy zImage kernel to the boot directory
142 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/zImage" "${BOOT_DIR}/${KERNEL_IMAGE}"
152 # Copy kernel image to the boot directory
153 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
143 154 fi
144 155
145 156 # Remove kernel sources
146 157 if [ "$KERNEL_REMOVESRC" = true ] ; then
147 158 rm -fr "${KERNEL_DIR}"
148 159 else
149 160 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" modules_prepare
150 161
151 162 # Create symlinks for kernel modules
152 ln -sf "${KERNEL_DIR}" "${R}/lib/modules/${KERNEL_VERSION}/build"
153 ln -sf "${KERNEL_DIR}" "${R}/lib/modules/${KERNEL_VERSION}/source"
163 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/build"
164 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/source"
154 165 fi
155 166
156 167 else # BUILD_KERNEL=false
157 168 # Kernel installation
158 169 chroot_exec apt-get -qq -y --no-install-recommends install linux-image-"${COLLABORA_KERNEL}" raspberrypi-bootloader-nokernel
159 170
160 171 # Install flash-kernel last so it doesn't try (and fail) to detect the platform in the chroot
161 172 chroot_exec apt-get -qq -y install flash-kernel
162 173
163 174 # Check if kernel installation was successful
164 175 VMLINUZ="$(ls -1 ${R}/boot/vmlinuz-* | sort | tail -n 1)"
165 176 if [ -z "$VMLINUZ" ] ; then
166 177 echo "error: kernel installation failed! (/boot/vmlinuz-* not found)"
167 178 cleanup
168 179 exit 1
169 180 fi
170 181 # Copy vmlinuz kernel to the boot directory
171 182 install_readonly "${VMLINUZ}" "${BOOT_DIR}/${KERNEL_IMAGE}"
172 183 fi
@@ -1,151 +1,151
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 temp_dir=$(sudo -u nobody mktemp -d)
20 temp_dir=$(as_nobody mktemp -d)
21 21
22 22 # Install latest boot binaries from raspberry/firmware github
23 sudo -u nobody wget -q -O "${temp_dir}/bootcode.bin" "${FIRMWARE_URL}/bootcode.bin"
24 sudo -u nobody wget -q -O "${temp_dir}/fixup.dat" "${FIRMWARE_URL}/fixup.dat"
25 sudo -u nobody wget -q -O "${temp_dir}/fixup_cd.dat" "${FIRMWARE_URL}/fixup_cd.dat"
26 sudo -u nobody wget -q -O "${temp_dir}/fixup_x.dat" "${FIRMWARE_URL}/fixup_x.dat"
27 sudo -u nobody wget -q -O "${temp_dir}/start.elf" "${FIRMWARE_URL}/start.elf"
28 sudo -u nobody wget -q -O "${temp_dir}/start_cd.elf" "${FIRMWARE_URL}/start_cd.elf"
29 sudo -u nobody wget -q -O "${temp_dir}/start_x.elf" "${FIRMWARE_URL}/start_x.elf"
23 as_nobody wget -q -O "${temp_dir}/bootcode.bin" "${FIRMWARE_URL}/bootcode.bin"
24 as_nobody wget -q -O "${temp_dir}/fixup.dat" "${FIRMWARE_URL}/fixup.dat"
25 as_nobody wget -q -O "${temp_dir}/fixup_cd.dat" "${FIRMWARE_URL}/fixup_cd.dat"
26 as_nobody wget -q -O "${temp_dir}/fixup_x.dat" "${FIRMWARE_URL}/fixup_x.dat"
27 as_nobody wget -q -O "${temp_dir}/start.elf" "${FIRMWARE_URL}/start.elf"
28 as_nobody wget -q -O "${temp_dir}/start_cd.elf" "${FIRMWARE_URL}/start_cd.elf"
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 45 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
46 46 else
47 47 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait console=tty1"
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 76 # Set init to systemd if required by Debian release
77 77 if [ "$RELEASE" = "stretch" ] ; then
78 78 CMDLINE="${CMDLINE} init=/bin/systemd"
79 79 fi
80 80
81 81 # Install firmware boot cmdline
82 82 echo "${CMDLINE}" > "${BOOT_DIR}/cmdline.txt"
83 83
84 84 # Install firmware config
85 85 install_readonly files/boot/config.txt "${BOOT_DIR}/config.txt"
86 86
87 87 # Setup minimal GPU memory allocation size: 16MB (no X)
88 88 if [ "$ENABLE_MINGPU" = true ] ; then
89 89 echo "gpu_mem=16" >> "${BOOT_DIR}/config.txt"
90 90 fi
91 91
92 92 # Setup boot with initramfs
93 93 if [ "$ENABLE_INITRAMFS" = true ] ; then
94 94 echo "initramfs initramfs-${KERNEL_VERSION} followkernel" >> "${BOOT_DIR}/config.txt"
95 95 fi
96 96
97 97 # Disable RPi3 Bluetooth and restore ttyAMA0 serial device
98 98 if [ "$RPI_MODEL" = 3 ] ; then
99 99 if [ "$ENABLE_CONSOLE" = true ] && [ "$ENABLE_UBOOT" = false ] ; then
100 100 echo "dtoverlay=pi3-disable-bt" >> "${BOOT_DIR}/config.txt"
101 101 echo "enable_uart=1" >> "${BOOT_DIR}/config.txt"
102 102 fi
103 103 fi
104 104
105 105 # Create firmware configuration and cmdline symlinks
106 106 ln -sf firmware/config.txt "${R}/boot/config.txt"
107 107 ln -sf firmware/cmdline.txt "${R}/boot/cmdline.txt"
108 108
109 109 # Install and setup kernel modules to load at boot
110 110 mkdir -p "${R}/lib/modules-load.d/"
111 111 install_readonly files/modules/rpi2.conf "${R}/lib/modules-load.d/rpi2.conf"
112 112
113 113 # Load hardware random module at boot
114 114 if [ "$ENABLE_HWRANDOM" = true ] && [ "$BUILD_KERNEL" = false ] ; then
115 115 sed -i "s/^# bcm2708_rng/bcm2708_rng/" "${R}/lib/modules-load.d/rpi2.conf"
116 116 fi
117 117
118 118 # Load sound module at boot
119 119 if [ "$ENABLE_SOUND" = true ] ; then
120 120 sed -i "s/^# snd_bcm2835/snd_bcm2835/" "${R}/lib/modules-load.d/rpi2.conf"
121 121 else
122 122 echo "dtparam=audio=off" >> "${BOOT_DIR}/config.txt"
123 123 fi
124 124
125 125 # Enable I2C interface
126 126 if [ "$ENABLE_I2C" = true ] ; then
127 127 echo "dtparam=i2c_arm=on" >> "${BOOT_DIR}/config.txt"
128 128 sed -i "s/^# i2c-bcm2708/i2c-bcm2708/" "${R}/lib/modules-load.d/rpi2.conf"
129 129 sed -i "s/^# i2c-dev/i2c-dev/" "${R}/lib/modules-load.d/rpi2.conf"
130 130 fi
131 131
132 132 # Enable SPI interface
133 133 if [ "$ENABLE_SPI" = true ] ; then
134 134 echo "dtparam=spi=on" >> "${BOOT_DIR}/config.txt"
135 135 echo "spi-bcm2708" >> "${R}/lib/modules-load.d/rpi2.conf"
136 136 if [ "$RPI_MODEL" = 3 ] ; then
137 137 sed -i "s/spi-bcm2708/spi-bcm2835/" "${R}/lib/modules-load.d/rpi2.conf"
138 138 fi
139 139 fi
140 140
141 141 # Disable RPi2/3 under-voltage warnings
142 142 if [ ! -z "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
143 143 echo "avoid_warnings=${DISABLE_UNDERVOLT_WARNINGS}" >> "${BOOT_DIR}/config.txt"
144 144 fi
145 145
146 146 # Install kernel modules blacklist
147 147 mkdir -p "${ETC_DIR}/modprobe.d/"
148 148 install_readonly files/modules/raspi-blacklist.conf "${ETC_DIR}/modprobe.d/raspi-blacklist.conf"
149 149
150 150 # Install sysctl.d configuration files
151 151 install_readonly files/sysctl.d/81-rpi-vm.conf "${ETC_DIR}/sysctl.d/81-rpi-vm.conf"
@@ -1,107 +1,107
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 10 sed -i "s/^rpi2-jessie/${HOSTNAME}/" "${ETC_DIR}/hostname"
11 11
12 12 # Install and setup hosts
13 13 install_readonly files/network/hosts "${ETC_DIR}/hosts"
14 14 sed -i "s/rpi2-jessie/${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 if [ "$ENABLE_DHCP" = true ] ; then
34 34 # Enable DHCP configuration for interface eth0
35 35 sed -i -e "s/DHCP=.*/DHCP=yes/" -e "/DHCP/q" "${ETC_DIR}/systemd/network/eth.network"
36 36
37 37 # Set DHCP configuration to IPv4 only
38 38 if [ "$ENABLE_IPV6" = false ] ; then
39 39 sed -i "s/DHCP=.*/DHCP=v4/" "${ETC_DIR}/systemd/network/eth.network"
40 40 fi
41 41
42 42 else # ENABLE_DHCP=false
43 43 # Set static network configuration for interface eth0
44 44 sed -i\
45 45 -e "s|DHCP=.*|DHCP=no|"\
46 46 -e "s|Address=\$|Address=${NET_ADDRESS}|"\
47 47 -e "s|Gateway=\$|Gateway=${NET_GATEWAY}|"\
48 48 -e "0,/DNS=\$/ s|DNS=\$|DNS=${NET_DNS_1}|"\
49 49 -e "0,/DNS=\$/ s|DNS=\$|DNS=${NET_DNS_2}|"\
50 50 -e "s|Domains=\$|Domains=${NET_DNS_DOMAINS}|"\
51 51 -e "0,/NTP=\$/ s|NTP=\$|NTP=${NET_NTP_1}|"\
52 52 -e "0,/NTP=\$/ s|NTP=\$|NTP=${NET_NTP_2}|"\
53 53 "${ETC_DIR}/systemd/network/eth.network"
54 54 fi
55 55
56 56 # Remove empty settings from network configuration
57 57 sed -i "/.*=\$/d" "${ETC_DIR}/systemd/network/eth.network"
58 58
59 59 # Move systemd network configuration if required by Debian release
60 60 if [ "$RELEASE" = "stretch" ] ; then
61 61 mv -v "${ETC_DIR}/systemd/network/eth.network" "${LIB_DIR}/systemd/network/10-eth.network"
62 62 rm -fr "${ETC_DIR}/systemd/network"
63 63 fi
64 64
65 65 # Enable systemd-networkd service
66 66 chroot_exec systemctl enable systemd-networkd
67 67
68 68 # Install host.conf resolver configuration
69 69 install_readonly files/network/host.conf "${ETC_DIR}/host.conf"
70 70
71 71 # Enable network stack hardening
72 72 if [ "$ENABLE_HARDNET" = true ] ; then
73 73 # Install sysctl.d configuration files
74 74 install_readonly files/sysctl.d/82-rpi-net-hardening.conf "${ETC_DIR}/sysctl.d/82-rpi-net-hardening.conf"
75 75
76 76 # Setup resolver warnings about spoofed addresses
77 77 sed -i "s/^# spoof warn/spoof warn/" "${ETC_DIR}/host.conf"
78 78 fi
79 79
80 80 # Enable time sync
81 81 if [ "NET_NTP_1" != "" ] ; then
82 82 chroot_exec systemctl enable systemd-timesyncd.service
83 83 fi
84 84
85 85 # Download the firmware binary blob required to use the RPi3 wireless interface
86 86 if [ "$ENABLE_WIRELESS" = true ] ; then
87 87 if [ ! -d ${WLAN_FIRMWARE_DIR} ] ; then
88 88 mkdir -p ${WLAN_FIRMWARE_DIR}
89 89 fi
90 90
91 91 # Create temporary directory for firmware binary blob
92 temp_dir=$(sudo -u nobody mktemp -d)
92 temp_dir=$(as_nobody mktemp -d)
93 93
94 94 # Fetch firmware binary blob
95 sudo -u nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.bin" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.bin"
96 sudo -u nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.txt" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.txt"
95 as_nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.bin" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.bin"
96 as_nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.txt" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.txt"
97 97
98 98 # Move downloaded firmware binary blob
99 99 mv "${temp_dir}/brcmfmac43430-sdio."* "${WLAN_FIRMWARE_DIR}/"
100 100
101 101 # Remove temporary directory for firmware binary blob
102 102 rm -fr "${temp_dir}"
103 103
104 104 # Set permissions of the firmware binary blob
105 105 chown root:root "${WLAN_FIRMWARE_DIR}/brcmfmac43430-sdio."*
106 106 chmod 600 "${WLAN_FIRMWARE_DIR}/brcmfmac43430-sdio."*
107 107 fi
@@ -1,83 +1,83
1 1 #
2 2 # Build and Setup U-Boot
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Fetch and build U-Boot bootloader
9 9 if [ "$ENABLE_UBOOT" = true ] ; then
10 10 # Install c/c++ build environment inside the chroot
11 11 chroot_install_cc
12 12
13 13 # Copy existing U-Boot sources into chroot directory
14 14 if [ -n "$UBOOTSRC_DIR" ] && [ -d "$UBOOTSRC_DIR" ] ; then
15 15 # Copy local U-Boot sources
16 16 cp -r "${UBOOTSRC_DIR}" "${R}/tmp"
17 17 else
18 18 # Create temporary directory for U-Boot sources
19 temp_dir=$(sudo -u nobody mktemp -d)
19 temp_dir=$(as_nobody mktemp -d)
20 20
21 21 # Fetch U-Boot sources
22 sudo -u nobody git -C "${temp_dir}" clone "${UBOOT_URL}"
22 as_nobody git -C "${temp_dir}" clone "${UBOOT_URL}"
23 23
24 24 # Copy downloaded U-Boot sources
25 25 mv "${temp_dir}/u-boot" "${R}/tmp/"
26 26
27 27 # Set permissions of the U-Boot sources
28 28 chown -R root:root "${R}/tmp/u-boot"
29 29
30 30 # Remove temporary directory for U-Boot sources
31 31 rm -fr "${temp_dir}"
32 32 fi
33 33
34 34 # Build and install U-Boot inside chroot
35 35 chroot_exec make -j${KERNEL_THREADS} -C /tmp/u-boot/ ${UBOOT_CONFIG} all
36 36
37 37 # Copy compiled bootloader binary and set config.txt to load it
38 38 install_exec "${R}/tmp/u-boot/tools/mkimage" "${R}/usr/sbin/mkimage"
39 39 install_readonly "${R}/tmp/u-boot/u-boot.bin" "${BOOT_DIR}/u-boot.bin"
40 40 printf "\n# boot u-boot kernel\nkernel=u-boot.bin\n" >> "${BOOT_DIR}/config.txt"
41 41
42 42 # Install and setup U-Boot command file
43 43 install_readonly files/boot/uboot.mkimage "${BOOT_DIR}/uboot.mkimage"
44 44 printf "# Set the kernel boot command line\nsetenv bootargs \"earlyprintk ${CMDLINE}\"\n\n$(cat ${BOOT_DIR}/uboot.mkimage)" > "${BOOT_DIR}/uboot.mkimage"
45 45
46 46 if [ "$ENABLE_INITRAMFS" = true ] ; then
47 47 # Convert generated initramfs for U-Boot using mkimage
48 48 chroot_exec /usr/sbin/mkimage -A "${KERNEL_ARCH}" -T ramdisk -C none -n "initramfs-${KERNEL_VERSION}" -d "/boot/firmware/initramfs-${KERNEL_VERSION}" "/boot/firmware/initramfs-${KERNEL_VERSION}.uboot"
49 49
50 50 # Remove original initramfs file
51 51 rm -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}"
52 52
53 53 # Configure U-Boot to load generated initramfs
54 54 printf "# Set initramfs file\nsetenv initramfs initramfs-${KERNEL_VERSION}.uboot\n\n$(cat ${BOOT_DIR}/uboot.mkimage)" > "${BOOT_DIR}/uboot.mkimage"
55 55 printf "\nbootz \${kernel_addr_r} \${ramdisk_addr_r} \${fdt_addr_r}" >> "${BOOT_DIR}/uboot.mkimage"
56 56 else # ENABLE_INITRAMFS=false
57 57 # Remove initramfs from U-Boot mkfile
58 58 sed -i '/.*initramfs.*/d' "${BOOT_DIR}/uboot.mkimage"
59 59
60 60 if [ "$BUILD_KERNEL" = false ] ; then
61 61 # Remove dtbfile from U-Boot mkfile
62 62 sed -i '/.*dtbfile.*/d' "${BOOT_DIR}/uboot.mkimage"
63 63 printf "\nbootz \${kernel_addr_r}" >> "${BOOT_DIR}/uboot.mkimage"
64 64 else
65 65 printf "\nbootz \${kernel_addr_r} - \${fdt_addr_r}" >> "${BOOT_DIR}/uboot.mkimage"
66 66 fi
67 67 fi
68 68
69 69 # Set mkfile to use the correct dtb file
70 70 sed -i "s/^\(setenv dtbfile \).*/\1${DTB_FILE}/" "${BOOT_DIR}/uboot.mkimage"
71 71
72 72 # Set mkfile to use kernel image
73 73 sed -i "s/^\(fatload mmc 0:1 \${kernel_addr_r} \).*/\1${KERNEL_IMAGE}/" "${BOOT_DIR}/uboot.mkimage"
74 74
75 75 # Remove all leading blank lines
76 76 sed -i "/./,\$!d" "${BOOT_DIR}/uboot.mkimage"
77 77
78 78 # Generate U-Boot bootloader image
79 79 chroot_exec /usr/sbin/mkimage -A "${KERNEL_ARCH}" -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi${RPI_MODEL}" -d /boot/firmware/uboot.mkimage /boot/firmware/boot.scr
80 80
81 81 # Remove U-Boot sources
82 82 rm -fr "${R}/tmp/u-boot"
83 83 fi
@@ -1,51 +1,51
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 temp_dir=$(sudo -u nobody mktemp -d)
18 temp_dir=$(as_nobody mktemp -d)
19 19
20 20 # Fetch fbturbo sources
21 sudo -u nobody git -C "${temp_dir}" clone "${FBTURBO_URL}"
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 31 if [ "$RELEASE" = "jessie" ] ; then
32 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 33 elif [ "$RELEASE" = "stretch" ] ; then
34 34 chroot_exec apt-get -q -y --no-install-recommends --allow-unauthenticated install xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
35 35 fi
36 36
37 37 # Build and install fbturbo driver inside chroot
38 38 chroot_exec /bin/bash -x <<'EOF'
39 39 cd /tmp/xf86-video-fbturbo
40 40 autoreconf -vi
41 41 ./configure --prefix=/usr
42 42 make
43 43 make install
44 44 EOF
45 45
46 46 # Install fbturbo driver Xorg configuration
47 47 install_readonly files/xorg/99-fbturbo.conf "${R}/usr/share/X11/xorg.conf.d/99-fbturbo.conf"
48 48
49 49 # Remove Xorg build dependencies
50 50 chroot_exec apt-get -qq -y --auto-remove purge xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
51 51 fi
@@ -1,76 +1,81
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 as_nobody() {
37 # Exec command as user nobody
38 sudo -E -u nobody LANG=C LC_ALL=C $*
39 }
40
36 41 install_readonly() {
37 42 # Install file with user read-only permissions
38 43 install -o root -g root -m 644 $*
39 44 }
40 45
41 46 install_exec() {
42 47 # Install file with root exec permissions
43 48 install -o root -g root -m 744 $*
44 49 }
45 50
46 51 use_template () {
47 52 # Test if configuration template file exists
48 53 if [ ! -r "./templates/${CONFIG_TEMPLATE}" ] ; then
49 54 echo "error: configuration template ${CONFIG_TEMPLATE} not found"
50 55 exit 1
51 56 fi
52 57
53 58 # Load template configuration parameters
54 59 . "./templates/${CONFIG_TEMPLATE}"
55 60 }
56 61
57 62 chroot_install_cc() {
58 63 # Install c/c++ build environment inside the chroot
59 64 if [ -z "${COMPILER_PACKAGES}" ] ; then
60 65 COMPILER_PACKAGES=$(chroot_exec apt-get -s install g++ make bc | grep "^Inst " | awk -v ORS=" " '{ print $2 }')
61 66
62 67 if [ "$RELEASE" = "jessie" ] ; then
63 68 chroot_exec apt-get -q -y --no-install-recommends install ${COMPILER_PACKAGES}
64 69 elif [ "$RELEASE" = "stretch" ] ; then
65 70 chroot_exec apt-get -q -y --allow-unauthenticated --no-install-recommends install ${COMPILER_PACKAGES}
66 71 fi
67 72 fi
68 73 }
69 74
70 75 chroot_remove_cc() {
71 76 # Remove c/c++ build environment from the chroot
72 77 if [ ! -z "${COMPILER_PACKAGES}" ] ; then
73 78 chroot_exec apt-get -qq -y --auto-remove purge ${COMPILER_PACKAGES}
74 79 COMPILER_PACKAGES=""
75 80 fi
76 81 }
@@ -1,629 +1,653
1 1 #!/bin/sh
2 2
3 3 ########################################################################
4 4 # rpi23-gen-image.sh 2015-2017
5 5 #
6 6 # Advanced Debian "jessie" and "stretch" bootstrap script for RPi2/3
7 7 #
8 8 # This program is free software; you can redistribute it and/or
9 9 # modify it under the terms of the GNU General Public License
10 10 # as published by the Free Software Foundation; either version 2
11 11 # of the License, or (at your option) any later version.
12 12 #
13 13 # Copyright (C) 2015 Jan Wagner <mail@jwagner.eu>
14 14 #
15 15 # Big thanks for patches and enhancements by 10+ github contributors!
16 16 ########################################################################
17 17
18 18 # Are we running as root?
19 19 if [ "$(id -u)" -ne "0" ] ; then
20 20 echo "error: this script must be executed with root privileges!"
21 21 exit 1
22 22 fi
23 23
24 24 # Check if ./functions.sh script exists
25 25 if [ ! -r "./functions.sh" ] ; then
26 26 echo "error: './functions.sh' required script not found!"
27 27 exit 1
28 28 fi
29 29
30 30 # Load utility functions
31 31 . ./functions.sh
32 32
33 33 # Load parameters from configuration template file
34 34 if [ ! -z "$CONFIG_TEMPLATE" ] ; then
35 35 use_template
36 36 fi
37 37
38 38 # Introduce settings
39 39 set -e
40 40 echo -n -e "\n#\n# RPi2/3 Bootstrap Settings\n#\n"
41 41 set -x
42 42
43 43 # Raspberry Pi model configuration
44 44 RPI_MODEL=${RPI_MODEL:=2}
45 45 RPI2_DTB_FILE=${RPI2_DTB_FILE:=bcm2709-rpi-2-b.dtb}
46 46 RPI2_UBOOT_CONFIG=${RPI2_UBOOT_CONFIG:=rpi_2_defconfig}
47 47 RPI3_DTB_FILE=${RPI3_DTB_FILE:=bcm2710-rpi-3-b.dtb}
48 48 RPI3_UBOOT_CONFIG=${RPI3_UBOOT_CONFIG:=rpi_3_32b_defconfig}
49 49
50 50 # Debian release
51 51 RELEASE=${RELEASE:=jessie}
52 52 KERNEL_ARCH=${KERNEL_ARCH:=arm}
53 53 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
54 54 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
55 55 COLLABORA_KERNEL=${COLLABORA_KERNEL:=3.18.0-trunk-rpi2}
56 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
57 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
58 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
56 if [ "$KERNEL_ARCH" = "arm64" ] ; then
57 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
58 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
59 else
60 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
61 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
62 fi
63 if [ "$RELEASE_ARCH" = "arm64" ] ; then
64 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
65 else
66 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
67 fi
68 KERNEL_BRANCH=${KERNEL_BRANCH:=""}
59 69
60 70 # URLs
61 71 KERNEL_URL=${KERNEL_URL:=https://github.com/raspberrypi/linux}
62 72 FIRMWARE_URL=${FIRMWARE_URL:=https://github.com/raspberrypi/firmware/raw/master/boot}
63 73 WLAN_FIRMWARE_URL=${WLAN_FIRMWARE_URL:=https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm}
64 74 COLLABORA_URL=${COLLABORA_URL:=https://repositories.collabora.co.uk/debian}
65 75 FBTURBO_URL=${FBTURBO_URL:=https://github.com/ssvb/xf86-video-fbturbo.git}
66 76 UBOOT_URL=${UBOOT_URL:=git://git.denx.de/u-boot.git}
67 77
68 78 # Build directories
69 79 BASEDIR=${BASEDIR:=$(pwd)/images/${RELEASE}}
70 80 BUILDDIR="${BASEDIR}/build"
81
71 82 # Prepare date string for default image file name
72 83 DATE="$(date +%Y-%m-%d)"
73 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}}
84 if [ -z "$KERNEL_BRANCH" ] ; then
85 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
86 else
87 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
88 fi
74 89
75 90 # Chroot directories
76 91 R="${BUILDDIR}/chroot"
77 92 ETC_DIR="${R}/etc"
78 93 LIB_DIR="${R}/lib"
79 94 BOOT_DIR="${R}/boot/firmware"
80 95 KERNEL_DIR="${R}/usr/src/linux"
81 96 WLAN_FIRMWARE_DIR="${R}/lib/firmware/brcm"
82 97
83 98 # Firmware directory: Blank if download from github
84 99 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
85 100
86 101 # General settings
87 102 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
88 103 PASSWORD=${PASSWORD:=raspberry}
89 104 USER_PASSWORD=${USER_PASSWORD:=raspberry}
90 105 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
91 106 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
92 107 EXPANDROOT=${EXPANDROOT:=true}
93 108
94 109 # Keyboard settings
95 110 XKB_MODEL=${XKB_MODEL:=""}
96 111 XKB_LAYOUT=${XKB_LAYOUT:=""}
97 112 XKB_VARIANT=${XKB_VARIANT:=""}
98 113 XKB_OPTIONS=${XKB_OPTIONS:=""}
99 114
100 115 # Network settings (DHCP)
101 116 ENABLE_DHCP=${ENABLE_DHCP:=true}
102 117
103 118 # Network settings (static)
104 119 NET_ADDRESS=${NET_ADDRESS:=""}
105 120 NET_GATEWAY=${NET_GATEWAY:=""}
106 121 NET_DNS_1=${NET_DNS_1:=""}
107 122 NET_DNS_2=${NET_DNS_2:=""}
108 123 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
109 124 NET_NTP_1=${NET_NTP_1:=""}
110 125 NET_NTP_2=${NET_NTP_2:=""}
111 126
112 127 # APT settings
113 128 APT_PROXY=${APT_PROXY:=""}
114 129 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
115 130
116 131 # Feature settings
117 132 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
118 133 ENABLE_I2C=${ENABLE_I2C:=false}
119 134 ENABLE_SPI=${ENABLE_SPI:=false}
120 135 ENABLE_IPV6=${ENABLE_IPV6:=true}
121 136 ENABLE_SSHD=${ENABLE_SSHD:=true}
122 137 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
123 138 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
124 139 ENABLE_SOUND=${ENABLE_SOUND:=true}
125 140 ENABLE_DBUS=${ENABLE_DBUS:=true}
126 141 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
127 142 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
128 143 ENABLE_XORG=${ENABLE_XORG:=false}
129 144 ENABLE_WM=${ENABLE_WM:=""}
130 145 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
131 146 ENABLE_USER=${ENABLE_USER:=true}
132 147 USER_NAME=${USER_NAME:="pi"}
133 148 ENABLE_ROOT=${ENABLE_ROOT:=false}
134 149
135 150 # SSH settings
136 151 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
137 152 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
138 153 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
139 154 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
140 155 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
141 156
142 157 # Advanced settings
143 158 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
144 159 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
145 160 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
146 161 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
147 162 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
148 163 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
149 164 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
150 165 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
151 166 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
152 167 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
153 168 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
154 169 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
155 170
156 171 # Kernel compilation settings
157 172 BUILD_KERNEL=${BUILD_KERNEL:=false}
158 173 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
159 174 KERNEL_THREADS=${KERNEL_THREADS:=1}
160 175 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
161 176 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
162 177 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
178 if [ "$KERNEL_ARCH" = "arm64" ] ; then
179 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
180 else
181 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
182 fi
163 183
164 184 # Kernel compilation from source directory settings
165 185 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
166 186 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
167 187 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
168 188 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
169 189
170 190 # Reduce disk usage settings
171 191 REDUCE_APT=${REDUCE_APT:=true}
172 192 REDUCE_DOC=${REDUCE_DOC:=true}
173 193 REDUCE_MAN=${REDUCE_MAN:=true}
174 194 REDUCE_VIM=${REDUCE_VIM:=false}
175 195 REDUCE_BASH=${REDUCE_BASH:=false}
176 196 REDUCE_HWDB=${REDUCE_HWDB:=true}
177 197 REDUCE_SSHD=${REDUCE_SSHD:=true}
178 198 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
179 199
180 200 # Encrypted filesystem settings
181 201 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
182 202 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
183 203 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
184 204 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
185 205 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
186 206
187 207 # Stop the Crypto Wars
188 208 DISABLE_FBI=${DISABLE_FBI:=false}
189 209
190 210 # Chroot scripts directory
191 211 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
192 212
193 213 # Packages required in the chroot build environment
194 214 APT_INCLUDES=${APT_INCLUDES:=""}
195 215 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils"
196 216
197 217 # Packages required for bootstrapping
198 218 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
199 219 MISSING_PACKAGES=""
200 220
201 221 # Packages installed for c/c++ build environment in chroot (keep empty)
202 222 COMPILER_PACKAGES=""
203 223
204 224 set +x
205 225
206 226 # Set Raspberry Pi model specific configuration
207 227 if [ "$RPI_MODEL" = 2 ] ; then
208 228 DTB_FILE=${RPI2_DTB_FILE}
209 229 UBOOT_CONFIG=${RPI2_UBOOT_CONFIG}
210 230 elif [ "$RPI_MODEL" = 3 ] ; then
211 231 DTB_FILE=${RPI3_DTB_FILE}
212 232 UBOOT_CONFIG=${RPI3_UBOOT_CONFIG}
213 233 BUILD_KERNEL=true
214 234 else
215 235 echo "error: Raspberry Pi model ${RPI_MODEL} is not supported!"
216 236 exit 1
217 237 fi
218 238
219 239 # Check if the internal wireless interface is supported by the RPi model
220 240 if [ "$ENABLE_WIRELESS" = true ] && [ "$RPI_MODEL" != 3 ] ; then
221 241 echo "error: The selected Raspberry Pi model has no internal wireless interface"
222 242 exit 1
223 243 fi
224 244
225 245 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
226 246 if [ ! -z "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
227 247 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
228 248 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
229 249 exit 1
230 250 fi
231 251 fi
232 252
233 253 # Build RPi2/3 Linux kernel if required by Debian release
234 254 if [ "$RELEASE" = "stretch" ] ; then
235 255 BUILD_KERNEL=true
236 256 fi
237 257
238 258 # Add packages required for kernel cross compilation
239 259 if [ "$BUILD_KERNEL" = true ] ; then
240 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
260 if [ "$KERNEL_ARCH" = "arm" ] ; then
261 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
262 else
263 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
264 fi
241 265 fi
242 266
243 267 # Add libncurses5 to enable kernel menuconfig
244 268 if [ "$KERNEL_MENUCONFIG" = true ] ; then
245 269 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses5-dev"
246 270 fi
247 271
248 272 # Stop the Crypto Wars
249 273 if [ "$DISABLE_FBI" = true ] ; then
250 274 ENABLE_CRYPTFS=true
251 275 fi
252 276
253 277 # Add cryptsetup package to enable filesystem encryption
254 278 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
255 279 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
256 280 APT_INCLUDES="${APT_INCLUDES},cryptsetup"
257 281
258 282 if [ -z "$CRYPTFS_PASSWORD" ] ; then
259 283 echo "error: no password defined (CRYPTFS_PASSWORD)!"
260 284 exit 1
261 285 fi
262 286 ENABLE_INITRAMFS=true
263 287 fi
264 288
265 289 # Add initramfs generation tools
266 290 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
267 291 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
268 292 fi
269 293
270 294 # Add device-tree-compiler required for building the U-Boot bootloader
271 295 if [ "$ENABLE_UBOOT" = true ] ; then
272 296 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler"
273 297 fi
274 298
275 299 # Check if root SSH (v2) public key file exists
276 300 if [ ! -z "$SSH_ROOT_PUB_KEY" ] ; then
277 301 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
278 302 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
279 303 exit 1
280 304 fi
281 305 fi
282 306
283 307 # Check if $USER_NAME SSH (v2) public key file exists
284 308 if [ ! -z "$SSH_USER_PUB_KEY" ] ; then
285 309 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
286 310 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
287 311 exit 1
288 312 fi
289 313 fi
290 314
291 315 # Check if all required packages are installed on the build system
292 316 for package in $REQUIRED_PACKAGES ; do
293 317 if [ "`dpkg-query -W -f='${Status}' $package`" != "install ok installed" ] ; then
294 318 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
295 319 fi
296 320 done
297 321
298 322 # If there are missing packages ask confirmation for install, or exit
299 323 if [ -n "$MISSING_PACKAGES" ] ; then
300 324 echo "the following packages needed by this script are not installed:"
301 325 echo "$MISSING_PACKAGES"
302 326
303 327 echo -n "\ndo you want to install the missing packages right now? [y/n] "
304 328 read confirm
305 329 [ "$confirm" != "y" ] && exit 1
306 330
307 331 # Make sure all missing required packages are installed
308 332 apt-get -qq -y install ${MISSING_PACKAGES}
309 333 fi
310 334
311 335 # Check if ./bootstrap.d directory exists
312 336 if [ ! -d "./bootstrap.d/" ] ; then
313 337 echo "error: './bootstrap.d' required directory not found!"
314 338 exit 1
315 339 fi
316 340
317 341 # Check if ./files directory exists
318 342 if [ ! -d "./files/" ] ; then
319 343 echo "error: './files' required directory not found!"
320 344 exit 1
321 345 fi
322 346
323 347 # Check if specified KERNELSRC_DIR directory exists
324 348 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
325 349 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
326 350 exit 1
327 351 fi
328 352
329 353 # Check if specified UBOOTSRC_DIR directory exists
330 354 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
331 355 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
332 356 exit 1
333 357 fi
334 358
335 359 # Check if specified FBTURBOSRC_DIR directory exists
336 360 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
337 361 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
338 362 exit 1
339 363 fi
340 364
341 365 # Check if specified CHROOT_SCRIPTS directory exists
342 366 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
343 367 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
344 368 exit 1
345 369 fi
346 370
347 371 # Check if specified device mapping already exists (will be used by cryptsetup)
348 372 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
349 373 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
350 374 exit 1
351 375 fi
352 376
353 377 # Don't clobber an old build
354 378 if [ -e "$BUILDDIR" ] ; then
355 379 echo "error: directory ${BUILDDIR} already exists, not proceeding"
356 380 exit 1
357 381 fi
358 382
359 383 # Setup chroot directory
360 384 mkdir -p "${R}"
361 385
362 386 # Check if build directory has enough of free disk space >512MB
363 387 if [ "$(df --output=avail ${BUILDDIR} | sed "1d")" -le "524288" ] ; then
364 388 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
365 389 exit 1
366 390 fi
367 391
368 392 set -x
369 393
370 394 # Call "cleanup" function on various signals and errors
371 395 trap cleanup 0 1 2 3 6
372 396
373 397 # Add required packages for the minbase installation
374 398 if [ "$ENABLE_MINBASE" = true ] ; then
375 399 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
376 400 fi
377 401
378 402 # Add required locales packages
379 403 if [ "$DEFLOCAL" != "en_US.UTF-8" ] ; then
380 404 APT_INCLUDES="${APT_INCLUDES},locales,keyboard-configuration,console-setup"
381 405 fi
382 406
383 407 # Add parted package, required to get partprobe utility
384 408 if [ "$EXPANDROOT" = true ] ; then
385 409 APT_INCLUDES="${APT_INCLUDES},parted"
386 410 fi
387 411
388 412 # Add dbus package, recommended if using systemd
389 413 if [ "$ENABLE_DBUS" = true ] ; then
390 414 APT_INCLUDES="${APT_INCLUDES},dbus"
391 415 fi
392 416
393 417 # Add iptables IPv4/IPv6 package
394 418 if [ "$ENABLE_IPTABLES" = true ] ; then
395 419 APT_INCLUDES="${APT_INCLUDES},iptables"
396 420 fi
397 421
398 422 # Add openssh server package
399 423 if [ "$ENABLE_SSHD" = true ] ; then
400 424 APT_INCLUDES="${APT_INCLUDES},openssh-server"
401 425 fi
402 426
403 427 # Add alsa-utils package
404 428 if [ "$ENABLE_SOUND" = true ] ; then
405 429 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
406 430 fi
407 431
408 432 # Add rng-tools package
409 433 if [ "$ENABLE_HWRANDOM" = true ] ; then
410 434 APT_INCLUDES="${APT_INCLUDES},rng-tools"
411 435 fi
412 436
413 437 # Add fbturbo video driver
414 438 if [ "$ENABLE_FBTURBO" = true ] ; then
415 439 # Enable xorg package dependencies
416 440 ENABLE_XORG=true
417 441 fi
418 442
419 443 # Add user defined window manager package
420 444 if [ -n "$ENABLE_WM" ] ; then
421 445 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
422 446
423 447 # Enable xorg package dependencies
424 448 ENABLE_XORG=true
425 449 fi
426 450
427 451 # Add xorg package
428 452 if [ "$ENABLE_XORG" = true ] ; then
429 453 APT_INCLUDES="${APT_INCLUDES},xorg"
430 454 fi
431 455
432 456 # Replace selected packages with smaller clones
433 457 if [ "$ENABLE_REDUCE" = true ] ; then
434 458 # Add levee package instead of vim-tiny
435 459 if [ "$REDUCE_VIM" = true ] ; then
436 460 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
437 461 fi
438 462
439 463 # Add dropbear package instead of openssh-server
440 464 if [ "$REDUCE_SSHD" = true ] ; then
441 465 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/openssh-server/dropbear/")"
442 466 fi
443 467 fi
444 468
445 469 # Configure kernel sources if no KERNELSRC_DIR
446 470 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
447 471 KERNELSRC_CONFIG=true
448 472 fi
449 473
450 474 # Configure reduced kernel
451 475 if [ "$KERNEL_REDUCE" = true ] ; then
452 476 KERNELSRC_CONFIG=false
453 477 fi
454 478
455 479 # Execute bootstrap scripts
456 480 for SCRIPT in bootstrap.d/*.sh; do
457 481 head -n 3 "$SCRIPT"
458 482 . "$SCRIPT"
459 483 done
460 484
461 485 ## Execute custom bootstrap scripts
462 486 if [ -d "custom.d" ] ; then
463 487 for SCRIPT in custom.d/*.sh; do
464 488 . "$SCRIPT"
465 489 done
466 490 fi
467 491
468 492 # Execute custom scripts inside the chroot
469 493 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
470 494 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
471 495 chroot_exec /bin/bash -x <<'EOF'
472 496 for SCRIPT in /chroot_scripts/* ; do
473 497 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
474 498 $SCRIPT
475 499 fi
476 500 done
477 501 EOF
478 502 rm -rf "${R}/chroot_scripts"
479 503 fi
480 504
481 505 # Remove c/c++ build environment from the chroot
482 506 chroot_remove_cc
483 507
484 508 # Remove apt-utils
485 509 if [ "$RELEASE" = "jessie" ] ; then
486 510 chroot_exec apt-get purge -qq -y --force-yes apt-utils
487 511 fi
488 512
489 513 # Generate required machine-id
490 514 MACHINE_ID=$(dbus-uuidgen)
491 515 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
492 516 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
493 517
494 518 # APT Cleanup
495 519 chroot_exec apt-get -y clean
496 520 chroot_exec apt-get -y autoclean
497 521 chroot_exec apt-get -y autoremove
498 522
499 523 # Unmount mounted filesystems
500 524 umount -l "${R}/proc"
501 525 umount -l "${R}/sys"
502 526
503 527 # Clean up directories
504 528 rm -rf "${R}/run/*"
505 529 rm -rf "${R}/tmp/*"
506 530
507 531 # Clean up files
508 532 rm -f "${ETC_DIR}/ssh/ssh_host_*"
509 533 rm -f "${ETC_DIR}/dropbear/dropbear_*"
510 534 rm -f "${ETC_DIR}/apt/sources.list.save"
511 535 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
512 536 rm -f "${ETC_DIR}/*-"
513 537 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
514 538 rm -f "${ETC_DIR}/resolv.conf"
515 539 rm -f "${R}/root/.bash_history"
516 540 rm -f "${R}/var/lib/urandom/random-seed"
517 541 rm -f "${R}/initrd.img"
518 542 rm -f "${R}/vmlinuz"
519 543 rm -f "${R}${QEMU_BINARY}"
520 544
521 545 # Calculate size of the chroot directory in KB
522 546 CHROOT_SIZE=$(expr `du -s "${R}" | awk '{ print $1 }'`)
523 547
524 548 # Calculate the amount of needed 512 Byte sectors
525 549 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
526 550 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
527 551 ROOT_OFFSET=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS})
528 552
529 553 # The root partition is EXT4
530 554 # This means more space than the actual used space of the chroot is used.
531 555 # As overhead for journaling and reserved blocks 25% are added.
532 556 ROOT_SECTORS=$(expr $(expr ${CHROOT_SIZE} + ${CHROOT_SIZE} \/ 100 \* 25) \* 1024 \/ 512)
533 557
534 558 # Calculate required image size in 512 Byte sectors
535 559 IMAGE_SECTORS=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS})
536 560
537 561 # Prepare image file
538 562 if [ "$ENABLE_SPLITFS" = true ] ; then
539 563 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=${TABLE_SECTORS}
540 564 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek=${FRMW_SECTORS}
541 565 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=${TABLE_SECTORS}
542 566 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek=${ROOT_SECTORS}
543 567
544 568 # Write firmware/boot partition tables
545 569 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
546 570 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
547 571 EOM
548 572
549 573 # Write root partition table
550 574 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
551 575 ${TABLE_SECTORS},${ROOT_SECTORS},83
552 576 EOM
553 577
554 578 # Setup temporary loop devices
555 579 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME-frmw.img)"
556 580 ROOT_LOOP="$(losetup -o 1M -f --show $IMAGE_NAME-root.img)"
557 581 else # ENABLE_SPLITFS=false
558 582 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=${TABLE_SECTORS}
559 583 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek=${IMAGE_SECTORS}
560 584
561 585 # Write partition table
562 586 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
563 587 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
564 588 ${ROOT_OFFSET},${ROOT_SECTORS},83
565 589 EOM
566 590
567 591 # Setup temporary loop devices
568 592 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME.img)"
569 593 ROOT_LOOP="$(losetup -o 65M -f --show $IMAGE_NAME.img)"
570 594 fi
571 595
572 596 if [ "$ENABLE_CRYPTFS" = true ] ; then
573 597 # Create dummy ext4 fs
574 598 mkfs.ext4 "$ROOT_LOOP"
575 599
576 600 # Setup password keyfile
577 601 touch .password
578 602 chmod 600 .password
579 603 echo -n ${CRYPTFS_PASSWORD} > .password
580 604
581 605 # Initialize encrypted partition
582 606 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
583 607
584 608 # Open encrypted partition and setup mapping
585 609 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
586 610
587 611 # Secure delete password keyfile
588 612 shred -zu .password
589 613
590 614 # Update temporary loop device
591 615 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
592 616
593 617 # Wipe encrypted partition (encryption cipher is used for randomness)
594 618 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count=$(blockdev --getsz "${ROOT_LOOP}")
595 619 fi
596 620
597 621 # Build filesystems
598 622 mkfs.vfat "$FRMW_LOOP"
599 623 mkfs.ext4 "$ROOT_LOOP"
600 624
601 625 # Mount the temporary loop devices
602 626 mkdir -p "$BUILDDIR/mount"
603 627 mount "$ROOT_LOOP" "$BUILDDIR/mount"
604 628
605 629 mkdir -p "$BUILDDIR/mount/boot/firmware"
606 630 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
607 631
608 632 # Copy all files from the chroot to the loop device mount point directory
609 633 rsync -a "${R}/" "$BUILDDIR/mount/"
610 634
611 635 # Unmount all temporary loop devices and mount points
612 636 cleanup
613 637
614 638 # Create block map file(s) of image(s)
615 639 if [ "$ENABLE_SPLITFS" = true ] ; then
616 640 # Create block map files for "bmaptool"
617 641 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
618 642 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
619 643
620 644 # Image was successfully created
621 645 echo "$IMAGE_NAME-frmw.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
622 646 echo "$IMAGE_NAME-root.img ($(expr \( ${TABLE_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
623 647 else
624 648 # Create block map file for "bmaptool"
625 649 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
626 650
627 651 # Image was successfully created
628 652 echo "$IMAGE_NAME.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
629 653 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant