##// END OF EJS Templates
Merge pull request #20 from drtyhlpr/master...
Gérard Vidal -
r278:7c46fd73c758 Fusion
parent child
Show More
@@ -0,0 +1,12
1 [Match]
2 Name=wlan0
3
4 [Network]
5 DHCP=no
6 Address=
7 Gateway=
8 DNS=
9 DNS=
10 Domains=
11 NTP=
12 NTP=
@@ -1,450 +1,450
1 1 ## 介绍
2 2 `rpi23-gen-image.sh` 是一个自动生成树莓派2/3系统镜像的脚本工具, 当前支持自动生成32位 armhf 架构的Debian, 发行版本`jessie`, `stretch``buster`. 树莓派3 64位镜像需要使用特定的配置参数 (```templates/rpi3-stretch-arm64-4.11.y```).
3 3
4 4 ## 构建环境所依赖的包
5 5 一定要安装好下列deb包, 他们是构建过程需要的核心包. 脚本会自动检查, 如果缺少,经用户确认后会自动安装.
6 6
7 7 ```debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo```
8 8
9 9 推荐通过配置 `rpi23-gen-image.sh` 脚本编译安装最新的树莓派 Linux 内核, 对于树莓派3, 只能如此. 在构建系统上使用 ARM (armhf) 交叉编译工具链编译内核.
10 10
11 11 脚本已经在Debian Liux `jessie` 和`stretch` 构建系统下使用默认的 `crossbuild-essential-armhf` 工具链进行过测试. 获取更多信息请查看 [Debian 交叉工具链 Wiki](https://wiki.debian.org/CrossToolchains) .
12 12
13 13 如果使用Debian Linux `jessie` 构建系统, 先要添加交叉编译工具链的源 [Debian 交叉工具链仓库](http://emdebian.org/tools/debian/):
14 14
15 15 ```
16 16 echo "deb http://emdebian.org/tools/debian/ jessie main" > /etc/apt/sources.list.d/crosstools.list
17 17 sudo -u nobody wget -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
18 18 dpkg --add-architecture armhf
19 19 apt-get update
20 20 ```
21 21
22 22 ## 命令行参数
23 23 脚本可以使用特定的命令行参数来允许或禁止操作系统的某些特性、服务和配置信息. 这些参数通过(简单)脚本变量传递给 `rpi23-gen-image.sh`. 不同于环境变量, (简单)脚本变量在调用`rpi23-gen-image.sh`的命令行前面定义.
24 24
25 25 ##### 命令行示例:
26 26 ```shell
27 27 ENABLE_UBOOT=true ./rpi23-gen-image.sh
28 28 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
29 29 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
30 30 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
31 31 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
32 32 ENABLE_MINBASE=true ./rpi23-gen-image.sh
33 33 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
34 34 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
35 35 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
36 36 ENABLE_CRYPTFS=true CRYPTFS_PASSWORD=changeme EXPANDROOT=false ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
37 37 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
38 38 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
39 39 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
40 40 ```
41 41
42 42 ## 参数模板文件
43 43 为了避免冗长的命令行参数以及存储感兴趣的参数配置, `rpi23-gen-image.sh` 支持所谓的参数模板文件 (`CONFIG_TEMPLATE`=template). 这些文本文件位于 `./templates` 目录, 文件中含有将会使用的配置参数. 新的配置模板文件会被添加到 `./templates` 目录.
44 44
45 45 ##### 命令行示例:
46 46 ```shell
47 47 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
48 48 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
49 49 ```
50 50
51 51 ## 支持的参数和设置
52 52 #### APT 设置:
53 53 ##### `APT_SERVER`="ftp.debian.org"
54 54 设置 Debian 仓库地址. 选择一个 [镜像站点](https://www.debian.org/mirror/list). 选一个近的镜像站点会加快镜像生成过程中所需文件的下载速度.
55 55
56 56 ##### `APT_PROXY`=""
57 57 设置代理服务器地址. 使用本地缓存代理, 比如 `apt-cacher-ng` 可以缩短镜像生成时间, 因为所需要的 Debian 包文件只需下载一次.
58 58
59 59 ##### `APT_INCLUDES`=""
60 60 生成镜像过程中最先由debootstrap程序自动安装的附加包, 逗号分隔.
61 61
62 62 ##### `APT_INCLUDES_LATE`=""
63 63 生成镜像过程中最初的debootstrap完成后, 需要的使用apt命令安装的附加包, 逗号分隔. 特别用在含有 pre-depend 依赖关系的包的, 其依赖关系在打包过程中debootstrap程序中无法正确处理.
64 64
65 65 ---
66 66
67 67 #### 通用系统设置:
68 68 ##### `RPI_MODEL`=2
69 69 指定树莓派型号. 当前支持树莓派 `2``3`. 设为 `3``BUILD_KERNEL` 自动设为true .
70 70
71 71 ##### `RELEASE`="jessie"
72 72 设置 Debian 发行版. 脚本当前支持 Debian 发行版 "jessie", "stretch" 和 "buster" 的自动生成. 设为`stretch` 或 `buster``BUILD_KERNEL` 自动设为true.
73 73
74 74 ##### `RELEASE_ARCH`="armhf"
75 75 设置期望的 Debian 发行架构.
76 76
77 77 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
78 78 设置主机名称. 建议所在的子网中主机名称是唯一的.
79 79
80 80 ##### `PASSWORD`="raspberry"
81 81 设置系统的 `root` 用户密码. **强烈**建议选择一个自定义密码 .
82 82
83 83 ##### `USER_PASSWORD`="raspberry"
84 84 设置由 `USER_NAME`=pi 参数创建的普通用户的密码. 如果 `ENABLE_USER`=false 则忽略. **强烈**建议选择一个自定义密码.
85 85
86 86 ##### `DEFLOCAL`="en_US.UTF-8"
87 87 设置系统默认 locale. 将来可以在运行的系统中执行 `dpkg-reconfigure locales` 命令更改此项设置. 设置这项脚本会自动安装 `locales`, `keyboard-configuration``console-setup` 三个包.
88 88
89 89 ##### `TIMEZONE`="Europe/Berlin"
90 90 设置系统默认时区. 可以在`/usr/share/zoneinfo/` 目录中找到全部可用时区. 将来可以在运行的系统中执行 `dpkg-reconfigure tzdata` 命令更改此项设置.
91 91
92 92 ##### `EXPANDROOT`=true
93 93 第一次运行时自动扩展根分区和文件系统.
94 94
95 95 ---
96 96
97 97 #### 键盘设置:
98 98 这些选项用来配置键盘布局文件 `/etc/default/keyboard` 影响控制台和X窗口. 将来可以在运行的系统中执行 `dpkg-reconfigure keyboard-configuration` 命令更改此项设置.
99 99
100 100 ##### `XKB_MODEL`=""
101 101 设置键盘类型, 大陆常见pc104.
102 102
103 103 ##### `XKB_LAYOUT`=""
104 104 设置键盘布局, 大陆常见us.
105 105
106 106 ##### `XKB_VARIANT`=""
107 107 设置键盘布局变种.
108 108
109 109 ##### `XKB_OPTIONS`=""
110 110 设置其它 XKB 配置选项.
111 111
112 112 ---
113 113
114 114 #### 网络设置 (动态):
115 115 设置网络为自动获取IP地址. 配置文件位于 `/etc/systemd/network/eth.network`. 在Debian `stretch`中, 默认位置更改为 `/lib/systemd/network`.
116 116
117 117 ##### `ENABLE_DHCP`=true
118 118 设置系统使用 DHCP 获取动态IP. 需要有一个 DHCP 服务器.
119 119
120 120 ---
121 121
122 122 #### 网络设置 (静态):
123 123 设置系统为手动配置IP地址. 配置文件位于 `/etc/systemd/network/eth.network`. 在Debian `stretch` 中, 默认位置更改为 `/lib/systemd/network`.
124 124 `ENABLE_DHCP`=false 时下面这些静态IP设置才起作用.
125 125
126 126 ##### `NET_ADDRESS`=""
127 127 设置静态 IPv4 或 IPv6, 使用CIDR "/"形式, 如 "192.169.0.3/24".
128 128
129 129 ##### `NET_GATEWAY`=""
130 130 设置默认网关的地址.
131 131
132 132 ##### `NET_DNS_1`=""
133 133 设置主域名服务器地址.
134 134
135 135 ##### `NET_DNS_2`=""
136 136 设置辅域名服务器地址.
137 137
138 138 ##### `NET_DNS_DOMAINS`=""
139 139 设置默认的域名搜索后缀, 当主机名称不是一个完整域名(FQDN)时使用.
140 140
141 141 ##### `NET_NTP_1`=""
142 142 设置主时间服务器地址.
143 143
144 144 ##### `NET_NTP_2`=""
145 145 设置辅时间服务器地址.
146 146
147 147 ---
148 148
149 149 #### 基本系统特性:
150 150 ##### `ENABLE_CONSOLE`=true
151 151 允许串行控制台接口. 没有连接显示器键盘的树莓派推荐打开, 此时如果网络无法连接至树莓派, 可以使用串行控制台连至系统.
152 152
153 153 ##### `ENABLE_I2C`=false
154 允许树莓派2/3的 I2C 接口. 请对照 [树莓派2/3 引脚示意图](http://elinux.org/RPi_Low-level_peripherals) 正确连接 GPIO 引脚.
154 允许树莓派2/3的 I2C 接口. 请对照 [树莓派2/3 引脚示意图](https://elinux.org/RPi_Low-level_peripherals) 正确连接 GPIO 引脚.
155 155
156 156 ##### `ENABLE_SPI`=false
157 允许树莓派2/3的 SPI 接口. 请对照 [树莓派2/3 引脚示意图](http://elinux.org/RPi_Low-level_peripherals) 正确连接 GPIO 引脚.
157 允许树莓派2/3的 SPI 接口. 请对照 [树莓派2/3 引脚示意图](https://elinux.org/RPi_Low-level_peripherals) 正确连接 GPIO 引脚.
158 158
159 159 ##### `ENABLE_IPV6`=true
160 160 允许 IPv6 . 通过 systemd-networkd 配置管理网络接口.
161 161
162 162 ##### `ENABLE_SSHD`=true
163 163 安装并且允许 OpenSSH 服务. 此服务默认禁止 `root` 用户远程登录. 使用普通用户 `pi` 远程登录然后使用 `su -``sudo` 来取得root权限.
164 164
165 165 ##### `ENABLE_NONFREE`=false
166 166 允许安装仓库中的 non-free 类的软件包. 需要安装闭源的固件, 二进制大对象 blob.
167 167
168 168 ##### `ENABLE_WIRELESS`=false
169 169 下载安装树莓派3无线接口所需要的闭源固件 二进制blob [树莓派3无线接口固件](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm). 如果 `RPI_MODEL` 不是 `3` 则忽略.
170 170
171 171 ##### `ENABLE_RSYSLOG`=true
172 172 如果设置为 false, 禁用并卸载 rsyslog, 则只能通过日志文件查看logs.
173 173
174 174 ##### `ENABLE_SOUND`=true
175 175 允许声卡并且安装 ALSA.
176 176
177 177 ##### `ENABLE_HWRANDOM`=true
178 178 允许硬件随机数发生器. 强随机数对大多数使用加密的网络通信是非常重要的. 推荐允许此设置.
179 179
180 180 ##### `ENABLE_MINGPU`=false
181 181 最小化显存 (16MB, no X), 目前无法完全禁用GPU.
182 182
183 183 ##### `ENABLE_DBUS`=true
184 184 安装并允许 D-Bus 消息总线. 虽然 systemd 可以在没有 D-bus的情况下工作, 但是推荐允许D-Bus.
185 185
186 186 ##### `ENABLE_XORG`=false
187 187 是否安装 Xorg, 开源 X11 系统.
188 188
189 189 ##### `ENABLE_WM`=""
190 190 安装用户指定的X Window 窗口管理器. 如果设置了`ENABLE_WM`, 系统确定所有被依赖的X11相关软件包都安装好了以后`ENABLE_XORG`会自动设置为true, `rpi23-gen-image.sh` 脚本已经通过下列窗口管理器的测试: `blackbox`, `openbox`, `fluxbox`, `jwm`, `dwm`, `xfce4`, `awesome`.
191 191
192 192 ---
193 193
194 194 #### 高级系统特性:
195 195 ##### `ENABLE_MINBASE`=false
196 196 使用 debootstrap 脚本变量 `minbase`, 只含有必不可少的核心包和apt. 体积大约 65 MB.
197 197
198 198 ##### `ENABLE_REDUCE`=false
199 199 卸载包、删除文件以减小体积 详情查看 `REDUCE_*` 参数.
200 200
201 201 ##### `ENABLE_UBOOT`=false
202 使用 [U-Boot 引导器](http://git.denx.de/?p=u-boot.git;a=summary) 替代树莓派2/3 默认的第二阶段引导器(bootcode.bin). U-Boot 可以通过网络使用 BOOTP/TFTP 协议引导镜像文件.
202 使用 [U-Boot 引导器](https://git.denx.de/?p=u-boot.git;a=summary) 替代树莓派2/3 默认的第二阶段引导器(bootcode.bin). U-Boot 可以通过网络使用 BOOTP/TFTP 协议引导镜像文件.
203 203
204 204 ##### `UBOOTSRC_DIR`=""
205 存放已下载 [U-Boot 引导器源文件](http://git.denx.de/?p=u-boot.git;a=summary) 的目录(`u-boot`).
205 存放已下载 [U-Boot 引导器源文件](https://git.denx.de/?p=u-boot.git;a=summary) 的目录(`u-boot`).
206 206
207 207 ##### `ENABLE_FBTURBO`=false
208 208 安装并且允许 [硬件加速的 Xorg 显卡驱动](https://github.com/ssvb/xf86-video-fbturbo) `fbturbo`. 当前仅支持窗口的移动和滚动的硬件加速.
209 209
210 210 ##### `FBTURBOSRC_DIR`=""
211 211 设置存放已下载的 [硬件加速的 Xorg 显卡驱动](https://github.com/ssvb/xf86-video-fbturbo) 的目录 (`xf86-video-fbturbo`) , 可以复制到chroot内配置、构建和安装.
212 212
213 213 ##### `ENABLE_IPTABLES`=false
214 214 允许 iptables 防火墙. 使用最简单的规则集: 允许所有出站连接;禁止除OpenSSH外的所有入站连接.
215 215
216 216 ##### `ENABLE_USER`=true
217 217 创建普通用户, 默认用户名`pi`, 默认密码raspberry. 可以使用 `USER_NAME`=user 更改默认用户名;使用 `USER_PASSWORD`=raspberry 更改默认密码.
218 218
219 219 ##### `USER_NAME`=pi
220 220 创建普通用户pi. 如果`ENABLE_USER`=false 此参数被忽略.
221 221
222 222 ##### `ENABLE_ROOT`=false
223 223 允许root用户登录, 需要设置 root 用户密码.
224 224
225 225 ##### `ENABLE_HARDNET`=false
226 226 允许加固 IPv4/IPv6 协议栈, 防止DoS攻击.
227 227
228 228 ##### `ENABLE_SPLITFS`=false
229 229 允许将根分区放在USB驱动器中. 将会生成两个镜像文件, 一个挂载为 `/boot/firmware` , 另一个挂载为 `/`.
230 230
231 231 ##### `CHROOT_SCRIPTS`=""
232 232 设置自定义脚本目录的路径, 该目录中的脚本在镜像文件构建完成之前在chroot中运行. 这个目录里的可执行文件按着字典序运行.
233 233
234 234 ##### `ENABLE_INITRAMFS`=false
235 235 创建 Linux 启动时加载的 initramfs .如果 `ENABLE_CRYPTFS`=true 那么 `ENABLE_INITRAMFS` 自动设为true . 如果 `BUILD_KERNEL`=false 此参数被忽略.
236 236
237 237 ##### `ENABLE_IFNAMES`=true
238 238 允许一致/可预测网络接口命名, 支持 Debian 发行版 `stretch``buster` .
239 239
240 240 ##### `DISABLE_UNDERVOLT_WARNINGS`=
241 241 禁止树莓派2/3 的低电压警告. 设为 `1` 禁止警告. 设为 `2` 额外允许低电压下的turbo增强模式.
242 242
243 243 ---
244 244
245 245 #### SSH 设置:
246 246 ##### `SSH_ENABLE_ROOT`=false
247 247 允许root通过密码验证方式远程登录系统. 如果没有修改默认密码, 这将是个巨大的安全隐患. `ENABLE_ROOT` 必须设为 `true`.
248 248
249 249 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
250 250 禁用SSH的密码验证方式, 只支持SSH (v2)的公钥认证.
251 251
252 252 ##### `SSH_LIMIT_USERS`=false
253 253 限制通过SSH远程登录的用户. 只允许由 `USER_NAME`=pi 参数创建的普通用户, 以及当 `SSH_ENABLE_ROOT`=true 时 root 用户远程登录. 如果使用的守护程序是 `dropbear` (通过 `REDUCE_SSHD`=true 设置) 则忽略此参数.
254 254
255 255 ##### `SSH_ROOT_PUB_KEY`=""
256 256 从指定文件(可包含多个公钥)添加 SSH (v2) 公钥到 `authorized_keys` 文件, 使得 `root` 用户可以使用SSH (v2)的公钥验证方式远程登录, 不支持SSH (v1). `ENABLE_ROOT` **和** `SSH_ENABLE_ROOT` 必须同时设为 `true`.
257 257
258 258 ##### `SSH_USER_PUB_KEY`=""
259 259 从指定文件(可包含多个公钥)添加 SSH (v2) 公钥到 `authorized_keys` 文件, 使得由 `USER_NAME`=pi 参数创建的普通用户可以使用SSH (v2)的公钥验证方式远程登录, 不支持SSH (v1).
260 260
261 261 ---
262 262
263 263 #### 内核编译:
264 264 ##### `BUILD_KERNEL`=false
265 265 构建安装最新的树莓派 2/3 Linux 内核, 当前只支持默认内核配置. 如果设置为树莓派`3`那么自动设置`BUILD_KERNEL`=true .
266 266
267 267 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
268 268 设置交叉编译器.
269 269
270 270 ##### `KERNEL_ARCH`="arm"
271 271 设置内核架构.
272 272
273 273 ##### `KERNEL_IMAGE`="kernel7.img"
274 274 内核镜像名称, 如果没有设置, 编译32位内核默认“kernel7.img” 64位内核默认 "kernel8.img".
275 275
276 276 ##### `KERNEL_BRANCH`=""
277 277 GIT里的树莓派内核源代码分支名称, 默认使用当前默认分支.
278 278
279 279 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
280 280 设置构建系统中的QEMU程序位置. 如果没有设置, 32位内核默认 “/usr/bin/qemu-arm-static” 64位内核默认 "/usr/bin/qemu-aarch64-static".
281 281
282 282 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
283 283 设置编译内核的默认配置. 如果没有设置, 32位内核默认"bcm2709_defconfig" 64位内核默认"bcmrpi3\_defconfig".
284 284
285 285 ##### `KERNEL_REDUCE`=false
286 286 缩小内核体积, 移除不想要的设备驱动、网络驱动和文件系统驱动 (实验性质).
287 287
288 288 ##### `KERNEL_THREADS`=1
289 289 编译内核时的并发线程数量. 如果使用默认设置, 系统会自动检测CPU的内核数量, 设置线程数量, 加速内核编译.
290 290
291 291 ##### `KERNEL_HEADERS`=true
292 292 安装内核相应的头文件.
293 293
294 294 ##### `KERNEL_MENUCONFIG`=false
295 295 运行`make menuconfig`使用菜单界面配置内核. 退出配置菜单后脚本继续运行.
296 296
297 297 ##### `KERNEL_REMOVESRC`=true
298 298 编译安装完成后, 删掉内核源代码, 产生的镜像不含内核源代码.
299 299
300 300 ##### `KERNELSRC_DIR`=""
301 301 已下载好的 [Github上的树莓派官方内核](https://github.com/raspberrypi/linux) 源码所在目录 (`linux`) 的路径, 可以复制到chroot内配置、构建和安装.
302 302
303 303 ##### `KERNELSRC_CLEAN`=false
304 304 当`KERNELSRC_DIR`被复制到 chroot 之后开始编译之前(使用 `make mrproper`)清理内核源代码. 如果 `KERNELSRC_DIR` 没有设置或者 `KERNELSRC_PREBUILT`=true时忽略此设置.
305 305
306 306 ##### `KERNELSRC_CONFIG`=true
307 307 在编译前使用 `make bcm2709_defconfig` (也可以选择 `make menuconfig`) 配置内核源代码. 如果`KERNELSRC_DIR`指定的源码存放目录不存在,这个参数自动设为 `true`. 如果 `KERNELSRC_PREBUILT`=true 忽略此参数.
308 308
309 309 ##### `KERNELSRC_USRCONFIG`=""
310 310 复制自己的配置文件到内核的 `.config`. 如果 `KERNEL_MENUCONFIG`=true 拷贝完成后自动运行 make menuconfig.
311 311
312 312 ##### `KERNELSRC_PREBUILT`=false
313 313 如果这个参数设为true 表示内核源代码目录中包含成功交叉编译好的内核. 忽略 `KERNELSRC_CLEAN`, `KERNELSRC_CONFIG`, `KERNELSRC_USRCONFIG` and `KERNEL_MENUCONFIG` 这四个参数,不再执行交叉编译操作.
314 314
315 315 ##### `RPI_FIRMWARE_DIR`=""
316 316 指定目录 (`firmware`) 含有已经从 [Github上的树莓派官方固件](https://github.com/raspberrypi/firmware)下载到本地的固件. 默认直接从网上下载最新的固件.
317 317
318 318 ---
319 319
320 320 #### 缩小体积:
321 321 如果 `ENABLE_REDUCE`=false 则忽略下列参数.
322 322
323 323 ##### `REDUCE_APT`=true
324 324 配置 APT,压缩仓库文件列表,不缓存下载的包文件.
325 325
326 326 ##### `REDUCE_DOC`=true
327 327 移除所有的doc文档文件(harsh). 配置 APT, 将来使用`apt-get`安装deb包时不包括doc文件.
328 328
329 329 ##### `REDUCE_MAN`=true
330 330 移除所有的man手册页和info文件 (harsh). 配置 APT, 将来使用`apt-get`安装deb包时不包括man手册页.
331 331
332 332 ##### `REDUCE_VIM`=false
333 333 使用vim的小型克隆 `levee` 替代 `vim-tiny`.
334 334
335 335 ##### `REDUCE_BASH`=false
336 336 使用 `dash` 代替 `bash` (实验性质).
337 337
338 338 ##### `REDUCE_HWDB`=true
339 339 移除与 PCI 相关的 hwdb 文件 (实验性质).
340 340
341 341 ##### `REDUCE_SSHD`=true
342 342 使用`dropbear`代替 `openssh-server`.
343 343
344 344 ##### `REDUCE_LOCALE`=true
345 345 移除所有的 `locale` 本地化文件.
346 346
347 347 ---
348 348
349 349 #### 加密根分区:
350 350 ##### `ENABLE_CRYPTFS`=false
351 351 使用dm-crypt进行全盘加密. 创建一个 LUKS 加密根分区 (加密方法 aes-xts-plain64:sha512) 并生成所需要的 initramfs. /boot 目录不会被加密. 当`BUILD_KERNEL`=false时忽略此参数. `ENABLE_CRYPTFS` 这个参数当前是实验性质的. SSH-to-initramfs 当前不支持,正在进行中.
352 352
353 353 ##### `CRYPTFS_PASSWORD`=""
354 354 设置根分区的加密密码. 如果 `ENABLE_CRYPTFS`=true,请务必设置此参数.
355 355
356 356 ##### `CRYPTFS_MAPPING`="secure"
357 357 设置device-mapper映射名称.
358 358
359 359 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
360 360 加密算法. 推荐 `aes-xts*`加密法.
361 361
362 362 ##### `CRYPTFS_XTSKEYSIZE`=512
363 363 设置密钥长度,8的倍数,以bit为单位.
364 364
365 365 ---
366 366
367 367 #### Build settings构建设置:
368 368 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
369 369 设置产生镜像的目录.
370 370
371 371 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
372 372 设置镜像文件名. 如果`ENABLE_SPLITFS`=false则文件名$IMAGE_NAME.img 如果`ENABLE_SPLITFS`=true则文件名$IMAGE_NAME-frmw.img 和 $IMAGE_NAME-root.img. 如果没有设置 `KERNEL_BRANCH` 则使用 "CURRENT" .
373 373
374 374 ## 理解脚本
375 375 制作镜像的每个阶段所实现的功能都由各自的脚本完成, 位于 `bootstrap.d` 目录. 按着字典序执行:
376 376
377 377 | 脚本 | 说明 |
378 378 | --- | --- |
379 379 | `10-bootstrap.sh` | 生成基本系统 |
380 380 | `11-apt.sh` | 设置 APT 仓库源 |
381 381 | `12-locale.sh` | 设置 Locales 和 keyboard |
382 382 | `13-kernel.sh` | 编译安装树莓派 2/3 内核 |
383 383 | `14-fstab.sh` | 设置 fstab 和 initramfs |
384 384 | `15-rpi-config.sh` | 设置 RPi2/3 config and cmdline |
385 385 | `20-networking.sh` | 设置网络 |
386 386 | `21-firewall.sh` | 设置防火墙 |
387 387 | `30-security.sh` | 设置用户以及安全相关 |
388 388 | `31-logging.sh` | 设置日志 |
389 389 | `32-sshd.sh` | 设置 SSH 和公钥 |
390 390 | `41-uboot.sh` | 编译设置 U-Boot |
391 391 | `42-fbturbo.sh` | 编译设置 fbturbo Xorg 驱动 |
392 392 | `50-firstboot.sh` | 首次启动执行的任务 |
393 393 | `99-reduce.sh` | 缩小体积 |
394 394
395 395 所有需要拷贝到镜像文件的配置文件都位于 `files` 目录. 最好不要手动更改这些配置文件.
396 396
397 397 | 目录 | 说明 |
398 398 | --- | --- |
399 399 | `apt` | APT 管理配置文件 |
400 400 | `boot` | 引导文件 树莓派2/3配置文件 |
401 401 | `dpkg` | 包管理配置文件 |
402 402 | `etc` | 配置文件以及 rc 启动脚本 |
403 403 | `firstboot` | 首次引导执行的脚本 |
404 404 | `initramfs` | Initramfs 脚本 |
405 405 | `iptables` | 防火墙配置文件 |
406 406 | `locales` | Locales 配置 |
407 407 | `modules` | 内核模块配置 |
408 408 | `mount` | Fstab 配置 |
409 409 | `network` | 网络配置文件 |
410 410 | `sysctl.d` | 交换文件以及IP协议加固配置文件 |
411 411 | `xorg` | fbturbo Xorg 驱动配置 |
412 412
413 413 ## 自定义包和脚本
414 414 `packages` 目录里放置自定义deb包, 比如系统仓库里没有的软件.在安装完系统仓库中的包之后安装. 自定义包所依赖的deb包会自动从系统仓库下载. 不要把自定义包添加到 `APT_INCLUDES` 参数中.
415 415 `custom.d` 目录中的脚本会在其它安装都完成后, 创建镜像文件之前执行.
416 416
417 417 ## 记录镜像产生过程的信息
418 418 所有镜像产生过程的信息、`rpi23-gen-image.sh` 脚本执行的命令都可以通过shell的 `script` 命令保存到日志文件中:
419 419
420 420 ```shell
421 421 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
422 422 ```
423 423
424 424 ## 烧录镜像文件
425 425 `rpi23-gen-image.sh` 所生成的镜像文件需要使用 `bmaptool``dd` 烧录到 microSD 卡. `bmaptool` 速度快比 `dd` 聪明.
426 426
427 427 ##### 烧录示例:
428 428 ```shell
429 429 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie.img /dev/mmcblk0
430 430 dd bs=4M if=./images/jessie/2017-01-23-rpi3-jessie.img of=/dev/mmcblk0
431 431 ```
432 432 如果设置过 `ENABLE_SPLITFS`, 烧录 `-frmw` 文件到 microSD 卡, 烧录 `-root` 文件到 USB 驱动器:
433 433 ```shell
434 434 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-frmw.img /dev/mmcblk0
435 435 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-root.img /dev/sdc
436 436 ```
437 437 ## 每周镜像
438 438 这些镜像由JRWR'S I/O PORT提供, 每周日午夜UTC 0点编译!
439 439 * [Debian Stretch Raspberry Pi2/3 周构建镜像](https://jrwr.io/doku.php?id=projects:debianpi)
440 440
441 441 ## External links and references外部链接, 各种资源
442 442 * [Debian 全世界镜像列表](https://www.debian.org/mirror/list)
443 443 * [Debian 树莓派 2 Wiki](https://wiki.debian.org/RaspberryPi2)
444 444 * [Debian 交叉工具链 Wiki](https://wiki.debian.org/CrossToolchains)
445 445 * [Github上的树莓派官方固件](https://github.com/raspberrypi/firmware)
446 446 * [Github上的树莓派官方内核](https://github.com/raspberrypi/linux)
447 * [U-BOOT git 仓库](http://git.denx.de/?p=u-boot.git;a=summary)
447 * [U-BOOT git 仓库](https://git.denx.de/?p=u-boot.git;a=summary)
448 448 * [Xorg DDX fbturbo驱动](https://github.com/ssvb/xf86-video-fbturbo)
449 449 * [树莓派3无线接口固件](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
450 450 * [Collabora 树莓派2预编译内核](https://repositories.collabora.co.uk/debian/)
@@ -1,453 +1,491
1 1 # rpi23-gen-image
2 2 ## Introduction
3 3
4 4 `rpi23-gen-image.sh` is an advanced Debian Linux bootstrapping shell script for generating Debian OS images for Raspberry Pi 2 (RPi2) and Raspberry Pi 3 (RPi3) computers. The script at this time supports the bootstrapping of the Debian (armhf) releases `jessie`, `stretch` and `buster`. Raspberry Pi 3 images are generated for 32-bit mode only. Raspberry Pi 3 64-bit images can be generated using custom configuration parameters (```templates/rpi3-stretch-arm64-4.11.y```).
5 5
6 6 ## Build dependencies
7 7 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.
8 8
9 9 ```debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo```
10 10
11 11 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.
12 12
13 13 The script has been tested using the default `crossbuild-essential-armhf` toolchain meta package on Debian Linux `jessie` and `stretch` build systems. Please check the [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains) for further information.
14 14
15 15 If a Debian Linux `jessie` build system is used it will be required to add the [Debian Cross-toolchains repository](http://emdebian.org/tools/debian/) first:
16 16
17 17 ```
18 18 echo "deb http://emdebian.org/tools/debian/ jessie main" > /etc/apt/sources.list.d/crosstools.list
19 19 sudo -u nobody wget -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
20 20 dpkg --add-architecture armhf
21 21 apt-get update
22 22 ```
23 23
24 24 ## Command-line parameters
25 25 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.
26 26
27 27 ##### Command-line examples:
28 28 ```shell
29 29 ENABLE_UBOOT=true ./rpi23-gen-image.sh
30 30 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
31 31 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
32 32 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
33 33 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
34 34 ENABLE_MINBASE=true ./rpi23-gen-image.sh
35 35 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
36 36 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
37 37 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
38 38 ENABLE_CRYPTFS=true CRYPTFS_PASSWORD=changeme EXPANDROOT=false ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
39 39 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
40 40 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
41 41 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
42 42 ```
43 43
44 44 ## Configuration template files
45 45 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.
46 46
47 47 ##### Command-line examples:
48 48 ```shell
49 49 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
50 50 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
51 51 ```
52 52
53 53 ## Supported parameters and settings
54 54 #### APT settings:
55 55 ##### `APT_SERVER`="ftp.debian.org"
56 56 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.
57 57
58 58 ##### `APT_PROXY`=""
59 59 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.
60 60
61 61 ##### `APT_INCLUDES`=""
62 62 A comma separated list of additional packages to be installed by debootstrap during bootstrapping.
63 63
64 64 ##### `APT_INCLUDES_LATE`=""
65 65 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.
66 66
67 67 ---
68 68
69 69 #### General system settings:
70 70 ##### `RPI_MODEL`=2
71 Specifiy the target Raspberry Pi hardware model. The script at this time supports the Raspberry Pi models `2` and `3`. `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` is used.
71 Specifiy the target Raspberry Pi hardware model. The script at this time supports the following Raspberry Pi models:
72 `0` = Used for Raspberry Pi 0 and Raspberry Pi 0 W
73 `1` = Used for Pi 1 model A and B
74 `1P` = Used for Pi 1 model B+ and A+
75 `2` = Used for Pi 2 model B
76 `3` = Used for Pi 3 model B
77 `3P` = Used for Pi 3 model B+
78 `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` or `3P` is used.
72 79
73 80 ##### `RELEASE`="jessie"
74 81 Set the desired Debian release name. The script at this time supports the bootstrapping of the Debian releases "jessie", "stretch" and "buster". `BUILD_KERNEL`=true will automatically be set if the Debian releases `stretch` or `buster` are used.
75 82
76 83 ##### `RELEASE_ARCH`="armhf"
77 84 Set the desired Debian release architecture.
78 85
79 86 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
80 87 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
81 88
82 89 ##### `PASSWORD`="raspberry"
83 90 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
84 91
85 92 ##### `USER_PASSWORD`="raspberry"
86 93 Set password for the created non-root user `USER_NAME`=pi. Ignored if `ENABLE_USER`=false. It's **STRONGLY** recommended that you choose a custom password.
87 94
88 95 ##### `DEFLOCAL`="en_US.UTF-8"
89 96 Set default system locale. This setting can also be changed inside the running OS using the `dpkg-reconfigure locales` command. Please note that on using this parameter the script will automatically install the required packages `locales`, `keyboard-configuration` and `console-setup`.
90 97
91 98 ##### `TIMEZONE`="Europe/Berlin"
92 99 Set default system timezone. All available timezones can be found in the `/usr/share/zoneinfo/` directory. This setting can also be changed inside the running OS using the `dpkg-reconfigure tzdata` command.
93 100
94 101 ##### `EXPANDROOT`=true
95 102 Expand the root partition and filesystem automatically on first boot.
96 103
104 ##### `ENABLE_QEMU`=false
105 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.
106
97 107 ---
98 108
99 109 #### Keyboard settings:
100 110 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.
101 111
102 112 ##### `XKB_MODEL`=""
103 113 Set the name of the model of your keyboard type.
104 114
105 115 ##### `XKB_LAYOUT`=""
106 116 Set the supported keyboard layout(s).
107 117
108 118 ##### `XKB_VARIANT`=""
109 119 Set the supported variant(s) of the keyboard layout(s).
110 120
111 121 ##### `XKB_OPTIONS`=""
112 122 Set extra xkb configuration options.
113 123
114 124 ---
115 125
116 126 #### Networking settings (DHCP):
117 127 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`.`
118 128
119 129 ##### `ENABLE_DHCP`=true
120 130 Set the system to use DHCP. This requires an DHCP server.
121 131
122 132 ---
123 133
124 134 #### Networking settings (static):
125 135 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`.
126 136
127 137 ##### `NET_ADDRESS`=""
128 138 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
129 139
130 140 ##### `NET_GATEWAY`=""
131 141 Set the IP address for the default gateway.
132 142
133 143 ##### `NET_DNS_1`=""
134 144 Set the IP address for the first DNS server.
135 145
136 146 ##### `NET_DNS_2`=""
137 147 Set the IP address for the second DNS server.
138 148
139 149 ##### `NET_DNS_DOMAINS`=""
140 150 Set the default DNS search domains to use for non fully qualified host names.
141 151
142 152 ##### `NET_NTP_1`=""
143 153 Set the IP address for the first NTP server.
144 154
145 155 ##### `NET_NTP_2`=""
146 156 Set the IP address for the second NTP server.
147 157
148 158 ---
149 159
150 160 #### Basic system features:
151 161 ##### `ENABLE_CONSOLE`=true
152 162 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.
153 163
154 164 ##### `ENABLE_I2C`=false
155 Enable I2C interface on the RPi2/3. Please check the [RPi2/3 pinout diagrams](http://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
165 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.
156 166
157 167 ##### `ENABLE_SPI`=false
158 Enable SPI interface on the RPi2/3. Please check the [RPi2/3 pinout diagrams](http://elinux.org/RPi_Low-level_peripherals) to connect the right GPIO pins.
168 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.
159 169
160 170 ##### `ENABLE_IPV6`=true
161 171 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
162 172
163 173 ##### `ENABLE_SSHD`=true
164 174 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.
165 175
166 176 ##### `ENABLE_NONFREE`=false
167 177 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.
168 178
169 179 ##### `ENABLE_WIRELESS`=false
170 180 Download and install the [closed-source firmware binary blob](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm) that is required to run the internal wireless interface of the Raspberry Pi model `3`. This parameter is ignored if the specified `RPI_MODEL` is not `3`.
171 181
172 182 ##### `ENABLE_RSYSLOG`=true
173 183 If set to false, disable and uninstall rsyslog (so logs will be available only
174 184 in journal files)
175 185
176 186 ##### `ENABLE_SOUND`=true
177 187 Enable sound hardware and install Advanced Linux Sound Architecture.
178 188
179 189 ##### `ENABLE_HWRANDOM`=true
180 190 Enable Hardware Random Number Generator. Strong random numbers are important for most network based communications that use encryption. It's recommended to be enabled.
181 191
182 192 ##### `ENABLE_MINGPU`=false
183 193 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
184 194
185 195 ##### `ENABLE_DBUS`=true
186 196 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
187 197
188 198 ##### `ENABLE_XORG`=false
189 199 Install Xorg open-source X Window System.
190 200
191 201 ##### `ENABLE_WM`=""
192 202 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`.
193 203
194 204 ---
195 205
196 206 #### Advanced system features:
197 207 ##### `ENABLE_MINBASE`=false
198 208 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
199 209
200 210 ##### `ENABLE_REDUCE`=false
201 211 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
202 212
203 213 ##### `ENABLE_UBOOT`=false
204 Replace the default RPi2/3 second stage bootloader (bootcode.bin) with [U-Boot bootloader](http://git.denx.de/?p=u-boot.git;a=summary). U-Boot can boot images via the network using the BOOTP/TFTP protocol.
214 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.
205 215
206 216 ##### `UBOOTSRC_DIR`=""
207 Path to a directory (`u-boot`) of [U-Boot bootloader sources](http://git.denx.de/?p=u-boot.git;a=summary) that will be copied, configured, build and installed inside the chroot.
217 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.
208 218
209 219 ##### `ENABLE_FBTURBO`=false
210 220 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.
211 221
212 222 ##### `FBTURBOSRC_DIR`=""
213 223 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.
214 224
215 225 ##### `ENABLE_IPTABLES`=false
216 226 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
217 227
218 228 ##### `ENABLE_USER`=true
219 229 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
220 230
221 231 ##### `USER_NAME`=pi
222 232 Non-root user to create. Ignored if `ENABLE_USER`=false
223 233
224 234 ##### `ENABLE_ROOT`=false
225 235 Set root user password so root login will be enabled
226 236
227 237 ##### `ENABLE_HARDNET`=false
228 238 Enable IPv4/IPv6 network stack hardening settings.
229 239
230 240 ##### `ENABLE_SPLITFS`=false
231 241 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
232 242
233 243 ##### `CHROOT_SCRIPTS`=""
234 244 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.
235 245
236 246 ##### `ENABLE_INITRAMFS`=false
237 247 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.
238 248
239 249 ##### `ENABLE_IFNAMES`=true
240 250 Enable automatic assignment of predictable, stable network interface names for all local Ethernet, WLAN interfaces. This might create complex and long interface names. This parameter is only supported if the Debian releases `stretch` or `buster` are used.
241 251
242 252 ##### `DISABLE_UNDERVOLT_WARNINGS`=
243 253 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.
244 254
245 255 ---
246 256
247 257 #### SSH settings:
248 258 ##### `SSH_ENABLE_ROOT`=false
249 259 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`.
250 260
251 261 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
252 262 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
253 263
254 264 ##### `SSH_LIMIT_USERS`=false
255 265 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).
256 266
257 267 ##### `SSH_ROOT_PUB_KEY`=""
258 268 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`.
259 269
260 270 ##### `SSH_USER_PUB_KEY`=""
261 271 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.
262 272
263 273 ---
264 274
265 275 #### Kernel compilation:
266 276 ##### `BUILD_KERNEL`=false
267 277 Build and install the latest RPi2/3 Linux kernel. Currently only the default RPi2/3 kernel configuration is used. `BUILD_KERNEL`=true will automatically be set if the Raspberry Pi model `3` is used.
268 278
269 279 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
270 280 This sets the cross compile enviornment for the compiler.
271 281
272 282 ##### `KERNEL_ARCH`="arm"
273 283 This sets the kernel architecture for the compiler.
274 284
275 285 ##### `KERNEL_IMAGE`="kernel7.img"
276 286 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.
277 287
278 288 ##### `KERNEL_BRANCH`=""
279 289 Name of the requested branch from the GIT location for the RPi Kernel. Default is using the current default branch from the GIT site.
280 290
281 291 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
282 292 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.
283 293
284 294 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
285 295 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
286 296
287 297 ##### `KERNEL_REDUCE`=false
288 298 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
289 299
290 300 ##### `KERNEL_THREADS`=1
291 301 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.
292 302
293 303 ##### `KERNEL_HEADERS`=true
294 304 Install kernel headers with built kernel.
295 305
296 306 ##### `KERNEL_MENUCONFIG`=false
297 307 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
298 308
309 ##### `KERNEL_OLDDEFCONFIG`=false
310 Run `make olddefconfig` to automatically set all new kernel configuration options to their recommended default values.
311
312 ##### `KERNEL_CCACHE`=false
313 Compile the kernel using ccache. This speeds up kernel recompilation by caching previous compilations and detecting when the same compilation is being done again.
314
299 315 ##### `KERNEL_REMOVESRC`=true
300 316 Remove all kernel sources from the generated OS image after it was built and installed.
301 317
302 318 ##### `KERNELSRC_DIR`=""
303 319 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.
304 320
305 321 ##### `KERNELSRC_CLEAN`=false
306 322 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.
307 323
308 324 ##### `KERNELSRC_CONFIG`=true
309 325 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.
310 326
311 327 ##### `KERNELSRC_USRCONFIG`=""
312 328 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
313 329
314 330 ##### `KERNELSRC_PREBUILT`=false
315 331 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.
316 332
317 333 ##### `RPI_FIRMWARE_DIR`=""
318 334 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.
319 335
320 336 ---
321 337
322 338 #### Reduce disk usage:
323 339 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
324 340
325 341 ##### `REDUCE_APT`=true
326 342 Configure APT to use compressed package repository lists and no package caching files.
327 343
328 344 ##### `REDUCE_DOC`=true
329 345 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
330 346
331 347 ##### `REDUCE_MAN`=true
332 348 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
333 349
334 350 ##### `REDUCE_VIM`=false
335 351 Replace `vim-tiny` package by `levee` a tiny vim clone.
336 352
337 353 ##### `REDUCE_BASH`=false
338 354 Remove `bash` package and switch to `dash` shell (experimental).
339 355
340 356 ##### `REDUCE_HWDB`=true
341 357 Remove PCI related hwdb files (experimental).
342 358
343 359 ##### `REDUCE_SSHD`=true
344 360 Replace `openssh-server` with `dropbear`.
345 361
346 362 ##### `REDUCE_LOCALE`=true
347 363 Remove all `locale` translation files.
348 364
349 365 ---
350 366
351 367 #### Encrypted root partition:
352 368 ##### `ENABLE_CRYPTFS`=false
353 369 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.
354 370
355 371 ##### `CRYPTFS_PASSWORD`=""
356 372 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
357 373
358 374 ##### `CRYPTFS_MAPPING`="secure"
359 375 Set name of dm-crypt managed device-mapper mapping.
360 376
361 377 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
362 378 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
363 379
364 380 ##### `CRYPTFS_XTSKEYSIZE`=512
365 381 Sets key size in bits. The argument has to be a multiple of 8.
366 382
367 383 ---
368 384
369 385 #### Build settings:
370 386 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
371 387 Set a path to a working directory used by the script to generate an image.
372 388
373 389 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
374 390 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.
375 391
376 392 ## Understanding the script
377 393 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:
378 394
379 395 | Script | Description |
380 396 | --- | --- |
381 397 | `10-bootstrap.sh` | Debootstrap basic system |
382 398 | `11-apt.sh` | Setup APT repositories |
383 399 | `12-locale.sh` | Setup Locales and keyboard settings |
384 400 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
385 401 | `14-fstab.sh` | Setup fstab and initramfs |
386 402 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
387 403 | `20-networking.sh` | Setup Networking |
388 404 | `21-firewall.sh` | Setup Firewall |
389 405 | `30-security.sh` | Setup Users and Security settings |
390 406 | `31-logging.sh` | Setup Logging |
391 407 | `32-sshd.sh` | Setup SSH and public keys |
392 408 | `41-uboot.sh` | Build and Setup U-Boot |
393 409 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
394 410 | `50-firstboot.sh` | First boot actions |
395 411 | `99-reduce.sh` | Reduce the disk space usage |
396 412
397 413 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.
398 414
399 415 | Directory | Description |
400 416 | --- | --- |
401 417 | `apt` | APT management configuration files |
402 418 | `boot` | Boot and RPi2/3 configuration files |
403 419 | `dpkg` | Package Manager configuration |
404 420 | `etc` | Configuration files and rc scripts |
405 421 | `firstboot` | Scripts that get executed on first boot |
406 422 | `initramfs` | Initramfs scripts |
407 423 | `iptables` | Firewall configuration files |
408 424 | `locales` | Locales configuration |
409 425 | `modules` | Kernel Modules configuration |
410 426 | `mount` | Fstab configuration |
411 427 | `network` | Networking configuration files |
412 428 | `sysctl.d` | Swapping and Network Hardening configuration |
413 429 | `xorg` | fbturbo Xorg driver configuration |
414 430
415 431 ## Custom packages and scripts
416 432 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`.
417 433
418 434 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
419 435
420 436 ## Logging of the bootstrapping process
421 437 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:
422 438
423 439 ```shell
424 440 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
425 441 ```
426 442
427 443 ## Flashing the image file
428 444 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`.
429 445
430 446 ##### Flashing examples:
431 447 ```shell
432 448 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie.img /dev/mmcblk0
433 449 dd bs=4M if=./images/jessie/2017-01-23-rpi3-jessie.img of=/dev/mmcblk0
434 450 ```
435 451 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
436 452 ```shell
437 453 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-frmw.img /dev/mmcblk0
438 454 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-root.img /dev/sdc
439 455 ```
456
457 ## QEMU emulation
458 Start QEMU full system emulation:
459 ```shell
460 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"
461 ```
462
463 Start QEMU full system emulation and output to console:
464 ```shell
465 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
466 ```
467
468 Start QEMU full system emulation with SMP and output to console:
469 ```shell
470 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
471 ```
472
473 Start QEMU full system emulation with cryptfs, initramfs and output to console:
474 ```shell
475 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
476 ```
477
440 478 ## Weekly image builds
441 479 The image files are provided by JRWR'S I/O PORT and are built once a Sunday at midnight UTC!
442 480 * [Debian Stretch Raspberry Pi2/3 Weekly Image Builds](https://jrwr.io/doku.php?id=projects:debianpi)
443 481
444 482 ## External links and references
445 483 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
446 484 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
447 485 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
448 486 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
449 487 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
450 * [U-BOOT git repository](http://git.denx.de/?p=u-boot.git;a=summary)
488 * [U-BOOT git repository](https://git.denx.de/?p=u-boot.git;a=summary)
451 489 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
452 490 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
453 491 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,185 +1,253
1 1 #
2 2 # Build and Setup RPi2/3 Kernel
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Fetch and build latest raspberry kernel
9 9 if [ "$BUILD_KERNEL" = true ] ; then
10 10 # Setup source directory
11 11 mkdir -p "${R}/usr/src/linux"
12 12
13 13 # Copy existing kernel sources into chroot directory
14 14 if [ -n "$KERNELSRC_DIR" ] && [ -d "$KERNELSRC_DIR" ] ; then
15 15 # Copy kernel sources and include hidden files
16 16 cp -r "${KERNELSRC_DIR}/". "${R}/usr/src/linux"
17 17
18 18 # Clean the kernel sources
19 19 if [ "$KERNELSRC_CLEAN" = true ] && [ "$KERNELSRC_PREBUILT" = false ] ; then
20 20 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" mrproper
21 21 fi
22 22 else # KERNELSRC_DIR=""
23 23 # Create temporary directory for kernel sources
24 24 temp_dir=$(as_nobody mktemp -d)
25 25
26 26 # Fetch current RPi2/3 kernel sources
27 27 if [ -z "${KERNEL_BRANCH}" ] ; then
28 as_nobody git -C "${temp_dir}" clone --depth=1 "${KERNEL_URL}" linux
28 as_nobody -H git -C "${temp_dir}" clone --depth=1 "${KERNEL_URL}" linux
29 29 else
30 as_nobody git -C "${temp_dir}" clone --depth=1 --branch "${KERNEL_BRANCH}" "${KERNEL_URL}" linux
30 as_nobody -H git -C "${temp_dir}" clone --depth=1 --branch "${KERNEL_BRANCH}" "${KERNEL_URL}" linux
31 31 fi
32 32
33 33 # Copy downloaded kernel sources
34 34 cp -r "${temp_dir}/linux/"* "${R}/usr/src/linux/"
35 35
36 36 # Remove temporary directory for kernel sources
37 37 rm -fr "${temp_dir}"
38 38
39 39 # Set permissions of the kernel sources
40 40 chown -R root:root "${R}/usr/src"
41 41 fi
42 42
43 43 # Calculate optimal number of kernel building threads
44 44 if [ "$KERNEL_THREADS" = "1" ] && [ -r /proc/cpuinfo ] ; then
45 45 KERNEL_THREADS=$(grep -c processor /proc/cpuinfo)
46 46 fi
47 47
48 48 # Configure and build kernel
49 49 if [ "$KERNELSRC_PREBUILT" = false ] ; then
50 50 # Remove device, network and filesystem drivers from kernel configuration
51 51 if [ "$KERNEL_REDUCE" = true ] ; then
52 52 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
53 53 sed -i\
54 54 -e "s/\(^CONFIG_SND.*\=\).*/\1n/"\
55 55 -e "s/\(^CONFIG_SOUND.*\=\).*/\1n/"\
56 56 -e "s/\(^CONFIG_AC97.*\=\).*/\1n/"\
57 57 -e "s/\(^CONFIG_VIDEO_.*\=\).*/\1n/"\
58 58 -e "s/\(^CONFIG_MEDIA_TUNER.*\=\).*/\1n/"\
59 59 -e "s/\(^CONFIG_DVB.*\=\)[ym]/\1n/"\
60 60 -e "s/\(^CONFIG_REISERFS.*\=\).*/\1n/"\
61 61 -e "s/\(^CONFIG_JFS.*\=\).*/\1n/"\
62 62 -e "s/\(^CONFIG_XFS.*\=\).*/\1n/"\
63 63 -e "s/\(^CONFIG_GFS2.*\=\).*/\1n/"\
64 64 -e "s/\(^CONFIG_OCFS2.*\=\).*/\1n/"\
65 65 -e "s/\(^CONFIG_BTRFS.*\=\).*/\1n/"\
66 66 -e "s/\(^CONFIG_HFS.*\=\).*/\1n/"\
67 67 -e "s/\(^CONFIG_JFFS2.*\=\)[ym]/\1n/"\
68 68 -e "s/\(^CONFIG_UBIFS.*\=\).*/\1n/"\
69 69 -e "s/\(^CONFIG_SQUASHFS.*\=\)[ym]/\1n/"\
70 70 -e "s/\(^CONFIG_W1.*\=\)[ym]/\1n/"\
71 71 -e "s/\(^CONFIG_HAMRADIO.*\=\).*/\1n/"\
72 72 -e "s/\(^CONFIG_CAN.*\=\).*/\1n/"\
73 73 -e "s/\(^CONFIG_IRDA.*\=\).*/\1n/"\
74 74 -e "s/\(^CONFIG_BT_.*\=\).*/\1n/"\
75 75 -e "s/\(^CONFIG_WIMAX.*\=\)[ym]/\1n/"\
76 76 -e "s/\(^CONFIG_6LOWPAN.*\=\).*/\1n/"\
77 77 -e "s/\(^CONFIG_IEEE802154.*\=\).*/\1n/"\
78 78 -e "s/\(^CONFIG_NFC.*\=\).*/\1n/"\
79 79 -e "s/\(^CONFIG_FB_TFT=.*\=\).*/\1n/"\
80 80 -e "s/\(^CONFIG_TOUCHSCREEN.*\=\).*/\1n/"\
81 81 -e "s/\(^CONFIG_USB_GSPCA_.*\=\).*/\1n/"\
82 82 -e "s/\(^CONFIG_DRM.*\=\).*/\1n/"\
83 83 "${KERNEL_DIR}/.config"
84 84 fi
85 85
86 86 if [ "$KERNELSRC_CONFIG" = true ] ; then
87 87 # Load default raspberry kernel configuration
88 88 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
89 89
90 # Set kernel configuration parameters to enable qemu emulation
91 if [ "$ENABLE_QEMU" = true ] ; then
92 echo "CONFIG_FHANDLE=y" >> ${KERNEL_DIR}/.config
93 echo "CONFIG_LBDAF=y" >> ${KERNEL_DIR}/.config
94
95 if [ "$ENABLE_CRYPTFS" = true ] ; then
96 echo "CONFIG_EMBEDDED=y" >> ${KERNEL_DIR}/.config
97 echo "CONFIG_EXPERT=y" >> ${KERNEL_DIR}/.config
98 echo "CONFIG_DAX=y" >> ${KERNEL_DIR}/.config
99 echo "CONFIG_MD=y" >> ${KERNEL_DIR}/.config
100 echo "CONFIG_BLK_DEV_MD=y" >> ${KERNEL_DIR}/.config
101 echo "CONFIG_MD_AUTODETECT=y" >> ${KERNEL_DIR}/.config
102 echo "CONFIG_BLK_DEV_DM=y" >> ${KERNEL_DIR}/.config
103 echo "CONFIG_BLK_DEV_DM_BUILTIN=y" >> ${KERNEL_DIR}/.config
104 echo "CONFIG_DM_CRYPT=y" >> ${KERNEL_DIR}/.config
105 echo "CONFIG_CRYPTO_BLKCIPHER=y" >> ${KERNEL_DIR}/.config
106 echo "CONFIG_CRYPTO_CBC=y" >> ${KERNEL_DIR}/.config
107 echo "CONFIG_CRYPTO_XTS=y" >> ${KERNEL_DIR}/.config
108 echo "CONFIG_CRYPTO_SHA512=y" >> ${KERNEL_DIR}/.config
109 echo "CONFIG_CRYPTO_MANAGER=y" >> ${KERNEL_DIR}/.config
110 fi
111 fi
112
113 # Copy custom kernel configuration file
90 114 if [ ! -z "$KERNELSRC_USRCONFIG" ] ; then
91 115 cp $KERNELSRC_USRCONFIG ${KERNEL_DIR}/.config
92 116 fi
93 117
118 # Set kernel configuration parameters to their default values
119 if [ "$KERNEL_OLDDEFCONFIG" = true ] ; then
120 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" olddefconfig
121 fi
122
94 123 # Start menu-driven kernel configuration (interactive)
95 124 if [ "$KERNEL_MENUCONFIG" = true ] ; then
96 125 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" menuconfig
97 126 fi
98 127 fi
99 128
100 # Cross compile kernel and modules
101 make -C "${KERNEL_DIR}" -j${KERNEL_THREADS} ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_BIN_IMAGE}" modules dtbs
129 # Use ccache to cross compile the kernel
130 if [ "$KERNEL_CCACHE" = true ] ; then
131 cc="ccache ${CROSS_COMPILE}gcc"
132 else
133 cc="${CROSS_COMPILE}gcc"
134 fi
135
136 # Cross compile kernel and dtbs
137 make -C "${KERNEL_DIR}" -j${KERNEL_THREADS} ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" CC="${cc}" "${KERNEL_BIN_IMAGE}" dtbs
138
139 # Cross compile kernel modules
140 if [ $(grep "CONFIG_MODULES=y" "${KERNEL_DIR}/.config") ] ; then
141 make -C "${KERNEL_DIR}" -j${KERNEL_THREADS} ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" CC="${cc}" modules
142 fi
102 143 fi
103 144
104 145 # Check if kernel compilation was successful
105 146 if [ ! -r "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" ] ; then
106 147 echo "error: kernel compilation failed! (kernel image not found)"
107 148 cleanup
108 149 exit 1
109 150 fi
110 151
111 152 # Install kernel modules
112 153 if [ "$ENABLE_REDUCE" = true ] ; then
113 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=../../.. modules_install
154 if [ $(grep "CONFIG_MODULES=y" "${KERNEL_DIR}/.config") ] ; then
155 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=../../.. modules_install
156 fi
114 157 else
115 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_PATH=../../.. modules_install
158 if [ $(grep "CONFIG_MODULES=y" "${KERNEL_DIR}/.config") ] ; then
159 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_PATH=../../.. modules_install
160 fi
116 161
117 162 # Install kernel firmware
118 if [ $(cat ./Makefile | grep "^firmware_install:") ] ; then
163 if [ $(grep "^firmware_install:" "${KERNEL_DIR}/Makefile") ] ; then
119 164 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_FW_PATH=../../../lib firmware_install
120 165 fi
121 166 fi
122 167
123 168 # Install kernel headers
124 169 if [ "$KERNEL_HEADERS" = true ] && [ "$KERNEL_REDUCE" = false ] ; then
125 170 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_HDR_PATH=../.. headers_install
126 171 fi
127 172
128 173 # Prepare boot (firmware) directory
129 174 mkdir "${BOOT_DIR}"
130 175
131 176 # Get kernel release version
132 177 KERNEL_VERSION=`cat "${KERNEL_DIR}/include/config/kernel.release"`
133 178
134 179 # Copy kernel configuration file to the boot directory
135 180 install_readonly "${KERNEL_DIR}/.config" "${R}/boot/config-${KERNEL_VERSION}"
136 181
137 # Copy dts and dtb device tree sources and binaries
182 # Prepare device tree directory
138 183 mkdir "${BOOT_DIR}/overlays"
139 184
140 185 # Ensure the proper .dtb is located
141 186 if [ "$KERNEL_ARCH" = "arm" ] ; then
142 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/"*.dtb "${BOOT_DIR}/"
187 for dtb in "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/"*.dtb ; do
188 if [ -f "${dtb}" ] ; then
189 install_readonly "${dtb}" "${BOOT_DIR}/"
190 fi
191 done
143 192 else
144 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/broadcom/"*.dtb "${BOOT_DIR}/"
193 for dtb in "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/broadcom/"*.dtb ; do
194 if [ -f "${dtb}" ] ; then
195 install_readonly "${dtb}" "${BOOT_DIR}/"
196 fi
197 done
145 198 fi
146 199
147 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/"*.dtb* "${BOOT_DIR}/overlays/"
148 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/README" "${BOOT_DIR}/overlays/README"
200 # Copy compiled dtb device tree files
201 if [ -d "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays" ] ; then
202 for dtb in "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/"*.dtb ; do
203 if [ -f "${dtb}" ] ; then
204 install_readonly "${dtb}" "${BOOT_DIR}/overlays/"
205 fi
206 done
207
208 if [ -f "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/README" ] ; then
209 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/README" "${BOOT_DIR}/overlays/README"
210 fi
211 fi
149 212
150 213 if [ "$ENABLE_UBOOT" = false ] ; then
151 214 # Convert and copy kernel image to the boot directory
152 215 "${KERNEL_DIR}/scripts/mkknlimg" "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
153 216 else
154 217 # Copy kernel image to the boot directory
155 218 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
156 219 fi
157 220
158 221 # Remove kernel sources
159 222 if [ "$KERNEL_REMOVESRC" = true ] ; then
160 223 rm -fr "${KERNEL_DIR}"
161 224 else
162 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" modules_prepare
225 # Prepare compiled kernel modules
226 if [ $(grep "CONFIG_MODULES=y" "${KERNEL_DIR}/.config") ] ; then
227 if [ $(grep "^modules_prepare:" "${KERNEL_DIR}/Makefile") ] ; then
228 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" modules_prepare
229 fi
163 230
164 # Create symlinks for kernel modules
165 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/build"
166 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/source"
231 # Create symlinks for kernel modules
232 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/build"
233 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/source"
234 fi
167 235 fi
168 236
169 237 else # BUILD_KERNEL=false
170 238 # Kernel installation
171 239 chroot_exec apt-get -qq -y --no-install-recommends install linux-image-"${COLLABORA_KERNEL}" raspberrypi-bootloader-nokernel
172 240
173 241 # Install flash-kernel last so it doesn't try (and fail) to detect the platform in the chroot
174 242 chroot_exec apt-get -qq -y install flash-kernel
175 243
176 244 # Check if kernel installation was successful
177 245 VMLINUZ="$(ls -1 ${R}/boot/vmlinuz-* | sort | tail -n 1)"
178 246 if [ -z "$VMLINUZ" ] ; then
179 247 echo "error: kernel installation failed! (/boot/vmlinuz-* not found)"
180 248 cleanup
181 249 exit 1
182 250 fi
183 251 # Copy vmlinuz kernel to the boot directory
184 252 install_readonly "${VMLINUZ}" "${BOOT_DIR}/${KERNEL_IMAGE}"
185 253 fi
@@ -1,56 +1,59
1 1 #
2 2 # Setup fstab and initramfs
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Install and setup fstab
9 9 install_readonly files/mount/fstab "${ETC_DIR}/fstab"
10 10
11 11 # Add usb/sda disk root partition to fstab
12 12 if [ "$ENABLE_SPLITFS" = true ] && [ "$ENABLE_CRYPTFS" = false ] ; then
13 13 sed -i "s/mmcblk0p2/sda1/" "${ETC_DIR}/fstab"
14 14 fi
15 15
16 16 # Add encrypted root partition to fstab and crypttab
17 17 if [ "$ENABLE_CRYPTFS" = true ] ; then
18 18 # Replace fstab root partition with encrypted partition mapping
19 19 sed -i "s/mmcblk0p2/mapper\/${CRYPTFS_MAPPING}/" "${ETC_DIR}/fstab"
20 20
21 21 # Add encrypted partition to crypttab and fstab
22 22 install_readonly files/mount/crypttab "${ETC_DIR}/crypttab"
23 echo "${CRYPTFS_MAPPING} /dev/mmcblk0p2 none luks" >> "${ETC_DIR}/crypttab"
23 echo "${CRYPTFS_MAPPING} /dev/mmcblk0p2 none luks,initramfs" >> "${ETC_DIR}/crypttab"
24 24
25 25 if [ "$ENABLE_SPLITFS" = true ] ; then
26 26 # Add usb/sda disk to crypttab
27 27 sed -i "s/mmcblk0p2/sda1/" "${ETC_DIR}/crypttab"
28 28 fi
29 29 fi
30 30
31 31 # Generate initramfs file
32 32 if [ "$BUILD_KERNEL" = true ] && [ "$ENABLE_INITRAMFS" = true ] ; then
33 33 if [ "$ENABLE_CRYPTFS" = true ] ; then
34 34 # Include initramfs scripts to auto expand encrypted root partition
35 35 if [ "$EXPANDROOT" = true ] ; then
36 36 install_exec files/initramfs/expand_encrypted_rootfs "${ETC_DIR}/initramfs-tools/scripts/init-premount/expand_encrypted_rootfs"
37 37 install_exec files/initramfs/expand-premount "${ETC_DIR}/initramfs-tools/scripts/local-premount/expand-premount"
38 38 install_exec files/initramfs/expand-tools "${ETC_DIR}/initramfs-tools/hooks/expand-tools"
39 39 fi
40 40
41 41 # Disable SSHD inside initramfs
42 42 printf "#\n# DROPBEAR: [ y | n ]\n#\n\nDROPBEAR=n\n" >> "${ETC_DIR}/initramfs-tools/initramfs.conf"
43 43
44 # Add cryptsetup modules to initramfs
45 printf "#\n# CRYPTSETUP: [ y | n ]\n#\n\nCRYPTSETUP=y\n" >> "${ETC_DIR}/initramfs-tools/conf-hook"
46
44 47 # Dummy mapping required by mkinitramfs
45 48 echo "0 1 crypt $(echo ${CRYPTFS_CIPHER} | cut -d ':' -f 1) ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 0 7:0 4096" | chroot_exec dmsetup create "${CRYPTFS_MAPPING}"
46 49
47 50 # Generate initramfs with encrypted root partition support
48 51 chroot_exec mkinitramfs -o "/boot/firmware/initramfs-${KERNEL_VERSION}" "${KERNEL_VERSION}"
49 52
50 53 # Remove dummy mapping
51 54 chroot_exec cryptsetup close "${CRYPTFS_MAPPING}"
52 55 else
53 56 # Generate initramfs without encrypted root partition support
54 57 chroot_exec mkinitramfs -o "/boot/firmware/initramfs-${KERNEL_VERSION}" "${KERNEL_VERSION}"
55 58 fi
56 59 fi
@@ -1,107 +1,134
1 1 #
2 2 # Setup Networking
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Install and setup hostname
9 9 install_readonly files/network/hostname "${ETC_DIR}/hostname"
10 10 sed -i "s/^rpi2-jessie/${HOSTNAME}/" "${ETC_DIR}/hostname"
11 11
12 12 # Install and setup hosts
13 13 install_readonly files/network/hosts "${ETC_DIR}/hosts"
14 14 sed -i "s/rpi2-jessie/${HOSTNAME}/" "${ETC_DIR}/hosts"
15 15
16 16 # Setup hostname entry with static IP
17 17 if [ "$NET_ADDRESS" != "" ] ; then
18 18 NET_IP=$(echo "${NET_ADDRESS}" | cut -f 1 -d'/')
19 19 sed -i "s/^127.0.1.1/${NET_IP}/" "${ETC_DIR}/hosts"
20 20 fi
21 21
22 22 # Remove IPv6 hosts
23 23 if [ "$ENABLE_IPV6" = false ] ; then
24 24 sed -i -e "/::[1-9]/d" -e "/^$/d" "${ETC_DIR}/hosts"
25 25 fi
26 26
27 27 # Install hint about network configuration
28 28 install_readonly files/network/interfaces "${ETC_DIR}/network/interfaces"
29 29
30 30 # Install configuration for interface eth0
31 31 install_readonly files/network/eth.network "${ETC_DIR}/systemd/network/eth.network"
32 32
33 # Install configuration for interface wl*
34 install_readonly files/network/wlan.network "${ETC_DIR}/systemd/network/wlan.network"
35
36 #always with dhcp since wpa_supplicant integration is missing
37 sed -i -e "s/DHCP=.*/DHCP=yes/" -e "/DHCP/q" "${ETC_DIR}/systemd/network/wlan.network"
38
33 39 if [ "$ENABLE_DHCP" = true ] ; then
34 40 # Enable DHCP configuration for interface eth0
35 41 sed -i -e "s/DHCP=.*/DHCP=yes/" -e "/DHCP/q" "${ETC_DIR}/systemd/network/eth.network"
36
42
37 43 # Set DHCP configuration to IPv4 only
38 44 if [ "$ENABLE_IPV6" = false ] ; then
39 45 sed -i "s/DHCP=.*/DHCP=v4/" "${ETC_DIR}/systemd/network/eth.network"
40 46 fi
41 47
42 48 else # ENABLE_DHCP=false
43 49 # Set static network configuration for interface eth0
44 50 sed -i\
45 51 -e "s|DHCP=.*|DHCP=no|"\
46 52 -e "s|Address=\$|Address=${NET_ADDRESS}|"\
47 53 -e "s|Gateway=\$|Gateway=${NET_GATEWAY}|"\
48 54 -e "0,/DNS=\$/ s|DNS=\$|DNS=${NET_DNS_1}|"\
49 55 -e "0,/DNS=\$/ s|DNS=\$|DNS=${NET_DNS_2}|"\
50 56 -e "s|Domains=\$|Domains=${NET_DNS_DOMAINS}|"\
51 57 -e "0,/NTP=\$/ s|NTP=\$|NTP=${NET_NTP_1}|"\
52 58 -e "0,/NTP=\$/ s|NTP=\$|NTP=${NET_NTP_2}|"\
53 59 "${ETC_DIR}/systemd/network/eth.network"
54 60 fi
55 61
56 62 # Remove empty settings from network configuration
57 63 sed -i "/.*=\$/d" "${ETC_DIR}/systemd/network/eth.network"
64 # Remove empty settings from wlan configuration
65 sed -i "/.*=\$/d" "${ETC_DIR}/systemd/network/wlan.network"
58 66
59 67 # Move systemd network configuration if required by Debian release
60 68 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
61 69 mv -v "${ETC_DIR}/systemd/network/eth.network" "${LIB_DIR}/systemd/network/10-eth.network"
70 if [ "$ENABLE_WIRELESS" = true ] ; then
71 mv -v "${ETC_DIR}/systemd/network/wlan.network" "${LIB_DIR}/systemd/network/11-wlan.network"
72 fi
62 73 rm -fr "${ETC_DIR}/systemd/network"
63 74 fi
64 75
65 76 # Enable systemd-networkd service
66 77 chroot_exec systemctl enable systemd-networkd
67 78
68 79 # Install host.conf resolver configuration
69 80 install_readonly files/network/host.conf "${ETC_DIR}/host.conf"
70 81
71 82 # Enable network stack hardening
72 83 if [ "$ENABLE_HARDNET" = true ] ; then
73 84 # Install sysctl.d configuration files
74 85 install_readonly files/sysctl.d/82-rpi-net-hardening.conf "${ETC_DIR}/sysctl.d/82-rpi-net-hardening.conf"
75 86
76 87 # Setup resolver warnings about spoofed addresses
77 88 sed -i "s/^# spoof warn/spoof warn/" "${ETC_DIR}/host.conf"
78 89 fi
79 90
80 91 # Enable time sync
81 92 if [ "NET_NTP_1" != "" ] ; then
82 93 chroot_exec systemctl enable systemd-timesyncd.service
83 94 fi
84 95
85 96 # Download the firmware binary blob required to use the RPi3 wireless interface
86 97 if [ "$ENABLE_WIRELESS" = true ] ; then
87 98 if [ ! -d ${WLAN_FIRMWARE_DIR} ] ; then
88 mkdir -p ${WLAN_FIRMWARE_DIR}
99 mkdir -p ${WLAN_FIRMWARE_DIR}
89 100 fi
90 101
91 102 # Create temporary directory for firmware binary blob
92 103 temp_dir=$(as_nobody mktemp -d)
93 104
94 # Fetch firmware binary blob
105 # Fetch firmware binary blob for RPI3B+
106 if [ "$RPI_MODEL" = 3P ] ; then
107 as_nobody wget -q -O "${temp_dir}/brcmfmac43455-sdio.bin" "${WLAN_FIRMWARE_URL}/brcmfmac43455-sdio.bin"
108 as_nobody wget -q -O "${temp_dir}/brcmfmac43455-sdio.txt" "${WLAN_FIRMWARE_URL}/brcmfmac43455-sdio.txt"
109 as_nobody wget -q -O "${temp_dir}/brcmfmac43455-sdio.clm_blob" "${WLAN_FIRMWARE_URL}/brcmfmac43455-sdio.clm_blob"
110 else
111 # Fetch firmware binary blob for RPI3
95 112 as_nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.bin" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.bin"
96 113 as_nobody wget -q -O "${temp_dir}/brcmfmac43430-sdio.txt" "${WLAN_FIRMWARE_URL}/brcmfmac43430-sdio.txt"
97
114 fi
115
98 116 # Move downloaded firmware binary blob
117 if [ "$RPI_MODEL" = 3P ] ; then
118 mv "${temp_dir}/brcmfmac43455-sdio."* "${WLAN_FIRMWARE_DIR}/"
119 else
99 120 mv "${temp_dir}/brcmfmac43430-sdio."* "${WLAN_FIRMWARE_DIR}/"
100
121 fi
122
101 123 # Remove temporary directory for firmware binary blob
102 124 rm -fr "${temp_dir}"
103 125
104 126 # Set permissions of the firmware binary blob
127 if [ "$RPI_MODEL" = 3P ] ; then
128 chown root:root "${WLAN_FIRMWARE_DIR}/brcmfmac43455-sdio."*
129 chmod 600 "${WLAN_FIRMWARE_DIR}/brcmfmac43455-sdio."*
130 else
105 131 chown root:root "${WLAN_FIRMWARE_DIR}/brcmfmac43430-sdio."*
106 132 chmod 600 "${WLAN_FIRMWARE_DIR}/brcmfmac43430-sdio."*
133 fi
107 134 fi
@@ -1,83 +1,88
1 1 #
2 2 # Build and Setup U-Boot
3 3 #
4 4
5 5 # Load utility functions
6 6 . ./functions.sh
7 7
8 8 # Fetch and build U-Boot bootloader
9 9 if [ "$ENABLE_UBOOT" = true ] ; then
10 10 # Install c/c++ build environment inside the chroot
11 11 chroot_install_cc
12 12
13 13 # Copy existing U-Boot sources into chroot directory
14 14 if [ -n "$UBOOTSRC_DIR" ] && [ -d "$UBOOTSRC_DIR" ] ; then
15 15 # Copy local U-Boot sources
16 16 cp -r "${UBOOTSRC_DIR}" "${R}/tmp"
17 17 else
18 18 # Create temporary directory for U-Boot sources
19 19 temp_dir=$(as_nobody mktemp -d)
20 20
21 21 # Fetch U-Boot sources
22 22 as_nobody git -C "${temp_dir}" clone "${UBOOT_URL}"
23 23
24 24 # Copy downloaded U-Boot sources
25 25 mv "${temp_dir}/u-boot" "${R}/tmp/"
26 26
27 27 # Set permissions of the U-Boot sources
28 28 chown -R root:root "${R}/tmp/u-boot"
29 29
30 30 # Remove temporary directory for U-Boot sources
31 31 rm -fr "${temp_dir}"
32 32 fi
33 33
34 34 # Build and install U-Boot inside chroot
35 35 chroot_exec make -j${KERNEL_THREADS} -C /tmp/u-boot/ ${UBOOT_CONFIG} all
36 36
37 37 # Copy compiled bootloader binary and set config.txt to load it
38 38 install_exec "${R}/tmp/u-boot/tools/mkimage" "${R}/usr/sbin/mkimage"
39 39 install_readonly "${R}/tmp/u-boot/u-boot.bin" "${BOOT_DIR}/u-boot.bin"
40 40 printf "\n# boot u-boot kernel\nkernel=u-boot.bin\n" >> "${BOOT_DIR}/config.txt"
41 41
42 42 # Install and setup U-Boot command file
43 43 install_readonly files/boot/uboot.mkimage "${BOOT_DIR}/uboot.mkimage"
44 44 printf "# Set the kernel boot command line\nsetenv bootargs \"earlyprintk ${CMDLINE}\"\n\n$(cat ${BOOT_DIR}/uboot.mkimage)" > "${BOOT_DIR}/uboot.mkimage"
45 45
46 46 if [ "$ENABLE_INITRAMFS" = true ] ; then
47 47 # Convert generated initramfs for U-Boot using mkimage
48 48 chroot_exec /usr/sbin/mkimage -A "${KERNEL_ARCH}" -T ramdisk -C none -n "initramfs-${KERNEL_VERSION}" -d "/boot/firmware/initramfs-${KERNEL_VERSION}" "/boot/firmware/initramfs-${KERNEL_VERSION}.uboot"
49 49
50 50 # Remove original initramfs file
51 51 rm -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}"
52 52
53 53 # Configure U-Boot to load generated initramfs
54 54 printf "# Set initramfs file\nsetenv initramfs initramfs-${KERNEL_VERSION}.uboot\n\n$(cat ${BOOT_DIR}/uboot.mkimage)" > "${BOOT_DIR}/uboot.mkimage"
55 55 printf "\nbootz \${kernel_addr_r} \${ramdisk_addr_r} \${fdt_addr_r}" >> "${BOOT_DIR}/uboot.mkimage"
56 56 else # ENABLE_INITRAMFS=false
57 57 # Remove initramfs from U-Boot mkfile
58 58 sed -i '/.*initramfs.*/d' "${BOOT_DIR}/uboot.mkimage"
59 59
60 60 if [ "$BUILD_KERNEL" = false ] ; then
61 61 # Remove dtbfile from U-Boot mkfile
62 62 sed -i '/.*dtbfile.*/d' "${BOOT_DIR}/uboot.mkimage"
63 63 printf "\nbootz \${kernel_addr_r}" >> "${BOOT_DIR}/uboot.mkimage"
64 64 else
65 65 printf "\nbootz \${kernel_addr_r} - \${fdt_addr_r}" >> "${BOOT_DIR}/uboot.mkimage"
66 66 fi
67 67 fi
68 68
69 69 # Set mkfile to use the correct dtb file
70 70 sed -i "s/^\(setenv dtbfile \).*/\1${DTB_FILE}/" "${BOOT_DIR}/uboot.mkimage"
71 71
72 # Set mkfile to use the correct mach id
73 if [ "$ENABLE_QEMU" = true ] ; then
74 sed -i "s/^\(setenv machid \).*/\10x000008e0/" "${BOOT_DIR}/uboot.mkimage"
75 fi
76
72 77 # Set mkfile to use kernel image
73 78 sed -i "s/^\(fatload mmc 0:1 \${kernel_addr_r} \).*/\1${KERNEL_IMAGE}/" "${BOOT_DIR}/uboot.mkimage"
74 79
75 80 # Remove all leading blank lines
76 81 sed -i "/./,\$!d" "${BOOT_DIR}/uboot.mkimage"
77 82
78 83 # Generate U-Boot bootloader image
79 84 chroot_exec /usr/sbin/mkimage -A "${KERNEL_ARCH}" -O linux -T script -C none -a 0x00000000 -e 0x00000000 -n "RPi${RPI_MODEL}" -d /boot/firmware/uboot.mkimage /boot/firmware/boot.scr
80 85
81 86 # Remove U-Boot sources
82 87 rm -fr "${R}/tmp/u-boot"
83 88 fi
@@ -1,85 +1,96
1 1 #!/bin/sh
2 2 # expand_encrypted_rootfs initramfs-tools boot script
3 3
4 4 # dependencies: grep awk cut tail fdisk parted e2fsck resize2fs
5 5
6 6 set -e
7 7
8 8 # Wait for USB devices to be ready
9 9 sleep 5
10 10
11 11 # Use initramfs utility functions
12 12 if [ -r "/scripts/functions" ] ; then
13 13 . /scripts/functions
14 14 fi
15 15
16 16 # Check for cryptdevice variable
17 17 if [ -z "$cryptdevice" ] ; then
18 18 echo "unable to get cryptdevice variable (init-premount)"
19 19 return 1
20 20 fi
21 21
22 22 # Detect root partition device
23 23 ROOT_PART=$(echo $cryptdevice | awk -F"/|:" '{ print $3 }')
24 24 if [ -z "$ROOT_PART" ] ; then
25 25 log_warning_msg "unable to detect encrypted root partition device (cryptdevice)"
26 26 return 1
27 27 fi
28 28
29 29 # Extract root device name
30 30 case "${ROOT_PART}" in
31 31 mmcblk0*) ROOT_DEV=mmcblk0 ;;
32 32 sda*) ROOT_DEV=sda ;;
33 33 esac
34 34
35 35 # Check detected root partition name
36 36 PART_NUM=$(echo ${ROOT_PART} | grep -o '[1-9][0-9]*$')
37 37 if [ "$PART_NUM" = "$ROOT_PART" ] ; then
38 38 log_warning_msg "$ROOT_PART is not an SD card. Don't know how to expand"
39 39 return 1
40 40 fi
41 41
42 42 # NOTE: the NOOBS partition layout confuses parted. For now, let's only
43 43 # agree to work with a sufficiently simple partition layout
44 44 if [ "$PART_NUM" -gt 2 ] ; then
45 45 log_warning_msg "Your partition layout is not currently supported by this tool."
46 46 return 1
47 47 fi
48 48
49 49 # Check if last partition number
50 50 LAST_PART_NUM=$(parted /dev/${ROOT_DEV} -ms unit s p | tail -n 1 | cut -f 1 -d:)
51 51 if [ $LAST_PART_NUM -ne $PART_NUM ]; then
52 52 log_warning_msg "$ROOT_PART is not the last partition. Don't know how to expand"
53 53 return 1
54 54 fi
55 55
56 56 # Get the starting offset of the root partition
57 57 PART_START=$(parted /dev/${ROOT_DEV} -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g')
58 58 if [ -z "$PART_START" ] ; then
59 59 log_warning_msg "${ROOT_DEV} unable to get starting sector of the partition"
60 60 return 1
61 61 fi
62 62
63 # Get the current last sector of the root partition
64 PART_END=$(parted /dev/${ROOT_DEV} -ms unit s p | grep "^${PART_NUM}" | cut -f 3 -d: | sed 's/[^0-9]//g')
65 if [ -z "$PART_END" ] ; then
66 log_warning_msg "${ROOT_DEV} unable to get last sector of the partition"
67 return 1
68 fi
69
63 70 # Get the possible last sector for the root partition
64 71 PART_LAST=$(fdisk -l /dev/${ROOT_DEV} | grep '^Disk.*sectors' | awk '{ print $7 - 1 }')
65 72 if [ -z "$PART_LAST" ] ; then
66 log_warning_msg "${ROOT_DEV} unable to get last sector of the partition"
73 log_warning_msg "${ROOT_DEV} unable to get last possible sector of the partition"
67 74 return 1
68 75 fi
69 76
70 77 ### Since rc.local is run with "sh -e", let's add "|| true" to prevent premature exit
71 fdisk /dev/${ROOT_DEV} 2> /dev/null <<EOF2 || true
78 if [ $PART_END != $PART_LAST ] ; then
79 fdisk /dev/${ROOT_DEV} 2> /dev/null <<EOF2 || true
72 80 p
73 81 d
74 82 $PART_NUM
75 83 n
76 84 p
77 85 $PART_NUM
78 86 $PART_START
79 87 $PART_LAST
80 88 p
81 89 w
82 90 EOF2
83 91
84 partprobe
85 log_success_msg "Root partition successfully resized."
92 partprobe
93 log_success_msg "Root partition successfully resized."
94 else
95 log_success_msg "Root partition already resized."
96 fi
@@ -1,657 +1,774
1 1 #!/bin/sh
2 2
3 3 ########################################################################
4 4 # rpi23-gen-image.sh 2015-2017
5 5 #
6 6 # Advanced Debian "jessie", "stretch" and "buster" bootstrap script for RPi2/3
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 # Copyright (C) 2015 Jan Wagner <mail@jwagner.eu>
14 14 #
15 15 # Big thanks for patches and enhancements by 20+ github contributors!
16 16 ########################################################################
17 17
18 18 # Are we running as root?
19 19 if [ "$(id -u)" -ne "0" ] ; then
20 20 echo "error: this script must be executed with root privileges!"
21 21 exit 1
22 22 fi
23 23
24 24 # Check if ./functions.sh script exists
25 25 if [ ! -r "./functions.sh" ] ; then
26 26 echo "error: './functions.sh' required script not found!"
27 27 exit 1
28 28 fi
29 29
30 30 # Load utility functions
31 31 . ./functions.sh
32 32
33 33 # Load parameters from configuration template file
34 34 if [ ! -z "$CONFIG_TEMPLATE" ] ; then
35 35 use_template
36 36 fi
37 37
38 38 # Introduce settings
39 39 set -e
40 40 echo -n -e "\n#\n# RPi2/3 Bootstrap Settings\n#\n"
41 41 set -x
42 42
43 43 # Raspberry Pi model configuration
44 44 RPI_MODEL=${RPI_MODEL:=2}
45
46 #bcm2708-rpi-0-w.dtb (Used for Pi 0 and PI 0W)
47 RPI0_DTB_FILE=${RPI0_DTB_FILE:=bcm2708-rpi-0-w.dtb}
48 RPI0_UBOOT_CONFIG=${RPI0_UBOOT_CONFIG:=rpi_defconfig}
49
50 #bcm2708-rpi-b.dtb (Used for Pi 1 model A and B)
51 RPI1_DTB_FILE=${RPI1_DTB_FILE:=bcm2708-rpi-b.dtb}
52 RPI1_UBOOT_CONFIG=${RPI1_UBOOT_CONFIG:=rpi_defconfig}
53
54 #bcm2708-rpi-b-plus.dtb (Used for Pi 1 model B+ and A+)
55 RPI1P_DTB_FILE=${RPI1P_DTB_FILE:=bcm2708-rpi-b-plus.dtb}
56 RPI1P_UBOOT_CONFIG=${RPI1P_UBOOT_CONFIG:=rpi_defconfig}
57
58 #bcm2709-rpi-2-b.dtb (Used for Pi 2 model B)
45 59 RPI2_DTB_FILE=${RPI2_DTB_FILE:=bcm2709-rpi-2-b.dtb}
46 60 RPI2_UBOOT_CONFIG=${RPI2_UBOOT_CONFIG:=rpi_2_defconfig}
61
62 #bcm2710-rpi-3-b.dtb (Used for Pi 3 model B)
47 63 RPI3_DTB_FILE=${RPI3_DTB_FILE:=bcm2710-rpi-3-b.dtb}
48 64 RPI3_UBOOT_CONFIG=${RPI3_UBOOT_CONFIG:=rpi_3_32b_defconfig}
49 65
66 #bcm2710-rpi-3-b-plus.dtb (Used for Pi 3 model B+)
67 RPI3P_DTB_FILE=${RPI3P_DTB_FILE:=bcm2710-rpi-3-b-plus.dtb}
68 RPI3P_UBOOT_CONFIG=${RPI3P_UBOOT_CONFIG:=rpi_3_32b_defconfig}
69
50 70 # Debian release
51 71 RELEASE=${RELEASE:=jessie}
52 72 KERNEL_ARCH=${KERNEL_ARCH:=arm}
53 73 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
54 74 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
55 75 COLLABORA_KERNEL=${COLLABORA_KERNEL:=3.18.0-trunk-rpi2}
56 76 if [ "$KERNEL_ARCH" = "arm64" ] ; then
57 77 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
58 78 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
79 fi
80
81 if [ "$RPI_MODEL" = 0 ] || [ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] ; then
82 #RASPBERRY PI 1, PI ZERO, PI ZERO W, AND COMPUTE MODULE DEFAULT Kernel BUILD CONFIGURATION
83 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi_defconfig}
84 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
59 85 else
86 #RASPBERRY PI 2, PI 3, PI 3+, AND COMPUTE MODULE 3 DEFAULT Kernel BUILD CONFIGURATION
87 #https://www.raspberrypi.org/documentation/linux/kernel/building.md
60 88 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
61 89 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
62 90 fi
91
63 92 if [ "$RELEASE_ARCH" = "arm64" ] ; then
64 93 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
65 94 else
66 95 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
67 96 fi
68 97 KERNEL_BRANCH=${KERNEL_BRANCH:=""}
69 98
70 99 # URLs
71 100 KERNEL_URL=${KERNEL_URL:=https://github.com/raspberrypi/linux}
72 101 FIRMWARE_URL=${FIRMWARE_URL:=https://github.com/raspberrypi/firmware/raw/master/boot}
73 102 WLAN_FIRMWARE_URL=${WLAN_FIRMWARE_URL:=https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm}
74 103 COLLABORA_URL=${COLLABORA_URL:=https://repositories.collabora.co.uk/debian}
75 104 FBTURBO_URL=${FBTURBO_URL:=https://github.com/ssvb/xf86-video-fbturbo.git}
76 UBOOT_URL=${UBOOT_URL:=git://git.denx.de/u-boot.git}
105 UBOOT_URL=${UBOOT_URL:=https://git.denx.de/u-boot.git}
77 106
78 107 # Build directories
79 108 BASEDIR=${BASEDIR:=$(pwd)/images/${RELEASE}}
80 109 BUILDDIR="${BASEDIR}/build"
81 110
82 111 # Prepare date string for default image file name
83 112 DATE="$(date +%Y-%m-%d)"
84 113 if [ -z "$KERNEL_BRANCH" ] ; then
85 114 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
86 115 else
87 116 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
88 117 fi
89 118
90 119 # Chroot directories
91 120 R="${BUILDDIR}/chroot"
92 121 ETC_DIR="${R}/etc"
93 122 LIB_DIR="${R}/lib"
94 123 BOOT_DIR="${R}/boot/firmware"
95 124 KERNEL_DIR="${R}/usr/src/linux"
96 125 WLAN_FIRMWARE_DIR="${R}/lib/firmware/brcm"
97 126
98 127 # Firmware directory: Blank if download from github
99 128 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
100 129
101 130 # General settings
102 131 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
103 132 PASSWORD=${PASSWORD:=raspberry}
104 133 USER_PASSWORD=${USER_PASSWORD:=raspberry}
105 134 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
106 135 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
107 136 EXPANDROOT=${EXPANDROOT:=true}
108 137
109 138 # Keyboard settings
110 139 XKB_MODEL=${XKB_MODEL:=""}
111 140 XKB_LAYOUT=${XKB_LAYOUT:=""}
112 141 XKB_VARIANT=${XKB_VARIANT:=""}
113 142 XKB_OPTIONS=${XKB_OPTIONS:=""}
114 143
115 144 # Network settings (DHCP)
116 145 ENABLE_DHCP=${ENABLE_DHCP:=true}
117 146
118 147 # Network settings (static)
119 148 NET_ADDRESS=${NET_ADDRESS:=""}
120 149 NET_GATEWAY=${NET_GATEWAY:=""}
121 150 NET_DNS_1=${NET_DNS_1:=""}
122 151 NET_DNS_2=${NET_DNS_2:=""}
123 152 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
124 153 NET_NTP_1=${NET_NTP_1:=""}
125 154 NET_NTP_2=${NET_NTP_2:=""}
126 155
127 156 # APT settings
128 157 APT_PROXY=${APT_PROXY:=""}
129 158 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
130 159
131 160 # Feature settings
132 161 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
133 162 ENABLE_I2C=${ENABLE_I2C:=false}
134 163 ENABLE_SPI=${ENABLE_SPI:=false}
135 164 ENABLE_IPV6=${ENABLE_IPV6:=true}
136 165 ENABLE_SSHD=${ENABLE_SSHD:=true}
137 166 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
138 167 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
139 168 ENABLE_SOUND=${ENABLE_SOUND:=true}
140 169 ENABLE_DBUS=${ENABLE_DBUS:=true}
141 170 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
142 171 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
143 172 ENABLE_XORG=${ENABLE_XORG:=false}
144 173 ENABLE_WM=${ENABLE_WM:=""}
145 174 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
146 175 ENABLE_USER=${ENABLE_USER:=true}
147 176 USER_NAME=${USER_NAME:="pi"}
148 177 ENABLE_ROOT=${ENABLE_ROOT:=false}
178 ENABLE_QEMU=${ENABLE_QEMU:=false}
149 179
150 180 # SSH settings
151 181 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
152 182 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
153 183 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
154 184 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
155 185 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
156 186
157 187 # Advanced settings
158 188 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
159 189 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
160 190 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
161 191 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
162 192 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
163 193 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
164 194 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
165 195 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
166 196 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
167 197 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
168 198 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
169 199 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
170 200
171 201 # Kernel compilation settings
172 202 BUILD_KERNEL=${BUILD_KERNEL:=false}
173 203 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
174 204 KERNEL_THREADS=${KERNEL_THREADS:=1}
175 205 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
176 206 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
177 207 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
208 KERNEL_OLDDEFCONFIG=${KERNEL_OLDDEFCONFIG:=false}
209 KERNEL_CCACHE=${KERNEL_CCACHE:=false}
210
178 211 if [ "$KERNEL_ARCH" = "arm64" ] ; then
179 212 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
180 213 else
181 214 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
182 215 fi
183 216
184 217 # Kernel compilation from source directory settings
185 218 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
186 219 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
187 220 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
188 221 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
189 222
190 223 # Reduce disk usage settings
191 224 REDUCE_APT=${REDUCE_APT:=true}
192 225 REDUCE_DOC=${REDUCE_DOC:=true}
193 226 REDUCE_MAN=${REDUCE_MAN:=true}
194 227 REDUCE_VIM=${REDUCE_VIM:=false}
195 228 REDUCE_BASH=${REDUCE_BASH:=false}
196 229 REDUCE_HWDB=${REDUCE_HWDB:=true}
197 230 REDUCE_SSHD=${REDUCE_SSHD:=true}
198 231 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
199 232
200 233 # Encrypted filesystem settings
201 234 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
202 235 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
203 236 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
204 237 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
205 238 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
206 239
207 # Stop the Crypto Wars
208 DISABLE_FBI=${DISABLE_FBI:=false}
209
210 240 # Chroot scripts directory
211 241 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
212 242
213 243 # Packages required in the chroot build environment
214 244 APT_INCLUDES=${APT_INCLUDES:=""}
215 245 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils"
216 246
217 247 # Packages required for bootstrapping
218 248 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
219 249 MISSING_PACKAGES=""
220 250
221 251 # Packages installed for c/c++ build environment in chroot (keep empty)
222 252 COMPILER_PACKAGES=""
223 253
224 254 set +x
225 255
226 256 # Set Raspberry Pi model specific configuration
227 if [ "$RPI_MODEL" = 2 ] ; then
257 if [ "$RPI_MODEL" = 0 ] ; then
258 DTB_FILE=${RPI0_DTB_FILE}
259 UBOOT_CONFIG=${RPI0_UBOOT_CONFIG}
260 elif [ "$RPI_MODEL" = 1 ] ; then
261 DTB_FILE=${RPI1_DTB_FILE}
262 UBOOT_CONFIG=${RPI1_UBOOT_CONFIG}
263 elif [ "$RPI_MODEL" = 1P ] ; then
264 DTB_FILE=${RPI1P_DTB_FILE}
265 UBOOT_CONFIG=${RPI1P_UBOOT_CONFIG}
266 elif [ "$RPI_MODEL" = 2 ] ; then
228 267 DTB_FILE=${RPI2_DTB_FILE}
229 268 UBOOT_CONFIG=${RPI2_UBOOT_CONFIG}
230 269 elif [ "$RPI_MODEL" = 3 ] ; then
231 270 DTB_FILE=${RPI3_DTB_FILE}
232 271 UBOOT_CONFIG=${RPI3_UBOOT_CONFIG}
233 BUILD_KERNEL=true
272 elif [ "$RPI_MODEL" = 3P ] ; then
273 DTB_FILE=${RPI3P_DTB_FILE}
274 UBOOT_CONFIG=${RPI3P_UBOOT_CONFIG}
234 275 else
235 276 echo "error: Raspberry Pi model ${RPI_MODEL} is not supported!"
236 277 exit 1
237 278 fi
238 279
239 280 # Check if the internal wireless interface is supported by the RPi model
240 if [ "$ENABLE_WIRELESS" = true ] && [ "$RPI_MODEL" != 3 ] ; then
281 if [ "$ENABLE_WIRELESS" = true ] && ([ "$RPI_MODEL" = 1 ] || [ "$RPI_MODEL" = 1P ] || [ "$RPI_MODEL" = 2 ]); then
282
241 283 echo "error: The selected Raspberry Pi model has no internal wireless interface"
242 284 exit 1
243 fi
285 fi
244 286
245 287 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
246 288 if [ ! -z "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
247 289 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
248 290 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
249 291 exit 1
250 292 fi
251 293 fi
252 294
253 295 # Build RPi2/3 Linux kernel if required by Debian release
254 296 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
255 297 BUILD_KERNEL=true
256 298 fi
257 299
258 300 # Add packages required for kernel cross compilation
259 301 if [ "$BUILD_KERNEL" = true ] ; then
260 302 if [ "$KERNEL_ARCH" = "arm" ] ; then
261 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
262 else
263 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
303 if [ "$RELEASE_ARCH" = "armel" ]; then
304 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armel"
305 fi
306 if [ "$RELEASE_ARCH" = "armhf" ]; then
307 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
308 fi
309 if [ "$RELEASE_ARCH" = "arm64" ]; then
310 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
311 fi
264 312 fi
265 313 fi
266 314
267 315 # Add libncurses5 to enable kernel menuconfig
268 316 if [ "$KERNEL_MENUCONFIG" = true ] ; then
269 317 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses5-dev"
270 318 fi
271 319
272 # Stop the Crypto Wars
273 if [ "$DISABLE_FBI" = true ] ; then
274 ENABLE_CRYPTFS=true
320 # Add ccache compiler cache for (faster) kernel cross (re)compilation
321 if [ "$KERNEL_CCACHE" = true ] ; then
322 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} ccache"
275 323 fi
276 324
277 325 # Add cryptsetup package to enable filesystem encryption
278 326 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
279 327 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
280 APT_INCLUDES="${APT_INCLUDES},cryptsetup"
328 APT_INCLUDES="${APT_INCLUDES},cryptsetup,busybox,console-setup"
281 329
282 330 if [ -z "$CRYPTFS_PASSWORD" ] ; then
283 331 echo "error: no password defined (CRYPTFS_PASSWORD)!"
284 332 exit 1
285 333 fi
286 334 ENABLE_INITRAMFS=true
287 335 fi
288 336
289 337 # Add initramfs generation tools
290 338 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
291 339 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
292 340 fi
293 341
294 342 # Add device-tree-compiler required for building the U-Boot bootloader
295 343 if [ "$ENABLE_UBOOT" = true ] ; then
296 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler"
344 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler,bison,flex"
297 345 fi
298 346
299 347 # Check if root SSH (v2) public key file exists
300 348 if [ ! -z "$SSH_ROOT_PUB_KEY" ] ; then
301 349 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
302 350 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
303 351 exit 1
304 352 fi
305 353 fi
306 354
307 355 # Check if $USER_NAME SSH (v2) public key file exists
308 356 if [ ! -z "$SSH_USER_PUB_KEY" ] ; then
309 357 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
310 358 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
311 359 exit 1
312 360 fi
313 361 fi
314 362
315 363 # Check if all required packages are installed on the build system
316 364 for package in $REQUIRED_PACKAGES ; do
317 365 if [ "`dpkg-query -W -f='${Status}' $package`" != "install ok installed" ] ; then
318 366 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
319 367 fi
320 368 done
321 369
322 370 # If there are missing packages ask confirmation for install, or exit
323 371 if [ -n "$MISSING_PACKAGES" ] ; then
324 372 echo "the following packages needed by this script are not installed:"
325 373 echo "$MISSING_PACKAGES"
326 374
327 375 echo -n "\ndo you want to install the missing packages right now? [y/n] "
328 376 read confirm
329 377 [ "$confirm" != "y" ] && exit 1
330 378
331 379 # Make sure all missing required packages are installed
332 380 apt-get -qq -y install ${MISSING_PACKAGES}
333 381 fi
334 382
335 383 # Check if ./bootstrap.d directory exists
336 384 if [ ! -d "./bootstrap.d/" ] ; then
337 385 echo "error: './bootstrap.d' required directory not found!"
338 386 exit 1
339 387 fi
340 388
341 389 # Check if ./files directory exists
342 390 if [ ! -d "./files/" ] ; then
343 391 echo "error: './files' required directory not found!"
344 392 exit 1
345 393 fi
346 394
347 395 # Check if specified KERNELSRC_DIR directory exists
348 396 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
349 397 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
350 398 exit 1
351 399 fi
352 400
353 401 # Check if specified UBOOTSRC_DIR directory exists
354 402 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
355 403 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
356 404 exit 1
357 405 fi
358 406
359 407 # Check if specified FBTURBOSRC_DIR directory exists
360 408 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
361 409 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
362 410 exit 1
363 411 fi
364 412
365 413 # Check if specified CHROOT_SCRIPTS directory exists
366 414 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
367 415 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
368 416 exit 1
369 417 fi
370 418
371 419 # Check if specified device mapping already exists (will be used by cryptsetup)
372 420 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
373 421 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
374 422 exit 1
375 423 fi
376 424
377 425 # Don't clobber an old build
378 426 if [ -e "$BUILDDIR" ] ; then
379 427 echo "error: directory ${BUILDDIR} already exists, not proceeding"
380 428 exit 1
381 429 fi
382 430
383 431 # Setup chroot directory
384 432 mkdir -p "${R}"
385 433
386 434 # Check if build directory has enough of free disk space >512MB
387 435 if [ "$(df --output=avail ${BUILDDIR} | sed "1d")" -le "524288" ] ; then
388 436 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
389 437 exit 1
390 438 fi
391 439
392 440 set -x
393 441
394 442 # Call "cleanup" function on various signals and errors
395 443 trap cleanup 0 1 2 3 6
396 444
397 445 # Add required packages for the minbase installation
398 446 if [ "$ENABLE_MINBASE" = true ] ; then
399 447 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
400 448 fi
401 449
402 450 # Add required locales packages
403 451 if [ "$DEFLOCAL" != "en_US.UTF-8" ] ; then
404 452 APT_INCLUDES="${APT_INCLUDES},locales,keyboard-configuration,console-setup"
405 453 fi
406 454
407 455 # Add parted package, required to get partprobe utility
408 456 if [ "$EXPANDROOT" = true ] ; then
409 457 APT_INCLUDES="${APT_INCLUDES},parted"
410 458 fi
411 459
412 460 # Add dbus package, recommended if using systemd
413 461 if [ "$ENABLE_DBUS" = true ] ; then
414 462 APT_INCLUDES="${APT_INCLUDES},dbus"
415 463 fi
416 464
417 465 # Add iptables IPv4/IPv6 package
418 466 if [ "$ENABLE_IPTABLES" = true ] ; then
419 467 APT_INCLUDES="${APT_INCLUDES},iptables"
420 468 fi
421 469
422 470 # Add openssh server package
423 471 if [ "$ENABLE_SSHD" = true ] ; then
424 472 APT_INCLUDES="${APT_INCLUDES},openssh-server"
425 473 fi
426 474
427 475 # Add alsa-utils package
428 476 if [ "$ENABLE_SOUND" = true ] ; then
429 477 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
430 478 fi
431 479
432 480 # Add rng-tools package
433 481 if [ "$ENABLE_HWRANDOM" = true ] ; then
434 482 APT_INCLUDES="${APT_INCLUDES},rng-tools"
435 483 fi
436 484
437 485 # Add fbturbo video driver
438 486 if [ "$ENABLE_FBTURBO" = true ] ; then
439 487 # Enable xorg package dependencies
440 488 ENABLE_XORG=true
441 489 fi
442 490
443 491 # Add user defined window manager package
444 492 if [ -n "$ENABLE_WM" ] ; then
445 493 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
446 494
447 495 # Enable xorg package dependencies
448 496 ENABLE_XORG=true
449 497 fi
450 498
451 499 # Add xorg package
452 500 if [ "$ENABLE_XORG" = true ] ; then
453 501 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
454 502 fi
455 503
456 504 # Replace selected packages with smaller clones
457 505 if [ "$ENABLE_REDUCE" = true ] ; then
458 506 # Add levee package instead of vim-tiny
459 507 if [ "$REDUCE_VIM" = true ] ; then
460 508 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
461 509 fi
462 510
463 511 # Add dropbear package instead of openssh-server
464 512 if [ "$REDUCE_SSHD" = true ] ; then
465 513 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/openssh-server/dropbear/")"
466 514 fi
467 515 fi
468 516
469 517 if [ "$RELEASE" != "jessie" ] ; then
470 518 APT_INCLUDES="${APT_INCLUDES},libnss-systemd"
471 519 fi
472 520
473 521 # Configure kernel sources if no KERNELSRC_DIR
474 522 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
475 523 KERNELSRC_CONFIG=true
476 524 fi
477 525
478 526 # Configure reduced kernel
479 527 if [ "$KERNEL_REDUCE" = true ] ; then
480 528 KERNELSRC_CONFIG=false
481 529 fi
482 530
531 # Configure qemu compatible kernel
532 if [ "$ENABLE_QEMU" = true ] ; then
533 DTB_FILE=vexpress-v2p-ca15_a7.dtb
534 UBOOT_CONFIG=vexpress_ca15_tc2_defconfig
535 KERNEL_DEFCONFIG="vexpress_defconfig"
536 if [ "$KERNEL_MENUCONFIG" = false ] ; then
537 KERNEL_OLDDEFCONFIG=true
538 fi
539 fi
540
483 541 # Execute bootstrap scripts
484 542 for SCRIPT in bootstrap.d/*.sh; do
485 543 head -n 3 "$SCRIPT"
486 544 . "$SCRIPT"
487 545 done
488 546
489 547 ## Execute custom bootstrap scripts
490 548 if [ -d "custom.d" ] ; then
491 549 for SCRIPT in custom.d/*.sh; do
492 550 . "$SCRIPT"
493 551 done
494 552 fi
495 553
496 554 # Execute custom scripts inside the chroot
497 555 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
498 556 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
499 557 chroot_exec /bin/bash -x <<'EOF'
500 558 for SCRIPT in /chroot_scripts/* ; do
501 559 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
502 560 $SCRIPT
503 561 fi
504 562 done
505 563 EOF
506 564 rm -rf "${R}/chroot_scripts"
507 565 fi
508 566
509 567 # Remove c/c++ build environment from the chroot
510 568 chroot_remove_cc
511 569
512 570 # Remove apt-utils
513 571 if [ "$RELEASE" = "jessie" ] ; then
514 572 chroot_exec apt-get purge -qq -y --force-yes apt-utils
515 573 fi
516 574
517 575 # Generate required machine-id
518 576 MACHINE_ID=$(dbus-uuidgen)
519 577 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
520 578 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
521 579
522 580 # APT Cleanup
523 581 chroot_exec apt-get -y clean
524 582 chroot_exec apt-get -y autoclean
525 583 chroot_exec apt-get -y autoremove
526 584
527 585 # Unmount mounted filesystems
528 586 umount -l "${R}/proc"
529 587 umount -l "${R}/sys"
530 588
531 589 # Clean up directories
532 590 rm -rf "${R}/run/*"
533 591 rm -rf "${R}/tmp/*"
534 592
535 593 # Clean up files
536 594 rm -f "${ETC_DIR}/ssh/ssh_host_*"
537 595 rm -f "${ETC_DIR}/dropbear/dropbear_*"
538 596 rm -f "${ETC_DIR}/apt/sources.list.save"
539 597 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
540 598 rm -f "${ETC_DIR}/*-"
541 599 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
542 600 rm -f "${ETC_DIR}/resolv.conf"
543 601 rm -f "${R}/root/.bash_history"
544 602 rm -f "${R}/var/lib/urandom/random-seed"
545 603 rm -f "${R}/initrd.img"
546 604 rm -f "${R}/vmlinuz"
547 605 rm -f "${R}${QEMU_BINARY}"
548 606
607 if [ "$ENABLE_QEMU" = true ] ; then
608 # Setup QEMU directory
609 mkdir "${BASEDIR}/qemu"
610
611 # Copy kernel image to QEMU directory
612 install_readonly "${BOOT_DIR}/${KERNEL_IMAGE}" "${BASEDIR}/qemu/${KERNEL_IMAGE}"
613
614 # Copy kernel config to QEMU directory
615 install_readonly "${R}/boot/config-${KERNEL_VERSION}" "${BASEDIR}/qemu/config-${KERNEL_VERSION}"
616
617 # Copy kernel dtbs to QEMU directory
618 for dtb in "${BOOT_DIR}/"*.dtb ; do
619 if [ -f "${dtb}" ] ; then
620 install_readonly "${dtb}" "${BASEDIR}/qemu/"
621 fi
622 done
623
624 # Copy kernel overlays to QEMU directory
625 if [ -d "${BOOT_DIR}/overlays" ] ; then
626 # Setup overlays dtbs directory
627 mkdir "${BASEDIR}/qemu/overlays"
628
629 for dtb in "${BOOT_DIR}/overlays/"*.dtb ; do
630 if [ -f "${dtb}" ] ; then
631 install_readonly "${dtb}" "${BASEDIR}/qemu/overlays/"
632 fi
633 done
634 fi
635
636 # Copy u-boot files to QEMU directory
637 if [ "$ENABLE_UBOOT" = true ] ; then
638 if [ -f "${BOOT_DIR}/u-boot.bin" ] ; then
639 install_readonly "${BOOT_DIR}/u-boot.bin" "${BASEDIR}/qemu/u-boot.bin"
640 fi
641 if [ -f "${BOOT_DIR}/uboot.mkimage" ] ; then
642 install_readonly "${BOOT_DIR}/uboot.mkimage" "${BASEDIR}/qemu/uboot.mkimage"
643 fi
644 if [ -f "${BOOT_DIR}/boot.scr" ] ; then
645 install_readonly "${BOOT_DIR}/boot.scr" "${BASEDIR}/qemu/boot.scr"
646 fi
647 fi
648
649 # Copy initramfs to QEMU directory
650 if [ -f "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" ] ; then
651 install_readonly "${BOOT_DIR}/initramfs-${KERNEL_VERSION}" "${BASEDIR}/qemu/initramfs-${KERNEL_VERSION}"
652 fi
653 fi
654
549 655 # Calculate size of the chroot directory in KB
550 656 CHROOT_SIZE=$(expr `du -s "${R}" | awk '{ print $1 }'`)
551 657
552 658 # Calculate the amount of needed 512 Byte sectors
553 659 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
554 660 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
555 661 ROOT_OFFSET=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS})
556 662
557 663 # The root partition is EXT4
558 664 # This means more space than the actual used space of the chroot is used.
559 665 # As overhead for journaling and reserved blocks 35% are added.
560 666 ROOT_SECTORS=$(expr $(expr ${CHROOT_SIZE} + ${CHROOT_SIZE} \/ 100 \* 35) \* 1024 \/ 512)
561 667
562 668 # Calculate required image size in 512 Byte sectors
563 669 IMAGE_SECTORS=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS})
564 670
565 671 # Prepare image file
566 672 if [ "$ENABLE_SPLITFS" = true ] ; then
567 673 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=${TABLE_SECTORS}
568 674 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek=${FRMW_SECTORS}
569 675 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=${TABLE_SECTORS}
570 676 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek=${ROOT_SECTORS}
571 677
572 678 # Write firmware/boot partition tables
573 679 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
574 680 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
575 681 EOM
576 682
577 683 # Write root partition table
578 684 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
579 685 ${TABLE_SECTORS},${ROOT_SECTORS},83
580 686 EOM
581 687
582 688 # Setup temporary loop devices
583 689 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME-frmw.img)"
584 690 ROOT_LOOP="$(losetup -o 1M -f --show $IMAGE_NAME-root.img)"
585 691 else # ENABLE_SPLITFS=false
586 692 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=${TABLE_SECTORS}
587 693 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek=${IMAGE_SECTORS}
588 694
589 695 # Write partition table
590 696 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
591 697 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
592 698 ${ROOT_OFFSET},${ROOT_SECTORS},83
593 699 EOM
594 700
595 701 # Setup temporary loop devices
596 702 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME.img)"
597 703 ROOT_LOOP="$(losetup -o 65M -f --show $IMAGE_NAME.img)"
598 704 fi
599 705
600 706 if [ "$ENABLE_CRYPTFS" = true ] ; then
601 707 # Create dummy ext4 fs
602 708 mkfs.ext4 "$ROOT_LOOP"
603 709
604 710 # Setup password keyfile
605 711 touch .password
606 712 chmod 600 .password
607 713 echo -n ${CRYPTFS_PASSWORD} > .password
608 714
609 715 # Initialize encrypted partition
610 716 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
611 717
612 718 # Open encrypted partition and setup mapping
613 719 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
614 720
615 721 # Secure delete password keyfile
616 722 shred -zu .password
617 723
618 724 # Update temporary loop device
619 725 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
620 726
621 727 # Wipe encrypted partition (encryption cipher is used for randomness)
622 728 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count=$(blockdev --getsz "${ROOT_LOOP}")
623 729 fi
624 730
625 731 # Build filesystems
626 732 mkfs.vfat "$FRMW_LOOP"
627 733 mkfs.ext4 "$ROOT_LOOP"
628 734
629 735 # Mount the temporary loop devices
630 736 mkdir -p "$BUILDDIR/mount"
631 737 mount "$ROOT_LOOP" "$BUILDDIR/mount"
632 738
633 739 mkdir -p "$BUILDDIR/mount/boot/firmware"
634 740 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
635 741
636 742 # Copy all files from the chroot to the loop device mount point directory
637 743 rsync -a "${R}/" "$BUILDDIR/mount/"
638 744
639 745 # Unmount all temporary loop devices and mount points
640 746 cleanup
641 747
642 748 # Create block map file(s) of image(s)
643 749 if [ "$ENABLE_SPLITFS" = true ] ; then
644 750 # Create block map files for "bmaptool"
645 751 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
646 752 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
647 753
648 754 # Image was successfully created
649 755 echo "$IMAGE_NAME-frmw.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
650 756 echo "$IMAGE_NAME-root.img ($(expr \( ${TABLE_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
651 757 else
652 758 # Create block map file for "bmaptool"
653 759 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
654 760
655 761 # Image was successfully created
656 762 echo "$IMAGE_NAME.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
763
764 # Create qemu qcow2 image
765 if [ "$ENABLE_QEMU" = true ] ; then
766 QEMU_IMAGE=${QEMU_IMAGE:=${BASEDIR}/qemu/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
767 QEMU_SIZE=16G
768
769 qemu-img convert -f raw -O qcow2 $IMAGE_NAME.img $QEMU_IMAGE.qcow2
770 qemu-img resize $QEMU_IMAGE.qcow2 $QEMU_SIZE
771
772 echo "$QEMU_IMAGE.qcow2 ($QEMU_SIZE)" ": successfully created"
773 fi
657 774 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant