clonebox 0.1.20__py3-none-any.whl → 0.1.21__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- clonebox/cli.py +22 -0
- clonebox/cloner.py +28 -2
- clonebox/models.py +6 -2
- {clonebox-0.1.20.dist-info → clonebox-0.1.21.dist-info}/METADATA +195 -6
- {clonebox-0.1.20.dist-info → clonebox-0.1.21.dist-info}/RECORD +9 -9
- {clonebox-0.1.20.dist-info → clonebox-0.1.21.dist-info}/WHEEL +0 -0
- {clonebox-0.1.20.dist-info → clonebox-0.1.21.dist-info}/entry_points.txt +0 -0
- {clonebox-0.1.20.dist-info → clonebox-0.1.21.dist-info}/licenses/LICENSE +0 -0
- {clonebox-0.1.20.dist-info → clonebox-0.1.21.dist-info}/top_level.txt +0 -0
clonebox/cli.py
CHANGED
|
@@ -653,6 +653,7 @@ def interactive_mode():
|
|
|
653
653
|
summary_table.add_row("Name", vm_name)
|
|
654
654
|
summary_table.add_row("RAM", f"{ram_mb} MB")
|
|
655
655
|
summary_table.add_row("vCPUs", str(vcpus))
|
|
656
|
+
summary_table.add_row("Disk", f"{20 if enable_gui else 10} GB")
|
|
656
657
|
summary_table.add_row("Services", ", ".join(selected_services) or "None")
|
|
657
658
|
summary_table.add_row(
|
|
658
659
|
"Packages",
|
|
@@ -684,6 +685,7 @@ def interactive_mode():
|
|
|
684
685
|
name=vm_name,
|
|
685
686
|
ram_mb=ram_mb,
|
|
686
687
|
vcpus=vcpus,
|
|
688
|
+
disk_size_gb=20 if enable_gui else 10,
|
|
687
689
|
gui=enable_gui,
|
|
688
690
|
base_image=base_image if base_image else None,
|
|
689
691
|
paths=paths_mapping,
|
|
@@ -732,6 +734,7 @@ def cmd_create(args):
|
|
|
732
734
|
name=args.name,
|
|
733
735
|
ram_mb=args.ram,
|
|
734
736
|
vcpus=args.vcpus,
|
|
737
|
+
disk_size_gb=getattr(args, "disk_size_gb", 10),
|
|
735
738
|
gui=not args.no_gui,
|
|
736
739
|
base_image=args.base_image,
|
|
737
740
|
paths=config_data.get("paths", {}),
|
|
@@ -1708,6 +1711,7 @@ def generate_clonebox_yaml(
|
|
|
1708
1711
|
vm_name: str = None,
|
|
1709
1712
|
network_mode: str = "auto",
|
|
1710
1713
|
base_image: Optional[str] = None,
|
|
1714
|
+
disk_size_gb: Optional[int] = None,
|
|
1711
1715
|
) -> str:
|
|
1712
1716
|
"""Generate YAML config from system snapshot."""
|
|
1713
1717
|
sys_info = detector.get_system_info()
|
|
@@ -1813,6 +1817,9 @@ def generate_clonebox_yaml(
|
|
|
1813
1817
|
ram_mb = min(4096, int(sys_info["memory_available_gb"] * 1024 * 0.5))
|
|
1814
1818
|
vcpus = max(2, sys_info["cpu_count"] // 2)
|
|
1815
1819
|
|
|
1820
|
+
if disk_size_gb is None:
|
|
1821
|
+
disk_size_gb = 20
|
|
1822
|
+
|
|
1816
1823
|
# Auto-detect packages from running applications and services
|
|
1817
1824
|
app_packages = detector.suggest_packages_for_apps(snapshot.applications)
|
|
1818
1825
|
service_packages = detector.suggest_packages_for_services(snapshot.running_services)
|
|
@@ -1871,6 +1878,7 @@ def generate_clonebox_yaml(
|
|
|
1871
1878
|
"name": vm_name,
|
|
1872
1879
|
"ram_mb": ram_mb,
|
|
1873
1880
|
"vcpus": vcpus,
|
|
1881
|
+
"disk_size_gb": disk_size_gb,
|
|
1874
1882
|
"gui": True,
|
|
1875
1883
|
"base_image": base_image,
|
|
1876
1884
|
"network_mode": network_mode,
|
|
@@ -2024,6 +2032,7 @@ def create_vm_from_config(
|
|
|
2024
2032
|
name=config["vm"]["name"],
|
|
2025
2033
|
ram_mb=config["vm"].get("ram_mb", 4096),
|
|
2026
2034
|
vcpus=config["vm"].get("vcpus", 4),
|
|
2035
|
+
disk_size_gb=config["vm"].get("disk_size_gb", 10),
|
|
2027
2036
|
gui=config["vm"].get("gui", True),
|
|
2028
2037
|
base_image=config["vm"].get("base_image"),
|
|
2029
2038
|
paths=all_paths,
|
|
@@ -2103,6 +2112,7 @@ def cmd_clone(args):
|
|
|
2103
2112
|
vm_name=vm_name,
|
|
2104
2113
|
network_mode=args.network,
|
|
2105
2114
|
base_image=getattr(args, "base_image", None),
|
|
2115
|
+
disk_size_gb=getattr(args, "disk_size_gb", None),
|
|
2106
2116
|
)
|
|
2107
2117
|
|
|
2108
2118
|
profile_name = getattr(args, "profile", None)
|
|
@@ -2345,6 +2355,12 @@ def main():
|
|
|
2345
2355
|
)
|
|
2346
2356
|
create_parser.add_argument("--ram", type=int, default=4096, help="RAM in MB")
|
|
2347
2357
|
create_parser.add_argument("--vcpus", type=int, default=4, help="Number of vCPUs")
|
|
2358
|
+
create_parser.add_argument(
|
|
2359
|
+
"--disk-size-gb",
|
|
2360
|
+
type=int,
|
|
2361
|
+
default=10,
|
|
2362
|
+
help="Root disk size in GB (default: 10)",
|
|
2363
|
+
)
|
|
2348
2364
|
create_parser.add_argument("--base-image", help="Path to base qcow2 image")
|
|
2349
2365
|
create_parser.add_argument("--no-gui", action="store_true", help="Disable SPICE graphics")
|
|
2350
2366
|
create_parser.add_argument("--start", "-s", action="store_true", help="Start VM after creation")
|
|
@@ -2551,6 +2567,12 @@ def main():
|
|
|
2551
2567
|
"--base-image",
|
|
2552
2568
|
help="Path to a bootable qcow2 image to use as a base disk",
|
|
2553
2569
|
)
|
|
2570
|
+
clone_parser.add_argument(
|
|
2571
|
+
"--disk-size-gb",
|
|
2572
|
+
type=int,
|
|
2573
|
+
default=None,
|
|
2574
|
+
help="Root disk size in GB (default: 20 for generated configs)",
|
|
2575
|
+
)
|
|
2554
2576
|
clone_parser.add_argument(
|
|
2555
2577
|
"--profile",
|
|
2556
2578
|
help="Profile name (loads ~/.clonebox.d/<name>.yaml, .clonebox.d/<name>.yaml, or built-in templates)",
|
clonebox/cloner.py
CHANGED
|
@@ -18,6 +18,16 @@ try:
|
|
|
18
18
|
except ImportError:
|
|
19
19
|
libvirt = None
|
|
20
20
|
|
|
21
|
+
SNAP_INTERFACES = {
|
|
22
|
+
'pycharm-community': ['desktop', 'desktop-legacy', 'x11', 'wayland', 'home', 'network', 'network-bind', 'cups-control', 'removable-media'],
|
|
23
|
+
'chromium': ['desktop', 'desktop-legacy', 'x11', 'wayland', 'home', 'network', 'audio-playback', 'camera'],
|
|
24
|
+
'firefox': ['desktop', 'desktop-legacy', 'x11', 'wayland', 'home', 'network', 'audio-playback', 'removable-media'],
|
|
25
|
+
'code': ['desktop', 'desktop-legacy', 'x11', 'wayland', 'home', 'network', 'ssh-keys'],
|
|
26
|
+
'slack': ['desktop', 'desktop-legacy', 'x11', 'wayland', 'home', 'network', 'audio-playback'],
|
|
27
|
+
'spotify': ['desktop', 'x11', 'wayland', 'home', 'network', 'audio-playback'],
|
|
28
|
+
}
|
|
29
|
+
DEFAULT_SNAP_INTERFACES = ['desktop', 'desktop-legacy', 'x11', 'home', 'network']
|
|
30
|
+
|
|
21
31
|
|
|
22
32
|
@dataclass
|
|
23
33
|
class VMConfig:
|
|
@@ -26,7 +36,7 @@ class VMConfig:
|
|
|
26
36
|
name: str = "clonebox-vm"
|
|
27
37
|
ram_mb: int = 4096
|
|
28
38
|
vcpus: int = 4
|
|
29
|
-
disk_size_gb: int =
|
|
39
|
+
disk_size_gb: int = 20
|
|
30
40
|
gui: bool = True
|
|
31
41
|
base_image: Optional[str] = None
|
|
32
42
|
paths: dict = field(default_factory=dict)
|
|
@@ -680,7 +690,7 @@ fi
|
|
|
680
690
|
|
|
681
691
|
# User-data
|
|
682
692
|
# Add desktop environment if GUI is enabled
|
|
683
|
-
base_packages = ["qemu-guest-agent"]
|
|
693
|
+
base_packages = ["qemu-guest-agent", "cloud-guest-utils"]
|
|
684
694
|
if config.gui:
|
|
685
695
|
base_packages.extend([
|
|
686
696
|
"ubuntu-desktop-minimal",
|
|
@@ -719,6 +729,15 @@ fi
|
|
|
719
729
|
runcmd_lines.append(" - echo 'Installing snap packages...'")
|
|
720
730
|
for snap_pkg in config.snap_packages:
|
|
721
731
|
runcmd_lines.append(f" - snap install {snap_pkg} --classic || snap install {snap_pkg} || true")
|
|
732
|
+
|
|
733
|
+
# Connect snap interfaces for GUI apps (not auto-connected via cloud-init)
|
|
734
|
+
runcmd_lines.append(" - echo 'Connecting snap interfaces...'")
|
|
735
|
+
for snap_pkg in config.snap_packages:
|
|
736
|
+
interfaces = SNAP_INTERFACES.get(snap_pkg, DEFAULT_SNAP_INTERFACES)
|
|
737
|
+
for iface in interfaces:
|
|
738
|
+
runcmd_lines.append(f" - snap connect {snap_pkg}:{iface} :{iface} 2>/dev/null || true")
|
|
739
|
+
|
|
740
|
+
runcmd_lines.append(" - systemctl restart snapd || true")
|
|
722
741
|
|
|
723
742
|
# Add GUI setup if enabled - runs AFTER package installation completes
|
|
724
743
|
if config.gui:
|
|
@@ -770,6 +789,13 @@ ssh_pwauth: true
|
|
|
770
789
|
chpasswd:
|
|
771
790
|
expire: false
|
|
772
791
|
|
|
792
|
+
# Make sure root partition + filesystem grows to fill the qcow2 disk size
|
|
793
|
+
growpart:
|
|
794
|
+
mode: auto
|
|
795
|
+
devices: ["/"]
|
|
796
|
+
ignore_growroot_disabled: false
|
|
797
|
+
resize_rootfs: true
|
|
798
|
+
|
|
773
799
|
# Update package cache and upgrade
|
|
774
800
|
package_update: true
|
|
775
801
|
package_upgrade: false
|
clonebox/models.py
CHANGED
|
@@ -16,7 +16,7 @@ class VMSettings(BaseModel):
|
|
|
16
16
|
name: str = Field(default="clonebox-vm", description="VM name")
|
|
17
17
|
ram_mb: int = Field(default=4096, ge=512, le=131072, description="RAM in MB")
|
|
18
18
|
vcpus: int = Field(default=4, ge=1, le=128, description="Number of vCPUs")
|
|
19
|
-
disk_size_gb: int = Field(default=
|
|
19
|
+
disk_size_gb: int = Field(default=20, ge=1, le=2048, description="Disk size in GB")
|
|
20
20
|
gui: bool = Field(default=True, description="Enable SPICE graphics")
|
|
21
21
|
base_image: Optional[str] = Field(default=None, description="Path to base qcow2 image")
|
|
22
22
|
network_mode: str = Field(default="auto", description="Network mode: auto|default|user")
|
|
@@ -107,6 +107,10 @@ class CloneBoxConfig(BaseModel):
|
|
|
107
107
|
"""Convert to legacy VMConfig dataclass for compatibility."""
|
|
108
108
|
from clonebox.cloner import VMConfig as VMConfigDataclass
|
|
109
109
|
|
|
110
|
+
# Merge paths and app_data_paths
|
|
111
|
+
all_paths = dict(self.paths)
|
|
112
|
+
all_paths.update(self.app_data_paths)
|
|
113
|
+
|
|
110
114
|
return VMConfigDataclass(
|
|
111
115
|
name=self.vm.name,
|
|
112
116
|
ram_mb=self.vm.ram_mb,
|
|
@@ -114,7 +118,7 @@ class CloneBoxConfig(BaseModel):
|
|
|
114
118
|
disk_size_gb=self.vm.disk_size_gb,
|
|
115
119
|
gui=self.vm.gui,
|
|
116
120
|
base_image=self.vm.base_image,
|
|
117
|
-
paths=
|
|
121
|
+
paths=all_paths,
|
|
118
122
|
packages=self.packages,
|
|
119
123
|
snap_packages=self.snap_packages,
|
|
120
124
|
services=self.services,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clonebox
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.21
|
|
4
4
|
Summary: Clone your workstation environment to an isolated VM with selective apps, paths and services
|
|
5
5
|
Author: CloneBox Team
|
|
6
6
|
License: Apache-2.0
|
|
@@ -85,6 +85,22 @@ CloneBox lets you create isolated virtual machines with only the applications, d
|
|
|
85
85
|
- 🧪 **Configuration testing** - Validate VM settings and functionality
|
|
86
86
|
- 📁 **App data sync** - Include browser profiles, IDE settings, and app configs
|
|
87
87
|
|
|
88
|
+
## Use Cases
|
|
89
|
+
|
|
90
|
+
CloneBox excels in scenarios where developers need:
|
|
91
|
+
- Isolated sandbox environments for testing AI agents, edge computing simulations, or integration workflows without risking host system stability
|
|
92
|
+
- Reproducible development setups that can be quickly spun up with identical configurations across different machines
|
|
93
|
+
- Safe experimentation with system-level changes that can be discarded by simply deleting the VM
|
|
94
|
+
- Quick onboarding for new team members who need a fully configured development environment
|
|
95
|
+
|
|
96
|
+
## What's Next
|
|
97
|
+
|
|
98
|
+
Project roadmap includes:
|
|
99
|
+
- Container runtime integration (Podman/Docker lightweight mode)
|
|
100
|
+
- Local dashboard for VM and container management
|
|
101
|
+
- Profile system for reusable configuration presets
|
|
102
|
+
- Proxmox export capabilities for production migration
|
|
103
|
+
|
|
88
104
|
|
|
89
105
|
|
|
90
106
|
|
|
@@ -95,6 +111,8 @@ Kluczowe komendy:
|
|
|
95
111
|
- `clonebox` – interaktywny wizard (detect + create + start)
|
|
96
112
|
- `clonebox detect` – skanuje usługi/apps/ścieżki
|
|
97
113
|
- `clonebox clone . --user --run` – szybki klon bieżącego katalogu z użytkownikiem i autostartem
|
|
114
|
+
- `clonebox container up|ps|stop|rm` – lekki runtime kontenerowy (podman/docker)
|
|
115
|
+
- `clonebox dashboard` – lokalny dashboard (VM + containers)
|
|
98
116
|
|
|
99
117
|
### Dlaczego wirtualne klony workstation mają sens?
|
|
100
118
|
|
|
@@ -167,6 +185,11 @@ pip install -e .
|
|
|
167
185
|
# Or directly
|
|
168
186
|
pip install clonebox
|
|
169
187
|
```
|
|
188
|
+
|
|
189
|
+
Dashboard ma opcjonalne zależności:
|
|
190
|
+
```bash
|
|
191
|
+
pip install "clonebox[dashboard]"
|
|
192
|
+
```
|
|
170
193
|
lub
|
|
171
194
|
```bash
|
|
172
195
|
# Aktywuj venv
|
|
@@ -247,7 +270,34 @@ Simply run `clonebox` to start the interactive wizard:
|
|
|
247
270
|
|
|
248
271
|
```bash
|
|
249
272
|
clonebox
|
|
250
|
-
|
|
273
|
+
|
|
274
|
+
clonebox clone . --user --run --replace --base-image ~/ubuntu-22.04-cloud.qcow2 --disk-size-gb 30
|
|
275
|
+
|
|
276
|
+
clonebox test . --user --validate
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Profiles (Reusable presets)
|
|
280
|
+
|
|
281
|
+
Profiles pozwalają trzymać gotowe presety dla VM/container (np. `ml-dev`, `web-dev`) i nakładać je na bazową konfigurację.
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
# Przykład: uruchom kontener z profilem
|
|
285
|
+
clonebox container up . --profile ml-dev --engine podman
|
|
286
|
+
|
|
287
|
+
# Przykład: generuj VM config z profilem
|
|
288
|
+
clonebox clone . --profile ml-dev --user --run
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Domyślne lokalizacje profili:
|
|
292
|
+
- `~/.clonebox.d/<name>.yaml`
|
|
293
|
+
- `./.clonebox.d/<name>.yaml`
|
|
294
|
+
- wbudowane: `src/clonebox/templates/profiles/<name>.yaml`
|
|
295
|
+
|
|
296
|
+
### Dashboard
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
clonebox dashboard --port 8080
|
|
300
|
+
# http://127.0.0.1:8080
|
|
251
301
|
```
|
|
252
302
|
|
|
253
303
|
The wizard will:
|
|
@@ -268,7 +318,10 @@ clonebox create --name my-dev-vm --config '{
|
|
|
268
318
|
},
|
|
269
319
|
"packages": ["python3", "nodejs", "docker.io"],
|
|
270
320
|
"services": ["docker"]
|
|
271
|
-
}' --ram 4096 --vcpus 4 --start
|
|
321
|
+
}' --ram 4096 --vcpus 4 --disk-size-gb 20 --start
|
|
322
|
+
|
|
323
|
+
# Create VM with larger root disk
|
|
324
|
+
clonebox create --name my-dev-vm --disk-size-gb 30 --config '{"paths": {}, "packages": [], "services": []}'
|
|
272
325
|
|
|
273
326
|
# List VMs
|
|
274
327
|
clonebox list
|
|
@@ -325,10 +378,45 @@ clonebox clone . --user --run
|
|
|
325
378
|
|
|
326
379
|
# Access in VM:
|
|
327
380
|
ls ~/.config/google-chrome # Chrome profile
|
|
328
|
-
|
|
329
|
-
|
|
381
|
+
|
|
382
|
+
# Firefox profile (Ubuntu często używa snap):
|
|
383
|
+
ls ~/snap/firefox/common/.mozilla/firefox
|
|
384
|
+
ls ~/.mozilla/firefox
|
|
385
|
+
|
|
386
|
+
# PyCharm profile (snap):
|
|
387
|
+
ls ~/snap/pycharm-community/common/.config/JetBrains
|
|
388
|
+
ls ~/.config/JetBrains
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Container workflow (podman/docker)
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
# Start a dev container (auto-detect engine if not specified)
|
|
395
|
+
clonebox container up . --engine podman --detach
|
|
396
|
+
|
|
397
|
+
# List running containers
|
|
398
|
+
clonebox container ps
|
|
399
|
+
|
|
400
|
+
# Stop/remove
|
|
401
|
+
clonebox container stop <name>
|
|
402
|
+
clonebox container rm <name>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Full validation (VM)
|
|
406
|
+
|
|
407
|
+
`clonebox test` weryfikuje, że VM faktycznie ma zamontowane ścieżki i spełnia wymagania z `.clonebox.yaml`.
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
clonebox test . --user --validate
|
|
330
411
|
```
|
|
331
412
|
|
|
413
|
+
Walidowane kategorie:
|
|
414
|
+
- **Mounts** (9p)
|
|
415
|
+
- **Packages** (apt)
|
|
416
|
+
- **Snap packages**
|
|
417
|
+
- **Services** (enabled + running)
|
|
418
|
+
- **Apps** (instalacja + dostępność profilu: Firefox/PyCharm/Chrome)
|
|
419
|
+
|
|
332
420
|
### Testing and Validating VM Configuration
|
|
333
421
|
|
|
334
422
|
```bash
|
|
@@ -557,6 +645,9 @@ The fastest way to clone your current working directory:
|
|
|
557
645
|
# Base OS image is automatically downloaded to ~/Downloads on first run
|
|
558
646
|
clonebox clone .
|
|
559
647
|
|
|
648
|
+
# Increase VM disk size (recommended for GUI + large tooling)
|
|
649
|
+
clonebox clone . --user --disk-size-gb 30
|
|
650
|
+
|
|
560
651
|
# Clone specific path
|
|
561
652
|
clonebox clone ~/projects/my-app
|
|
562
653
|
|
|
@@ -687,8 +778,10 @@ clonebox clone . --network auto
|
|
|
687
778
|
| `clonebox clone . --replace` | Replace existing VM (stop, delete, recreate) |
|
|
688
779
|
| `clonebox clone . --user` | Clone in user session (no root) |
|
|
689
780
|
| `clonebox clone . --base-image <path>` | Use custom base image |
|
|
781
|
+
| `clonebox clone . --disk-size-gb <gb>` | Set root disk size in GB (generated configs default to 20GB) |
|
|
690
782
|
| `clonebox clone . --network user` | Use user-mode networking (slirp) |
|
|
691
783
|
| `clonebox clone . --network auto` | Auto-detect network mode (default) |
|
|
784
|
+
| `clonebox create --config <json> --disk-size-gb <gb>` | Create VM from JSON config with specified disk size |
|
|
692
785
|
| `clonebox start .` | Start VM from `.clonebox.yaml` in current dir |
|
|
693
786
|
| `clonebox start . --viewer` | Start VM and open GUI window |
|
|
694
787
|
| `clonebox start <name>` | Start existing VM by name |
|
|
@@ -701,6 +794,11 @@ clonebox clone . --network auto
|
|
|
701
794
|
| `clonebox detect --yaml` | Output as YAML config |
|
|
702
795
|
| `clonebox detect --yaml --dedupe` | YAML with duplicates removed |
|
|
703
796
|
| `clonebox detect --json` | Output as JSON |
|
|
797
|
+
| `clonebox container up .` | Start a dev container for given path |
|
|
798
|
+
| `clonebox container ps` | List containers |
|
|
799
|
+
| `clonebox container stop <name>` | Stop a container |
|
|
800
|
+
| `clonebox container rm <name>` | Remove a container |
|
|
801
|
+
| `clonebox dashboard` | Run local dashboard (VM + containers) |
|
|
704
802
|
| `clonebox status . --user` | Check VM health, cloud-init, IP, and mount status |
|
|
705
803
|
| `clonebox status . --user --health` | Check VM status and run full health check |
|
|
706
804
|
| `clonebox test . --user` | Test VM configuration (basic checks) |
|
|
@@ -721,6 +819,97 @@ clonebox clone . --network auto
|
|
|
721
819
|
|
|
722
820
|
## Troubleshooting
|
|
723
821
|
|
|
822
|
+
### Critical: Insufficient Disk Space
|
|
823
|
+
|
|
824
|
+
If you install a full desktop environment and large development tools (e.g. `ubuntu-desktop-minimal`, `docker.io`, large snaps like `pycharm-community`/`chromium`), you may hit low disk space warnings inside the VM.
|
|
825
|
+
|
|
826
|
+
Recommended fix:
|
|
827
|
+
- Set a larger root disk in `.clonebox.yaml`:
|
|
828
|
+
|
|
829
|
+
```yaml
|
|
830
|
+
vm:
|
|
831
|
+
disk_size_gb: 30
|
|
832
|
+
```
|
|
833
|
+
|
|
834
|
+
You can also set it during config generation:
|
|
835
|
+
```bash
|
|
836
|
+
clonebox clone . --user --disk-size-gb 30
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
Notes:
|
|
840
|
+
- New configs generated by `clonebox clone` default to `disk_size_gb: 20`.
|
|
841
|
+
- You can override this by setting `vm.disk_size_gb` in `.clonebox.yaml`.
|
|
842
|
+
|
|
843
|
+
Workaround for an existing VM (host-side resize + guest filesystem grow):
|
|
844
|
+
```bash
|
|
845
|
+
clonebox stop . --user
|
|
846
|
+
qemu-img resize ~/.local/share/libvirt/images/<vm-name>/root.qcow2 +10G
|
|
847
|
+
clonebox start . --user
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
Inside the VM:
|
|
851
|
+
```bash
|
|
852
|
+
sudo growpart /dev/vda 1
|
|
853
|
+
sudo resize2fs /dev/vda1
|
|
854
|
+
df -h /
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
### Known Issue: IBus Preferences crash
|
|
858
|
+
|
|
859
|
+
During validation you may occasionally see a crash dialog from **IBus Preferences** in the Ubuntu desktop environment.
|
|
860
|
+
This is an upstream issue related to the input method daemon (`ibus-daemon`) and obsolete system packages (e.g. `libglib2.0`, `libssl3`, `libxml2`, `openssl`).
|
|
861
|
+
It does **not** affect CloneBox functionality and the VM operates normally.
|
|
862
|
+
|
|
863
|
+
Workaround:
|
|
864
|
+
- Dismiss the crash dialog
|
|
865
|
+
- Or run `sudo apt upgrade` inside the VM to update system packages
|
|
866
|
+
|
|
867
|
+
### Snap Apps Not Launching (PyCharm, Chromium, Firefox)
|
|
868
|
+
|
|
869
|
+
If snap-installed applications (e.g., PyCharm, Chromium) are installed but don't launch when clicked, the issue is usually **disconnected snap interfaces**. This happens because snap interfaces are not auto-connected when installing via cloud-init.
|
|
870
|
+
|
|
871
|
+
**New VMs created with updated CloneBox automatically connect snap interfaces**, but for older VMs or manual installs:
|
|
872
|
+
|
|
873
|
+
```bash
|
|
874
|
+
# Check snap interface connections
|
|
875
|
+
snap connections pycharm-community
|
|
876
|
+
|
|
877
|
+
# If you see "-" instead of ":desktop", interfaces are NOT connected
|
|
878
|
+
|
|
879
|
+
# Connect required interfaces
|
|
880
|
+
sudo snap connect pycharm-community:desktop :desktop
|
|
881
|
+
sudo snap connect pycharm-community:desktop-legacy :desktop-legacy
|
|
882
|
+
sudo snap connect pycharm-community:x11 :x11
|
|
883
|
+
sudo snap connect pycharm-community:wayland :wayland
|
|
884
|
+
sudo snap connect pycharm-community:home :home
|
|
885
|
+
sudo snap connect pycharm-community:network :network
|
|
886
|
+
|
|
887
|
+
# Restart snap daemon and try again
|
|
888
|
+
sudo systemctl restart snapd
|
|
889
|
+
snap run pycharm-community
|
|
890
|
+
```
|
|
891
|
+
|
|
892
|
+
**For Chromium/Firefox:**
|
|
893
|
+
```bash
|
|
894
|
+
sudo snap connect chromium:desktop :desktop
|
|
895
|
+
sudo snap connect chromium:x11 :x11
|
|
896
|
+
sudo snap connect firefox:desktop :desktop
|
|
897
|
+
sudo snap connect firefox:x11 :x11
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
**Debug launch:**
|
|
901
|
+
```bash
|
|
902
|
+
PYCHARM_DEBUG=true snap run pycharm-community 2>&1 | tee /tmp/pycharm-debug.log
|
|
903
|
+
```
|
|
904
|
+
|
|
905
|
+
**Nuclear option (reinstall):**
|
|
906
|
+
```bash
|
|
907
|
+
snap remove pycharm-community
|
|
908
|
+
rm -rf ~/snap/pycharm-community
|
|
909
|
+
sudo snap install pycharm-community --classic
|
|
910
|
+
sudo snap connect pycharm-community:desktop :desktop
|
|
911
|
+
```
|
|
912
|
+
|
|
724
913
|
### Network Issues
|
|
725
914
|
|
|
726
915
|
If you encounter "Network not found" or "network 'default' is not active" errors:
|
|
@@ -1069,4 +1258,4 @@ qm set 9000 --boot c --bootdisk scsi0
|
|
|
1069
1258
|
|
|
1070
1259
|
## License
|
|
1071
1260
|
|
|
1072
|
-
|
|
1261
|
+
Apache License - see [LICENSE](LICENSE) file.
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
clonebox/__init__.py,sha256=CyfHVVq6KqBr4CNERBpXk_O6Q5B35q03YpdQbokVvvI,408
|
|
2
2
|
clonebox/__main__.py,sha256=Fcoyzwwyz5-eC_sBlQk5a5RbKx8uodQz5sKJ190U0NU,135
|
|
3
|
-
clonebox/cli.py,sha256=
|
|
4
|
-
clonebox/cloner.py,sha256=
|
|
3
|
+
clonebox/cli.py,sha256=ItXPNJmQeWbv-Bf9IxYi4e6AsX04pJwRk8fBXP0MglA,104376
|
|
4
|
+
clonebox/cloner.py,sha256=jR-pIBewc8zNE_h_sTcID1uZYKeQjNc6VInhE3aikfQ,34156
|
|
5
5
|
clonebox/container.py,sha256=tiYK1ZB-DhdD6A2FuMA0h_sRNkUI7KfYcJ0tFOcdyeM,6105
|
|
6
6
|
clonebox/dashboard.py,sha256=RhSPvR6kWglqXeLkCWesBZQid7wv2WpJa6w78mXbPjY,4268
|
|
7
7
|
clonebox/detector.py,sha256=aS_QlbG93-DE3hsjRt88E7O-PGC2TUBgUbP9wqT9g60,23221
|
|
8
|
-
clonebox/models.py,sha256=
|
|
8
|
+
clonebox/models.py,sha256=yBRUlJejpeJHZjvCYMGq1nXPFcmhLFxN-LqkEyveWsA,7913
|
|
9
9
|
clonebox/profiles.py,sha256=VaKVuxCrgyMxx-8_WOTcw7E8irwGxUPhZHVY6RxYYiE,2034
|
|
10
10
|
clonebox/validator.py,sha256=LnQSZEdJXFGcJrTPxzS2cQUmAXucGeHDKwxrX632h_s,21188
|
|
11
11
|
clonebox/templates/profiles/ml-dev.yaml,sha256=MT7Wu3xGBnYIsO5mzZ2GDI4AAEFGOroIx0eU3XjNARg,140
|
|
12
|
-
clonebox-0.1.
|
|
13
|
-
clonebox-0.1.
|
|
14
|
-
clonebox-0.1.
|
|
15
|
-
clonebox-0.1.
|
|
16
|
-
clonebox-0.1.
|
|
17
|
-
clonebox-0.1.
|
|
12
|
+
clonebox-0.1.21.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
13
|
+
clonebox-0.1.21.dist-info/METADATA,sha256=xvEQjhq84KYnf5oveMK8GRcfZXoBB54sZ9CrcRfTRpg,41534
|
|
14
|
+
clonebox-0.1.21.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
15
|
+
clonebox-0.1.21.dist-info/entry_points.txt,sha256=FES95Vi3btfViLEEoHdb8nikNxTqzaooi9ehZw9ZfWI,47
|
|
16
|
+
clonebox-0.1.21.dist-info/top_level.txt,sha256=LdMo2cvCrEcRGH2M8JgQNVsCoszLV0xug6kx1JnaRjo,9
|
|
17
|
+
clonebox-0.1.21.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|