##// END OF EJS Templates
Merge pull request #19 from g-vidal/drtyhlpr-master...
Gérard Vidal -
r247:2f699206ed0f Fusion
parent child
Show More
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,22
1 ## Templates used at IFÉ ENS de Lyon for "Tremplin des sciences" project
2
3 These templates have been used to create Raspberry Pi images for the
4 project "Climate and meteorolgy springboard for teaching sciences".
5 These images are tuned andused as explained in the
6 [blog](http://blog.climatetmeteo.fr/GerardVidal/) (mostly in french
7 but under translation).
8
9 The aim is to share with teachers a Raspberry Pi3 binary image providing software resources to use commercial weatherstations or DIY weathersystems made with various sensors. The following images have been built :
10
11 * raspife2-stretch Debian stretch image for raspi 2
12 * raspife3-jessie Debian jessie image for raspi 3
13 * raspife3-stretch Debian stretch image for raspi 3
14 * raspife3W-stretch Debian stretch image for raspi 3 with single IPAddress and weewx service
15 * raspife3-buster Debian buster image for raspi 3
16
17 In these images language ichoosen is french and can easily be changed.
18 Pathes and other variables are the ones that have been used during
19 execution and personnal data are replaced by "*******", change the
20 values according to your needs.
21
22
@@ -0,0 +1,80
1 Configuration file raspife2 Stretch IFÉ 2017/02/24
2 #
3 APT_SERVER=ftp.fr.debian.org
4 APT_INCLUDES="gnupg,gnupg2,firmware-realtek,firmware-linux-nonfree,firmware-linux,tightvncserver,build-essentia$
5 bison,libboost-all-dev,automake,autoconf,autogen,libtool,pkg-config,checkinstall,python3,python3-dev,menulibre,$
6 libnotify-bin,python,python-configobj,python-cheetah,python-imaging,python-serial,python-usb,python-dev,\
7 pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,jed,i2c-tools,python-smbus,policykit-1,usbutils,\
8 pmount,python-pip,python3-pip,geany,geany-plugin-py,geany-plugin-markdown,firefox-esr,firefox-esr-l10n-fr,\
9 icedtea-8-plugin,openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,libqtwebkit-dev,libqt5webkit5-dev,\
10 libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
11 lxsession,openbox-lxde-session,lxde"
12 #----------------------
13 RPI_MODEL=2
14 RELEASE="stretch"
15 HOSTNAME="raspife2"
16 PASSWORD="***********"
17 USER_PASSWORD="**************"
18 DEFLOCAL="fr_FR.UTF-8"
19 TIMEZONE="Europe/Paris"
20 EXPANDROOT=false
21 #-----------------------
22 XKB_MODEL="pc105"
23 XKB_LAYOUT="fr"
24 XKB_VARIANT="latin9"
25 XKB_OPTIONS=""
26 #------------------------
27 ENABLE_DHCP=true
28 #------------------------
29 ENABLE_CONSOLE=true
30 ENABLE_I2C=true
31 ENABLE_SPI=true
32 ENABLE_IPV6=true
33 ENABLE_SSHD=true
34 ENABLE_NONFREE=true
35 ENABLE_WIRELESS=false
36 ENABLE_RSYSLOG=true
37 ENABLE_SOUND=true
38 ENABLE_HWRANDOM=true
39 ENABLE_MINGPU=true
40 ENABLE_DBUS=true
41 ENABLE_XORG=true
42 ENABLE_WM="lxdm"
43 #------------------------
44 ENABLE_MINBASE=false
45 ENABLE_REDUCE=false
46 ENABLE_UBOOT=false
47 ENABLE_FBTURBO=true
48 ENABLE_IPTABLES=false
49 ENABLE_USER=true
50 USER_NAME=ens-ife
51 ENABLE_ROOT=true
52 ENABLE_HARDNET=true
53 ENABLE_INITRAMFS=true
54 ENABLE_IFNAMES=true
55 #------------------------
56 ENABLE_ROOT_SSH=false
57 SSH_LIMIT_USERS=false
58 SSH_ROOT_PUB_KEY="/home/********/.ssh/authorized_keys"
59 SSH_USER_PUB_KEY="/home/********/.ssh/authorized_keys"
60 #------------------------
61 BUILD_KERNEL=true
62 KERNEL_REDUCE=false
63 KERNEL_HEADERS=true
64 KERNEL_REMOVESRC=true
65 KERNELSRC_CLEAN=true
66 KERNELSRC_CONFIG=true
67 #------------------------
68 REDUCE_APT=false
69 REDUCE_DOC=true
70 REDUCE_MAN=false
71 REDUCE_HWDB=true
72 REDUCE_BASH=false
73 REDUCE_SSHD=false
74 REDUCE_LOCALE=false
75 #-------------------------
76 ENABLE_CRYPTFS=false
77 #-------------------------
78 BASEDIR=/media/********/images/${RELEASE}
79 DATE=date
80 +%Y-%m-%d IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}
@@ -0,0 +1,98
1 # Configuration file raspi3 Buster IFÉ 2017/11/01
2 #
3 APT_SERVER=debian.mirrors.ovh.net
4 APT_INCLUDES=""
5 APT_INCLUDES_LATE="gnupg,firmware-linux-nonfree,firmware-linux,dh-autoreconf,\
6 gettext,build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
7 bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
8 pkg-config,checkinstall,menulibre,libnotify-bin,pandoc,\
9 python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
10 python3-geopy,python3-pip,\
11 python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
12 python-geopy,python-pip,python-tk,pandoc,\
13 python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
14 pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools,python-smbus,policykit-1,\
15 pmount,ntpdate,ntp,rsync,\
16 texlive,texlive-xetex,nginx-extras,ffmpeg,wicd,wicd-gtk,console-data,keyboard-configuration,\
17 libqtwebkit-dev,libqt5webkit5-dev,\
18 libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
19 nmap,libltdl-dev,dbus-user-session,debian-archive-keyring,\
20 xutils-dev,lxsession,openbox-lxde-session,lxde,x11proto-randr-dev,lxrandr,\
21 tightvncserver,geany,geany-plugin-py,firefox-esr,firefox-esr-l10n-fr,jed,terminator,automake"
22 #ca-certificates-java,icedtea-plugin,icedtea-netx,\
23 #openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,\
24 #openjdk-9-jdk,openjdk-9-jre,openjdk-9-jre-headless"
25 #----------------------
26 RPI_MODEL=3
27 RELEASE="buster"
28 RELEASE_ARCH="armhf"
29 HOSTNAME="raspife3"
30 PASSWORD="***********"
31 USER_PASSWORD="*************"
32 DEFLOCAL="fr_FR.UTF-8"
33 TIMEZONE="Europe/Paris"
34 EXPANDROOT=false
35 #-----------------------
36 XKB_MODEL="pc105"
37 XKB_LAYOUT="fr"
38 XKB_VARIANT="latin9"
39 XKB_OPTIONS=""
40 #------------------------
41 ENABLE_DHCP=true
42 #------------------------
43 ENABLE_CONSOLE=false
44 ENABLE_I2C=true
45 ENABLE_SPI=true
46 ENABLE_IPV6=true
47 ENABLE_SSHD=true
48 ENABLE_NONFREE=true
49 ENABLE_WIRELESS=true
50 ENABLE_RSYSLOG=true
51 ENABLE_SOUND=true
52 ENABLE_HWRANDOM=true
53 ENABLE_MINGPU=true
54 ENABLE_DBUS=true
55 ENABLE_XORG=true
56 ENABLE_WM="lxdm"
57 #------------------------
58 ENABLE_MINBASE=false
59 ENABLE_REDUCE=false
60 ENABLE_UBOOT=false
61 ENABLE_FBTURBO=true
62 ENABLE_IPTABLES=false
63 ENABLE_USER=true
64 USER_NAME=ens-ife
65 ENABLE_ROOT=true
66 ENABLE_HARDNET=true
67 ENABLE_INITRAMFS=true
68 ENABLE_IFNAMES=true
69 #------------------------
70 ENABLE_ROOT_SSH=false
71 SSH_LIMIT_USERS=false
72 SSH_ROOT_PUB_KEY="/home/*****/.ssh/authorized_keys"
73 SSH_USER_PUB_KEY="/home/*****/.ssh/authorized_keys"
74 #------------------------
75 BUILD_KERNEL=true
76 KERNEL_BRANCH=rpi-4.13.y
77 KERNEL_REDUCE=false
78 KERNEL_HEADERS=true
79 KERNEL_REMOVESRC=true
80 KERNELSRC_CLEAN=true
81 KERNELSRC_CONFIG=true
82 #------------------------
83 REDUCE_APT=false
84 REDUCE_DOC=true
85 REDUCE_MAN=false
86 REDUCE_HWDB=true
87 REDUCE_BASH=false
88 REDUCE_SSHD=false
89 REDUCE_LOCALE=false
90 #-------------------------
91 ENABLE_CRYPTFS=false
92 #-------------------------
93 BASEDIR=/data/RpiGenImage/Images/${RELEASE}
94 #BASEDIR=/media/*******/*********/Nano-Ordinateurs/RaspberryPi/RpiGenImage/Images/${RELEASE}
95 DATE=`date +%Y-%m-%d`
96 IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}
97
98
@@ -0,0 +1,106
1 # Configuration file raspi3 Buster IFÉ 2017/11/01
2 #
3 APT_SERVER=debian.mirrors.ovh.net
4 APT_INCLUDES=""
5 APT_INCLUDES_LATE=""
6 APT_INCLUDES_LATE="gnupg,firmware-linux-nonfree,firmware-linux,dh-autoreconf,\
7 gettext,build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
8 bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
9 pkg-config,checkinstall,menulibre,libnotify-bin,pandoc,\
10 python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
11 python3-geopy,python3-pip,\
12 python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
13 python-geopy,python-pip,python-tk,pandoc,\
14 python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
15 pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools,python-smbus,policykit-1,\
16 pmount,ntpdate,ntp,rsync,\
17 texlive,texlive-xetex,nginx-extras,ffmpeg,wicd,wicd-gtk,console-data,keyboard-configuration,\
18 libqtwebkit-dev,libqt5webkit5-dev,\
19 libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
20 nmap,libltdl-dev,dbus-user-session,debian-archive-keyring,\
21 xutils-dev,lxsession,openbox-lxde-session,lxde,x11proto-randr-dev,lxrandr,\
22 tightvncserver,geany,geany-plugin-py,firefox-esr,firefox-esr-l10n-fr,jed"
23 #ca-certificates-java,icedtea-plugin,icedtea-netx,\
24 #openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,\
25 #openjdk-9-jdk,openjdk-9-jre,openjdk-9-jre-headless"
26 #----------------------
27 RPI_MODEL=3
28 RELEASE=buster
29 RELEASE_ARCH="armhf"
30 HOSTNAME="raspife3"
31 PASSWORD="AChanger1$"
32 USER_PASSWORD="AChanger1$"
33 DEFLOCAL="fr_FR.UTF-8"
34 TIMEZONE="Europe/Paris"
35 EXPANDROOT=false
36 #-----------------------
37 XKB_MODEL="pc105"
38 XKB_LAYOUT="fr"
39 XKB_VARIANT="latin9"
40 XKB_OPTIONS=""
41 #------------------------
42 ENABLE_DHCP=true
43 #------------------------
44 ENABLE_CONSOLE=false
45 ENABLE_I2C=true
46 ENABLE_SPI=true
47 ENABLE_IPV6=true
48 ENABLE_SSHD=true
49 ENABLE_NONFREE=true
50 ENABLE_WIRELESS=true
51 ENABLE_RSYSLOG=true
52 ENABLE_SOUND=true
53 ENABLE_HWRANDOM=true
54 ENABLE_MINGPU=true
55 ENABLE_DBUS=true
56 ENABLE_XORG=true
57 ENABLE_WM="lxdm"
58 #------------------------
59 ENABLE_MINBASE=false
60 ENABLE_REDUCE=false
61 ENABLE_UBOOT=false
62 ENABLE_FBTURBO=true
63 ENABLE_IPTABLES=false
64 ENABLE_USER=true
65 USER_NAME=ens-ife
66 ENABLE_ROOT=true
67 ENABLE_HARDNET=true
68 ENABLE_INITRAMFS=true
69 ENABLE_IFNAMES=true
70 #------------------------
71 ENABLE_ROOT_SSH=false
72 SSH_LIMIT_USERS=false
73 SSH_ROOT_PUB_KEY="/home/vidal/.ssh/authorized_keys"
74 SSH_USER_PUB_KEY="/home/vidal/.ssh/authorized_keys"
75 #------------------------
76 BUILD_KERNEL=true
77 KERNEL_ARCH=arm64
78 RELEASE_ARCH=arm64
79 CROSS_COMPILE=aarch64-linux-gnu-
80 QEMU_BINARY=/usr/bin/qemu-aarch64-static
81 KERNEL_DEFCONFIG=bcmrpi3_defconfig
82 KERNEL_BIN_IMAGE=Image
83 KERNEL_IMAGE="kernel10.img"
84 KERNEL_BRANCH=rpi-4.13.y
85 KERNEL_REDUCE=false
86 KERNEL_HEADERS=true
87 KERNEL_REMOVESRC=true
88 KERNELSRC_CLEAN=true
89 KERNELSRC_CONFIG=true
90 #------------------------
91 REDUCE_APT=false
92 REDUCE_DOC=true
93 REDUCE_MAN=false
94 REDUCE_HWDB=true
95 REDUCE_BASH=false
96 REDUCE_SSHD=false
97 REDUCE_LOCALE=false
98 #-------------------------
99 ENABLE_CRYPTFS=false
100 #-------------------------
101 BASEDIR=/data/RpiGenImage/Images/${RELEASE}
102 #BASEDIR=/media/vidal/ExternGV/Nano-Ordinateurs/RaspberryPi/RpiGenImage/Images/${RELEASE}
103 DATE=`date +%Y-%m-%d`
104 IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}
105
106
@@ -0,0 +1,4
1 # Configuration template file used by rpi23-gen-image.sh
2 RPI_MODEL=3
3 RELEASE=jessie
4 BUILD_KERNEL=true
@@ -0,0 +1,91
1 # Configuration file raspi3 Stretch IFÉ 2017/07/26
2 #
3 APT_SERVER=ftp.fr.debian.org
4 APT_INCLUDES="gnupg,gnupg2,firmware-linux-nonfree,firmware-linux,dh-autoreconf,\
5 gettext,build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
6 bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
7 pkg-config,checkinstall,menulibre,libnotify-bin,pandoc,\
8 python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
9 python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
10 python3-geopy,python3-pip,\
11 python-geopy,python-pip,\
12 python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
13 pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,jed,i2c-tools,python-smbus,policykit-1,\
14 pmount,ntpdate,\
15 texlive,texlive-xetex,nginx-extras,ffmpeg,wicd,wicd-gtk,console-data,keyboard-configuration,\
16 icedtea-8-plugin,openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,libqtwebkit-dev,libqt5webkit5-dev,\
17 libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
18 nmap,libltdl-dev,dbus-user-session,debian-archive-keyring,\
19 xutils-dev,lxsession,openbox-lxde-session,lxde,x11proto-randr-dev,lxrandr,\
20 tightvncserver,geany,geany-plugin-py,geany-plugin-markdown,firefox-esr,firefox-esr-l10n-fr"
21 #----------------------
22 RPI_MODEL=3
23 RELEASE="stretch"
24 HOSTNAME="raspife3"
25 PASSWORD="**************"
26 USER_PASSWORD="***************"
27 DEFLOCAL="fr_FR.UTF-8"
28 TIMEZONE="Europe/Paris"
29 EXPANDROOT=false
30 #-----------------------
31 XKB_MODEL="pc105"
32 XKB_LAYOUT="fr"
33 XKB_VARIANT="latin9"
34 XKB_OPTIONS=""
35 #------------------------
36 ENABLE_DHCP=true
37 #------------------------
38 ENABLE_CONSOLE=false
39 ENABLE_I2C=true
40 ENABLE_SPI=true
41 ENABLE_IPV6=true
42 ENABLE_SSHD=true
43 ENABLE_NONFREE=true
44 ENABLE_WIRELESS=true
45 ENABLE_RSYSLOG=true
46 ENABLE_SOUND=true
47 ENABLE_HWRANDOM=true
48 ENABLE_MINGPU=true
49 ENABLE_DBUS=true
50 ENABLE_XORG=true
51 ENABLE_WM="lxdm"
52 #------------------------
53 ENABLE_MINBASE=false
54 ENABLE_REDUCE=false
55 ENABLE_UBOOT=false
56 ENABLE_FBTURBO=true
57 ENABLE_IPTABLES=false
58 ENABLE_USER=true
59 USER_NAME=ens-ife
60 ENABLE_ROOT=true
61 ENABLE_HARDNET=true
62 ENABLE_INITRAMFS=true
63 ENABLE_IFNAMES=true
64 #------------------------
65 ENABLE_ROOT_SSH=false
66 SSH_LIMIT_USERS=false
67 SSH_ROOT_PUB_KEY="/home/*******/.ssh/authorized_keys"
68 SSH_USER_PUB_KEY="/home/*******/.ssh/authorized_keys"
69 #------------------------
70 BUILD_KERNEL=true
71 KERNEL_REDUCE=false
72 KERNEL_HEADERS=true
73 KERNEL_REMOVESRC=true
74 KERNELSRC_CLEAN=true
75 KERNELSRC_CONFIG=true
76 #------------------------
77 REDUCE_APT=false
78 REDUCE_DOC=true
79 REDUCE_MAN=false
80 REDUCE_HWDB=true
81 REDUCE_BASH=false
82 REDUCE_SSHD=false
83 REDUCE_LOCALE=false
84 #-------------------------
85 ENABLE_CRYPTFS=false
86 #-------------------------
87 BASEDIR=/data/RpiGenImage/Images/${RELEASE}
88 DATE=`date +%Y-%m-%d`
89 IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}
90
91
@@ -0,0 +1,89
1 # Configuration file raspi3 Stretch Weewx IFÉ 2017/07/26
2 #
3 APT_SERVER=ftp.fr.debian.org
4 APT_INCLUDES="debian-archive-keyring,debian-keyring,automake,autoconf,autogen,gawk,gnupg,gnupg2,\
5 build-essential,git,cmake,libjson-c-dev,unzip,\
6 bison,libboost-all-dev,libtool,libtool-bin,pkg-config,checkinstall,libnotify-bin,pandoc,\
7 python3,python3-dev,python,python-dev,python-configobj,python-cheetah,python-mysqldb\
8 python-imaging,python-serial,python-usb,python-tk,python3-tk,python3-scipy,\
9 python-pypandoc,python3-pypandoc,python-pandocfilters,python3-pandocfilters,\
10 python-geopy,python3-geopy,python-pip,python3-pip,python-smbus,\
11 libudev-dev,libzzip-dev,zlib1g-dev,libnss-myhostname,libpng16-16,nmap,\
12 libltdl-dev,usbutils,pmount,ntpdate,texlive,texlive-xetex,nginx-extras,policykit-1,\
13 openjdk-8-jdk-headless,openjdk-8-jre-headless,\
14 pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools"
15 #----------------------
16 RPI_MODEL=3
17 RELEASE="stretch"
18 HOSTNAME="raspwife3"
19 PASSWORD="************"
20 USER_PASSWORD="************"
21 DEFLOCAL="fr_FR.UTF-8"
22 TIMEZONE="Europe/Paris"
23 EXPANDROOT=false
24 #-----------------------
25 XKB_MODEL="pc105"
26 XKB_LAYOUT="fr"
27 XKB_VARIANT="latin9"
28 XKB_OPTIONS=""
29 #------------------------
30 ENABLE_DHCP=false
31 NET_ADDRESS="192.168.***.***/24"
32 NET_GATEWAY="192.168.***.1"
33 NET_DNS_1="192.168.***.1"
34 NET_DNS_2="8.8.8.8"
35 #------------------------
36 ENABLE_CONSOLE=false
37 ENABLE_I2C=true
38 ENABLE_SPI=true
39 ENABLE_IPV6=true
40 ENABLE_SSHD=true
41 ENABLE_NONFREE=true
42 ENABLE_WIRELESS=true
43 ENABLE_RSYSLOG=true
44 ENABLE_SOUND=true
45 ENABLE_HWRANDOM=true
46 ENABLE_MINGPU=true
47 ENABLE_DBUS=true
48 ENABLE_XORG=false
49 ENABLE_WM=""
50 #------------------------
51 ENABLE_MINBASE=false
52 ENABLE_REDUCE=false
53 ENABLE_UBOOT=false
54 ENABLE_FBTURBO=false
55 ENABLE_IPTABLES=false
56 ENABLE_USER=true
57 USER_NAME=ens-ife
58 ENABLE_ROOT=true
59 ENABLE_HARDNET=true
60 ENABLE_INITRAMFS=true
61 ENABLE_IFNAMES=true
62 #------------------------
63 ENABLE_ROOT_SSH=false
64 SSH_LIMIT_USERS=false
65 SSH_ROOT_PUB_KEY="/home/*******/.ssh/authorized_keys"
66 SSH_USER_PUB_KEY="/home/*******/.ssh/authorized_keys"
67 #------------------------
68 BUILD_KERNEL=true
69 KERNEL_REDUCE=false
70 KERNEL_HEADERS=true
71 KERNEL_REMOVESRC=true
72 KERNELSRC_CLEAN=true
73 KERNELSRC_CONFIG=true
74 #------------------------
75 REDUCE_APT=false
76 REDUCE_DOC=true
77 REDUCE_MAN=false
78 REDUCE_HWDB=true
79 REDUCE_BASH=false
80 REDUCE_SSHD=false
81 REDUCE_LOCALE=false
82 #-------------------------
83 ENABLE_CRYPTFS=false
84 #-------------------------
85 BASEDIR=/data/RpiGenImage/Images/${RELEASE}
86 DATE=`date +%Y-%m-%d`
87 IMAGE_NAME=${BASEDIR}/${DATE}-rpiw${RPI_MODEL}-${RELEASE}
88
89
@@ -1,453 +1,454
1 # rpi23-gen-image
1 # rpi23-gen-image
2 ## Introduction
2 ## Introduction
3
3
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```).
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 ## Build dependencies
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 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
9
9 ```debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo```
10 ```debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo```
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 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
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 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
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 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
17
17 ```
18 ```
18 echo "deb http://emdebian.org/tools/debian/ jessie main" > /etc/apt/sources.list.d/crosstools.list
19 echo "deb http://emdebian.org/tools/debian/ jessie main" > /etc/apt/sources.list.d/crosstools.list
19 sudo -u nobody wget -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
20 sudo -u nobody wget -O - http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
20 dpkg --add-architecture armhf
21 dpkg --add-architecture armhf
21 apt-get update
22 apt-get update
22 ```
23 ```
23
24
24 ## Command-line parameters
25 ## Command-line parameters
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 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
27
27 ##### Command-line examples:
28 ##### Command-line examples:
28 ```shell
29 ```shell
29 ENABLE_UBOOT=true ./rpi23-gen-image.sh
30 ENABLE_UBOOT=true ./rpi23-gen-image.sh
30 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
31 ENABLE_CONSOLE=false ENABLE_IPV6=false ./rpi23-gen-image.sh
31 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
32 ENABLE_WM=xfce4 ENABLE_FBTURBO=true ENABLE_MINBASE=true ./rpi23-gen-image.sh
32 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
33 ENABLE_HARDNET=true ENABLE_IPTABLES=true /rpi23-gen-image.sh
33 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
34 APT_SERVER=ftp.de.debian.org APT_PROXY="http://127.0.0.1:3142/" ./rpi23-gen-image.sh
34 ENABLE_MINBASE=true ./rpi23-gen-image.sh
35 ENABLE_MINBASE=true ./rpi23-gen-image.sh
35 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
36 BUILD_KERNEL=true ENABLE_MINBASE=true ENABLE_IPV6=false ./rpi23-gen-image.sh
36 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
37 BUILD_KERNEL=true KERNELSRC_DIR=/tmp/linux ./rpi23-gen-image.sh
37 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
38 ENABLE_MINBASE=true ENABLE_REDUCE=true ENABLE_MINGPU=true BUILD_KERNEL=true ./rpi23-gen-image.sh
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 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 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
40 RELEASE=stretch BUILD_KERNEL=true ./rpi23-gen-image.sh
40 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
41 RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
41 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
42 RELEASE=stretch RPI_MODEL=3 ENABLE_WIRELESS=true ENABLE_MINBASE=true BUILD_KERNEL=true ./rpi23-gen-image.sh
42 ```
43 ```
43
44
44 ## Configuration template files
45 ## Configuration template files
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 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
47
47 ##### Command-line examples:
48 ##### Command-line examples:
48 ```shell
49 ```shell
49 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
50 CONFIG_TEMPLATE=rpi3stretch ./rpi23-gen-image.sh
50 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
51 CONFIG_TEMPLATE=rpi2stretch ./rpi23-gen-image.sh
51 ```
52 ```
52
53
53 ## Supported parameters and settings
54 ## Supported parameters and settings
54 #### APT settings:
55 #### APT settings:
55 ##### `APT_SERVER`="ftp.debian.org"
56 ##### `APT_SERVER`="ftp.debian.org"
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 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
58
58 ##### `APT_PROXY`=""
59 ##### `APT_PROXY`=""
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 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
61
61 ##### `APT_INCLUDES`=""
62 ##### `APT_INCLUDES`=""
62 A comma separated list of additional packages to be installed by debootstrap during bootstrapping.
63 A comma separated list of additional packages to be installed by debootstrap during bootstrapping.
63
64
64 ##### `APT_INCLUDES_LATE`=""
65 ##### `APT_INCLUDES_LATE`=""
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 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
67
67 ---
68 ---
68
69
69 #### General system settings:
70 #### General system settings:
70 ##### `RPI_MODEL`=2
71 ##### `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.
72 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.
72
73
73 ##### `RELEASE`="jessie"
74 ##### `RELEASE`="jessie"
74 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 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
76
76 ##### `RELEASE_ARCH`="armhf"
77 ##### `RELEASE_ARCH`="armhf"
77 Set the desired Debian release architecture.
78 Set the desired Debian release architecture.
78
79
79 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
80 ##### `HOSTNAME`="rpi$RPI_MODEL-$RELEASE"
80 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
81 Set system host name. It's recommended that the host name is unique in the corresponding subnet.
81
82
82 ##### `PASSWORD`="raspberry"
83 ##### `PASSWORD`="raspberry"
83 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
84 Set system `root` password. It's **STRONGLY** recommended that you choose a custom password.
84
85
85 ##### `USER_PASSWORD`="raspberry"
86 ##### `USER_PASSWORD`="raspberry"
86 Set password for the created non-root user `USER_NAME`=pi. Ignored if `ENABLE_USER`=false. It's **STRONGLY** recommended that you choose a custom password.
87 Set password for the created non-root user `USER_NAME`=pi. Ignored if `ENABLE_USER`=false. It's **STRONGLY** recommended that you choose a custom password.
87
88
88 ##### `DEFLOCAL`="en_US.UTF-8"
89 ##### `DEFLOCAL`="en_US.UTF-8"
89 Set default system locale. This setting can also be changed inside the running OS using the `dpkg-reconfigure locales` command. Please note that on using this parameter the script will automatically install the required packages `locales`, `keyboard-configuration` and `console-setup`.
90 Set default system locale. This setting can also be changed inside the running OS using the `dpkg-reconfigure locales` command. Please note that on using this parameter the script will automatically install the required packages `locales`, `keyboard-configuration` and `console-setup`.
90
91
91 ##### `TIMEZONE`="Europe/Berlin"
92 ##### `TIMEZONE`="Europe/Berlin"
92 Set default system timezone. All available timezones can be found in the `/usr/share/zoneinfo/` directory. This setting can also be changed inside the running OS using the `dpkg-reconfigure tzdata` command.
93 Set default system timezone. All available timezones can be found in the `/usr/share/zoneinfo/` directory. This setting can also be changed inside the running OS using the `dpkg-reconfigure tzdata` command.
93
94
94 ##### `EXPANDROOT`=true
95 ##### `EXPANDROOT`=true
95 Expand the root partition and filesystem automatically on first boot.
96 Expand the root partition and filesystem automatically on first boot.
96
97
97 ---
98 ---
98
99
99 #### Keyboard settings:
100 #### Keyboard settings:
100 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 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
102
102 ##### `XKB_MODEL`=""
103 ##### `XKB_MODEL`=""
103 Set the name of the model of your keyboard type.
104 Set the name of the model of your keyboard type.
104
105
105 ##### `XKB_LAYOUT`=""
106 ##### `XKB_LAYOUT`=""
106 Set the supported keyboard layout(s).
107 Set the supported keyboard layout(s).
107
108
108 ##### `XKB_VARIANT`=""
109 ##### `XKB_VARIANT`=""
109 Set the supported variant(s) of the keyboard layout(s).
110 Set the supported variant(s) of the keyboard layout(s).
110
111
111 ##### `XKB_OPTIONS`=""
112 ##### `XKB_OPTIONS`=""
112 Set extra xkb configuration options.
113 Set extra xkb configuration options.
113
114
114 ---
115 ---
115
116
116 #### Networking settings (DHCP):
117 #### Networking settings (DHCP):
117 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 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
119
119 ##### `ENABLE_DHCP`=true
120 ##### `ENABLE_DHCP`=true
120 Set the system to use DHCP. This requires an DHCP server.
121 Set the system to use DHCP. This requires an DHCP server.
121
122
122 ---
123 ---
123
124
124 #### Networking settings (static):
125 #### Networking settings (static):
125 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 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
127
127 ##### `NET_ADDRESS`=""
128 ##### `NET_ADDRESS`=""
128 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
129 Set a static IPv4 or IPv6 address and its prefix, separated by "/", eg. "192.169.0.3/24".
129
130
130 ##### `NET_GATEWAY`=""
131 ##### `NET_GATEWAY`=""
131 Set the IP address for the default gateway.
132 Set the IP address for the default gateway.
132
133
133 ##### `NET_DNS_1`=""
134 ##### `NET_DNS_1`=""
134 Set the IP address for the first DNS server.
135 Set the IP address for the first DNS server.
135
136
136 ##### `NET_DNS_2`=""
137 ##### `NET_DNS_2`=""
137 Set the IP address for the second DNS server.
138 Set the IP address for the second DNS server.
138
139
139 ##### `NET_DNS_DOMAINS`=""
140 ##### `NET_DNS_DOMAINS`=""
140 Set the default DNS search domains to use for non fully qualified host names.
141 Set the default DNS search domains to use for non fully qualified host names.
141
142
142 ##### `NET_NTP_1`=""
143 ##### `NET_NTP_1`=""
143 Set the IP address for the first NTP server.
144 Set the IP address for the first NTP server.
144
145
145 ##### `NET_NTP_2`=""
146 ##### `NET_NTP_2`=""
146 Set the IP address for the second NTP server.
147 Set the IP address for the second NTP server.
147
148
148 ---
149 ---
149
150
150 #### Basic system features:
151 #### Basic system features:
151 ##### `ENABLE_CONSOLE`=true
152 ##### `ENABLE_CONSOLE`=true
152 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 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
154
154 ##### `ENABLE_I2C`=false
155 ##### `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.
156 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.
156
157
157 ##### `ENABLE_SPI`=false
158 ##### `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.
159 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.
159
160
160 ##### `ENABLE_IPV6`=true
161 ##### `ENABLE_IPV6`=true
161 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
162 Enable IPv6 support. The network interface configuration is managed via systemd-networkd.
162
163
163 ##### `ENABLE_SSHD`=true
164 ##### `ENABLE_SSHD`=true
164 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 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
166
166 ##### `ENABLE_NONFREE`=false
167 ##### `ENABLE_NONFREE`=false
167 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 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
169
169 ##### `ENABLE_WIRELESS`=false
170 ##### `ENABLE_WIRELESS`=false
170 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 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
172
172 ##### `ENABLE_RSYSLOG`=true
173 ##### `ENABLE_RSYSLOG`=true
173 If set to false, disable and uninstall rsyslog (so logs will be available only
174 If set to false, disable and uninstall rsyslog (so logs will be available only
174 in journal files)
175 in journal files)
175
176
176 ##### `ENABLE_SOUND`=true
177 ##### `ENABLE_SOUND`=true
177 Enable sound hardware and install Advanced Linux Sound Architecture.
178 Enable sound hardware and install Advanced Linux Sound Architecture.
178
179
179 ##### `ENABLE_HWRANDOM`=true
180 ##### `ENABLE_HWRANDOM`=true
180 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 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
182
182 ##### `ENABLE_MINGPU`=false
183 ##### `ENABLE_MINGPU`=false
183 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
184 Minimize the amount of shared memory reserved for the GPU. It doesn't seem to be possible to fully disable the GPU.
184
185
185 ##### `ENABLE_DBUS`=true
186 ##### `ENABLE_DBUS`=true
186 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
187 Install and enable D-Bus message bus. Please note that systemd should work without D-bus but it's recommended to be enabled.
187
188
188 ##### `ENABLE_XORG`=false
189 ##### `ENABLE_XORG`=false
189 Install Xorg open-source X Window System.
190 Install Xorg open-source X Window System.
190
191
191 ##### `ENABLE_WM`=""
192 ##### `ENABLE_WM`=""
192 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 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
194
194 ---
195 ---
195
196
196 #### Advanced system features:
197 #### Advanced system features:
197 ##### `ENABLE_MINBASE`=false
198 ##### `ENABLE_MINBASE`=false
198 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
199 Use debootstrap script variant `minbase` which only includes essential packages and apt. This will reduce the disk usage by about 65 MB.
199
200
200 ##### `ENABLE_REDUCE`=false
201 ##### `ENABLE_REDUCE`=false
201 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
202 Reduce the disk space usage by deleting packages and files. See `REDUCE_*` parameters for detailed information.
202
203
203 ##### `ENABLE_UBOOT`=false
204 ##### `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.
205 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.
205
206
206 ##### `UBOOTSRC_DIR`=""
207 ##### `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.
208 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.
208
209
209 ##### `ENABLE_FBTURBO`=false
210 ##### `ENABLE_FBTURBO`=false
210 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 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
212
212 ##### `FBTURBOSRC_DIR`=""
213 ##### `FBTURBOSRC_DIR`=""
213 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 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
215
215 ##### `ENABLE_IPTABLES`=false
216 ##### `ENABLE_IPTABLES`=false
216 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
217 Enable iptables IPv4/IPv6 firewall. Simplified ruleset: Allow all outgoing connections. Block all incoming connections except to OpenSSH service.
217
218
218 ##### `ENABLE_USER`=true
219 ##### `ENABLE_USER`=true
219 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
220 Create non-root user with password `USER_PASSWORD`=raspberry. Unless overridden with `USER_NAME`=user, username will be `pi`.
220
221
221 ##### `USER_NAME`=pi
222 ##### `USER_NAME`=pi
222 Non-root user to create. Ignored if `ENABLE_USER`=false
223 Non-root user to create. Ignored if `ENABLE_USER`=false
223
224
224 ##### `ENABLE_ROOT`=false
225 ##### `ENABLE_ROOT`=false
225 Set root user password so root login will be enabled
226 Set root user password so root login will be enabled
226
227
227 ##### `ENABLE_HARDNET`=false
228 ##### `ENABLE_HARDNET`=false
228 Enable IPv4/IPv6 network stack hardening settings.
229 Enable IPv4/IPv6 network stack hardening settings.
229
230
230 ##### `ENABLE_SPLITFS`=false
231 ##### `ENABLE_SPLITFS`=false
231 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
232 Enable having root partition on an USB drive by creating two image files: one for the `/boot/firmware` mount point, and another for `/`.
232
233
233 ##### `CHROOT_SCRIPTS`=""
234 ##### `CHROOT_SCRIPTS`=""
234 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 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
236
236 ##### `ENABLE_INITRAMFS`=false
237 ##### `ENABLE_INITRAMFS`=false
237 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 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
239
239 ##### `ENABLE_IFNAMES`=true
240 ##### `ENABLE_IFNAMES`=true
240 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 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
242
242 ##### `DISABLE_UNDERVOLT_WARNINGS`=
243 ##### `DISABLE_UNDERVOLT_WARNINGS`=
243 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 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
245
245 ---
246 ---
246
247
247 #### SSH settings:
248 #### SSH settings:
248 ##### `SSH_ENABLE_ROOT`=false
249 ##### `SSH_ENABLE_ROOT`=false
249 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 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
251
251 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
252 ##### `SSH_DISABLE_PASSWORD_AUTH`=false
252 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
253 Disable password based SSH authentication. Only public key based SSH (v2) authentication will be supported.
253
254
254 ##### `SSH_LIMIT_USERS`=false
255 ##### `SSH_LIMIT_USERS`=false
255 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 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
257
257 ##### `SSH_ROOT_PUB_KEY`=""
258 ##### `SSH_ROOT_PUB_KEY`=""
258 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 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
260
260 ##### `SSH_USER_PUB_KEY`=""
261 ##### `SSH_USER_PUB_KEY`=""
261 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 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
263
263 ---
264 ---
264
265
265 #### Kernel compilation:
266 #### Kernel compilation:
266 ##### `BUILD_KERNEL`=false
267 ##### `BUILD_KERNEL`=false
267 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 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
269
269 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
270 ##### `CROSS_COMPILE`="arm-linux-gnueabihf-"
270 This sets the cross compile enviornment for the compiler.
271 This sets the cross compile enviornment for the compiler.
271
272
272 ##### `KERNEL_ARCH`="arm"
273 ##### `KERNEL_ARCH`="arm"
273 This sets the kernel architecture for the compiler.
274 This sets the kernel architecture for the compiler.
274
275
275 ##### `KERNEL_IMAGE`="kernel7.img"
276 ##### `KERNEL_IMAGE`="kernel7.img"
276 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 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
278
278 ##### `KERNEL_BRANCH`=""
279 ##### `KERNEL_BRANCH`=""
279 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 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
281
281 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
282 ##### `QEMU_BINARY`="/usr/bin/qemu-arm-static"
282 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 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
284
284 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
285 ##### `KERNEL_DEFCONFIG`="bcm2709_defconfig"
285 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
286 Sets the default config for kernel compiling. If not set, `KERNEL_DEFCONFIG` will be set to "bcmrpi3\_defconfig" automatically if building for arm64.
286
287
287 ##### `KERNEL_REDUCE`=false
288 ##### `KERNEL_REDUCE`=false
288 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
289 Reduce the size of the generated kernel by removing unwanted device, network and filesystem drivers (experimental).
289
290
290 ##### `KERNEL_THREADS`=1
291 ##### `KERNEL_THREADS`=1
291 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 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
293
293 ##### `KERNEL_HEADERS`=true
294 ##### `KERNEL_HEADERS`=true
294 Install kernel headers with built kernel.
295 Install kernel headers with built kernel.
295
296
296 ##### `KERNEL_MENUCONFIG`=false
297 ##### `KERNEL_MENUCONFIG`=false
297 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
298 Start `make menuconfig` interactive menu-driven kernel configuration. The script will continue after `make menuconfig` was terminated.
298
299
299 ##### `KERNEL_REMOVESRC`=true
300 ##### `KERNEL_REMOVESRC`=true
300 Remove all kernel sources from the generated OS image after it was built and installed.
301 Remove all kernel sources from the generated OS image after it was built and installed.
301
302
302 ##### `KERNELSRC_DIR`=""
303 ##### `KERNELSRC_DIR`=""
303 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 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
305
305 ##### `KERNELSRC_CLEAN`=false
306 ##### `KERNELSRC_CLEAN`=false
306 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 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
308
308 ##### `KERNELSRC_CONFIG`=true
309 ##### `KERNELSRC_CONFIG`=true
309 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 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
311
311 ##### `KERNELSRC_USRCONFIG`=""
312 ##### `KERNELSRC_USRCONFIG`=""
312 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
313 Copy own config file to kernel `.config`. If `KERNEL_MENUCONFIG`=true then running after copy.
313
314
314 ##### `KERNELSRC_PREBUILT`=false
315 ##### `KERNELSRC_PREBUILT`=false
315 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 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
317
317 ##### `RPI_FIRMWARE_DIR`=""
318 ##### `RPI_FIRMWARE_DIR`=""
318 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 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
320
320 ---
321 ---
321
322
322 #### Reduce disk usage:
323 #### Reduce disk usage:
323 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
324 The following list of parameters is ignored if `ENABLE_REDUCE`=false.
324
325
325 ##### `REDUCE_APT`=true
326 ##### `REDUCE_APT`=true
326 Configure APT to use compressed package repository lists and no package caching files.
327 Configure APT to use compressed package repository lists and no package caching files.
327
328
328 ##### `REDUCE_DOC`=true
329 ##### `REDUCE_DOC`=true
329 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
330 Remove all doc files (harsh). Configure APT to not include doc files on future `apt-get` package installations.
330
331
331 ##### `REDUCE_MAN`=true
332 ##### `REDUCE_MAN`=true
332 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
333 Remove all man pages and info files (harsh). Configure APT to not include man pages on future `apt-get` package installations.
333
334
334 ##### `REDUCE_VIM`=false
335 ##### `REDUCE_VIM`=false
335 Replace `vim-tiny` package by `levee` a tiny vim clone.
336 Replace `vim-tiny` package by `levee` a tiny vim clone.
336
337
337 ##### `REDUCE_BASH`=false
338 ##### `REDUCE_BASH`=false
338 Remove `bash` package and switch to `dash` shell (experimental).
339 Remove `bash` package and switch to `dash` shell (experimental).
339
340
340 ##### `REDUCE_HWDB`=true
341 ##### `REDUCE_HWDB`=true
341 Remove PCI related hwdb files (experimental).
342 Remove PCI related hwdb files (experimental).
342
343
343 ##### `REDUCE_SSHD`=true
344 ##### `REDUCE_SSHD`=true
344 Replace `openssh-server` with `dropbear`.
345 Replace `openssh-server` with `dropbear`.
345
346
346 ##### `REDUCE_LOCALE`=true
347 ##### `REDUCE_LOCALE`=true
347 Remove all `locale` translation files.
348 Remove all `locale` translation files.
348
349
349 ---
350 ---
350
351
351 #### Encrypted root partition:
352 #### Encrypted root partition:
352 ##### `ENABLE_CRYPTFS`=false
353 ##### `ENABLE_CRYPTFS`=false
353 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 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
355
355 ##### `CRYPTFS_PASSWORD`=""
356 ##### `CRYPTFS_PASSWORD`=""
356 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
357 Set password of the encrypted root partition. This parameter is mandatory if `ENABLE_CRYPTFS`=true.
357
358
358 ##### `CRYPTFS_MAPPING`="secure"
359 ##### `CRYPTFS_MAPPING`="secure"
359 Set name of dm-crypt managed device-mapper mapping.
360 Set name of dm-crypt managed device-mapper mapping.
360
361
361 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
362 ##### `CRYPTFS_CIPHER`="aes-xts-plain64:sha512"
362 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
363 Set cipher specification string. `aes-xts*` ciphers are strongly recommended.
363
364
364 ##### `CRYPTFS_XTSKEYSIZE`=512
365 ##### `CRYPTFS_XTSKEYSIZE`=512
365 Sets key size in bits. The argument has to be a multiple of 8.
366 Sets key size in bits. The argument has to be a multiple of 8.
366
367
367 ---
368 ---
368
369
369 #### Build settings:
370 #### Build settings:
370 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
371 ##### `BASEDIR`=$(pwd)/images/${RELEASE}
371 Set a path to a working directory used by the script to generate an image.
372 Set a path to a working directory used by the script to generate an image.
372
373
373 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
374 ##### `IMAGE_NAME`=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}
374 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 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
376
376 ## Understanding the script
377 ## Understanding the script
377 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 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
379
379 | Script | Description |
380 | Script | Description |
380 | --- | --- |
381 | --- | --- |
381 | `10-bootstrap.sh` | Debootstrap basic system |
382 | `10-bootstrap.sh` | Debootstrap basic system |
382 | `11-apt.sh` | Setup APT repositories |
383 | `11-apt.sh` | Setup APT repositories |
383 | `12-locale.sh` | Setup Locales and keyboard settings |
384 | `12-locale.sh` | Setup Locales and keyboard settings |
384 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
385 | `13-kernel.sh` | Build and install RPi2/3 Kernel |
385 | `14-fstab.sh` | Setup fstab and initramfs |
386 | `14-fstab.sh` | Setup fstab and initramfs |
386 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
387 | `15-rpi-config.sh` | Setup RPi2/3 config and cmdline |
387 | `20-networking.sh` | Setup Networking |
388 | `20-networking.sh` | Setup Networking |
388 | `21-firewall.sh` | Setup Firewall |
389 | `21-firewall.sh` | Setup Firewall |
389 | `30-security.sh` | Setup Users and Security settings |
390 | `30-security.sh` | Setup Users and Security settings |
390 | `31-logging.sh` | Setup Logging |
391 | `31-logging.sh` | Setup Logging |
391 | `32-sshd.sh` | Setup SSH and public keys |
392 | `32-sshd.sh` | Setup SSH and public keys |
392 | `41-uboot.sh` | Build and Setup U-Boot |
393 | `41-uboot.sh` | Build and Setup U-Boot |
393 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
394 | `42-fbturbo.sh` | Build and Setup fbturbo Xorg driver |
394 | `50-firstboot.sh` | First boot actions |
395 | `50-firstboot.sh` | First boot actions |
395 | `99-reduce.sh` | Reduce the disk space usage |
396 | `99-reduce.sh` | Reduce the disk space usage |
396
397
397 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 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
399
399 | Directory | Description |
400 | Directory | Description |
400 | --- | --- |
401 | --- | --- |
401 | `apt` | APT management configuration files |
402 | `apt` | APT management configuration files |
402 | `boot` | Boot and RPi2/3 configuration files |
403 | `boot` | Boot and RPi2/3 configuration files |
403 | `dpkg` | Package Manager configuration |
404 | `dpkg` | Package Manager configuration |
404 | `etc` | Configuration files and rc scripts |
405 | `etc` | Configuration files and rc scripts |
405 | `firstboot` | Scripts that get executed on first boot |
406 | `firstboot` | Scripts that get executed on first boot |
406 | `initramfs` | Initramfs scripts |
407 | `initramfs` | Initramfs scripts |
407 | `iptables` | Firewall configuration files |
408 | `iptables` | Firewall configuration files |
408 | `locales` | Locales configuration |
409 | `locales` | Locales configuration |
409 | `modules` | Kernel Modules configuration |
410 | `modules` | Kernel Modules configuration |
410 | `mount` | Fstab configuration |
411 | `mount` | Fstab configuration |
411 | `network` | Networking configuration files |
412 | `network` | Networking configuration files |
412 | `sysctl.d` | Swapping and Network Hardening configuration |
413 | `sysctl.d` | Swapping and Network Hardening configuration |
413 | `xorg` | fbturbo Xorg driver configuration |
414 | `xorg` | fbturbo Xorg driver configuration |
414
415
415 ## Custom packages and scripts
416 ## Custom packages and scripts
416 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 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
418
418 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
419 Scripts in the custom.d directory will be executed after all other installation is complete but before the image is created.
419
420
420 ## Logging of the bootstrapping process
421 ## Logging of the bootstrapping process
421 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 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
423
423 ```shell
424 ```shell
424 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
425 script -c 'APT_SERVER=ftp.de.debian.org ./rpi23-gen-image.sh' ./build.log
425 ```
426 ```
426
427
427 ## Flashing the image file
428 ## Flashing the image file
428 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 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
430
430 ##### Flashing examples:
431 ##### Flashing examples:
431 ```shell
432 ```shell
432 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie.img /dev/mmcblk0
433 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie.img /dev/mmcblk0
433 dd bs=4M if=./images/jessie/2017-01-23-rpi3-jessie.img of=/dev/mmcblk0
434 dd bs=4M if=./images/jessie/2017-01-23-rpi3-jessie.img of=/dev/mmcblk0
434 ```
435 ```
435 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
436 If you have set `ENABLE_SPLITFS`, copy the `-frmw` image on the microSD card, then the `-root` one on the USB drive:
436 ```shell
437 ```shell
437 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-frmw.img /dev/mmcblk0
438 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-frmw.img /dev/mmcblk0
438 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-root.img /dev/sdc
439 bmaptool copy ./images/jessie/2017-01-23-rpi3-jessie-root.img /dev/sdc
439 ```
440 ```
440 ## Weekly image builds
441 ## Weekly image builds
441 The image files are provided by JRWR'S I/O PORT and are built once a Sunday at midnight UTC!
442 The image files are provided by JRWR'S I/O PORT and are built once a Sunday at midnight UTC!
442 * [Debian Stretch Raspberry Pi2/3 Weekly Image Builds](https://jrwr.io/doku.php?id=projects:debianpi)
443 * [Debian Stretch Raspberry Pi2/3 Weekly Image Builds](https://jrwr.io/doku.php?id=projects:debianpi)
443
444
444 ## External links and references
445 ## External links and references
445 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
446 * [Debian worldwide mirror sites](https://www.debian.org/mirror/list)
446 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
447 * [Debian Raspberry Pi 2 Wiki](https://wiki.debian.org/RaspberryPi2)
447 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
448 * [Debian CrossToolchains Wiki](https://wiki.debian.org/CrossToolchains)
448 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
449 * [Official Raspberry Pi Firmware on github](https://github.com/raspberrypi/firmware)
449 * [Official Raspberry Pi Kernel on github](https://github.com/raspberrypi/linux)
450 * [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)
451 * [U-BOOT git repository](http://git.denx.de/?p=u-boot.git;a=summary)
451 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
452 * [Xorg DDX driver fbturbo](https://github.com/ssvb/xf86-video-fbturbo)
452 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
453 * [RPi3 Wireless interface firmware](https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm80211/brcm)
453 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
454 * [Collabora RPi2 Kernel precompiled](https://repositories.collabora.co.uk/debian/)
@@ -1,183 +1,185
1 #
1 #
2 # Build and Setup RPi2/3 Kernel
2 # Build and Setup RPi2/3 Kernel
3 #
3 #
4
4
5 # Load utility functions
5 # Load utility functions
6 . ./functions.sh
6 . ./functions.sh
7
7
8 # Fetch and build latest raspberry kernel
8 # Fetch and build latest raspberry kernel
9 if [ "$BUILD_KERNEL" = true ] ; then
9 if [ "$BUILD_KERNEL" = true ] ; then
10 # Setup source directory
10 # Setup source directory
11 mkdir -p "${R}/usr/src/linux"
11 mkdir -p "${R}/usr/src/linux"
12
12
13 # Copy existing kernel sources into chroot directory
13 # Copy existing kernel sources into chroot directory
14 if [ -n "$KERNELSRC_DIR" ] && [ -d "$KERNELSRC_DIR" ] ; then
14 if [ -n "$KERNELSRC_DIR" ] && [ -d "$KERNELSRC_DIR" ] ; then
15 # Copy kernel sources and include hidden files
15 # Copy kernel sources and include hidden files
16 cp -r "${KERNELSRC_DIR}/". "${R}/usr/src/linux"
16 cp -r "${KERNELSRC_DIR}/". "${R}/usr/src/linux"
17
17
18 # Clean the kernel sources
18 # Clean the kernel sources
19 if [ "$KERNELSRC_CLEAN" = true ] && [ "$KERNELSRC_PREBUILT" = false ] ; then
19 if [ "$KERNELSRC_CLEAN" = true ] && [ "$KERNELSRC_PREBUILT" = false ] ; then
20 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" mrproper
20 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" mrproper
21 fi
21 fi
22 else # KERNELSRC_DIR=""
22 else # KERNELSRC_DIR=""
23 # Create temporary directory for kernel sources
23 # Create temporary directory for kernel sources
24 temp_dir=$(as_nobody mktemp -d)
24 temp_dir=$(as_nobody mktemp -d)
25
25
26 # Fetch current RPi2/3 kernel sources
26 # Fetch current RPi2/3 kernel sources
27 if [ -z "${KERNEL_BRANCH}" ] ; then
27 if [ -z "${KERNEL_BRANCH}" ] ; then
28 as_nobody git -C "${temp_dir}" clone --depth=1 "${KERNEL_URL}" linux
28 as_nobody git -C "${temp_dir}" clone --depth=1 "${KERNEL_URL}" linux
29 else
29 else
30 as_nobody git -C "${temp_dir}" clone --depth=1 --branch "${KERNEL_BRANCH}" "${KERNEL_URL}" linux
30 as_nobody git -C "${temp_dir}" clone --depth=1 --branch "${KERNEL_BRANCH}" "${KERNEL_URL}" linux
31 fi
31 fi
32
32
33 # Copy downloaded kernel sources
33 # Copy downloaded kernel sources
34 cp -r "${temp_dir}/linux/"* "${R}/usr/src/linux/"
34 cp -r "${temp_dir}/linux/"* "${R}/usr/src/linux/"
35
35
36 # Remove temporary directory for kernel sources
36 # Remove temporary directory for kernel sources
37 rm -fr "${temp_dir}"
37 rm -fr "${temp_dir}"
38
38
39 # Set permissions of the kernel sources
39 # Set permissions of the kernel sources
40 chown -R root:root "${R}/usr/src"
40 chown -R root:root "${R}/usr/src"
41 fi
41 fi
42
42
43 # Calculate optimal number of kernel building threads
43 # Calculate optimal number of kernel building threads
44 if [ "$KERNEL_THREADS" = "1" ] && [ -r /proc/cpuinfo ] ; then
44 if [ "$KERNEL_THREADS" = "1" ] && [ -r /proc/cpuinfo ] ; then
45 KERNEL_THREADS=$(grep -c processor /proc/cpuinfo)
45 KERNEL_THREADS=$(grep -c processor /proc/cpuinfo)
46 fi
46 fi
47
47
48 # Configure and build kernel
48 # Configure and build kernel
49 if [ "$KERNELSRC_PREBUILT" = false ] ; then
49 if [ "$KERNELSRC_PREBUILT" = false ] ; then
50 # Remove device, network and filesystem drivers from kernel configuration
50 # Remove device, network and filesystem drivers from kernel configuration
51 if [ "$KERNEL_REDUCE" = true ] ; then
51 if [ "$KERNEL_REDUCE" = true ] ; then
52 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
52 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
53 sed -i\
53 sed -i\
54 -e "s/\(^CONFIG_SND.*\=\).*/\1n/"\
54 -e "s/\(^CONFIG_SND.*\=\).*/\1n/"\
55 -e "s/\(^CONFIG_SOUND.*\=\).*/\1n/"\
55 -e "s/\(^CONFIG_SOUND.*\=\).*/\1n/"\
56 -e "s/\(^CONFIG_AC97.*\=\).*/\1n/"\
56 -e "s/\(^CONFIG_AC97.*\=\).*/\1n/"\
57 -e "s/\(^CONFIG_VIDEO_.*\=\).*/\1n/"\
57 -e "s/\(^CONFIG_VIDEO_.*\=\).*/\1n/"\
58 -e "s/\(^CONFIG_MEDIA_TUNER.*\=\).*/\1n/"\
58 -e "s/\(^CONFIG_MEDIA_TUNER.*\=\).*/\1n/"\
59 -e "s/\(^CONFIG_DVB.*\=\)[ym]/\1n/"\
59 -e "s/\(^CONFIG_DVB.*\=\)[ym]/\1n/"\
60 -e "s/\(^CONFIG_REISERFS.*\=\).*/\1n/"\
60 -e "s/\(^CONFIG_REISERFS.*\=\).*/\1n/"\
61 -e "s/\(^CONFIG_JFS.*\=\).*/\1n/"\
61 -e "s/\(^CONFIG_JFS.*\=\).*/\1n/"\
62 -e "s/\(^CONFIG_XFS.*\=\).*/\1n/"\
62 -e "s/\(^CONFIG_XFS.*\=\).*/\1n/"\
63 -e "s/\(^CONFIG_GFS2.*\=\).*/\1n/"\
63 -e "s/\(^CONFIG_GFS2.*\=\).*/\1n/"\
64 -e "s/\(^CONFIG_OCFS2.*\=\).*/\1n/"\
64 -e "s/\(^CONFIG_OCFS2.*\=\).*/\1n/"\
65 -e "s/\(^CONFIG_BTRFS.*\=\).*/\1n/"\
65 -e "s/\(^CONFIG_BTRFS.*\=\).*/\1n/"\
66 -e "s/\(^CONFIG_HFS.*\=\).*/\1n/"\
66 -e "s/\(^CONFIG_HFS.*\=\).*/\1n/"\
67 -e "s/\(^CONFIG_JFFS2.*\=\)[ym]/\1n/"\
67 -e "s/\(^CONFIG_JFFS2.*\=\)[ym]/\1n/"\
68 -e "s/\(^CONFIG_UBIFS.*\=\).*/\1n/"\
68 -e "s/\(^CONFIG_UBIFS.*\=\).*/\1n/"\
69 -e "s/\(^CONFIG_SQUASHFS.*\=\)[ym]/\1n/"\
69 -e "s/\(^CONFIG_SQUASHFS.*\=\)[ym]/\1n/"\
70 -e "s/\(^CONFIG_W1.*\=\)[ym]/\1n/"\
70 -e "s/\(^CONFIG_W1.*\=\)[ym]/\1n/"\
71 -e "s/\(^CONFIG_HAMRADIO.*\=\).*/\1n/"\
71 -e "s/\(^CONFIG_HAMRADIO.*\=\).*/\1n/"\
72 -e "s/\(^CONFIG_CAN.*\=\).*/\1n/"\
72 -e "s/\(^CONFIG_CAN.*\=\).*/\1n/"\
73 -e "s/\(^CONFIG_IRDA.*\=\).*/\1n/"\
73 -e "s/\(^CONFIG_IRDA.*\=\).*/\1n/"\
74 -e "s/\(^CONFIG_BT_.*\=\).*/\1n/"\
74 -e "s/\(^CONFIG_BT_.*\=\).*/\1n/"\
75 -e "s/\(^CONFIG_WIMAX.*\=\)[ym]/\1n/"\
75 -e "s/\(^CONFIG_WIMAX.*\=\)[ym]/\1n/"\
76 -e "s/\(^CONFIG_6LOWPAN.*\=\).*/\1n/"\
76 -e "s/\(^CONFIG_6LOWPAN.*\=\).*/\1n/"\
77 -e "s/\(^CONFIG_IEEE802154.*\=\).*/\1n/"\
77 -e "s/\(^CONFIG_IEEE802154.*\=\).*/\1n/"\
78 -e "s/\(^CONFIG_NFC.*\=\).*/\1n/"\
78 -e "s/\(^CONFIG_NFC.*\=\).*/\1n/"\
79 -e "s/\(^CONFIG_FB_TFT=.*\=\).*/\1n/"\
79 -e "s/\(^CONFIG_FB_TFT=.*\=\).*/\1n/"\
80 -e "s/\(^CONFIG_TOUCHSCREEN.*\=\).*/\1n/"\
80 -e "s/\(^CONFIG_TOUCHSCREEN.*\=\).*/\1n/"\
81 -e "s/\(^CONFIG_USB_GSPCA_.*\=\).*/\1n/"\
81 -e "s/\(^CONFIG_USB_GSPCA_.*\=\).*/\1n/"\
82 -e "s/\(^CONFIG_DRM.*\=\).*/\1n/"\
82 -e "s/\(^CONFIG_DRM.*\=\).*/\1n/"\
83 "${KERNEL_DIR}/.config"
83 "${KERNEL_DIR}/.config"
84 fi
84 fi
85
85
86 if [ "$KERNELSRC_CONFIG" = true ] ; then
86 if [ "$KERNELSRC_CONFIG" = true ] ; then
87 # Load default raspberry kernel configuration
87 # Load default raspberry kernel configuration
88 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
88 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_DEFCONFIG}"
89
89
90 if [ ! -z "$KERNELSRC_USRCONFIG" ] ; then
90 if [ ! -z "$KERNELSRC_USRCONFIG" ] ; then
91 cp $KERNELSRC_USRCONFIG ${KERNEL_DIR}/.config
91 cp $KERNELSRC_USRCONFIG ${KERNEL_DIR}/.config
92 fi
92 fi
93
93
94 # Start menu-driven kernel configuration (interactive)
94 # Start menu-driven kernel configuration (interactive)
95 if [ "$KERNEL_MENUCONFIG" = true ] ; then
95 if [ "$KERNEL_MENUCONFIG" = true ] ; then
96 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" menuconfig
96 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" menuconfig
97 fi
97 fi
98 fi
98 fi
99
99
100 # Cross compile kernel and modules
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
101 make -C "${KERNEL_DIR}" -j${KERNEL_THREADS} ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" "${KERNEL_BIN_IMAGE}" modules dtbs
102 fi
102 fi
103
103
104 # Check if kernel compilation was successful
104 # Check if kernel compilation was successful
105 if [ ! -r "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" ] ; then
105 if [ ! -r "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" ] ; then
106 echo "error: kernel compilation failed! (kernel image not found)"
106 echo "error: kernel compilation failed! (kernel image not found)"
107 cleanup
107 cleanup
108 exit 1
108 exit 1
109 fi
109 fi
110
110
111 # Install kernel modules
111 # Install kernel modules
112 if [ "$ENABLE_REDUCE" = true ] ; then
112 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
113 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=../../.. modules_install
114 else
114 else
115 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_PATH=../../.. modules_install
115 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_MOD_PATH=../../.. modules_install
116
116
117 # Install kernel firmware
117 # Install kernel firmware
118 if [ $(cat ./Makefile | grep "^firmware_install:") ] ; then
118 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_FW_PATH=../../../lib firmware_install
119 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_FW_PATH=../../../lib firmware_install
119 fi
120 fi
121 fi
120
122
121 # Install kernel headers
123 # Install kernel headers
122 if [ "$KERNEL_HEADERS" = true ] && [ "$KERNEL_REDUCE" = false ] ; then
124 if [ "$KERNEL_HEADERS" = true ] && [ "$KERNEL_REDUCE" = false ] ; then
123 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_HDR_PATH=../.. headers_install
125 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" INSTALL_HDR_PATH=../.. headers_install
124 fi
126 fi
125
127
126 # Prepare boot (firmware) directory
128 # Prepare boot (firmware) directory
127 mkdir "${BOOT_DIR}"
129 mkdir "${BOOT_DIR}"
128
130
129 # Get kernel release version
131 # Get kernel release version
130 KERNEL_VERSION=`cat "${KERNEL_DIR}/include/config/kernel.release"`
132 KERNEL_VERSION=`cat "${KERNEL_DIR}/include/config/kernel.release"`
131
133
132 # Copy kernel configuration file to the boot directory
134 # Copy kernel configuration file to the boot directory
133 install_readonly "${KERNEL_DIR}/.config" "${R}/boot/config-${KERNEL_VERSION}"
135 install_readonly "${KERNEL_DIR}/.config" "${R}/boot/config-${KERNEL_VERSION}"
134
136
135 # Copy dts and dtb device tree sources and binaries
137 # Copy dts and dtb device tree sources and binaries
136 mkdir "${BOOT_DIR}/overlays"
138 mkdir "${BOOT_DIR}/overlays"
137
139
138 # Ensure the proper .dtb is located
140 # Ensure the proper .dtb is located
139 if [ "$KERNEL_ARCH" = "arm" ] ; then
141 if [ "$KERNEL_ARCH" = "arm" ] ; then
140 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/"*.dtb "${BOOT_DIR}/"
142 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/"*.dtb "${BOOT_DIR}/"
141 else
143 else
142 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/broadcom/"*.dtb "${BOOT_DIR}/"
144 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/broadcom/"*.dtb "${BOOT_DIR}/"
143 fi
145 fi
144
146
145 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/"*.dtb* "${BOOT_DIR}/overlays/"
147 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/"*.dtb* "${BOOT_DIR}/overlays/"
146 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/README" "${BOOT_DIR}/overlays/README"
148 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/dts/overlays/README" "${BOOT_DIR}/overlays/README"
147
149
148 if [ "$ENABLE_UBOOT" = false ] ; then
150 if [ "$ENABLE_UBOOT" = false ] ; then
149 # Convert and copy kernel image to the boot directory
151 # Convert and copy kernel image to the boot directory
150 "${KERNEL_DIR}/scripts/mkknlimg" "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
152 "${KERNEL_DIR}/scripts/mkknlimg" "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
151 else
153 else
152 # Copy kernel image to the boot directory
154 # Copy kernel image to the boot directory
153 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
155 install_readonly "${KERNEL_DIR}/arch/${KERNEL_ARCH}/boot/${KERNEL_BIN_IMAGE}" "${BOOT_DIR}/${KERNEL_IMAGE}"
154 fi
156 fi
155
157
156 # Remove kernel sources
158 # Remove kernel sources
157 if [ "$KERNEL_REMOVESRC" = true ] ; then
159 if [ "$KERNEL_REMOVESRC" = true ] ; then
158 rm -fr "${KERNEL_DIR}"
160 rm -fr "${KERNEL_DIR}"
159 else
161 else
160 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" modules_prepare
162 make -C "${KERNEL_DIR}" ARCH="${KERNEL_ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" modules_prepare
161
163
162 # Create symlinks for kernel modules
164 # Create symlinks for kernel modules
163 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/build"
165 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/build"
164 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/source"
166 chroot_exec ln -sf /usr/src/linux "/lib/modules/${KERNEL_VERSION}/source"
165 fi
167 fi
166
168
167 else # BUILD_KERNEL=false
169 else # BUILD_KERNEL=false
168 # Kernel installation
170 # Kernel installation
169 chroot_exec apt-get -qq -y --no-install-recommends install linux-image-"${COLLABORA_KERNEL}" raspberrypi-bootloader-nokernel
171 chroot_exec apt-get -qq -y --no-install-recommends install linux-image-"${COLLABORA_KERNEL}" raspberrypi-bootloader-nokernel
170
172
171 # Install flash-kernel last so it doesn't try (and fail) to detect the platform in the chroot
173 # Install flash-kernel last so it doesn't try (and fail) to detect the platform in the chroot
172 chroot_exec apt-get -qq -y install flash-kernel
174 chroot_exec apt-get -qq -y install flash-kernel
173
175
174 # Check if kernel installation was successful
176 # Check if kernel installation was successful
175 VMLINUZ="$(ls -1 ${R}/boot/vmlinuz-* | sort | tail -n 1)"
177 VMLINUZ="$(ls -1 ${R}/boot/vmlinuz-* | sort | tail -n 1)"
176 if [ -z "$VMLINUZ" ] ; then
178 if [ -z "$VMLINUZ" ] ; then
177 echo "error: kernel installation failed! (/boot/vmlinuz-* not found)"
179 echo "error: kernel installation failed! (/boot/vmlinuz-* not found)"
178 cleanup
180 cleanup
179 exit 1
181 exit 1
180 fi
182 fi
181 # Copy vmlinuz kernel to the boot directory
183 # Copy vmlinuz kernel to the boot directory
182 install_readonly "${VMLINUZ}" "${BOOT_DIR}/${KERNEL_IMAGE}"
184 install_readonly "${VMLINUZ}" "${BOOT_DIR}/${KERNEL_IMAGE}"
183 fi
185 fi
@@ -1,44 +1,44
1 #
1 #
2 # Setup Firewall
2 # Setup Firewall
3 #
3 #
4
4
5 # Load utility functions
5 # Load utility functions
6 . ./functions.sh
6 . ./functions.sh
7
7
8 if [ "$ENABLE_IPTABLES" = true ] ; then
8 if [ "$ENABLE_IPTABLES" = true ] ; then
9 # Create iptables configuration directory
9 # Create iptables configuration directory
10 mkdir -p "${ETC_DIR}/iptables"
10 mkdir -p "${ETC_DIR}/iptables"
11
11
12 # Install iptables systemd service
12 # Install iptables systemd service
13 install_readonly files/iptables/iptables.service "${ETC_DIR}/systemd/system/iptables.service"
13 install_readonly files/iptables/iptables.service "${ETC_DIR}/systemd/system/iptables.service"
14
14
15 # Install flush-table script called by iptables service
15 # Install flush-table script called by iptables service
16 install_exec files/iptables/flush-iptables.sh "${ETC_DIR}/iptables/flush-iptables.sh"
16 install_exec files/iptables/flush-iptables.sh "${ETC_DIR}/iptables/flush-iptables.sh"
17
17
18 # Install iptables rule file
18 # Install iptables rule file
19 install_readonly files/iptables/iptables.rules "${ETC_DIR}/iptables/iptables.rules"
19 install_readonly files/iptables/iptables.rules "${ETC_DIR}/iptables/iptables.rules"
20
20
21 # Reload systemd configuration and enable iptables service
21 # Reload systemd configuration and enable iptables service
22 chroot_exec systemctl daemon-reload
22 chroot_exec systemctl daemon-reload
23 chroot_exec systemctl enable iptables.service
23 chroot_exec systemctl enable iptables.service
24
24
25 if [ "$ENABLE_IPV6" = true ] ; then
25 if [ "$ENABLE_IPV6" = true ] ; then
26 # Install ip6tables systemd service
26 # Install ip6tables systemd service
27 install_readonly files/iptables/ip6tables.service "${ETC_DIR}/systemd/system/ip6tables.service"
27 install_readonly files/iptables/ip6tables.service "${ETC_DIR}/systemd/system/ip6tables.service"
28
28
29 # Install ip6tables file
29 # Install ip6tables file
30 install_exec files/iptables/flush-ip6tables.sh "${ETC_DIR}/iptables/flush-ip6tables.sh"
30 install_exec files/iptables/flush-ip6tables.sh "${ETC_DIR}/iptables/flush-ip6tables.sh"
31
31
32 install_readonly files/iptables/ip6tables.rules "${ETC_DIR}/iptables/ip6tables.rules"
32 install_readonly files/iptables/ip6tables.rules "${ETC_DIR}/iptables/ip6tables.rules"
33
33
34 # Reload systemd configuration and enable iptables service
34 # Reload systemd configuration and enable iptables service
35 chroot_exec systemctl daemon-reload
35 chroot_exec systemctl daemon-reload
36 chroot_exec systemctl enable ip6tables.service
36 chroot_exec systemctl enable ip6tables.service
37 fi
37 fi
38 fi
39
38
40 if [ "$ENABLE_SSHD" = false ] ; then
39 if [ "$ENABLE_SSHD" = false ] ; then
41 # Remove SSHD related iptables rules
40 # Remove SSHD related iptables rules
42 sed -i "/^#/! {/SSH/ s/^/# /}" "${ETC_DIR}/iptables/iptables.rules" 2> /dev/null
41 sed -i "/^#/! {/SSH/ s/^/# /}" "${ETC_DIR}/iptables/iptables.rules" 2> /dev/null
43 sed -i "/^#/! {/SSH/ s/^/# /}" "${ETC_DIR}/iptables/ip6tables.rules" 2> /dev/null
42 sed -i "/^#/! {/SSH/ s/^/# /}" "${ETC_DIR}/iptables/ip6tables.rules" 2> /dev/null
44 fi
43 fi
44 fi
@@ -1,653 +1,657
1 #!/bin/sh
1 #!/bin/sh
2
2
3 ########################################################################
3 ########################################################################
4 # rpi23-gen-image.sh 2015-2017
4 # rpi23-gen-image.sh 2015-2017
5 #
5 #
6 # Advanced Debian "jessie", "stretch" and "buster" bootstrap script for RPi2/3
6 # Advanced Debian "jessie", "stretch" and "buster" bootstrap script for RPi2/3
7 #
7 #
8 # This program is free software; you can redistribute it and/or
8 # This program is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU General Public License
9 # modify it under the terms of the GNU General Public License
10 # as published by the Free Software Foundation; either version 2
10 # as published by the Free Software Foundation; either version 2
11 # of the License, or (at your option) any later version.
11 # of the License, or (at your option) any later version.
12 #
12 #
13 # Copyright (C) 2015 Jan Wagner <mail@jwagner.eu>
13 # Copyright (C) 2015 Jan Wagner <mail@jwagner.eu>
14 #
14 #
15 # Big thanks for patches and enhancements by 20+ github contributors!
15 # Big thanks for patches and enhancements by 20+ github contributors!
16 ########################################################################
16 ########################################################################
17
17
18 # Are we running as root?
18 # Are we running as root?
19 if [ "$(id -u)" -ne "0" ] ; then
19 if [ "$(id -u)" -ne "0" ] ; then
20 echo "error: this script must be executed with root privileges!"
20 echo "error: this script must be executed with root privileges!"
21 exit 1
21 exit 1
22 fi
22 fi
23
23
24 # Check if ./functions.sh script exists
24 # Check if ./functions.sh script exists
25 if [ ! -r "./functions.sh" ] ; then
25 if [ ! -r "./functions.sh" ] ; then
26 echo "error: './functions.sh' required script not found!"
26 echo "error: './functions.sh' required script not found!"
27 exit 1
27 exit 1
28 fi
28 fi
29
29
30 # Load utility functions
30 # Load utility functions
31 . ./functions.sh
31 . ./functions.sh
32
32
33 # Load parameters from configuration template file
33 # Load parameters from configuration template file
34 if [ ! -z "$CONFIG_TEMPLATE" ] ; then
34 if [ ! -z "$CONFIG_TEMPLATE" ] ; then
35 use_template
35 use_template
36 fi
36 fi
37
37
38 # Introduce settings
38 # Introduce settings
39 set -e
39 set -e
40 echo -n -e "\n#\n# RPi2/3 Bootstrap Settings\n#\n"
40 echo -n -e "\n#\n# RPi2/3 Bootstrap Settings\n#\n"
41 set -x
41 set -x
42
42
43 # Raspberry Pi model configuration
43 # Raspberry Pi model configuration
44 RPI_MODEL=${RPI_MODEL:=2}
44 RPI_MODEL=${RPI_MODEL:=2}
45 RPI2_DTB_FILE=${RPI2_DTB_FILE:=bcm2709-rpi-2-b.dtb}
45 RPI2_DTB_FILE=${RPI2_DTB_FILE:=bcm2709-rpi-2-b.dtb}
46 RPI2_UBOOT_CONFIG=${RPI2_UBOOT_CONFIG:=rpi_2_defconfig}
46 RPI2_UBOOT_CONFIG=${RPI2_UBOOT_CONFIG:=rpi_2_defconfig}
47 RPI3_DTB_FILE=${RPI3_DTB_FILE:=bcm2710-rpi-3-b.dtb}
47 RPI3_DTB_FILE=${RPI3_DTB_FILE:=bcm2710-rpi-3-b.dtb}
48 RPI3_UBOOT_CONFIG=${RPI3_UBOOT_CONFIG:=rpi_3_32b_defconfig}
48 RPI3_UBOOT_CONFIG=${RPI3_UBOOT_CONFIG:=rpi_3_32b_defconfig}
49
49
50 # Debian release
50 # Debian release
51 RELEASE=${RELEASE:=jessie}
51 RELEASE=${RELEASE:=jessie}
52 KERNEL_ARCH=${KERNEL_ARCH:=arm}
52 KERNEL_ARCH=${KERNEL_ARCH:=arm}
53 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
53 RELEASE_ARCH=${RELEASE_ARCH:=armhf}
54 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
54 CROSS_COMPILE=${CROSS_COMPILE:=arm-linux-gnueabihf-}
55 COLLABORA_KERNEL=${COLLABORA_KERNEL:=3.18.0-trunk-rpi2}
55 COLLABORA_KERNEL=${COLLABORA_KERNEL:=3.18.0-trunk-rpi2}
56 if [ "$KERNEL_ARCH" = "arm64" ] ; then
56 if [ "$KERNEL_ARCH" = "arm64" ] ; then
57 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
57 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcmrpi3_defconfig}
58 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
58 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel8.img}
59 else
59 else
60 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
60 KERNEL_DEFCONFIG=${KERNEL_DEFCONFIG:=bcm2709_defconfig}
61 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
61 KERNEL_IMAGE=${KERNEL_IMAGE:=kernel7.img}
62 fi
62 fi
63 if [ "$RELEASE_ARCH" = "arm64" ] ; then
63 if [ "$RELEASE_ARCH" = "arm64" ] ; then
64 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
64 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-aarch64-static}
65 else
65 else
66 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
66 QEMU_BINARY=${QEMU_BINARY:=/usr/bin/qemu-arm-static}
67 fi
67 fi
68 KERNEL_BRANCH=${KERNEL_BRANCH:=""}
68 KERNEL_BRANCH=${KERNEL_BRANCH:=""}
69
69
70 # URLs
70 # URLs
71 KERNEL_URL=${KERNEL_URL:=https://github.com/raspberrypi/linux}
71 KERNEL_URL=${KERNEL_URL:=https://github.com/raspberrypi/linux}
72 FIRMWARE_URL=${FIRMWARE_URL:=https://github.com/raspberrypi/firmware/raw/master/boot}
72 FIRMWARE_URL=${FIRMWARE_URL:=https://github.com/raspberrypi/firmware/raw/master/boot}
73 WLAN_FIRMWARE_URL=${WLAN_FIRMWARE_URL:=https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm}
73 WLAN_FIRMWARE_URL=${WLAN_FIRMWARE_URL:=https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm}
74 COLLABORA_URL=${COLLABORA_URL:=https://repositories.collabora.co.uk/debian}
74 COLLABORA_URL=${COLLABORA_URL:=https://repositories.collabora.co.uk/debian}
75 FBTURBO_URL=${FBTURBO_URL:=https://github.com/ssvb/xf86-video-fbturbo.git}
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:=git://git.denx.de/u-boot.git}
77
77
78 # Build directories
78 # Build directories
79 BASEDIR=${BASEDIR:=$(pwd)/images/${RELEASE}}
79 BASEDIR=${BASEDIR:=$(pwd)/images/${RELEASE}}
80 BUILDDIR="${BASEDIR}/build"
80 BUILDDIR="${BASEDIR}/build"
81
81
82 # Prepare date string for default image file name
82 # Prepare date string for default image file name
83 DATE="$(date +%Y-%m-%d)"
83 DATE="$(date +%Y-%m-%d)"
84 if [ -z "$KERNEL_BRANCH" ] ; then
84 if [ -z "$KERNEL_BRANCH" ] ; then
85 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
85 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-CURRENT-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
86 else
86 else
87 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
87 IMAGE_NAME=${IMAGE_NAME:=${BASEDIR}/${DATE}-${KERNEL_ARCH}-${KERNEL_BRANCH}-rpi${RPI_MODEL}-${RELEASE}-${RELEASE_ARCH}}
88 fi
88 fi
89
89
90 # Chroot directories
90 # Chroot directories
91 R="${BUILDDIR}/chroot"
91 R="${BUILDDIR}/chroot"
92 ETC_DIR="${R}/etc"
92 ETC_DIR="${R}/etc"
93 LIB_DIR="${R}/lib"
93 LIB_DIR="${R}/lib"
94 BOOT_DIR="${R}/boot/firmware"
94 BOOT_DIR="${R}/boot/firmware"
95 KERNEL_DIR="${R}/usr/src/linux"
95 KERNEL_DIR="${R}/usr/src/linux"
96 WLAN_FIRMWARE_DIR="${R}/lib/firmware/brcm"
96 WLAN_FIRMWARE_DIR="${R}/lib/firmware/brcm"
97
97
98 # Firmware directory: Blank if download from github
98 # Firmware directory: Blank if download from github
99 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
99 RPI_FIRMWARE_DIR=${RPI_FIRMWARE_DIR:=""}
100
100
101 # General settings
101 # General settings
102 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
102 HOSTNAME=${HOSTNAME:=rpi${RPI_MODEL}-${RELEASE}}
103 PASSWORD=${PASSWORD:=raspberry}
103 PASSWORD=${PASSWORD:=raspberry}
104 USER_PASSWORD=${USER_PASSWORD:=raspberry}
104 USER_PASSWORD=${USER_PASSWORD:=raspberry}
105 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
105 DEFLOCAL=${DEFLOCAL:="en_US.UTF-8"}
106 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
106 TIMEZONE=${TIMEZONE:="Europe/Berlin"}
107 EXPANDROOT=${EXPANDROOT:=true}
107 EXPANDROOT=${EXPANDROOT:=true}
108
108
109 # Keyboard settings
109 # Keyboard settings
110 XKB_MODEL=${XKB_MODEL:=""}
110 XKB_MODEL=${XKB_MODEL:=""}
111 XKB_LAYOUT=${XKB_LAYOUT:=""}
111 XKB_LAYOUT=${XKB_LAYOUT:=""}
112 XKB_VARIANT=${XKB_VARIANT:=""}
112 XKB_VARIANT=${XKB_VARIANT:=""}
113 XKB_OPTIONS=${XKB_OPTIONS:=""}
113 XKB_OPTIONS=${XKB_OPTIONS:=""}
114
114
115 # Network settings (DHCP)
115 # Network settings (DHCP)
116 ENABLE_DHCP=${ENABLE_DHCP:=true}
116 ENABLE_DHCP=${ENABLE_DHCP:=true}
117
117
118 # Network settings (static)
118 # Network settings (static)
119 NET_ADDRESS=${NET_ADDRESS:=""}
119 NET_ADDRESS=${NET_ADDRESS:=""}
120 NET_GATEWAY=${NET_GATEWAY:=""}
120 NET_GATEWAY=${NET_GATEWAY:=""}
121 NET_DNS_1=${NET_DNS_1:=""}
121 NET_DNS_1=${NET_DNS_1:=""}
122 NET_DNS_2=${NET_DNS_2:=""}
122 NET_DNS_2=${NET_DNS_2:=""}
123 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
123 NET_DNS_DOMAINS=${NET_DNS_DOMAINS:=""}
124 NET_NTP_1=${NET_NTP_1:=""}
124 NET_NTP_1=${NET_NTP_1:=""}
125 NET_NTP_2=${NET_NTP_2:=""}
125 NET_NTP_2=${NET_NTP_2:=""}
126
126
127 # APT settings
127 # APT settings
128 APT_PROXY=${APT_PROXY:=""}
128 APT_PROXY=${APT_PROXY:=""}
129 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
129 APT_SERVER=${APT_SERVER:="ftp.debian.org"}
130
130
131 # Feature settings
131 # Feature settings
132 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
132 ENABLE_CONSOLE=${ENABLE_CONSOLE:=true}
133 ENABLE_I2C=${ENABLE_I2C:=false}
133 ENABLE_I2C=${ENABLE_I2C:=false}
134 ENABLE_SPI=${ENABLE_SPI:=false}
134 ENABLE_SPI=${ENABLE_SPI:=false}
135 ENABLE_IPV6=${ENABLE_IPV6:=true}
135 ENABLE_IPV6=${ENABLE_IPV6:=true}
136 ENABLE_SSHD=${ENABLE_SSHD:=true}
136 ENABLE_SSHD=${ENABLE_SSHD:=true}
137 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
137 ENABLE_NONFREE=${ENABLE_NONFREE:=false}
138 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
138 ENABLE_WIRELESS=${ENABLE_WIRELESS:=false}
139 ENABLE_SOUND=${ENABLE_SOUND:=true}
139 ENABLE_SOUND=${ENABLE_SOUND:=true}
140 ENABLE_DBUS=${ENABLE_DBUS:=true}
140 ENABLE_DBUS=${ENABLE_DBUS:=true}
141 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
141 ENABLE_HWRANDOM=${ENABLE_HWRANDOM:=true}
142 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
142 ENABLE_MINGPU=${ENABLE_MINGPU:=false}
143 ENABLE_XORG=${ENABLE_XORG:=false}
143 ENABLE_XORG=${ENABLE_XORG:=false}
144 ENABLE_WM=${ENABLE_WM:=""}
144 ENABLE_WM=${ENABLE_WM:=""}
145 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
145 ENABLE_RSYSLOG=${ENABLE_RSYSLOG:=true}
146 ENABLE_USER=${ENABLE_USER:=true}
146 ENABLE_USER=${ENABLE_USER:=true}
147 USER_NAME=${USER_NAME:="pi"}
147 USER_NAME=${USER_NAME:="pi"}
148 ENABLE_ROOT=${ENABLE_ROOT:=false}
148 ENABLE_ROOT=${ENABLE_ROOT:=false}
149
149
150 # SSH settings
150 # SSH settings
151 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
151 SSH_ENABLE_ROOT=${SSH_ENABLE_ROOT:=false}
152 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
152 SSH_DISABLE_PASSWORD_AUTH=${SSH_DISABLE_PASSWORD_AUTH:=false}
153 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
153 SSH_LIMIT_USERS=${SSH_LIMIT_USERS:=false}
154 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
154 SSH_ROOT_PUB_KEY=${SSH_ROOT_PUB_KEY:=""}
155 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
155 SSH_USER_PUB_KEY=${SSH_USER_PUB_KEY:=""}
156
156
157 # Advanced settings
157 # Advanced settings
158 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
158 ENABLE_MINBASE=${ENABLE_MINBASE:=false}
159 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
159 ENABLE_REDUCE=${ENABLE_REDUCE:=false}
160 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
160 ENABLE_UBOOT=${ENABLE_UBOOT:=false}
161 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
161 UBOOTSRC_DIR=${UBOOTSRC_DIR:=""}
162 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
162 ENABLE_FBTURBO=${ENABLE_FBTURBO:=false}
163 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
163 FBTURBOSRC_DIR=${FBTURBOSRC_DIR:=""}
164 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
164 ENABLE_HARDNET=${ENABLE_HARDNET:=false}
165 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
165 ENABLE_IPTABLES=${ENABLE_IPTABLES:=false}
166 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
166 ENABLE_SPLITFS=${ENABLE_SPLITFS:=false}
167 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
167 ENABLE_INITRAMFS=${ENABLE_INITRAMFS:=false}
168 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
168 ENABLE_IFNAMES=${ENABLE_IFNAMES:=true}
169 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
169 DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS:=}
170
170
171 # Kernel compilation settings
171 # Kernel compilation settings
172 BUILD_KERNEL=${BUILD_KERNEL:=false}
172 BUILD_KERNEL=${BUILD_KERNEL:=false}
173 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
173 KERNEL_REDUCE=${KERNEL_REDUCE:=false}
174 KERNEL_THREADS=${KERNEL_THREADS:=1}
174 KERNEL_THREADS=${KERNEL_THREADS:=1}
175 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
175 KERNEL_HEADERS=${KERNEL_HEADERS:=true}
176 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
176 KERNEL_MENUCONFIG=${KERNEL_MENUCONFIG:=false}
177 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
177 KERNEL_REMOVESRC=${KERNEL_REMOVESRC:=true}
178 if [ "$KERNEL_ARCH" = "arm64" ] ; then
178 if [ "$KERNEL_ARCH" = "arm64" ] ; then
179 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
179 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="Image"}
180 else
180 else
181 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
181 KERNEL_BIN_IMAGE=${KERNEL_BIN_IMAGE:="zImage"}
182 fi
182 fi
183
183
184 # Kernel compilation from source directory settings
184 # Kernel compilation from source directory settings
185 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
185 KERNELSRC_DIR=${KERNELSRC_DIR:=""}
186 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
186 KERNELSRC_CLEAN=${KERNELSRC_CLEAN:=false}
187 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
187 KERNELSRC_CONFIG=${KERNELSRC_CONFIG:=true}
188 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
188 KERNELSRC_PREBUILT=${KERNELSRC_PREBUILT:=false}
189
189
190 # Reduce disk usage settings
190 # Reduce disk usage settings
191 REDUCE_APT=${REDUCE_APT:=true}
191 REDUCE_APT=${REDUCE_APT:=true}
192 REDUCE_DOC=${REDUCE_DOC:=true}
192 REDUCE_DOC=${REDUCE_DOC:=true}
193 REDUCE_MAN=${REDUCE_MAN:=true}
193 REDUCE_MAN=${REDUCE_MAN:=true}
194 REDUCE_VIM=${REDUCE_VIM:=false}
194 REDUCE_VIM=${REDUCE_VIM:=false}
195 REDUCE_BASH=${REDUCE_BASH:=false}
195 REDUCE_BASH=${REDUCE_BASH:=false}
196 REDUCE_HWDB=${REDUCE_HWDB:=true}
196 REDUCE_HWDB=${REDUCE_HWDB:=true}
197 REDUCE_SSHD=${REDUCE_SSHD:=true}
197 REDUCE_SSHD=${REDUCE_SSHD:=true}
198 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
198 REDUCE_LOCALE=${REDUCE_LOCALE:=true}
199
199
200 # Encrypted filesystem settings
200 # Encrypted filesystem settings
201 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
201 ENABLE_CRYPTFS=${ENABLE_CRYPTFS:=false}
202 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
202 CRYPTFS_PASSWORD=${CRYPTFS_PASSWORD:=""}
203 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
203 CRYPTFS_MAPPING=${CRYPTFS_MAPPING:="secure"}
204 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
204 CRYPTFS_CIPHER=${CRYPTFS_CIPHER:="aes-xts-plain64:sha512"}
205 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
205 CRYPTFS_XTSKEYSIZE=${CRYPTFS_XTSKEYSIZE:=512}
206
206
207 # Stop the Crypto Wars
207 # Stop the Crypto Wars
208 DISABLE_FBI=${DISABLE_FBI:=false}
208 DISABLE_FBI=${DISABLE_FBI:=false}
209
209
210 # Chroot scripts directory
210 # Chroot scripts directory
211 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
211 CHROOT_SCRIPTS=${CHROOT_SCRIPTS:=""}
212
212
213 # Packages required in the chroot build environment
213 # Packages required in the chroot build environment
214 APT_INCLUDES=${APT_INCLUDES:=""}
214 APT_INCLUDES=${APT_INCLUDES:=""}
215 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils"
215 APT_INCLUDES="${APT_INCLUDES},apt-transport-https,apt-utils,ca-certificates,debian-archive-keyring,dialog,sudo,systemd,sysvinit-utils"
216
216
217 # Packages required for bootstrapping
217 # Packages required for bootstrapping
218 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
218 REQUIRED_PACKAGES="debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo"
219 MISSING_PACKAGES=""
219 MISSING_PACKAGES=""
220
220
221 # Packages installed for c/c++ build environment in chroot (keep empty)
221 # Packages installed for c/c++ build environment in chroot (keep empty)
222 COMPILER_PACKAGES=""
222 COMPILER_PACKAGES=""
223
223
224 set +x
224 set +x
225
225
226 # Set Raspberry Pi model specific configuration
226 # Set Raspberry Pi model specific configuration
227 if [ "$RPI_MODEL" = 2 ] ; then
227 if [ "$RPI_MODEL" = 2 ] ; then
228 DTB_FILE=${RPI2_DTB_FILE}
228 DTB_FILE=${RPI2_DTB_FILE}
229 UBOOT_CONFIG=${RPI2_UBOOT_CONFIG}
229 UBOOT_CONFIG=${RPI2_UBOOT_CONFIG}
230 elif [ "$RPI_MODEL" = 3 ] ; then
230 elif [ "$RPI_MODEL" = 3 ] ; then
231 DTB_FILE=${RPI3_DTB_FILE}
231 DTB_FILE=${RPI3_DTB_FILE}
232 UBOOT_CONFIG=${RPI3_UBOOT_CONFIG}
232 UBOOT_CONFIG=${RPI3_UBOOT_CONFIG}
233 BUILD_KERNEL=true
233 BUILD_KERNEL=true
234 else
234 else
235 echo "error: Raspberry Pi model ${RPI_MODEL} is not supported!"
235 echo "error: Raspberry Pi model ${RPI_MODEL} is not supported!"
236 exit 1
236 exit 1
237 fi
237 fi
238
238
239 # Check if the internal wireless interface is supported by the RPi model
239 # Check if the internal wireless interface is supported by the RPi model
240 if [ "$ENABLE_WIRELESS" = true ] && [ "$RPI_MODEL" != 3 ] ; then
240 if [ "$ENABLE_WIRELESS" = true ] && [ "$RPI_MODEL" != 3 ] ; then
241 echo "error: The selected Raspberry Pi model has no internal wireless interface"
241 echo "error: The selected Raspberry Pi model has no internal wireless interface"
242 exit 1
242 exit 1
243 fi
243 fi
244
244
245 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
245 # Check if DISABLE_UNDERVOLT_WARNINGS parameter value is supported
246 if [ ! -z "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
246 if [ ! -z "$DISABLE_UNDERVOLT_WARNINGS" ] ; then
247 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
247 if [ "$DISABLE_UNDERVOLT_WARNINGS" != 1 ] && [ "$DISABLE_UNDERVOLT_WARNINGS" != 2 ] ; then
248 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
248 echo "error: DISABLE_UNDERVOLT_WARNINGS=${DISABLE_UNDERVOLT_WARNINGS} is not supported"
249 exit 1
249 exit 1
250 fi
250 fi
251 fi
251 fi
252
252
253 # Build RPi2/3 Linux kernel if required by Debian release
253 # Build RPi2/3 Linux kernel if required by Debian release
254 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
254 if [ "$RELEASE" = "stretch" ] || [ "$RELEASE" = "buster" ] ; then
255 BUILD_KERNEL=true
255 BUILD_KERNEL=true
256 fi
256 fi
257
257
258 # Add packages required for kernel cross compilation
258 # Add packages required for kernel cross compilation
259 if [ "$BUILD_KERNEL" = true ] ; then
259 if [ "$BUILD_KERNEL" = true ] ; then
260 if [ "$KERNEL_ARCH" = "arm" ] ; then
260 if [ "$KERNEL_ARCH" = "arm" ] ; then
261 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
261 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-armhf"
262 else
262 else
263 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
263 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} crossbuild-essential-arm64"
264 fi
264 fi
265 fi
265 fi
266
266
267 # Add libncurses5 to enable kernel menuconfig
267 # Add libncurses5 to enable kernel menuconfig
268 if [ "$KERNEL_MENUCONFIG" = true ] ; then
268 if [ "$KERNEL_MENUCONFIG" = true ] ; then
269 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses5-dev"
269 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} libncurses5-dev"
270 fi
270 fi
271
271
272 # Stop the Crypto Wars
272 # Stop the Crypto Wars
273 if [ "$DISABLE_FBI" = true ] ; then
273 if [ "$DISABLE_FBI" = true ] ; then
274 ENABLE_CRYPTFS=true
274 ENABLE_CRYPTFS=true
275 fi
275 fi
276
276
277 # Add cryptsetup package to enable filesystem encryption
277 # Add cryptsetup package to enable filesystem encryption
278 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
278 if [ "$ENABLE_CRYPTFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
279 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
279 REQUIRED_PACKAGES="${REQUIRED_PACKAGES} cryptsetup"
280 APT_INCLUDES="${APT_INCLUDES},cryptsetup"
280 APT_INCLUDES="${APT_INCLUDES},cryptsetup"
281
281
282 if [ -z "$CRYPTFS_PASSWORD" ] ; then
282 if [ -z "$CRYPTFS_PASSWORD" ] ; then
283 echo "error: no password defined (CRYPTFS_PASSWORD)!"
283 echo "error: no password defined (CRYPTFS_PASSWORD)!"
284 exit 1
284 exit 1
285 fi
285 fi
286 ENABLE_INITRAMFS=true
286 ENABLE_INITRAMFS=true
287 fi
287 fi
288
288
289 # Add initramfs generation tools
289 # Add initramfs generation tools
290 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
290 if [ "$ENABLE_INITRAMFS" = true ] && [ "$BUILD_KERNEL" = true ] ; then
291 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
291 APT_INCLUDES="${APT_INCLUDES},initramfs-tools"
292 fi
292 fi
293
293
294 # Add device-tree-compiler required for building the U-Boot bootloader
294 # Add device-tree-compiler required for building the U-Boot bootloader
295 if [ "$ENABLE_UBOOT" = true ] ; then
295 if [ "$ENABLE_UBOOT" = true ] ; then
296 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler"
296 APT_INCLUDES="${APT_INCLUDES},device-tree-compiler"
297 fi
297 fi
298
298
299 # Check if root SSH (v2) public key file exists
299 # Check if root SSH (v2) public key file exists
300 if [ ! -z "$SSH_ROOT_PUB_KEY" ] ; then
300 if [ ! -z "$SSH_ROOT_PUB_KEY" ] ; then
301 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
301 if [ ! -f "$SSH_ROOT_PUB_KEY" ] ; then
302 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
302 echo "error: '$SSH_ROOT_PUB_KEY' specified SSH public key file not found (SSH_ROOT_PUB_KEY)!"
303 exit 1
303 exit 1
304 fi
304 fi
305 fi
305 fi
306
306
307 # Check if $USER_NAME SSH (v2) public key file exists
307 # Check if $USER_NAME SSH (v2) public key file exists
308 if [ ! -z "$SSH_USER_PUB_KEY" ] ; then
308 if [ ! -z "$SSH_USER_PUB_KEY" ] ; then
309 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
309 if [ ! -f "$SSH_USER_PUB_KEY" ] ; then
310 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
310 echo "error: '$SSH_USER_PUB_KEY' specified SSH public key file not found (SSH_USER_PUB_KEY)!"
311 exit 1
311 exit 1
312 fi
312 fi
313 fi
313 fi
314
314
315 # Check if all required packages are installed on the build system
315 # Check if all required packages are installed on the build system
316 for package in $REQUIRED_PACKAGES ; do
316 for package in $REQUIRED_PACKAGES ; do
317 if [ "`dpkg-query -W -f='${Status}' $package`" != "install ok installed" ] ; then
317 if [ "`dpkg-query -W -f='${Status}' $package`" != "install ok installed" ] ; then
318 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
318 MISSING_PACKAGES="${MISSING_PACKAGES} $package"
319 fi
319 fi
320 done
320 done
321
321
322 # If there are missing packages ask confirmation for install, or exit
322 # If there are missing packages ask confirmation for install, or exit
323 if [ -n "$MISSING_PACKAGES" ] ; then
323 if [ -n "$MISSING_PACKAGES" ] ; then
324 echo "the following packages needed by this script are not installed:"
324 echo "the following packages needed by this script are not installed:"
325 echo "$MISSING_PACKAGES"
325 echo "$MISSING_PACKAGES"
326
326
327 echo -n "\ndo you want to install the missing packages right now? [y/n] "
327 echo -n "\ndo you want to install the missing packages right now? [y/n] "
328 read confirm
328 read confirm
329 [ "$confirm" != "y" ] && exit 1
329 [ "$confirm" != "y" ] && exit 1
330
330
331 # Make sure all missing required packages are installed
331 # Make sure all missing required packages are installed
332 apt-get -qq -y install ${MISSING_PACKAGES}
332 apt-get -qq -y install ${MISSING_PACKAGES}
333 fi
333 fi
334
334
335 # Check if ./bootstrap.d directory exists
335 # Check if ./bootstrap.d directory exists
336 if [ ! -d "./bootstrap.d/" ] ; then
336 if [ ! -d "./bootstrap.d/" ] ; then
337 echo "error: './bootstrap.d' required directory not found!"
337 echo "error: './bootstrap.d' required directory not found!"
338 exit 1
338 exit 1
339 fi
339 fi
340
340
341 # Check if ./files directory exists
341 # Check if ./files directory exists
342 if [ ! -d "./files/" ] ; then
342 if [ ! -d "./files/" ] ; then
343 echo "error: './files' required directory not found!"
343 echo "error: './files' required directory not found!"
344 exit 1
344 exit 1
345 fi
345 fi
346
346
347 # Check if specified KERNELSRC_DIR directory exists
347 # Check if specified KERNELSRC_DIR directory exists
348 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
348 if [ -n "$KERNELSRC_DIR" ] && [ ! -d "$KERNELSRC_DIR" ] ; then
349 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
349 echo "error: '${KERNELSRC_DIR}' specified directory not found (KERNELSRC_DIR)!"
350 exit 1
350 exit 1
351 fi
351 fi
352
352
353 # Check if specified UBOOTSRC_DIR directory exists
353 # Check if specified UBOOTSRC_DIR directory exists
354 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
354 if [ -n "$UBOOTSRC_DIR" ] && [ ! -d "$UBOOTSRC_DIR" ] ; then
355 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
355 echo "error: '${UBOOTSRC_DIR}' specified directory not found (UBOOTSRC_DIR)!"
356 exit 1
356 exit 1
357 fi
357 fi
358
358
359 # Check if specified FBTURBOSRC_DIR directory exists
359 # Check if specified FBTURBOSRC_DIR directory exists
360 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
360 if [ -n "$FBTURBOSRC_DIR" ] && [ ! -d "$FBTURBOSRC_DIR" ] ; then
361 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
361 echo "error: '${FBTURBOSRC_DIR}' specified directory not found (FBTURBOSRC_DIR)!"
362 exit 1
362 exit 1
363 fi
363 fi
364
364
365 # Check if specified CHROOT_SCRIPTS directory exists
365 # Check if specified CHROOT_SCRIPTS directory exists
366 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
366 if [ -n "$CHROOT_SCRIPTS" ] && [ ! -d "$CHROOT_SCRIPTS" ] ; then
367 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
367 echo "error: ${CHROOT_SCRIPTS} specified directory not found (CHROOT_SCRIPTS)!"
368 exit 1
368 exit 1
369 fi
369 fi
370
370
371 # Check if specified device mapping already exists (will be used by cryptsetup)
371 # Check if specified device mapping already exists (will be used by cryptsetup)
372 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
372 if [ -r "/dev/mapping/${CRYPTFS_MAPPING}" ] ; then
373 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
373 echo "error: mapping /dev/mapping/${CRYPTFS_MAPPING} already exists, not proceeding"
374 exit 1
374 exit 1
375 fi
375 fi
376
376
377 # Don't clobber an old build
377 # Don't clobber an old build
378 if [ -e "$BUILDDIR" ] ; then
378 if [ -e "$BUILDDIR" ] ; then
379 echo "error: directory ${BUILDDIR} already exists, not proceeding"
379 echo "error: directory ${BUILDDIR} already exists, not proceeding"
380 exit 1
380 exit 1
381 fi
381 fi
382
382
383 # Setup chroot directory
383 # Setup chroot directory
384 mkdir -p "${R}"
384 mkdir -p "${R}"
385
385
386 # Check if build directory has enough of free disk space >512MB
386 # Check if build directory has enough of free disk space >512MB
387 if [ "$(df --output=avail ${BUILDDIR} | sed "1d")" -le "524288" ] ; then
387 if [ "$(df --output=avail ${BUILDDIR} | sed "1d")" -le "524288" ] ; then
388 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
388 echo "error: ${BUILDDIR} not enough space left to generate the output image!"
389 exit 1
389 exit 1
390 fi
390 fi
391
391
392 set -x
392 set -x
393
393
394 # Call "cleanup" function on various signals and errors
394 # Call "cleanup" function on various signals and errors
395 trap cleanup 0 1 2 3 6
395 trap cleanup 0 1 2 3 6
396
396
397 # Add required packages for the minbase installation
397 # Add required packages for the minbase installation
398 if [ "$ENABLE_MINBASE" = true ] ; then
398 if [ "$ENABLE_MINBASE" = true ] ; then
399 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
399 APT_INCLUDES="${APT_INCLUDES},vim-tiny,netbase,net-tools,ifupdown"
400 fi
400 fi
401
401
402 # Add required locales packages
402 # Add required locales packages
403 if [ "$DEFLOCAL" != "en_US.UTF-8" ] ; then
403 if [ "$DEFLOCAL" != "en_US.UTF-8" ] ; then
404 APT_INCLUDES="${APT_INCLUDES},locales,keyboard-configuration,console-setup"
404 APT_INCLUDES="${APT_INCLUDES},locales,keyboard-configuration,console-setup"
405 fi
405 fi
406
406
407 # Add parted package, required to get partprobe utility
407 # Add parted package, required to get partprobe utility
408 if [ "$EXPANDROOT" = true ] ; then
408 if [ "$EXPANDROOT" = true ] ; then
409 APT_INCLUDES="${APT_INCLUDES},parted"
409 APT_INCLUDES="${APT_INCLUDES},parted"
410 fi
410 fi
411
411
412 # Add dbus package, recommended if using systemd
412 # Add dbus package, recommended if using systemd
413 if [ "$ENABLE_DBUS" = true ] ; then
413 if [ "$ENABLE_DBUS" = true ] ; then
414 APT_INCLUDES="${APT_INCLUDES},dbus"
414 APT_INCLUDES="${APT_INCLUDES},dbus"
415 fi
415 fi
416
416
417 # Add iptables IPv4/IPv6 package
417 # Add iptables IPv4/IPv6 package
418 if [ "$ENABLE_IPTABLES" = true ] ; then
418 if [ "$ENABLE_IPTABLES" = true ] ; then
419 APT_INCLUDES="${APT_INCLUDES},iptables"
419 APT_INCLUDES="${APT_INCLUDES},iptables"
420 fi
420 fi
421
421
422 # Add openssh server package
422 # Add openssh server package
423 if [ "$ENABLE_SSHD" = true ] ; then
423 if [ "$ENABLE_SSHD" = true ] ; then
424 APT_INCLUDES="${APT_INCLUDES},openssh-server"
424 APT_INCLUDES="${APT_INCLUDES},openssh-server"
425 fi
425 fi
426
426
427 # Add alsa-utils package
427 # Add alsa-utils package
428 if [ "$ENABLE_SOUND" = true ] ; then
428 if [ "$ENABLE_SOUND" = true ] ; then
429 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
429 APT_INCLUDES="${APT_INCLUDES},alsa-utils"
430 fi
430 fi
431
431
432 # Add rng-tools package
432 # Add rng-tools package
433 if [ "$ENABLE_HWRANDOM" = true ] ; then
433 if [ "$ENABLE_HWRANDOM" = true ] ; then
434 APT_INCLUDES="${APT_INCLUDES},rng-tools"
434 APT_INCLUDES="${APT_INCLUDES},rng-tools"
435 fi
435 fi
436
436
437 # Add fbturbo video driver
437 # Add fbturbo video driver
438 if [ "$ENABLE_FBTURBO" = true ] ; then
438 if [ "$ENABLE_FBTURBO" = true ] ; then
439 # Enable xorg package dependencies
439 # Enable xorg package dependencies
440 ENABLE_XORG=true
440 ENABLE_XORG=true
441 fi
441 fi
442
442
443 # Add user defined window manager package
443 # Add user defined window manager package
444 if [ -n "$ENABLE_WM" ] ; then
444 if [ -n "$ENABLE_WM" ] ; then
445 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
445 APT_INCLUDES="${APT_INCLUDES},${ENABLE_WM}"
446
446
447 # Enable xorg package dependencies
447 # Enable xorg package dependencies
448 ENABLE_XORG=true
448 ENABLE_XORG=true
449 fi
449 fi
450
450
451 # Add xorg package
451 # Add xorg package
452 if [ "$ENABLE_XORG" = true ] ; then
452 if [ "$ENABLE_XORG" = true ] ; then
453 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
453 APT_INCLUDES="${APT_INCLUDES},xorg,dbus-x11"
454 fi
454 fi
455
455
456 # Replace selected packages with smaller clones
456 # Replace selected packages with smaller clones
457 if [ "$ENABLE_REDUCE" = true ] ; then
457 if [ "$ENABLE_REDUCE" = true ] ; then
458 # Add levee package instead of vim-tiny
458 # Add levee package instead of vim-tiny
459 if [ "$REDUCE_VIM" = true ] ; then
459 if [ "$REDUCE_VIM" = true ] ; then
460 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
460 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/vim-tiny/levee/")"
461 fi
461 fi
462
462
463 # Add dropbear package instead of openssh-server
463 # Add dropbear package instead of openssh-server
464 if [ "$REDUCE_SSHD" = true ] ; then
464 if [ "$REDUCE_SSHD" = true ] ; then
465 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/openssh-server/dropbear/")"
465 APT_INCLUDES="$(echo ${APT_INCLUDES} | sed "s/openssh-server/dropbear/")"
466 fi
466 fi
467 fi
467 fi
468
468
469 if [ "$RELEASE" != "jessie" ] ; then
470 APT_INCLUDES="${APT_INCLUDES},libnss-systemd"
471 fi
472
469 # Configure kernel sources if no KERNELSRC_DIR
473 # Configure kernel sources if no KERNELSRC_DIR
470 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
474 if [ "$BUILD_KERNEL" = true ] && [ -z "$KERNELSRC_DIR" ] ; then
471 KERNELSRC_CONFIG=true
475 KERNELSRC_CONFIG=true
472 fi
476 fi
473
477
474 # Configure reduced kernel
478 # Configure reduced kernel
475 if [ "$KERNEL_REDUCE" = true ] ; then
479 if [ "$KERNEL_REDUCE" = true ] ; then
476 KERNELSRC_CONFIG=false
480 KERNELSRC_CONFIG=false
477 fi
481 fi
478
482
479 # Execute bootstrap scripts
483 # Execute bootstrap scripts
480 for SCRIPT in bootstrap.d/*.sh; do
484 for SCRIPT in bootstrap.d/*.sh; do
481 head -n 3 "$SCRIPT"
485 head -n 3 "$SCRIPT"
482 . "$SCRIPT"
486 . "$SCRIPT"
483 done
487 done
484
488
485 ## Execute custom bootstrap scripts
489 ## Execute custom bootstrap scripts
486 if [ -d "custom.d" ] ; then
490 if [ -d "custom.d" ] ; then
487 for SCRIPT in custom.d/*.sh; do
491 for SCRIPT in custom.d/*.sh; do
488 . "$SCRIPT"
492 . "$SCRIPT"
489 done
493 done
490 fi
494 fi
491
495
492 # Execute custom scripts inside the chroot
496 # Execute custom scripts inside the chroot
493 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
497 if [ -n "$CHROOT_SCRIPTS" ] && [ -d "$CHROOT_SCRIPTS" ] ; then
494 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
498 cp -r "${CHROOT_SCRIPTS}" "${R}/chroot_scripts"
495 chroot_exec /bin/bash -x <<'EOF'
499 chroot_exec /bin/bash -x <<'EOF'
496 for SCRIPT in /chroot_scripts/* ; do
500 for SCRIPT in /chroot_scripts/* ; do
497 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
501 if [ -f $SCRIPT -a -x $SCRIPT ] ; then
498 $SCRIPT
502 $SCRIPT
499 fi
503 fi
500 done
504 done
501 EOF
505 EOF
502 rm -rf "${R}/chroot_scripts"
506 rm -rf "${R}/chroot_scripts"
503 fi
507 fi
504
508
505 # Remove c/c++ build environment from the chroot
509 # Remove c/c++ build environment from the chroot
506 chroot_remove_cc
510 chroot_remove_cc
507
511
508 # Remove apt-utils
512 # Remove apt-utils
509 if [ "$RELEASE" = "jessie" ] ; then
513 if [ "$RELEASE" = "jessie" ] ; then
510 chroot_exec apt-get purge -qq -y --force-yes apt-utils
514 chroot_exec apt-get purge -qq -y --force-yes apt-utils
511 fi
515 fi
512
516
513 # Generate required machine-id
517 # Generate required machine-id
514 MACHINE_ID=$(dbus-uuidgen)
518 MACHINE_ID=$(dbus-uuidgen)
515 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
519 echo -n "${MACHINE_ID}" > "${R}/var/lib/dbus/machine-id"
516 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
520 echo -n "${MACHINE_ID}" > "${ETC_DIR}/machine-id"
517
521
518 # APT Cleanup
522 # APT Cleanup
519 chroot_exec apt-get -y clean
523 chroot_exec apt-get -y clean
520 chroot_exec apt-get -y autoclean
524 chroot_exec apt-get -y autoclean
521 chroot_exec apt-get -y autoremove
525 chroot_exec apt-get -y autoremove
522
526
523 # Unmount mounted filesystems
527 # Unmount mounted filesystems
524 umount -l "${R}/proc"
528 umount -l "${R}/proc"
525 umount -l "${R}/sys"
529 umount -l "${R}/sys"
526
530
527 # Clean up directories
531 # Clean up directories
528 rm -rf "${R}/run/*"
532 rm -rf "${R}/run/*"
529 rm -rf "${R}/tmp/*"
533 rm -rf "${R}/tmp/*"
530
534
531 # Clean up files
535 # Clean up files
532 rm -f "${ETC_DIR}/ssh/ssh_host_*"
536 rm -f "${ETC_DIR}/ssh/ssh_host_*"
533 rm -f "${ETC_DIR}/dropbear/dropbear_*"
537 rm -f "${ETC_DIR}/dropbear/dropbear_*"
534 rm -f "${ETC_DIR}/apt/sources.list.save"
538 rm -f "${ETC_DIR}/apt/sources.list.save"
535 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
539 rm -f "${ETC_DIR}/resolvconf/resolv.conf.d/original"
536 rm -f "${ETC_DIR}/*-"
540 rm -f "${ETC_DIR}/*-"
537 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
541 rm -f "${ETC_DIR}/apt/apt.conf.d/10proxy"
538 rm -f "${ETC_DIR}/resolv.conf"
542 rm -f "${ETC_DIR}/resolv.conf"
539 rm -f "${R}/root/.bash_history"
543 rm -f "${R}/root/.bash_history"
540 rm -f "${R}/var/lib/urandom/random-seed"
544 rm -f "${R}/var/lib/urandom/random-seed"
541 rm -f "${R}/initrd.img"
545 rm -f "${R}/initrd.img"
542 rm -f "${R}/vmlinuz"
546 rm -f "${R}/vmlinuz"
543 rm -f "${R}${QEMU_BINARY}"
547 rm -f "${R}${QEMU_BINARY}"
544
548
545 # Calculate size of the chroot directory in KB
549 # Calculate size of the chroot directory in KB
546 CHROOT_SIZE=$(expr `du -s "${R}" | awk '{ print $1 }'`)
550 CHROOT_SIZE=$(expr `du -s "${R}" | awk '{ print $1 }'`)
547
551
548 # Calculate the amount of needed 512 Byte sectors
552 # Calculate the amount of needed 512 Byte sectors
549 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
553 TABLE_SECTORS=$(expr 1 \* 1024 \* 1024 \/ 512)
550 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
554 FRMW_SECTORS=$(expr 64 \* 1024 \* 1024 \/ 512)
551 ROOT_OFFSET=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS})
555 ROOT_OFFSET=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS})
552
556
553 # The root partition is EXT4
557 # The root partition is EXT4
554 # This means more space than the actual used space of the chroot is used.
558 # This means more space than the actual used space of the chroot is used.
555 # As overhead for journaling and reserved blocks 25% are added.
559 # As overhead for journaling and reserved blocks 35% are added.
556 ROOT_SECTORS=$(expr $(expr ${CHROOT_SIZE} + ${CHROOT_SIZE} \/ 100 \* 25) \* 1024 \/ 512)
560 ROOT_SECTORS=$(expr $(expr ${CHROOT_SIZE} + ${CHROOT_SIZE} \/ 100 \* 35) \* 1024 \/ 512)
557
561
558 # Calculate required image size in 512 Byte sectors
562 # Calculate required image size in 512 Byte sectors
559 IMAGE_SECTORS=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS})
563 IMAGE_SECTORS=$(expr ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS})
560
564
561 # Prepare image file
565 # Prepare image file
562 if [ "$ENABLE_SPLITFS" = true ] ; then
566 if [ "$ENABLE_SPLITFS" = true ] ; then
563 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=${TABLE_SECTORS}
567 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=${TABLE_SECTORS}
564 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek=${FRMW_SECTORS}
568 dd if=/dev/zero of="$IMAGE_NAME-frmw.img" bs=512 count=0 seek=${FRMW_SECTORS}
565 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=${TABLE_SECTORS}
569 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=${TABLE_SECTORS}
566 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek=${ROOT_SECTORS}
570 dd if=/dev/zero of="$IMAGE_NAME-root.img" bs=512 count=0 seek=${ROOT_SECTORS}
567
571
568 # Write firmware/boot partition tables
572 # Write firmware/boot partition tables
569 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
573 sfdisk -q -L -uS -f "$IMAGE_NAME-frmw.img" 2> /dev/null <<EOM
570 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
574 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
571 EOM
575 EOM
572
576
573 # Write root partition table
577 # Write root partition table
574 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
578 sfdisk -q -L -uS -f "$IMAGE_NAME-root.img" 2> /dev/null <<EOM
575 ${TABLE_SECTORS},${ROOT_SECTORS},83
579 ${TABLE_SECTORS},${ROOT_SECTORS},83
576 EOM
580 EOM
577
581
578 # Setup temporary loop devices
582 # Setup temporary loop devices
579 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME-frmw.img)"
583 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME-frmw.img)"
580 ROOT_LOOP="$(losetup -o 1M -f --show $IMAGE_NAME-root.img)"
584 ROOT_LOOP="$(losetup -o 1M -f --show $IMAGE_NAME-root.img)"
581 else # ENABLE_SPLITFS=false
585 else # ENABLE_SPLITFS=false
582 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=${TABLE_SECTORS}
586 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=${TABLE_SECTORS}
583 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek=${IMAGE_SECTORS}
587 dd if=/dev/zero of="$IMAGE_NAME.img" bs=512 count=0 seek=${IMAGE_SECTORS}
584
588
585 # Write partition table
589 # Write partition table
586 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
590 sfdisk -q -L -uS -f "$IMAGE_NAME.img" 2> /dev/null <<EOM
587 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
591 ${TABLE_SECTORS},${FRMW_SECTORS},c,*
588 ${ROOT_OFFSET},${ROOT_SECTORS},83
592 ${ROOT_OFFSET},${ROOT_SECTORS},83
589 EOM
593 EOM
590
594
591 # Setup temporary loop devices
595 # Setup temporary loop devices
592 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME.img)"
596 FRMW_LOOP="$(losetup -o 1M --sizelimit 64M -f --show $IMAGE_NAME.img)"
593 ROOT_LOOP="$(losetup -o 65M -f --show $IMAGE_NAME.img)"
597 ROOT_LOOP="$(losetup -o 65M -f --show $IMAGE_NAME.img)"
594 fi
598 fi
595
599
596 if [ "$ENABLE_CRYPTFS" = true ] ; then
600 if [ "$ENABLE_CRYPTFS" = true ] ; then
597 # Create dummy ext4 fs
601 # Create dummy ext4 fs
598 mkfs.ext4 "$ROOT_LOOP"
602 mkfs.ext4 "$ROOT_LOOP"
599
603
600 # Setup password keyfile
604 # Setup password keyfile
601 touch .password
605 touch .password
602 chmod 600 .password
606 chmod 600 .password
603 echo -n ${CRYPTFS_PASSWORD} > .password
607 echo -n ${CRYPTFS_PASSWORD} > .password
604
608
605 # Initialize encrypted partition
609 # Initialize encrypted partition
606 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
610 echo "YES" | cryptsetup luksFormat "${ROOT_LOOP}" -c "${CRYPTFS_CIPHER}" -s "${CRYPTFS_XTSKEYSIZE}" .password
607
611
608 # Open encrypted partition and setup mapping
612 # Open encrypted partition and setup mapping
609 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
613 cryptsetup luksOpen "${ROOT_LOOP}" -d .password "${CRYPTFS_MAPPING}"
610
614
611 # Secure delete password keyfile
615 # Secure delete password keyfile
612 shred -zu .password
616 shred -zu .password
613
617
614 # Update temporary loop device
618 # Update temporary loop device
615 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
619 ROOT_LOOP="/dev/mapper/${CRYPTFS_MAPPING}"
616
620
617 # Wipe encrypted partition (encryption cipher is used for randomness)
621 # Wipe encrypted partition (encryption cipher is used for randomness)
618 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count=$(blockdev --getsz "${ROOT_LOOP}")
622 dd if=/dev/zero of="${ROOT_LOOP}" bs=512 count=$(blockdev --getsz "${ROOT_LOOP}")
619 fi
623 fi
620
624
621 # Build filesystems
625 # Build filesystems
622 mkfs.vfat "$FRMW_LOOP"
626 mkfs.vfat "$FRMW_LOOP"
623 mkfs.ext4 "$ROOT_LOOP"
627 mkfs.ext4 "$ROOT_LOOP"
624
628
625 # Mount the temporary loop devices
629 # Mount the temporary loop devices
626 mkdir -p "$BUILDDIR/mount"
630 mkdir -p "$BUILDDIR/mount"
627 mount "$ROOT_LOOP" "$BUILDDIR/mount"
631 mount "$ROOT_LOOP" "$BUILDDIR/mount"
628
632
629 mkdir -p "$BUILDDIR/mount/boot/firmware"
633 mkdir -p "$BUILDDIR/mount/boot/firmware"
630 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
634 mount "$FRMW_LOOP" "$BUILDDIR/mount/boot/firmware"
631
635
632 # Copy all files from the chroot to the loop device mount point directory
636 # Copy all files from the chroot to the loop device mount point directory
633 rsync -a "${R}/" "$BUILDDIR/mount/"
637 rsync -a "${R}/" "$BUILDDIR/mount/"
634
638
635 # Unmount all temporary loop devices and mount points
639 # Unmount all temporary loop devices and mount points
636 cleanup
640 cleanup
637
641
638 # Create block map file(s) of image(s)
642 # Create block map file(s) of image(s)
639 if [ "$ENABLE_SPLITFS" = true ] ; then
643 if [ "$ENABLE_SPLITFS" = true ] ; then
640 # Create block map files for "bmaptool"
644 # Create block map files for "bmaptool"
641 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
645 bmaptool create -o "$IMAGE_NAME-frmw.bmap" "$IMAGE_NAME-frmw.img"
642 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
646 bmaptool create -o "$IMAGE_NAME-root.bmap" "$IMAGE_NAME-root.img"
643
647
644 # Image was successfully created
648 # Image was successfully created
645 echo "$IMAGE_NAME-frmw.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
649 echo "$IMAGE_NAME-frmw.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
646 echo "$IMAGE_NAME-root.img ($(expr \( ${TABLE_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
650 echo "$IMAGE_NAME-root.img ($(expr \( ${TABLE_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
647 else
651 else
648 # Create block map file for "bmaptool"
652 # Create block map file for "bmaptool"
649 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
653 bmaptool create -o "$IMAGE_NAME.bmap" "$IMAGE_NAME.img"
650
654
651 # Image was successfully created
655 # Image was successfully created
652 echo "$IMAGE_NAME.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
656 echo "$IMAGE_NAME.img ($(expr \( ${TABLE_SECTORS} + ${FRMW_SECTORS} + ${ROOT_SECTORS} \) \* 512 \/ 1024 \/ 1024)M)" ": successfully created"
653 fi
657 fi
General Comments 0
Vous devez vous connecter pour laisser un commentaire. Se connecter maintenant