mirror of
https://github.com/dockur/windows.git
synced 2026-02-03 17:27:21 +00:00
docs: Add comprehensive winctl.sh user guide
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
e78fed6bd3
commit
68e1cce002
704
WINCTL_GUIDE.md
Normal file
704
WINCTL_GUIDE.md
Normal file
@ -0,0 +1,704 @@
|
||||
# winctl.sh User Guide
|
||||
|
||||
A comprehensive guide to managing Windows Docker containers with `winctl.sh`.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Overview](#overview)
|
||||
- [Prerequisites](#prerequisites)
|
||||
- [Quick Start](#quick-start)
|
||||
- [Commands Reference](#commands-reference)
|
||||
- [Configuration](#configuration)
|
||||
- [Interactive Menus](#interactive-menus)
|
||||
- [Common Scenarios](#common-scenarios)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Tips & Tricks](#tips--tricks)
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
`winctl.sh` is a management script for running Windows virtual machines inside Docker containers. It provides:
|
||||
|
||||
- **22 Windows versions** from Windows 2000 to Windows 11
|
||||
- **Simple commands** to start, stop, and manage containers
|
||||
- **Interactive menus** when you don't specify a version
|
||||
- **Status caching** for fast performance
|
||||
- **Resource profiles** optimized for modern and legacy systems
|
||||
|
||||
### Supported Windows Versions
|
||||
|
||||
| Category | Versions |
|
||||
|----------|----------|
|
||||
| **Desktop** | win11, win11e, win11l, win10, win10e, win10l, win81, win81e, win7, win7e |
|
||||
| **Legacy** | vista, winxp, win2k |
|
||||
| **Server** | win2025, win2022, win2019, win2016, win2012, win2008, win2003 |
|
||||
| **Tiny** | tiny11, tiny10 |
|
||||
|
||||
### Port Mappings
|
||||
|
||||
Each version has unique ports to avoid conflicts:
|
||||
|
||||
| Version | Web UI | RDP | Version | Web UI | RDP |
|
||||
|---------|--------|-----|---------|--------|-----|
|
||||
| win11 | 8011 | 3311 | win2025 | 8025 | 3325 |
|
||||
| win10 | 8010 | 3310 | win2022 | 8022 | 3322 |
|
||||
| win81 | 8008 | 3308 | win2019 | 8019 | 3319 |
|
||||
| win7 | 8007 | 3307 | win2016 | 8016 | 3316 |
|
||||
| vista | 8006 | 3306 | win2012 | 8112 | 3212 |
|
||||
| winxp | 8005 | 3305 | win2008 | 8108 | 3208 |
|
||||
| win2k | 8000 | 3300 | win2003 | 8003 | 3303 |
|
||||
| tiny11 | 8111 | 3111 | tiny10 | 8110 | 3110 |
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### Required
|
||||
|
||||
1. **Docker** - Container runtime
|
||||
2. **Docker Compose** - Container orchestration (plugin or standalone)
|
||||
3. **KVM** - Hardware virtualization for near-native performance
|
||||
|
||||
### Check Prerequisites
|
||||
|
||||
Run the built-in check:
|
||||
|
||||
```bash
|
||||
./winctl.sh check
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
Prerequisites Check
|
||||
────────────────────────────────────────────────────────────
|
||||
[OK] Docker is available
|
||||
[OK] Docker Compose plugin is available
|
||||
[OK] KVM is available
|
||||
[OK] TUN device is available
|
||||
[OK] Memory OK: 16GB available (8GB needed)
|
||||
[OK] Disk space OK: 500GB available (128GB needed)
|
||||
|
||||
[OK] All critical prerequisites passed!
|
||||
```
|
||||
|
||||
### Fix Common Issues
|
||||
|
||||
**KVM not accessible:**
|
||||
```bash
|
||||
sudo usermod -aG kvm $USER
|
||||
newgrp kvm # or log out and back in
|
||||
```
|
||||
|
||||
**Docker not running:**
|
||||
```bash
|
||||
sudo systemctl start docker
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Start a Windows VM
|
||||
|
||||
```bash
|
||||
# Start Windows 11
|
||||
./winctl.sh start win11
|
||||
|
||||
# Or use interactive menu
|
||||
./winctl.sh start
|
||||
```
|
||||
|
||||
### 2. Access the VM
|
||||
|
||||
After starting, you'll see connection details:
|
||||
|
||||
```
|
||||
Connection Details:
|
||||
→ Web Viewer: http://localhost:8011
|
||||
→ RDP: localhost:3311
|
||||
```
|
||||
|
||||
- **Web Viewer**: Open in browser for quick access
|
||||
- **RDP**: Use any RDP client for better performance
|
||||
|
||||
### 3. Check Status
|
||||
|
||||
```bash
|
||||
./winctl.sh status
|
||||
```
|
||||
|
||||
### 4. Stop the VM
|
||||
|
||||
```bash
|
||||
./winctl.sh stop win11
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Commands Reference
|
||||
|
||||
### start
|
||||
|
||||
Start one or more containers.
|
||||
|
||||
```bash
|
||||
# Start single version
|
||||
./winctl.sh start win11
|
||||
|
||||
# Start multiple versions
|
||||
./winctl.sh start win11 win10 winxp
|
||||
|
||||
# Interactive menu (no version specified)
|
||||
./winctl.sh start
|
||||
```
|
||||
|
||||
**What it does:**
|
||||
1. Checks prerequisites (Docker, KVM)
|
||||
2. Creates data directory if missing
|
||||
3. Checks available resources
|
||||
4. Starts the container
|
||||
5. Shows connection details
|
||||
|
||||
---
|
||||
|
||||
### stop
|
||||
|
||||
Stop containers with a 2-minute grace period for clean shutdown.
|
||||
|
||||
```bash
|
||||
# Stop single version
|
||||
./winctl.sh stop win11
|
||||
|
||||
# Stop multiple versions
|
||||
./winctl.sh stop win11 win10
|
||||
|
||||
# Interactive menu
|
||||
./winctl.sh stop
|
||||
```
|
||||
|
||||
**Note:** You'll be asked to confirm before stopping.
|
||||
|
||||
---
|
||||
|
||||
### restart
|
||||
|
||||
Restart containers.
|
||||
|
||||
```bash
|
||||
./winctl.sh restart win11
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### status
|
||||
|
||||
Show status of containers.
|
||||
|
||||
```bash
|
||||
# All containers
|
||||
./winctl.sh status
|
||||
|
||||
# Specific versions
|
||||
./winctl.sh status win11 win10
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
VERSION NAME STATUS WEB RDP
|
||||
──────────────────────────────────────────────────────────────────
|
||||
win11 Windows 11 Pro running 8011 3311
|
||||
win10 Windows 10 Pro stopped 8010 3310
|
||||
winxp Windows XP Professional not created 8005 3305
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### logs
|
||||
|
||||
View container logs.
|
||||
|
||||
```bash
|
||||
# View logs
|
||||
./winctl.sh logs win11
|
||||
|
||||
# Follow logs in real-time
|
||||
./winctl.sh logs win11 -f
|
||||
```
|
||||
|
||||
Press `Ctrl+C` to stop following logs.
|
||||
|
||||
---
|
||||
|
||||
### shell
|
||||
|
||||
Open an interactive bash shell inside the container.
|
||||
|
||||
```bash
|
||||
./winctl.sh shell win11
|
||||
```
|
||||
|
||||
Useful for debugging or accessing container internals.
|
||||
|
||||
---
|
||||
|
||||
### stats
|
||||
|
||||
Show real-time resource usage (CPU, memory, network).
|
||||
|
||||
```bash
|
||||
# All running containers
|
||||
./winctl.sh stats
|
||||
|
||||
# Specific containers
|
||||
./winctl.sh stats win11 win10
|
||||
```
|
||||
|
||||
Press `Ctrl+C` to exit.
|
||||
|
||||
---
|
||||
|
||||
### build
|
||||
|
||||
Build the Docker image locally from source.
|
||||
|
||||
```bash
|
||||
./winctl.sh build
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### rebuild
|
||||
|
||||
Destroy and recreate containers. Data in `/storage` is preserved.
|
||||
|
||||
```bash
|
||||
./winctl.sh rebuild win11
|
||||
```
|
||||
|
||||
**Warning:** You must type `yes` to confirm (destructive operation).
|
||||
|
||||
---
|
||||
|
||||
### list
|
||||
|
||||
List available Windows versions.
|
||||
|
||||
```bash
|
||||
# All versions
|
||||
./winctl.sh list
|
||||
|
||||
# By category
|
||||
./winctl.sh list desktop
|
||||
./winctl.sh list legacy
|
||||
./winctl.sh list server
|
||||
./winctl.sh list tiny
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
Available Windows Versions
|
||||
────────────────────────────────────────────────────────────
|
||||
|
||||
DESKTOP
|
||||
──────────────────────────────────────────────────
|
||||
win11 Windows 11 Pro (8G RAM)
|
||||
win10 Windows 10 Pro (8G RAM) [running]
|
||||
win7 Windows 7 Ultimate (2G RAM)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### inspect
|
||||
|
||||
Show detailed information about a version.
|
||||
|
||||
```bash
|
||||
./winctl.sh inspect win11
|
||||
```
|
||||
|
||||
Example output:
|
||||
```
|
||||
Container Details: win11
|
||||
────────────────────────────────────────────────────────────
|
||||
|
||||
Version: win11
|
||||
Name: Windows 11 Pro
|
||||
Category: desktop
|
||||
Status: running
|
||||
Web Port: 8011
|
||||
RDP Port: 3311
|
||||
Resources: modern
|
||||
Compose: compose/desktop/win11.yml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### monitor
|
||||
|
||||
Real-time dashboard showing all containers.
|
||||
|
||||
```bash
|
||||
# Default 5-second refresh
|
||||
./winctl.sh monitor
|
||||
|
||||
# Custom refresh interval (10 seconds)
|
||||
./winctl.sh monitor 10
|
||||
```
|
||||
|
||||
Press `Ctrl+C` to exit.
|
||||
|
||||
---
|
||||
|
||||
### check
|
||||
|
||||
Run prerequisites check.
|
||||
|
||||
```bash
|
||||
./winctl.sh check
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### refresh
|
||||
|
||||
Force refresh the status cache.
|
||||
|
||||
```bash
|
||||
./winctl.sh refresh
|
||||
```
|
||||
|
||||
The cache is stored at `~/.cache/winctl/status.json` and auto-refreshes when:
|
||||
- Cache is older than 7 days
|
||||
- Cached data becomes stale
|
||||
- After start/stop/restart/rebuild operations
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Files
|
||||
|
||||
Two pre-configured environment files control VM resources:
|
||||
|
||||
| File | RAM | CPU | Disk | Used By |
|
||||
|------|-----|-----|------|---------|
|
||||
| `.env.modern` | 8G | 4 | 128G | Win 10/11, Server 2016+ |
|
||||
| `.env.legacy` | 2G | 2 | 32G | Win 7/8, Vista, XP, 2000, Server 2003-2012, Tiny |
|
||||
|
||||
### Customizing Resources
|
||||
|
||||
Edit `.env.modern` or `.env.legacy`:
|
||||
|
||||
```bash
|
||||
# Resources
|
||||
RAM_SIZE=8G
|
||||
CPU_CORES=4
|
||||
DISK_SIZE=128G
|
||||
|
||||
# Credentials
|
||||
USERNAME=docker
|
||||
PASSWORD=admin
|
||||
|
||||
# Display
|
||||
WIDTH=1280
|
||||
HEIGHT=720
|
||||
|
||||
# Other
|
||||
LANGUAGE=en
|
||||
REGION=en-US
|
||||
KEYBOARD=en-US
|
||||
DHCP=N
|
||||
SAMBA=Y
|
||||
DEBUG=N
|
||||
```
|
||||
|
||||
### Available Settings
|
||||
|
||||
| Setting | Description | Default |
|
||||
|---------|-------------|---------|
|
||||
| `RAM_SIZE` | Memory allocation | 8G/2G |
|
||||
| `CPU_CORES` | CPU cores | 4/2 |
|
||||
| `DISK_SIZE` | Virtual disk size | 128G/32G |
|
||||
| `USERNAME` | Windows username | docker |
|
||||
| `PASSWORD` | Windows password | admin |
|
||||
| `LANGUAGE` | Installation language | en |
|
||||
| `REGION` | Region setting | en-US |
|
||||
| `KEYBOARD` | Keyboard layout | en-US |
|
||||
| `WIDTH` | Display width | 1280 |
|
||||
| `HEIGHT` | Display height | 720 |
|
||||
| `DHCP` | Use DHCP networking | N |
|
||||
| `SAMBA` | Enable file sharing | Y |
|
||||
| `DEBUG` | Debug mode | N |
|
||||
|
||||
---
|
||||
|
||||
## Interactive Menus
|
||||
|
||||
When you don't specify a version, `winctl.sh` shows interactive menus.
|
||||
|
||||
### Category Selection
|
||||
|
||||
```
|
||||
Select Category
|
||||
────────────────────────────────────────────────────────────
|
||||
|
||||
1) Desktop (Win 11, 10, 8.1, 7)
|
||||
2) Legacy (Vista, XP, 2000)
|
||||
3) Server (2025, 2022, 2019, 2016, 2012, 2008, 2003)
|
||||
4) Tiny (Tiny11, Tiny10)
|
||||
5) All versions
|
||||
6) Select individual versions
|
||||
|
||||
Select [1-6]:
|
||||
```
|
||||
|
||||
### Version Selection
|
||||
|
||||
```
|
||||
Select Version(s)
|
||||
────────────────────────────────────────────────────────────
|
||||
|
||||
1) win11 Windows 11 Pro [running]
|
||||
2) win11e Windows 11 Enterprise
|
||||
3) win11l Windows 11 LTSC
|
||||
4) win10 Windows 10 Pro [stopped]
|
||||
|
||||
a) Select all
|
||||
q) Cancel
|
||||
|
||||
Select (numbers separated by spaces, or 'a' for all):
|
||||
```
|
||||
|
||||
- Enter numbers separated by spaces: `1 3 4`
|
||||
- Enter `a` for all versions
|
||||
- Enter `q` to cancel
|
||||
|
||||
---
|
||||
|
||||
## Common Scenarios
|
||||
|
||||
### Scenario 1: Set Up a Development Environment
|
||||
|
||||
```bash
|
||||
# Start Windows 10 for development
|
||||
./winctl.sh start win10
|
||||
|
||||
# Access via web browser
|
||||
# Open http://localhost:8010
|
||||
|
||||
# Or connect via RDP for better performance
|
||||
# Use RDP client to connect to localhost:3310
|
||||
```
|
||||
|
||||
### Scenario 2: Test Software on Multiple Windows Versions
|
||||
|
||||
```bash
|
||||
# Start multiple versions
|
||||
./winctl.sh start win11 win10 win7
|
||||
|
||||
# Check they're all running
|
||||
./winctl.sh status
|
||||
|
||||
# Access each via their ports:
|
||||
# - Win11: http://localhost:8011
|
||||
# - Win10: http://localhost:8010
|
||||
# - Win7: http://localhost:8007
|
||||
|
||||
# Stop all when done
|
||||
./winctl.sh stop win11 win10 win7
|
||||
```
|
||||
|
||||
### Scenario 3: Run Legacy Software on Windows XP
|
||||
|
||||
```bash
|
||||
# Start Windows XP
|
||||
./winctl.sh start winxp
|
||||
|
||||
# Access via http://localhost:8005
|
||||
# Login: docker / admin
|
||||
|
||||
# Transfer files via the Shared folder on desktop
|
||||
```
|
||||
|
||||
### Scenario 4: Monitor Resource Usage
|
||||
|
||||
```bash
|
||||
# See real-time stats for all running VMs
|
||||
./winctl.sh stats
|
||||
|
||||
# Or use the dashboard
|
||||
./winctl.sh monitor
|
||||
```
|
||||
|
||||
### Scenario 5: Increase Resources for a VM
|
||||
|
||||
1. Stop the container:
|
||||
```bash
|
||||
./winctl.sh stop win11
|
||||
```
|
||||
|
||||
2. Edit `.env.modern`:
|
||||
```bash
|
||||
RAM_SIZE=16G
|
||||
CPU_CORES=8
|
||||
```
|
||||
|
||||
3. Start again:
|
||||
```bash
|
||||
./winctl.sh start win11
|
||||
```
|
||||
|
||||
### Scenario 6: Fresh Start (Reset VM)
|
||||
|
||||
```bash
|
||||
# This destroys the container but keeps data
|
||||
./winctl.sh rebuild win11
|
||||
|
||||
# For a complete reset, also delete the data:
|
||||
rm -rf data/win11/*
|
||||
./winctl.sh start win11
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container Won't Start
|
||||
|
||||
**Check prerequisites:**
|
||||
```bash
|
||||
./winctl.sh check
|
||||
```
|
||||
|
||||
**Check logs:**
|
||||
```bash
|
||||
./winctl.sh logs win11
|
||||
```
|
||||
|
||||
**Common issues:**
|
||||
- KVM not accessible → Add user to kvm group
|
||||
- Port already in use → Stop other containers or services
|
||||
- Not enough disk space → Free up space or reduce DISK_SIZE
|
||||
|
||||
### Slow Performance
|
||||
|
||||
- Ensure KVM is working (hardware virtualization)
|
||||
- Increase RAM_SIZE and CPU_CORES in env file
|
||||
- Use RDP instead of web viewer for better performance
|
||||
|
||||
### Can't Connect via RDP
|
||||
|
||||
1. Wait for Windows to fully boot (check web viewer first)
|
||||
2. RDP might be disabled in Windows → Enable via web viewer
|
||||
3. Check firewall settings in Windows
|
||||
|
||||
### Web Viewer Not Loading
|
||||
|
||||
```bash
|
||||
# Check if container is running
|
||||
./winctl.sh status win11
|
||||
|
||||
# Check container logs
|
||||
./winctl.sh logs win11
|
||||
|
||||
# Restart the container
|
||||
./winctl.sh restart win11
|
||||
```
|
||||
|
||||
### Cache Issues
|
||||
|
||||
Force refresh the status cache:
|
||||
```bash
|
||||
./winctl.sh refresh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Tips & Tricks
|
||||
|
||||
### 1. Use Aliases
|
||||
|
||||
Add to your `~/.bashrc`:
|
||||
```bash
|
||||
alias wctl='./winctl.sh'
|
||||
alias wstart='./winctl.sh start'
|
||||
alias wstop='./winctl.sh stop'
|
||||
alias wstatus='./winctl.sh status'
|
||||
```
|
||||
|
||||
### 2. Quick Access Bookmarks
|
||||
|
||||
Bookmark your commonly used VMs:
|
||||
- Windows 11: http://localhost:8011
|
||||
- Windows 10: http://localhost:8010
|
||||
|
||||
### 3. File Sharing
|
||||
|
||||
Each VM has a "Shared" folder on the desktop that maps to the host. Use this to transfer files.
|
||||
|
||||
### 4. Snapshots via Data Backup
|
||||
|
||||
The VM disk is stored in `data/<version>/`. Back it up to create a snapshot:
|
||||
```bash
|
||||
./winctl.sh stop win11
|
||||
cp -r data/win11 data/win11-backup
|
||||
./winctl.sh start win11
|
||||
```
|
||||
|
||||
### 5. Running Multiple VMs
|
||||
|
||||
Check your available resources before starting multiple VMs:
|
||||
```bash
|
||||
# Each modern VM needs 8GB RAM
|
||||
# Each legacy VM needs 2GB RAM
|
||||
|
||||
# Example: Running win11 + win10 + winxp = 8+8+2 = 18GB RAM needed
|
||||
```
|
||||
|
||||
### 6. Headless Operation
|
||||
|
||||
For servers, you can start VMs and access only via RDP:
|
||||
```bash
|
||||
./winctl.sh start win2022
|
||||
# Connect via RDP to localhost:3322
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
.
|
||||
├── winctl.sh # Management script
|
||||
├── .env.modern # Modern systems config (8G RAM)
|
||||
├── .env.legacy # Legacy systems config (2G RAM)
|
||||
├── compose/
|
||||
│ ├── desktop/ # Win 11, 10, 8.1, 7
|
||||
│ ├── legacy/ # Vista, XP, 2000
|
||||
│ ├── server/ # Server 2003-2025
|
||||
│ └── tiny/ # Tiny10, Tiny11
|
||||
├── data/
|
||||
│ ├── win11/ # Win11 VM storage
|
||||
│ ├── win10/ # Win10 VM storage
|
||||
│ └── ... # Other VM storage
|
||||
└── ~/.cache/winctl/
|
||||
└── status.json # Status cache
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Getting Help
|
||||
|
||||
```bash
|
||||
# Show all commands
|
||||
./winctl.sh help
|
||||
|
||||
# Check system requirements
|
||||
./winctl.sh check
|
||||
|
||||
# List all versions
|
||||
./winctl.sh list
|
||||
```
|
||||
|
||||
For issues, visit: https://github.com/dockur/windows/issues
|
||||
Loading…
Reference in New Issue
Block a user