added README.md
This commit is contained in:
parent
6893cd3495
commit
4a77046bb4
127
README.md
Normal file
127
README.md
Normal file
@ -0,0 +1,127 @@
|
||||
# Raspberry PI Alpine Linux Image Builder
|
||||
|
||||
Create minimal Linux images based on [Alpine Linux](https://alpinelinux.org/)
|
||||
for the [Raspberry PI](https://www.raspberrypi.org/).
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
* Alpine base
|
||||
* Small image size
|
||||
* Fast image build
|
||||
* A/B partition schema
|
||||
* Simple update of whole system
|
||||
* Fallback if update failed
|
||||
* Single image for every Raspberry PI
|
||||
* Read only root filesystem
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
### Image Creation
|
||||
|
||||
> A simple example for a go application can be found in the [example](example/)
|
||||
> directory.
|
||||
|
||||
To generate an empty image simply run:
|
||||
```
|
||||
docker run --rm -it -v $PWD/output:/output bboehmke/raspi-alpine-builder
|
||||
```
|
||||
|
||||
This will create 2 image files in the directory `$PWD/output/`:
|
||||
* `alpine.img.gz`: complete SD card image for the raspberry
|
||||
* `alpine_update.img.gz`: image of root partition to update running raspberry
|
||||
|
||||
> For each image a *.sha256 file will be generated to validate integrity.
|
||||
|
||||
To add custom modifications mount a script to `/input/image.sh`.
|
||||
The following variables can be useful for the for and `image.sh`:
|
||||
|
||||
| Variable | Description |
|
||||
| ----------- | --------------------------- |
|
||||
| INPUT_PATH | Path to input directory |
|
||||
| ROOTFS_PATH | Path to new root filesystem |
|
||||
| BOOTFS_PATH | Path to new boot filesystem |
|
||||
| DATAFS_PATH | Path to new data filesystem |
|
||||
|
||||
There is also a function `chroot_exec` that can be used to run command inside
|
||||
the new root filesystem. To enable a service called `example_daemon` simple run:
|
||||
```
|
||||
chroot_exec rc-update add example_daemon default
|
||||
```
|
||||
|
||||
#### Config Variables
|
||||
|
||||
The following variables can be used to modify the base behaviour of the image
|
||||
builder.
|
||||
|
||||
| Variable | Default Value | Description |
|
||||
| --------------------- | ------------------------------------ | -------------------------------- |
|
||||
| ALPINE_MIRROR | http://dl-cdn.alpinelinux.org/alpine | Mirror used for package download |
|
||||
| ALPINE_BRANCH | 3.10 | [Alpine Branch](https://wiki.alpinelinux.org/wiki/Alpine_Linux:Releases) to use for image |
|
||||
| DEFAULT_TIMEZONE | Etc/UTC | Default [Timezone](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) to use for image |
|
||||
| DEFAULT_HOSTNAME | alpine | Default hostname |
|
||||
| DEFAULT_ROOT_PASSWORD | alpine | Default password for root user |
|
||||
| SIZE_BOOT | 100M | Size of boot partition |
|
||||
| SIZE_ROOT_FS | 200M | Size of root file system |
|
||||
| SIZE_ROOT_PART | 500M | Size of root partition |
|
||||
| SIZE_DATA | 20M | Initial Size of data partition |
|
||||
| IMG_NAME | sdcard | Base name of created image file |
|
||||
|
||||
### Update running system
|
||||
|
||||
The system can be updated without a complete flash of the SD card from the
|
||||
running system with the following steps:
|
||||
|
||||
1. Transfer the update image to the running system
|
||||
2. (Optional) Validate integrity of image with checksum file
|
||||
3. Write the image to the actual inactive partition
|
||||
4. Switch active partition
|
||||
5. Reboot system
|
||||
|
||||
> An example implementation can be found in the helper script
|
||||
> [ab_flash](resources/scripts/ab_flash)
|
||||
|
||||
## Image structure
|
||||
|
||||
### Partition Layout
|
||||
|
||||
The image contains 4 partitions:
|
||||
|
||||
1. **Boot:** (Size: `SIZE_BOOT`) \
|
||||
Contains boot loader and boot configuration
|
||||
|
||||
2. **Root A:** (Size: `SIZE_ROOT_PART`) \
|
||||
Contains complete root filesystem including all required kernels
|
||||
|
||||
3. **Root B:** (Size: `SIZE_ROOT_PART`) \
|
||||
Same as *Root A*
|
||||
|
||||
4. **Data:** (Size: Initial `SIZE_DATA` & increases on first start) \
|
||||
Contains persistent data for both root partitions
|
||||
|
||||
> With the exception of the data partition every partition is mounted read only
|
||||
|
||||
The A/B root partitions enables an easy and reliable way to update the complete
|
||||
system. This is done by flashing the inactive partition with a new root
|
||||
filesystem and make this partition active. If this new filesystem does not boot
|
||||
the boot loader will fallback to the old partition.
|
||||
|
||||
The root file system should be as small as possible to reduce the update time
|
||||
later. To support future increase of the root file system the partition should
|
||||
contain some free space.
|
||||
|
||||
### Boot loader
|
||||
|
||||
To support the A/B partition schema the [U-Boot](https://www.denx.de/wiki/U-Boot)
|
||||
boot loader is used.
|
||||
|
||||
The configuration/script for the boot loader can be found in the
|
||||
[boot.cmd](resources/boot.cmd). This will boot the active root partition and
|
||||
switch the active partition if the active one will not start.
|
||||
> This script also select the right kernel for old Raspberry PIs
|
||||
|
||||
The image contains a simple tool that resets the boot counter and switch the
|
||||
active partition from the running OS. The sources of the script can be found
|
||||
in the [uboot.c](resources/uboot.c).
|
||||
|
@ -15,7 +15,7 @@ set -e
|
||||
: ${SIZE_ROOT_FS:="200M"}
|
||||
: ${SIZE_ROOT_PART:="500M"}
|
||||
: ${SIZE_DATA:="20M"}
|
||||
: ${IMG_NAME:="alpine-${ALPINE_BRANCH}-sdcard"}
|
||||
: ${IMG_NAME:="sdcard"}
|
||||
|
||||
|
||||
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
||||
|
Loading…
Reference in New Issue
Block a user