2017-01-20 17:29:01 +00:00
|
|
|
# pi-gen
|
2017-05-06 23:16:00 +00:00
|
|
|
|
2017-01-20 17:29:01 +00:00
|
|
|
_Tool used to create the raspberrypi.org Raspbian images_
|
2016-04-11 06:25:30 +00:00
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
|
2017-01-20 17:29:01 +00:00
|
|
|
### TODO
|
2016-04-11 06:25:30 +00:00
|
|
|
1. Documentation
|
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
|
2017-01-20 17:29:01 +00:00
|
|
|
## Dependencies
|
2016-04-11 06:25:30 +00:00
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
On Debian-based systems:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
apt-get install quilt parted realpath qemu-user-static debootstrap zerofree pxz zip \
|
|
|
|
dosfstools bsdtar libcap2-bin grep rsync
|
|
|
|
```
|
|
|
|
|
|
|
|
The file `depends` contains a list of tools needed. The format of this
|
|
|
|
package is `<tool>[:<debian-package>]`.
|
|
|
|
|
2016-09-05 04:02:39 +00:00
|
|
|
|
2017-01-20 17:29:01 +00:00
|
|
|
## Config
|
2016-09-05 04:02:39 +00:00
|
|
|
|
|
|
|
Upon execution, `build.sh` will source the file `config` in the current
|
|
|
|
working directory. This bash shell fragment is intended to set needed
|
|
|
|
environment variables.
|
|
|
|
|
|
|
|
The following environment variables are supported:
|
|
|
|
|
2016-10-05 21:56:45 +00:00
|
|
|
* `IMG_NAME` **required** (Default: unset)
|
|
|
|
|
|
|
|
The name of the image to build with the current stage directories. Setting
|
|
|
|
`IMG_NAME=Raspbian` is logical for an unmodified RPi-Distro/pi-gen build,
|
|
|
|
but you should use something else for a customized version. Export files
|
|
|
|
in stages may add suffixes to `IMG_NAME`.
|
|
|
|
|
|
|
|
* `APT_PROXY` (Default: unset)
|
|
|
|
|
|
|
|
If you require the use of an apt proxy, set it here. This proxy setting
|
|
|
|
will not be included in the image, making it safe to use an `apt-cacher` or
|
|
|
|
similar package for development.
|
|
|
|
|
2017-07-17 10:17:15 +00:00
|
|
|
If you have Docker installed, you can set up a local apt caching proxy to
|
|
|
|
like speed up subsequent builds like this:
|
|
|
|
|
|
|
|
docker-compose up -d
|
|
|
|
echo 'APT_PROXY=http://172.17.0.1:3142' >> config
|
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
* `BASE_DIR` (Default: location of `build.sh`)
|
|
|
|
|
|
|
|
**CAUTION**: Currently, changing this value will probably break build.sh
|
|
|
|
|
|
|
|
Top-level directory for `pi-gen`. Contains stage directories, build
|
|
|
|
scripts, and by default both work and deployment directories.
|
|
|
|
|
|
|
|
* `WORK_DIR` (Default: `"$BASE_DIR/work"`)
|
|
|
|
|
|
|
|
Directory in which `pi-gen` builds the target system. This value can be
|
|
|
|
changed if you have a suitably large, fast storage location for stages to
|
|
|
|
be built and cached. Note, `WORK_DIR` stores a complete copy of the target
|
|
|
|
system for each build stage, amounting to tens of gigabytes in the case of
|
|
|
|
Raspbian.
|
|
|
|
|
|
|
|
* `DEPLOY_DIR` (Default: `"$BASE_DIR/deploy"`)
|
|
|
|
|
|
|
|
Output directory for target system images and NOOBS bundles.
|
|
|
|
|
|
|
|
|
2016-09-05 04:02:39 +00:00
|
|
|
A simple example for building Raspbian:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
IMG_NAME='Raspbian'
|
|
|
|
```
|
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
|
2017-01-23 12:44:03 +00:00
|
|
|
## Docker Build
|
|
|
|
|
|
|
|
```bash
|
|
|
|
vi config # Edit your config file. See above.
|
|
|
|
./build-docker.sh
|
|
|
|
```
|
2017-05-06 23:16:00 +00:00
|
|
|
|
2017-01-23 12:44:03 +00:00
|
|
|
If everything goes well, your finished image will be in the `deploy/` folder.
|
2017-05-17 15:36:04 +00:00
|
|
|
You can then remove the build container with `docker rm -v pigen_work`
|
2016-09-05 04:02:39 +00:00
|
|
|
|
2017-01-23 12:44:03 +00:00
|
|
|
If something breaks along the line, you can edit the corresponding scripts, and
|
|
|
|
continue:
|
2017-02-08 16:10:11 +00:00
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
```bash
|
2017-01-23 12:44:03 +00:00
|
|
|
CONTINUE=1 ./build-docker.sh
|
|
|
|
```
|
2016-09-05 04:02:39 +00:00
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
There is a possibility that even when running from a docker container, the
|
|
|
|
installation of `qemu-user-static` will silently fail when building the image
|
|
|
|
because `binfmt-support` _must be enabled on the underlying kernel_. An easy
|
|
|
|
fix is to ensure `binfmt-support` is installed on the host machine before
|
|
|
|
starting the `./build-docker.sh` script (or using your own docker build
|
|
|
|
solution).
|
|
|
|
|
2017-02-08 16:10:11 +00:00
|
|
|
|
2017-01-23 12:44:03 +00:00
|
|
|
## Stage Anatomy
|
2016-09-05 04:02:39 +00:00
|
|
|
|
2017-01-20 17:29:01 +00:00
|
|
|
### Raspbian Stage Overview
|
2016-09-05 04:02:39 +00:00
|
|
|
|
|
|
|
The build of Raspbian is divided up into several stages for logical clarity
|
|
|
|
and modularity. This causes some initial complexity, but it simplifies
|
|
|
|
maintenance and allows for more easy customization.
|
|
|
|
|
2017-01-20 17:36:29 +00:00
|
|
|
- **Stage 0** - bootstrap. The primary purpose of this stage is to create a
|
2016-09-05 04:02:39 +00:00
|
|
|
usable filesystem. This is accomplished largely through the use of
|
|
|
|
`debootstrap`, which creates a minimal filesystem suitable for use as a
|
|
|
|
base.tgz on Debian systems. This stage also configures apt settings and
|
|
|
|
installs `raspberrypi-bootloader` which is missed by debootstrap. The
|
|
|
|
minimal core is installed but not configured, and the system will not quite
|
|
|
|
boot yet.
|
|
|
|
|
2017-01-20 17:36:29 +00:00
|
|
|
- **Stage 1** - truly minimal system. This stage makes the system bootable by
|
2016-09-05 04:02:39 +00:00
|
|
|
installing system files like `/etc/fstab`, configures the bootloader, makes
|
|
|
|
the network operable, and installs packages like raspi-config. At this
|
|
|
|
stage the system should boot to a local console from which you have the
|
|
|
|
means to perform basic tasks needed to configure and install the system.
|
|
|
|
This is as minimal as a system can possibly get, and its arguably not
|
|
|
|
really usable yet in a traditional sense yet. Still, if you want minimal,
|
|
|
|
this is minimal and the rest you could reasonably do yourself as sysadmin.
|
|
|
|
|
2017-01-20 17:36:29 +00:00
|
|
|
- **Stage 2** - lite system. This stage produces the Raspbian-Lite image. It
|
2016-09-05 04:02:39 +00:00
|
|
|
installs some optimized memory functions, sets timezone and charmap
|
|
|
|
defaults, installs fake-hwclock and ntp, wifi and bluetooth support,
|
|
|
|
dphys-swapfile, and other basics for managing the hardware. It also
|
|
|
|
creates necessary groups and gives the pi user access to sudo and the
|
|
|
|
standard console hardware permission groups.
|
|
|
|
|
|
|
|
There are a few tools that may not make a whole lot of sense here for
|
2017-07-27 10:11:07 +00:00
|
|
|
development purposes on a minimal system such as basic Python and Lua
|
2016-09-05 04:02:39 +00:00
|
|
|
packages as well as the `build-essential` package. They are lumped right
|
|
|
|
in with more essential packages presently, though they need not be with
|
|
|
|
pi-gen. These are understandable for Raspbian's target audience, but if
|
2017-07-27 10:11:07 +00:00
|
|
|
you were looking for something between truly minimal and Raspbian-Lite,
|
2016-09-05 04:02:39 +00:00
|
|
|
here's where you start trimming.
|
|
|
|
|
2017-01-20 17:36:29 +00:00
|
|
|
- **Stage 3** - desktop system. Here's where you get the full desktop system
|
2016-09-05 04:02:39 +00:00
|
|
|
with X11 and LXDE, web browsers, git for development, Raspbian custom UI
|
|
|
|
enhancements, etc. This is a base desktop system, with some development
|
|
|
|
tools installed.
|
|
|
|
|
2017-06-27 12:16:41 +00:00
|
|
|
- **Stage 4** - Raspbian system meant to fit on a 4GB card. More development
|
|
|
|
tools, an email client, learning tools like Scratch, specialized packages
|
|
|
|
like sonic-pi, system documentation, office productivity, etc. This is the
|
|
|
|
stage that installs all of the things that make Raspbian friendly to new
|
|
|
|
users.
|
|
|
|
|
|
|
|
- **Stage 5** - The official Raspbian Desktop image. Right now only adds
|
|
|
|
Mathematica.
|
2017-05-06 23:16:00 +00:00
|
|
|
|
2017-01-20 17:36:29 +00:00
|
|
|
### Stage specification
|
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
If you wish to build up to a specified stage (such as building up to stage 2
|
|
|
|
for a lite system), place an empty file named `SKIP` in each of the `./stage`
|
|
|
|
directories you wish not to include.
|
2017-01-20 17:36:29 +00:00
|
|
|
|
2017-05-06 23:16:00 +00:00
|
|
|
Then remove the `EXPORT*` files from `./stage4` (if building up to stage 2) or
|
|
|
|
from `./stage2` (if building a minimal system).
|
|
|
|
|
|
|
|
```bash
|
2017-01-20 17:36:29 +00:00
|
|
|
# Example for building a lite system
|
2017-05-17 11:27:57 +00:00
|
|
|
echo "IMG_NAME='Raspbian'" > config
|
|
|
|
touch ./stage3/SKIP ./stage4/SKIP ./stage5/SKIP
|
2017-05-06 23:16:00 +00:00
|
|
|
rm stage4/EXPORT*
|
2017-05-17 11:27:57 +00:00
|
|
|
sudo ./build.sh # or ./build-docker.sh
|
2017-01-23 12:44:03 +00:00
|
|
|
```
|
2017-05-06 23:16:00 +00:00
|
|
|
|
|
|
|
If you wish to build further configurations upon (for example) the lite
|
|
|
|
system, you can also delete the contents of `./stage3` and `./stage4` and
|
|
|
|
replace with your own contents in the same format.
|