====== EVE OS Image Customization ====== Installation, Customization & Network Configuration ===== Prerequisites ===== Before getting started, ensure the following are available: ^ Requirement ^ Details ^ | EVE OS Image | KVM or K variant, in ''.raw'' or ''.iso'' format | | Hardware Serial Number | Required for device registration | | Installation Media | USB drive (simplest method) | | IP Addressing | DHCP or Static (static requires additional configuration) | --- ===== Creating an EVE OS Image ===== There are two methods to obtain and create an EVE OS image: ==== Method 1: Direct Download ==== Download pre-built assets directly from the EVE OS GitHub releases page: * https://github.com/lf-edge/eve/releases * https://github.com/lf-edge/eve/tags === Mounting and Customizing the Raw Image (macOS) === After downloading, mount the ''.raw'' file using the following command: hdiutil attach -imagekey diskimage-class=CRawDiskImage 16.12.0-k-amd64.raw This mounts two volumes: ^ Volume ^ Purpose ^ | ''/Volumes/EVE'' | Where all customizations are performed | | ''/Volumes/INVENTORY'' | Empty on creation. Populated post-install with device info (model, serial, etc.) | === EVE Volume — File & Folder Structure === Navigate to ''/Volumes/EVE'' to find the following structure: /Volumes/EVE ├── DevicePortConfig/ │ └── override.json.template ├── grub.cfg ├── grub.cfg.tmpl ├── onboard.cert.pem ├── onboard.key.pem ├── origin.2026-04-14.16.12.0 ├── root-certificate.pem ├── server └── v2tlsbaseroot-certificates.pem === Key Files for Customization === ^ File ^ Purpose ^ | ''DevicePortConfig/override.json'' | Network configuration (rename from ''override.json.template''). Defines static IPs, VLANs, WiFi, etc. | | ''grub.cfg'' | Boot configuration and kernel parameters. See EVE OS GRUB documentation for full reference. | | ''server'' | Controller URL that EVE phones home to — e.g. ''zedcloud.gmwtus.zededa.net'' | === Ejecting the Image === hdiutil detach /dev/diskX # If the volume is busy: hdiutil detach /dev/diskX -force Replace ''diskX'' with the disk identifier assigned at mount time (e.g. ''disk4''). Run ''diskutil list'' to confirm. --- ==== Method 2: Docker Run ==== The Docker Run method provides more control over image creation and allows customization to be injected at build time. === Requirements === * Docker Desktop on macOS * On Windows: WSL + Docker Desktop with WSL filesystem navigation * A Docker Hub tag for the desired EVE OS version — browse available images at: https://hub.docker.com/r/lfedge/eve * Example tag: ''16.10.0-k-amd64'' === Overrides Folder Structure === Create a local folder (e.g. ''~/overrides'') that maps into the container at ''/in''. Customization files placed here are injected into the image at build time: overrides/ ← your local folder ├── DevicePortConfig/ │ └── override.json ← static network configuration ├── grub.cfg ← grub tweaks └── server ← controller URL === Creating a RAW Image === docker run --platform linux/amd64 \ --rm \ -v $HOME/overrides:/in \ lfedge/eve:16.10.0-k-amd64 \ -f raw installer_raw > 16.10.0-k-amd64.raw === Creating an ISO Image === docker run --platform linux/amd64 \ --rm \ -v $HOME/overrides:/in \ lfedge/eve:16.10.0-k-amd64 \ -f raw installer_iso > 16.10.0-k-amd64.iso --- ===== Network Configuration — override.json ===== Static network settings are configured in ''DevicePortConfig/override.json''. Rename the included template file to ''override.json'' before editing. Source of truth for all available fields: https://github.com/lf-edge/eve/blob/master/pkg/pillar/types/zedroutertypes.go ==== Example: Static IP, VLAN, and WiFi Configuration ==== The following example demonstrates a configuration with a static IP on a VLAN subinterface and WiFi management: { "TimePriority": "2000-01-01T00:00:00Z", "Version": 1, "Ports": [ { "IfName": "eth0", "IsMgmt": false, "IsL3Port": false }, { "Dhcp": 1, "IfName": "eth0.250", "IsMgmt": true, "IsL3Port": true, "Type": 4, "AddrSubnet": "192.168.0.100/24", "Gateway": "192.168.0.1", "DnsServers": ["1.1.1.1"], "L2Type": 1, "VLAN": { "ParentPort": "eth0", "ID": 250 } }, { "Dhcp": 4, "Free": true, "IfName": "wlan0", "Name": "Management2", "IsMgmt": true, "IsL3Port": true, "Type": 4, "WirelessCfg": { "WType": 2, "Wifi": [ { "KeyScheme": 1, "Password": "", "SSID": "WIFI-SSID" } ] } } ] } ==== WiFi Password Format ==== The WiFi password field must be in WPA2 PSK (Pairwise Master Key) format — a 64-character lowercase hex string derived using PBKDF2: PBKDF2(HMAC-SHA1, password, ssid, iterations=4096, keylen=32) Use the following Go Playground tool to generate a valid password hash: https://go.dev/play/p/EGyJ7PDU4rn The WiFi password in ''override.json'' is base64-encoded after PBKDF2 derivation. Ensure both encoding steps are applied correctly. --- ===== Reference Links ===== ^ Resource ^ URL ^ | EVE OS Releases | https://github.com/lf-edge/eve/releases | | Docker Hub — EVE Images | https://hub.docker.com/r/lfedge/eve | | EVE Networking Docs | https://github.com/lf-edge/eve/blob/master/docs/NETWORKING.md | | DevicePortConfig Source of Truth | https://github.com/lf-edge/eve/blob/master/pkg/pillar/types/zedroutertypes.go | | EVE Example Config Files | https://github.com/lf-edge/eve/tree/master/conf | | WiFi Password Generator | https://go.dev/play/p/EGyJ7PDU4rn |