пятница, 10 сентября 2010 г.

Изменение hostid для Solaris 10 глобальной/неглобальной зоны и Solaris 8/9 контейнеров.

В Solaris 10 вы не можете изменить идентификатор host ID, не делая некоторые крупные замены аппаратных средств. В этой статье приводятся методы, позволяющие это сделать. Некоторые приложения, лицензированные к конкретному hostid, не будут работать, если их установить на другом сервере.

Однако вы можете указать пользовательский hostid на Solaris 8 или 9 контейнеров (не глобальной зоне), запущенных на Solaris 10 глобальной зоны. Это может быть сделано с помощью команды zonecfg -z. Инструкции по изменению hostid для Solaris 10 глобальных и неглобальных зон в нижней части этой статьи.

globalserver# zonecfg -z myzone1
zonecfg:myzone1> add attr
zonecfg:myzone1:attr> set name=hostid
zonecfg:myzone1:attr> set type=string
zonecfg:myzone1:attr> set value=”123456″
zonecfg:myzone1:attr> end
zonecfg:myzone1> exit

Остановить myzone1
globalserver# zonecfg -z myzone1 halt
Запустить myzone1
globalserver# zonecfg -z myzone boot

Проверить статус myzone1
globalserver# zonecfg list -vc

Залогиниться в консоль myzone1 и проверить hostid
globalserver@ zlogin -C myzone1

После ввода логина и пароля, запустить hostid.
# hostid
123456


Изменение hostid для Solaris 10 глобальных и неглобальных зон.

Здесь приводится небольшой скрипт, найденный на просторах интернета, который может быть использован для изменения hostid для Solaris 10 глобальных и неглобальных зон. Этот скрипт должен выполняться как процесс в фоновом режиме. Убийство этого процесса вернёт hostid к первоначальному значению, заложенному в оборудование. Вырезать и вставить нижеприведённый скрипт в файл с именем zhostid, сделать файл исполняемым. Измените следующие строки с идентификаторами, указав нужные.
global 12345678
myzone1 90abcdef

#!/usr/bin/ksh
#
# zhostid - demo changing hostids for Solaris Zones.
# Written using DTrace (Solaris 10 3/05).
#
# WARNING: This is a demonstration of DTrace, it is not intended as a
# standard daemon. In particular, hostids are used by Sun to track support
# calls, so changing hostids may make life somewhat confusing for all.
#
# 21-Jun-2005, ver 0.70 (first release)
#
# USAGE: zhostid &
#
# Edit the "Configuration" section below to set the zones and
# hostids to what is desirable.
#
# BASED ON: hostid.d by Iain Hayes, and idea by Jon Haslam.
#
# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# (http://www.gnu.org/copyleft/gpl.html)
#
# 21-Jun-2005 Brendan Gregg Created this.

#
# Configuration
#
hostids='
global 12345678
myzone1 90abcdef

' # simply modify the above by adding extra lines for each zone.

#
# Check hostids
#
print "$hostids" | while read zone hostid_hex; do
### Sanity check hostid
if [[ "$zone" == "" || "$zone" == "#" ]]; then continue; fi
if [[ "$hostid_hex" == *[g-zG-Z]* ]]; then
print "ERROR2: Invalid hostid $hostid_hex. "
print "Please use hexadecimal.\n"
exit 2
fi
if (( ${#hostid_hex} > 11 )); then
# see /usr/src/uts/common/conf/param.c for limit.
print "ERROR3: Length of hostid $hostid_hex too long. "
print "Limit 11 chars.\n"
exit 3
fi

### Convert hostid to decimal
typeset -i10 hostid_dec
hostid_dec=16#$hostid_hex

### Build DTrace code
body="$body
syscall::systeminfo:return
/zonename == \"$zone\" && self->command == 7/
{
copyoutstr(\"$hostid_dec\", self->buffer, 11);
}"
done

#
# Run DTrace
#
exec /usr/sbin/dtrace -n '

#pragma D option destructive
#pragma D option quiet
#pragma D option bufsize=32k

inline string hostid = "'$hostid_dec'";

syscall::systeminfo:entry
{
self->command = arg0;
self->buffer = arg1;
}

'"$body"'

syscall::systeminfo:return
{
self->command = 0;
self->buffer = 0;
}
'


Теперь запустите файл zhostid в фоновом режиме в качестве процесса. Этот файл должен быть запущен из глобальной зоны.

globalserver# ./zhostid &


Проверьте hostid

globalserver# hostid
12345678


Залогиньтесь в консоль myzone1

# zlogin myzone1
[Connected to zone 'myzone1' pts/10]
Last login: Tue Jun 21 03:51:10 on pts/10
Sun Microsystems Inc. SunOS 5.10 Generic January 2005 myzone1

# hostid
90abcdef