- C++ 72.2%
- Python 27.8%
| etc | ||
| src | ||
| tools | ||
| .gitignore | ||
| configure.py | ||
| LICENSE | ||
| README.md | ||
bajia
an init system (PID 1) for embedded / VM targets, written in C++20 and
configured with a small declarative language inspired by Android's init .rc
format.
Status
.rcconfig parser (services + on-trigger action blocks)- Supervisor event loop built on
signalfd+epoll - service spawn / reap / respawn (per-service restart policy)
- action commands:
start,stop,restart,exec,mkdir,chmod,chown,setenv,write,symlink,mount,log - logger with a ring buffer that flushes to the console once available
roadmap:
- user/group privilege drop (
user,group, supplementary groups) - dependency ordering between services
SIGCHLDcrash-window limiting (rate-limited restarts)- property triggers (
property:<k>=<v>) andsetprop/getprop - per-service logging to files
reboot/poweroffpath with ordered unmountSIGHUPconfig reload- SELinux
building
requires a C++20 compiler and Ninja
python3 configure.py # generates build/build.ninja
ninja -C build # produces build/bajia
configure.py also writes a thin Makefile convenience wrapper
(make, make clean, make format, --asan, --debug).
running
As a real init, the kernel must launch it as PID 1:
init=/path/to/bajia
Or by hand against a config (useful for development, may not behave like a
real boot). bajia normally refuses to start unless it is PID 1; pass
--run-as-user to override:
./build/bajia --run-as-user etc/init.rc
If no files are given it looks for /etc/bajia/init.rc.
configuration language
See etc/init.rc for a complete example.
services
service NAME /path/to/exe [args...]
user root|other # privilege level (drop, planned)
group GROUP [GROUP...]
oneshot # run once and exit, never respawn
disabled # not started by the boot sequence
console # bind stdio to /dev/console
class NAME # grouping (default "default")
respawn never|on-failure|always # restart policy (default always)
crash-threshold N # restarts allowed per window
crash-window SECS
setenv K=V # extra environment (repeatable)
cwd /path
actions
on TRIGGER
start NAME | stop NAME | restart NAME
exec /cmd args...
mkdir PATH [mode]
chmod PATH mode
chown PATH uid gid
setenv K V
write PATH CONTENT
symlink TARGET LINK
mount SOURCE TARGET FSTYPE
log message
boot triggers fire in order: early-init, init, boot. shutdown is
reserved (planned wiring to the signal path). property/service-* triggers
are on the roadmap.