##// END OF EJS Templates
Added: BUILD_KERNEL - build latest rpi2 kernel
Jan Wagner -
r55:27d947162017
parent child
Show More
@@ -1,169 +1,173
1 1 # rpi2-gen-image
2 2 ## Introduction
3 3 `rpi2-gen-image.sh` is an advanced Debian Linux bootstrapping shell script for generating Debian OS images for the Raspberry 2 (RPi2) computer. The script at this time only supports the bootstrapping of the current stable Debian 8 "jessie" release.
4 4
5 5 ## Build dependencies
6 6 The following list of Debian packages must be installed on the build system because they are essentially required for the bootstrapping process. The script will check if all required packages are installed and missing packages will be installed automatically if confirmed by the user.
7 7
8 8 ```debootstrap debian-archive-keyring qemu-user-static dosfstools rsync bmap-tools whois git-core```
9 9
10 10 ## Command-line parameters
11 11 The script accepts certain command-line parameters to enable or disable specific OS features, services and configuration settings. These parameters are passed to the `rpi2-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 `rpi2-gen-image.sh` script.
12 12
13 13 #####Command-line examples:
14 14 ```shell
15 15 ENABLE_UBOOT=true ./rpi2-gen-image.sh
16 16 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi2-gen-image.sh
17 17 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi2-gen-image.sh
18 18 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi2-gen-image.sh
19 19 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi2-gen-image.sh
20 20 ENABLE_MINBASE=true ./rpi2-gen-image.sh
21 21 ```
22 22
23 23 #### APT settings:
24 24 ##### `APT_SERVER`="ftp.debian.org"
25 25 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.
26 26
27 27 ##### `APT_PROXY`=""
28 28 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.
29 29
30 30 ##### `APT_INCLUDES`=""
31 31 A comma seperated list of additional packages to be installed during bootstrapping.
32 32
33 33 #### General system settings:
34 34 ##### `HOSTNAME`="rpi2-jessie"
35 35 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
36 36
37 37 ##### `PASSWORD`="raspberry"
38 38 Set system `root` password. The same password is used for the created user `pi`. It's **STRONGLY** recommended that you choose a custom password.
39 39
40 40 ##### `DEFLOCAL`="en_US.UTF-8"
41 41 Set default system locale. This setting can also be changed inside the running OS using the `dpkg-reconfigure locales` command. The script variant `minbase` (ENABLE_MINBASE=true) doesn't install `locales`.
42 42
43 43 ##### `TIMEZONE`="Europe/Berlin"
44 44 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.
45 45
46 46 ##### `EXPANDROOT`=true
47 47 Expand the root partition and filesystem automatically on first boot.
48 48
49 49 #### Keyboard settings:
50 50 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.
51 51
52 52 ##### `XKBMODEL`=""
53 53 Set the name of the model of your keyboard type.
54 54
55 55 ##### `XKBLAYOUT`=""
56 56 Set the supported keyboard layout(s).
57 57
58 58 ##### `XKBVARIANT`=""
59 59 Set the supported variant(s) of the keyboard layout(s).
60 60
61 61 ##### `XKBOPTIONS`=""
62 62 Set extra xkb configuration options.
63 63
64 64 #### Networking settings (DHCP)
65 65 This setting is used to set up networking auto configuration in `/etc/systemd/network/eth.network`.
66 66
67 67 #####`ENABLE_DHCP`=true
68 68 Set the system to use DHCP. This requires an DHCP server.
69 69
70 70 #### Networking settings (static)
71 71 These settings are used to set up a static networking configuration in /etc/systemd/network/eth.network. The following static networking settings are only supported if `ENABLE_DHCP` was set to `false`.
72 72
73 73 #####`NET_ADDRESS`=""
74 74 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
75 75
76 76 #####`NET_GATEWAY`=""
77 77 Set the IP address for the default gateway.
78 78
79 79 #####`NET_DNS_1`=""
80 80 Set the IP address for the first DNS server.
81 81
82 82 #####`NET_DNS_2`=""
83 83 Set the IP address for the second DNS server.
84 84
85 85 #####`NET_DNS_DOMAINS`=""
86 86 Set the default DNS search domains to use for non fully qualified host names.
87 87
88 88 #####`NET_NTP_1`=""
89 89 Set the IP address for the first NTP server.
90 90
91 91 #####`NET_NTP_2`=""
92 92 Set the IP address for the second NTP server.
93 93
94 94 #### Basic system features:
95 95 ##### `ENABLE_CONSOLE`=true
96 96 Enable serial console interface. Recommended if no monitor or keyboard is connected to the RPi2. In case of problems fe. if the network (auto) configuration failed - the serial console can be used to access the system.
97 97
98 98 ##### `ENABLE_IPV6`=true
99 99 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
100 100
101 101 ##### `ENABLE_SSHD`=true
102 102 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.
103 103
104 104 ##### `ENABLE_RSYSLOG`=true
105 105 If set to false, disable and uninstall rsyslog (so logs will be available only
106 106 in journal files)
107 107
108 108 ##### `ENABLE_SOUND`=true
109 109 Enable sound hardware and install Advanced Linux Sound Architecture.
110 110
111 111 ##### `ENABLE_HWRANDOM`=true
112 112 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
113 113
114 114 ##### `ENABLE_MINGPU`=false
115 115 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
116 116
117 117 ##### `ENABLE_DBUS`=true
118 118 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
119 119
120 120 ##### `ENABLE_XORG`=false
121 121 Install Xorg open-source X Window System.
122 122
123 123 ##### `ENABLE_WM`=""
124 124 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 `rpi2-gen-image.sh` script has been tested with the following list of window managers: `blackbox`, `openbox`, `fluxbox`, `jwm`, `dwm`, `xfce4`, `awesome`.
125 125
126 126 #### Advanced sytem features:
127 127 ##### `ENABLE_MINBASE`=false
128 128 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
129 129
130 130 ##### `ENABLE_UBOOT`=false
131 131 Replace default RPi2 second stage bootloader (bootcode.bin) with U-Boot bootloader. U-Boot can boot images via the network using the BOOTP/TFTP protocol.
132 132
133 133 ##### `ENABLE_FBTURBO`=false
134 134 Install and enable the hardware accelerated Xorg video driver `fbturbo`. Please note that this driver is currently limited to hardware accelerated window moving and scrolling.
135 135
136 136 ##### `ENABLE_IPTABLES`=false
137 137 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
138 138
139 139 ##### `ENABLE_USER`=true
140 140 Create pi user with password raspberry
141 141
142 142 ##### `ENABLE_ROOT`=true
143 143 Set root user password so root login will be enabled
144 144
145 145 ##### `ENABLE_ROOT_SSH`=true
146 146 Enable password root login via SSH. May be a security risk with default
147 147 password, use only in trusted environments.
148 148
149 149 ##### `ENABLE_HARDNET`=false
150 150 Enable IPv4/IPv6 network stack hardening settings.
151 151
152 152 ##### `CHROOT_SCRIPTS`=""
153 153 Path to a directory with scripts that should be run in the chroot before the image is finally built. Every executable file in this direcory is run in lexicographical order.
154 154
155 #### Kernel compilation:
156 ##### `BUILD_KERNEL`=false
157 Build and install the latest RPi2 linux kernel. Currently only the default RPi2 kernel configuration is used. Detailed configuration parameters for customizing the kernel and minor bug fixes still need to get implemented. feel free to help.
158
155 159 ## Logging of the bootstrapping process
156 160 All information related to the bootstrapping process and the commands executed by the `rpi2-gen-image.sh` script can easily be saved into a logfile. The common shell command `script` can be used for this purpose:
157 161
158 162 ```shell
159 163 script -c 'APT_SERVER=ftp.de.debian.org ./rpi2-gen-image.sh' ./build.log
160 164 ```
161 165
162 166 ## Flashing the image file
163 167 After the image file was successfully created by the `rpi2-gen-image.sh` script it can be copied to the microSD card that will be used by the RPi2 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`.
164 168
165 169 #####Flashing examples:
166 170 ```shell
167 171 bmaptool copy ./images/jessie/2015-12-13-debian-jessie.img /dev/mmcblk0
168 172 dd bs=4M if=./images/jessie/2015-12-13-debian-jessie.img of=/dev/mmcblk0
169 173 ```
@@ -1,699 +1,736
1 1 #!/bin/sh
2 2
3 3 ########################################################################
4 4 # rpi2-gen-image.sh ver2a 12/2015
5 5 #
6 6 # Advanced debian "jessie" bootstrap script for RPi2
7 7 #
8 8 # This program is free software; you can redistribute it and/or
9 9 # modify it under the terms of the GNU General Public License
10 10 # as published by the Free Software Foundation; either version 2
11 11 # of the License, or (at your option) any later version.
12 12 #
13 13 # some parts based on rpi2-build-image:
14 14 # Copyright (C) 2015 Ryan Finnie <ryan@finnie.org>
15 15 # Copyright (C) 2015 Luca Falavigna <dktrkranz@debian.org>
16 16 ########################################################################
17 17
18 18 # Clean up all temporary mount points
19 19 cleanup (){
20 20 set +x
21 21 set +e
22 22 echo "removing temporary mount points ..."
23 23 umount -l $R/proc 2> /dev/null
24 24 umount -l $R/sys 2> /dev/null
25 25 umount -l $R/dev/pts 2> /dev/null
26 26 umount "$BUILDDIR/mount/boot/firmware" 2> /dev/null
27 27 umount "$BUILDDIR/mount" 2> /dev/null
28 28 losetup -d "$EXT4_LOOP" 2> /dev/null
29 29 losetup -d "$VFAT_LOOP" 2> /dev/null
30 30 trap - 0 1 2 3 6
31 31 }
32 32
33 33 # Exec command in chroot
34 34 chroot_exec() {
35 35 LANG=C LC_ALL=C chroot $R $*
36 36 }
37 37
38 38 set -e
39 39 set -x
40 40
41 41 # Debian release
42 42 RELEASE=${RELEASE:=jessie}
43 43 KERNEL=${KERNEL:=3.18.0-trunk-rpi2}
44 44
45 45 # Build settings
46 46 BASEDIR=./images/${RELEASE}
47 47 BUILDDIR=${BASEDIR}/build
48 48
49 49 # General settings
50 50 HOSTNAME=${HOSTNAME:=rpi2-${RELEASE}}
51 51 PASSWORD=${PASSWORD:=raspberry}
52 52 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
53 53 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
54 54 XKBMODEL=${XKBMODEL:=""}
55 55 XKBLAYOUT=${XKBLAYOUT:=""}
56 56 XKBVARIANT=${XKBVARIANT:=""}
57 57 XKBOPTIONS=${XKBOPTIONS:=""}
58 58 EXPANDROOT=${EXPANDROOT:=true}
59 59
60 60 # Network settings
61 61 ENABLE_DHCP=${ENABLE_DHCP:=true}
62 62 # NET_* settings are ignored when ENABLE_DHCP=true
63 63 # NET_ADDRESS is an IPv4 or IPv6 address and its prefix, separated by "/"
64 64 NET_ADDRESS=${NET_ADDRESS:=""}
65 65 NET_GATEWAY=${NET_GATEWAY:=""}
66 66 NET_DNS_1=${NET_DNS_1:=""}
67 67 NET_DNS_2=${NET_DNS_2:=""}
68 68 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
69 69 NET_NTP_1=${NET_NTP_1:=""}
70 70 NET_NTP_2=${NET_NTP_2:=""}
71 71
72 72 # APT settings
73 73 APT_PROXY=${APT_PROXY:=""}
74 74 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
75 75
76 76 # Feature settings
77 77 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
78 78 ENABLE_IPV6=${ENABLE_IPV6:=true}
79 79 ENABLE_SSHD=${ENABLE_SSHD:=true}
80 80 ENABLE_SOUND=${ENABLE_SOUND:=true}
81 81 ENABLE_DBUS=${ENABLE_DBUS:=true}
82 82 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
83 83 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
84 84 ENABLE_XORG=${ENABLE_XORG:=false}
85 85 ENABLE_WM=${ENABLE_WM:=""}
86 86 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
87 87 ENABLE_USER=${ENABLE_USER:=true}
88 88 ENABLE_ROOT=${ENABLE_ROOT:=false}
89 89 ENABLE_ROOT_SSH=${ENABLE_ROOT_SSH:=false}
90 90
91 91 # Advanced settings
92 92 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
93 93 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
94 94 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
95 95 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
96 96 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
97 97
98 # Kernel compilation settings
99 BUILD_KERNEL=${BUILD_KERNEL:=false}
100
98 101 # Image chroot path
99 102 R=${BUILDDIR}/chroot
100 103 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
101 104
102 105 # Packages required for bootstrapping
103 106 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git-core"
104 107
105 108 # Missing packages that need to be installed
106 109 MISSING_PACKAGES=""
107 110
108 111 # Packages required in the chroot build environment
109 112 APT_INCLUDES=${APT_INCLUDES:=""}
110 113 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,ca-certificates,debian-archive-keyring,dialog,sudo"
111 114
112 115 set +x
113 116
114 117 # Are we running as root?
115 118 if [ "$(id -u)" -ne "0" ] ; then
116 119 echo "this script must be executed with root privileges"
117 120 exit 1
118 121 fi
119 122
123 # Add packages required for kernel cross compilation
124 if [ "$BUILD_KERNEL" = true ] ; then
125 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
126 fi
127
120 128 # Check if all required packages are installed
121 129 for package in $REQUIRED_PACKAGES ; do
122 130 if [ "`dpkg-query -W -f='${Status}' $package`" != "install ok installed" ] ; then
123 131 MISSING_PACKAGES="$MISSING_PACKAGES $package"
124 132 fi
125 133 done
126 134
127 135 # Ask if missing packages should get installed right now
128 136 if [ -n "$MISSING_PACKAGES" ] ; then
129 137 echo "the following packages needed by this script are not installed:"
130 138 echo "$MISSING_PACKAGES"
131 139
132 140 echo -n "\ndo you want to install the missing packages right now? [y/n] "
133 141 read confirm
134 142 if [ "$confirm" != "y" ] ; then
135 143 exit 1
136 144 fi
137 145 fi
138 146
139 147 # Make sure all required packages are installed
140 148 apt-get -qq -y install ${REQUIRED_PACKAGES}
141 149
142 150 # Don't clobber an old build
143 151 if [ -e "$BUILDDIR" ]; then
144 152 echo "directory $BUILDDIR already exists, not proceeding"
145 153 exit 1
146 154 fi
147 155
148 156 set -x
149 157
150 158 # Call "cleanup" function on various signals and errors
151 159 trap cleanup 0 1 2 3 6
152 160
153 161 # Set up chroot directory
154 162 mkdir -p $R
155 163
156 164 # Add required packages for the minbase installation
157 165 if [ "$ENABLE_MINBASE" = true ] ; then
158 166 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools"
159 167 else
160 168 APT_INCLUDES="${APT_INCLUDES},locales,keyboard-configuration,console-setup"
161 169 fi
162 170
163 171 # Add parted package, required to get partprobe utility
164 172 if [ "$EXPANDROOT" = true ] ; then
165 173 APT_INCLUDES="${APT_INCLUDES},parted"
166 174 fi
167 175
168 176 # Add dbus package, recommended if using systemd
169 177 if [ "$ENABLE_DBUS" = true ] ; then
170 178 APT_INCLUDES="${APT_INCLUDES},dbus"
171 179 fi
172 180
173 181 # Add iptables IPv4/IPv6 package
174 182 if [ "$ENABLE_IPTABLES" = true ] ; then
175 183 APT_INCLUDES="${APT_INCLUDES},iptables"
176 184 fi
177 185
178 186 # Add openssh server package
179 187 if [ "$ENABLE_SSHD" = true ] ; then
180 188 APT_INCLUDES="${APT_INCLUDES},openssh-server"
181 189 fi
182 190
183 191 # Add alsa-utils package
184 192 if [ "$ENABLE_SOUND" = true ] ; then
185 193 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
186 194 fi
187 195
188 196 # Add rng-tools package
189 197 if [ "$ENABLE_HWRANDOM" = true ] ; then
190 198 APT_INCLUDES="${APT_INCLUDES},rng-tools"
191 199 fi
192 200
193 201 if [ "$ENABLE_USER" = true ]; then
194 202 APT_INCLUDES="${APT_INCLUDES},sudo"
195 203 fi
196 204
197 205 # Add fbturbo video driver
198 206 if [ "$ENABLE_FBTURBO" = true ] ; then
199 207 # Enable xorg package dependencies
200 208 ENABLE_XORG=true
201 209 fi
202 210
203 211 # Add user defined window manager package
204 212 if [ -n "$ENABLE_WM" ] ; then
205 213 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
206 214
207 215 # Enable xorg package dependencies
208 216 ENABLE_XORG=true
209 217 fi
210 218
211 219 # Add xorg package
212 220 if [ "$ENABLE_XORG" = true ] ; then
213 221 APT_INCLUDES="${APT_INCLUDES},xorg"
214 222 fi
215 223
216 224 # Base debootstrap (unpack only)
217 225 if [ "$ENABLE_MINBASE" = true ] ; then
218 226 http_proxy=${APT_PROXY} debootstrap --arch=armhf --variant=minbase --foreign --include=${APT_INCLUDES} $RELEASE $R http://${APT_SERVER}/debian
219 227 else
220 228 http_proxy=${APT_PROXY} debootstrap --arch=armhf --foreign --include=${APT_INCLUDES} $RELEASE $R http://${APT_SERVER}/debian
221 229 fi
222 230
223 231 # Copy qemu emulator binary to chroot
224 232 cp /usr/bin/qemu-arm-static $R/usr/bin
225 233
226 234 # Copy debian-archive-keyring.pgp
227 235 chroot $R mkdir -p /usr/share/keyrings
228 236 cp /usr/share/keyrings/debian-archive-keyring.gpg $R/usr/share/keyrings/debian-archive-keyring.gpg
229 237
230 238 # Complete the bootstrapping process
231 239 chroot $R /debootstrap/debootstrap --second-stage
232 240
233 241 # Mount required filesystems
234 242 mount -t proc none $R/proc
235 243 mount -t sysfs none $R/sys
236 244 mount --bind /dev/pts $R/dev/pts
237 245
238 246 # Use proxy inside chroot
239 247 if [ -z "$APT_PROXY" ] ; then
240 248 echo "Acquire::http::Proxy \"$APT_PROXY\";" >> $R/etc/apt/apt.conf.d/10proxy
241 249 fi
242 250
243 251 # Pin package flash-kernel to repositories.collabora.co.uk
244 252 cat <<EOM >$R/etc/apt/preferences.d/flash-kernel
245 253 Package: flash-kernel
246 254 Pin: origin repositories.collabora.co.uk
247 255 Pin-Priority: 1000
248 256 EOM
249 257
250 258 # Set up timezone
251 259 echo ${TIMEZONE} >$R/etc/timezone
252 260 chroot_exec dpkg-reconfigure -f noninteractive tzdata
253 261
254 262 # Upgrade collabora package index and install collabora keyring
255 263 echo "deb https://repositories.collabora.co.uk/debian ${RELEASE} rpi2" >$R/etc/apt/sources.list
256 264 chroot_exec apt-get -qq -y update
257 265 chroot_exec apt-get -qq -y --force-yes install collabora-obs-archive-keyring
258 266
259 267 # Set up initial sources.list
260 268 cat <<EOM >$R/etc/apt/sources.list
261 269 deb http://${APT_SERVER}/debian ${RELEASE} main contrib
262 270 #deb-src http://${APT_SERVER}/debian ${RELEASE} main contrib
263 271
264 272 deb http://${APT_SERVER}/debian/ ${RELEASE}-updates main contrib
265 273 #deb-src http://${APT_SERVER}/debian/ ${RELEASE}-updates main contrib
266 274
267 275 deb http://security.debian.org/ ${RELEASE}/updates main contrib
268 276 #deb-src http://security.debian.org/ ${RELEASE}/updates main contrib
269 277
270 278 deb https://repositories.collabora.co.uk/debian ${RELEASE} rpi2
271 279 EOM
272 280
273 281 # Upgrade package index and update all installed packages and changed dependencies
274 282 chroot_exec apt-get -qq -y update
275 283 chroot_exec apt-get -qq -y -u dist-upgrade
276 284
277 285 # Set up default locale and keyboard configuration
278 286 if [ "$ENABLE_MINBASE" = false ] ; then
279 287 # Set locale choice in debconf db, even though dpkg-reconfigure ignores and overwrites them due to some bug
280 288 # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=684134 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=685957
281 289 # ... so we have to set locales manually
282 290 if [ "$DEFLOCAL" = "en_US.UTF-8" ] ; then
283 291 chroot_exec echo "locales locales/locales_to_be_generated multiselect ${DEFLOCAL} UTF-8" | debconf-set-selections
284 292 else
285 293 # en_US.UTF-8 should be available anyway : https://www.debian.org/doc/manuals/debian-reference/ch08.en.html#_the_reconfiguration_of_the_locale
286 294 chroot_exec echo "locales locales/locales_to_be_generated multiselect en_US.UTF-8 UTF-8, ${DEFLOCAL} UTF-8" | debconf-set-selections
287 295 chroot_exec sed -i "/en_US.UTF-8/s/^#//" /etc/locale.gen
288 296 fi
289 297 chroot_exec sed -i "/${DEFLOCAL}/s/^#//" /etc/locale.gen
290 298 chroot_exec echo "locales locales/default_environment_locale select ${DEFLOCAL}" | debconf-set-selections
291 299 chroot_exec locale-gen
292 300 chroot_exec update-locale LANG=${DEFLOCAL}
293 301
294 302 # Keyboard configuration, if requested
295 303 if [ "$XKBMODEL" != "" ] ; then
296 304 chroot_exec sed -i "s/^XKBMODEL.*/XKBMODEL=\"${XKBMODEL}\"/" /etc/default/keyboard
297 305 fi
298 306 if [ "$XKBLAYOUT" != "" ] ; then
299 307 chroot_exec sed -i "s/^XKBLAYOUT.*/XKBLAYOUT=\"${XKBLAYOUT}\"/" /etc/default/keyboard
300 308 fi
301 309 if [ "$XKBVARIANT" != "" ] ; then
302 310 chroot_exec sed -i "s/^XKBVARIANT.*/XKBVARIANT=\"${XKBVARIANT}\"/" /etc/default/keyboard
303 311 fi
304 312 if [ "$XKBOPTIONS" != "" ] ; then
305 313 chroot_exec sed -i "s/^XKBOPTIONS.*/XKBOPTIONS=\"${XKBOPTIONS}\"/" /etc/default/keyboard
306 314 fi
307 315 chroot_exec dpkg-reconfigure -f noninteractive keyboard-configuration
308 316 # Set up font console
309 317 case "${DEFLOCAL}" in
310 318 *UTF-8)
311 319 chroot_exec sed -i 's/^CHARMAP.*/CHARMAP="UTF-8"/' /etc/default/console-setup
312 320 ;;
313 321 *)
314 322 chroot_exec sed -i 's/^CHARMAP.*/CHARMAP="guess"/' /etc/default/console-setup
315 323 ;;
316 324 esac
317 325 chroot_exec dpkg-reconfigure -f noninteractive console-setup
318 326 fi
319 327
320 # Kernel installation
321 # Install flash-kernel last so it doesn't try (and fail) to detect the platform in the chroot
322 chroot_exec apt-get -qq -y --no-install-recommends install linux-image-${KERNEL} raspberrypi-bootloader-nokernel
323 chroot_exec apt-get -qq -y install flash-kernel
328 # Fetch and build latest raspberry kernel
329 if [ "$BUILD_KERNEL" = true ] ; then
330 # Fetch current raspberrypi kernel sources
331 git -C $R/tmp clone --depth=1 https://github.com/raspberrypi/linux
332
333 # Load default raspberry kernel configuration
334 make -C $R/tmp/linux ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
335
336 # Cross compile kernel and modules
337 make -C $R/tmp/linux -j 8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
338
339 # Install kernel modules
340 make -C $R/tmp/linux ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../.. modules_install
324 341
325 VMLINUZ="$(ls -1 $R/boot/vmlinuz-* | sort | tail -n 1)"
326 [ -z "$VMLINUZ" ] && exit 1
327 cp $VMLINUZ $R/boot/firmware/kernel7.img
342 # Copy and rename compiled kernel to boot directory
343 mkdir $R/boot/firmware/
344 $R/tmp/linux/scripts/mkknlimg $R/tmp/linux/arch/arm/boot/zImage $R/boot/firmware/kernel7.img
345
346 # Copy dts and dtb device definitions
347 mkdir $R/boot/firmware/overlays/
348 cp $R/tmp/linux/arch/arm/boot/dts/*.dtb $R/boot/firmware/
349 cp $R/tmp/linux/arch/arm/boot/dts/overlays/*.dtb* $R/boot/firmware/overlays/
350 cp $R/tmp/linux/arch/arm/boot/dts/overlays/README $R/boot/firmware/overlays/
351
352 # Install raspberry bootloader and flash-kernel
353 chroot_exec apt-get -qq -y --no-install-recommends install raspberrypi-bootloader-nokernel
354 else
355 # Kernel installation
356 chroot_exec apt-get -qq -y --no-install-recommends install linux-image-${KERNEL} raspberrypi-bootloader-nokernel
357
358 # Install flash-kernel last so it doesn't try (and fail) to detect the platform in the chroot
359 chroot_exec apt-get -qq -y install flash-kernel
360
361 VMLINUZ="$(ls -1 $R/boot/vmlinuz-* | sort | tail -n 1)"
362 [ -z "$VMLINUZ" ] && exit 1
363 cp $VMLINUZ $R/boot/firmware/kernel7.img
364 fi
328 365
329 366 # Set up IPv4 hosts
330 367 echo ${HOSTNAME} >$R/etc/hostname
331 368 cat <<EOM >$R/etc/hosts
332 369 127.0.0.1 localhost
333 370 127.0.1.1 ${HOSTNAME}
334 371 EOM
335 372 if [ "$NET_ADDRESS" != "" ] ; then
336 373 NET_IP=$(echo ${NET_ADDRESS} | cut -f 1 -d'/')
337 374 sed -i "s/^127.0.1.1/${NET_IP}/" $R/etc/hosts
338 375 fi
339 376
340 377 # Set up IPv6 hosts
341 378 if [ "$ENABLE_IPV6" = true ] ; then
342 379 cat <<EOM >>$R/etc/hosts
343 380
344 381 ::1 localhost ip6-localhost ip6-loopback
345 382 ff02::1 ip6-allnodes
346 383 ff02::2 ip6-allrouters
347 384 EOM
348 385 fi
349 386
350 387 # Place hint about network configuration
351 388 cat <<EOM >$R/etc/network/interfaces
352 389 # Debian switched to systemd-networkd configuration files.
353 390 # please configure your networks in '/etc/systemd/network/'
354 391 EOM
355 392
356 393 if [ "$ENABLE_DHCP" = true ] ; then
357 394 # Enable systemd-networkd DHCP configuration for interface eth0
358 395 cat <<EOM >$R/etc/systemd/network/eth.network
359 396 [Match]
360 397 Name=eth0
361 398
362 399 [Network]
363 400 DHCP=yes
364 401 EOM
365 402
366 403 # Set DHCP configuration to IPv4 only
367 404 if [ "$ENABLE_IPV6" = false ] ; then
368 405 sed -i "s/^DHCP=yes/DHCP=v4/" $R/etc/systemd/network/eth.network
369 406 fi
370 407 else # ENABLE_DHCP=false
371 408 cat <<EOM >$R/etc/systemd/network/eth.network
372 409 [Match]
373 410 Name=eth0
374 411
375 412 [Network]
376 413 DHCP=no
377 414 Address=${NET_ADDRESS}
378 415 Gateway=${NET_GATEWAY}
379 416 DNS=${NET_DNS_1}
380 417 DNS=${NET_DNS_2}
381 418 Domains=${NET_DNS_DOMAINS}
382 419 NTP=${NET_NTP_1}
383 420 NTP=${NET_NTP_2}
384 421 EOM
385 422 fi
386 423
387 424 # Enable systemd-networkd service
388 425 chroot_exec systemctl enable systemd-networkd
389 426
390 427 # Generate crypt(3) password string
391 428 ENCRYPTED_PASSWORD=`mkpasswd -m sha-512 ${PASSWORD}`
392 429
393 430 # Set up default user
394 431 if [ "$ENABLE_USER" = true ] ; then
395 432 chroot_exec adduser --gecos pi --add_extra_groups --disabled-password pi
396 433 chroot_exec usermod -a -G sudo -p "${ENCRYPTED_PASSWORD}" pi
397 434 fi
398 435
399 436 # Set up root password or not
400 437 if [ "$ENABLE_ROOT" = true ]; then
401 438 chroot_exec usermod -p "${ENCRYPTED_PASSWORD}" root
402 439
403 440 if [ "$ENABLE_ROOT_SSH" = true ]; then
404 441 sed -i 's|[#]*PermitRootLogin.*|PermitRootLogin yes|g' $R/etc/ssh/sshd_config
405 442 fi
406 443 else
407 444 chroot_exec usermod -p \'!\' root
408 445 fi
409 446
410 447 # Set up firmware boot cmdline
411 448 CMDLINE="dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 rootflags=commit=100,data=writeback elevator=deadline rootwait net.ifnames=1 console=tty1"
412 449
413 450 # Set up serial console support (if requested)
414 451 if [ "$ENABLE_CONSOLE" = true ] ; then
415 452 CMDLINE="${CMDLINE} console=ttyAMA0,115200 kgdboc=ttyAMA0,115200"
416 453 fi
417 454
418 455 # Set up IPv6 networking support
419 456 if [ "$ENABLE_IPV6" = false ] ; then
420 457 CMDLINE="${CMDLINE} ipv6.disable=1"
421 458 fi
422 459
423 460 echo "${CMDLINE}" >$R/boot/firmware/cmdline.txt
424 461
425 462 # Set up firmware config
426 463 install -o root -g root -m 644 files/config.txt $R/boot/firmware/config.txt
427 464
428 465 # Load snd_bcm2835 kernel module at boot time
429 466 if [ "$ENABLE_SOUND" = true ] ; then
430 467 echo "snd_bcm2835" >>$R/etc/modules
431 468 fi
432 469
433 470 # Set smallest possible GPU memory allocation size: 16MB (no X)
434 471 if [ "$ENABLE_MINGPU" = true ] ; then
435 472 echo "gpu_mem=16" >>$R/boot/firmware/config.txt
436 473 fi
437 474
438 475 # Create symlinks
439 476 ln -sf firmware/config.txt $R/boot/config.txt
440 477 ln -sf firmware/cmdline.txt $R/boot/cmdline.txt
441 478
442 479 # Prepare modules-load.d directory
443 480 mkdir -p $R/lib/modules-load.d/
444 481
445 482 # Load random module on boot
446 483 if [ "$ENABLE_HWRANDOM" = true ] ; then
447 484 cat <<EOM >$R/lib/modules-load.d/rpi2.conf
448 485 bcm2708_rng
449 486 EOM
450 487 fi
451 488
452 489 # Prepare modprobe.d directory
453 490 mkdir -p $R/etc/modprobe.d/
454 491
455 492 # Blacklist sound modules
456 493 install -o root -g root -m 644 files/modprobe.d/raspi-blacklist.conf $R/etc/modprobe.d/raspi-blacklist.conf
457 494
458 495 # Create default fstab
459 496 install -o root -g root -m 644 files/fstab $R/etc/fstab
460 497
461 498 # Avoid swapping and increase cache sizes
462 499 install -o root -g root -m 644 files/sysctl.d/81-rpi-vm.conf $R/etc/sysctl.d/81-rpi-vm.conf
463 500
464 501 # Enable network stack hardening
465 502 if [ "$ENABLE_HARDNET" = true ] ; then
466 503 install -o root -g root -m 644 files/sysctl.d/81-rpi-net-hardening.conf $R/etc/sysctl.d/81-rpi-net-hardening.conf
467 504
468 505 # Enable resolver warnings about spoofed addresses
469 506 cat <<EOM >>$R/etc/host.conf
470 507 spoof warn
471 508 EOM
472 509 fi
473 510
474 511 # First boot actions
475 512 cat files/firstboot/10-begin.sh > $R/etc/rc.firstboot
476 513
477 514 # Ensure openssh server host keys are regenerated on first boot
478 515 if [ "$ENABLE_SSHD" = true ] ; then
479 516 cat files/firstboot/21-generate-ssh-keys.sh >> $R/etc/rc.firstboot
480 517 rm -f $R/etc/ssh/ssh_host_*
481 518 fi
482 519
483 520 if [ "$EXPANDROOT" = true ] ; then
484 521 cat files/firstboot/22-expandroot.sh >> $R/etc/rc.firstboot
485 522 fi
486 523
487 524 cat files/firstboot/99-finish.sh >> $R/etc/rc.firstboot
488 525 chmod +x $R/etc/rc.firstboot
489 526
490 527 sed -i '/exit 0/d' $R/etc/rc.local
491 528 echo /etc/rc.firstboot >> $R/etc/rc.local
492 529 echo exit 0 >> $R/etc/rc.local
493 530
494 531 # Disable rsyslog
495 532 if [ "$ENABLE_RSYSLOG" = false ]; then
496 533 sed -i 's|[#]*ForwardToSyslog=yes|ForwardToSyslog=no|g' $R/etc/systemd/journald.conf
497 534 chroot_exec systemctl disable rsyslog
498 535 chroot_exec apt-get purge -q -y --force-yes rsyslog
499 536 fi
500 537
501 538 # Enable serial console systemd style
502 539 if [ "$ENABLE_CONSOLE" = true ] ; then
503 540 chroot_exec systemctl enable serial-getty\@ttyAMA0.service
504 541 fi
505 542
506 543 # Enable firewall based on iptables started by systemd service
507 544 if [ "$ENABLE_IPTABLES" = true ] ; then
508 545 # Create iptables configuration directory
509 546 mkdir -p "$R/etc/iptables"
510 547
511 548 # Create iptables systemd service
512 549 install -o root -g root -m 644 files/iptables/iptables.service $R/etc/systemd/system/iptables.service
513 550
514 551 # Create flush-table script called by iptables service
515 552 install -o root -g root -m 755 files/iptables/flush-iptables.sh $R/etc/iptables/flush-iptables.sh
516 553
517 554 # Create iptables rule file
518 555 install -o root -g root -m 644 files/iptables/iptables.rules $R/etc/iptables/iptables.rules
519 556
520 557 # Reload systemd configuration and enable iptables service
521 558 chroot_exec systemctl daemon-reload
522 559 chroot_exec systemctl enable iptables.service
523 560
524 561 if [ "$ENABLE_IPV6" = true ] ; then
525 562 # Create ip6tables systemd service
526 563 install -o root -g root -m 644 files/iptables/ip6tables.service $R/etc/systemd/system/ip6tables.service
527 564
528 565 # Create ip6tables file
529 566 install -o root -g root -m 755 files/iptables/flush-ip6tables.sh $R/etc/iptables/flush-ip6tables.sh
530 567
531 568 install -o root -g root -m 644 files/iptables/ip6tables.rules $R/etc/iptables/ip6tables.rules
532 569
533 570 # Reload systemd configuration and enable iptables service
534 571 chroot_exec systemctl daemon-reload
535 572 chroot_exec systemctl enable ip6tables.service
536 573 fi
537 574 fi
538 575
539 576 # Remove SSHD related iptables rules
540 577 if [ "$ENABLE_SSHD" = false ] ; then
541 578 sed -e '/^#/! {/SSH/ s/^/# /}' -i $R/etc/iptables/iptables.rules 2> /dev/null
542 579 sed -e '/^#/! {/SSH/ s/^/# /}' -i $R/etc/iptables/ip6tables.rules 2> /dev/null
543 580 fi
544 581
545 582 # Install gcc/c++ build environment inside the chroot
546 583 if [ "$ENABLE_UBOOT" = true ] || [ "$ENABLE_FBTURBO" = true ]; then
547 584 chroot_exec apt-get install -q -y --force-yes --no-install-recommends linux-compiler-gcc-4.9-arm g++ make bc
548 585 fi
549 586
550 587 # Fetch and build U-Boot bootloader
551 588 if [ "$ENABLE_UBOOT" = true ] ; then
552 589 # Fetch U-Boot bootloader sources
553 590 git -C $R/tmp clone git://git.denx.de/u-boot.git
554 591
555 592 # Build and install U-Boot inside chroot
556 593 chroot_exec make -C /tmp/u-boot/ rpi_2_defconfig all
557 594
558 595 # Copy compiled bootloader binary and set config.txt to load it
559 596 cp $R/tmp/u-boot/u-boot.bin $R/boot/firmware/
560 597 printf "\n# boot u-boot kernel\nkernel=u-boot.bin\n" >> $R/boot/firmware/config.txt
561 598
562 599 # Set U-Boot command file
563 600 cat <<EOM >$R/boot/firmware/uboot.mkimage
564 601 # Tell Linux that it is booting on a Raspberry Pi2
565 602 setenv machid 0x00000c42
566 603
567 604 # Set the kernel boot command line
568 605 setenv bootargs "earlyprintk ${CMDLINE}"
569 606
570 607 # Save these changes to u-boot's environment
571 608 saveenv
572 609
573 610 # Load the existing Linux kernel into RAM
574 611 fatload mmc 0:1 \${kernel_addr_r} kernel7.img
575 612
576 613 # Boot the kernel we have just loaded
577 614 bootz \${kernel_addr_r}
578 615 EOM
579 616
580 617 # Generate U-Boot image from command file
581 618 chroot_exec mkimage -A arm -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi2 Boot Script" -d /boot/firmware/uboot.mkimage /boot/firmware/boot.scr
582 619 fi
583 620
584 621 # Fetch and build fbturbo Xorg driver
585 622 if [ "$ENABLE_FBTURBO" = true ] ; then
586 623 # Fetch fbturbo driver sources
587 624 git -C $R/tmp clone https://github.com/ssvb/xf86-video-fbturbo.git
588 625
589 626 # Install Xorg build dependencies
590 627 chroot_exec apt-get install -q -y --no-install-recommends xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
591 628
592 629 # Build and install fbturbo driver inside chroot
593 630 chroot_exec /bin/bash -c "cd /tmp/xf86-video-fbturbo; autoreconf -vi; ./configure --prefix=/usr; make; make install"
594 631
595 632 # Add fbturbo driver to Xorg configuration
596 633 cat <<EOM >$R/usr/share/X11/xorg.conf.d/99-fbturbo.conf
597 634 Section "Device"
598 635 Identifier "Allwinner A10/A13 FBDEV"
599 636 Driver "fbturbo"
600 637 Option "fbdev" "/dev/fb0"
601 638 Option "SwapbuffersWait" "true"
602 639 EndSection
603 640 EOM
604 641
605 642 # Remove Xorg build dependencies
606 643 chroot_exec apt-get -q -y purge --auto-remove xorg-dev xutils-dev x11proto-dri2-dev libltdl-dev libtool automake libdrm-dev
607 644 fi
608 645
609 646 # Remove gcc/c++ build environment from the chroot
610 647 if [ "$ENABLE_UBOOT" = true ] || [ "$ENABLE_FBTURBO" = true ]; then
611 648 chroot_exec apt-get -y -q purge --auto-remove bc binutils cpp cpp-4.9 g++ g++-4.9 gcc gcc-4.9 libasan1 libatomic1 libc-dev-bin libc6-dev libcloog-isl4 libgcc-4.9-dev libgomp1 libisl10 libmpc3 libmpfr4 libstdc++-4.9-dev libubsan0 linux-compiler-gcc-4.9-arm linux-libc-dev make
612 649 fi
613 650
614 651 # Clean cached downloads
615 652 chroot_exec apt-get -y clean
616 653 chroot_exec apt-get -y autoclean
617 654 chroot_exec apt-get -y autoremove
618 655
619 656 # Invoke custom scripts
620 657 if [ -n "${CHROOT_SCRIPTS}" ]; then
621 658 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
622 659 LANG=C chroot $R bash -c 'for SCRIPT in /chroot_scripts/*; do if [ -f $SCRIPT -a -x $SCRIPT ]; then $SCRIPT; fi done;'
623 660 rm -rf "${R}/chroot_scripts"
624 661 fi
625 662
626 663 # Unmount mounted filesystems
627 664 umount -l $R/proc
628 665 umount -l $R/sys
629 666
630 667 # Clean up files
631 668 rm -f $R/etc/apt/sources.list.save
632 669 rm -f $R/etc/resolvconf/resolv.conf.d/original
633 670 rm -rf $R/run
634 671 mkdir -p $R/run
635 672 rm -f $R/etc/*-
636 673 rm -f $R/root/.bash_history
637 674 rm -rf $R/tmp/*
638 675 rm -f $R/var/lib/urandom/random-seed
639 676 [ -L $R/var/lib/dbus/machine-id ] || rm -f $R/var/lib/dbus/machine-id
640 677 rm -f $R/etc/machine-id
641 678 rm -fr $R/etc/apt/apt.conf.d/10proxy
642 679
643 680 # Calculate size of the chroot directory in KB
644 681 CHROOT_SIZE=$(expr `du -s $R | awk '{ print $1 }'`)
645 682
646 683 # Calculate the amount of needed 512 Byte sectors
647 684 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
648 685 BOOT_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
649 686 ROOT_OFFSET=$(expr ${TABLE_SECTORS} + ${BOOT_SECTORS})
650 687
651 688 # The root partition is EXT4
652 689 # This means more space than the actual used space of the chroot is used.
653 690 # As overhead for journaling and reserved blocks 20% are added.
654 691 ROOT_SECTORS=$(expr $(expr ${CHROOT_SIZE} + ${CHROOT_SIZE} \/ 100 \* 20) \* 1024 \/ 512)
655 692
656 693 # Calculate required image size in 512 Byte sectors
657 694 IMAGE_SECTORS=$(expr ${TABLE_SECTORS} + ${BOOT_SECTORS} + ${ROOT_SECTORS})
658 695
659 696 # Prepare date string for image file name
660 697 DATE="$(date +%Y-%m-%d)"
661 698
662 699 # Prepare image file
663 700 dd if=/dev/zero of="$BASEDIR/${DATE}-debian-${RELEASE}.img" bs=512 count=${TABLE_SECTORS}
664 701 dd if=/dev/zero of="$BASEDIR/${DATE}-debian-${RELEASE}.img" bs=512 count=0 seek=${IMAGE_SECTORS}
665 702
666 703 # Write partition table
667 704 sfdisk -q -f "$BASEDIR/${DATE}-debian-${RELEASE}.img" <<EOM
668 705 unit: sectors
669 706
670 707 1 : start= ${TABLE_SECTORS}, size= ${BOOT_SECTORS}, Id= c, bootable
671 708 2 : start= ${ROOT_OFFSET}, size= ${ROOT_SECTORS}, Id=83
672 709 3 : start= 0, size= 0, Id= 0
673 710 4 : start= 0, size= 0, Id= 0
674 711 EOM
675 712
676 713 # Set up temporary loop devices and build filesystems
677 714 VFAT_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $BASEDIR/${DATE}-debian-${RELEASE}.img)"
678 715 EXT4_LOOP="$(losetup -o 65M -f --show $BASEDIR/${DATE}-debian-${RELEASE}.img)"
679 716 mkfs.vfat "$VFAT_LOOP"
680 717 mkfs.ext4 "$EXT4_LOOP"
681 718
682 719 # Mount the temporary loop devices
683 720 mkdir -p "$BUILDDIR/mount"
684 721 mount "$EXT4_LOOP" "$BUILDDIR/mount"
685 722
686 723 mkdir -p "$BUILDDIR/mount/boot/firmware"
687 724 mount "$VFAT_LOOP" "$BUILDDIR/mount/boot/firmware"
688 725
689 726 # Copy all files from the chroot to the loop device mount point directory
690 727 rsync -a "$R/" "$BUILDDIR/mount/"
691 728
692 729 # Unmount all temporary loop devices and mount points
693 730 cleanup
694 731
695 732 # (optinal) create block map file for "bmaptool"
696 733 bmaptool create -o "$BASEDIR/${DATE}-debian-${RELEASE}.bmap" "$BASEDIR/${DATE}-debian-${RELEASE}.img"
697 734
698 735 # Image was successfully created
699 736 echo "$BASEDIR/${DATE}-debian-${RELEASE}.img (${IMAGE_SIZE})" ": successfully created"
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant