-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·236 lines (203 loc) · 7.17 KB
/
install.sh
File metadata and controls
executable file
·236 lines (203 loc) · 7.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#!/usr/bin/env bash
#
# install.sh — One-command NullBox installer
#
# Usage:
# curl -fsSL https://nullbox.dev/install.sh | bash
# # or
# ./install.sh [--iso /path/to/nullbox.iso] [--memory 4096] [--cpus 4]
#
# Supports:
# - Linux (QEMU/KVM via libvirt + virt-manager)
# - macOS (UTM or QEMU via Homebrew)
set -euo pipefail
NULLBOX_VERSION="0.1.0"
ISO_URL="https://github.com/rohansx/nullbox/releases/download/v${NULLBOX_VERSION}/nullbox-x86_64.iso"
VM_NAME="nullbox"
MEMORY=4096
CPUS=4
ISO_PATH=""
# Parse args
for arg in "$@"; do
case "${arg}" in
--iso=*) ISO_PATH="${arg#*=}" ;;
--memory=*) MEMORY="${arg#*=}" ;;
--cpus=*) CPUS="${arg#*=}" ;;
esac
done
RED='\033[0;31m'
GREEN='\033[0;32m'
CYAN='\033[0;36m'
NC='\033[0m'
echo -e "${CYAN}"
echo " _ _ _ _ ____ "
echo " | \ | |_ _| | | __ ) _____ __"
echo " | \| | | | | | | _ \ / _ \ \/ /"
echo " | |\ | |_| | | | |_) | (_) > < "
echo " |_| \_|\__,_|_|_|____/ \___/_/\_\\"
echo -e "${NC}"
echo " The Operating System for AI Agents"
echo " v${NULLBOX_VERSION}"
echo ""
OS="$(uname -s)"
# ── Download ISO ──────────────────────────────────────────────────────────
download_iso() {
local dest="$1"
if [[ -n "${ISO_PATH}" && -f "${ISO_PATH}" ]]; then
echo " Using local ISO: ${ISO_PATH}"
cp "${ISO_PATH}" "${dest}"
return
fi
echo " Downloading NullBox ISO (~64MB)..."
if command -v curl &>/dev/null; then
curl -fSL -o "${dest}" "${ISO_URL}"
elif command -v wget &>/dev/null; then
wget -q -O "${dest}" "${ISO_URL}"
else
echo -e "${RED}error: curl or wget required${NC}"
exit 1
fi
echo -e " ${GREEN}Downloaded${NC}"
}
# ── Linux Install ─────────────────────────────────────────────────────────
install_linux() {
echo " Platform: Linux"
echo ""
# Check KVM
if [[ ! -e /dev/kvm ]]; then
echo -e "${RED}error: KVM not available. Enable VT-x/AMD-V in BIOS.${NC}"
exit 1
fi
# Install deps
if command -v pacman &>/dev/null; then
echo " Installing virt-manager (pacman)..."
sudo pacman -S --needed --noconfirm virt-manager qemu-desktop libvirt dnsmasq edk2-ovmf python-gobject 2>/dev/null || true
elif command -v apt &>/dev/null; then
echo " Installing virt-manager (apt)..."
sudo apt-get install -y virt-manager qemu-kvm libvirt-daemon-system 2>/dev/null || true
elif command -v dnf &>/dev/null; then
echo " Installing virt-manager (dnf)..."
sudo dnf install -y virt-manager qemu-kvm libvirt 2>/dev/null || true
else
echo " Please install virt-manager manually for your distro"
fi
# Enable libvirt
sudo systemctl enable --now libvirtd 2>/dev/null || true
sudo virsh net-start default 2>/dev/null || true
# Download ISO
ISO_DEST="/var/lib/libvirt/images/nullbox.iso"
sudo mkdir -p /var/lib/libvirt/images
download_iso "/tmp/nullbox.iso"
sudo mv /tmp/nullbox.iso "${ISO_DEST}"
sudo chmod 644 "${ISO_DEST}"
# Remove existing VM
sudo virsh destroy "${VM_NAME}" 2>/dev/null || true
sudo virsh undefine "${VM_NAME}" 2>/dev/null || true
# Create VM
echo " Creating NullBox VM (${MEMORY}MB RAM, ${CPUS} CPUs)..."
sudo virt-install \
--name "${VM_NAME}" \
--memory "${MEMORY}" \
--vcpus "${CPUS}" \
--cpu host-passthrough \
--cdrom "${ISO_DEST}" \
--os-variant linux2022 \
--network network=default,model=virtio \
--graphics spice \
--video virtio \
--disk none \
--noautoconsole \
--boot cdrom 2>/dev/null
echo ""
echo -e "${GREEN} NullBox is running!${NC}"
echo ""
echo " Open the console:"
echo " virt-manager"
echo ""
echo " Or connect via serial:"
echo " sudo virsh console nullbox"
echo ""
echo " Stop:"
echo " sudo virsh destroy nullbox"
echo ""
echo " Start again:"
echo " sudo virsh start nullbox"
}
# ── macOS Install ─────────────────────────────────────────────────────────
install_macos() {
echo " Platform: macOS"
echo ""
ARCH="$(uname -m)"
# Check for UTM first (preferred on macOS)
if [[ -d "/Applications/UTM.app" ]]; then
echo " Found UTM — using it for NullBox VM"
install_macos_utm
return
fi
# Check for QEMU via Homebrew
if command -v qemu-system-x86_64 &>/dev/null; then
echo " Found QEMU — using it for NullBox VM"
install_macos_qemu
return
fi
# Neither found — install UTM
echo " Installing UTM (VM manager for macOS)..."
if command -v brew &>/dev/null; then
brew install --cask utm
install_macos_utm
else
echo ""
echo " Install UTM from: https://mac.getutm.app/"
echo " Or install Homebrew: https://brew.sh"
echo ""
echo " Then run this script again."
exit 1
fi
}
install_macos_utm() {
local iso_dest="${HOME}/Library/Containers/com.utmapp.UTM/Data/Documents/nullbox.iso"
mkdir -p "$(dirname "${iso_dest}")" 2>/dev/null || true
# For UTM, just download the ISO and tell the user to import it
download_iso "${HOME}/Downloads/nullbox.iso"
echo ""
echo -e "${GREEN} ISO downloaded to ~/Downloads/nullbox.iso${NC}"
echo ""
echo " To create the VM in UTM:"
echo " 1. Open UTM"
echo " 2. Click '+' → Virtualize (Intel Mac) or Emulate (Apple Silicon)"
echo " 3. Select 'Linux'"
echo " 4. Browse to ~/Downloads/nullbox.iso"
echo " 5. Set RAM to ${MEMORY}MB, CPUs to ${CPUS}"
echo " 6. Uncheck 'Enable hardware OpenGL acceleration'"
echo " 7. Click 'Save' then 'Play'"
echo ""
echo " Note: On Apple Silicon, NullBox runs in emulation mode (slower)."
echo " For native ARM64 support, build with: ./kernel/scripts/build-kernel.sh --arch aarch64"
}
install_macos_qemu() {
download_iso "/tmp/nullbox.iso"
echo ""
echo -e "${GREEN} Starting NullBox in QEMU...${NC}"
echo ""
local accel="tcg"
if [[ "$(uname -m)" == "x86_64" ]]; then
# Intel Mac — can use HVF
accel="hvf"
fi
echo " Run:"
echo " qemu-system-x86_64 \\"
echo " -accel ${accel} -m ${MEMORY} -smp ${CPUS} \\"
echo " -nographic -serial mon:stdio \\"
echo " -cdrom /tmp/nullbox.iso \\"
echo " -nic user,model=virtio,hostfwd=tcp::19100-:9100"
}
# ── Dispatch ──────────────────────────────────────────────────────────────
case "${OS}" in
Linux) install_linux ;;
Darwin) install_macos ;;
*)
echo -e "${RED}Unsupported platform: ${OS}${NC}"
echo "NullBox supports Linux and macOS."
exit 1
;;
esac