Compare commits

..

10 commits

Author SHA1 Message Date
2e4307270b UEFI: Use EFISTUB more better, qemu test, kernel flavors
The Wayland QEMU isn't currently working yet.
2024-11-13 10:55:50 -06:00
7f804885ba README: rephrase bootloader TODO list item 2024-11-04 02:41:46 -06:00
81b3326a13 UEFI: GRUB probably ain't it, chief
I'm thinking maybe I hard-code a Linux command line in my kernel image
and place the EFI stubby boi in my ESP as a file named bootx64.efi,
because I want it to *work*
2024-11-04 02:38:22 -06:00
080f25b9ef ignore: default MOUNTPOINT and README 2024-11-03 22:07:08 -06:00
348cab2a85 README: Fix formatting in TODO list 2024-11-03 22:05:34 -06:00
93f95d8e62 README: Almost complete instructions, aspirations
Will add the bootloader stuffs once it's ready!
2024-11-03 12:45:25 -06:00
50b7b8e35f Makefile: PLATFORM_PKGS, rootfs install target, genfstab 2024-11-03 12:14:43 -06:00
c47bf4777c [NEW] fs: Add btrfs and "simplefs" helpers 2024-11-03 11:58:07 -06:00
fe00065f03 README: qemu-user-static needed for cross-strapping 2024-10-26 10:53:57 -05:00
abf8cf6a8c Makefile: Add partitioning targets, open-rc services 2024-10-26 05:09:43 -05:00
9 changed files with 342 additions and 8 deletions

3
.gitignore vendored
View file

@ -1,2 +1,5 @@
destroot
repo
mnt
README.html
pandoc.css

3
.gitmodules vendored
View file

@ -10,3 +10,6 @@
[submodule "modules/aports"]
path = modules/aports
url = https://git.alpinelinux.org/aports/
[submodule "modules/bash-util"]
path = modules/bash-util
url = https://github.com/targetdisk/bash-util

View file

@ -1,5 +1,5 @@
ARCH ?= x86_64
PLATFORM ?= UEFI
PLATFORM ?= uefi
DESTROOT ?= destroot
REPO ?= repo
DOSU ?= sudo
@ -8,6 +8,52 @@ PKGS ?=
BUSYBOX ?= busybox
APORTSDIR ?= $(APORTS_MODULE)
SHELL := /usr/bin/env bash
BLKDEV ?=
ROOTFS_TYPE ?= btrfs
MOUNTPOINT ?= mnt
RUNLEVEL_SYSINIT ?= devfs dmesg mdev hwdrivers
RUNLEVEL_SHUTDOWN ?= killprocs mount-ro savecache
ifeq ($(PLATFORM),raspi)
include mk/raspi.mk
else ifeq ($(PLATFORM),uefi)
include mk/uefi.mk
endif
ifeq ($(ROOTFS_TYPE),btrfs)
include mk/btrfs.mk
else
include mk/simplefs.mk
endif
ifneq (,$(WAYLAND_DISPLAY))
XDG_BASEDIR := $(shell dirname $(XDG_RUNTIME_DIR))
WAYLAND_ASSIST := env WAYLAND_DISPLAY="$(XDG_RUNTIME_DIR)/$(WAYLAND_DISPLAY)" \
XDG_BASEDIR="$(XDG_BASEDIR)/0"
else
WAYLAND_ASSIST :=
endif
RUNLEVEL_BOOT_CMDS := $(foreach SERVICE,$(RUNLEVEL_BOOT),\
rc-update add $(SERVICE) boot &&)
RUNLEVEL_SYSINIT_CMDS := $(foreach SERVICE,$(RUNLEVEL_SYSINIT),\
rc-update add $(SERVICE) sysinit &&)
RUNLEVEL_DEFAULT_CMDS := $(foreach SERVICE,$(RUNLEVEL_DEFAULT),\
rc-update add $(SERVICE) default &&)
RUNLEVEL_SHUTDOWN_CMDS := $(foreach SERVICE,$(RUNLEVEL_SHUTDOWN),\
rc-update add $(SERVICE) shutdown &&)
RUNLEVEL_CMDS := $(RUNLEVEL_BOOT_CMDS) $(RUNLEVEL_SYSINIT_CMDS) \
$(RUNLEVEL_DEFAULT_CMDS) $(RUNLEVEL_SHUTDOWN_CMDS) :
ifneq (,$(findstring /dev/mmcblk,$(BLKDEV)))
P := p
else ifneq (,$(findstring /dev/nvme,$(BLKDEV)))
P := p
else
P :=
endif
GIMME_MODULE := git submodule update --init --recursive
@ -15,13 +61,20 @@ ABUILD_MODULE := modules/abuild
ARCH_MODULE := modules/arch-install-scripts
APK_MODULE := modules/apk-tools
APORTS_MODULE := modules/aports
BASH_UTIL_MODULE := modules/bash-util
ABUILD_SCRIPT := $(ABUILD_MODULE)/abuild
APK_BIN := $(APK_MODULE)/src/apk
ABUILD := $(BUSYBOX) ash $(CURDIR)/$(ABUILD_SCRIPT) -c -P $(CURDIR)/$(REPO) rootbld
ACHROOT := $(ARCH_MODULE)/arch-chroot
GENFSTAB := $(ARCH_MODULE)/genfstab
ACHROOT_CMD := $(DOSU) $(ACHROOT) $(DESTROOT) /bin/sh -c '. /etc/profile'
ACHROOTI_CMD := $(DOSU) $(ACHROOT) $(MOUNTPOINT) /bin/sh -c '. /etc/profile'
APK := LD_LIBRARY_PATH=$(APK_MODULE)/src $(APK_BIN)
BUTIL := . $(BASH_UTIL_MODULE)
default-target: install
### TOOLS ###
@ -33,6 +86,9 @@ $(ARCH_MODULE)/Makefile: .gitmodules
$(ACHROOT): $(ARCH_MODULE)/Makefile
$(MAKE) -j -C $(ARCH_MODULE) arch-chroot
$(GENFSTAB): $(ARCH_MODULE)/Makefile
$(MAKE) -j -C $(ARCH_MODULE) genfstab
$(APK_MODULE)/Makefile: .gitmodules
$(GIMME_MODULE) -- $(APK_MODULE)
@ -45,6 +101,9 @@ $(ABUILD_MODULE)/Makefile: .gitmodules
$(ABUILD_SCRIPT): $(ABUILD_MODULE)/Makefile
$(MAKE) -j -C $(ABUILD_MODULE) all
$(BASH_UTIL_MODULE)/Makefile: .gitmodules
$(GIMME_MODULE) -- $(BASH_UTIL_MODULE)
### PORTS TREE ###
$(APORTS_MODULE)/README.md: .gitmodules
@ -56,25 +115,107 @@ aports: $(APORTS_MODULE)/README.md
# Something will go here...
### INSTALLATION ###
### BOOTSTRAPPING ###
$(DESTROOT):
mkdir -p $(DESTROOT) || $(DOSU) mkdir -p $(DESTROOT)
$(DESTROOT)/.bootstrap-done: $(DESTROOT) $(APK_BIN)
$(DOSU) $(APK) --arch $(ARCH) -X $(ALPINE_REPO) --root $(DESTROOT) \
-U --allow-untrusted --initdb add alpine-keys $(PKGS) && touch $@
-U --allow-untrusted --initdb add alpine-keys && touch $@
$(DOSU) $(APK) --arch $(ARCH) -X $(ALPINE_REPO) --root $(DESTROOT) \
add alpine-base $(PKGS) && touch $@
add alpine-base btrfs-progs e2fsprogs $(PLATFORM_PKGS) $(PKGS) \
&& touch $@
bootstrap: $(DESTROOT)/.bootstrap-done
### PARTITIONING ###
blkcheck: $(BASH_UTIL_MODULE)/Makefile
@[ -z "$(BLKDEV)" ] && $(BUTIL)/logging.bash \
&& die 'ERROR: Must define BLKDEV env variable!' \
|| :
format: partition
$(DOSU) mkfs.vfat $(BLKDEV)$(P)1
$(DOSU) mkfs.$(ROOTFS_TYPE) -f $(BLKDEV)$(P)2
$(BLKDEV)$(P)2: partition
### INSTALLATION ###
$(DESTROOT)/.services-done: $(DESTROOT)/.bootstrap-done $(ACHROOT)
$(ACHROOT_CMD)' && $(RUNLEVEL_CMDS)'
$(DOSU) touch $@
services: $(DESTROOT)/.services-done
$(DESTROOT)/.fastrepo-done: $(DESTROOT)/.bootstrap-done $(ACHROOT)
$(ACHROOT_CMD)' && setup-apkrepos -f'
$(DOSU) touch $@
fastest-repo: $(DESTROOT)/.fastrepo-done
$(MOUNTPOINT):
mkdir -p $@ || $(DOSU) mkdir -p $@
$(MOUNTPOINT)/etc/fstab: $(GENFSTAB) mount
$(GENFSTAB) -U $(MOUNTPOINT) | $(DOSU) tee $@
fstab: $(MOUNTPOINT)/etc/fstab
mount: $(MOUNTPOINT)/.mount-done
$(MOUNTPOINT)/.install-done: fstab services fastest-repo
@[ -z "$(MOUNTPOINT)" ] && $(BUTIL)/logging.bash \
&& die 'ERROR: Must define MOUNTPOINT env variable!' \
|| :
$(DOSU) rsync -aAXHv \
--exclude=$(DESTROOT)'/dev/*' \
--exclude=$(DESTROOT)'/proc/*' \
--exclude=$(DESTROOT)'/sys/*' \
--exclude=$(DESTROOT)'/tmp/*' \
--exclude=$(DESTROOT)'/run/*' \
--exclude=$(DESTROOT)'/mnt/*' \
--exclude=$(DESTROOT)'/media/*' \
--exclude=$(DESTROOT)'/lost+found/' \
$(DESTROOT)/ $(MOUNTPOINT)
$(DOSU) touch $@
install: $(MOUNTPOINT)/.install-done
bootloader: $(MOUNTPOINT)/.bootloader-done
### POST-INSTALL TOOLS ###
# Launch a shell into the installed volume
install-chroot: $(MOUNTPOINT)/.install-done $(ACHROOT)
$(ACHROOTI_CMD)' && sh'
# Launch a shell into the local bootstrapped root
chroot: $(DESTROOT)/.bootstrap-done $(ACHROOT)
$(ACHROOT_CMD)' && sh'
### CLEANLINESS ###
clean:
clean: umount
git submodule deinit -f -- \
$(APK_MODULE) $(ABUILD_MODULE) $(APORTS_MODULE) $(ARCH_MODULE)
$(APK_MODULE) $(ABUILD_MODULE) $(APORTS_MODULE) $(ARCH_MODULE) \
$(BASH_UTIL_MODULE)
$(DOSU) rm -rf destroot/* repo/*
### MAKEY-MAKEY ###
.PHONY: tools bootstrap aports
.PHONY: default-target tools bootstrap aports blkcheck format install \
$(PLATFORM_PHONYS) mount fstab chroot
### DOCS ################ Require Pandoc to be installed ############## DOCS ###
pandoc.css:
wget https://sqt.wtf/~targetdisk/pandoc.css
# Requires Pandoc to be installed
README.html: README.md pandoc.css
pandoc $< -s -c pandoc.css -o $@
README: README.html
xdg-open $<

View file

@ -1,5 +1,5 @@
# Alpstrap
These are my scripts for brining up an Alpine system!
These are my scripts for bringing up an Alpine system!
## DEPENDENCIES
- A sane shell like GNU Bash
@ -8,10 +8,67 @@ These are my scripts for brining up an Alpine system!
- GNU `install` (from coreutils)
- M4
- GNU Autoconf
- `qemu-user-static` and its `binfmt` rules (for cross-chrooting)
You may need to install some Lua dependencies for building `apk`. If you feel
you've already installed them and it's still failing, double-check the Lua
version that `apk`'s build requires!
## USING
### TL;DR, where's the cheat sheet?
Set your `PLATFORM`, `ARCH`, and `BLKDEV` to bootstrap to:
```bash
export PLATFORM=raspi ARCH=aarch64 BLKDEV=/dev/sdb
```
> <h3>Note</h3>
>
> I like to use the `lsblk` command when locating a `BLKDEV`.
If your system has `doas` instead of `sudo`, be sure to also `export`
an appropriate `DOSU` environment variable for `make` to use:
```bash
export DOSU=doas
```
Format your `BLKDEV`:
```bash
make format
```
Then, install to the `BLKDEV` of your choosing:
```bash
make install
```
### Bootstrapping the base Alpine system
The Alpstrap system first bootstraps the base Alpine system to a `DESTROOT`
directory (an automatically-created `destroot` directory in this repository's
root) for maximum speed.
The system supports bootstrapping to
[any architecture supported by Alpine](https://dl-cdn.alpinelinux.org/alpine/latest-stable/main/)
and will support *even more* in the future once rebuilding the Alpine ports tree
is automated! All you have to do is specify your desired `PLATFORM` and `ARCH`
on the GNU `make` command line as environment variables. The currently
supported `PLATFORM`s are `uefi` (default) and `raspi`.
If you want only to bootstrap, there's a `make` target for that:
```bash
make bootstrap
```
## TODO
- [ ] Add bootloader/stub installation on UEFI
- [ ] Automate cross-compiling ports tree on non-Alpine hosts with only Git
submodules.
- [ ] Add Bcachefs support
- [ ] Make self-hosted installer
- [ ] Add PXE-netbooted installer and ad-hoc TFTP server
- [ ] Finish raspi `/boot` partition.
- [ ] Share helper scripts with upstream Alpine??
## SEE ALSO
* Alpine's [wiki page on bootstrapping](https://wiki.alpinelinux.org/wiki/Bootstrapping_Alpine_Linux)
* Alpine's [wiki page on bootloaders](https://wiki.alpinelinux.org/wiki/Bootloaders)

45
mk/btrfs.mk Normal file
View file

@ -0,0 +1,45 @@
FSOPTS ?= defaults,discard,ssd,noatime
$(MOUNTPOINT)/.subvols-done: $(BLKDEV)$(P)2 $(MOUNTPOINT)
$(DOSU) mount -o $(FSOPTS) $(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)
cd $(MOUNTPOINT) && \
$(DOSU) btrfs subvolume create alp-root-$(PLATFORM)-$(ARCH) && \
$(DOSU) btrfs subvolume create home && \
$(DOSU) btrfs subvolume create root && \
cd alp-root-$(PLATFORM)-$(ARCH) && \
$(DOSU) mkdir home root && \
$(DOSU) btrfs subvolume create etc && \
$(DOSU) btrfs subvolume create var && \
$(DOSU) btrfs subvolume create usr && \
$(DOSU) btrfs subvolume create opt
$(DOSU) umount $(MOUNTPOINT)
$(DOSU) mount -o $(FSOPTS),subvol=/alp-root-$(PLATFORM)-$(ARCH) \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)
$(DOSU) mount -o $(FSOPTS),subvol=/home \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)/home
$(DOSU) mount -o $(FSOPTS),subvol=/root \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)/root
$(DOSU) mount -o $(FSOPTS),subvol=/alp-root-$(PLATFORM)-$(ARCH)/etc \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)/etc
$(DOSU) mount -o $(FSOPTS),subvol=/alp-root-$(PLATFORM)-$(ARCH)/var \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)/var
$(DOSU) mount -o $(FSOPTS),subvol=/alp-root-$(PLATFORM)-$(ARCH)/usr \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)/usr
$(DOSU) mount -o $(FSOPTS),subvol=/alp-root-$(PLATFORM)-$(ARCH)/opt \
$(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)/opt
$(DOSU) touch $@
$(MOUNTPOINT)/.mount-done: $(MOUNTPOINT)/.subvols-done
$(DOSU) mkdir -p $(MOUNTPOINT)/boot
$(DOSU) mount -o defaults,discard $(BLKDEV)$(P)$(BOOTFS_PART) $(MOUNTPOINT)/boot
$(DOSU) touch $@
umount:
$(DOSU) umount $(MOUNTPOINT)/boot || :
$(DOSU) umount $(MOUNTPOINT)/etc || :
$(DOSU) umount $(MOUNTPOINT)/home || :
$(DOSU) umount $(MOUNTPOINT)/opt || :
$(DOSU) umount $(MOUNTPOINT)/root || :
$(DOSU) umount $(MOUNTPOINT)/usr || :
$(DOSU) umount $(MOUNTPOINT)/var || :
$(DOSU) umount $(MOUNTPOINT) || :

21
mk/raspi.mk Normal file
View file

@ -0,0 +1,21 @@
ifeq ($(ARCH),aarch64)
else ifeq ($(ARCH),armhf)
else ifeq ($(ARCH),armv7)
else
$(error $(ARCH) is unsupported on the raspi platform)
endif
PLATFORM_PHONYS := partition kernel
KERNEL_FLAVOR := rpi
KERNEL_PKG := linux-$(KERNEL_FLAVOR)
PLATFORM_PKGS := $(KERNEL_PKG)
BOOTFS_PART := 1
ROOTFS_PART := 2
RUNLEVEL_BOOT ?= modules bootmisc hostname networking seedrng swap
RUNLEVEL_DEFAULT ?= crond
partition: blkcheck
$(DOSU) fdisk $(BLKDEV) <<<$$'o\nw\n'
$(DOSU) sfdisk $(BLKDEV) <<<$$',1G,c,*\n,,83,\n'

11
mk/simplefs.mk Normal file
View file

@ -0,0 +1,11 @@
FSOPTS ?= defaults,discard,noatime
$(MOUNTPOINT)/.mount-done: $(BLKDEV)$(P)2 $(MOUNTPOINT)
$(DOSU) mount -o $(FSOPTS) $(BLKDEV)$(P)$(ROOTFS_PART) $(MOUNTPOINT)
$(DOSU) mkdir -p $(MOUNTPOINT)/boot
$(DOSU) mount -o $(FSOPTS) $(BLKDEV)$(P)$(BOOTFS_PART) $(MOUNTPOINT)/boot
$(DOSU) touch $@
umount:
$(DOSU) umount $(MOUNTPOINT)/boot || :
$(DOSU) umount $(MOUNTPOINT) || :

52
mk/uefi.mk Normal file
View file

@ -0,0 +1,52 @@
PLATFORM_PHONYS := partition kernel
KERNEL_FLAVOR ?= lts
KERNEL_PKG := linux-$(KERNEL_FLAVOR)
PLATFORM_PKGS := $(KERNEL_PKG)
BOOTFS_PART := 1
ROOTFS_PART := 2
RUNLEVEL_BOOT ?= hwclock modules bootmisc hostname networking seedrng swap
RUNLEVEL_DEFAULT ?= acpid crond
ifeq ($(ARCH),x86_64)
OVMF_ARCH := x64
else ifeq ($(ARCH),x86)
OVMF_ARCH := ia32
else ifneq (,$(findstring arm,$(ARCH)))
OVMF_ARCH := arm
else
OVMF_ARCH := $(ARCH)
endif
ifeq ($(ARCH),$(shell uname -m))
KVMFLAGS := -enable-kvm -cpu host
else
KVMFLAGS :=
endif
QEMU_OVMF ?= /usr/share/ovmf/$(OVMF_ARCH)/OVMF.fd
QEMU_SMP ?= 2
QEMU_MEM ?= 1G
partition: blkcheck
$(DOSU) fdisk $(BLKDEV) <<<$$'g\nw\n'
$(DOSU) sfdisk $(BLKDEV) <<<$$',1G,C12A7328-F81F-11D2-BA4B-00A0C93EC93B,*\n,,0FC63DAF-8483-4772-8E79-3D69D8477DE4,\n'
$(MOUNTPOINT)/boot/startup.nsh:
$(MAKE) blkcheck
@echo 'vmlinuz-$(KERNEL_FLAVOR) rw root=UUID=$(shell lsblk -rno UUID $(BLKDEV)$(P)$(ROOTFS_PART)) initrd=\initramfs-$(KERNEL_FLAVOR)' \
| $(DOSU) tee $@
$(MOUNTPOINT)/.bootloader-done: $(MOUNTPOINT)/boot/startup.nsh
touch $@
qemu-test: umount
$(DOSU) $(WAYLAND_ASSIST) qemu-system-$(ARCH) \
$(KVMFLAGS) \
-smp $(QEMU_SMP) \
-m $(QEMU_MEM) \
-bios $(QEMU_OVMF) \
-vga std -display gtk \
-drive driver=raw,file.filename=$(BLKDEV) \
-net user

1
modules/bash-util Submodule

@ -0,0 +1 @@
Subproject commit bd3ddab28f6a754e7ffc15e88257614aff0892ff