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