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