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 выходит дешевле потом при не огромном потоке на перезапись. Но последнее это чисто личный опыт — не навязываю.
Можно установить чистый 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.
Зы. Веду
Периодически обновляю.
Зы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
Proxmox VE обновился до версии 6.3