Setting Up Your Development Machine
AutoCore runs on Linux. You have two options for your development machine:
- Windows 11 Pro: Use WSL2 to run Ubuntu inside Windows. This is the recommended setup for most users.
- Ubuntu Desktop: Install directly on an Ubuntu 22.04 or 24.04 machine.
Both paths result in the same development environment. Follow the section that matches your machine.
Option A: Windows 11 Pro with WSL2
WSL2 (Windows Subsystem for Linux) lets you run a full Linux environment inside Windows. AutoCore development works entirely within WSL2. Windows 10 is not supported — you need Windows 11.
Important: WSL2 runs on top of the Windows hypervisor. It is suitable for development, compilation, and logic testing, but it is not suitable for real-time production control. Your production target should be a dedicated Linux PC (see Option B for target machine setup).
Step 1: Enable WSL2
Open PowerShell as Administrator and run:
wsl --install
This installs WSL2 with Ubuntu 24.04 as the default distribution. When it finishes, restart your computer.
After restarting, the Ubuntu terminal will open automatically. It will ask you to create a username and password — these are for your Linux environment only and do not need to match your Windows credentials.
Tip: If you already have WSL1 installed, upgrade to WSL2 with:
wsl --set-default-version 2
Step 2: Create a Dedicated WSL2 Instance
To keep your AutoCore development environment isolated from your base Ubuntu install, create a dedicated WSL2 instance. This way, the custom kernel and any driver changes won’t affect other WSL distributions you may be using.
Open PowerShell and run:
# Create directories for WSL management
mkdir $HOME\wsl_backups
mkdir $HOME\wsl_instances
mkdir $HOME\wsl_kernels
# Export your base Ubuntu as a backup, then import as a new instance
wsl --export Ubuntu-24.04 $HOME\wsl_backups\ubuntu_base.tar
wsl --import AutoCore-Dev $HOME\wsl_instances\AutoCore $HOME\wsl_backups\ubuntu_base.tar
By default, imported instances log in as root. Fix this by setting your default user:
wsl -d AutoCore-Dev
Inside the WSL terminal:
sudo nano /etc/wsl.conf
Add the following (replace <your_username> with the username you created during Ubuntu setup):
[user]
default=<your_username>
Save and exit (Ctrl+O, Enter, Ctrl+X). Then in PowerShell, restart the instance:
wsl --terminate AutoCore-Dev
From now on, launch your development environment with:
wsl -d AutoCore-Dev
Tip: If you prefer to skip the dedicated instance and just use your default Ubuntu install, that works too — just skip this step and continue with Step 3.
Step 3: Update Ubuntu and Install Dependencies
In the WSL2 terminal (either your dedicated AutoCore-Dev instance or default Ubuntu):
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential pkg-config libssl-dev git curl \
flex bison libelf-dev bc dwarves python3 kmod rsync
The extra packages (flex, bison, libelf-dev, etc.) are needed if you plan to build the custom kernel or EtherCAT master.
Step 4: Set Up Your Code Editor
Visual Studio Code is the recommended editor. Install it on Windows (not inside WSL), then install the WSL extension from Microsoft. This lets VS Code edit files inside your Linux environment seamlessly.
After installing the WSL extension, open the WSL terminal and type:
code .
This opens VS Code connected to your WSL2 environment. From here, you can edit files, open terminals, and use extensions — all running on the Linux side.
Recommended VS Code extensions (install inside WSL when prompted):
- rust-analyzer: Rust language support
- Even Better TOML: Syntax highlighting for
Cargo.tomlfiles - Error Lens: Shows errors inline in the editor
Installing the Custom WSL2 Kernel
AutoCore provides a pre-built custom WSL2 kernel that enables loadable kernel modules (LKM). The stock WSL2 kernel has restricted module support, which prevents the EtherCAT master and other kernel drivers from loading. Even if you do not plan to use EtherCAT from WSL2, the custom kernel is recommended for full compatibility with AutoCore.
Option 1: Use the Pre-Built Kernel (Recommended)
If you received the pre-built kernel file (bzImage) from your AutoCore distribution:
- Copy the kernel file to your Windows user folder:
# In PowerShell
copy <path-to-bzImage> $HOME\wsl_kernels\bzImage
- Skip to Configure WSL2 to Use the Custom Kernel below.
Option 2: Build the Kernel from Source
If you need to build the kernel yourself (e.g., for a specific kernel version):
- Clone the WSL2 kernel source. Check your current version with
uname -r, then clone the matching branch:
git clone --depth 1 -b linux-msft-wsl-6.6.y https://github.com/microsoft/WSL2-Linux-Kernel.git
cd WSL2-Linux-Kernel
- Configure for module support:
cp Microsoft/config-wsl .config
./scripts/config --enable CONFIG_MODULES
./scripts/config --enable CONFIG_MODULE_UNLOAD
./scripts/config --enable CONFIG_MODVERSIONS
./scripts/config --set-str CONFIG_LOCALVERSION "-autocore"
- Build the kernel and modules:
make -j$(nproc)
sudo make modules_install
sudo make install
This takes 10-30 minutes depending on your machine.
- Copy the kernel image to Windows:
cp arch/x86/boot/bzImage /mnt/c/Users/<Windows_User>/wsl_kernels/bzImage
Replace <Windows_User> with your actual Windows username (check with ls /mnt/c/Users/).
Configure WSL2 to Use the Custom Kernel
On Windows, create or edit the file C:\Users\<Windows_User>\.wslconfig:
[wsl2]
kernel=C:\\Users\\<Windows_User>\\wsl_kernels\\bzImage
networkingMode=mirrored
The networkingMode=mirrored setting is important — it makes your physical Windows Ethernet adapters visible inside WSL2 with their real MAC addresses. This is required for EtherCAT development and also simplifies accessing the AutoCore web console.
Now restart WSL entirely from PowerShell:
wsl --shutdown
Then re-launch your instance:
wsl -d AutoCore-Dev
Verify the custom kernel is running:
uname -a
You should see output like:
Linux YOURPC 6.6.114.1-autocore+ #2 SMP PREEMPT_DYNAMIC ... x86_64 GNU/Linux
The -autocore (or -ethercat-local) suffix confirms you are running the custom kernel.
Configure Networking (WSL2)
With networkingMode=mirrored in your .wslconfig, your WSL2 instance shares the host’s network interfaces. This means:
- You can access the AutoCore web console at
http://localhost:8080directly from Windows. - The
acctltool can reach remote AutoCore servers on your network without any port forwarding. - Physical Ethernet adapters are visible for EtherCAT (see below).
If you are not using mirrored mode, WSL2 has its own IP address. Find it with:
hostname -I
Then access the web console at http://<WSL2_IP>:8080 from Windows.
Setting Up EtherCAT in WSL2 (Optional)
If you plan to connect to physical EtherCAT hardware from your Windows development machine (for testing and commissioning), follow these steps. If you are only writing and compiling control programs and will deploy to a separate target machine, you can skip this section.
Reminder: EtherCAT from WSL2 is for development and testing only. Production systems should run on a dedicated Linux PC with a real-time kernel.
Step 1: Build and Install the EtherLab EtherCAT Master
With the custom kernel running, compile the EtherCAT master against the kernel source:
# Clone the EtherLab repository
git clone https://gitlab.com/etherlab.org/ethercat.git
cd ethercat
./bootstrap
# Configure — WSL2 requires the generic driver (no direct PCI access)
./configure --prefix=/opt/etherlab \
--sysconfdir=/etc \
--disable-8139too \
--enable-generic \
--with-linux-dir=$HOME/WSL2-Linux-Kernel
# Build and install
make -j$(nproc)
make modules
sudo make install
sudo make modules_install
sudo depmod -a
Step 2: Configure the EtherCAT Master
Edit the configuration file:
sudo nano /etc/ethercat.conf
Set the following (you will update MASTER0_DEVICE later when connecting a USB Ethernet adapter):
MASTER0_DEVICE=""
DEVICE_MODULES="generic"
Step 3: Enable Non-Root Access
By default, only root can access the EtherCAT master device. Create a udev rule to allow your user:
echo 'KERNEL=="EtherCAT[0-9]*", MODE="0666"' | sudo tee /etc/udev/rules.d/99-ethercat.rules
Enable the EtherCAT service to start automatically:
sudo systemctl enable ethercat
Connecting USB Ethernet to WSL2 for EtherCAT
EtherCAT requires a dedicated Ethernet interface. In WSL2, the most reliable way to provide this is with a USB-to-Ethernet adapter passed through from Windows using usbipd-win.
First-Time Setup (Windows)
-
Install usbipd-win on Windows. Download the latest
.msifrom: https://github.com/dorssel/usbipd-win/releasesRun the installer and restart if prompted.
-
Build the usbip kernel modules inside WSL2 (needed for the custom kernel):
# Navigate to the USB tools in the kernel source
cd ~/WSL2-Linux-Kernel/tools/usb/usbip
# Build and install
./autogen.sh
./configure
make -j$(nproc)
sudo make install
sudo ldconfig
# Install USB utilities
sudo apt install -y usbutils
Connecting the Adapter
Each time you want to use EtherCAT, you need to attach the USB adapter to WSL2. This process has a Windows side and a Linux side.
On Windows (PowerShell as Administrator):
-
Plug in your USB-to-Ethernet adapter.
-
List USB devices to find the adapter’s bus ID:
usbipd list
Example output:
Connected:
BUSID VID:PID DEVICE STATE
2-4 0bda:8153 Realtek USB GbE Family Controller Not shared
6-7 06cb:00f9 Synaptics UWP WBDI Not shared
...
- Bind and attach the adapter (using the BUSID from above):
usbipd bind --busid 2-4
usbipd attach --wsl --busid 2-4
Note the IP address printed in the output — you may need it if the automatic attachment fails.
In WSL2:
- Load the USB host controller module (needed on first use after each WSL restart):
sudo modprobe vhci-hcd
If
modprobefails, you may need to manually attach. Use the IP address from the PowerShell output:sudo usbip attach -r <IP_FROM_POWERSHELL> -b 2-4
- Verify the adapter is visible:
ip link
You should see a new interface (e.g., enx6c6e0719971b or enpXs0):
1: lo: <LOOPBACK,UP,LOWER_UP> ...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> ...
3: enx6c6e0719971b: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN ...
link/ether 6c:6e:07:19:97:1b brd ff:ff:ff:ff:ff:ff
- Bring the interface up:
sudo ip link set enx6c6e0719971b up
- Update the EtherCAT master configuration with the adapter name:
sudo nano /etc/ethercat.conf
Set the device to the adapter name from ip link:
MASTER0_DEVICE="enx6c6e0719971b"
DEVICE_MODULES="generic"
- Start (or restart) the EtherCAT service:
sudo systemctl restart ethercat
- Verify it is working:
ethercat master
ethercat slaves
You should see your EtherCAT master status and any connected slaves:
Master0
Phase: Idle
Active: no
Slaves: 1
Ethernet devices:
Main: 6c:6e:07:19:97:1b (attached)
Link: UP
...
Tip: The USB adapter attachment does not persist across WSL restarts. After a
wsl --shutdownor system reboot, you will need to re-run theusbipd attachcommand from PowerShell and themodprobe/ip link set upcommands from WSL2.
Now continue to Installing the Rust Toolchain.
Option B: Ubuntu Desktop
If you are using a native Ubuntu 22.04 or 24.04 installation, the setup is straightforward.
Step 1: Update Your System
sudo apt update && sudo apt upgrade -y
Step 2: Install Build Dependencies
sudo apt install -y build-essential pkg-config libssl-dev git curl
Step 3: Set Up Your Code Editor
Install Visual Studio Code:
sudo snap install code --classic
Or download it from the VS Code website and install with:
sudo dpkg -i code_*.deb
sudo apt install -f
Recommended VS Code extensions:
- rust-analyzer: Rust language support
- Even Better TOML: Syntax highlighting for
Cargo.tomlfiles - Error Lens: Shows errors inline in the editor
Now continue to Installing the Rust Toolchain.
Installing the Rust Toolchain
AutoCore control programs are written in Rust. Install the Rust toolchain using rustup, the official installer:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
When prompted, select the default installation (option 1). After installation completes, load the new environment:
source "$HOME/.cargo/env"
Verify the installation:
rustc --version
cargo --version
You should see version numbers for both. The minimum supported Rust version for AutoCore is 1.85.0 (Rust 2024 edition).
What is Cargo? Cargo is Rust’s build tool and package manager — similar to
npmfor JavaScript orpipfor Python. You will usecargo buildto compile control programs andcargo installto install tools likeacctl.
Installing Node.js (for Web HMI Development)
If you plan to build a web-based HMI for your machine, you will need Node.js. If you only need to write control programs, you can skip this step.
Install Node.js using the NodeSource repository:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
Verify:
node --version
npm --version
Installing AutoCore
AutoCore consists of two components you install on your development machine:
- autocore-server — the runtime engine
- acctl — the command-line project management tool
Installing from a Debian Package (Recommended)
If you received a .deb package file:
sudo dpkg -i autocore_server_*.deb
sudo apt install -f # Install any missing dependencies
This installs:
- The server binary to
/opt/autocore/bin/autocore_server - Module binaries (EtherCAT, Modbus) to
/opt/autocore/bin/modules/ - The standard library to
/srv/autocore/lib/autocore-std/ - The web console to
/srv/autocore/console/ - A systemd service for automatic startup
- Default configuration to
/opt/autocore/config/config.ini
Enable and start the server:
sudo systemctl enable autocore_server
sudo systemctl start autocore_server
Installing acctl
The acctl CLI tool is installed separately using Cargo:
cargo install --path /path/to/autocore-server/acctl
Or, if you received acctl as a standalone package:
cargo install acctl
Manual Configuration (Development Setup)
If you are building from source or using a development setup, you need a config.ini file. Create one at /opt/autocore/config/config.ini (or run the server with --config /path/to/config.ini):
[console]
port = 11969
www_root = /srv/autocore/console/dist
[general]
projects_directory = /srv/autocore/projects
module_base_directory = /opt/autocore/bin/modules
port = 8080
autocore_std_directory = /srv/autocore/lib/autocore-std
disable_ads = 1
ipc_port = 9100
project_name = default
[modules]
modbus = ${general.module_base_directory}/autocore-modbus
ethercat = ${general.module_base_directory}/autocore-ethercat
| Setting | Description |
|---|---|
console.port | WebSocket port for CLI and web clients |
console.www_root | Path to the web console static files |
general.projects_directory | Root directory where all projects are stored |
general.port | HTTP port for the web server |
general.autocore_std_directory | Path to the autocore-std library (used for building control programs on the server) |
general.ipc_port | TCP port for module IPC communication |
general.project_name | The project to load on startup |
modules.* | Paths to module executables |
Verifying Your Installation
Run these commands to confirm everything is working:
# Check the Rust toolchain
rustc --version
cargo --version
# Check acctl
acctl --help
# Check if the server is running
sudo systemctl status autocore_server
# Check server status via acctl (if server is running locally)
acctl status
If acctl status shows the server version and a list of projects, your installation is complete.