first commit
This commit is contained in:
commit
93e2ad4b29
35 changed files with 1048 additions and 0 deletions
224
README.md
Normal file
224
README.md
Normal file
|
|
@ -0,0 +1,224 @@
|
|||
# Debian Atomic Infrastructure Files
|
||||
|
||||
This directory contains the missing systemd services, configuration files, and infrastructure components needed to make Debian work with OSTree and bootc-image-builder, based on our analysis of the successful Fedora Atomic system.
|
||||
|
||||
## 📁 Directory Structure
|
||||
|
||||
```
|
||||
debian-atomic-files/
|
||||
├── ostree-systemd/ # OSTree systemd services and configuration
|
||||
├── bootc/ # Bootc systemd services and infrastructure
|
||||
├── apt-ostree-systemd/ # APT-OSTree systemd services and kernel hooks
|
||||
├── ostree-dracut/ # OSTree dracut module
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## 🎯 Purpose
|
||||
|
||||
These files address the **critical missing infrastructure** that prevents Debian from working with OSTree and bootc-image-builder. Based on our analysis of the successful Fedora Atomic system, we discovered that **28+ systemd services** are required for a functional OSTree system, and Debian packages are missing most of them.
|
||||
|
||||
## 📦 Package Structure
|
||||
|
||||
### 1. `ostree-systemd` Package
|
||||
|
||||
**Purpose**: Provides essential OSTree systemd services and configuration files.
|
||||
|
||||
**Files**:
|
||||
- `systemd/system/ostree-prepare-root.service` - Handles OSTree deployment during initramfs
|
||||
- `systemd/system/ostree-remount.service` - Manages OSTree bind mounts after boot
|
||||
- `systemd/system/ostree-state-overlay@.service` - Template for OSTree state overlays
|
||||
- `systemd/system/ostree-finalize-staged.service` - Finalizes staged deployments
|
||||
- `systemd/system/ostree-finalize-staged-hold.service` - Prevents finalization conflicts
|
||||
- `systemd/system/ostree-boot-complete.service` - Completes boot process
|
||||
- `ostree/prepare-root.conf` - OSTree configuration (composefs, readonly sysroot)
|
||||
- `tmpfiles.d/ostree-tmpfiles.conf` - Runtime directory creation and cleanup
|
||||
|
||||
**Installation Path**: `/usr/lib/systemd/system/`, `/usr/lib/ostree/`, `/usr/lib/tmpfiles.d/`
|
||||
|
||||
### 2. `bootc` Package
|
||||
|
||||
**Purpose**: Provides bootc infrastructure for automatic updates, filesystem growth, and cleanup.
|
||||
|
||||
**Files**:
|
||||
- `systemd/system/bootc-fetch-apply-updates.service` - Automatic updates service
|
||||
- `systemd/system/bootc-fetch-apply-updates.timer` - Timer for automatic updates (1h after boot, then every 8h)
|
||||
- `systemd/system/bootc-generic-growpart.service` - Auto-grow root filesystem on VMs
|
||||
- `systemd/system/bootc-destructive-cleanup.service` - Cleanup after installations
|
||||
- `systemd/system/bootc-publish-rhsm-facts.service` - Publish facts to subscription manager
|
||||
- `systemd/system/bootc-status-updated.target` - Status coordination target
|
||||
- `systemd/system/bootc-status-updated-onboot.target` - Boot status target
|
||||
- `systemd/system/bootc-root-setup.service` - Bootc root setup in initramfs
|
||||
|
||||
**Installation Path**: `/usr/lib/systemd/system/`
|
||||
|
||||
### 3. `bootc-dracut` Package
|
||||
|
||||
**Purpose**: Provides bootc dracut configuration for initramfs generation.
|
||||
|
||||
**Files**:
|
||||
- `usr/lib/dracut.conf.d/10-bootc-base.conf` - Bootc dracut configuration (hostonly=no, add ostree module)
|
||||
|
||||
**Installation Path**: `/usr/lib/dracut.conf.d/`
|
||||
|
||||
### 4. `apt-ostree` Package (Enhanced)
|
||||
|
||||
**Purpose**: APT-OSTree package should include all systemd services and kernel installation hooks (like rpm-ostree does).
|
||||
|
||||
**Files**:
|
||||
- `systemd/system/apt-ostreed.service` - APT-OSTree system management daemon
|
||||
- `systemd/system/apt-ostree-bootstatus.service` - Log boot status to journal
|
||||
- `systemd/system/apt-ostree-countme.service` - Analytics reporting service
|
||||
- `systemd/system/apt-ostree-countme.timer` - Weekly analytics timer
|
||||
- `systemd/system/apt-ostree-fix-shadow-mode.service` - Fix shadow permissions
|
||||
- `systemd/system/apt-ostreed-automatic.service` - Automatic updates service
|
||||
- `systemd/system/apt-ostreed-automatic.timer` - Automatic updates timer
|
||||
- `kernel/install.d/05-aptostree.install` - Kernel installation hook for OSTree
|
||||
- `kernel/install.conf` - Kernel install configuration (layout=ostree)
|
||||
- `tmpfiles.d/apt-ostree-0-integration.conf` - APT-OSTree tmpfiles integration
|
||||
- `tmpfiles.d/apt-ostree-0-integration-opt-usrlocal.conf` - /usr/local and /opt directory setup
|
||||
- `tmpfiles.d/apt-ostree-0-integration-opt-usrlocal-compat.conf` - Backwards compatibility for /usr/local
|
||||
- `apt-ostreed.conf` - APT-OSTree daemon configuration
|
||||
- `org.debian.aptostree1.conf` - D-Bus policy configuration
|
||||
|
||||
**Installation Path**: `/usr/lib/systemd/system/`, `/usr/lib/kernel/install.d/`, `/usr/lib/kernel/`, `/usr/lib/tmpfiles.d/`, `/etc/`, `/usr/share/dbus-1/system.d/`
|
||||
|
||||
**Note**: These files should be bundled with the `apt-ostree` package itself, not as a separate package.
|
||||
|
||||
### 5. `ostree-dracut` Package
|
||||
|
||||
**Purpose**: Provides OSTree dracut module for initramfs integration.
|
||||
|
||||
**Files**:
|
||||
- `modules.d/98ostree/module-setup.sh` - OSTree dracut module setup script
|
||||
|
||||
**Installation Path**: `/usr/lib/dracut/modules.d/98ostree/`
|
||||
|
||||
## 🔧 What Each File Does
|
||||
|
||||
### OSTree Systemd Services
|
||||
|
||||
**`ostree-prepare-root.service`**:
|
||||
- **Purpose**: Handles OSTree deployment during initramfs phase
|
||||
- **Function**: Runs `/usr/lib/ostree/ostree-prepare-root /sysroot`
|
||||
- **Timing**: After `sysroot.mount`, before `initrd-root-fs.target`
|
||||
- **Critical**: This is what makes OSTree deployment work during boot
|
||||
|
||||
**`ostree-remount.service`**:
|
||||
- **Purpose**: Handles OSTree bind mounts after boot
|
||||
- **Function**: Runs `/usr/lib/ostree/ostree-remount` binary
|
||||
- **Timing**: After `var.mount`, before `local-fs.target`
|
||||
- **Critical**: Manages overlay filesystems for `/etc`, `/var`, etc.
|
||||
|
||||
**`ostree-state-overlay@.service`**:
|
||||
- **Purpose**: Template service for OSTree state overlays
|
||||
- **Function**: Runs `ostree admin state-overlay %i /%I`
|
||||
- **Critical**: Enables writable overlays on read-only OSTree deployments
|
||||
|
||||
**`ostree-finalize-staged.service`**:
|
||||
- **Purpose**: Finalizes staged deployments
|
||||
- **Function**: Runs `ostree admin finalize-staged` on service stop
|
||||
- **Timing**: After `local-fs.target`, before `basic.target`
|
||||
- **Critical**: Required for proper deployment finalization
|
||||
|
||||
**`ostree-boot-complete.service`**:
|
||||
- **Purpose**: Completes boot process and handles soft-reboot cleanup
|
||||
- **Function**: Runs `ostree admin boot-complete`
|
||||
- **Timing**: After `sysinit.target`, before `ostree-finalize-staged.service`
|
||||
- **Critical**: Handles boot completion and cleanup
|
||||
|
||||
### Bootc Systemd Services
|
||||
|
||||
**`bootc-fetch-apply-updates.service` + `.timer`**:
|
||||
- **Purpose**: Automatic updates via `bootc upgrade --apply --quiet`
|
||||
- **Timer**: Runs 1h after boot, then every 8h with 2h randomization
|
||||
- **Critical**: Provides automatic update functionality
|
||||
|
||||
**`bootc-generic-growpart.service`**:
|
||||
- **Purpose**: Automatically grow root filesystem on VMs
|
||||
- **Function**: Runs `/usr/libexec/bootc-generic-growpart`
|
||||
- **Condition**: Only runs on VMs with `/sysroot` mounted
|
||||
- **Critical**: Handles filesystem growth automatically
|
||||
|
||||
**`bootc-destructive-cleanup.service`**:
|
||||
- **Purpose**: Cleanup after alongside installation
|
||||
- **Function**: Runs `/usr/lib/bootc/fedora-bootc-destructive-cleanup`
|
||||
- **Critical**: Cleans up after destructive operations
|
||||
|
||||
### APT-OSTree Services
|
||||
|
||||
**`apt-ostreed.service`**:
|
||||
- **Purpose**: APT-OSTree system management daemon
|
||||
- **Type**: DBus service (`org.debian.aptostree1`)
|
||||
- **Function**: Runs `apt-ostree start-daemon`
|
||||
- **Critical**: Provides system management API
|
||||
|
||||
**`apt-ostree-bootstatus.service`**:
|
||||
- **Purpose**: Log booted deployment status to journal
|
||||
- **Function**: Runs `apt-ostree status -b`
|
||||
- **Critical**: Provides boot status logging
|
||||
|
||||
### Kernel Installation Hooks
|
||||
|
||||
**`05-aptostree.install`**:
|
||||
- **Purpose**: OSTree-aware kernel installation hook
|
||||
- **Function**: Delegates to `apt-ostree kernel-install` for OSTree systems
|
||||
- **Critical**: Ensures proper kernel installation in OSTree environment
|
||||
|
||||
**`install.conf`**:
|
||||
- **Purpose**: Kernel install configuration
|
||||
- **Content**: `layout=ostree`
|
||||
- **Critical**: Tells kernel-install to use OSTree-specific hooks
|
||||
|
||||
### Dracut Module
|
||||
|
||||
**`98ostree/module-setup.sh`**:
|
||||
- **Purpose**: OSTree dracut module for initramfs
|
||||
- **Function**: Installs OSTree binaries and services into initramfs
|
||||
- **Critical**: Required for OSTree integration in initramfs
|
||||
|
||||
## 🚀 Implementation Strategy
|
||||
|
||||
### Phase 1: Create Debian Packages
|
||||
1. **`ostree-systemd`** - Essential OSTree services
|
||||
2. **`bootc`** - Bootc infrastructure
|
||||
3. **`ostree-dracut`** - Dracut module
|
||||
4. **`apt-ostree`** - Enhanced with systemd services and kernel hooks
|
||||
|
||||
### Phase 2: Package Installation
|
||||
```bash
|
||||
# Install the packages
|
||||
sudo dpkg -i ostree-systemd_*.deb
|
||||
sudo dpkg -i bootc_*.deb
|
||||
sudo dpkg -i ostree-dracut_*.deb
|
||||
sudo dpkg -i apt-ostree_*.deb # Enhanced with systemd services
|
||||
```
|
||||
|
||||
### Phase 3: Test with bootc-image-builder
|
||||
```bash
|
||||
# Use existing bootc-image-builder with Debian container
|
||||
bootc-image-builder build --config debian-atomic.yaml
|
||||
```
|
||||
|
||||
## 🎯 Expected Results
|
||||
|
||||
After installing these packages, Debian should have:
|
||||
- ✅ **Complete OSTree infrastructure** (28+ systemd services)
|
||||
- ✅ **Proper kernel installation hooks** for OSTree
|
||||
- ✅ **Dracut integration** for initramfs
|
||||
- ✅ **Automatic update functionality** via bootc
|
||||
- ✅ **Filesystem growth and cleanup** capabilities
|
||||
- ✅ **Compatibility with bootc-image-builder**
|
||||
|
||||
## 📋 Next Steps
|
||||
|
||||
1. **Create Debian packages** from these files
|
||||
2. **Test package installation** on Debian system
|
||||
3. **Build Debian Atomic container** with apt-ostree
|
||||
4. **Test with bootc-image-builder** to create bootable image
|
||||
5. **Boot test** the resulting image
|
||||
|
||||
## 🔍 Key Insights
|
||||
|
||||
**The problem was not in the build process** - `bootc-image-builder` works fine. The problem was **missing package infrastructure** in Debian. These files provide the missing systemd services, configuration files, and hooks that make OSTree work properly.
|
||||
|
||||
**This approach is much more manageable** than initially thought - we just need to package these files and install them, then use the existing proven build process.
|
||||
9
apt-ostree-systemd/apt-ostreed.conf
Normal file
9
apt-ostree-systemd/apt-ostreed.conf
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Entries in this file show the compile time defaults.
|
||||
# You can change settings by editing this file.
|
||||
# For option meanings, see apt-ostreed.conf(5).
|
||||
|
||||
[Daemon]
|
||||
#AutomaticUpdatePolicy=none
|
||||
#IdleExitTimeout=60
|
||||
#LockLayering=false
|
||||
#Recommends=true
|
||||
4
apt-ostree-systemd/kernel/install.conf
Normal file
4
apt-ostree-systemd/kernel/install.conf
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# kernel-install will not try to run dracut and allow apt-ostree to
|
||||
# take over. Apt-ostree will use this to know that it is responsible
|
||||
# to run dracut and ensure that there is only one kernel in the image
|
||||
layout=ostree
|
||||
9
apt-ostree-systemd/kernel/install.d/05-aptostree.install
Normal file
9
apt-ostree-systemd/kernel/install.d/05-aptostree.install
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#!/usr/bin/bash
|
||||
# Check if install.conf is missing or does not include layout=ostree
|
||||
if [ ! -f /usr/lib/kernel/install.conf ] || ! grep -q layout=ostree /usr/lib/kernel/install.conf; then
|
||||
exit 0
|
||||
fi
|
||||
# This is the hook that has kernel-install call into apt-ostree kernel-install
|
||||
if test -x /usr/bin/apt-ostree; then
|
||||
exec /usr/bin/apt-ostree kernel-install "$@"
|
||||
fi
|
||||
40
apt-ostree-systemd/org.debian.aptostree1.conf
Normal file
40
apt-ostree-systemd/org.debian.aptostree1.conf
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- XML -*- -->
|
||||
|
||||
<!DOCTYPE busconfig PUBLIC
|
||||
"-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
|
||||
<busconfig>
|
||||
<!-- Only root can own the service -->
|
||||
<policy user="root">
|
||||
<allow own="org.debian.aptostree1"/>
|
||||
<allow send_destination="org.debian.aptostree1"/>
|
||||
</policy>
|
||||
|
||||
<!-- Allow anyone to call into the service - we'll reject callers using PolicyKit -->
|
||||
<policy context="default">
|
||||
<deny send_destination="org.debian.aptostree1"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.freedesktop.DBus.Introspectable"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.freedesktop.DBus.ObjectManager"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.freedesktop.DBus.Peer"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.freedesktop.DBus.Properties"
|
||||
send_member="Get"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.freedesktop.DBus.Properties"
|
||||
send_member="GetAll"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.debian.aptostree1.OS"/>
|
||||
|
||||
<allow send_destination="org.debian.aptostree1"
|
||||
send_interface="org.debian.aptostree1.Sysroot"/>
|
||||
</policy>
|
||||
</busconfig>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
[Unit]
|
||||
Description=Log apt-ostree Booted Deployment Status To Journal
|
||||
Documentation=man:apt-ostree(1)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=apt-ostree status -b
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
12
apt-ostree-systemd/systemd/system/apt-ostree-countme.service
Normal file
12
apt-ostree-systemd/systemd/system/apt-ostree-countme.service
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[Unit]
|
||||
Description=Weekly apt-ostree Count Me reporting
|
||||
Documentation=man:apt-ostree-countme.service(8)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
User=apt-ostree
|
||||
DynamicUser=yes
|
||||
StateDirectory=apt-ostree-countme
|
||||
StateDirectoryMode=750
|
||||
ExecStart=apt-ostree countme
|
||||
12
apt-ostree-systemd/systemd/system/apt-ostree-countme.timer
Normal file
12
apt-ostree-systemd/systemd/system/apt-ostree-countme.timer
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[Unit]
|
||||
Description=Weekly apt-ostree Count Me reporting
|
||||
Documentation=man:apt-ostree-countme.service(8)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Timer]
|
||||
OnCalendar=weekly
|
||||
RandomizedDelaySec=1d
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
[Unit]
|
||||
# apt-ostree v2023.6 introduced a permission issue on `/etc/[g]shadow[-]`.
|
||||
# This makes sure to fix permissions on systems that were deployed with the wrong permissions.
|
||||
Description=Update permissions for /etc/shadow
|
||||
Documentation=https://github.com/coreos/rpm-ostree-ghsa-2m76-cwhg-7wv6
|
||||
# This new stamp file is written by the Rust code, and obsoletes
|
||||
# the old /etc/.apt-ostree-shadow-mode-fixed.stamp
|
||||
ConditionPathExists=!/etc/.apt-ostree-shadow-mode-fixed2.stamp
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
# Filter out non-traditional ostree setups (e.g. live boots)
|
||||
ConditionKernelCommandLine=ostree
|
||||
# Because we read the sysroot
|
||||
RequiresMountsFor=/boot
|
||||
# Make sure this is started before any unprivileged (interactive) user has access to the system.
|
||||
Before=systemd-user-sessions.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=apt-ostree fix-shadow-perms
|
||||
RemainAfterExit=yes
|
||||
# So we can remount /sysroot writable in our own namespace
|
||||
MountFlags=slave
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
[Unit]
|
||||
Description=APT-OSTree Automatic Update
|
||||
Documentation=man:apt-ostree(1) man:apt-ostreed.conf(5)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=apt-ostree upgrade --quiet --trigger-automatic-update-policy
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
[Unit]
|
||||
Description=APT-OSTree Automatic Update Trigger
|
||||
Documentation=man:apt-ostree(1) man:apt-ostreed.conf(5)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Timer]
|
||||
OnBootSec=1h
|
||||
OnUnitInactiveSec=1d
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
32
apt-ostree-systemd/systemd/system/apt-ostreed.service
Normal file
32
apt-ostree-systemd/systemd/system/apt-ostreed.service
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
[Unit]
|
||||
Description=APT-OSTree System Management Daemon
|
||||
Documentation=man:apt-ostree(1)
|
||||
ConditionPathExists=/ostree
|
||||
RequiresMountsFor=/boot
|
||||
|
||||
[Service]
|
||||
# See similar code in apt-ostree-countme.service
|
||||
User=apt-ostree
|
||||
DynamicUser=yes
|
||||
# As of right now, our primary API is DBus. But see also https://github.com/coreos/rpm-ostree/issues/3850
|
||||
Type=dbus
|
||||
BusName=org.debian.aptostree1
|
||||
# To use the read-only sysroot bits
|
||||
MountFlags=slave
|
||||
# We have no business accessing /var/roothome or /var/home. In general
|
||||
# the ostree design clearly avoids touching those, but since systemd offers
|
||||
# us easy tools to toggle on protection, let's use them. In the future
|
||||
# it'd be nice to do something like using DynamicUser=yes for the main service,
|
||||
# and have a system apt-ostreed-transaction.service that runs privileged
|
||||
# but as a subprocess.
|
||||
ProtectHome=true
|
||||
NotifyAccess=main
|
||||
# Significantly bump this timeout from the default because
|
||||
# we do a lot of stuff on daemon startup.
|
||||
TimeoutStartSec=5m
|
||||
# We start this main process with full privileges; it may spawn unprivileged processes
|
||||
# with the apt-ostree user.
|
||||
ExecStart=+apt-ostree start-daemon
|
||||
ExecReload=apt-ostree reload
|
||||
# disable/enable downloading filelists
|
||||
Environment="DOWNLOAD_FILELISTS=false"
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# Traditionally, /usr/local has been a link to /var/usrlocal and /opt to /var/opt.
|
||||
# A new model now is to allow OSTree commit content in those directories. For
|
||||
# backwards compatibility, we keep the /var paths but flip the symlinks around.
|
||||
L /var/usrlocal - - - - ../usr/local
|
||||
L /var/opt - - - - ../usr/lib/opt
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
# Traditionally, /usr/local has been a link to /var/usrlocal and /opt to /var/opt.
|
||||
# A new model now is to allow OSTree commit content in those directories. But
|
||||
# this dropin implements the old model.
|
||||
d /var/opt 0755 root root -
|
||||
d /var/usrlocal 0755 root root -
|
||||
18
apt-ostree-systemd/tmpfiles.d/apt-ostree-0-integration.conf
Normal file
18
apt-ostree-systemd/tmpfiles.d/apt-ostree-0-integration.conf
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
d /var/home 0755 root root -
|
||||
d /var/srv 0755 root root -
|
||||
d /var/roothome 0700 root root -
|
||||
d /var/mnt 0755 root root -
|
||||
d /run/media 0755 root root -
|
||||
L /var/lib/dpkg - - - - ../../usr/share/dpkg
|
||||
|
||||
# this is normally owned by `filesystem`, but for multiple reasons, this doesn't
|
||||
# work in the apt-ostree flow
|
||||
d /usr/local/bin 0755 root root -
|
||||
d /usr/local/etc 0755 root root -
|
||||
d /usr/local/games 0755 root root -
|
||||
d /usr/local/include 0755 root root -
|
||||
d /usr/local/lib 0755 root root -
|
||||
d /usr/local/man 0755 root root -
|
||||
d /usr/local/sbin 0755 root root -
|
||||
d /usr/local/share 0755 root root -
|
||||
d /usr/local/src 0755 root root -
|
||||
7
bootc-dracut/usr/lib/dracut.conf.d/10-bootc-base.conf
Normal file
7
bootc-dracut/usr/lib/dracut.conf.d/10-bootc-base.conf
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Typically we want want a generic image and
|
||||
# hostonly makes no sense as part of a server side build.
|
||||
# (really hostonly=no should be the default if dracut detects that
|
||||
# it's in a container or so)
|
||||
hostonly=no
|
||||
# We require ostree in the initramfs
|
||||
add_dracutmodules+=" ostree "
|
||||
22
bootc-systemd/systemd/system/bootc-root-setup.service
Normal file
22
bootc-systemd/systemd/system/bootc-root-setup.service
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
[Unit]
|
||||
Description=bootc setup root
|
||||
Documentation=man:bootc(1)
|
||||
DefaultDependencies=no
|
||||
# For now
|
||||
ConditionKernelCommandLine=ostree
|
||||
ConditionPathExists=/etc/initrd-release
|
||||
After=sysroot.mount
|
||||
After=ostree-prepare-root.service
|
||||
Requires=sysroot.mount
|
||||
Before=initrd-root-fs.target
|
||||
|
||||
OnFailure=emergency.target
|
||||
OnFailureJobMode=isolate
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/lib/bootc/initramfs-setup setup-root
|
||||
StandardInput=null
|
||||
StandardOutput=journal
|
||||
StandardError=journal+console
|
||||
RemainAfterExit=yes
|
||||
12
bootc/systemd/system/bootc-destructive-cleanup.service
Normal file
12
bootc/systemd/system/bootc-destructive-cleanup.service
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[Unit]
|
||||
Description=Cleanup previous the installation after an alongside installation
|
||||
Documentation=man:bootc(8)
|
||||
ConditionPathExists=/sysroot/etc/bootc-destructive-cleanup
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/lib/bootc/fedora-bootc-destructive-cleanup
|
||||
PrivateMounts=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
8
bootc/systemd/system/bootc-fetch-apply-updates.service
Normal file
8
bootc/systemd/system/bootc-fetch-apply-updates.service
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
[Unit]
|
||||
Description=Apply bootc updates
|
||||
Documentation=man:bootc(8)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/bootc upgrade --apply --quiet
|
||||
14
bootc/systemd/system/bootc-fetch-apply-updates.timer
Normal file
14
bootc/systemd/system/bootc-fetch-apply-updates.timer
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
[Unit]
|
||||
Description=Apply bootc updates
|
||||
Documentation=man:bootc(8)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Timer]
|
||||
OnBootSec=1h
|
||||
# This time is relatively arbitrary and obviously expected to be overridden/changed
|
||||
OnUnitInactiveSec=8h
|
||||
# When deploying a large number of systems, it may be beneficial to increase this value to help with load on the registry.
|
||||
RandomizedDelaySec=2h
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
22
bootc/systemd/system/bootc-generic-growpart.service
Normal file
22
bootc/systemd/system/bootc-generic-growpart.service
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
[Unit]
|
||||
Description=Bootc Fallback Root Filesystem Grow
|
||||
Documentation=https://gitlab.com/fedora/bootc/docs
|
||||
# For now we skip bare metal cases, and we also have nothing to do
|
||||
# for containers.
|
||||
ConditionVirtualization=vm
|
||||
# This helps verify that we're running in a bootc/ostree based target.
|
||||
ConditionPathIsMountPoint=/sysroot
|
||||
# For someone making a smaller image, assume they have this handled.
|
||||
ConditionPathExists=/usr/bin/growpart
|
||||
# We want to run before any e.g. large container images might be pulled.
|
||||
DefaultDependencies=no
|
||||
Requires=sysinit.target
|
||||
After=sysinit.target
|
||||
Before=basic.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/libexec/bootc-generic-growpart
|
||||
# So we can temporarily remount the sysroot writable
|
||||
MountFlags=slave
|
||||
# Just to auto-cleanup our temporary files
|
||||
PrivateTmp=yes
|
||||
12
bootc/systemd/system/bootc-publish-rhsm-facts.service
Normal file
12
bootc/systemd/system/bootc-publish-rhsm-facts.service
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
[Unit]
|
||||
Description=Publish bootc facts to Red Hat Subscription Manager
|
||||
Documentation=man:bootc(8)
|
||||
ConditionPathExists=/etc/rhsm/facts
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/bootc internals publish-rhsm-facts
|
||||
|
||||
[Install]
|
||||
WantedBy=bootc-status-updated.target
|
||||
WantedBy=bootc-status-updated-onboot.target
|
||||
7
bootc/systemd/system/bootc-status-updated-onboot.target
Normal file
7
bootc/systemd/system/bootc-status-updated-onboot.target
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[Unit]
|
||||
Description=Target for bootc status changes on boot
|
||||
Documentation=man:bootc-status-updated.target(8)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
5
bootc/systemd/system/bootc-status-updated.target
Normal file
5
bootc/systemd/system/bootc-status-updated.target
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[Unit]
|
||||
Description=Target for bootc status changes
|
||||
Documentation=man:bootc-status-updated.target(8)
|
||||
StopWhenUnneeded=true
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
83
install.sh
Executable file
83
install.sh
Executable file
|
|
@ -0,0 +1,83 @@
|
|||
#!/bin/bash
|
||||
# Debian Atomic Infrastructure Installation Script
|
||||
# This script installs the missing OSTree infrastructure files to a Debian system
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Installing Debian Atomic Infrastructure Files"
|
||||
echo "================================================"
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "❌ Please run as root (use sudo)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create directories
|
||||
echo "📁 Creating directories..."
|
||||
mkdir -p /usr/lib/systemd/system
|
||||
mkdir -p /usr/lib/ostree
|
||||
mkdir -p /usr/lib/tmpfiles.d
|
||||
mkdir -p /usr/lib/kernel/install.d
|
||||
mkdir -p /usr/lib/dracut/modules.d/98ostree
|
||||
mkdir -p /usr/lib/dracut.conf.d
|
||||
mkdir -p /usr/share/dbus-1/system.d
|
||||
|
||||
# Install OSTree systemd services
|
||||
echo "🔧 Installing OSTree systemd services..."
|
||||
cp ostree-systemd/systemd/system/*.service /usr/lib/systemd/system/
|
||||
cp ostree-systemd/ostree/prepare-root.conf /usr/lib/ostree/
|
||||
cp ostree-systemd/tmpfiles.d/ostree-tmpfiles.conf /usr/lib/tmpfiles.d/
|
||||
|
||||
# Install bootc services
|
||||
echo "🔧 Installing bootc services..."
|
||||
cp bootc/systemd/system/*.service /usr/lib/systemd/system/
|
||||
cp bootc-systemd/systemd/system/*.service /usr/lib/systemd/system/
|
||||
cp bootc/systemd/system/*.timer /usr/lib/systemd/system/
|
||||
cp bootc/systemd/system/*.target /usr/lib/systemd/system/
|
||||
|
||||
# Install bootc dracut configuration
|
||||
echo "🔧 Installing bootc dracut configuration..."
|
||||
cp bootc-dracut/usr/lib/dracut.conf.d/*.conf /usr/lib/dracut.conf.d/
|
||||
|
||||
# Install APT-OSTree services
|
||||
echo "🔧 Installing APT-OSTree services..."
|
||||
cp apt-ostree-systemd/systemd/system/*.service /usr/lib/systemd/system/
|
||||
cp apt-ostree-systemd/systemd/system/*.timer /usr/lib/systemd/system/
|
||||
cp apt-ostree-systemd/kernel/install.d/*.install /usr/lib/kernel/install.d/
|
||||
cp apt-ostree-systemd/kernel/install.conf /usr/lib/kernel/
|
||||
cp apt-ostree-systemd/tmpfiles.d/*.conf /usr/lib/tmpfiles.d/
|
||||
cp apt-ostree-systemd/apt-ostreed.conf /etc/
|
||||
cp apt-ostree-systemd/org.debian.aptostree1.conf /usr/share/dbus-1/system.d/
|
||||
|
||||
# Make kernel install hook executable
|
||||
chmod +x /usr/lib/kernel/install.d/05-aptostree.install
|
||||
|
||||
# Install OSTree dracut module
|
||||
echo "🔧 Installing OSTree dracut module..."
|
||||
cp ostree-dracut/modules.d/98ostree/module-setup.sh /usr/lib/dracut/modules.d/98ostree/
|
||||
chmod +x /usr/lib/dracut/modules.d/98ostree/module-setup.sh
|
||||
|
||||
# Reload systemd
|
||||
echo "🔄 Reloading systemd..."
|
||||
systemctl daemon-reload
|
||||
|
||||
echo "✅ Installation complete!"
|
||||
echo ""
|
||||
echo "📋 Installed components:"
|
||||
echo " - OSTree systemd services (6 services)"
|
||||
echo " - Bootc systemd services (8 services + timers + targets)"
|
||||
echo " - APT-OSTree systemd services (4 services + timer)"
|
||||
echo " - Kernel installation hooks (1 hook + config)"
|
||||
echo " - OSTree dracut module (1 module)"
|
||||
echo ""
|
||||
echo "🎯 Next steps:"
|
||||
echo " 1. Test with apt-ostree compose tree"
|
||||
echo " 2. Test with apt-ostree compose container-encapsulate"
|
||||
echo " 3. Test with bootc-image-builder"
|
||||
echo " 4. Boot test the resulting image"
|
||||
echo ""
|
||||
echo "🔍 To verify installation:"
|
||||
echo " systemctl list-units --type=service | grep -E '(ostree|bootc|apt-ostree)'"
|
||||
echo " ls -la /usr/lib/kernel/install.d/05-aptostree.install"
|
||||
echo " ls -la /usr/lib/dracut/modules.d/98ostree/module-setup.sh"
|
||||
28
ostree-dracut/modules.d/98ostree/module-setup.sh
Normal file
28
ostree-dracut/modules.d/98ostree/module-setup.sh
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
#!/usr/bin/bash
|
||||
installkernel() {
|
||||
instmods erofs overlay
|
||||
}
|
||||
|
||||
check() {
|
||||
if [[ -x $systemdutildir/systemd ]] && [[ -x /usr/lib/ostree/ostree-prepare-root ]]; then
|
||||
return 255
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
depends() {
|
||||
return 0
|
||||
}
|
||||
|
||||
install() {
|
||||
dracut_install /usr/lib/ostree/ostree-prepare-root
|
||||
for r in /usr/lib /etc; do
|
||||
if test -f "$r/ostree/prepare-root.conf"; then
|
||||
inst_simple "$r/ostree/prepare-root.conf"
|
||||
fi
|
||||
done
|
||||
inst_simple "${systemdsystemunitdir}/ostree-prepare-root.service"
|
||||
mkdir -p "${initdir}${systemdsystemconfdir}/initrd-root-fs.target.wants"
|
||||
ln_r "${systemdsystemunitdir}/ostree-prepare-root.service" \
|
||||
"${systemdsystemconfdir}/initrd-root-fs.target.wants/ostree-prepare-root.service"
|
||||
}
|
||||
4
ostree-systemd/ostree/prepare-root.conf
Normal file
4
ostree-systemd/ostree/prepare-root.conf
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
[composefs]
|
||||
enabled = yes
|
||||
[sysroot]
|
||||
readonly = true
|
||||
39
ostree-systemd/systemd/system/ostree-boot-complete.service
Normal file
39
ostree-systemd/systemd/system/ostree-boot-complete.service
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
# Copyright (C) 2022 Red Hat, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
[Unit]
|
||||
Description=OSTree Complete Boot
|
||||
Documentation=man:ostree(1)
|
||||
ConditionKernelCommandLine=ostree
|
||||
# For now, this is the only condition on which we start, but it's
|
||||
# marked as a triggering condition in case in the future we want
|
||||
# to do something else.
|
||||
ConditionPathExists=|/boot/ostree/finalize-failure.stamp
|
||||
# Also run when soft-reboot cleanup is needed
|
||||
ConditionPathExists=|/run/ostree/nextroot-booted
|
||||
# We start early
|
||||
DefaultDependencies=no
|
||||
After=sysinit.target
|
||||
RequiresMountsFor=/boot
|
||||
# Ensure that we propagate the failure into the current boot before
|
||||
# any further finalization attempts.
|
||||
Before=ostree-finalize-staged.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
# To write to /boot while keeping it read-only
|
||||
MountFlags=slave
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/bin/ostree admin boot-complete
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# Copyright (C) 2018 Red Hat, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
[Unit]
|
||||
Description=OSTree Finalize Staged Hold
|
||||
Documentation=man:ostree(1)
|
||||
DefaultDependencies=no
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/bin/true
|
||||
52
ostree-systemd/systemd/system/ostree-finalize-staged.service
Normal file
52
ostree-systemd/systemd/system/ostree-finalize-staged.service
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
# Copyright (C) 2018 Red Hat, Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# For some implementation discussion, see:
|
||||
# https://lists.freedesktop.org/archives/systemd-devel/2018-March/040557.html
|
||||
[Unit]
|
||||
Description=OSTree Finalize Staged Deployment
|
||||
Documentation=man:ostree(1)
|
||||
ConditionPathExists=/run/ostree-booted
|
||||
DefaultDependencies=no
|
||||
|
||||
RequiresMountsFor=/sysroot /boot
|
||||
After=local-fs.target
|
||||
Before=basic.target final.target
|
||||
# We want to make sure the transaction logs are persisted to disk:
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1751272
|
||||
After=systemd-journal-flush.service
|
||||
Conflicts=final.target
|
||||
|
||||
# Start the hold unit and ensure it stays active throughout this
|
||||
# service.
|
||||
Wants=ostree-finalize-staged-hold.service
|
||||
After=ostree-finalize-staged-hold.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStop=/usr/bin/ostree admin finalize-staged
|
||||
# This is a quite long timeout intentionally; the failure mode
|
||||
# here is that people don't get an upgrade. We need to handle
|
||||
# cases with slow rotational media, etc.
|
||||
TimeoutStopSec=5m
|
||||
# OSTree should never touch /var at all...except, we need to remove
|
||||
# the /var/.updated flag, so we can't just `InaccessiblePaths=/var` right now.
|
||||
# For now, let's at least use ProtectHome just so we have some sandboxing
|
||||
# of that.
|
||||
ProtectHome=yes
|
||||
# And we shouldn't affect the current deployment's /etc.
|
||||
ReadOnlyPaths=/etc
|
||||
# We write to /sysroot and /boot of course.
|
||||
35
ostree-systemd/systemd/system/ostree-prepare-root.service
Normal file
35
ostree-systemd/systemd/system/ostree-prepare-root.service
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
# Copyright (C) 2013 Colin Walters <walters@verbum.org>
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
[Unit]
|
||||
Description=OSTree Prepare OS/
|
||||
Documentation=man:ostree(1)
|
||||
DefaultDependencies=no
|
||||
ConditionKernelCommandLine=ostree
|
||||
ConditionPathExists=/etc/initrd-release
|
||||
After=sysroot.mount
|
||||
Requires=sysroot.mount
|
||||
Before=initrd-root-fs.target
|
||||
|
||||
OnFailure=emergency.target
|
||||
OnFailureJobMode=isolate
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/lib/ostree/ostree-prepare-root /sysroot
|
||||
StandardInput=null
|
||||
StandardOutput=journal
|
||||
StandardError=journal+console
|
||||
RemainAfterExit=yes
|
||||
40
ostree-systemd/systemd/system/ostree-remount.service
Normal file
40
ostree-systemd/systemd/system/ostree-remount.service
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
# Copyright (C) 2013 Colin Walters <walters@verbum.org>
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
[Unit]
|
||||
Description=OSTree Remount OS/ Bind Mounts
|
||||
Documentation=man:ostree(1)
|
||||
DefaultDependencies=no
|
||||
ConditionKernelCommandLine=ostree
|
||||
OnFailure=emergency.target
|
||||
Conflicts=umount.target
|
||||
# Run after core mounts
|
||||
After=-.mount var.mount
|
||||
After=systemd-remount-fs.service
|
||||
# But we run *before* most other core bootup services that need write access to /etc and /var
|
||||
Before=local-fs.target umount.target
|
||||
Before=systemd-random-seed.service plymouth-read-write.service systemd-journal-flush.service
|
||||
Before=systemd-tmpfiles-setup.service systemd-rfkill.service systemd-rfkill.socket
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/lib/ostree/ostree-remount
|
||||
StandardInput=null
|
||||
StandardOutput=journal
|
||||
StandardError=journal+console
|
||||
|
||||
[Install]
|
||||
WantedBy=local-fs.target
|
||||
36
ostree-systemd/systemd/system/ostree-state-overlay@.service
Normal file
36
ostree-systemd/systemd/system/ostree-state-overlay@.service
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
# Copyright (C) 2023 Red Hat Inc.
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
[Unit]
|
||||
Description=OSTree State Overlay On /%I
|
||||
Documentation=man:ostree(1)
|
||||
DefaultDependencies=no
|
||||
ConditionKernelCommandLine=ostree
|
||||
# run after /var is setup since that's where the upperdir is stored
|
||||
# and after boot.mount so we can load the sysroot
|
||||
After=var.mount boot.mount
|
||||
# but before local-fs.target, which we consider ourselves a part of
|
||||
Before=local-fs.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=yes
|
||||
ExecStart=/usr/bin/ostree admin state-overlay %i /%I
|
||||
StandardInput=null
|
||||
StandardOutput=journal
|
||||
StandardError=journal+console
|
||||
|
||||
[Install]
|
||||
WantedBy=local-fs.target
|
||||
21
ostree-systemd/tmpfiles.d/ostree-tmpfiles.conf
Normal file
21
ostree-systemd/tmpfiles.d/ostree-tmpfiles.conf
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# Copyright (C) 2017 Colin Walters <walters@verbum.org>
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Lesser General Public
|
||||
# License as published by the Free Software Foundation; either
|
||||
# version 2 of the License, or (at your option) any later version.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this library. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# ostree runtime configuration
|
||||
d /run/ostree 0755 root root -
|
||||
# https://github.com/ostreedev/ostree/issues/393
|
||||
# Note this can eventually be removed now that we
|
||||
# write to the deployment backing dir.
|
||||
R! /var/tmp/ostree-unlock-ovl.*
|
||||
147
verify.sh
Executable file
147
verify.sh
Executable file
|
|
@ -0,0 +1,147 @@
|
|||
#!/bin/bash
|
||||
# Debian Atomic Infrastructure Verification Script
|
||||
# This script verifies that all required files are installed correctly
|
||||
|
||||
echo "🔍 Verifying Debian Atomic Infrastructure Installation"
|
||||
echo "====================================================="
|
||||
|
||||
# Check OSTree systemd services
|
||||
echo "📋 Checking OSTree systemd services..."
|
||||
ostree_services=(
|
||||
"ostree-prepare-root.service"
|
||||
"ostree-remount.service"
|
||||
"ostree-state-overlay@.service"
|
||||
"ostree-finalize-staged.service"
|
||||
"ostree-finalize-staged-hold.service"
|
||||
"ostree-boot-complete.service"
|
||||
)
|
||||
|
||||
for service in "${ostree_services[@]}"; do
|
||||
if [ -f "/usr/lib/systemd/system/$service" ]; then
|
||||
echo " ✅ $service"
|
||||
else
|
||||
echo " ❌ $service - MISSING"
|
||||
fi
|
||||
done
|
||||
|
||||
# Check bootc services
|
||||
echo "📋 Checking bootc services..."
|
||||
bootc_services=(
|
||||
"bootc-fetch-apply-updates.service"
|
||||
"bootc-fetch-apply-updates.timer"
|
||||
"bootc-generic-growpart.service"
|
||||
"bootc-destructive-cleanup.service"
|
||||
"bootc-publish-rhsm-facts.service"
|
||||
"bootc-status-updated.target"
|
||||
"bootc-status-updated-onboot.target"
|
||||
"bootc-root-setup.service"
|
||||
)
|
||||
|
||||
for service in "${bootc_services[@]}"; do
|
||||
if [ -f "/usr/lib/systemd/system/$service" ]; then
|
||||
echo " ✅ $service"
|
||||
else
|
||||
echo " ❌ $service - MISSING"
|
||||
fi
|
||||
done
|
||||
|
||||
# Check APT-OSTree services
|
||||
echo "📋 Checking APT-OSTree services..."
|
||||
apt_ostree_services=(
|
||||
"apt-ostreed.service"
|
||||
"apt-ostree-bootstatus.service"
|
||||
"apt-ostree-countme.service"
|
||||
"apt-ostree-countme.timer"
|
||||
"apt-ostree-fix-shadow-mode.service"
|
||||
"apt-ostreed-automatic.service"
|
||||
"apt-ostreed-automatic.timer"
|
||||
)
|
||||
|
||||
for service in "${apt_ostree_services[@]}"; do
|
||||
if [ -f "/usr/lib/systemd/system/$service" ]; then
|
||||
echo " ✅ $service"
|
||||
else
|
||||
echo " ❌ $service - MISSING"
|
||||
fi
|
||||
done
|
||||
|
||||
# Check configuration files
|
||||
echo "📋 Checking configuration files..."
|
||||
config_files=(
|
||||
"/usr/lib/ostree/prepare-root.conf"
|
||||
"/usr/lib/tmpfiles.d/ostree-tmpfiles.conf"
|
||||
"/usr/lib/tmpfiles.d/apt-ostree-0-integration.conf"
|
||||
"/usr/lib/tmpfiles.d/apt-ostree-0-integration-opt-usrlocal.conf"
|
||||
"/usr/lib/tmpfiles.d/apt-ostree-0-integration-opt-usrlocal-compat.conf"
|
||||
"/usr/lib/kernel/install.conf"
|
||||
"/etc/apt-ostreed.conf"
|
||||
"/usr/share/dbus-1/system.d/org.debian.aptostree1.conf"
|
||||
"/usr/lib/dracut.conf.d/10-bootc-base.conf"
|
||||
)
|
||||
|
||||
for file in "${config_files[@]}"; do
|
||||
if [ -f "$file" ]; then
|
||||
echo " ✅ $file"
|
||||
else
|
||||
echo " ❌ $file - MISSING"
|
||||
fi
|
||||
done
|
||||
|
||||
# Check kernel installation hooks
|
||||
echo "📋 Checking kernel installation hooks..."
|
||||
if [ -f "/usr/lib/kernel/install.d/05-aptostree.install" ]; then
|
||||
echo " ✅ 05-aptostree.install"
|
||||
if [ -x "/usr/lib/kernel/install.d/05-aptostree.install" ]; then
|
||||
echo " ✅ 05-aptostree.install (executable)"
|
||||
else
|
||||
echo " ❌ 05-aptostree.install (not executable)"
|
||||
fi
|
||||
else
|
||||
echo " ❌ 05-aptostree.install - MISSING"
|
||||
fi
|
||||
|
||||
# Check dracut module
|
||||
echo "📋 Checking dracut module..."
|
||||
if [ -f "/usr/lib/dracut/modules.d/98ostree/module-setup.sh" ]; then
|
||||
echo " ✅ 98ostree/module-setup.sh"
|
||||
if [ -x "/usr/lib/dracut/modules.d/98ostree/module-setup.sh" ]; then
|
||||
echo " ✅ 98ostree/module-setup.sh (executable)"
|
||||
else
|
||||
echo " ❌ 98ostree/module-setup.sh (not executable)"
|
||||
fi
|
||||
else
|
||||
echo " ❌ 98ostree/module-setup.sh - MISSING"
|
||||
fi
|
||||
|
||||
# Check systemd daemon reload
|
||||
echo "📋 Checking systemd daemon status..."
|
||||
if systemctl daemon-reload >/dev/null 2>&1; then
|
||||
echo " ✅ systemd daemon reload successful"
|
||||
else
|
||||
echo " ❌ systemd daemon reload failed"
|
||||
fi
|
||||
|
||||
# Count total services
|
||||
echo "📊 Summary:"
|
||||
ostree_count=$(ls /usr/lib/systemd/system/ostree-*.service 2>/dev/null | wc -l)
|
||||
bootc_count=$(ls /usr/lib/systemd/system/bootc-*.service 2>/dev/null | wc -l)
|
||||
apt_ostree_count=$(ls /usr/lib/systemd/system/apt-ostree*.service 2>/dev/null | wc -l)
|
||||
total_services=$((ostree_count + bootc_count + apt_ostree_count))
|
||||
|
||||
echo " - OSTree services: $ostree_count"
|
||||
echo " - Bootc services: $bootc_count"
|
||||
echo " - APT-OSTree services: $apt_ostree_count"
|
||||
echo " - Total services: $total_services"
|
||||
|
||||
if [ $total_services -ge 18 ]; then
|
||||
echo " ✅ Installation looks complete!"
|
||||
else
|
||||
echo " ❌ Installation appears incomplete (expected ~18+ services)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "🎯 Next steps:"
|
||||
echo " 1. Test with apt-ostree compose tree"
|
||||
echo " 2. Test with apt-ostree compose container-encapsulate"
|
||||
echo " 3. Test with bootc-image-builder"
|
||||
echo " 4. Boot test the resulting image"
|
||||
Loading…
Add table
Add a link
Reference in a new issue