Installation
This page describes the published R2Kernel install flow. It focuses on getting the runtime and SDK onto a host. After installation, use Operate for service management, time sync, resource control, security, and validation.
Supported Platforms
R2Kernel runtime installation is Linux-only.
Published runtime bundles currently target.
- Linux
x86_64 - Linux
aarch64
The installed runtime uses Linux facilities such as systemd services, cgroup resource placement, Unix-domain local control channels, SocketCAN, device-node policy, and Linux time-sync tooling. macOS and Windows are useful for reading docs, preparing source trees, or editing SDK/tutorial code, but they are not runtime deployment targets.
The documented commands assume Ubuntu / Debian. Other Linux distributions can work when equivalent packages and service facilities are available, but the published install path is validated first on Ubuntu / Debian.
License Model
The runtime binary payload is not Apache-2.0. Runtime installation requires manual acceptance of the R2Kernel runtime license/EULA during the installer review step. Automatic license acceptance is intentionally not supported.
Public SDK source, tutorials, docs, and public spec payloads are distributed under the R2Kernel SDK open-source license group. Bundled third-party dependencies and declared SDK environment dependencies are disclosed under Open Source Notices.
After installation, license and notice documents are stored under
<prefix>/licenses (plural). This directory contains the files listed by the
release manifest, typically including.
- the R2Kernel download and installation data notice
- the R2Kernel runtime license/EULA for runtime binaries and services
- the Apache-2.0 license for public SDK/source payloads
- Open Source Notices covering bundled third-party dependencies and declared SDK environment dependencies
- third-party full license files, such as the yaml-cpp MIT license when the bundled Linux C++ SDK artifact is installed
The presence of multiple files in <prefix>/licenses does not mean that the
entire installed tree uses one license. It records the license and notice groups
for the runtime, distribution logging notice, installed SDK artifacts, and
open-source notices.
Prerequisites
On a minimal Ubuntu / Debian host.
sudo apt update
sudo apt install -y ca-certificates curl wget python3 python3-venv
Install python3-vcstool only when you plan to fetch the full matching source
workspace through the entry repo's r2kernel.repos manifest.
sudo apt install -y python3-vcstool
The install snippets use curl by default. Equivalent wget -qO- ... | sh
forms are also supported. Run the bootstrap script as the current user, not
through sudo; it elevates only when needed, as described in
Privileges And sudo.
Current Release Install Command
Use the install command from the published entry repository release page.
INSTALL_URL="https://download.r2kernel.org/r2kernel/releases/1.0.0rc10/install.sh"
curl --proto '=https' --tlsv1.2 -fsSL "$INSTALL_URL" | sh
Set INSTALL_URL in the shell where you run the later examples. Fetch the
bootstrap over verified HTTPS; a checksum supplied by a script downloaded over
HTTP cannot authenticate that script.
Published release docs and entry-repository READMEs are stamped with the exact release asset URL during the release process. If you are preparing a different release channel, use that channel's entry-repository release page instead of copying a URL from another release.
Download Endpoint
The public install script is small. It downloads the platform-matching installer binary and the installer then resolves the runtime manifest through the R2Kernel distribution endpoint.
In production, runtime artifacts are served through the R2Kernel distribution
service. It records operational metadata such as install session ID, client IP,
standard delivery-network request metadata, user agent, requested release and
artifact, response status, requested artifact size (the stored size of the
requested artifact, not bytes received), and failure reason. The distribution
service is designed not to record HEAD requests.
This data is used for artifact delivery, private artifact access, installation
diagnostics, release adoption analysis, abuse investigation, and distribution
reliability/security. The distribution endpoint does not collect application
source code, subsystem payloads, runtime messages, robot data, host config
files, shell history, or local files from the installing host. The complete
notice is installed as DOWNLOAD-NOTICE-R2Kernel.txt under <prefix>/licenses
and is included in the public source tree as DOWNLOAD_NOTICE.md.
The current public install flow does not require a user install token. The
installer may create an installation-session identifier so one installation
attempt can be diagnosed consistently. For production installs, use the
published install.sh without overriding its distribution settings.
A distribution channel that does require an install token reads it from
R2KERNEL_INSTALL_TOKEN or from a private file named by
--install-token-file PATH (a regular file, mode 0600 or stricter, holding one
token). The last --install-token-file (or deprecated --install-token) given
takes precedence over R2KERNEL_INSTALL_TOKEN, and install.sh uses the same
token for its own download of the installer. install.sh never puts the token
on a command line: with a token configured, it requires curl 7.58 or later
(the token is read from a private file and not sent to another host on a
redirect); Wget is never used with a token, and no download is made without the
token. An install token file that is not a private regular file holding one
token stops install.sh before any download. --install-token TOKEN is
deprecated because the process list exposes it.
install.sh pins the SHA256 of the installer and of release-manifest.json and
the release version; the installer refuses a manifest whose bytes or version
differ. Release locations must be https://; R2KERNEL_ALLOW_PLAIN_HTTP=1 is an
explicit opt-in for a trusted local mirror. Without that opt-in, curl in
install.sh and the installer follow redirects only to https:// locations, and
the installer follows at most 10. Without a token and without curl,
install.sh downloads with Wget, which may follow a redirect to any location;
the downloaded installer is still checked against the SHA256 pinned in
install.sh.
Interactive Install
Default install.
curl -fsSL "$INSTALL_URL" | sh
The default install prefix is /opt/r2kernel. The rest of the documentation
writes the selected install prefix as <prefix>; substitute your prefix in
commands and paths. A relative --prefix (or R2KERNEL_PREFIX, or a prefix
typed into the installer) is resolved against the current directory, and .
and .. are resolved without following symbolic links; the installer uses that
absolute path for the entry-point links, env.sh and service registration.
The prefix must be a dedicated directory: /, /usr, /usr/local, /opt,
home directories and world-writable or sticky directories are refused. An
existing directory that is not empty is used only when it holds an earlier
R2Kernel installation (its .r2kernel-prefix marker or an R2Kernel runtime);
otherwise the installer stops and names the entries it found. In an R2Kernel
prefix the installer replaces only what an earlier R2Kernel install created; a
foreign bin, lib or other product entry stops installation with an error
naming the path, and an existing prefix keeps its mode.
Choose a development user prefix.
curl -fsSL "$INSTALL_URL" | sh -s -- --prefix ~/.local/r2kernel
When a TTY is available, the installer opens a terminal UI for license review, prefix selection, PATH integration, optional Console administrator login, and Linux system-service setup. Console login defaults OFF on a fresh installation; choosing New password (ON) always prompts for a masked password and confirmation and stores it before services start. For an existing valid configuration, choose Inherit (the default), OFF, or New password (ON). Inherit also applies to recovery installs where the configuration exists without a complete installation. Use the arrow keys or Space to select the displayed choice. Password and confirmation fields appear when New password (ON) is selected. That choice replaces only the installer-managed password; custom password sources require separate administration. Empty passwords are rejected; short passwords are allowed. OFF does not delete a password and changes only Console login. The existing API security setting is preserved. Inherit preserves the existing Console login profile. The separate Console Connection and Terminal step selects HTTP or Inherit for the connection and OFF or Inherit for Terminal. Each Inherit choice shows its current value and keeps that setting independently of administrator login. New installations use HTTP and Terminal OFF. In the wizard, system services default to Install only when the selected prefix can host root services (protected and, for a non-root run, existing); otherwise they default to Skip and Install is refused before anything is installed.
Managed system-service installation starts the Console with HTTP. Terminal
starts OFF. Reinstallation preserves existing Console HTTP/HTTPS and Terminal
settings. Settings → Security → Console connection switches between HTTP and
HTTPS (default HTTPS port 18443). Choose the device certificate and private key,
generated uniquely on that device, or upload your own certificate and private key
PEM files. User certificates must cover the current Console hostname or IP
address. Save the connection settings, then choose Apply all saved settings
(restart). Control restarts. After it restarts, choose Reconnect to Console
to open the saved address when the protocol changes.
The browser may require trust confirmation for a generated device certificate.
The installer also asks for the Console port, using the current selected
connection's port on an upgrade and HTTP port 18080 on a new installation. Existing explicitly configured
ports are preserved, including legacy 8081/8443 and ui_port: 0 API sharing.
The command-line option is --console-port PORT. Console connection settings
provide the same port field for HTTP and HTTPS; switching the protocol recalls
the saved port for that protocol. Save, apply the restart, then reconnect at the
displayed new address. Port changes retain the saved certificate and private key.
Only the selected Console protocol is served. HTTPS closes a separate HTTP Console listener. Shared product/API HTTP listeners keep their independent services and reject Console documents and management routes. The HTTPS management origin excludes installed product frontends, which retain their own authentication. HTTP and HTTPS Console sessions use separate cookies; sign in again after a connection change when Console login is ON. Product support URLs are optional.
Settings → Terminal provides ON/OFF and optional session limits. Terminal uses HTTP/ws with an HTTP Console and HTTPS/wss with an HTTPS Console. There is no separate Terminal transport exception or risk acknowledgement. Save & apply Terminal closes existing Terminal sessions without restarting Control. Exact origins, listener admission, and OS account authentication remain enforced.
The installer sets public runtime and SDK directories to 0755, public data files
to 0644, and executable runtime files to 0755, so a restrictive shell umask
does not prevent services from reading the installation. It also makes env.sh
readable for users sourcing the installed environment. Reinstallation preserves
existing configuration file contents, ownership and permissions. Private managed
credential directories and password files remain protected; parent directories
outside the selected installation prefix are not changed.
Web Terminal provides local OS login in the environment running Control: the
installed Linux host for a native installation, or the Pod container for a
container deployment. It does not use or require an SSH server. The login
broker uses the non-login (nologin) r2kernel service account; operators
authenticate as an existing OS account. The installer does not create human OS
accounts or change their passwords.
Line-based prompt mode.
curl -fsSL "$INSTALL_URL" | sh -s -- --no-tui
Installer Options
Every option that takes a value accepts both --option VALUE and
--option=VALUE. Choices given as options, or as the R2KERNEL_* environment
values listed by --help, are used as given; the TUI or line-based prompt asks
only the remaining questions. Command-line options override environment values.
Unknown options and missing values are errors.
--prefix <path>
--existing-prefix overwrite|abort
--path-mode none|print|shell-rc
--shell-rc <path>
--system-services install|skip
--system-service-config <path>
--console-login on|off
--console-password-file <private-file>
--console-transport http|inherit
--terminal off|inherit
--console-port <port>
--install-token-file <private-file>
--no-tui
--non-interactive
To see the installer's own list of options and environment values, pass
--help through the bootstrap script.
curl -fsSL "$INSTALL_URL" | sh -s -- --help
--existing-prefix overwrite approves installing into an earlier R2Kernel
prefix that already contains files; the installer then replaces only what an
earlier R2Kernel install created. It does not make other non-empty directories
usable: a non-empty directory without an R2Kernel installation is refused with
or without the option. --existing-prefix abort stops at any non-empty prefix
instead. Without the option, the installer asks.
--non-interactive (alias --yes) never prompts. A decision that has no safe
default is an error that names the option to pass, for example
--existing-prefix overwrite|abort for a non-empty prefix. Services default to
skip; --system-services install requires running as root. A release that
requires license acceptance is refused, because license acceptance is manual
only (see Manual License Review). Published runtime
releases require acceptance of the runtime license, so install them with the
TUI or --no-tui and preset the other choices with options.
Privileges And sudo
install.sh parses every argument and checks the prefix location with the
downloaded and verified installer, as the invoking user, before any sudo
prompt; invalid arguments fail without elevation. Checks that need the release,
the prefix contents or root run after elevation, before anything is downloaded
or installed. install.sh elevates only when the selected prefix is not
writable by the current user or --system-services install is selected, and
only when the prefix is protected (root-owned, not a symbolic link, not
group/other writable):
- a prefix in your home directory installs without
sudo - system service registration needs a protected prefix such as the default prefix
- an installer running as root refuses a prefix that is not protected; re-run
install.shwith--prefix PATHfor a user prefix - with
--non-interactive,install.shusessudo -n, which fails instead of prompting for a password
Through sudo, install.sh forwards exactly the installer's documented
R2KERNEL_* environment values that are set, never the install token. It
removes its temporary directory on exit or interruption and exits with the
installer's status.
Manual License Review
Runtime license acceptance is manual only. Official runtime manifests require
the installer to show the required license document and require you to accept
the license in the TUI or line-based prompt (no acceptance record is written). The installer intentionally rejects automatic
license acceptance flags, and --non-interactive refuses a release that
requires license acceptance.
Default manual flow.
curl -fsSL "$INSTALL_URL" | sh
Line-based manual prompt instead of the full-screen TUI.
curl -fsSL "$INSTALL_URL" | sh -s -- --no-tui
Product prefix and system services.
curl -fsSL "$INSTALL_URL" | sh -s -- \
--prefix <prefix> \
--system-services install
The Console options below are part of Installer Options.
--console-login and --console-password-file select explicit Console setup.
--console-transport and --terminal independently select the connection and
Terminal policy. Omitting them preserves an existing value; a fresh install uses
HTTP and Terminal OFF. Explicit http and off reset those settings without
changing administrator credentials or API authentication. HTTPS and Terminal ON
can be enabled in Settings after installation.
--console-login on --console-password-file explicitly sets a new password,
replacing an existing installer-managed credential when present. Supply a protected
password input file, never a password in command arguments. For script compatibility
only, --console-login on without a file retains an existing credential; without
an existing credential, unattended installation requires the file and interactive
setup prompts for a new password. This reuse behavior is not a separate interactive
choice. With no flags, existing configuration is inherited and a fresh installation
defaults OFF. When login remains OFF and no password
exists, the first visitor can register a password later in Settings → Security
without a setup code. Keep that initial Console on a trusted management surface.
Service registration can also run as a separate step: install with
--system-services skip, then register the services with the installed helper.
curl -fsSL "$INSTALL_URL" | sh -s -- \
--prefix <prefix> \
--system-services skip
sudo <prefix>/bin/r2kernel system install --prefix <prefix> \
--console-password-store <prefix>/var/lib/security
Use a root-owned, service-readable prefix such as the default prefix for product deployments. User-home prefixes remain useful for development.
Installed Layout
The installer writes.
- runtime payload under
<prefix>/runtime - executables under
<prefix>/runtime/bin - runtime libraries under
<prefix>/runtime/lib - Web Console assets under
<prefix>/runtime/frontend - public spec files under
<prefix>/runtime/spec - runtime support tools under
<prefix>/runtime/tools - C++ SDK under
<prefix>/sdk/cpp - Python SDK wheel under
<prefix>/sdk/python - guided tutorial source under
<prefix>/tutorials - license and notice documents under
<prefix>/licenses - service unit sources under
<prefix>/systemd - runtime state, logs, and control service home under
<prefix>/var - shell environment helper under
<prefix>/env.sh - uninstaller under
<prefix>/bin/r2kernel-uninstall
Top-level entry points.
<prefix>/bin-><prefix>/runtime/bin<prefix>/spec-><prefix>/runtime/spec<prefix>/config.yaml-><prefix>/runtime/config.yaml
Source the environment helper before using installed SDK/runtime commands or tutorials.
. <prefix>/env.sh
This sets R2KERNEL_PREFIX, updates PATH, and configures spec/runtime library
paths for the installed SDK.
Loading this environment is a per-shell action. In the installer, choose whether
to leave shell files unchanged, print the commands for manual use, or explicitly
register automatic loading in your own shell profile. Automatic registration is
optional; it is not needed for administrator configuration commands. sudo uses
its own environment and does not inherit the PATH created by env.sh.
For a protected system prefix such as the default prefix, Linux service registration
also installs /usr/local/bin/r2kernel-config, pointing at that installation's
actual configuration. It never overwrites an unrelated command. To edit system
configuration, use:
sudo /usr/local/bin/r2kernel-config
On systems whose sudo search path includes /usr/local/bin, the shorter
sudo r2kernel-config also works. No environment helper is required. User-home
installations do not create this system-wide entry; use their local CLI instead.
Runtime code and system-level configuration remain root-protected. Managed Linux
service installation prepares a separate private Control settings store so the
Web Console and CLI can save supported operational settings, including login
and Terminal policy, without making the runtime directory writable. System-owned
fields remain read-only in the GUI; use the administrator CLI for those changes.
Existing base configuration, overrides, and credentials are preserved during
updates. Saving configuration does not automatically restart services.
Linux Services
On Linux, the installer can register.
r2kernel-control.servicer2kernel-resourced.servicer2kernel-timesyncd.servicer2kernel-terminal-login.servicer2kernel-https-settings.service
The control service runs without root privileges. The resource service, the time-sync supervisor, the Terminal login service and the HTTPS settings service run as root: they keep the narrow root authority needed for resource brokering, host-level clock management, local OS login and protected TLS material.
The system service installer creates a r2kernel resource group by default. The
control service and managed SDK package processes use that group for the local
runtime boundary. Managed package launches preserve it as a supplementary group,
so application code does not need to patch runtime ownership or permissions.
Service unit files live under <prefix>/systemd. The installer links them from
/etc/systemd/system so uninstall can remove the links and then the entries
R2Kernel manages in the prefix. Runtime sockets use /run/r2kernel, owned by root:r2kernel
with mode 3770 (group inheritance and sticky protection), and are recreated when services start. The SDK control plane
uses /run/r2kernel/control.sock by default; managed launch paths pass the
resolved path to application processes as R2KERNEL_CONTROL_SOCKET.
After joining the runtime group, open a new login session before using its
sockets from an existing shell. The installer supplies the IPC group to managed
services and <prefix>/env.sh. Managed shared memory and Linux named semaphores
use that exact group and mode 0660; direct execution without an IPC group uses
owner-only 0600. Unknown owners or permissive legacy objects are rejected.
Stop all legacy processes before inspecting, migrating, or recreating IPC:
changing permissions cannot revoke descriptors that a process already opened.
Only registered legacy shared-memory objects whose durable registry proves
their exact inode and size may be restricted in place by root while preserving
their inode. This migration does not apply to named semaphores. Semaphore
creation publishes the exact secure permissions above; opening an existing
semaphore (including create-if-present) requires it already to satisfy the
owner, group, mode, size, regular-file, and single-link checks. Unknown 0666
semaphores are rejected without changing their identity or permissions, even
when root requests creation. Inspect their origin and users explicitly after
stopping processes, then remove and recreate them through secure creation;
do not widen permissions or adopt a first-seen object as trusted. See
Manager and Device Authorization.
If service setup was skipped, run the exact command printed by the installer. For a new install using the default managed Console credential store:
sudo <prefix>/bin/r2kernel system install --prefix <prefix> \
--console-password-store <prefix>/var/lib/security
For a dedicated config using that same newly prepared managed store:
sudo <prefix>/bin/r2kernel system install \
--prefix <prefix> \
--config /path/to/config.yaml \
--console-password-store <prefix>/var/lib/security
The helper prepares the private Control settings and credential stores before starting services and verifies access as the non-root service user. The explicit credential-store option applies only to the installation's managed default store. It supports an empty store (Console OFF with later first registration), an installer-created password, and a verified legacy root-owned default store. For a supported legacy store, migration preserves credential contents and restricts ownership and permissions to the service user. Unexpected files, unsafe links, mixed ownership, or a custom credential location cause an explicit error rather than an automatic ownership change. Provision custom stores separately; a dedicated configuration pointing elsewhere cannot use the default-store command.
For details, see Time Sync Operations and Resource Control.
Uninstall
To remove a product install.
sudo <prefix>/bin/r2kernel-uninstall --prefix <prefix>
To remove a prefix that you own as a non-root user, such as ~/.local/r2kernel
installed with system services skipped, run the uninstaller as that user without
sudo. When you own the prefix and the prefix path is not a symbolic link, the
uninstaller does not elevate through sudo; --no-sudo declines elevation
explicitly.
<prefix>/bin/r2kernel-uninstall
A user-owned prefix is removed only by its owner, and only when nobody else can change the path to it:
- no directory on the path is a symbolic link;
- each directory is owned by root or by you;
- no directory is writable by another user. World-writable directories,
including sticky ones such as
/tmp, are refused. A group-writable directory is refused unless its group is your private group, meaning no other account holds that group. A directory with a POSIX access ACL (any entry beyond the owner, group and other permissions) is refused. NFSv4 ACLs are not inspected.
The prefix must have no registered R2Kernel services. None of your processes may use it, and it must have no R2Kernel registry with registered pools or shared-memory objects that belong to you.
Before changing anything, the uninstaller checks that you can remove every R2Kernel entry, and the prefix directory too when it would end up empty. A refusal therefore leaves the prefix unchanged.
Root refuses a prefix that another user owns, also when the uninstaller
elevated through sudo: that user could replace an entry with a symbolic link
while root removes the tree. Rerun the command as the owner.
Without root, the uninstaller cannot see the files of other users' processes or of non-dumpable processes. It checks those by command line only and reports how many there were.
The uninstaller loads the protected same-prefix IPC policy itself; the command
does not require sourcing env.sh under sudo or preserving ambient variables
with sudo -E. It validates the actual protected resource-service unit's
--config and resolved socket against <prefix>/etc/resource-service-identity.json.
Service registration writes this identity; an existing supported installation
without that file establishes it from its actual protected unit and effective
config before stopping services. A divergent recorded identity, ambiguous
command/environment, or unsafe config/override is refused before stopping.
External --config files and explicitly configured custom sockets are supported:
retirement selects their exact registry, never the default config's or an ambient
environment's registry.
The uninstaller stops declared dependent consumers before the core services, then rejects remaining processes using the prefix through executable, working directory, library mappings, file descriptors, or command arguments, even when they have no registered pool. Only the helper itself and its exact privileged sudo ancestor chain are excluded, not unrelated sudo or same-UID processes. It retires the selected registered resources before removing units or the prefix. A policy mismatch, live reference, or service-stop failure refuses cleanup and retains recovery metadata and units; some services may already be stopped. Correct the refusal and rerun, or restart the retained units to recover. External configs, unrelated registries, and global runtime directories are not deleted. Persistent external registry lock inodes and empty metadata remain; they are synchronization boundaries, not installation ownership records.
Successful managed uninstall removes only the selected prefix's upgrade journal, under the same coordinator lock used for teardown. A live journal owner, unsafe journal, changed unit selection, or failed teardown preserves recovery state and refuses cleanup rather than erasing it. Journals for other prefixes remain intact.
System accounts are kept by default. --remove-users considers only exact
name/UID or name/GID identities recorded as created by this installation in its
protected service-identity metadata, and only when no other installation,
service, process or group membership still references them. Pre-existing,
reassigned, shared and legacy unrecorded accounts are retained. A retained group
also retains a same-named user when deleting it could implicitly delete that
group. Optional account cleanup failure after successful prefix retirement exits
with status 3 and names that partial outcome; it is not a successful account
deletion or a rollback of prefix removal.
The uninstaller requires the prefix's .r2kernel-prefix marker or an R2Kernel
runtime and refuses the same shared system locations and home directories as
the installer. It removes only what R2Kernel manages (runtime, its entry-point
links, sdk, tutorials, licenses, var, systemd, env.sh, etc,
management-tls and the marker); other entries, including foreign files in
etc, are kept and listed, and the prefix directory is removed only when it is
empty.
An entry-point link is R2Kernel's when it names <prefix>/runtime/<name>. That
holds in normal form, or through another spelling of the prefix directory such
as a path through a symbolic link. It also holds for a dangling relative link of
the form an earlier installer wrote for a relative --prefix. A prefix
installed through a symbolic-link ancestor is therefore removed completely, from
its physical path.
For an installation made with system services skipped, removal is conservative: the prefix, whether root-owned and protected or owned by you as described above, must be unused, with no owned services, process references, or ambiguous or nonempty runtime state. For a user-owned prefix, only your own registries and shared-memory objects count; those of root and of other users are not this prefix's state. Valid empty registries alone are not live use. This path removes only R2Kernel's entries of that prefix, not unrelated global resources. A known managed installation with missing or unsafe policy metadata fails closed rather than being treated as an unused no-service installation.
Use --dry-run for read-only observational preflight without stopping services,
retiring pools, migrating permissions, creating registry state, or writing
installation metadata. A root-owned prefix needs root for --dry-run as well;
a user-owned prefix is dry-run by its owner without sudo. It inspects policy and unit/link ownership, actual
config/override, registry structure/permissions and recorded pool identities,
and prefix consumers outside the exact selected service cgroups. Missing
registry state is reported as absent, not treated as an inspected empty file.
Exclusive registry locking and final live-reference checks are explicitly
deferred until managed services have stopped; a successful dry-run is not
an assertion that final teardown will succeed.
For exact registered legacy pools eligible for the existing protected migration,
the observation names them and marks permission migration deferred; it does
not report their current permissions as satisfying the installed policy.
Managed inspection requires root to read protected registries and process state,
including dry-runs. Unreadable or malformed state fails, rather than being
reported as success. The launcher elevates through sudo when needed,
including dry-runs, except for a prefix the caller owns;
--no-sudo explicitly declines that elevation and does not relax safety checks.
An unused no-service prefix retains its observational path without a blanket
root requirement, but any unreadable safety dependency still refuses removal.
Verification
. <prefix>/env.sh
r2kernel --help
r2kernel status
r2kernel config --help
r2kernel package --help
r2kernel launch --help
r2kernel resource inventory
r2kernel timesync doctor --json
If services were installed.
sudo systemctl status r2kernel-control.service --no-pager
sudo systemctl status r2kernel-resourced.service --no-pager
sudo systemctl status r2kernel-timesyncd.service --no-pager
sudo systemctl status r2kernel-terminal-login.service --no-pager
sudo systemctl status r2kernel-https-settings.service --no-pager
Interactive Linux installs default to system-service setup when systemd is
available and the selected prefix can host root services. Noninteractive plans default to skipping
services unless --system-services install is passed.
When upgrading a prefix with registered Linux services, the installer stops systemd units that declare runtime dependencies, including application supervisors, before stopping Control and the resource service. It performs this shutdown before replacing runtime or SDK files. After installation, it verifies the resource socket and Control readiness, then restores the units that were active before the upgrade. Previously inactive units remain inactive; services registered for the first time are started. The standalone service installer uses the same sequence when replacing service definitions.
Before stopping existing services, the installer verifies the selected SDK artifacts and prepares a versioned Python environment, including dependencies, wrapper imports and native-library compatibility. A failure at this preparation stage leaves the running installation and its selected Python environment in place. Dependency installation requires an accessible package index or a compatible local pip cache; the runtime bundle alone is not an offline dependency bundle.
Preparation is serialized per Python environment store. A retry may rebuild an owned, protected, incomplete digest directory only when it is neither selected nor used by a live preparation. Completed environments are validated and reused; unsafe, selected, or live preparations are preserved and reported, not deleted. Do not remove a preparation lock file to force a concurrent installer through.
Before changing client authority or stopping existing services, service registration preflights the protected installed policy, creator identities, configuration, key material, and cgroup root. Adding another client updates both the creator and resource-authority policies while retaining administrator grants.
--system-services skip skips service registration, but still coordinates an
upgrade of existing services belonging to the selected prefix. Fresh installs
without registered services retain the usual skip behavior. Dependencies must
be declared in systemd units; separately launched applications must be stopped
before replacing the runtime. Another prefix's runtime services are left alone.
If shutdown fails before file replacement, the installer attempts to restore
the original active set and reports any recovery failure. If replacement or
readiness fails, it keeps the affected services stopped and records the original
active set in a protected journal under /run/r2kernel-upgrade. Re-run the
installer with the same prefix to complete the interrupted installation and
restore that set. Do not manually start services against a partially replaced
runtime. Service-store preparation and the service helper's --dry-run do not
stop services.
A dangling registered-unit source is not repaired by creating an empty prefix or
rerunning service registration: both reach the same protected-source check.
Inspect the named unit with systemctl show UNIT -p FragmentPath -p SourcePath
and restore its exact protected, matching source before retrying. The diagnostic
names the unit, fragment/source and target; it is not an automatic reset facility.
Installed SDK Payload
The installer places SDK payloads under <prefix>/sdk, but it does not install
the Python wheel into your active virtual environment. It also installs the
guided tutorial source under <prefix>/tutorials, so normal tutorial use does
not require a separate SDK source checkout.
The installed service and CLI use the managed Python environment selected under
<prefix>/sdk/python/current. Activating a separate shell virtual environment
does not change the interpreter used by managed package processes. Packages that
explicitly select another interpreter must provide their dependencies there.
The installer also copies the supporting transport fixtures under
<prefix>/runtime/tools/qa/fixtures, exposed through the installed tools alias.
Linux C++ SDK release payloads bundle yaml-cpp internally, so installed-user C++
tutorial builds do not depend on a distro-specific libyaml-cpp.so.* at runtime.
The reusable local Control transport requires matching runtime and SDK versions. When upgrading from the earlier inline/large-payload transport, update the runtime, Python environments, and SDK-linked subsystem binaries together, then restart those processes. A protocol mismatch is an error, not an automatic downgrade. Application API contracts and host-to-host TCP are unchanged.
License Files
The installer keeps release-manifest license and notice documents under
<prefix>/licenses. Use this directory as the installed license record for the
runtime EULA, public SDK/source notices, bundled third-party licenses, and the
download/install data notice.
Next Step
Continue with Quickstart. Use Operate for host operation and Develop for SDK/tutorial workflows.