##// END OF EJS Templates
Merge branch 'master' into 0
drtyhlpr -
r464:2cb5f5fcd7e0 Fusion
parent child
Show More
@@ -1,501 +1,501
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 all Raspberry Pi computers. The script at this time supports the bootstrapping of the Debian (armhf/armel) releases `stretch` and `buster`. Raspberry Pi 0/1/2/3 images are generated for 32-bit mode only. Raspberry Pi 3 supports 64-bit images that 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 Raspberry 3 this is mandatory. Kernel compilation and linking will be performed on the build system using an ARM (armhf/armel) 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` and `crossbuild-essential-armel` toolchain meta packages 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
63
62
64 ##### `RPI_MODEL`=2
63 ##### `RPI_MODEL`=2
65 Specifiy the target Raspberry Pi hardware model. The script at this time supports the following Raspberry Pi models:
64 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
65 - `0` = Used for Raspberry Pi 0 and Raspberry Pi 0 W
67 - `1` = Used for Pi 1 model A and B
66 - `1` = Used for Pi 1 model A and B
68 - `1P` = Used for Pi 1 model B+ and A+
67 - `1P` = Used for Pi 1 model B+ and A+
69 - `2` = Used for Pi 2 model B
68 - `2` = Used for Pi 2 model B
70 - `3` = Used for Pi 3 model B
69 - `3` = Used for Pi 3 model B
71 - `3P` = Used for Pi 3 model B+
70 - `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.
71 - `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` or `3P` is used.
73
72
74 ##### `RELEASE`="buster"
73 ##### `RELEASE`="buster"
75 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases `stretch` and `buster`.
74 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases `stretch` and `buster`.
76
75
77 ##### `RELEASE_ARCH`="armhf"
76 ##### `RELEASE_ARCH`="armhf"
78 Set the desired Debian release architecture.
77 Set the desired Debian release architecture.
79
78
80 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
79 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
81 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
80 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
82
81
83 ##### `PASSWORD`="raspberry"
82 ##### `PASSWORD`="raspberry"
84 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
83 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
85
84
86 ##### `USER_PASSWORD`="raspberry"
85 ##### `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.
86 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
87
89 ##### `DEFLOCAL`="en_US.UTF-8"
88 ##### `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`.
89 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
90
92 ##### `TIMEZONE`="Europe/Berlin"
91 ##### `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.
92 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
93
95 ##### `EXPANDROOT`=true
94 ##### `EXPANDROOT`=true
96 Expand the root partition and filesystem automatically on first boot.
95 Expand the root partition and filesystem automatically on first boot.
97
96
98 ##### `ENABLE_QEMU`=false
97 ##### `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.
98 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
99
101 ---
100 ---
102
101
103 #### Keyboard settings:
102 #### 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.
103 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
104
106 ##### `XKB_MODEL`=""
105 ##### `XKB_MODEL`=""
107 Set the name of the model of your keyboard type.
106 Set the name of the model of your keyboard type.
108
107
109 ##### `XKB_LAYOUT`=""
108 ##### `XKB_LAYOUT`=""
110 Set the supported keyboard layout(s).
109 Set the supported keyboard layout(s).
111
110
112 ##### `XKB_VARIANT`=""
111 ##### `XKB_VARIANT`=""
113 Set the supported variant(s) of the keyboard layout(s).
112 Set the supported variant(s) of the keyboard layout(s).
114
113
115 ##### `XKB_OPTIONS`=""
114 ##### `XKB_OPTIONS`=""
116 Set extra xkb configuration options.
115 Set extra xkb configuration options.
117
116
118 ---
117 ---
119
118
120 #### Networking settings (DHCP):
119 #### 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`.`
120 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
121
123 ##### `ENABLE_DHCP`=true
122 ##### `ENABLE_DHCP`=true
124 Set the system to use DHCP. This requires an DHCP server.
123 Set the system to use DHCP. This requires an DHCP server.
125
124
126 ---
125 ---
127
126
128 #### Networking settings (static):
127 #### 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`.
128 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
129
131 ##### `NET_ADDRESS`=""
130 ##### `NET_ADDRESS`=""
132 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
131 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
133
132
134 ##### `NET_GATEWAY`=""
133 ##### `NET_GATEWAY`=""
135 Set the IP address for the default gateway.
134 Set the IP address for the default gateway.
136
135
137 ##### `NET_DNS_1`=""
136 ##### `NET_DNS_1`=""
138 Set the IP address for the first DNS server.
137 Set the IP address for the first DNS server.
139
138
140 ##### `NET_DNS_2`=""
139 ##### `NET_DNS_2`=""
141 Set the IP address for the second DNS server.
140 Set the IP address for the second DNS server.
142
141
143 ##### `NET_DNS_DOMAINS`=""
142 ##### `NET_DNS_DOMAINS`=""
144 Set the default DNS search domains to use for non fully qualified host names.
143 Set the default DNS search domains to use for non fully qualified host names.
145
144
146 ##### `NET_NTP_1`=""
145 ##### `NET_NTP_1`=""
147 Set the IP address for the first NTP server.
146 Set the IP address for the first NTP server.
148
147
149 ##### `NET_NTP_2`=""
148 ##### `NET_NTP_2`=""
150 Set the IP address for the second NTP server.
149 Set the IP address for the second NTP server.
151
150
152 ---
151 ---
153
152
154 #### Basic system features:
153 #### Basic system features:
155 ##### `ENABLE_CONSOLE`=true
154 ##### `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. On RPI `0` `3` `3P` the CPU speed is locked at lowest speed.
155 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 `0` `3` `3P` the CPU speed is locked at lowest speed.
157
156
158 ##### `ENABLE_PRINTK`=false
157 ##### `ENABLE_PRINTK`=false
159 Enables printing kernel messages to konsole. printk is `3 4 1 3` as in raspbian.
158 Enables printing kernel messages to konsole. printk is `3 4 1 3` as in raspbian.
160
159
161 ##### `ENABLE_BLUETOOTH`=false
160 ##### `ENABLE_BLUETOOTH`=false
162 Enable onboard Bluetooth interface on the RPi0/3/3P. See: https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/
161 Enable onboard Bluetooth interface on the RPi0/3/3P. See: https://spellfoundry.com/2016/05/29/configuring-gpio-serial-port-raspbian-jessie-including-pi-3/
163
162
164 ##### `ENABLE_MINIUART_OVERLAY`=false
163 ##### `ENABLE_MINIUART_OVERLAY`=false
165 Enable Bluetooth to use this. Adds overlay to swap UART0 with UART1. Enabling (slower) Bluetooth and full speed serial console. - RPI `0` `3` `3P` have a fast `hardware UART0` (ttyAMA0) and a `mini UART1` (ttyS0)! RPI `1` `1P` `2` only have a `hardware UART0`. `UART0` is considered better, because is faster and more stable than `mini UART1`. By default the Bluetooth modem is mapped to the `hardware UART0` and `mini UART` is used for console. The `mini UART` is a problem for the serial console, because its baudrate depends on the cpu frequency, which is changing on runtime. Resulting in a volatile baudrate and thus in an unusable serial console.
164 Enable Bluetooth to use this. Adds overlay to swap UART0 with UART1. Enabling (slower) Bluetooth and full speed serial console. - RPI `0` `3` `3P` have a fast `hardware UART0` (ttyAMA0) and a `mini UART1` (ttyS0)! RPI `1` `1P` `2` only have a `hardware UART0`. `UART0` is considered better, because is faster and more stable than `mini UART1`. By default the Bluetooth modem is mapped to the `hardware UART0` and `mini UART` is used for console. The `mini UART` is a problem for the serial console, because its baudrate depends on the cpu frequency, which is changing on runtime. Resulting in a volatile baudrate and thus in an unusable serial console.
166
165
167 ##### `ENABLE_TURBO`=false
166 ##### `ENABLE_TURBO`=false
168 Enable Turbo mode. This setting locks cpu at highest frequency. As setting ENABLE_CONSOLE=true locks RPI to lowest CPU speed, this is can be used additionally to lock cpu hat max speed. Need a good power supply and probably cooling for the Raspberry PI.
167 Enable Turbo mode. This setting locks cpu at highest frequency. As setting ENABLE_CONSOLE=true locks RPI to lowest CPU speed, this is can be used additionally to lock cpu hat max speed. Need a good power supply and probably cooling for the Raspberry PI.
169
168
170 ##### `ENABLE_I2C`=false
169 ##### `ENABLE_I2C`=false
171 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.
170 Enable I2C interface on the RPi 0/1/2/3. Please check the [RPi 0/1/2/3 pinout diagrams](https://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
172
171
173 ##### `ENABLE_SPI`=false
172 ##### `ENABLE_SPI`=false
174 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.
173 Enable SPI interface on the RPi 0/1/2/3. Please check the [RPi 0/1/2/3 pinout diagrams](https://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
175
174
176 ##### `ENABLE_IPV6`=true
175 ##### `ENABLE_IPV6`=true
177 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
176 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
178
177
179 ##### `ENABLE_SSHD`=true
178 ##### `ENABLE_SSHD`=true
180 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.
179 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.
181
180
182 ##### `ENABLE_NONFREE`=false
181 ##### `ENABLE_NONFREE`=false
183 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.
182 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.
184
183
185 ##### `ENABLE_WIRELESS`=false
184 ##### `ENABLE_WIRELESS`=false
186 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`.
185 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`.
187
186
188 ##### `ENABLE_RSYSLOG`=true
187 ##### `ENABLE_RSYSLOG`=true
189 If set to false, disable and uninstall rsyslog (so logs will be available only in journal files)
188 If set to false, disable and uninstall rsyslog (so logs will be available only in journal files)
190
189
191 ##### `ENABLE_SOUND`=true
190 ##### `ENABLE_SOUND`=true
192 Enable sound hardware and install Advanced Linux Sound Architecture.
191 Enable sound hardware and install Advanced Linux Sound Architecture.
193
192
194 ##### `ENABLE_HWRANDOM`=true
193 ##### `ENABLE_HWRANDOM`=true
195 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
194 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
196
195
197 ##### `ENABLE_MINGPU`=false
196 ##### `ENABLE_MINGPU`=false
198 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
197 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
199
198
200 ##### `ENABLE_DBUS`=true
199 ##### `ENABLE_DBUS`=true
201 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
200 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
202
201
203 ##### `ENABLE_XORG`=false
202 ##### `ENABLE_XORG`=false
204 Install Xorg open-source X Window System.
203 Install Xorg open-source X Window System.
205
204
206 ##### `ENABLE_WM`=""
205 ##### `ENABLE_WM`=""
207 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`.
206 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`.
208
207
209 ##### `ENABLE_SYSVINIT`=false
208 ##### `ENABLE_SYSVINIT`=false
210 Support for halt,init,poweroff,reboot,runlevel,shutdown,telinit commands
209 Support for halt,init,poweroff,reboot,runlevel,shutdown,telinit commands
211
210
212 ---
211 ---
213
212
214 #### Advanced system features:
213 #### Advanced system features:
215 ##### `ENABLE_MINBASE`=false
214 ##### `ENABLE_MINBASE`=false
216 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
215 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
217
216
218 ##### `ENABLE_REDUCE`=false
217 ##### `ENABLE_REDUCE`=false
219 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
218 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
220
219
221 ##### `ENABLE_UBOOT`=false
220 ##### `ENABLE_UBOOT`=false
222 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.
221 Replace the default RPi 0/1/2/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.
223
222
224 ##### `UBOOTSRC_DIR`=""
223 ##### `UBOOTSRC_DIR`=""
225 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.
224 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.
226
225
227 ##### `ENABLE_FBTURBO`=false
226 ##### `ENABLE_FBTURBO`=false
228 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.
227 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.
229
228
230 ##### `FBTURBOSRC_DIR`=""
229 ##### `FBTURBOSRC_DIR`=""
231 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.
230 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.
232
231
233 ##### `ENABLE_VIDEOCORE`=false
232 ##### `ENABLE_VIDEOCORE`=false
234 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.
233 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.
235
234
236 ##### `VIDEOCORESRC_DIR`=""
235 ##### `VIDEOCORESRC_DIR`=""
237 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.
236 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.
238
237
239 ##### `ENABLE_IPTABLES`=false
238 ##### `ENABLE_IPTABLES`=false
240 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
239 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
241
240
242 ##### `ENABLE_USER`=true
241 ##### `ENABLE_USER`=true
243 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
242 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
244
243
245 ##### `USER_NAME`=pi
244 ##### `USER_NAME`=pi
246 Non-root user to create. Ignored if `ENABLE_USER`=false
245 Non-root user to create. Ignored if `ENABLE_USER`=false
247
246
248 ##### `ENABLE_ROOT`=false
247 ##### `ENABLE_ROOT`=false
249 Set root user password so root login will be enabled
248 Set root user password so root login will be enabled
250
249
251 ##### `ENABLE_HARDNET`=false
250 ##### `ENABLE_HARDNET`=false
252 Enable IPv4/IPv6 network stack hardening settings.
251 Enable IPv4/IPv6 network stack hardening settings.
253
252
254 ##### `ENABLE_SPLITFS`=false
253 ##### `ENABLE_SPLITFS`=false
255 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
254 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
256
255
257 ##### `CHROOT_SCRIPTS`=""
256 ##### `CHROOT_SCRIPTS`=""
258 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.
257 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.
259
258
260 ##### `ENABLE_INITRAMFS`=false
259 ##### `ENABLE_INITRAMFS`=false
261 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.
260 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.
262
261
263 ##### `ENABLE_IFNAMES`=true
262 ##### `ENABLE_IFNAMES`=true
264 Enable automatic assignment of predictable, stable network interface names for all local Ethernet, WLAN interfaces. This might create complex and long interface names.
263 Enable automatic assignment of predictable, stable network interface names for all local Ethernet, WLAN interfaces. This might create complex and long interface names.
265
264
266 ##### `DISABLE_UNDERVOLT_WARNINGS`=
265 ##### `DISABLE_UNDERVOLT_WARNINGS`=
267 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.
266 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.
268
267
269 ---
268 ---
270
269
271 #### SSH settings:
270 #### SSH settings:
272 ##### `SSH_ENABLE_ROOT`=false
271 ##### `SSH_ENABLE_ROOT`=false
273 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`.
272 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`.
274
273
275 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
274 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
276 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
275 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
277
276
278 ##### `SSH_LIMIT_USERS`=false
277 ##### `SSH_LIMIT_USERS`=false
279 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).
278 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).
280
279
281 ##### `SSH_ROOT_PUB_KEY`=""
280 ##### `SSH_ROOT_PUB_KEY`=""
282 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`.
281 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`.
283
282
284 ##### `SSH_USER_PUB_KEY`=""
283 ##### `SSH_USER_PUB_KEY`=""
285 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.
284 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.
286
285
287 ---
286 ---
288
287
289 #### Kernel compilation:
288 #### Kernel compilation:
290 ##### `BUILD_KERNEL`=true
289 ##### `BUILD_KERNEL`=true
291 Build and install the latest RPi2/3 Linux kernel. Currently only the default RPi2/3 kernel configuration is used.
290 Build and install the latest RPi 0/1/2/3 Linux kernel. Currently only the default RPi 0/1/2/3 kernel configuration is used.
292
291
293 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
292 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
294 This sets the cross compile enviornment for the compiler.
293 This sets the cross compile enviornment for the compiler.
295
294
296 ##### `KERNEL_ARCH`="arm"
295 ##### `KERNEL_ARCH`="arm"
297 This sets the kernel architecture for the compiler.
296 This sets the kernel architecture for the compiler.
298
297
299 ##### `KERNEL_IMAGE`="kernel7.img"
298 ##### `KERNEL_IMAGE`="kernel7.img"
300 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.
299 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.
301
300
302 ##### `KERNEL_BRANCH`=""
301 ##### `KERNEL_BRANCH`=""
303 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
302 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
304
303
305 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
304 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
306 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.
305 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.
307
306
308 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
307 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
309 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
308 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
310
309
311 ##### `KERNEL_REDUCE`=false
310 ##### `KERNEL_REDUCE`=false
312 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
311 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
313
312
314 ##### `KERNEL_THREADS`=1
313 ##### `KERNEL_THREADS`=1
315 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.
314 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.
316
315
317 ##### `KERNEL_HEADERS`=true
316 ##### `KERNEL_HEADERS`=true
318 Install kernel headers with built kernel.
317 Install kernel headers with built kernel.
319
318
320 ##### `KERNEL_MENUCONFIG`=false
319 ##### `KERNEL_MENUCONFIG`=false
321 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
320 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
322
321
323 ##### `KERNEL_OLDDEFCONFIG`=false
322 ##### `KERNEL_OLDDEFCONFIG`=false
324 Run `make olddefconfig` to automatically set all new kernel configuration options to their recommended default values.
323 Run `make olddefconfig` to automatically set all new kernel configuration options to their recommended default values.
325
324
326 ##### `KERNEL_CCACHE`=false
325 ##### `KERNEL_CCACHE`=false
327 Compile the kernel using ccache. This speeds up kernel recompilation by caching previous compilations and detecting when the same compilation is being done again.
326 Compile the kernel using ccache. This speeds up kernel recompilation by caching previous compilations and detecting when the same compilation is being done again.
328
327
329 ##### `KERNEL_REMOVESRC`=true
328 ##### `KERNEL_REMOVESRC`=true
330 Remove all kernel sources from the generated OS image after it was built and installed.
329 Remove all kernel sources from the generated OS image after it was built and installed.
331
330
332 ##### `KERNELSRC_DIR`=""
331 ##### `KERNELSRC_DIR`=""
333 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.
332 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.
334
333
335 ##### `KERNELSRC_CLEAN`=false
334 ##### `KERNELSRC_CLEAN`=false
336 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.
335 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.
337
336
338 ##### `KERNELSRC_CONFIG`=true
337 ##### `KERNELSRC_CONFIG`=true
339 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.
338 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.
340
339
341 ##### `KERNELSRC_USRCONFIG`=""
340 ##### `KERNELSRC_USRCONFIG`=""
342 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
341 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
343
342
344 ##### `KERNELSRC_PREBUILT`=false
343 ##### `KERNELSRC_PREBUILT`=false
345 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.
344 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.
346
345
347 ##### `RPI_FIRMWARE_DIR`=""
346 ##### `RPI_FIRMWARE_DIR`=""
348 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.
347 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.
349
348
350 ---
349 ---
351
350
352 #### Reduce disk usage:
351 #### Reduce disk usage:
353 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
352 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
354
353
355 ##### `REDUCE_APT`=true
354 ##### `REDUCE_APT`=true
356 Configure APT to use compressed package repository lists and no package caching files.
355 Configure APT to use compressed package repository lists and no package caching files.
357
356
358 ##### `REDUCE_DOC`=true
357 ##### `REDUCE_DOC`=true
359 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
358 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
360
359
361 ##### `REDUCE_MAN`=true
360 ##### `REDUCE_MAN`=true
362 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
361 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
363
362
364 ##### `REDUCE_VIM`=false
363 ##### `REDUCE_VIM`=false
365 Replace `vim-tiny` package by `levee` a tiny vim clone.
364 Replace `vim-tiny` package by `levee` a tiny vim clone.
366
365
367 ##### `REDUCE_BASH`=false
366 ##### `REDUCE_BASH`=false
368 Remove `bash` package and switch to `dash` shell (experimental).
367 Remove `bash` package and switch to `dash` shell (experimental).
369
368
370 ##### `REDUCE_HWDB`=true
369 ##### `REDUCE_HWDB`=true
371 Remove PCI related hwdb files (experimental).
370 Remove PCI related hwdb files (experimental).
372
371
373 ##### `REDUCE_SSHD`=true
372 ##### `REDUCE_SSHD`=true
374 Replace `openssh-server` with `dropbear`.
373 Replace `openssh-server` with `dropbear`.
375
374
376 ##### `REDUCE_LOCALE`=true
375 ##### `REDUCE_LOCALE`=true
377 Remove all `locale` translation files.
376 Remove all `locale` translation files.
378
377
379 ---
378 ---
380
379
381 #### Encrypted root partition:
380 #### Encrypted root partition:
382 ##### `ENABLE_CRYPTFS`=false
381 ##### `ENABLE_CRYPTFS`=false
383 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.
382 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.
384
383
385 ##### `CRYPTFS_PASSWORD`=""
384 ##### `CRYPTFS_PASSWORD`=""
386 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
385 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
387
386
388 ##### `CRYPTFS_MAPPING`="secure"
387 ##### `CRYPTFS_MAPPING`="secure"
389 Set name of dm-crypt managed device-mapper mapping.
388 Set name of dm-crypt managed device-mapper mapping.
390
389
391 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
390 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
392 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
391 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
393
392
394 ##### `CRYPTFS_XTSKEYSIZE`=512
393 ##### `CRYPTFS_XTSKEYSIZE`=512
395 Sets key size in bits. The argument has to be a multiple of 8.
394 Sets key size in bits. The argument has to be a multiple of 8.
396
395
397 ---
396 ---
398
397
399 #### Build settings:
398 #### Build settings:
400 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
399 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
401 Set a path to a working directory used by the script to generate an image.
400 Set a path to a working directory used by the script to generate an image.
402
401
403 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
402 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
404 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.
403 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.
405
404
406 ## Understanding the script
405 ## Understanding the script
407 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:
406 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:
408
407
409 | Script | Description |
408 | Script | Description |
410 | --- | --- |
409 | --- | --- |
411 | `10-bootstrap.sh` | Debootstrap basic system |
410 | `10-bootstrap.sh` | Debootstrap basic system |
412 | `11-apt.sh` | Setup APT repositories |
411 | `11-apt.sh` | Setup APT repositories |
413 | `12-locale.sh` | Setup Locales and keyboard settings |
412 | `12-locale.sh` | Setup Locales and keyboard settings |
414 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
413 | `13-kernel.sh` | Build and install RPi 0/1/2/3 Kernel |
415 | `14-fstab.sh` | Setup fstab and initramfs |
414 | `14-fstab.sh` | Setup fstab and initramfs |
416 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
415 | `15-rpi-config.sh` | Setup RPi 0/1/2/3 config and cmdline |
417 | `20-networking.sh` | Setup Networking |
416 | `20-networking.sh` | Setup Networking |
418 | `21-firewall.sh` | Setup Firewall |
417 | `21-firewall.sh` | Setup Firewall |
419 | `30-security.sh` | Setup Users and Security settings |
418 | `30-security.sh` | Setup Users and Security settings |
420 | `31-logging.sh` | Setup Logging |
419 | `31-logging.sh` | Setup Logging |
421 | `32-sshd.sh` | Setup SSH and public keys |
420 | `32-sshd.sh` | Setup SSH and public keys |
422 | `41-uboot.sh` | Build and Setup U-Boot |
421 | `41-uboot.sh` | Build and Setup U-Boot |
423 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
422 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
423 | `43-videocore.sh` | Build and Setup videocore libraries |
424 | `50-firstboot.sh` | First boot actions |
424 | `50-firstboot.sh` | First boot actions |
425 | `99-reduce.sh` | Reduce the disk space usage |
425 | `99-reduce.sh` | Reduce the disk space usage |
426
426
427 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.
427 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.
428
428
429 | Directory | Description |
429 | Directory | Description |
430 | --- | --- |
430 | --- | --- |
431 | `apt` | APT management configuration files |
431 | `apt` | APT management configuration files |
432 | `boot` | Boot and RPi2/3 configuration files |
432 | `boot` | Boot and RPi 0/1/2/3 configuration files |
433 | `dpkg` | Package Manager configuration |
433 | `dpkg` | Package Manager configuration |
434 | `etc` | Configuration files and rc scripts |
434 | `etc` | Configuration files and rc scripts |
435 | `firstboot` | Scripts that get executed on first boot |
435 | `firstboot` | Scripts that get executed on first boot |
436 | `initramfs` | Initramfs scripts |
436 | `initramfs` | Initramfs scripts |
437 | `iptables` | Firewall configuration files |
437 | `iptables` | Firewall configuration files |
438 | `locales` | Locales configuration |
438 | `locales` | Locales configuration |
439 | `modules` | Kernel Modules configuration |
439 | `modules` | Kernel Modules configuration |
440 | `mount` | Fstab configuration |
440 | `mount` | Fstab configuration |
441 | `network` | Networking configuration files |
441 | `network` | Networking configuration files |
442 | `sysctl.d` | Swapping and Network Hardening configuration |
442 | `sysctl.d` | Swapping and Network Hardening configuration |
443 | `xorg` | fbturbo Xorg driver configuration |
443 | `xorg` | fbturbo Xorg driver configuration |
444
444
445 ## Custom packages and scripts
445 ## Custom packages and scripts
446 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`.
446 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`.
447
447
448 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
448 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
449
449
450 ## Logging of the bootstrapping process
450 ## Logging of the bootstrapping process
451 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:
451 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:
452
452
453 ```shell
453 ```shell
454 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
454 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
455 ```
455 ```
456
456
457 ## Flashing the image file
457 ## Flashing the image file
458 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`.
458 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 RPi 0/1/2/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`.
459
459
460 ##### Flashing examples:
460 ##### Flashing examples:
461 ```shell
461 ```shell
462 bmaptool copy ./images/buster/2017-01-23-rpi3-buster.img /dev/mmcblk0
462 bmaptool copy ./images/buster/2017-01-23-rpi3-buster.img /dev/mmcblk0
463 dd bs=4M if=./images/buster/2017-01-23-rpi3-buster.img of=/dev/mmcblk0
463 dd bs=4M if=./images/buster/2017-01-23-rpi3-buster.img of=/dev/mmcblk0
464 ```
464 ```
465 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
465 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
466 ```shell
466 ```shell
467 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-frmw.img /dev/mmcblk0
467 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-frmw.img /dev/mmcblk0
468 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-root.img /dev/sdc
468 bmaptool copy ./images/buster/2017-01-23-rpi3-buster-root.img /dev/sdc
469 ```
469 ```
470
470
471 ## QEMU emulation
471 ## QEMU emulation
472 Start QEMU full system emulation:
472 Start QEMU full system emulation:
473 ```shell
473 ```shell
474 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"
474 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"
475 ```
475 ```
476
476
477 Start QEMU full system emulation and output to console:
477 Start QEMU full system emulation and output to console:
478 ```shell
478 ```shell
479 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
479 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
480 ```
480 ```
481
481
482 Start QEMU full system emulation with SMP and output to console:
482 Start QEMU full system emulation with SMP and output to console:
483 ```shell
483 ```shell
484 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
484 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
485 ```
485 ```
486
486
487 Start QEMU full system emulation with cryptfs, initramfs and output to console:
487 Start QEMU full system emulation with cryptfs, initramfs and output to console:
488 ```shell
488 ```shell
489 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
489 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
490 ```
490 ```
491
491
492 ## External links and references
492 ## External links and references
493 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
493 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
494 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
494 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
495 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
495 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
496 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
496 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
497 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
497 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
498 * [U-BOOT git repository](https://git.denx.de/?p=u-boot.git;a=summary)
498 * [U-BOOT git repository](https://git.denx.de/?p=u-boot.git;a=summary)
499 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
499 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
500 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
500 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
501 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
501 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,807 +1,807
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 Raspberry Pi
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# RPi 0/1/2/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 WORKDIR=$(pwd)
62 WORKDIR=$(pwd)
63 BASEDIR=${BASEDIR:=${WORKDIR}/images/${RELEASE}}
63 BASEDIR=${BASEDIR:=${WORKDIR}/images/${RELEASE}}
64 BUILDDIR="${BASEDIR}/build"
64 BUILDDIR="${BASEDIR}/build"
65
65
66 # Chroot directories
66 # Chroot directories
67 R="${BUILDDIR}/chroot"
67 R="${BUILDDIR}/chroot"
68 ETC_DIR="${R}/etc"
68 ETC_DIR="${R}/etc"
69 LIB_DIR="${R}/lib"
69 LIB_DIR="${R}/lib"
70 BOOT_DIR="${R}/boot/firmware"
70 BOOT_DIR="${R}/boot/firmware"
71 KERNEL_DIR="${R}/usr/src/linux"
71 KERNEL_DIR="${R}/usr/src/linux"
72 WLAN_FIRMWARE_DIR="${LIB_DIR}/firmware/brcm"
72 WLAN_FIRMWARE_DIR="${LIB_DIR}/firmware/brcm"
73 BLUETOOTH_FIRMWARE_DIR="${ETC_DIR}/firmware/bt"
73 BLUETOOTH_FIRMWARE_DIR="${ETC_DIR}/firmware/bt"
74
74
75 # Firmware directory: Blank if download from github
75 # Firmware directory: Blank if download from github
76 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
76 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
77
77
78 # General settings
78 # General settings
79 SET_ARCH=${SET_ARCH:=32}
79 SET_ARCH=${SET_ARCH:=32}
80 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
80 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
81 PASSWORD=${PASSWORD:=raspberry}
81 PASSWORD=${PASSWORD:=raspberry}
82 USER_PASSWORD=${USER_PASSWORD:=raspberry}
82 USER_PASSWORD=${USER_PASSWORD:=raspberry}
83 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
83 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
84 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
84 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
85 EXPANDROOT=${EXPANDROOT:=true}
85 EXPANDROOT=${EXPANDROOT:=true}
86
86
87 # Keyboard settings
87 # Keyboard settings
88 XKB_MODEL=${XKB_MODEL:=""}
88 XKB_MODEL=${XKB_MODEL:=""}
89 XKB_LAYOUT=${XKB_LAYOUT:=""}
89 XKB_LAYOUT=${XKB_LAYOUT:=""}
90 XKB_VARIANT=${XKB_VARIANT:=""}
90 XKB_VARIANT=${XKB_VARIANT:=""}
91 XKB_OPTIONS=${XKB_OPTIONS:=""}
91 XKB_OPTIONS=${XKB_OPTIONS:=""}
92
92
93 # Network settings (DHCP)
93 # Network settings (DHCP)
94 ENABLE_DHCP=${ENABLE_DHCP:=true}
94 ENABLE_DHCP=${ENABLE_DHCP:=true}
95
95
96 # Network settings (static)
96 # Network settings (static)
97 NET_ADDRESS=${NET_ADDRESS:=""}
97 NET_ADDRESS=${NET_ADDRESS:=""}
98 NET_GATEWAY=${NET_GATEWAY:=""}
98 NET_GATEWAY=${NET_GATEWAY:=""}
99 NET_DNS_1=${NET_DNS_1:=""}
99 NET_DNS_1=${NET_DNS_1:=""}
100 NET_DNS_2=${NET_DNS_2:=""}
100 NET_DNS_2=${NET_DNS_2:=""}
101 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
101 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
102 NET_NTP_1=${NET_NTP_1:=""}
102 NET_NTP_1=${NET_NTP_1:=""}
103 NET_NTP_2=${NET_NTP_2:=""}
103 NET_NTP_2=${NET_NTP_2:=""}
104
104
105 # APT settings
105 # APT settings
106 APT_PROXY=${APT_PROXY:=""}
106 APT_PROXY=${APT_PROXY:=""}
107 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
107 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
108
108
109 # Feature settings
109 # Feature settings
110 ENABLE_PRINTK=${ENABLE_PRINTK:=false}
110 ENABLE_PRINTK=${ENABLE_PRINTK:=false}
111 ENABLE_BLUETOOTH=${ENABLE_BLUETOOTH:=false}
111 ENABLE_BLUETOOTH=${ENABLE_BLUETOOTH:=false}
112 ENABLE_MINIUART_OVERLAY=${ENABLE_MINIUART_OVERLAY:=false}
112 ENABLE_MINIUART_OVERLAY=${ENABLE_MINIUART_OVERLAY:=false}
113 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
113 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
114 ENABLE_I2C=${ENABLE_I2C:=false}
114 ENABLE_I2C=${ENABLE_I2C:=false}
115 ENABLE_SPI=${ENABLE_SPI:=false}
115 ENABLE_SPI=${ENABLE_SPI:=false}
116 ENABLE_IPV6=${ENABLE_IPV6:=true}
116 ENABLE_IPV6=${ENABLE_IPV6:=true}
117 ENABLE_SSHD=${ENABLE_SSHD:=true}
117 ENABLE_SSHD=${ENABLE_SSHD:=true}
118 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
118 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
119 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
119 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
120 ENABLE_SOUND=${ENABLE_SOUND:=true}
120 ENABLE_SOUND=${ENABLE_SOUND:=true}
121 ENABLE_DBUS=${ENABLE_DBUS:=true}
121 ENABLE_DBUS=${ENABLE_DBUS:=true}
122 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
122 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
123 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
123 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
124 ENABLE_XORG=${ENABLE_XORG:=false}
124 ENABLE_XORG=${ENABLE_XORG:=false}
125 ENABLE_WM=${ENABLE_WM:=""}
125 ENABLE_WM=${ENABLE_WM:=""}
126 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
126 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
127 ENABLE_USER=${ENABLE_USER:=true}
127 ENABLE_USER=${ENABLE_USER:=true}
128 USER_NAME=${USER_NAME:="pi"}
128 USER_NAME=${USER_NAME:="pi"}
129 ENABLE_ROOT=${ENABLE_ROOT:=false}
129 ENABLE_ROOT=${ENABLE_ROOT:=false}
130 ENABLE_QEMU=${ENABLE_QEMU:=false}
130 ENABLE_QEMU=${ENABLE_QEMU:=false}
131 ENABLE_SYSVINIT=${ENABLE_SYSVINIT:=false}
131 ENABLE_SYSVINIT=${ENABLE_SYSVINIT:=false}
132
132
133 # SSH settings
133 # SSH settings
134 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
134 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
135 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
135 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
136 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
136 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
137 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
137 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
138 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
138 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
139
139
140 # Advanced settings
140 # Advanced settings
141 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
141 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
142 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
142 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
143 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
143 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
144 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
144 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
145 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
145 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
146 ENABLE_VIDEOCORE=${ENABLE_VIDEOCORE:=false}
146 ENABLE_VIDEOCORE=${ENABLE_VIDEOCORE:=false}
147 VIDEOCORESRC_DIR=${VIDEOCORESRC_DIR:=""}
147 VIDEOCORESRC_DIR=${VIDEOCORESRC_DIR:=""}
148 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
148 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
149 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
149 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
150 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
150 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
151 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
151 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
152 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
152 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
153 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
153 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
154 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
154 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
155
155
156 # Kernel compilation settings
156 # Kernel compilation settings
157 BUILD_KERNEL=${BUILD_KERNEL:=true}
157 BUILD_KERNEL=${BUILD_KERNEL:=true}
158 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
158 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
159 KERNEL_THREADS=${KERNEL_THREADS:=1}
159 KERNEL_THREADS=${KERNEL_THREADS:=1}
160 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
160 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
161 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
161 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
162 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
162 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
163 KERNEL_OLDDEFCONFIG=${KERNEL_OLDDEFCONFIG:=false}
163 KERNEL_OLDDEFCONFIG=${KERNEL_OLDDEFCONFIG:=false}
164 KERNEL_CCACHE=${KERNEL_CCACHE:=false}
164 KERNEL_CCACHE=${KERNEL_CCACHE:=false}
165
165
166 # Kernel compilation from source directory settings
166 # Kernel compilation from source directory settings
167 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
167 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
168 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
168 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
169 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
169 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
170 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
170 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
171
171
172 # Reduce disk usage settings
172 # Reduce disk usage settings
173 REDUCE_APT=${REDUCE_APT:=true}
173 REDUCE_APT=${REDUCE_APT:=true}
174 REDUCE_DOC=${REDUCE_DOC:=true}
174 REDUCE_DOC=${REDUCE_DOC:=true}
175 REDUCE_MAN=${REDUCE_MAN:=true}
175 REDUCE_MAN=${REDUCE_MAN:=true}
176 REDUCE_VIM=${REDUCE_VIM:=false}
176 REDUCE_VIM=${REDUCE_VIM:=false}
177 REDUCE_BASH=${REDUCE_BASH:=false}
177 REDUCE_BASH=${REDUCE_BASH:=false}
178 REDUCE_HWDB=${REDUCE_HWDB:=true}
178 REDUCE_HWDB=${REDUCE_HWDB:=true}
179 REDUCE_SSHD=${REDUCE_SSHD:=true}
179 REDUCE_SSHD=${REDUCE_SSHD:=true}
180 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
180 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
181
181
182 # Encrypted filesystem settings
182 # Encrypted filesystem settings
183 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
183 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
184 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
184 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
185 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
185 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
186 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
186 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
187 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
187 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
188
188
189 # Chroot scripts directory
189 # Chroot scripts directory
190 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
190 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
191
191
192 # Packages required in the chroot build environment
192 # Packages required in the chroot build environment
193 APT_INCLUDES=${APT_INCLUDES:=""}
193 APT_INCLUDES=${APT_INCLUDES:=""}
194 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"
194 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"
195
195
196 # Packages to exclude from chroot build environment
196 # Packages to exclude from chroot build environment
197 APT_EXCLUDES=${APT_EXCLUDES:=""}
197 APT_EXCLUDES=${APT_EXCLUDES:=""}
198
198
199 # Packages required for bootstrapping
199 # Packages required for bootstrapping
200 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
200 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
201 MISSING_PACKAGES=""
201 MISSING_PACKAGES=""
202
202
203 # Packages installed for c/c++ build environment in chroot (keep empty)
203 # Packages installed for c/c++ build environment in chroot (keep empty)
204 COMPILER_PACKAGES=""
204 COMPILER_PACKAGES=""
205
205
206 set +x
206 set +x
207
207
208 #Check if apt-cacher-ng has port 3142 open and set APT_PROXY
208 #Check if apt-cacher-ng has port 3142 open and set APT_PROXY
209 APT_CACHER_RUNNING=$(lsof -i :3142 | grep apt-cacher-ng | cut -d ' ' -f3 | uniq)
209 APT_CACHER_RUNNING=$(lsof -i :3142 | grep apt-cacher-ng | cut -d ' ' -f3 | uniq)
210 if [ -n "${APT_CACHER_RUNNING}" ] ; then
210 if [ -n "${APT_CACHER_RUNNING}" ] ; then
211 APT_PROXY=http://127.0.0.1:3142/
211 APT_PROXY=http://127.0.0.1:3142/
212 fi
212 fi
213
213
214 # Setup architecture specific settings
214 # Setup architecture specific settings
215 if [ -n "$SET_ARCH" ] ; then
215 if [ -n "$SET_ARCH" ] ; then
216 # 64 bit configuration
216 # 64-bit configuration
217 if [ "$SET_ARCH" = 64 ] ; then
217 if [ "$SET_ARCH" = 64 ] ; then
218 # General 64 bit depended settings
218 # General 64-bit depended settings
219 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
219 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
220 KERNEL_ARCH=${KERNEL_ARCH:=arm64}
220 KERNEL_ARCH=${KERNEL_ARCH:=arm64}
221 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
221 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
222
222
223 # Board specific settings
223 # Raspberry Pi model specific settings
224 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
224 if [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
225 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
225 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
226 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
226 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
227 RELEASE_ARCH=${RELEASE_ARCH:=arm64}
227 RELEASE_ARCH=${RELEASE_ARCH:=arm64}
228 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
228 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
229 CROSS_COMPILE=${CROSS_COMPILE:=aarch64-linux-gnu-}
229 CROSS_COMPILE=${CROSS_COMPILE:=aarch64-linux-gnu-}
230 else
230 else
231 echo "error: Only Raspberry PI 3 and 3B+ support 64 bit"
231 echo "error: Only Raspberry PI 3 and 3B+ support 64-bit"
232 exit 1
232 exit 1
233 fi
233 fi
234 fi
234 fi
235
235
236 # 32 bit configuration
236 # 32-bit configuration
237 if [ "$SET_ARCH" = 32 ] ; then
237 if [ "$SET_ARCH" = 32 ] ; then
238 # General 32 bit dependend settings
238 # General 32-bit dependend settings
239 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
239 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
240 KERNEL_ARCH=${KERNEL_ARCH:=arm}
240 KERNEL_ARCH=${KERNEL_ARCH:=arm}
241 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
241 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
242
242
243 # Hardware specific settings
243 # Raspberry Pi model specific settings
244 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
244 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
245 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
245 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
246 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
246 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
247 RELEASE_ARCH=${RELEASE_ARCH:=armel}
247 RELEASE_ARCH=${RELEASE_ARCH:=armel}
248 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel.img}
248 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel.img}
249 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabi-}
249 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabi-}
250 fi
250 fi
251
251
252 # Hardware specific settings
252 # Raspberry Pi model specific settings
253 if [ "$RPI_MODEL" = 2 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
253 if [ "$RPI_MODEL" = 2 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
254 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
254 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
255 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
255 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
256 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
256 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
257 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
257 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
258 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
258 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
259 fi
259 fi
260 fi
260 fi
261 #SET_ARCH not set
261 #SET_ARCH not set
262 else
262 else
263 echo "error: Please set '32' or '64' as value for SET_ARCH"
263 echo "error: Please set '32' or '64' as value for SET_ARCH"
264 exit 1
264 exit 1
265 fi
265 fi
266 # Device specific configuration and U-Boot configuration
266 # Device specific configuration and U-Boot configuration
267 case "$RPI_MODEL" in
267 case "$RPI_MODEL" in
268 0)
268 0)
269 DTB_FILE=${DTB_FILE:=bcm2708-rpi-0-w.dtb}
269 DTB_FILE=${DTB_FILE:=bcm2708-rpi-0-w.dtb}
270 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
270 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
271 ;;
271 ;;
272 1)
272 1)
273 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b.dtb}
273 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b.dtb}
274 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
274 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
275 ;;
275 ;;
276 1P)
276 1P)
277 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b-plus.dtb}
277 DTB_FILE=${DTB_FILE:=bcm2708-rpi-b-plus.dtb}
278 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
278 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_defconfig}
279 ;;
279 ;;
280 2)
280 2)
281 DTB_FILE=${DTB_FILE:=bcm2709-rpi-2-b.dtb}
281 DTB_FILE=${DTB_FILE:=bcm2709-rpi-2-b.dtb}
282 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_2_defconfig}
282 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_2_defconfig}
283 ;;
283 ;;
284 3)
284 3)
285 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
285 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
286 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
286 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
287 ;;
287 ;;
288 3P)
288 3P)
289 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
289 DTB_FILE=${DTB_FILE:=bcm2710-rpi-3-b.dtb}
290 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
290 UBOOT_CONFIG=${UBOOT_CONFIG:=rpi_3_defconfig}
291 ;;
291 ;;
292 *)
292 *)
293 echo "error: Raspberry Pi model $RPI_MODEL is not supported!"
293 echo "error: Raspberry Pi model $RPI_MODEL is not supported!"
294 exit 1
294 exit 1
295 ;;
295 ;;
296 esac
296 esac
297
297
298 # Raspberry PI 0,3,3P with Bluetooth and Wifi onboard
298 # Raspberry PI 0,3,3P with Bluetooth and Wifi onboard
299 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
299 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
300 # Include bluetooth packages on supported boards
300 # Include bluetooth packages on supported boards
301 if [ "$ENABLE_BLUETOOTH" = true ] && [ "$ENABLE_CONSOLE" = false ]; then
301 if [ "$ENABLE_BLUETOOTH" = true ] && [ "$ENABLE_CONSOLE" = false ]; then
302 APT_INCLUDES="${APT_INCLUDES},bluetooth,bluez"
302 APT_INCLUDES="${APT_INCLUDES},bluetooth,bluez"
303 fi
303 fi
304 else # Raspberry PI 1,1P,2 without Wifi and bluetooth onboard
304 else # Raspberry PI 1,1P,2 without Wifi and bluetooth onboard
305 # Check if the internal wireless interface is not supported by the RPi model
305 # Check if the internal wireless interface is not supported by the RPi model
306 if [ "$ENABLE_WIRELESS" = true ] || [ "$ENABLE_BLUETOOTH" = true ]; then
306 if [ "$ENABLE_WIRELESS" = true ] || [ "$ENABLE_BLUETOOTH" = true ]; then
307 echo "error: The selected Raspberry Pi model has no integrated interface for wireless or bluetooth"
307 echo "error: The selected Raspberry Pi model has no integrated interface for wireless or bluetooth"
308 exit 1
308 exit 1
309 fi
309 fi
310 fi
310 fi
311
311
312 # Prepare date string for default image file name
312 # Prepare date string for default image file name
313 DATE="$(date +%Y-%m-%d)"
313 DATE="$(date +%Y-%m-%d)"
314 if [ -z "$KERNEL_BRANCH" ] ; then
314 if [ -z "$KERNEL_BRANCH" ] ; then
315 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
315 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
316 else
316 else
317 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
317 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
318 fi
318 fi
319
319
320 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
320 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
321 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
321 if [ -n "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
322 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
322 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
323 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
323 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
324 exit 1
324 exit 1
325 fi
325 fi
326 fi
326 fi
327
327
328 # Add cmake to compile videocore sources
328 # Add cmake to compile videocore sources
329 if [ "$ENABLE_VIDEOCORE" = true ] ; then
329 if [ "$ENABLE_VIDEOCORE" = true ] ; then
330 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cmake"
330 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cmake"
331 fi
331 fi
332
332
333 # Add libncurses5 to enable kernel menuconfig
333 # Add libncurses5 to enable kernel menuconfig
334 if [ "$KERNEL_MENUCONFIG" = true ] ; then
334 if [ "$KERNEL_MENUCONFIG" = true ] ; then
335 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses-dev"
335 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses-dev"
336 fi
336 fi
337
337
338 # Add ccache compiler cache for (faster) kernel cross (re)compilation
338 # Add ccache compiler cache for (faster) kernel cross (re)compilation
339 if [ "$KERNEL_CCACHE" = true ] ; then
339 if [ "$KERNEL_CCACHE" = true ] ; then
340 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} ccache"
340 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} ccache"
341 fi
341 fi
342
342
343 # Add cryptsetup package to enable filesystem encryption
343 # Add cryptsetup package to enable filesystem encryption
344 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
344 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
345 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
345 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
346 APT_INCLUDES="${APT_INCLUDES},cryptsetup,busybox,console-setup"
346 APT_INCLUDES="${APT_INCLUDES},cryptsetup,busybox,console-setup"
347
347
348 if [ -z "$CRYPTFS_PASSWORD" ] ; then
348 if [ -z "$CRYPTFS_PASSWORD" ] ; then
349 echo "error: no password defined (CRYPTFS_PASSWORD)!"
349 echo "error: no password defined (CRYPTFS_PASSWORD)!"
350 exit 1
350 exit 1
351 fi
351 fi
352 ENABLE_INITRAMFS=true
352 ENABLE_INITRAMFS=true
353 fi
353 fi
354
354
355 # Add initramfs generation tools
355 # Add initramfs generation tools
356 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
356 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
357 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
357 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
358 fi
358 fi
359
359
360 # Add device-tree-compiler required for building the U-Boot bootloader
360 # Add device-tree-compiler required for building the U-Boot bootloader
361 if [ "$ENABLE_UBOOT" = true ] ; then
361 if [ "$ENABLE_UBOOT" = true ] ; then
362 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex,bc"
362 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex,bc"
363 fi
363 fi
364
364
365 if [ "$ENABLE_BLUETOOTH" = true ] ; then
365 if [ "$ENABLE_BLUETOOTH" = true ] ; then
366 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
366 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 3 ] || [ "$RPI_MODEL" = 3P ] ; then
367 if [ "$ENABLE_CONSOLE" = false ] ; then
367 if [ "$ENABLE_CONSOLE" = false ] ; then
368 APT_INCLUDES="${APT_INCLUDES},bluetooth,bluez"
368 APT_INCLUDES="${APT_INCLUDES},bluetooth,bluez"
369 fi
369 fi
370 fi
370 fi
371 fi
371 fi
372
372
373 # Check if root SSH (v2) public key file exists
373 # Check if root SSH (v2) public key file exists
374 if [ -n "$SSH_ROOT_PUB_KEY" ] ; then
374 if [ -n "$SSH_ROOT_PUB_KEY" ] ; then
375 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
375 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
376 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
376 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
377 exit 1
377 exit 1
378 fi
378 fi
379 fi
379 fi
380
380
381 # Check if $USER_NAME SSH (v2) public key file exists
381 # Check if $USER_NAME SSH (v2) public key file exists
382 if [ -n "$SSH_USER_PUB_KEY" ] ; then
382 if [ -n "$SSH_USER_PUB_KEY" ] ; then
383 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
383 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
384 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
384 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
385 exit 1
385 exit 1
386 fi
386 fi
387 fi
387 fi
388
388
389 # Check if all required packages are installed on the build system
389 # Check if all required packages are installed on the build system
390 for package in $REQUIRED_PACKAGES ; do
390 for package in $REQUIRED_PACKAGES ; do
391 if [ "$(dpkg-query -W -f='${Status}' "$package")" != "install ok installed" ] ; then
391 if [ "$(dpkg-query -W -f='${Status}' "$package")" != "install ok installed" ] ; then
392 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
392 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
393 fi
393 fi
394 done
394 done
395
395
396 # If there are missing packages ask confirmation for install, or exit
396 # If there are missing packages ask confirmation for install, or exit
397 if [ -n "$MISSING_PACKAGES" ] ; then
397 if [ -n "$MISSING_PACKAGES" ] ; then
398 echo "the following packages needed by this script are not installed:"
398 echo "the following packages needed by this script are not installed:"
399 echo "$MISSING_PACKAGES"
399 echo "$MISSING_PACKAGES"
400
400
401 printf "\ndo you want to install the missing packages right now? [y/n] "
401 printf "\ndo you want to install the missing packages right now? [y/n] "
402 read -r confirm
402 read -r confirm
403 [ "$confirm" != "y" ] && exit 1
403 [ "$confirm" != "y" ] && exit 1
404
404
405 # Make sure all missing required packages are installed
405 # Make sure all missing required packages are installed
406 apt-get -qq -y install "${MISSING_PACKAGES}"
406 apt-get -qq -y install `echo "${MISSING_PACKAGES}" | sed "s/ //"`
407 fi
407 fi
408
408
409 # Check if ./bootstrap.d directory exists
409 # Check if ./bootstrap.d directory exists
410 if [ ! -d "./bootstrap.d/" ] ; then
410 if [ ! -d "./bootstrap.d/" ] ; then
411 echo "error: './bootstrap.d' required directory not found!"
411 echo "error: './bootstrap.d' required directory not found!"
412 exit 1
412 exit 1
413 fi
413 fi
414
414
415 # Check if ./files directory exists
415 # Check if ./files directory exists
416 if [ ! -d "./files/" ] ; then
416 if [ ! -d "./files/" ] ; then
417 echo "error: './files' required directory not found!"
417 echo "error: './files' required directory not found!"
418 exit 1
418 exit 1
419 fi
419 fi
420
420
421 # Check if specified KERNELSRC_DIR directory exists
421 # Check if specified KERNELSRC_DIR directory exists
422 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
422 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
423 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
423 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
424 exit 1
424 exit 1
425 fi
425 fi
426
426
427 # Check if specified UBOOTSRC_DIR directory exists
427 # Check if specified UBOOTSRC_DIR directory exists
428 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
428 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
429 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
429 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
430 exit 1
430 exit 1
431 fi
431 fi
432
432
433 # Check if specified VIDEOCORESRC_DIR directory exists
433 # Check if specified VIDEOCORESRC_DIR directory exists
434 if [ -n "$VIDEOCORESRC_DIR" ] && [ ! -d "$VIDEOCORESRC_DIR" ] ; then
434 if [ -n "$VIDEOCORESRC_DIR" ] && [ ! -d "$VIDEOCORESRC_DIR" ] ; then
435 echo "error: '${VIDEOCORESRC_DIR}' specified directory not found (VIDEOCORESRC_DIR)!"
435 echo "error: '${VIDEOCORESRC_DIR}' specified directory not found (VIDEOCORESRC_DIR)!"
436 exit 1
436 exit 1
437 fi
437 fi
438
438
439 # Check if specified FBTURBOSRC_DIR directory exists
439 # Check if specified FBTURBOSRC_DIR directory exists
440 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
440 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
441 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
441 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
442 exit 1
442 exit 1
443 fi
443 fi
444
444
445 # Check if specified CHROOT_SCRIPTS directory exists
445 # Check if specified CHROOT_SCRIPTS directory exists
446 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
446 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
447 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
447 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
448 exit 1
448 exit 1
449 fi
449 fi
450
450
451 # Check if specified device mapping already exists (will be used by cryptsetup)
451 # Check if specified device mapping already exists (will be used by cryptsetup)
452 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
452 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
453 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
453 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
454 exit 1
454 exit 1
455 fi
455 fi
456
456
457 # Don't clobber an old build
457 # Don't clobber an old build
458 if [ -e "$BUILDDIR" ] ; then
458 if [ -e "$BUILDDIR" ] ; then
459 echo "error: directory ${BUILDDIR} already exists, not proceeding"
459 echo "error: directory ${BUILDDIR} already exists, not proceeding"
460 exit 1
460 exit 1
461 fi
461 fi
462
462
463 # Setup chroot directory
463 # Setup chroot directory
464 mkdir -p "${R}"
464 mkdir -p "${R}"
465
465
466 # Check if build directory has enough of free disk space >512MB
466 # Check if build directory has enough of free disk space >512MB
467 if [ "$(df --output=avail "${BUILDDIR}" | sed "1d")" -le "524288" ] ; then
467 if [ "$(df --output=avail "${BUILDDIR}" | sed "1d")" -le "524288" ] ; then
468 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
468 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
469 exit 1
469 exit 1
470 fi
470 fi
471
471
472 set -x
472 set -x
473
473
474 # Call "cleanup" function on various signals and errors
474 # Call "cleanup" function on various signals and errors
475 trap cleanup 0 1 2 3 6
475 trap cleanup 0 1 2 3 6
476
476
477 # Add required packages for the minbase installation
477 # Add required packages for the minbase installation
478 if [ "$ENABLE_MINBASE" = true ] ; then
478 if [ "$ENABLE_MINBASE" = true ] ; then
479 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
479 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
480 fi
480 fi
481
481
482 # Add parted package, required to get partprobe utility
482 # Add parted package, required to get partprobe utility
483 if [ "$EXPANDROOT" = true ] ; then
483 if [ "$EXPANDROOT" = true ] ; then
484 APT_INCLUDES="${APT_INCLUDES},parted"
484 APT_INCLUDES="${APT_INCLUDES},parted"
485 fi
485 fi
486
486
487 # Add dbus package, recommended if using systemd
487 # Add dbus package, recommended if using systemd
488 if [ "$ENABLE_DBUS" = true ] ; then
488 if [ "$ENABLE_DBUS" = true ] ; then
489 APT_INCLUDES="${APT_INCLUDES},dbus"
489 APT_INCLUDES="${APT_INCLUDES},dbus"
490 fi
490 fi
491
491
492 # Add iptables IPv4/IPv6 package
492 # Add iptables IPv4/IPv6 package
493 if [ "$ENABLE_IPTABLES" = true ] ; then
493 if [ "$ENABLE_IPTABLES" = true ] ; then
494 APT_INCLUDES="${APT_INCLUDES},iptables,iptables-persistent"
494 APT_INCLUDES="${APT_INCLUDES},iptables,iptables-persistent"
495 fi
495 fi
496
496
497 # Add openssh server package
497 # Add openssh server package
498 if [ "$ENABLE_SSHD" = true ] ; then
498 if [ "$ENABLE_SSHD" = true ] ; then
499 APT_INCLUDES="${APT_INCLUDES},openssh-server"
499 APT_INCLUDES="${APT_INCLUDES},openssh-server"
500 fi
500 fi
501
501
502 # Add alsa-utils package
502 # Add alsa-utils package
503 if [ "$ENABLE_SOUND" = true ] ; then
503 if [ "$ENABLE_SOUND" = true ] ; then
504 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
504 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
505 fi
505 fi
506
506
507 # Add rng-tools package
507 # Add rng-tools package
508 if [ "$ENABLE_HWRANDOM" = true ] ; then
508 if [ "$ENABLE_HWRANDOM" = true ] ; then
509 APT_INCLUDES="${APT_INCLUDES},rng-tools"
509 APT_INCLUDES="${APT_INCLUDES},rng-tools"
510 fi
510 fi
511
511
512 # Add fbturbo video driver
512 # Add fbturbo video driver
513 if [ "$ENABLE_FBTURBO" = true ] ; then
513 if [ "$ENABLE_FBTURBO" = true ] ; then
514 # Enable xorg package dependencies
514 # Enable xorg package dependencies
515 ENABLE_XORG=true
515 ENABLE_XORG=true
516 fi
516 fi
517
517
518 # Add user defined window manager package
518 # Add user defined window manager package
519 if [ -n "$ENABLE_WM" ] ; then
519 if [ -n "$ENABLE_WM" ] ; then
520 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
520 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
521
521
522 # Enable xorg package dependencies
522 # Enable xorg package dependencies
523 ENABLE_XORG=true
523 ENABLE_XORG=true
524 fi
524 fi
525
525
526 # Add xorg package
526 # Add xorg package
527 if [ "$ENABLE_XORG" = true ] ; then
527 if [ "$ENABLE_XORG" = true ] ; then
528 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
528 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
529 fi
529 fi
530
530
531 # Replace selected packages with smaller clones
531 # Replace selected packages with smaller clones
532 if [ "$ENABLE_REDUCE" = true ] ; then
532 if [ "$ENABLE_REDUCE" = true ] ; then
533 # Add levee package instead of vim-tiny
533 # Add levee package instead of vim-tiny
534 if [ "$REDUCE_VIM" = true ] ; then
534 if [ "$REDUCE_VIM" = true ] ; then
535 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
535 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
536 fi
536 fi
537
537
538 # Add dropbear package instead of openssh-server
538 # Add dropbear package instead of openssh-server
539 if [ "$REDUCE_SSHD" = true ] ; then
539 if [ "$REDUCE_SSHD" = true ] ; then
540 APT_INCLUDES="$(echo "${APT_INCLUDES}" | sed "s/openssh-server/dropbear/")"
540 APT_INCLUDES="$(echo "${APT_INCLUDES}" | sed "s/openssh-server/dropbear/")"
541 fi
541 fi
542 fi
542 fi
543
543
544 # Configure systemd-sysv exclude to make halt/reboot/shutdown scripts available
544 # Configure systemd-sysv exclude to make halt/reboot/shutdown scripts available
545 if [ "$ENABLE_SYSVINIT" = false ] ; then
545 if [ "$ENABLE_SYSVINIT" = false ] ; then
546 APT_EXCLUDES="--exclude=${APT_EXCLUDES},init,systemd-sysv"
546 APT_EXCLUDES="--exclude=${APT_EXCLUDES},init,systemd-sysv"
547 fi
547 fi
548
548
549 # Check if kernel is getting compiled
549 # Check if kernel is getting compiled
550 if [ "$BUILD_KERNEL" = false ] ; then
550 if [ "$BUILD_KERNEL" = false ] ; then
551 echo "Downloading precompiled kernel"
551 echo "Downloading precompiled kernel"
552 echo "error: not configured"
552 echo "error: not configured"
553 exit 1;
553 exit 1;
554 # BUILD_KERNEL=true
554 # BUILD_KERNEL=true
555 else
555 else
556 echo "No precompiled kernel repositories were added"
556 echo "No precompiled kernel repositories were added"
557 fi
557 fi
558
558
559 # Configure kernel sources if no KERNELSRC_DIR
559 # Configure kernel sources if no KERNELSRC_DIR
560 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
560 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
561 KERNELSRC_CONFIG=true
561 KERNELSRC_CONFIG=true
562 fi
562 fi
563
563
564 # Configure reduced kernel
564 # Configure reduced kernel
565 if [ "$KERNEL_REDUCE" = true ] ; then
565 if [ "$KERNEL_REDUCE" = true ] ; then
566 KERNELSRC_CONFIG=false
566 KERNELSRC_CONFIG=false
567 fi
567 fi
568
568
569 # Configure qemu compatible kernel
569 # Configure qemu compatible kernel
570 if [ "$ENABLE_QEMU" = true ] ; then
570 if [ "$ENABLE_QEMU" = true ] ; then
571 DTB_FILE=vexpress-v2p-ca15_a7.dtb
571 DTB_FILE=vexpress-v2p-ca15_a7.dtb
572 UBOOT_CONFIG=vexpress_ca15_tc2_defconfig
572 UBOOT_CONFIG=vexpress_ca15_tc2_defconfig
573 KERNEL_DEFCONFIG="vexpress_defconfig"
573 KERNEL_DEFCONFIG="vexpress_defconfig"
574 if [ "$KERNEL_MENUCONFIG" = false ] ; then
574 if [ "$KERNEL_MENUCONFIG" = false ] ; then
575 KERNEL_OLDDEFCONFIG=true
575 KERNEL_OLDDEFCONFIG=true
576 fi
576 fi
577 fi
577 fi
578
578
579 # Execute bootstrap scripts
579 # Execute bootstrap scripts
580 for SCRIPT in bootstrap.d/*.sh; do
580 for SCRIPT in bootstrap.d/*.sh; do
581 head -n 3 "$SCRIPT"
581 head -n 3 "$SCRIPT"
582 . "$SCRIPT"
582 . "$SCRIPT"
583 done
583 done
584
584
585 ## Execute custom bootstrap scripts
585 ## Execute custom bootstrap scripts
586 if [ -d "custom.d" ] ; then
586 if [ -d "custom.d" ] ; then
587 for SCRIPT in custom.d/*.sh; do
587 for SCRIPT in custom.d/*.sh; do
588 . "$SCRIPT"
588 . "$SCRIPT"
589 done
589 done
590 fi
590 fi
591
591
592 # Execute custom scripts inside the chroot
592 # Execute custom scripts inside the chroot
593 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
593 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
594 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
594 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
595 chroot_exec /bin/bash -x <<'EOF'
595 chroot_exec /bin/bash -x <<'EOF'
596 for SCRIPT in /chroot_scripts/* ; do
596 for SCRIPT in /chroot_scripts/* ; do
597 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
597 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
598 $SCRIPT
598 $SCRIPT
599 fi
599 fi
600 done
600 done
601 EOF
601 EOF
602 rm -rf "${R}/chroot_scripts"
602 rm -rf "${R}/chroot_scripts"
603 fi
603 fi
604
604
605 # Remove c/c++ build environment from the chroot
605 # Remove c/c++ build environment from the chroot
606 chroot_remove_cc
606 chroot_remove_cc
607
607
608 # Generate required machine-id
608 # Generate required machine-id
609 MACHINE_ID=$(dbus-uuidgen)
609 MACHINE_ID=$(dbus-uuidgen)
610 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
610 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
611 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
611 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
612
612
613 # APT Cleanup
613 # APT Cleanup
614 chroot_exec apt-get -y clean
614 chroot_exec apt-get -y clean
615 chroot_exec apt-get -y autoclean
615 chroot_exec apt-get -y autoclean
616 chroot_exec apt-get -y autoremove
616 chroot_exec apt-get -y autoremove
617
617
618 # Unmount mounted filesystems
618 # Unmount mounted filesystems
619 umount -l "${R}/proc"
619 umount -l "${R}/proc"
620 umount -l "${R}/sys"
620 umount -l "${R}/sys"
621
621
622 # Clean up directories
622 # Clean up directories
623 rm -rf "${R}/run/*"
623 rm -rf "${R}/run/*"
624 rm -rf "${R}/tmp/*"
624 rm -rf "${R}/tmp/*"
625
625
626 # Clean up files
626 # Clean up files
627 rm -f "${ETC_DIR}/ssh/ssh_host_*"
627 rm -f "${ETC_DIR}/ssh/ssh_host_*"
628 rm -f "${ETC_DIR}/dropbear/dropbear_*"
628 rm -f "${ETC_DIR}/dropbear/dropbear_*"
629 rm -f "${ETC_DIR}/apt/sources.list.save"
629 rm -f "${ETC_DIR}/apt/sources.list.save"
630 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
630 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
631 rm -f "${ETC_DIR}/*-"
631 rm -f "${ETC_DIR}/*-"
632 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
632 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
633 rm -f "${ETC_DIR}/resolv.conf"
633 rm -f "${ETC_DIR}/resolv.conf"
634 rm -f "${R}/root/.bash_history"
634 rm -f "${R}/root/.bash_history"
635 rm -f "${R}/var/lib/urandom/random-seed"
635 rm -f "${R}/var/lib/urandom/random-seed"
636 rm -f "${R}/initrd.img"
636 rm -f "${R}/initrd.img"
637 rm -f "${R}/vmlinuz"
637 rm -f "${R}/vmlinuz"
638 rm -f "${R}${QEMU_BINARY}"
638 rm -f "${R}${QEMU_BINARY}"
639
639
640 if [ "$ENABLE_QEMU" = true ] ; then
640 if [ "$ENABLE_QEMU" = true ] ; then
641 # Setup QEMU directory
641 # Setup QEMU directory
642 mkdir "${BASEDIR}/qemu"
642 mkdir "${BASEDIR}/qemu"
643
643
644 # Copy kernel image to QEMU directory
644 # Copy kernel image to QEMU directory
645 install_readonly "${BOOT_DIR}/${KERNEL_IMAGE}" "${BASEDIR}/qemu/${KERNEL_IMAGE}"
645 install_readonly "${BOOT_DIR}/${KERNEL_IMAGE}" "${BASEDIR}/qemu/${KERNEL_IMAGE}"
646
646
647 # Copy kernel config to QEMU directory
647 # Copy kernel config to QEMU directory
648 install_readonly "${R}/boot/config-${KERNEL_VERSION}" "${BASEDIR}/qemu/config-${KERNEL_VERSION}"
648 install_readonly "${R}/boot/config-${KERNEL_VERSION}" "${BASEDIR}/qemu/config-${KERNEL_VERSION}"
649
649
650 # Copy kernel dtbs to QEMU directory
650 # Copy kernel dtbs to QEMU directory
651 for dtb in "${BOOT_DIR}/"*.dtb ; do
651 for dtb in "${BOOT_DIR}/"*.dtb ; do
652 if [ -f "${dtb}" ] ; then
652 if [ -f "${dtb}" ] ; then
653 install_readonly "${dtb}" "${BASEDIR}/qemu/"
653 install_readonly "${dtb}" "${BASEDIR}/qemu/"
654 fi
654 fi
655 done
655 done
656
656
657 # Copy kernel overlays to QEMU directory
657 # Copy kernel overlays to QEMU directory
658 if [ -d "${BOOT_DIR}/overlays" ] ; then
658 if [ -d "${BOOT_DIR}/overlays" ] ; then
659 # Setup overlays dtbs directory
659 # Setup overlays dtbs directory
660 mkdir "${BASEDIR}/qemu/overlays"
660 mkdir "${BASEDIR}/qemu/overlays"
661
661
662 for dtb in "${BOOT_DIR}/overlays/"*.dtb ; do
662 for dtb in "${BOOT_DIR}/overlays/"*.dtb ; do
663 if [ -f "${dtb}" ] ; then
663 if [ -f "${dtb}" ] ; then
664 install_readonly "${dtb}" "${BASEDIR}/qemu/overlays/"
664 install_readonly "${dtb}" "${BASEDIR}/qemu/overlays/"
665 fi
665 fi
666 done
666 done
667 fi
667 fi
668
668
669 # Copy u-boot files to QEMU directory
669 # Copy u-boot files to QEMU directory
670 if [ "$ENABLE_UBOOT" = true ] ; then
670 if [ "$ENABLE_UBOOT" = true ] ; then
671 if [ -f "${BOOT_DIR}/u-boot.bin" ] ; then
671 if [ -f "${BOOT_DIR}/u-boot.bin" ] ; then
672 install_readonly "${BOOT_DIR}/u-boot.bin" "${BASEDIR}/qemu/u-boot.bin"
672 install_readonly "${BOOT_DIR}/u-boot.bin" "${BASEDIR}/qemu/u-boot.bin"
673 fi
673 fi
674 if [ -f "${BOOT_DIR}/uboot.mkimage" ] ; then
674 if [ -f "${BOOT_DIR}/uboot.mkimage" ] ; then
675 install_readonly "${BOOT_DIR}/uboot.mkimage" "${BASEDIR}/qemu/uboot.mkimage"
675 install_readonly "${BOOT_DIR}/uboot.mkimage" "${BASEDIR}/qemu/uboot.mkimage"
676 fi
676 fi
677 if [ -f "${BOOT_DIR}/boot.scr" ] ; then
677 if [ -f "${BOOT_DIR}/boot.scr" ] ; then
678 install_readonly "${BOOT_DIR}/boot.scr" "${BASEDIR}/qemu/boot.scr"
678 install_readonly "${BOOT_DIR}/boot.scr" "${BASEDIR}/qemu/boot.scr"
679 fi
679 fi
680 fi
680 fi
681
681
682 # Copy initramfs to QEMU directory
682 # Copy initramfs to QEMU directory
683 if [ -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" ] ; then
683 if [ -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" ] ; then
684 install_readonly "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" "${BASEDIR}/qemu/initramfs-${KERNEL_VERSION}"
684 install_readonly "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" "${BASEDIR}/qemu/initramfs-${KERNEL_VERSION}"
685 fi
685 fi
686 fi
686 fi
687
687
688 # Calculate size of the chroot directory in KB
688 # Calculate size of the chroot directory in KB
689 CHROOT_SIZE=$(expr "$(du -s "${R}" | awk '{ print $1 }')")
689 CHROOT_SIZE=$(expr "$(du -s "${R}" | awk '{ print $1 }')")
690
690
691 # Calculate the amount of needed 512 Byte sectors
691 # Calculate the amount of needed 512 Byte sectors
692 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
692 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
693 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
693 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
694 ROOT_OFFSET=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}")
694 ROOT_OFFSET=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}")
695
695
696 # The root partition is EXT4
696 # The root partition is EXT4
697 # This means more space than the actual used space of the chroot is used.
697 # This means more space than the actual used space of the chroot is used.
698 # As overhead for journaling and reserved blocks 35% are added.
698 # As overhead for journaling and reserved blocks 35% are added.
699 ROOT_SECTORS=$(expr "$(expr "${CHROOT_SIZE}" + "${CHROOT_SIZE}" \/ 100 \* 35)" \* 1024 \/ 512)
699 ROOT_SECTORS=$(expr "$(expr "${CHROOT_SIZE}" + "${CHROOT_SIZE}" \/ 100 \* 35)" \* 1024 \/ 512)
700
700
701 # Calculate required image size in 512 Byte sectors
701 # Calculate required image size in 512 Byte sectors
702 IMAGE_SECTORS=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}")
702 IMAGE_SECTORS=$(expr "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}")
703
703
704 # Prepare image file
704 # Prepare image file
705 if [ "$ENABLE_SPLITFS" = true ] ; then
705 if [ "$ENABLE_SPLITFS" = true ] ; then
706 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count="${TABLE_SECTORS}"
706 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count="${TABLE_SECTORS}"
707 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek="${FRMW_SECTORS}"
707 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek="${FRMW_SECTORS}"
708 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count="${TABLE_SECTORS}"
708 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count="${TABLE_SECTORS}"
709 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek="${ROOT_SECTORS}"
709 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek="${ROOT_SECTORS}"
710
710
711 # Write firmware/boot partition tables
711 # Write firmware/boot partition tables
712 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
712 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
713 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
713 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
714 EOM
714 EOM
715
715
716 # Write root partition table
716 # Write root partition table
717 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
717 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
718 ${TABLE_SECTORS},${ROOT_SECTORS},83
718 ${TABLE_SECTORS},${ROOT_SECTORS},83
719 EOM
719 EOM
720
720
721 # Setup temporary loop devices
721 # Setup temporary loop devices
722 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME"-frmw.img)"
722 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME"-frmw.img)"
723 ROOT_LOOP="$(losetup -o 1M -f --show "$IMAGE_NAME"-root.img)"
723 ROOT_LOOP="$(losetup -o 1M -f --show "$IMAGE_NAME"-root.img)"
724 else # ENABLE_SPLITFS=false
724 else # ENABLE_SPLITFS=false
725 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count="${TABLE_SECTORS}"
725 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count="${TABLE_SECTORS}"
726 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek="${IMAGE_SECTORS}"
726 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek="${IMAGE_SECTORS}"
727
727
728 # Write partition table
728 # Write partition table
729 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
729 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
730 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
730 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
731 ${ROOT_OFFSET},${ROOT_SECTORS},83
731 ${ROOT_OFFSET},${ROOT_SECTORS},83
732 EOM
732 EOM
733
733
734 # Setup temporary loop devices
734 # Setup temporary loop devices
735 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME".img)"
735 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show "$IMAGE_NAME".img)"
736 ROOT_LOOP="$(losetup -o 65M -f --show "$IMAGE_NAME".img)"
736 ROOT_LOOP="$(losetup -o 65M -f --show "$IMAGE_NAME".img)"
737 fi
737 fi
738
738
739 if [ "$ENABLE_CRYPTFS" = true ] ; then
739 if [ "$ENABLE_CRYPTFS" = true ] ; then
740 # Create dummy ext4 fs
740 # Create dummy ext4 fs
741 mkfs.ext4 "$ROOT_LOOP"
741 mkfs.ext4 "$ROOT_LOOP"
742
742
743 # Setup password keyfile
743 # Setup password keyfile
744 touch .password
744 touch .password
745 chmod 600 .password
745 chmod 600 .password
746 echo -n ${CRYPTFS_PASSWORD} > .password
746 echo -n ${CRYPTFS_PASSWORD} > .password
747
747
748 # Initialize encrypted partition
748 # Initialize encrypted partition
749 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
749 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
750
750
751 # Open encrypted partition and setup mapping
751 # Open encrypted partition and setup mapping
752 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
752 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
753
753
754 # Secure delete password keyfile
754 # Secure delete password keyfile
755 shred -zu .password
755 shred -zu .password
756
756
757 # Update temporary loop device
757 # Update temporary loop device
758 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
758 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
759
759
760 # Wipe encrypted partition (encryption cipher is used for randomness)
760 # Wipe encrypted partition (encryption cipher is used for randomness)
761 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count="$(blockdev --getsz "${ROOT_LOOP}")"
761 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count="$(blockdev --getsz "${ROOT_LOOP}")"
762 fi
762 fi
763
763
764 # Build filesystems
764 # Build filesystems
765 mkfs.vfat "$FRMW_LOOP"
765 mkfs.vfat "$FRMW_LOOP"
766 mkfs.ext4 "$ROOT_LOOP"
766 mkfs.ext4 "$ROOT_LOOP"
767
767
768 # Mount the temporary loop devices
768 # Mount the temporary loop devices
769 mkdir -p "$BUILDDIR/mount"
769 mkdir -p "$BUILDDIR/mount"
770 mount "$ROOT_LOOP" "$BUILDDIR/mount"
770 mount "$ROOT_LOOP" "$BUILDDIR/mount"
771
771
772 mkdir -p "$BUILDDIR/mount/boot/firmware"
772 mkdir -p "$BUILDDIR/mount/boot/firmware"
773 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
773 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
774
774
775 # Copy all files from the chroot to the loop device mount point directory
775 # Copy all files from the chroot to the loop device mount point directory
776 rsync -a "${R}/" "$BUILDDIR/mount/"
776 rsync -a "${R}/" "$BUILDDIR/mount/"
777
777
778 # Unmount all temporary loop devices and mount points
778 # Unmount all temporary loop devices and mount points
779 cleanup
779 cleanup
780
780
781 # Create block map file(s) of image(s)
781 # Create block map file(s) of image(s)
782 if [ "$ENABLE_SPLITFS" = true ] ; then
782 if [ "$ENABLE_SPLITFS" = true ] ; then
783 # Create block map files for "bmaptool"
783 # Create block map files for "bmaptool"
784 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
784 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
785 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
785 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
786
786
787 # Image was successfully created
787 # Image was successfully created
788 echo "$IMAGE_NAME-frmw.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
788 echo "$IMAGE_NAME-frmw.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
789 echo "$IMAGE_NAME-root.img ($(expr \( "${TABLE_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
789 echo "$IMAGE_NAME-root.img ($(expr \( "${TABLE_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
790 else
790 else
791 # Create block map file for "bmaptool"
791 # Create block map file for "bmaptool"
792 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
792 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
793
793
794 # Image was successfully created
794 # Image was successfully created
795 echo "$IMAGE_NAME.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
795 echo "$IMAGE_NAME.img ($(expr \( "${TABLE_SECTORS}" + "${FRMW_SECTORS}" + "${ROOT_SECTORS}" \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
796
796
797 # Create qemu qcow2 image
797 # Create qemu qcow2 image
798 if [ "$ENABLE_QEMU" = true ] ; then
798 if [ "$ENABLE_QEMU" = true ] ; then
799 QEMU_IMAGE=${QEMU_IMAGE:=${BASEDIR}/qemu/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
799 QEMU_IMAGE=${QEMU_IMAGE:=${BASEDIR}/qemu/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
800 QEMU_SIZE=16G
800 QEMU_SIZE=16G
801
801
802 qemu-img convert -f raw -O qcow2 "$IMAGE_NAME".img "$QEMU_IMAGE".qcow2
802 qemu-img convert -f raw -O qcow2 "$IMAGE_NAME".img "$QEMU_IMAGE".qcow2
803 qemu-img resize "$QEMU_IMAGE".qcow2 $QEMU_SIZE
803 qemu-img resize "$QEMU_IMAGE".qcow2 $QEMU_SIZE
804
804
805 echo "$QEMU_IMAGE.qcow2 ($QEMU_SIZE)" ": successfully created"
805 echo "$QEMU_IMAGE.qcow2 ($QEMU_SIZE)" ": successfully created"
806 fi
806 fi
807 fi
807 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant