Ich verwende Ubuntu in einer virtuellen Maschine und möchte CPU und RAM hinzufügen, ohne das Gerät neu zu starten. Wie kann ich diese neue virtuelle Hardware per Hotplug anschließen?
Antwort1
Diese können durch die Verwendung des /sys
Dateisystems mit Root-Anmeldeinformationen aktiviert werden.
Für die CPU ändern Sie das 0
in 1
die entsprechende Datei des Musters: /sys/devices/system/cpu/cpu*/online
.
Beim RAM ermitteln Sie den Zustand in den Dateien /sys/devices/system/memory/memory*/state
und ändern den Inhalt von offline auf online.
Das folgende Skript schaltet die gesamte CPU und den gesamten RAM für Sie online.
#!/bin/bash
# Based on script by William Lam - http://engineering.ucsb.edu/~duonglt/vmware/
# Bring CPUs online
for CPU_DIR in /sys/devices/system/cpu/cpu[0-9]*
do
CPU=${CPU_DIR##*/}
echo "Found cpu: '${CPU_DIR}' ..."
CPU_STATE_FILE="${CPU_DIR}/online"
if [ -f "${CPU_STATE_FILE}" ]; then
if grep -qx 1 "${CPU_STATE_FILE}"; then
echo -e "\t${CPU} already online"
else
echo -e "\t${CPU} is new cpu, onlining cpu ..."
echo 1 > "${CPU_STATE_FILE}"
fi
else
echo -e "\t${CPU} already configured prior to hot-add"
fi
done
# Bring all new Memory online
for RAM in $(grep line /sys/devices/system/memory/*/state)
do
echo "Found ram: ${RAM} ..."
if [[ "${RAM}" == *":offline" ]]; then
echo "Bringing online"
echo $RAM | sed "s/:offline$//"|sed "s/^/echo online > /"|source /dev/stdin
else
echo "Already online"
fi
done
Antwort2
Anstatt die Kernel-Parameter zu bedienen, können Sie Hotplug-CPU oder -Speicher automatisch aktivieren, indem Sie Udev-Regeln verwenden:
/etc/udev/rules.d/94-hotplug-cpu-mem.rules
:
ACTION=="add", SUBSYSTEM=="cpu", ATTR{online}=="0", ATTR{online}="1"
ACTION=="add", SUBSYSTEM=="memory", ATTR{state}=="offline", ATTR{state}="online"
Getestet auf CentOS 6/7, Ubuntu 14.
Debian 7 ist aus unbekanntem Grund abgestürzt.Weitere Tests wären erforderlich.
Antwort3
Anstatt ein Skript zu erstellen und aufzubewahren, können Sie diesen einzeiligen Befehl ausführen (es kann auch ein Skript sein, wenn Sie möchten). Ich habe gerade eines für den Speicher eingegeben (man kann dies auch einfach in CPU ändern):
grep line /sys/devices/system/memory/*/state |grep offline |awk -F '\/' '{print $6}' |while read xx; do echo online >/sys/devices/system/memory/$xx/state ; done