- Complete documentation for all bootc commands and subcommands - Debian-specific adaptations and workarounds - Manual installation methods to bypass bootc reliability issues - Technical guides with Rust source code analysis - Flowcharts and external command references - Hidden command documentation (bootc internals, state, etc.) - Composefs integration analysis - Base image creation guides (with and without bootc binary) - Management scripts and automation - Comprehensive troubleshooting and examples
436 lines
40 KiB
Markdown
436 lines
40 KiB
Markdown
# bootc exec-in-host-mount-namespace - Process Flowchart
|
|
|
|
## Overview
|
|
|
|
This document provides a visual representation of the `bootc exec-in-host-mount-namespace` process flow, showing the decision points, operations, and system state changes involved in executing commands in the host mount namespace.
|
|
|
|
## Main Process Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ bootc exec-in-host-mount-namespace │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Parse Command Arguments │
|
|
│ │
|
|
│ • Parse command and arguments │
|
|
│ • Validate arguments │
|
|
│ • Check command availability │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Validate Prerequisites │
|
|
│ │
|
|
│ • Check if command is provided │
|
|
│ • Verify argument structure │
|
|
│ • Validate command syntax │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Access Host Mount Namespace │
|
|
│ │
|
|
│ • Open /proc/1/ns/mnt │
|
|
│ • Get host mount namespace file descriptor │
|
|
│ • Prepare for namespace switching │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Switch to Host Namespace │
|
|
│ │
|
|
│ • Use setns system call │
|
|
│ • Switch to host mount namespace │
|
|
│ • Update process mount view │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Prepare Execution Environment │
|
|
│ │
|
|
│ • Change to root directory │
|
|
│ • Handle supermin workaround │
|
|
│ • Set up execution context │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Execute Command │
|
|
│ │
|
|
│ • Replace current process with target command │
|
|
│ • Execute command with arguments │
|
|
│ • Return execution result │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Detailed Process Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Command Parsing │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Split Arguments │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Argument Structure │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
│ │ Command │ │ Arguments │ │ Validation │ │
|
|
│ │ │ │ │ │ │ │
|
|
│ │ ┌─────────────┐│ │ ┌─────────────┐│ │ ┌─────────────┐│ │
|
|
│ │ │ First Arg ││ │ │ Remaining ││ │ │ Check Args ││ │
|
|
│ │ │ (Command) ││ │ │ Arguments ││ │ │ Structure ││ │
|
|
│ │ └─────────────┘│ │ └─────────────┘│ │ └─────────────┘│ │
|
|
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Namespace Access │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Open Host Namespace │
|
|
│ │
|
|
│ • Open /proc/1/ns/mnt file │
|
|
│ • Get file descriptor for host mount namespace │
|
|
│ • Prepare for setns operation │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Namespace Switching │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ setns Operation │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ move_into_link_name_space │ │
|
|
│ │ │ │
|
|
│ │ • Use rustix::thread::move_into_link_name_space │ │
|
|
│ │ • Specify Mount namespace type │ │
|
|
│ │ • Switch to host mount namespace │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Environment Setup │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Directory Operations │
|
|
│ │
|
|
│ • Change to root directory (chdir("/")) │
|
|
│ • Check for supermin workaround conditions │
|
|
│ • Handle chroot if necessary │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Supermin Workaround │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Check Conditions │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────┐ ┌─────────────────────────────────────┐ │
|
|
│ │ Normal Path │ │ Supermin Path │ │
|
|
│ │ │ │ │ │
|
|
│ │ ┌─────────────┐│ │ ┌─────────────────────────────────┐│ │
|
|
│ │ │ /usr exists ││ │ │ /usr doesn't exist ││ │
|
|
│ │ │ Continue ││ │ │ /root/usr exists ││ │
|
|
│ │ │ normally ││ │ │ chroot("/root") ││ │
|
|
│ │ └─────────────┘│ │ └─────────────────────────────────┘│ │
|
|
│ └─────────────────┘ └─────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Command Execution │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Process Replacement │
|
|
│ │
|
|
│ • Create Command with target command and arguments │
|
|
│ • Set process name (arg0) │
|
|
│ • Execute command (exec) │
|
|
│ • Replace current process │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Namespace Operations Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Namespace Operations │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Current Namespace │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Container/Isolated Namespace │ │
|
|
│ │ │ │
|
|
│ │ • Limited filesystem view │ │
|
|
│ │ • Isolated mount points │ │
|
|
│ │ • Restricted access │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ setns Operation │ │
|
|
│ │ │ │
|
|
│ │ • Open /proc/1/ns/mnt │ │
|
|
│ │ • Get file descriptor │ │
|
|
│ │ • Call setns system call │ │
|
|
│ │ • Switch to host namespace │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Host Namespace │ │
|
|
│ │ │ │
|
|
│ │ • Full filesystem view │ │
|
|
│ │ • Host mount points │ │
|
|
│ │ • Complete access │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Error Handling Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Error Detection │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Error Classification │
|
|
│ │
|
|
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
|
|
│ │ Argument │ │ Namespace │ │ Execution │ │
|
|
│ │ Errors │ │ Errors │ │ Errors │ │
|
|
│ │ │ │ │ │ │ │
|
|
│ │ • Missing Cmd │ │ • Access Denied │ │ • Command Not │ │
|
|
│ │ • Invalid Args │ │ • Namespace Not │ │ Found │ │
|
|
│ │ • Bad Syntax │ │ Available │ │ • Permission │ │
|
|
│ │ │ │ • setns Failed │ │ Denied │ │
|
|
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Error Response │
|
|
│ │
|
|
│ • Display error message │
|
|
│ • Provide context information │
|
|
│ • Suggest remediation steps │
|
|
│ • Return appropriate exit code │
|
|
│ • Log error details │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## System State Transitions
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ System States │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Initial State │
|
|
│ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Container/Isolated Environment │ │
|
|
│ │ │ │
|
|
│ │ • Limited filesystem access │ │
|
|
│ │ • Isolated mount namespace │ │
|
|
│ │ • Restricted system view │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Execute Command │ │
|
|
│ │ │ │
|
|
│ │ • Parse arguments │ │
|
|
│ │ • Access host namespace │ │
|
|
│ │ • Switch namespaces │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
│ │ Final State │ │
|
|
│ │ │ │
|
|
│ │ • Host mount namespace access │ │
|
|
│ │ • Full filesystem view │ │
|
|
│ │ • Command executed in host context │ │
|
|
│ └─────────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Command Execution Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Command Execution │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Prepare Command │
|
|
│ │
|
|
│ • Create Command struct │
|
|
│ • Set command name │
|
|
│ • Set arguments │
|
|
│ • Set process name (arg0) │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Execute Command │
|
|
│ │
|
|
│ • Use exec() to replace current process │
|
|
│ • Execute command with arguments │
|
|
│ • Return execution result │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Process Replacement │
|
|
│ │
|
|
│ • Current process is replaced │
|
|
│ • Target command becomes new process │
|
|
│ • Execution continues in host namespace │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Helper Function Flow
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Helper Functions │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ run_in_host_mountns │
|
|
│ │
|
|
│ • Create Command for host mount namespace execution │
|
|
│ • Set executable path │
|
|
│ • Add exec-in-host-mount-namespace argument │
|
|
│ • Return prepared Command │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ ensure_self_unshared_mount_namespace │
|
|
│ │
|
|
│ • Check if already in mount namespace │
|
|
│ • Check if root user │
|
|
│ • Unshare mount namespace if needed │
|
|
│ • Re-exec with unshared namespace │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Use Case Flows
|
|
|
|
### 1. Container Operations
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Container Operations │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Container Environment │
|
|
│ │
|
|
│ • Limited filesystem view │
|
|
│ • Isolated mount namespace │
|
|
│ • Restricted access to host │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Execute in Host Namespace │
|
|
│ │
|
|
│ • Switch to host mount namespace │
|
|
│ • Access host filesystem │
|
|
│ • Perform host operations │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 2. Installation Support
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Installation Support │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Installation Process │
|
|
│ │
|
|
│ • Running in container context │
|
|
│ • Need access to host filesystem │
|
|
│ • Perform installation operations │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Host Filesystem Access │
|
|
│ │
|
|
│ • Execute commands in host namespace │
|
|
│ • Access host filesystem │
|
|
│ • Complete installation │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 3. Debugging and Maintenance
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Debugging and Maintenance │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Debug Environment │
|
|
│ │
|
|
│ • Isolated debugging environment │
|
|
│ • Need access to host system │
|
|
│ • Perform debugging operations │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Host System Access │
|
|
│ │
|
|
│ • Execute debugging commands in host namespace │
|
|
│ │ • Check host filesystem │
|
|
│ │ • View host processes │
|
|
│ │ • Monitor host system │
|
|
│ • Complete debugging operations │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
This flowchart provides a comprehensive visual representation of the bootc exec-in-host-mount-namespace process, showing all decision points, operations, and state transitions involved in executing commands in the host mount namespace.
|