docs: describe move-based install, new update list rules and logging
This commit is contained in:
1 parent
5241cccbe9
commit
1df97d3a86
2 files changed
+66
-255
No files matched your search
+59
-249
@@ -87,215 +87,54 @@ The OmniNX Installer Payload operates in two modes:
|
||||
|
||||
## Phase 3: Update Mode Execution
|
||||
|
||||
**Trigger**: `INSTALL_MODE_UPDATE` (OmniNX already installed)
|
||||
**Trigger**: `INSTALL_MODE_UPDATE` (OmniNX already installed, `manifest.ini` has a valid `current_pack`)
|
||||
|
||||
### Step 1: Cleanup (Selective Deletion)
|
||||
**Location**: `install_update.c` (`update_mode_cleanup`), `install.c` (`delete_path_lists_grouped`)
|
||||
**Location**: `install_update.c` (`update_mode_cleanup`), `install.c` (`delete_path_lists_grouped`), lists in `deletion_lists_update.h`
|
||||
|
||||
Before deletion, the payload reads optional **`sd:/config/omninx/preserve.ini`** (section `[Preserve]`). Paths enabled there are skipped, as are delete targets that would remove them (parent/child overlap). See **[PRESERVE_INI.md](PRESERVE_INI.md)**. Clean install does not use this file.
|
||||
|
||||
#### 10. Clean Atmosphere Subdirectories
|
||||
**Location**: `install.c:325-327`, `deletion_lists.h:9-34`
|
||||
Deletes 34 specific subdirectories:
|
||||
- `atmosphere/config/`
|
||||
- `atmosphere/crash_reports/`
|
||||
- `atmosphere/exefs_patches/*` (various patch directories)
|
||||
- `atmosphere/kip1/`, `atmosphere/kips/`
|
||||
- `atmosphere/logs/`
|
||||
- And more...
|
||||
The update list only contains:
|
||||
- paths the current pack ships (removed first so the new files replace them cleanly),
|
||||
- components OmniNX used to ship and dropped (e.g. sys-ticon `00FF747765616BFF`),
|
||||
- boot-relevant housekeeping: Atmosphere logs/reports, foreign `exefs_patches`/`kip` folders, legacy bootloader and root boot files, `themes/systemData`.
|
||||
|
||||
#### 11. Clean Atmosphere Root Directories (Title IDs)
|
||||
**Location**: `install.c:330-331`, `deletion_lists.h:38-72`
|
||||
Deletes 29 title ID directories:
|
||||
- `atmosphere/0000000000534C56/`
|
||||
- `atmosphere/0100000000000008/`
|
||||
- `atmosphere/010000000000000D/`
|
||||
- And 26 more title ID folders...
|
||||
It deliberately does **not** contain apps, sysmodules or game title IDs a user can install on their own (e.g. through OmniNX Downloader). Those survive updates. Leftovers of other CFW packs are only removed by a clean install. `tools/audit_update_list.py <OmniNX repo>` checks the list against the pack history.
|
||||
|
||||
#### 12. Clean Atmosphere Contents Directories
|
||||
**Location**: `install.c:333-334`, `deletion_lists.h:75-110`
|
||||
Deletes 29 corresponding `atmosphere/contents/` title ID directories
|
||||
|
||||
#### 13. Clean Atmosphere Files
|
||||
**Location**: `install.c:336-337`, `deletion_lists.h:113-122`
|
||||
Deletes 7 specific files:
|
||||
- `atmosphere/config/exosphere.ini`
|
||||
- `atmosphere/config/override_config.ini`
|
||||
- `atmosphere/config/stratosphere.ini`
|
||||
- `atmosphere/hbl.nsp`
|
||||
- `atmosphere/package3`
|
||||
- `atmosphere/reboot_payload.bin`
|
||||
- `atmosphere/stratosphere.romfs`
|
||||
|
||||
#### 14. Clean Bootloader Directories
|
||||
**Location**: `install.c:340-343`, `deletion_lists.h:125-134`
|
||||
Deletes 7 bootloader subdirectories:
|
||||
- `bootloader/boot/`
|
||||
- `bootloader/bootlogo/`
|
||||
- `bootloader/ini2/`
|
||||
- `bootloader/payloads/`
|
||||
- `bootloader/reboot/`
|
||||
- `bootloader/res/`
|
||||
- `bootloader/sys/`
|
||||
|
||||
#### 15. Clean Bootloader Files
|
||||
**Location**: `install.c:345-346`, `deletion_lists.h:137-146`
|
||||
Deletes 7 specific files:
|
||||
- `bootloader/ArgonNX.bin`
|
||||
- `bootloader/bootlogo.bmp`
|
||||
- `bootloader/hekate_ipl.ini`
|
||||
- `bootloader/nyx.ini`
|
||||
- `bootloader/patches.ini`
|
||||
- `bootloader/update.bin`
|
||||
- `bootloader/ini/EmuMMC ohne Mods.ini`
|
||||
|
||||
#### 16. Clean Config Directories
|
||||
**Location**: `install.c:349-352`, `deletion_lists.h:149-160`
|
||||
Deletes 8 config subdirectories:
|
||||
- `config/aio-switch-updater/`
|
||||
- `config/blue_pack_updater/`
|
||||
- `config/kefir-updater/`
|
||||
- `config/nx-hbmenu/`
|
||||
- `config/quickntp/`
|
||||
- `config/sys-con/`
|
||||
- `config/sys-patch/`
|
||||
- `config/uberhand/`, `config/ultrahand/`
|
||||
|
||||
#### 17. Clean Switch Directories
|
||||
**Location**: `install.c:355-358`, `deletion_lists.h:163-226`
|
||||
Deletes 55+ switch application directories:
|
||||
- `switch/.overlays/`, `switch/.packages/`
|
||||
- `switch/aio-switch-updater/`
|
||||
- `switch/DBI_810/`, `switch/DBI_810_DE/`, `switch/DBI_810_EN/`
|
||||
- `switch/tinfoil/`
|
||||
- `switch/EdiZon/`, `switch/JKSV/`, `switch/checkpoint/`
|
||||
- And 40+ more application directories...
|
||||
|
||||
#### 18. Clean Switch Files
|
||||
**Location**: `install.c:360-361`, `deletion_lists.h:229-278`
|
||||
Deletes 47+ NRO files and other files:
|
||||
- `switch/tinfoil.nro`
|
||||
- `switch/DBI.nro`
|
||||
- `switch/DBI/DBI_810_*.nro` (various versions)
|
||||
- `switch/daybreak.nro`
|
||||
- And 40+ more files...
|
||||
|
||||
#### 19. Clean Root Files
|
||||
**Location**: `install.c:364-367`, `deletion_lists.h:281-295`
|
||||
Deletes 12 root-level CFW files:
|
||||
- `boot.dat`, `boot.ini`
|
||||
- `exosphere.bin`, `exosphere.ini`
|
||||
- `hbmenu.nro`
|
||||
- `loader.bin`, `payload.bin`
|
||||
- `update.bin`, `version`
|
||||
- And more...
|
||||
|
||||
#### 20. Clean Miscellaneous Directories
|
||||
**Location**: `install.c:369-370`, `deletion_lists.h:298-309`
|
||||
Deletes 9 miscellaneous directories:
|
||||
- `argon/`, `games/`, `NSPs (Tools)/`
|
||||
- `Patched Apps/`, `SaltySD/`
|
||||
- `scripts/`, `tools/`
|
||||
- `warmboot_mariko/`
|
||||
- `switch/tinfoil/db/`
|
||||
|
||||
#### 21. Clean Miscellaneous Files
|
||||
**Location**: `install.c:372-373`, `deletion_lists.h:312-322`
|
||||
Deletes 8 miscellaneous files:
|
||||
- `fusee-primary.bin`, `fusee.bin`
|
||||
- `SaltySD/*.elf` (various bootstrap files)
|
||||
|
||||
#### 22. Cleanup Old Version Markers
|
||||
**Location**: `install.c:308-318`, `deletion_lists.h:325-335`
|
||||
Deletes legacy version marker files:
|
||||
- `1.0.0l`, `1.0.0s`, `1.0.0oc`
|
||||
- `1.4.0-pre`, `1.4.0-pre-c`, `1.4.0-pre-d`
|
||||
- `1.4.1`, `1.5.0`
|
||||
|
||||
**Note**: Each deletion operation checks if path exists before attempting deletion.
|
||||
Deletion runs per group (`atmosphere/`, `bootloader/`, `config/`, `switch/`, root files) with one progress line each. Every entry is checked with a single `f_stat`; folders with more than 50 entries get their own progress line (detected with a probe that stops after 51 entries, not a full count).
|
||||
|
||||
---
|
||||
|
||||
### Step 2: File Installation
|
||||
**Location**: `install.c:383-526`
|
||||
**Location**: `install_update.c` (`update_mode_install`), `fs.c` (`fs_move_tree`, `fs_move_file`)
|
||||
|
||||
#### 23. Copy Atmosphere Directory
|
||||
**Location**: `install.c:400-402`
|
||||
- **Source**: `{staging}/atmosphere/` (e.g., `sd:/OmniNX Standard/atmosphere/`)
|
||||
- **Destination**: `sd:/atmosphere/`
|
||||
- **Progress**: Recursively counts all files/directories, displays percentage
|
||||
- **Tracking**: Updates progress every 10 items or when percentage changes
|
||||
Staging (`sd:/OmniNX <Variant>/`) and the target are on the same SD card, so files are **moved**, not copied:
|
||||
|
||||
#### 24. Copy Bootloader Directory
|
||||
**Location**: `install.c:404-406`
|
||||
- **Source**: `{staging}/bootloader/`
|
||||
- **Destination**: `sd:/bootloader/`
|
||||
- Same progress tracking as above
|
||||
| Folder | Notes |
|
||||
|--------|-------|
|
||||
| `atmosphere/`, `bootloader/`, `config/`, `switch/`, `themes/`, `warmboot_mariko/`, `hwtest/`, `extras/` | if present in the pack |
|
||||
| `SaltySD/` | OC variant only |
|
||||
| files at the pack root (`payload.bin`, `hbmenu.nro`, ...) | moved to `sd:/` |
|
||||
|
||||
#### 25. Copy Config Directory
|
||||
**Location**: `install.c:408-410`
|
||||
- **Source**: `{staging}/config/`
|
||||
- **Destination**: `sd:/config/`
|
||||
- Same progress tracking
|
||||
- If the target folder does not exist yet, the whole folder is moved with one `f_rename`.
|
||||
- If it exists, the pack folder is merged entry by entry: missing subfolders move in one step, files replace existing ones (read-only flag is cleared first).
|
||||
- If a rename fails, that entry falls back to a copy (1 MB buffer, allocated once per run).
|
||||
- The progress line counts processed entries (`Installiere: switch/ (n)`), so no extra pass over the tree is needed.
|
||||
|
||||
#### 26. Copy Switch Directory
|
||||
**Location**: `install.c:412-414`
|
||||
- **Source**: `{staging}/switch/`
|
||||
- **Destination**: `sd:/switch/`
|
||||
- Same progress tracking
|
||||
`manifest.ini` is part of the pack (`config/omninx/manifest.ini`) and arrives with `config/`.
|
||||
|
||||
#### 27. Copy warmboot_mariko Directory
|
||||
**Location**: `install.c:416-418`
|
||||
- **Source**: `{staging}/warmboot_mariko/`
|
||||
- **Destination**: `sd:/warmboot_mariko/`
|
||||
- Only if directory exists in staging
|
||||
### Step 3: Extras
|
||||
**Location**: `install.c` (`install_extras_post_copy`)
|
||||
|
||||
#### 28. Copy SaltySD Directory (OC Variant Only)
|
||||
**Location**: `install.c:421-425`
|
||||
- **Source**: `{staging}/SaltySD/`
|
||||
- **Destination**: `sd:/SaltySD/`
|
||||
- **Condition**: Only copied if `variant == VARIANT_OC`
|
||||
- **Note**: This is a large directory (~2500 files), so progress tracking is important
|
||||
- RAM menu (4GB / 8GB) and Hekate / Atmosphere vs. Hekate-Pro / Atmosphere-Pro menu, unless `sd:/config/omninx/config.ini` already holds the choice.
|
||||
- Hekate-Pro files are moved from `sd:/extras/hekate-ams-pro/` to `sd:/`; the 8GB payload is copied to `payload.bin` and `bootloader/update.bin`.
|
||||
- `sd:/extras/` is deleted afterwards.
|
||||
|
||||
#### 29. Copy Root Files
|
||||
**Location**: `install.c:428-466`
|
||||
Copies individual files from staging root to SD root:
|
||||
- `boot.dat` → `sd:/boot.dat`
|
||||
- `boot.ini` → `sd:/boot.ini`
|
||||
- `exosphere.ini` → `sd:/exosphere.ini`
|
||||
- `hbmenu.nro` → `sd:/hbmenu.nro`
|
||||
- `loader.bin` → `sd:/loader.bin`
|
||||
- `payload.bin` → `sd:/payload.bin`
|
||||
### Step 4: Cleanup Staging Directory
|
||||
**Location**: `install_update.c` (`cleanup_staging_directory`), `install_clean.c` (`cleanup_other_staging_directories`)
|
||||
|
||||
Each file is only copied if it exists in staging.
|
||||
|
||||
#### 30. Create manifest.ini
|
||||
**Location**: `install.c:468-516`
|
||||
Creates/overwrites `sd:/config/omninx/manifest.ini`:
|
||||
|
||||
**Content Structure**:
|
||||
```ini
|
||||
[OmniNX]
|
||||
current_pack={variant} # "Standard", "Light", or "OC"
|
||||
version={VERSION} # e.g., "1.0.0"
|
||||
update_channel={0|1|2} # light=0, oc=1, standard=2
|
||||
channel_pack={variant} # Same as current_pack
|
||||
```
|
||||
|
||||
**Directory Creation**: Ensures `sd:/config/omninx/` exists before creating file.
|
||||
|
||||
---
|
||||
|
||||
### Step 3: Cleanup Staging Directory
|
||||
**Location**: `install.c:626-656`
|
||||
|
||||
#### 31. Remove Staging Directory
|
||||
**Location**: `install.c:634-652`
|
||||
- Recursively deletes the entire staging directory:
|
||||
- `sd:/OmniNX Standard/` OR
|
||||
- `sd:/OmniNX Light/` OR
|
||||
- `sd:/OmniNX OC/`
|
||||
- **Error Handling**: Warns if deletion fails but continues (non-fatal)
|
||||
- Deletes the staging folder of the installed variant (after the move it mostly contains empty folders) and any other `sd:/OmniNX <Variant>/` folders.
|
||||
- Failures are reported as a warning.
|
||||
|
||||
---
|
||||
|
||||
@@ -321,26 +160,11 @@ channel_pack={variant} # Same as current_pack
|
||||
|
||||
---
|
||||
|
||||
### Step 2: Wipe Directories
|
||||
**Location**: `install.c:543-602`
|
||||
### Step 2: Wipe (Selective Deletion)
|
||||
**Location**: `install_clean.c` (`clean_mode_wipe`), lists in `deletion_lists_clean.h`
|
||||
|
||||
#### 35. Delete Entire Directories
|
||||
Recursively deletes (if they exist):
|
||||
- `sd:/atmosphere/` (entire directory tree)
|
||||
- `sd:/bootloader/` (entire directory tree)
|
||||
- `sd:/config/` (entire directory tree)
|
||||
- `sd:/switch/` (entire directory tree)
|
||||
|
||||
#### 36. Delete Root Files
|
||||
- Uses same deletion list as update mode (Step 19)
|
||||
- Deletes `boot.dat`, `boot.ini`, `exosphere.ini`, etc.
|
||||
|
||||
#### 37. Delete Miscellaneous Items
|
||||
- Uses same deletion lists as update mode (Steps 20-21)
|
||||
- Deletes `argon/`, `games/`, `SaltySD/`, etc.
|
||||
|
||||
#### 38. Recreate Switch Directory
|
||||
- Creates empty `sd:/switch/` directory for restoration
|
||||
- Removes CFW folders and files of OmniNX and other packs from the clean list, including the whole `sd:/switch/` tree, `atmosphere/contents` overrides and legacy root files.
|
||||
- Recreates an empty `sd:/switch/` for the restore step.
|
||||
|
||||
---
|
||||
|
||||
@@ -362,17 +186,8 @@ Recursively deletes (if they exist):
|
||||
|
||||
---
|
||||
|
||||
### Step 4: Install Files
|
||||
**Location**: `install.c:620-623`
|
||||
- **Same as Update Mode Step 2** (Steps 23-30)
|
||||
- Copies all directories and files from staging
|
||||
- Creates `manifest.ini`
|
||||
|
||||
---
|
||||
|
||||
### Step 5: Cleanup Staging
|
||||
- **Same as Update Mode Step 3** (Step 31)
|
||||
- Removes staging directory
|
||||
### Step 4: Install Files, Extras, Cleanup
|
||||
- **Same as Update Mode Steps 2-4**
|
||||
|
||||
---
|
||||
|
||||
@@ -400,50 +215,45 @@ Recursively deletes (if they exist):
|
||||
## Technical Details
|
||||
|
||||
### Progress Tracking
|
||||
- **File Counting**: Recursively counts all files and directories before copy
|
||||
- **Progress Updates**: Updates display every 10 items or when percentage changes
|
||||
- One status line per operation, counting processed entries; no separate counting pass.
|
||||
- Group deletion shows `Bereinige: <group> [p%] (done/total)` over the list entries.
|
||||
- **Screen Management**: Automatically clears and reprints header when approaching bottom of screen
|
||||
|
||||
### Error Handling
|
||||
- **Path Existence Checks**: Every operation checks if source exists before attempting
|
||||
- **File System Errors**: Logged with descriptive error messages
|
||||
- **Fallback Methods**: Some operations have fallback copy methods if primary fails
|
||||
- **Non-Fatal Errors**: Staging directory cleanup failures are warned but don't abort installation
|
||||
- Missing sources are skipped (`Ueberspringe: ... (nicht gefunden)`); a missing delete target counts as done.
|
||||
- Failed moves fall back to copying per entry; remaining errors abort with source/target shown.
|
||||
- Staging cleanup failures are warnings and do not abort the installation.
|
||||
|
||||
### File Copy Mechanism
|
||||
- **Buffer Size**: 1MB (`FS_BUFFER_SIZE = 0x100000`)
|
||||
- **Read/Write Verification**: Verifies bytes read/written match expected amounts
|
||||
- **Attribute Preservation**: Copies file attributes (via `f_chmod`)
|
||||
- **Recursive Copy**: Handles nested directory structures automatically
|
||||
### File Operations (`fs.c`)
|
||||
- `fs_delete_tree`, `fs_move_tree`, `fs_move_file`, `folder_copy`, `file_copy` share one path buffer per call (no `malloc` per entry) and visit each entry once.
|
||||
- Copy buffer: 1MB, allocated on first use and freed after the run (`fs_release_buffers`).
|
||||
- Copies verify read/written byte counts and keep file attributes (`f_chmod`).
|
||||
|
||||
### Memory Management
|
||||
- **Dynamic Allocation**: Uses heap for file buffers and path strings
|
||||
- **Cleanup**: Frees allocated memory after use
|
||||
- **Stack Pivot**: Switches to dedicated stack area for payload execution
|
||||
### Logging
|
||||
- `debug.ini` `log=1` writes every deleted path, moved/copied entry and the result to `sd:/config/omninx/install.log` (see [DEBUG_INI.md](DEBUG_INI.md)).
|
||||
- Formatting uses the BDK `s_vprintf`; newlib `printf` is not linked, which keeps the payload below the RCM size limit (the build fails above 126296 bytes).
|
||||
|
||||
### Detection Logic
|
||||
- **Installation Detection**: Based on `manifest.ini` file, not version marker files
|
||||
- **Variant Detection**: Parses `current_pack` from manifest INI format
|
||||
- **Pack Detection**: Simple directory existence check (in priority order)
|
||||
- **Pack Detection**: Directory existence check for `sd:/OmniNX Standard|Light|OC/`; a menu is shown when several are present
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
### Update Mode Flow
|
||||
1. Detect existing installation → Update mode
|
||||
2. Selective cleanup (Steps 10-22)
|
||||
3. Copy new files (Steps 23-30)
|
||||
4. Create manifest (Step 30)
|
||||
5. Cleanup staging (Step 31)
|
||||
1. Existing OmniNX installation detected → Update mode
|
||||
2. Selective cleanup from the update list (respects `preserve.ini`)
|
||||
3. Move pack files into place
|
||||
4. Extras (RAM / Hekate-Pro), remove `extras/`
|
||||
5. Remove staging folders
|
||||
|
||||
### Clean Install Mode Flow
|
||||
1. No installation detected → Clean install mode
|
||||
2. Backup user data (Steps 32-35)
|
||||
3. Full wipe (Steps 36-39)
|
||||
4. Restore user data (Steps 40-43)
|
||||
5. Copy new files (Steps 23-30)
|
||||
6. Create manifest (Step 30)
|
||||
7. Cleanup staging (Step 31)
|
||||
1. No OmniNX installation detected → Clean install mode
|
||||
2. Back up user data (DBI config, prod.keys, CyberFoil, Checkpoint)
|
||||
3. Selective wipe from the clean list
|
||||
4. Restore user data
|
||||
5. Move pack files, extras, remove staging folders
|
||||
|
||||
**Result**: In both modes, the SD card ends up with a fresh OmniNX installation while preserving user data and savegames.
|
||||
**Result**: In both modes the SD card ends up with a fresh OmniNX installation while user data and user-installed homebrew are kept.
|
||||
Reference in new issue
Block a user