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