Skip to content

Microsoft Azure

Arrow produces a fixed-size VHD image for Azure. Azure requires this format for managed images.

Each Arrow Azure build produces a ZIP package containing:

  • The disk image (.vhd)
  • Deployment instructions (text file)
  • An automated deploy script (bash for macOS/Linux, PowerShell for Windows)

ToolInstall Link
Azure CLI (az)Install Azure CLI
AzCopyInstall AzCopy

Authenticate before running any commands:

Terminal window
az login

Extract the ZIP and run the deploy script:

Terminal window
unzip kali-arrow-client-azure-*.zip
cd kali-arrow-client-azure-*/
chmod +x deploy-to-azure.sh
Terminal window
./deploy-to-azure.sh

The script will interactively guide you through:

  1. Resource Group — Select existing or create new
  2. Region — Auto-detected from existing RG, or choose from common regions
  3. Storage Account — Select existing or create new
  4. VHD Upload — Uses azcopy for fast sparse page blob upload (skips zero-filled pages)
  5. Managed Image Creation — Creates an Azure Managed Image from the VHD
  6. VM Launch — Optionally launch a VM with interactive VNet, Subnet, NSG, SSH key, and VM size selection
  7. Cleanup — Optionally remove the uploaded VHD blob from storage

Launch a VM from a previously imported Arrow image:

Terminal window
# Interactive — lists available Arrow images
./deploy-to-azure.sh --launch
# Specify image name directly
./deploy-to-azure.sh --launch kali-arrow-client-20260304-153000

Remove all Arrow deployment resources from Azure:

Terminal window
./deploy-to-azure.sh --cleanup

Scans for and offers to delete:

  • Arrow managed images
  • VMs created from Arrow images
  • VHD blobs in storage accounts

Terminal window
# Extract the ZIP
Expand-Archive kali-arrow-client-azure-*.zip -DestinationPath .\azure-deploy
# Run the script
cd azure-deploy
.\Deploy-To-Azure.ps1

Same modes are available:

Terminal window
# Import (default)
.\Deploy-To-Azure.ps1
# Launch a VM
.\Deploy-To-Azure.ps1 -Launch
# Launch a specific image
.\Deploy-To-Azure.ps1 -Launch -ImageName "kali-arrow-client-20260304-153000"
# Cleanup all Arrow resources
.\Deploy-To-Azure.ps1 -Cleanup

If you prefer to run the commands yourself:

Terminal window
# Create a storage container
az storage container create \
--account-name <storage_account> \
--name vhds \
--auth-mode key
# Upload using azcopy (recommended — skips zero pages for fast upload)
azcopy copy "kali-arrow-client-azure.vhd" \
"https://<storage_account>.blob.core.windows.net/vhds/kali-arrow-client.vhd?<SAS_TOKEN>" \
--blob-type PageBlob
Terminal window
az image create \
--resource-group <resource_group> \
--name kali-arrow-client \
--os-type Linux \
--source "https://<storage_account>.blob.core.windows.net/vhds/kali-arrow-client.vhd" \
--location <region>
Terminal window
az vm create \
--resource-group <resource_group> \
--name kali-arrow-vm \
--image kali-arrow-client \
--size Standard_D4s_v3 \
--admin-username <username_from_portal> \
--authentication-type ssh \
--ssh-key-name <your_key> \
--vnet-name <vnet> \
--subnet <subnet>

SizevCPURAMUse Case
Standard_D4s_v3416 GBRecommended
Standard_D8s_v3832 GBHigh performance
Standard_D16s_v31664 GBMaximum performance

IssueSolution
azcopy not foundInstall from AzCopy downloads
Upload takes very longEnsure you’re using azcopy with --blob-type PageBlob (skips zero pages)
VHD size is 120GBExpected. Azure requires fixed-size VHDs. Actual data is ~30-40GB. azcopy only transfers non-zero pages.
”The VHD must be aligned to a 1 MB boundary”Arrow VHDs are built with force_size which ensures correct alignment
Can’t SSH into the VMEnsure the NSG allows inbound port 22
Password doesn’t workCredentials are generated at build time. Retrieve them from the ARROW Portal under your device’s details page.