Estou testando as zonas no Solaris 10, release 10/09 (s10x_u8wos_08a) com o kernel Generic_142901-04.
O servidor host possui duas NICs físicas (bnx0 e bnx1) e, como pretendo executar várias (três ou mais) zonas, dedicar uma NIC a uma zona está fora de questão. Atualmente, eu não tenho nenhum endereço IP "dedicado" atribuído a essas zonas, então estou obtendo concessões do DHCP.
Minhas perguntas, às quais nós retornaremos uma vez que mostramos a minha configuração atual, envolvem principalmente essa configuração de rede.
Aqui estão os passos (com algumas informações adicionais) que eu levei para configurar a zona:
erikn@global:~ $ zpool status zpool1
pool: zpool1
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 ONLINE 0 0 0
c1t1d0 ONLINE 0 0 0
errors: No known data errors
erikn@global:~ $ zfs list zpool1
NAME USED AVAIL REFER MOUNTPOINT
zpool1 84.1G 183G 6.14G /zpool1
erikn@global:~ $ pfexec zfs create zpool1/zones
erikn@global:~ $ pfexec zfs set mountpoint=/zones zpool1/zones
erikn@global:~ $ pfexec zonecfg -z test \
> 'create -b ;
> set zonepath=/zones/test ;
> verify ;
> commit'
erikn@global:~ $ zoneadm list -vic
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- test configured /zones/test native shared
Eu continuei para instalar a zona
erikn@global:~ $ pfexec zoneadm -z test install
A ZFS file system has been created for this zone.
Preparing to install zone <test>.
Creating list of files to copy from the global zone.
Copying <196614> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1595> packages on the zone.
Initialized <1595> packages on zone.
Zone <test> is initialized.
Installation of these packages generated errors: <SUNWvbox SUNWpostgr-83-server-data-root CSWcacertificates CSKmysql32 SUNWpostgr-82-libs SUNWpostgr-82-server SUNWpostgr-82-client SUNWpostgr-82-devel CSKphp5 SUNWpostgr-82-contrib CSKapache2 SUNWpostgr-82-server-data-root>
Installation of <1> packages was skipped.
The file </zones/test/root/var/sadm/system/logs/install_log> contains a log of the zone installation.
Então, alguns pacotes geraram erros, mas isso não me preocupa muito, já que eu não preciso deles dentro dessa zona.
A instalação saiu com zero de qualquer maneira.
erikn@global:~ $ echo $?
0
Eu inicializei a zona
erikn@global:~ $ pfexec zoneadm -z test boot
E conectado ao "console".
erikn@global:~ $ pfexec zlogin -C test
Eu segui a instalação; selecionando um idioma (Inglês), definindo a localidade (EUA (en_US.ISO8859-1)), tipo de terminal (DEC VT100), dando-lhe um nome de host (teste), definindo fuso horário (Europa / Oslo), definindo uma senha root ( "password123" - não, apenas brincando).
Alterou o shell de raiz para o bash:
# usermod -s /usr/bin/bash root
UX: usermod: root is currently logged in, some changes may not take effect until next login.
Efetuado logout e novamente.
Como havia muitos serviços habilitados (incluindo telnet e finger), achei que seria mais fácil desativar tudo e reativar os serviços até que eu tivesse um sistema em funcionamento.
-bash-3.00# svcs | grep " svc:" | sed "s/ \{1,\}/ /g" | cut -d' ' -f3 | \
> xargs svcadm disable
Isso resultou, como esperado, na zona que entra no modo de manutenção do sistema.
Eu reativei todos os serviços milstone:
-bash-3.00# svcs -a | grep " svc:/milestone/" | sed "s/ \{1,\}/ /g" | \
> cut -d' ' -f3 | xargs svcadm enable
Ativado sshd e syslogd.
-bash-3.00# svcadm enable svc:/network/ssh:default
-bash-3.00# svcadm enable svc:/system/system-log:default
Serviços de dependência em loop, permitindo-lhes:
-bash-3.00# while [ $( svcs -xv | wc -l ) -gt 0 ] ; do
> svcs -xv | grep "^svc" | cut -d' ' -f1 | xargs svcadm enable
> done
Hostname: test
Reading ZFS config: done.
Ativou o login do console e verificou o status.
-bash-3.00# svcadm enable svc:/system/console-login:default
-bash-3.00# svcs -xv
svc:/system/console-login:default (Console login)
State: offline since August 27, 2012 11:38:04 AM CEST
Reason: Unknown.
See: http://sun.com/msg/SMF-8000-AR
See: man -M /usr/share/man -s 1M ttymon
Impact: This service is not running.
Reiniciou a zona.
-bash-3.00# reboot
Foi recebido pelo prompt de login do console. Conectado. Verificado o status do serviço:
-bash-3.00# svcs -xv
Nenhuma saída é boa saída.
Parou a zona e tirou um instantâneo da zona global para uma boa medida.
-bash-3.00# halt
Aug 27 12:10:08 test halt: halted by root
Aug 27 12:10:09 test syslogd: going down on signal 15
[NOTICE: Zone halted]
~.
[Connection to zone 'test' console closed]
erikn@global:~ $ pfexec zfs snapshot zpool1/zones/test@neat
Depois disso, eu inicializei a zona novamente, descobri a ordem de dependência dos pacotes que foram instalados (usando este script "pkgdep" encontrado aqui ), e removi algumas das coisas que eu não precisava.
Em seguida, chegou a hora de configurar a rede, sobre o que é essa questão.
Da região global, criei uma interface lógica e a atribui à zona "test".
erikn@global:~ $ pfexec ifconfig bnx1:1 plumb zone test
Podemos verificar se isso foi atribuído à zona:
-bash-3.00# ifconfig bnx1:1
bnx1:1: flags=1100842<BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 1500 index 5
inet 0.0.0.0 netmask 0
Agora, como a zona está configurada com o tipo IP "compartilhado", ela não poderá enviar solicitações DHCP na interface. Portanto, fazemos isso da região global:
erikn@global:~ $ pfexec ifconfig bnx1:1 dhcp start
ifconfig: bnx1:1: wait timed out, operation still pending...
Isso não foi muito bem, agora foi?
erikn@global:~ $ echo $?
4
Voltar para a zona.
-bash-3.00# ifconfig bnx1:1
bnx1:1: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 5
inet 10.0.6.92 netmask fffffc00 broadcast 10.0.7.255
Bem, nós temos um endereço IP ... (Aqui, eu substituí a rede por 10.0.4.0/22, mas a máscara de rede é a mesma).
Modificamos nosso /etc/nsswitch.conf e /etc/resolv.conf para usar nossos servidores de nomes.
Como estamos usando um proxy HTTP em nossa rede, devemos nos lembrar de exportá-lo (geralmente eu o coloco em ~ / .bash_profile)
-bash-3.00# export http_proxy=http://proxy.example.com:8080
-bash-3.00# /usr/sfw/bin/wget http://www.google.com
--2012-08-27 13:03:30-- http://www.google.com/
Resolving proxy.example.com... 10.0.7.17
Connecting to proxy.example.com|10.0.7.17|:8080... connected.
Proxy request sent, awaiting response... 302 Found
Location: http://www.google.no/ [following]
--2012-08-27 13:03:40-- http://www.google.no/
Connecting to proxy.example.com|10.0.7.17|:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: 'index.html'
[ <=> ] 11,343 --.-K/s in 0s
2012-08-27 13:03:40 (65.3 MB/s) - 'index.html' saved [11343]
Embora as coisas pareçam estar funcionando, não é perfeito. Vamos voltar para a zona global.
Primeiro, temos a interface bnx1 real, que também usa o DHCP.
erikn@global:~ $ ifconfig bnx1 dhcp status
Interface State Sent Recv Declined Flags
bnx1 BOUND 2357 1558 778
(Began, Expires, Renew) = (08/27/2012 12:09, 08/31/2012 12:09, 08/29/2012 12:09)
Então, temos nossa interface lógica:
erikn@global:~ $ ifconfig bnx1:1 dhcp status
Interface State Sent Recv Declined Flags
bnx1:1 PRE_BOUND 20 14 6
Vamos criar outra interface lógica, mas não daremos essa a qualquer zona, então ela pertencerá à região global:
erikn@global:~ $ pfexec ifconfig bnx1:2 plumb
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
erikn@global:~ $ echo $?
0
erikn@global:~ $ ifconfig bnx1:2
bnx1:2: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,ROUTER,IPv4> mtu 1500 index 5
inet 10.0.6.123 netmask fffffc00 broadcast 10.0.7.255
erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface State Sent Recv Declined Flags
bnx1:2 BOUND 5 4 1
(Began, Expires, Renew) = (08/27/2012 13:11, 08/31/2012 13:11, 08/29/2012 13:11)
Então isso funcionou muito bem. Infelizmente, isso não nos ajuda muito.
Eu tentei entregar essa interface para a zona "test":
erikn@global:~ $ pfexec ifconfig bnx1:2 zone test
erikn@global:~ $ echo $?
0
Não ficou muito feliz com isso:
erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface State Sent Recv Declined Flags
bnx1:2 DECLINING 6 4 2
E liberar e iniciar novamente o cliente DHCP na interface leva ao mesmo resultado que vimos na última vez:
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp release
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...
Como última tentativa desesperada, tentei:
erikn@global:~ $ pfexec ifconfig bnx1:2 plumb \
> netmask 0xfffffc00 \
> broadcast 10.0.7.255 \
> zone test \
> up
Não tenha essa sorte.
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...
Minhas perguntas são basicamente:
-
É possível ter IPs atribuídos por DHCP para uma zona do Solaris 10/09 sem fornecer um NIC físico próprio?
-
Eu estou indo sobre isso da maneira errada? Eu deveria ter IP's privados para as zonas e deixar o computador host fazer NAT? Isso é possível?
O objetivo final para mim é ter diferentes serviços conectados à rede em execução em cada zona.