Initial scaffold
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
# Keru OS — top-level convenience targets.
|
||||
# These are thin wrappers around the real shell scripts.
|
||||
|
||||
SHELL := sh
|
||||
|
||||
# sibling repos (override if cloned elsewhere)
|
||||
KAMA ?= ../kama
|
||||
PKGS ?= ../kama-packages
|
||||
|
||||
.PHONY: iso install recipe-check clean
|
||||
|
||||
iso:
|
||||
sh scripts/build-root.sh
|
||||
sh iso/build-iso.sh
|
||||
|
||||
install:
|
||||
sh installer/install.sh
|
||||
|
||||
recipe-check:
|
||||
@for f in $(PKGS)/*.sh; do \
|
||||
sh -n "$$f" && echo "OK $$f" || echo "FAIL $$f"; \
|
||||
done
|
||||
|
||||
clean:
|
||||
rm -rf iso/work /tmp/keru
|
||||
@@ -0,0 +1,76 @@
|
||||
# Keru OS
|
||||
|
||||
An independent, source-only Linux distribution built around one idea: you
|
||||
don't install a system, you *craft* one.
|
||||
|
||||
This repository holds the **operating system itself** — the installer, the ISO
|
||||
build tooling, the profile system, and the build pipeline. The two things Keru
|
||||
depends on live in their own repositories:
|
||||
|
||||
- **[kama](https://github.com/AstralZX/kama)** — the package manager (a shell script)
|
||||
- **[kama-packages](https://github.com/AstralZX/kama-packages)** — the recipe repository
|
||||
|
||||
## What is Keru
|
||||
|
||||
Every package on Keru is built from source by **Kama**, a deliberately small
|
||||
package manager that simply runs the commands in each recipe. No binary
|
||||
packages, no opaque package machinery. The whole system — toolchain included —
|
||||
is compiled from original source, and the install image is assembled by hand
|
||||
rather than with a stock tool like archiso.
|
||||
|
||||
Runit handles services. The standard Linux kernel drives the hardware.
|
||||
`nmtui` manages networking. Nothing you didn't ask for ends up on the disk.
|
||||
|
||||
## The differentiator: craft your system at install time
|
||||
|
||||
Keru's installer is a TUI that walks you through designing your exact machine
|
||||
*before* it ever boots:
|
||||
|
||||
- **init system** — Runit (default), s6, OpenRC, systemd
|
||||
- **C library** — glibc or musl
|
||||
- **filesystem** — ext4, btrfs, xfs, zfs, f2fs
|
||||
- **kernel** — linux, linux-lts, linux-hardened
|
||||
|
||||
Swappable at install time, fixed at first boot. The system that lands on your
|
||||
disk is precisely the one you chose.
|
||||
|
||||
## Repository layout
|
||||
|
||||
```
|
||||
installer/ TUI installer — writes make.conf from your choices
|
||||
iso/ from-scratch ISO build tooling (xorriso + squashfs + syslinux)
|
||||
profile/ make.conf template (the swappables + build flags)
|
||||
scripts/ build pipeline: build-root, mkfs-root, common helpers
|
||||
docs/ design docs + the recipe format spec
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
The three repos should sit next to each other (or point at each other via
|
||||
`KAMA_DIR` / `PKGS_DIR` / `PKGDIR`):
|
||||
|
||||
```
|
||||
~/dev/
|
||||
├── KeruOS/
|
||||
├── kama/
|
||||
└── kama-packages/
|
||||
```
|
||||
|
||||
Then, from `KeruOS/`:
|
||||
|
||||
```sh
|
||||
make install # run the TUI installer
|
||||
# or, headlessly:
|
||||
sh scripts/build-root.sh # build a rootfs into /tmp/keru/root
|
||||
make iso # assemble an install image
|
||||
```
|
||||
|
||||
Requires the sibling `kama` and `kama-packages` repos to be present.
|
||||
|
||||
## Status
|
||||
|
||||
Design + scaffolding. Nothing is building end-to-end yet.
|
||||
|
||||
## License
|
||||
|
||||
AGPL-3.0
|
||||
@@ -0,0 +1,19 @@
|
||||
# design/index
|
||||
|
||||
This directory holds the working design for Keru OS. The code is scaffolding
|
||||
and not yet functional end-to-end.
|
||||
|
||||
## What exists
|
||||
|
||||
- `recipe-format.md` — the Kama recipe format (easy/advanced tiers)
|
||||
- `README.md` (repo root) — project identity + layout
|
||||
|
||||
## Open design questions
|
||||
|
||||
- **Bootstrapping toolchain**: chicken-and-egg — the first compiler must be
|
||||
obtained somehow. Options: a documented one-time bootstrap from a binary
|
||||
seed, or a multi-stage rebuild (host -> minimal -> full). Not yet decided.
|
||||
- **No dependency resolver**: how upgrades/rebuilds are handled for a system
|
||||
that's "built once at install." Currently framed as install-time-only.
|
||||
- **Cache artifacts vs. rebuilds**: whether the build cache stores binaries
|
||||
for fast re-install or always recompiles.
|
||||
@@ -0,0 +1,121 @@
|
||||
# Kama recipe format
|
||||
#
|
||||
# A package is a plain POSIX shell script that describes how to compile and
|
||||
# install one piece of software. The syntax is split into two tiers:
|
||||
#
|
||||
# EASY - declare three variables, fill in build + install, done.
|
||||
# The common case for 90% of packages (autotools/cmake/meson).
|
||||
#
|
||||
# ADVANCED - full control when you need it: custom fetch/extract, staging
|
||||
# layout, packaging hooks, multi-arch, verification, etc.
|
||||
# Everything the easy tier does is just sugar over this.
|
||||
#
|
||||
# In both tiers, Kama sources the recipe and runs the functions you define.
|
||||
#
|
||||
#
|
||||
# =========================================================================
|
||||
# EASY TIER — most packages only need this
|
||||
# =========================================================================
|
||||
#
|
||||
# name=busybox
|
||||
# version=1.36.1
|
||||
# url=https://busybox.net/downloads/busybox-1.36.1.tar.bz2
|
||||
# deps=() # build-time deps, purged after (AUR-style)
|
||||
#
|
||||
# build() { # configure + compile
|
||||
# make defconfig
|
||||
# make
|
||||
# }
|
||||
#
|
||||
# install() { # install into $pkgdir (staging), not $ROOT
|
||||
# make install CONFIG_PREFIX="$pkgdir"
|
||||
# }
|
||||
#
|
||||
# That's it. Kama supplies the conventional pkg_fetch (download + extract --
|
||||
# auto-detects tar.xz/.gz/.bz2/.zip, strips the top dir) and pkg_clean.
|
||||
#
|
||||
#
|
||||
# =========================================================================
|
||||
# ADVANCED TIER — override any step, add packaging control
|
||||
# =========================================================================
|
||||
#
|
||||
# name=busybox
|
||||
# version=1.36.1
|
||||
# url=https://busybox.net/downloads/busybox-1.36.1.tar.bz2
|
||||
# deps=(gcc musl-headers) # temp build deps (AUR-style)
|
||||
# runtime_deps=(musl) # stays installed
|
||||
# license=(GPL-2.0)
|
||||
# provides=(sh) # capability this package provides
|
||||
# conflicts=(dash) # mutual exclusion
|
||||
# arch=(x86_64) # if non-empty, restrict to archs
|
||||
# noextract=() # URLs to download but NOT auto-extract
|
||||
#
|
||||
# # override auto extract (e.g. patching before configure)
|
||||
# pkg_fetch() {
|
||||
# default_fetch # run the easy-tier default
|
||||
# cd "$src"
|
||||
# patch -p1 < ../my.patch
|
||||
# }
|
||||
#
|
||||
# build() { ./configure --prefix=/usr "$@" && make; }
|
||||
# install() { make install DESTDIR="$pkgdir"; }
|
||||
#
|
||||
# # split headers/binary into separate sub-package stage (advanced)
|
||||
# pkg_split() { ... }
|
||||
#
|
||||
# # run after install, before purge (e.g. generate ldconfig cache)
|
||||
# pkg_post() { msg "post-install hook"; }
|
||||
#
|
||||
#
|
||||
# =========================================================================
|
||||
# FULL FUNCTION REFERENCE
|
||||
# =========================================================================
|
||||
#
|
||||
# Variables (easy tier):
|
||||
# name, version, url, deps
|
||||
#
|
||||
# Variables (advanced, all optional):
|
||||
# runtime_deps, license, provides, conflicts, arch, noextract
|
||||
#
|
||||
# Functions:
|
||||
# build() - configure + compile into $src (also callable `pkg_build`)
|
||||
# install() - install into $pkgdir (also callable `pkg_install`)
|
||||
# pkg_fetch - override download/extract (call `default_fetch` for the
|
||||
# easy-tier default)
|
||||
# pkg_clean - override cleanup
|
||||
# pkg_post - run after install, before temp deps are purged
|
||||
# pkg_split - split staging into multiple sub-packages (advanced)
|
||||
#
|
||||
# Easy-tier aliases: `build` and `install` are sugar; if you define them,
|
||||
# Kama maps them to pkg_build / pkg_install automatically. Defining the
|
||||
# pkg_* forms directly also works (that IS the advanced way).
|
||||
#
|
||||
# Provided by Kama (do not redefine):
|
||||
# $src - build dir (cannot be changed)
|
||||
# $pkg - pkg dir alt alias for $pkgdir
|
||||
# $pkgdir - staging dir; Kama moves $pkgdir/* into $ROOT after success
|
||||
# $CACHEDIR, $ROOT, $CFLAGS, ... from make.conf
|
||||
# msg() warn() die()
|
||||
# default_fetch - the easy-tier fetch/extract implementation
|
||||
|
||||
# ---- easy-tier defaults (override as needed) ----------------------------
|
||||
name=
|
||||
version=
|
||||
url=
|
||||
deps=()
|
||||
|
||||
# ---- advanced overrides (all optional) ----------------------------------
|
||||
runtime_deps=()
|
||||
license=()
|
||||
provides=()
|
||||
conflicts=()
|
||||
arch=()
|
||||
noextract=()
|
||||
|
||||
# ---- functions -----------------------------------------------------------
|
||||
build() { :; } # or pkg_build
|
||||
install() { :; } # or pkg_install
|
||||
pkg_fetch() { :; }
|
||||
pkg_clean() { :; }
|
||||
pkg_post() { :; }
|
||||
pkg_split() { :; }
|
||||
Executable
+90
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env sh
|
||||
# keru-install — the Keru OS TUI installer
|
||||
#
|
||||
# Walks you through crafting your exact system, then writes make.conf and
|
||||
# kicks off the build. Everything is swappable here, at install time, and
|
||||
# locked in when you boot.
|
||||
#
|
||||
# Designed to run from the Keru live ISO. Backed by dialog/whiptail if
|
||||
# present; falls back to plain prompted input. All shell, no magic.
|
||||
|
||||
set -eu
|
||||
|
||||
. "$(dirname "$0")/../scripts/common.sh"
|
||||
|
||||
# ---- defaults (mirror profile/make.conf) --------------------------------
|
||||
OUT="${MAKE_CONF_OUT:-/tmp/keru/make.conf}"
|
||||
DROP="/tmp/keru"
|
||||
mkdir -p "$DROP"
|
||||
|
||||
# ---- menu helpers -------------------------------------------------------
|
||||
pick() { # prompt, array-of-labels, defaults -> writes choice to $CHOICE
|
||||
local prompt="$1"; shift
|
||||
local default="$1"; shift
|
||||
CHOICE="$default"
|
||||
if command -v dialog >/dev/null 2>&1; then
|
||||
local args=()
|
||||
local i=0
|
||||
for opt in "$@"; do
|
||||
args+=("$i" "$opt")
|
||||
i=$((i+1))
|
||||
done
|
||||
local sel
|
||||
sel=$(dialog --stdout --no-cancel --menu "$prompt" 15 60 8 \
|
||||
--default-item "$default" "${args[@]}") || true
|
||||
CHOICE=$(eval "printf '%s' \"\${$((sel+1)):-\$default}\"" 2>/dev/null || printf '%s' "$default")
|
||||
else
|
||||
printf '%s\n' "== $prompt =="
|
||||
local n=1
|
||||
for opt in "$@"; do
|
||||
printf ' %s) %s\n' "$n" "$opt"
|
||||
n=$((n+1))
|
||||
done
|
||||
printf 'Select [%s]: ' "$default"
|
||||
read -r sel
|
||||
[ -n "$sel" ] && CHOICE=$(eval "printf '%s' \"\${$sel}\"") || CHOICE="$default"
|
||||
fi
|
||||
}
|
||||
|
||||
# ---- swappable selections ------------------------------------------------
|
||||
banner "Keru OS — craft your system"
|
||||
|
||||
pick "Init system" runit runit s6 openrc systemd
|
||||
INIT="$CHOICE"
|
||||
|
||||
pick "C library" glibc glibc musl
|
||||
LIBC="$CHOICE"
|
||||
|
||||
pick "Filesystem" ext4 ext4 btrfs xfs zfs f2fs
|
||||
TARGET_FS="$CHOICE"
|
||||
|
||||
pick "Kernel" linux linux linux-lts linux-hardened
|
||||
KERNEL="$CHOICE"
|
||||
|
||||
pick "Network tools" nmtui networkmanager nmtui connman
|
||||
NET="$CHOICE"
|
||||
|
||||
# ---- assemble make.conf ------------------------------------------------
|
||||
msg "writing $OUT"
|
||||
cat > "$OUT" <<EOF
|
||||
# Generated by keru-install — hand-tune then rebuild if you like.
|
||||
INIT=$INIT
|
||||
LIBC=$LIBC
|
||||
TARGET_FS=$TARGET_FS
|
||||
KERNEL=$KERNEL
|
||||
NET=$NET
|
||||
LICENSE_ACCEPT=(*)
|
||||
EOF
|
||||
|
||||
msg "profile complete:"
|
||||
cat "$OUT"
|
||||
|
||||
read -r -p "Build now? [y/N] " go
|
||||
case "$go" in
|
||||
y|Y|yes)
|
||||
"$(dirname "$0")/../scripts/build-root.sh" "$OUT"
|
||||
;;
|
||||
*)
|
||||
msg "saved profile to $OUT (run scripts/build-root.sh to build)"
|
||||
;;
|
||||
esac
|
||||
Executable
+51
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env sh
|
||||
# build-iso.sh — assemble a Keru OS ISO from the built rootfs and kernel
|
||||
#
|
||||
# From-scratch approach (no archiso): we lay out the classic isohybrid
|
||||
# structure manually, squash the rootfs, and generate the ISO with xorriso +
|
||||
# isolinux/syslinux (or syslinux's isohybrid). This is the LFS/Debian-live
|
||||
# style path.
|
||||
#
|
||||
# Requires on the build host: xorriso, squashfs-tools, syslinux/isolinux.
|
||||
|
||||
set -eu
|
||||
. "$(dirname "$0")/common.sh"
|
||||
|
||||
ROOT="${ROOT:-/tmp/keru/root}" # target rootfs (from make.conf)
|
||||
ISO_OUT="${ISO_OUT:-$KERU_ROOT/iso/keru-$(date +%Y%m%d).iso}"
|
||||
WORK="$KERU_ROOT/iso/work"
|
||||
ISOIMG="$WORK/isolinux"
|
||||
|
||||
info "building Keru ISO -> $ISO_OUT"
|
||||
[ -d "$ROOT" ] || die "rootfs not found at $ROOT (run build-root.sh first)"
|
||||
|
||||
have xorriso || die "xorriso not installed"
|
||||
have mksquashfs || die "squashfs-tools not installed"
|
||||
|
||||
rm -rf "$WORK"; mkdir -p "$ISOIMG"
|
||||
info "generating isolinux config"
|
||||
cp /usr/lib/syslinux/bios/isolinux.bin "$ISOIMG/" || true
|
||||
cp /usr/lib/syslinux/bios/ldlinux.c32 "$ISOIMG/" || true
|
||||
cat > "$ISOIMG/isolinux.cfg" <<'EOF'
|
||||
UI vesamenu.c32
|
||||
DEFAULT keru
|
||||
LABEL keru
|
||||
LINUX /boot/vmlinuz-keru
|
||||
INITRD /boot/initramfs-keru.img
|
||||
APPEND root=live:LABEL=KERU_LIVE toram quiet
|
||||
EOF
|
||||
|
||||
info "packing rootfs into squashfs"
|
||||
mksquashfs "$ROOT" "$WORK/keru.sfs" -noappend -comp xz
|
||||
|
||||
info "writing ISO (isohybrid)"
|
||||
xorriso -as mkisofs \
|
||||
-o "$ISO_OUT" \
|
||||
-V KERU_LIVE \
|
||||
-b isolinux/isolinux.bin \
|
||||
-c isolinux/boot.cat \
|
||||
-no-emul-boot -boot-load-size 4 -boot-info-table \
|
||||
-isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin \
|
||||
"$WORK"
|
||||
|
||||
info "done: $ISO_OUT"
|
||||
@@ -0,0 +1,68 @@
|
||||
# Keru OS / Kama — global make.conf template
|
||||
#
|
||||
# This is the single source of truth for a build. The TUI installer writes
|
||||
# this file; Kama reads it. Every swappable choice in Keru lives here.
|
||||
|
||||
|
||||
## ---------------------------------------------------------------------------
|
||||
## Profile (the "swappables") — chosen at install time
|
||||
## ---------------------------------------------------------------------------
|
||||
|
||||
# Which init system gets installed
|
||||
# runit (default) | s6 | openrc | systemd
|
||||
INIT=runit
|
||||
|
||||
# Which libc the toolchain and packages build against
|
||||
# glibc (default) | musl
|
||||
LIBC=glibc
|
||||
|
||||
# Which filesystem the target root is formatted as
|
||||
# ext4 (default) | btrfs | xfs | zfs | f2fs
|
||||
TARGET_FS=ext4
|
||||
|
||||
# Which kernel you want built
|
||||
# linux (sane default) | linux-lts | linux-hardened
|
||||
KERNEL=linux
|
||||
|
||||
# Base package set pulled into every install
|
||||
BASE_PACKAGES=(base toolchain kernel runit nmtui openssh)
|
||||
|
||||
# Locale / clock / keymap applied to the target
|
||||
LOCALE=en_US.UTF-8
|
||||
TIMEZONE=UTC
|
||||
KEYMAP=us
|
||||
|
||||
|
||||
## ---------------------------------------------------------------------------
|
||||
## Build environment
|
||||
## ---------------------------------------------------------------------------
|
||||
|
||||
# Compiler / linker flags passed to every recipe build
|
||||
CFLAGS="-O2 -march=x86-64"
|
||||
CXXFLAGS="$CFLAGS"
|
||||
LDFLAGS="-s"
|
||||
|
||||
# Parallelism
|
||||
JOBS=$(nproc)
|
||||
MAKEFLAGS="-j$JOBS"
|
||||
|
||||
# Mirrors for source tarballs
|
||||
SOURCE_MIRROR="https://mirror.keru.org/sources"
|
||||
|
||||
# Where the new target root lives on the build host
|
||||
ROOT=/tmp/keru/root
|
||||
|
||||
# Persistent source + build cache (survives across installs)
|
||||
CACHEDIR=/var/cache/kama
|
||||
|
||||
|
||||
## ---------------------------------------------------------------------------
|
||||
## Kama behaviour
|
||||
## ---------------------------------------------------------------------------
|
||||
|
||||
# Remove temp build-time deps as soon as they're done (AUR-style).
|
||||
# Set to 0 to keep them for debugging.
|
||||
PURGE_TEMP_DEPS=1
|
||||
|
||||
# Stop on first recipe failure
|
||||
FAIL_FAST=1
|
||||
Executable
+49
@@ -0,0 +1,49 @@
|
||||
#!/usr/bin/env sh
|
||||
# build-root.sh — build a full Keru rootfs from scratch using Kama
|
||||
#
|
||||
# Given a make.conf (or the profile default), this:
|
||||
# 1. bootstraps the minimal toolchain (host -> cross/self)
|
||||
# 2. installs the base package set into $ROOT via Kama
|
||||
# 3. applies profile choices (init, libc, fs, net)
|
||||
#
|
||||
# This is the "fully from scratch" path — no binary base image is seeded.
|
||||
|
||||
set -eu
|
||||
. "$(dirname "$0")/common.sh"
|
||||
|
||||
# the target rootfs is the "$ROOT" from make.conf; default it here
|
||||
ROOT="${ROOT:-/tmp/keru/root}"
|
||||
MAKE_CONF="${1:-$KERU_ROOT/profile/make.conf}"
|
||||
[ -f "$MAKE_CONF" ] || die "make.conf not found: $MAKE_CONF"
|
||||
. "$MAKE_CONF"
|
||||
ROOT="${ROOT:-/tmp/keru/root}"
|
||||
|
||||
KAMA="$KAMA_DIR/kama"
|
||||
[ -x "$KAMA" ] || die "kama not found at $KAMA (clone the kama repo or set KAMA_DIR)"
|
||||
[ -d "$PKGS_DIR" ] || die "kama-packages repo not found at $PKGS_DIR (set PKGS_DIR)"
|
||||
|
||||
info "building Keru rootfs into $ROOT"
|
||||
info "profile: init=$INIT libc=$LIBC fs=$TARGET_FS kernel=$KERNEL"
|
||||
|
||||
# stage 0 — bootstrap toolchain
|
||||
info "stage 0: bootstrap toolchain (gcc binutils glibc/musl)"
|
||||
for p in binutils gcc "$LIBC" toolchain; do
|
||||
PKGDIR="$PKGS_DIR" "$KAMA" make "$p" || die "toolchain stage failed on $p"
|
||||
done
|
||||
|
||||
# stage 1 — base system
|
||||
info "stage 1: base system"
|
||||
for p in "${BASE_PACKAGES[@]}"; do
|
||||
PKGDIR="$PKGS_DIR" "$KAMA" make "$p" || die "base stage failed on $p"
|
||||
done
|
||||
|
||||
# stage 2 — kernel + init + swappables
|
||||
info "stage 2: kernel + init"
|
||||
PKGDIR="$PKGS_DIR" "$KAMA" make "$KERNEL" || die "kernel build failed"
|
||||
PKGDIR="$PKGS_DIR" "$KAMA" make "$INIT" || die "init build failed ($INIT)"
|
||||
|
||||
# stage 3 — fstab/mkinitramfs for the chosen FS
|
||||
info "stage 3: finalize $TARGET_FS root"
|
||||
ROOT="$ROOT" "$KERU_ROOT/scripts/mkfs-root.sh" "$TARGET_FS"
|
||||
|
||||
info "rootfs ready: $ROOT"
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
# common.sh — shared helpers for Keru scripts (installer, iso, kama)
|
||||
PREFIX="\033[1;35m[ keru ]\033[0m"
|
||||
msg() { printf '%b %s\n' "$PREFIX" "$*"; }
|
||||
info() { printf '%b \033[1;34m==>\033[0m %s\n' "$PREFIX" "$*"; }
|
||||
warn() { printf '%b \033[1;33mwarning:\033[0m %s\n' "$PREFIX" "$*"; }
|
||||
die() { printf '%b \033[1;31merror:\033[0m %s\n' "$PREFIX" "$*" >&2; exit 1; }
|
||||
|
||||
banner() { printf '\033[1;36m%s\033[0m\n' "------------------------------------------"; printf '\033[1;36m %s\033[0m\n' "$*"; printf '\033[1;36m%s\033[0m\n' "------------------------------------------"; }
|
||||
|
||||
have() { command -v "$1" >/dev/null 2>&1; }
|
||||
|
||||
# KeruOS source root (this repo)
|
||||
KERU_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
|
||||
# Sibling repos (clone next to this one by default)
|
||||
# kama -> the package manager
|
||||
# kama-packages -> the recipe repository
|
||||
# Override with env if you keep them somewhere else.
|
||||
KAMA_DIR="${KAMA_DIR:-$(dirname "$KERU_ROOT")/kama}"
|
||||
PKGS_DIR="${PKGS_DIR:-$(dirname "$KERU_ROOT")/kama-packages}"
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env sh
|
||||
# mkfs-root.sh — format/seed the target root for the chosen filesystem
|
||||
# Usage: mkfs-root.sh [ext4|btrfs|xfs|zfs|f2fs]
|
||||
. "$(dirname "$0")/common.sh"
|
||||
|
||||
FS="${1:-ext4}"
|
||||
|
||||
# Keru builds to a plain directory staged by Kama; the filesystem choice is
|
||||
# applied at install/flash time. This script writes the fstab + initramfs
|
||||
# config so the built system knows how to mount its own root.
|
||||
ROOT="${ROOT:-/tmp/keru/root}"
|
||||
case "$FS" in
|
||||
ext4) FSTYPE=ext4; MK="mkfs.ext4" ;;
|
||||
btrfs) FSTYPE=btrfs; MK="mkfs.btrfs" ;;
|
||||
xfs) FSTYPE=xfs; MK="mkfs.xfs" ;;
|
||||
zfs) FSTYPE=zfs; MK="zpool" ;;
|
||||
f2fs) FSTYPE=f2fs; MK="mkfs.f2fs" ;;
|
||||
*) die "unsupported filesystem: $FS" ;;
|
||||
esac
|
||||
info "target filesystem: $FSTYPE ($MK)"
|
||||
|
||||
# drop fstab template
|
||||
mkdir -p "$ROOT/etc"
|
||||
cat > "$ROOT/etc/fstab" <<EOF
|
||||
# Keru generated fstab — root filesystem: $FSTYPE
|
||||
# /dev/ROOT / $FSTYPE rw,relatime 0 1
|
||||
EOF
|
||||
info "wrote fstab for $FSTYPE"
|
||||
Reference in New Issue
Block a user