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