IP Multipathing (IPMP) - возможность выполнения множественных соединений с одной и той же сетью для обеспечения отказоустойчивой работы сети. Если одна из сетевых кароточек отказывает, IP-адрес машины не изменяется благодаря работе других сетевых карт и отказ не приводит к потере данных.
Предположим что на сервере имются две
gigaswift-ные карточки ce0 и ce1 и для примера yвозьмем IP адрес 192.168.2.9. Сначала убедимся, что обе карточки имеют разные MAC адреса - по дефолту в серверах
Sun стоит значение PROM 'local-mac-address?=false' , заставляющее все карточки иметь MAC адрес первой встроенной сетевой карты. Это можно проверить командой:
# eeprom local-mac-address?
Если результат по дефолту, ставим
true:
# eeprom local-mac-address?=true
Убеждаемся с помощью
'ifconfig -a' что карточки имеют разные MAC адреса. Если обе карточки подключены и все еще имеют одинаковый адрес, присваиваем второй сетевой карте другой уникальный MAC адрес:
# ifconfig ce1 ether de:ad:be:ef:f0:0d
После этого, если перегрузить сервер, обе сетевых карточки будут иметь различные MAC адреса.
Теперь необходимо сгруппировать кароточки:
# ifconfig ce1 group server-int
# ifconfig ce0 group server-int
Здесь
'server-int' - это название группы.
Назначаем первой карточке тестовый IP адрес, необходимый для того чтобы система могла проверять корректную работу интерфейса (все в одну строку):
# ifconfig ce0 addif 192.168.2.109 netmask + broadcast + deprecated -failover up
И для второй:
# ifconfig ce1 192.168.2.209 netmask + broadcast + deprecated -failover standby up
Изменяем файлы
hostname.* для сохранения настроек после перезагрузки.
Файл
/etc/hostname.ce0 содержит строку с
hostname сервера. Ее нужно изменить на следующие строки:
group server-int
set 192.168.2.9/24 broadcast + up
addif 192.168.2.109/24 broadcast + deprecated -failover up
Создадим также файл
/etc/hostname.ce1 со следующими сроками:
group server-int
set 192.168.2.209/24 broadcast + -failover deprecated standby up
Весь процесс настройки IP Multipathing можно автоматизировать с помощью скрипта, написанного Родриком Брауном :
#!/usr/bin/bash
# IPMP script 01/16/06
# Rodrick R. Brown
# rodrick.brown@gmail.com
unset LD_LIBRARY_PATH ;
unset PATH;
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
export PATH
HOSTNAME=$(hostname)
INTTYPE=$(ifconfig -a |awk -F: '/^[bge|eri|ce|hme|ge]/ { print substr($1,0,3) }')
INTF0="${INTTYPE}0"
INTF1="${INTTYPE}1"
TESTADDR0=$1
TESTADDR1=$2
DATE=$(date +%m%d%Y)
err=0;
TMPFILE="/tmp/.etc_hosts.$$"
usage()
{
echo "$0 [${INTF0}:ipaddr] [${INTF1}:ipaddr]"
exit 1
}
if [[ $# -ne 2 ]]; then
usage;
fi
update_etc_hosts()
{
echo "writing config information to /etc/hosts"
while read line;
do
echo ${line} |egrep ${HOSTNAME};
if [[ $? -eq 0 ]] ; then
echo "${TESTADDR0} ${HOSTNAME}-${INTF0}"
echo "${TESTADDR1} ${HOSTNAME}-${INTF1}"
continue
fi
echo ${line}
done < <(cat /etc/hosts) > ${TMPFILE}
mv /etc/hosts /etc/hosts.$DATE.backup
mv ${TMPFILE} /etc/hosts
}
zone_check()
{
if [[ $(zonename) != "global" ]]; then
echo "unable to run this script from inside a zone"
exit 1
fi
}
update_eeprom()
{
echo "checking eeprom settings...."
/usr/sbin/eeprom | egrep 'local-mac-address?.*true' 2>&1>/dev/null
err=$?
if (( $err != 0 )); then
echo "local-mac-address not set to true, enabling...."
sleep 1
/usr/sbin/eeprom "local-mac-address?=true"
exit
fi
}
err=0;
write_config()
{
echo "backing up exiting /etc/hostname. files..."
for files in /etc/hostname.${INTF0} /etc/hostname.${INTF1} ;
do
mv ${files} ${files}.$DATE.backup
done
echo "writing config information to /etc/hostname.${INTF0}"
sleep 1
echo "${HOSTNAME}-${INTF0} netmask \
+ broadcast + group ipmp deprecated -failover up" >/etc/hostname.${INTF0}
echo "addif ${HOSTNAME} netmask + broadcast + failover up" >>/etc/hostname.${INTF0}
echo "writing config information to /etc/hostname.${INTF1}"
sleep 1
echo "${HOSTNAME}-${INTF1} netmask \
+ broadcast + group ipmp deprecated -failover standby up" >/etc/hostname.${INTF1}
update_etc_hosts;
sleep 1
echo "Sun IPMP enabled..."
echo "Please reboot to test your configuration..."
echo -n "Reboot now? [y/n]: "
read ans;
if [[ $ans == "y" || $ans == "Y" ]]; then
/usr/sbin/shutdown -yi6 -g0"
else
echo "goodbye!"
fi
}
zone_check;
update_eeprom;
write_config;
По материалам tech-recipes.com