Примітка. Відновлення старого фізичного сервера, перемістивши його на віртуальну машину на Proxmox VE. Створення iSCSI диску та його монтування при завантажені операційної системи. FreeBSD 9.0.
Історія
Основне правило адміністратора, працює не чіпай. Призводить то того що рано чи пізно це вилазить боком. На кшталт не можеш нічого оновити та встановити.
Тому мені історично діставався цей сервер котрий треба перемістити до віртуального середовища поки "/raid1" масив ще працює після нового його збою, але варто зауважити міцний горішок.
Є декілька способів як перемістити систему з фізичного до віртуального. Але я не хотів переносити усі накопиченні проблеми, і вирішив перенести все окрім ядра та базової системи використовуючи rsync.
До віртуальної машини
Сервер ще живий, операційна система FreeBSD 9.0. Тому я створив з архівного ISO чисту віртуальну машину.
FreeBSD 9.0 (amd64): Default (i440fx), CPU (x86-64-v2-AES), SCSI Controler LSI 53C895A, SCSI disk writeback cache, Ethernet Intel E1000E.
Ось тільки так операційна система завантажилася.
Два мережевих інтерфейси для того, щоб основний інтерфейс вести в офлайн (link_down=1), а інший використати для підключення через SSH (ecdsa-sha2-nistp256) та підключення iSCSI диска.
Адаптуємо віртуальну машину
Bridge - vmbr0 має в налаштуваннях MTU 9000. Тому й у віртуальній машині використано для мережевого адаптера MTU 9000 для ефективності iSCSI через те, що фізична мережа у гіпервізора Proxmox VE - 10 Гб/c і це дало приріст швидкості у два рази.
Додатково вимкнув перевірку контрольних сум мережевим адаптером у віртуальному середовищі:
ifconfig_em1_ipv6="inet6 XXXX:YYYY::101/64 mtu 9000 -txcsum -rxcsum -lro -tso"
Операційна система при завантажені перевіряла пам'ять і це робило певну затримку відключив це
boot/loader.conf : hw.memtest.tests=0
iSCSI
Для можливості приміщення віртуальної машини по кластеру Proxmox, прийнято рішення не створювати локальний диск розміром "1 TB" і робити його періодичну ZFS реплікацію на інші ноди кластеру, а створити мережевий iSCSI диск на NAS сервері (TrueNAS Scale) і змонтувати його у віртуальному середовищі.
![]() |
TrueNAS Scale - iSCSI |
Конфігурація iSCSI в VM
Для підключення iSCSI диска, завантажую модуль ядра iscsi_initiator_load. Додаткових програм я вже поставити не можу, тому маю те що маю.
Перевірка що завантажується модуль:
kldload iscsi_initiator_loadАвтоматичне завантаження:
boot/loader.conf : iscsi_initiator_load=YES
Налаштування iSCSI ініціатора:
/etc/iscsi.conf:
raid1old50 { TargetAddress = nas-server.local TargetName = iqn.2005-10.org.freenas.ctl:raid1old50 }
Монтування при завантаженні:
#!/bin/sh | |
# | |
# PROVIDE: iscsi_mount | |
# REQUIRE: NETWORKING | |
# BEFORE: LOGIN | |
# KEYWORD: shutdown | |
. /etc/rc.subr | |
name="iscsi_mount" | |
rcvar="iscsi_mount_enable" | |
start_cmd="iscsi_mount_start" | |
stop_cmd="iscsi_mount_stop" | |
CONFIG_FILE="/etc/iscsi.conf" | |
iscsi_target_name="raid1old50" | |
device="/dev/gpt/raid1" | |
pidfile="/var/run/${name}.pid" | |
iscsi_mount_start_mount() { | |
# mount the iSCSI disk | |
if ! mount | grep -q "${device}"; then | |
echo "Mounting iSCSI disk..." | |
sync | |
sleep 2 | |
max_retries=20 # Maximum number of retries | |
retry_count=0 # Initial retry count | |
while ! mount ${device}; do | |
mount_status=$? | |
if [ $mount_status -eq 0 ]; then | |
echo "${device} mounted successfully." | |
break | |
fi | |
if [ $mount_status -eq 2 ]; then | |
echo "Mount busy." | |
# Increment the retry counter | |
retry_count=$((retry_count + 1)) | |
# Check if the maximum retry count is reached | |
if [ $retry_count -ge $max_retries ]; then | |
echo "Failed to mount ${device} after $max_retries attempts." | |
break | |
fi | |
echo "Waiting for ${device} to become mounted (attempt $retry_count)..." | |
sleep 2 | |
fi | |
if [ $mount_status -eq 1 ]; then | |
echo "Mount failed. Running fsck on $filesystem..." | |
# Run fsck with the -y option to automatically answer 'yes' to prompts | |
fsck -y "${device}" | |
sync | |
sleep 2 | |
# Attempt to mount again after fsck | |
if mount "${device}"; then | |
echo "Mount successful after fsck." | |
else | |
echo "Mount failed again after fsck." | |
fi | |
fi | |
done | |
# Ensure all pending writes are completed | |
sync | |
fi | |
} | |
iscsi_mount_start_iscsi() { | |
echo "Connecting iSCSI session... ${iscsi_target}" | |
# Ensure the iSCSI initiator is connected | |
iscontrol -c ${CONFIG_FILE} -n ${iscsi_target_name} -p ${pidfile} > /var/log/${name}.log 2>&1 | |
# Wait for the iSCSI disk to appear | |
max_retries=20 # Maximum number of retries | |
retry_count=0 # Initial retry count | |
while [ ! -e "${device}" ]; do | |
echo "Waiting for ${device} to become available..." | |
# Increment the retry counter | |
retry_count=$((retry_count + 1)) | |
# Check if the maximum retry count is reached | |
if [ $retry_count -ge $max_retries ]; then | |
echo "Failed to attach ${device} after $max_retries attempts." | |
break | |
fi | |
echo "Waiting for ${device} to become attached (attempt $retry_count)..." | |
sleep 2 | |
done | |
sleep 2 | |
} | |
iscsi_mount_start() { | |
iscsi_mount_start_iscsi | |
iscsi_mount_start_mount | |
} | |
iscsi_mount_stop_umount() { | |
# Unmount the iSCSI disk | |
if mount | grep -q "${device}"; then | |
echo "Unmounting iSCSI disk..." | |
sync | |
sleep 2 | |
max_retries=20 # Maximum number of retries | |
retry_count=0 # Initial retry count | |
while ! umount ${device}; do | |
# Increment the retry counter | |
retry_count=$((retry_count + 1)) | |
# Check if the maximum retry count is reached | |
if [ $retry_count -ge $max_retries ]; then | |
echo "Failed to unmount ${device} after $max_retries attempts." | |
echo "Forced unmounting ${device} ..." | |
if umount -f ${device}; then | |
echo "Forced unmounted ${device}" | |
fi | |
break | |
fi | |
echo "Waiting for ${device} to become unmounted (attempt $retry_count)..." | |
sleep 2 | |
done | |
echo "${device} unmounted successfully." | |
# Ensure all pending writes are completed | |
sync | |
fi | |
} | |
iscsi_mount_stop_iscsi() { | |
echo "Disconnecting iSCSI session... ${iscsi_target}" | |
# Check if the PID file exists | |
if [ -f "$pidfile" ]; then | |
# Read the PID from the PID file | |
pid=$(cat "$pidfile") | |
# Attempt to terminate the process gracefully | |
kill -SIGHUP "$pid" | |
rm "$pidfile" | |
fi | |
} | |
iscsi_mount_stop() { | |
iscsi_mount_stop_umount | |
iscsi_mount_stop_iscsi | |
} | |
load_rc_config $name | |
run_rc_command "$1" |
Результат монтування:
$ cat /etc/fstab # Device Mountpoint FStype Options Dump Pass# /dev/da0p2 / ufs rw 1 1 /dev/da0p3 none swap sw 0 0 /dev/gpt/raid1 /raid1 ufs rw,noauto,noatime 0 0 $ mount /dev/da0p2 on / (ufs, local, journaled soft-updates) devfs on /dev (devfs, local, multilabel) /dev/gpt/raid1 on /raid1 (ufs, local, noatime, journaled soft-updates)
Немає коментарів:
Дописати коментар