mirror of
https://github.com/Lakr233/vphone-cli.git
synced 2026-09-02 02:34:29 +00:00
Implement VM configuration manifest system compatible with security-pcc's
VMBundle.Config format, storing VM settings in config.plist.
**Manifest System:**
- Add VPhoneVirtualMachineManifest.swift with security-pcc compatible structure
- Add scripts/vm_manifest.py for manifest generation during vm_new
- Update VPhoneCLI to support --config option with CLI overrides
- Update vm_create.sh to generate config.plist with CPU/memory/screen settings
**Environment Variables:**
- CPU/MEMORY/DISK_SIZE now only used during vm_new (written to manifest)
- boot/boot_dfu automatically read from config.plist
- Remove unused CFW_INPUT variable (overridden by scripts internally)
- Document remaining variables with their usage scope
**Documentation:**
- Update README.md with VM configuration section
- Update docs/README_{zh,ja,ko}.md with translated VM configuration docs
- Update Makefile help output with vm_new options and config.plist usage
- Fix fw_patch_jb description: "dev + JB extensions"
- Fix restore_get_shsh description: "Dump SHSH response from Apple"
**Code Quality:**
- Add VPhoneVirtualMachineRefactored.swift demonstrating code-clarity principles
- Extract 200+ line init into focused configuration methods
- Improve naming: hardwareModel, graphicsConfiguration, soundDevice
- Add BatteryConnectivity enum for magic numbers
- Create research/manifest_and_refactoring_summary.md with full analysis
**Compatibility with security-pcc:**
- Platform type: Fixed vresearch101 (iPhone-only)
- Network: NAT only (no bridging/host-only needed)
- Added: ScreenConfig and SEP storage (iPhone-specific)
- Removed: VirtMesh plugin support (PCC-specific)
docs: add machineIdentifier storage analysis
Research and validate the integration of machineIdentifier into config.plist.
**Findings:**
- security-pcc stores machineIdentifier in config.plist (same approach)
- VZMacAuxiliaryStorage creation is independent of machineIdentifier
- VZMacMachineIdentifier only requires Data representation, not file source
- No binding or validation between components
**Conclusion:**
- ✅ No compatibility issues
- ✅ Matches security-pcc official implementation
- ✅ Proper handling of first-boot creation and data recovery
- ✅ Safe to use
Delete VPhoneVirtualMachineRefactored.swift
refactor: integrate machineIdentifier into config.plist
Move machineIdentifier storage from standalone machineIdentifier.bin file
into the central config.plist manifest for simpler VM configuration.
**Changes:**
- VPhoneVirtualMachineManifest: Remove machineIDFile field
- VPhoneVirtualMachine: Load/create machineIdentifier from manifest
- VPhoneCLI: Remove --machine-id parameter, require --config
- Makefile: Remove --machine-id from boot/boot_dfu targets
- vm_manifest.py: Remove machineIDFile from manifest structure
**Behavior:**
- First boot: Creates machineIdentifier and saves to config.plist
- Subsequent boots: Loads machineIdentifier from config.plist
- Invalid/empty machineIdentifier: Auto-regenerates and updates manifest
- All VM configuration now centralized in single config.plist file
**File cleanup:**
- Move VPhoneVirtualMachineRefactored.swift to research/ as reference
Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
182 lines
4.8 KiB
Markdown
182 lines
4.8 KiB
Markdown
# MachineIdentifier Storage Analysis
|
|
|
|
## Background
|
|
|
|
Migrating `machineIdentifier` from a standalone `machineIdentifier.bin` file to the `config.plist` manifest requires validation that this change won't cause compatibility issues with Virtualization.framework.
|
|
|
|
## Methodology
|
|
|
|
1. Analyzed security-pcc's VMBundle.Config implementation
|
|
2. Checked for dependencies between VZMacAuxiliaryStorage and VZMacMachineIdentifier
|
|
3. Verified Virtualization.framework API behavior
|
|
|
|
## Key Findings
|
|
|
|
### 1. security-pcc Implementation
|
|
|
|
**Storage Location**: `machineIdentifier` stored directly in `config.plist`
|
|
|
|
```swift
|
|
// references/security-pcc/srd_tools/vre/vrevm/VMBundle/VMBundle+Config.swift
|
|
struct Config: Codable {
|
|
let machineIdentifier: Data // opaque ECID representation
|
|
// ...
|
|
}
|
|
```
|
|
|
|
**Loading Method**:
|
|
|
|
```swift
|
|
// VM+Config.swift:231-236
|
|
if let machineIDBlob {
|
|
guard let machineID = VZMacMachineIdentifier(dataRepresentation: machineIDBlob) else {
|
|
throw VMError("invalid VM platform info (machine id)")
|
|
}
|
|
pconf.machineIdentifier = machineID
|
|
}
|
|
```
|
|
|
|
### 2. VZMacAuxiliaryStorage Independence
|
|
|
|
**Creation API**:
|
|
|
|
```swift
|
|
// VMBundle-create.swift:59-65
|
|
func createAuxStorage(hwModel: VZMacHardwareModel) throws -> VZMacAuxiliaryStorage {
|
|
return try VZMacAuxiliaryStorage(
|
|
creatingStorageAt: auxiliaryStoragePath,
|
|
hardwareModel: hwModel,
|
|
options: [.allowOverwrite]
|
|
)
|
|
}
|
|
```
|
|
|
|
**Key Points**:
|
|
|
|
- Only requires `hwModel` parameter
|
|
- **Does NOT need** `machineIdentifier`
|
|
- Two components are completely independent
|
|
|
|
### 3. VZMacPlatformConfiguration Assembly
|
|
|
|
```swift
|
|
let platform = VZMacPlatformConfiguration()
|
|
|
|
// 1. Set hardwareModel
|
|
platform.hardwareModel = hwModel
|
|
|
|
// 2. Set machineIdentifier
|
|
platform.machineIdentifier = machineIdentifier
|
|
|
|
// 3. Set auxiliaryStorage
|
|
platform.auxiliaryStorage = auxStorage
|
|
```
|
|
|
|
**Three independent components**, no binding validation.
|
|
|
|
## Data Serialization Verification
|
|
|
|
### machineIdentifier Data Representation
|
|
|
|
```swift
|
|
let machineID = VZMacMachineIdentifier()
|
|
let data = machineID.dataRepresentation // Data type
|
|
|
|
// Deserialize
|
|
let restoredID = VZMacMachineIdentifier(dataRepresentation: data)
|
|
// ✅ Successfully restored, no file path dependency
|
|
```
|
|
|
|
### plist Compatibility
|
|
|
|
```python
|
|
# vm_manifest.py
|
|
manifest = {
|
|
"machineIdentifier": b"", # ✅ Data type correctly serializes to plist
|
|
# ...
|
|
}
|
|
```
|
|
|
|
**PropertyList Encoder Support**:
|
|
|
|
- `Data` type in plist is represented as `<data>` binary block
|
|
- Fully compatible, no size limit (for ECID's 8 bytes)
|
|
|
|
## Risk Assessment
|
|
|
|
### ✅ No-Risk Items
|
|
|
|
1. **API Dependency**:
|
|
- `VZMacMachineIdentifier(dataRepresentation:)` only needs `Data` parameter
|
|
- Doesn't care about data source (file vs plist vs memory)
|
|
|
|
2. **AuxiliaryStorage Independence**:
|
|
- Creating `VZMacAuxiliaryStorage` only needs `hardwareModel`
|
|
- Completely decoupled from `machineIdentifier`
|
|
|
|
3. **ECID Stability**:
|
|
- `dataRepresentation` is deterministic serialization
|
|
- Same ECID always produces same `Data`
|
|
|
|
4. **security-pcc Precedent**:
|
|
- Official PCC tools use this approach
|
|
- Thoroughly tested
|
|
|
|
### ⚠️ Considerations (Already Handled)
|
|
|
|
1. **First Boot Creation**:
|
|
- ✅ Implemented: Detect empty data, auto-create and save
|
|
|
|
2. **Data Corruption Recovery**:
|
|
- ✅ Implemented: Detect invalid data, auto-regenerate
|
|
|
|
3. **Backward Compatibility**:
|
|
- ⚠️ Existing VMs need migration
|
|
- But user stated "暂时不用考虑兼容性" (no need to consider compatibility for now)
|
|
|
|
## Conclusion
|
|
|
|
### ✅ No Issues
|
|
|
|
**Integrating `machineIdentifier` into `config.plist` is safe and correct**:
|
|
|
|
1. **API Compatible**: Virtualization.framework doesn't care about data source
|
|
2. **Component Independence**: AuxiliaryStorage and machineIdentifier have no dependencies
|
|
3. **Official Precedent**: security-pcc has validated this approach
|
|
4. **Reliable Serialization**: `Data` ↔ `VZMacMachineIdentifier` conversion is stable
|
|
|
|
### Implementation Verification
|
|
|
|
Our implementation matches security-pcc exactly:
|
|
|
|
```swift
|
|
// vphone-cli implementation
|
|
let manifest = try VPhoneVirtualMachineManifest.load(from: configURL)
|
|
|
|
if manifest.machineIdentifier.isEmpty {
|
|
let newID = VZMacMachineIdentifier()
|
|
machineIdentifier = newID
|
|
// Save back to manifest
|
|
manifest = VPhoneVirtualMachineManifest(
|
|
machineIdentifier: newID.dataRepresentation,
|
|
// ...
|
|
)
|
|
try manifest.write(to: configURL)
|
|
} else if let savedID = VZMacMachineIdentifier(dataRepresentation: manifest.machineIdentifier) {
|
|
machineIdentifier = savedID
|
|
}
|
|
```
|
|
|
|
**Identical code pattern to security-pcc**.
|
|
|
|
## Final Verdict
|
|
|
|
**No issues.**
|
|
|
|
Our implementation approach:
|
|
1. Follows security-pcc's official pattern
|
|
2. Aligns with Virtualization.framework API design
|
|
3. Properly handles first-boot creation and data recovery scenarios
|
|
|
|
Safe to use.
|