====== Запуск старых KVM-консолей Supermicro (X8/X9) на Linux ====== Старые серверы Supermicro (на базе платформ X8 и X9) используют IPMI-контроллеры с iKVM-консолями на базе Java (ATEN). Эти консоли используют устаревшие технологии сжатия (Pack200) и параметры виртуальной машины, которые были удалены в современных версиях Java. Эта инструкция описывает, как запустить такую консоль на современном Linux (например, Debian 12), используя «правильную» (расово верную) Java и автоматический скрипт-парсер. ===== 1. Подготовка окружения (Установка Java) ===== Для работы нам понадобятся две вещи: * **Java 8** для запуска самого приложения. * Инструмент ''unpack200'' для распаковки старых файлов ''*.pack.gz'' (в современных OpenJDK его удалили). В Debian 12 (и производных) проще всего установить пакет от NVIDIA, который содержит нужный нам инструмент: sudo apt update sudo apt install nvidia-openjdk-8-jre После установки ''unpack200'' будет доступен по пути: ''/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/unpack200'' ===== 2. Скрипт автоматизации (ipmi.sh) ===== Скрипт читает ''.jnlp'' файл, скачанный из веб-интерфейса IPMI, автоматически извлекает из него IP-адрес сервера и имена нужных JAR-файлов, скачивает их, распаковывает и запускает консоль. #!/bin/bash if [ "$#" -ne 3 ]; then echo "Использование: $0 <путь_к_jnlp> <логин> <пароль>" exit 1 fi JNLP_FILE="$1" USER="$2" PASS="$3" if [ ! -f "$JNLP_FILE" ]; then echo "Ошибка: файл $JNLP_FILE не найден." exit 1 fi # Удаляем возможные символы возврата каретки (Windows) sed -i 's/\r$//' "$JNLP_FILE" # 1. Извлекаем IP-адрес (codebase) CODEBASE=$(grep -oP 'codebase="[^"]+"' "$JNLP_FILE" | head -1 | cut -d'"' -f2) IP=$(echo "$CODEBASE" | sed -E 's|https?://||' | cut -d':' -f1 | cut -d'/' -f1) PORT=$(echo "$CODEBASE" | sed -E 's|https?://[^:/]+:?||' | cut -d'/' -f1) if [ -z "$PORT" ]; then PORT="80"; fi # 2. Извлекаем имя основного JAR JAR_NAME=$(grep -oP ']*>' "$JNLP_FILE" | tr -d '\n' | grep -oP 'href="[^"]+"' | head -1 | cut -d'"' -f2) if [ -z "$JAR_NAME" ]; then JAR_NAME=$(grep -oP 'href="[^"]+\.jar[^"]*"' "$JNLP_FILE" | head -1 | cut -d'"' -f2) fi # 3. Извлекаем имя нативной библиотеки для Linux x86_64 NAT_NAME=$(awk '//,/<\/resources>/' "$JNLP_FILE" | grep -oP 'href="[^"]+"' | head -1 | cut -d'"' -f2) if [ -z "$NAT_NAME" ]; then NAT_NAME=$(awk '//' "$JNLP_FILE" | grep -oP 'href="[^"]+"' | head -1 | cut -d'"' -f2) fi # Очищаем имена от возможных суффиксов JAR_BASE=$(echo "$JAR_NAME" | sed 's/\.pack\.gz$//;s/\.pack$//;s/\.jar$//') NAT_BASE=$(echo "$NAT_NAME" | sed 's/\.pack\.gz$//;s/\.pack$//;s/\.jar$//') if [ -z "$JAR_BASE" ] || [ -z "$NAT_BASE" ]; then echo "Ошибка: не удалось найти JAR или нативную библиотеку в JNLP." exit 1 fi WORK_DIR="/tmp/ikvm_${IP}" mkdir -p "$WORK_DIR" cd "$WORK_DIR" || exit 1 echo "[*] Сервер: $IP:$PORT" echo "[*] Основной JAR: ${JAR_BASE}.jar" echo "[*] Нативная библиотека: ${NAT_BASE}.jar" # 4. Скачивание и распаковка for BASE in "$JAR_BASE" "$NAT_BASE"; do if [ ! -f "${BASE}.jar" ]; then echo "[*] Скачивание ${BASE}.jar.pack.gz..." wget -q "http://${IP}:${PORT}/${BASE}.jar.pack.gz" -O "${BASE}.jar.pack.gz" if [ $? -eq 0 ]; then gunzip -f "${BASE}.jar.pack.gz" /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/unpack200 "${BASE}.jar.pack" "${BASE}.jar" 2>/dev/null rm -f "${BASE}.jar.pack" else echo "[*] Файл ${BASE}.jar.pack.gz не найден, пробуем ${BASE}.jar..." wget -q "http://${IP}:${PORT}/${BASE}.jar" fi fi done # 5. Извлечение нативной библиотеки .so if [ -f "${NAT_BASE}.jar" ]; then unzip -o -q "${NAT_BASE}.jar" fi if [ ! -f "${JAR_BASE}.jar" ]; then echo "Ошибка: главный JAR файл не найден." exit 1 fi # 6. Запуск консоли echo "[*] Запуск консоли..." java -Djava.library.path=. -cp "${JAR_BASE}.jar" tw.com.aten.ikvm.KVMMain "$IP" "$USER" "$PASS" null 5900 623 2 0 Не забудьте сделать скрипт исполняемым после скачивания: chmod +x ipmi.sh ===== 3. Как пользоваться ===== - Зайдите в веб-интерфейс вашего IPMI (например, ''http://10.101.0.28''). - Нажмите кнопку запуска KVM-консоли, чтобы браузер скачал файл ''launch.jnlp''. - Запустите скрипт, передав ему путь к скачанному файлу, ваш логин и пароль: ./ipmi.sh ~/Загрузки/launch.jnlp ADMIN ВАШ_ПАРОЛЬ Скрипт сам скачает нужные файлы с сервера, распакует их и откроет окно удаленной консоли. ===== 4. Если что-то пошло не так ===== * **Ошибка ''Usage: IP USER_NAME PASSWORD PORT''**: означает, что вы запустили Java-класс вручную без аргументов. Используйте скрипт, он передает все нужные параметры. * **Ошибка ''UnsupportedOperationException: Pack200''**: вы пытаетесь запустить консоль через ''javaws''. Используйте только скрипт, он обходит эту проблему, распаковывая файлы вручную. * **Ошибка ''ArrayIndexOutOfBoundsException''**: в старых версиях iKVM требуется передавать ровно 8 параметров. В скрипте это уже учтено.