Pull to refresh

Comments 9

Планирую прикупит себе HPE Microserver gen 10 plus. Оказалось, что esxi не поддерживает там встроенный raid. Кто-то знает, может ли proxmox дома быть полноценной заменой esx? Есть какие-то важные особенности о которых стоит знать заранее?

Используем проксмокс где-то два года. Соскочили с OpenStack за ненадобностью и громоздкостью.
Замечания которых мне не хватало в самом начале:


  • openvswitch вместо bridge
  • под ceph лучше отдельные ноды
  • lvm-cache круто, но может посыпаться внезапно — лучше просто ssd
  • программно-определяемые сети пока не про них (то что есть, не имеет практически никакого адекватного функционала по управлению сетью), так что на это лучше не рассчитывать
  • lxc вместо виртуалок действительно может хватать, а производительность не страдает
  • и без подписки прекрасно
  • это Debian, но есть особенности с пересекаемыми пакетами (типа qemu), хотя дрова на рейд поднялись легко
  • не спешите на старом железе удалять старые ядра (хотя с переходом на 5.4 проблем с запуском не было)
  • это не то же самое, что и esxi, но основные понятия пересекаются
  • Victoria Metrics оказывается (ирония) может собирать данные как Influx, но дашборды не подойдут (однако я написал оный и выложил в офф стор)
  • не заморачивайтесь с всплывающим окном о подписке: обновления всё равно сломает, а не так уж оно и мешает.

Надеюсь вам будет полезно. Ещё бы конечно кто добавил, особенно пользовавшийся esxi.

Lvm-cache давно хотел попробовать, не расскажите что с ним не так?
Разве proxmox не на zfs?
Вы имеете в виду использовать полностью только ssd? Не дороговато?

lvm-cache крут, но при условии всегда корректном выключении питания и записи блоками, если не страшны задержки (время поиска в метаданных, потом в кеше, потом на диске). Отдельная боль это удаление диска с кешем — всё колом на это время. Ну и раздел с подключенным кешем полностью фиксируется по размеру. Хотите изменить, поменять диск и т.п.? Удаляйте кеш-диск, меняйте размер и включайте кеш назад. Если во время этого произойдёт затык, то пиши пропало.
У меня диск с кешем для 2Тб — 10%. 2 часа нужно для удаления диска с кешем. В общем сырой в удобстве, но справедливости ради — очень полезный в хозяйстве, когда данных много, а денег мало.


Насчёт zfs. Я ставил на lvm+ext4, потому что знаю этот стек. ZFS для реального быстродействия требует RAM и надёжное питание, которое я ей обеспечить не мог.


SSD сейчас не настолько дорогие, но с lvm можно сэкономить на raid и дисках. Практика показывает, что портятся они примерно одинаково, поэтому вместо костылей реально ssd выходит дешевле потом при не огромном потоке на перезапись. Но последнее это чисто личный опыт — не навязываю.

Proxmox поддреживает не только zfs.
Можно установить чистый debian на mdraid, а поверх из пакетов накатить proxmox.

Для одиночного домашнего гипервизора proxmox будет не хуже esxi. А может даже и лучше. Меня он полностью устраивает дома.

Всем привет.
Пользуем Proxmox VE более 6 лет. Также пользуем Proxmox Mail Gateway (стоит перед связкой Sogo + postfix + dovecot + apache solr + apache tika + tesseract OCR — привет, Zimbra) и с релизом 1.0 — Proxmox Backup Server.

Зы. Веду недовики по Proxmox, ZFS, кластеризации, pfsense\opnsense — forum.netgate.com/topic/120102/proxmox-ceph-zfs-pfsense-%D0%B8-%D0%B2%D1%81%D0%B5-%D0%B2%D1%81%D0%B5-%D0%B2%D1%81%D0%B5/
Периодически обновляю.

Зы2. Если интересно, могу выложить скрипт по замене диска(-ов) в zfs (root-пуле и обычном) для Proxmox-а. Писал для себя, но могу поделиться.
Скрипт в любом случае будет интересен. Поделитесь, пожалуйста.
Добрый.
Скрипт по замене сбойного диска(-ов) в ZFS-пуле(-ах) или для замены дисков на более емкие с последующим расширением пула после замены всех дисков в пуле (команда zpool set autoexpand=on и далее).
Писался для себя в свободное время. Прошу строго не судить.
Пользовать на свой страх и риск.

#!/usr/bin/env bash
#http://redsymbol.net/articles/unofficial-bash-strict-mode/
#set -euxo pipefail
set -euo pipefail

#Colors
BK=$'\e[30m'
RD=$'\e[31m'
GR=$'\e[32m'
YE=$'\e[33m'
BL=$'\e[34m'
MA=$'\e[35m'
CY=$'\e[36m'
WT=$'\e[01;37m'
LRD=$'\e[01;31m'
LGR=$'\e[01;32m'
LYE=$'\e[01;33m'
LBL=$'\e[01;34m'
LGY=$'\e[37m'
LCY=$'\e[96m'
BRD=$'\e[41m'
BGR=$'\e[42m'
BYE=$'\e[43m'
BBL=$'\e[44m'
BMA=$'\e[45m'
BCY=$'\e[46m'
BLGR=$'\e[47m'
BDGR=$'\e[100m'
BLYE=$'\e[103m'
BLBL=$'\e[104m'
RST=$'\e[0m'

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

clear

if [[ "$(id -u)" != "0" ]]; then
    printf "This script must be run as root!\n"
    exit 1
fi

pause() {
   read -r -p "$*"
}

spinner() {
    pid=$!
    spin='-\|/'
    i=0
    while kill -0 $pid 2>/dev/null
    do
        i=$(( (i+1) %4 ))
        printf "${WT}[${spin:$i:1}]\rSearch for hot-plugged disk(s), please wait${RST} "
        sleep .1
    done
}


LISTPOOLS="$(zpool list -H -o name)"
if [ ! "${LISTPOOLS}" ]; then
   printf '%s\n' "${LYE}No pools were found!${RST}"
   exit 0
fi

if ! zpool list -H -o health | grep -v -q 'ONLINE'; then
  printf '%s\n' "${BGR}${WT}Pool(s) looks good :)${RST}"
  printf "\n\n"
  zpool status -LP | sed "s/\(ONLINE\)/${BGR}${WT}\1${RST}/g"
  printf "\n"
  exit 0
fi

tput cuu1; tput el; read -r -p "${WT}Search for hot-plugged device(s)? [y/N]:${RST} " YN
if [[ "${YN}" =~ ^[yY]$ ]]; then
  ( for host in /sys/class/scsi_host/*; do echo "- - -" | tee "${host}/scan"; done ) >/dev/null 2>&1 & spinner
  printf "\n\n"
fi

mapfile -t POOL_DEGRADED < <(zpool list -H | awk '!/ONLINE/{print $1}')
printf '%s\n' "${WT}Pool(s) status:${RST}"
printf "\n"

mapfile -t COLOR_POOL < <(zpool list -H -o name)
mapfile -t COLOR_POOL < <(printf '%s\n' "${COLOR_POOL[*]}" | sed "s/ /\\\|/g")

mapfile -t COLOR_MIRROR < <(zpool status -LP | awk '/mirror|raidz/{print $1" "$2}'| awk '!/ONLINE/{print $1}')
mapfile -t COLOR_MIRROR < <(printf '%s\n' "${COLOR_MIRROR[*]}" | sed "s/ /\\\|/g")

for POOL in ${POOL_DEGRADED[@]}; do
 zpool status -L ${POOL} \
  | awk '/NAME/{while(getline line) {if (line !~/NAME|^$/) print line; else break}}' \
  | sed "/\("${COLOR_POOL}"\)/ s/\(DEGRADED\)/${BRD}${BK}\1${RST}/g" \
  | sed "/\("${COLOR_MIRROR}"\)/ s/\(DEGRADED\)/${BYE}${BK}\1${RST}/g" \
  | sed "s/\(ONLINE\)/${BGR}${WT}\1${RST}/g" \
  | sed "s/\(FAULTED\|OFFLINE\|UNAVAIL\|REMOVED\|FAIL\|DESTROYED\|corrupt\|cannot\|unrecover\)/${BLBL}${BK}\1${RST}/g"
  printf "\n"
done

printf "\n"
while true; do
  tput cuu1; tput el; read -r -p "1) Enter ${BRD}${BK}DEGRADED${RST} [$(printf '%s\n' "${POOL_DEGRADED[@]}" | sed ':a;N;$!ba;s/\n/\//g')]: " POOL
  if printf '%s\n' "${POOL_DEGRADED[@]}" | grep -x -q "${POOL}"; then
    break
  fi
done
printf "\n"

mapfile -t MIRROR_DEGRADED < <(zpool status -LP -v $POOL | awk '/mirror|raidz/{print $1" "$2}'| awk '!/ONLINE/{print $1}')
printf "\n"
while true; do
  tput cuu1; tput el; read -r -p "2) Enter ${BYE}${BK}DEGRADED${RST} [$(printf '%s\n' "${MIRROR_DEGRADED[@]}" | sed ':a;N;$!ba;s/\n/\//g')]: " NAME
  if printf '%s\n' "${MIRROR_DEGRADED[@]}" | grep -x -q "${NAME}"; then
    break
  fi
done
printf "\n"

mapfile -t ONLINE_DEVICE < <(
 zpool status -L ${POOL} | awk '/'${NAME}'.*DEGRADED/{print; while(getline line) {if (line !~/mirror|raidz|^$/) print line; else break}}' \
 | awk '/ONLINE/{print $1}' | awk '!/mirror|raidz|^$/{print $1}'
)

printf "\n"
while true; do
  tput cuu1; tput el; read -r -p "3) Enter ${BGR}${WT}ONLINE${RST} [$(printf '%s\n' "${ONLINE_DEVICE[@]}" | sed ':a;N;$!ba;s/\n/\//g')]: " SOURCE
  if printf '%s\n' "${ONLINE_DEVICE[@]}" | grep -x -q "${SOURCE}"; then
    SOURCE_COLOR="${SOURCE}"
    SOURCE="${SOURCE%%[0-9]*}"
    break
  fi
done

mapfile -t ONLINE_DEVICE < <(zpool status -LP -v | awk '/ONLINE/{print $1}' | awk '/\/dev\//{print}' | sed -E "s/([0-9]+?|\/dev\/)//g")
mapfile -t TARGET_DEVICE < <(lsblk -S -o NAME,TYPE | awk '/disk/{print $1}')

mapfile -t TARGET_DEVICE < <(printf '%s\n' "${TARGET_DEVICE[@]}" "${ONLINE_DEVICE[@]}" | sort | uniq -u)
mapfile -t TARGET_COLOR_DEVICE < <(printf '%s\n' "${TARGET_DEVICE[*]}" | sed "s/ /\\\|/g")

printf "\n"

lsblk -o NAME,SIZE,TYPE | grep -E -w "disk|part" | sed "0,/${SOURCE_COLOR}/s//${BGR}${WT}${SOURCE_COLOR}${RST}/" | sed "s/\("${TARGET_COLOR_DEVICE[*]}"\)/${BCY}${WT}\1${RST}/g"
printf "\n\n"

while true; do
  tput cuu1; tput el; read -r -p "4) Enter ${BCY}${WT}TARGET${RST} [$(printf '%s\n' "${TARGET_DEVICE[@]}" | sed ':a;N;$!ba;s/\n/\//g')]: " TARGET
  if printf '%s\n' "${TARGET_DEVICE[@]}" | grep -x -q "${TARGET}"; then
    printf "\n"
    fdisk -l "/dev/${TARGET}" | sed "s/\("${TARGET}"\)/${BCY}${WT}\1${RST}/g"
    break
  fi
done
printf "\n"

mapfile -t FAILED_DEVICE < <(
  zpool status -LP ${POOL} \
  | awk '/'${NAME}'.*DEGRADED/{while(getline line) {if (line !~/mirror|raidz|^$/) print line; else break}}' \
  | awk '!/ONLINE/{print $1}'
)

mapfile -t FAILED_DEVICE_STATE < <(
  zpool status -LP ${POOL} \
  | awk '/'${NAME}'.*DEGRADED/{while(getline line) {if (line !~/mirror|raidz|^$/) print line; else break}}' \
  | awk '!/ONLINE/{print $2}'
)

printf "\n"
while true; do
  tput cuu1; tput el; read -r -p "5) Enter ${BLBL}${BK}$(printf '%s\n' "${FAILED_DEVICE_STATE[@]}"${RST} | sed ':a;N;$!ba;s/\n/\//g') [$(printf '%s\n' "${FAILED_DEVICE[@]}" | sed ':a;N;$!ba;s/\n/\//g')]: " FAILED
  if printf '%s\n' "${FAILED_DEVICE[@]}" | grep -x -q "${FAILED}"; then
    zpool offline -f ${POOL} "${FAILED}"
    break
  fi
done
printf "\n"

NEW_DEVICE="$(ls -l /dev/disk/by-id | awk '/\/'${TARGET}'$/{print $9; exit}')"
printf "\n"
while true; do
  tput cuu1; tput el; read -r -p "6) The device ${BLBL}${BK}${FAILED}${RST} will be replaced with a ${BCY}${WT}${TARGET}${RST} device? Type without quotes 'YES' or 'no': " YN
  if [[ "${YN}" == 'YES' || "${YN}" == 'no' ]]; then
    case "${YN}" in
      YES)
        printf "\n"
        sgdisk -Z "/dev/${TARGET}"

        if [[ -z $(sgdisk -p "/dev/${SOURCE}" | sed -e "0,/^Number/d" | awk '!/BF01|BF07/{print $1}') ]]; then
          sgdisk -G "/dev/${TARGET}"
          zpool replace -f ${POOL} "${FAILED}" "${NEW_DEVICE}" &
        else
          sgdisk -R "/dev/${TARGET}" "/dev/${SOURCE}"
          sgdisk -G "/dev/${TARGET}"

          mapfile -t PART_NUMBER < <(sgdisk -p "/dev/${SOURCE}" | sed -e "0,/^Number/d" | awk '!/BF01|BF07/{print $1}')
          for PART_NUMBER in ${PART_NUMBER[*]}; do
            printf "\n"
            lsblk | awk '/'${SOURCE}''$PART_NUMBER'/ {print $1" "$4}'
            dd if="/dev/${SOURCE}$PART_NUMBER" bs=512K | dd of="/dev/${TARGET}$PART_NUMBER" bs=512K
          done

          printf "\n"
          mapfile -t PART_NUMBER < <(sgdisk -p "/dev/${TARGET}" | awk '/BF01|BF07/{print $1}')
          for PART_NUMBER in ${PART_NUMBER[*]}; do
            zpool replace -f ${POOL} "${FAILED}" "${NEW_DEVICE}-part$PART_NUMBER" &
          done
        fi
        ;;

      no)
        printf "\n"
        exit 0
        ;;
    esac
    break
  fi
done

printf "\n"
zpool status -LP -v 5 2
Sign up to leave a comment.