Estou testando zonas no Solaris 10, versão 10/09 (s10x_u8wos_08a) com 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, não tenho nenhum endereço IP "dedicado" atribuído a essas zonas, por isso estou obtendo concessões do DHCP.
Minhas perguntas, às quais voltaremos assim que mostrar minha configuração atual, giram principalmente em torno dessa configuração de rede.
Aqui estão as etapas (com algumas informações adicionais) que executei 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 a 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 não preciso deles dentro desta zona de qualquer maneira.
A instalação terminou 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
Acompanhei a instalação; selecionando um idioma (inglês), definindo a localidade (EUA (en_US.ISO8859-1)), tipo de terminal (DEC VT100), fornecendo um nome de host (teste), definindo o fuso horário (Europa/Oslo), definindo uma senha de root ( "password123" - não, estou brincando).
Mudou o shell root para bash:
# usermod -s /usr/bin/bash root
UX: usermod: root is currently logged in, some changes may not take effect until next login.
Saiu e entrou novamente.
Como havia muitos serviços habilitados (incluindo telnet e finger), imaginei que seria mais fácil desabilitar tudo e depois reativar os serviços até que eu tivesse um sistema funcionando.
-bash-3.00# svcs | grep " svc:" | sed "s/ \{1,\}/ /g" | cut -d' ' -f3 | \
> xargs svcadm disable
Isso resultou, como esperado, na zona entrando no modo de manutenção do sistema.
Reativei todos os serviços milstone:
-bash-3.00# svcs -a | grep " svc:/milestone/" | sed "s/ \{1,\}/ /g" | \
> cut -d' ' -f3 | xargs svcadm enable
Habilitado sshd e syslogd.
-bash-3.00# svcadm enable svc:/network/ssh:default
-bash-3.00# svcadm enable svc:/system/system-log:default
Loop sobre serviços de dependência, 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.
Habilitou 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.
Reiniciei a zona.
-bash-3.00# reboot
Foi recebido pelo prompt de login do console. Conectado. Status do serviço verificado:
-bash-3.00# svcs -xv
Nenhuma saída é uma boa saída.
Interrompeu a zona e tirou um instantâneo da zona global para garantir.
-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, inicializei a zona novamente, descobri a ordem de dependência dos pacotes que foram instalados (usando o script "pkgdep"encontrado aqui) e removi algumas das coisas que eu não precisava.
Em seguida, chegou a hora de configurar a rede, é disso que trata esta questão.
A partir da zona global, criei uma interface lógica e atribuí-la à zona “teste”.
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 IP do tipo "compartilhado", não será possível enviar solicitações DHCP na interface. Portanto, fazemos isso a partir da zona global:
erikn@global:~ $ pfexec ifconfig bnx1:1 dhcp start
ifconfig: bnx1:1: wait timed out, operation still pending...
Isso não correu muito bem, pois não?
erikn@global:~ $ echo $?
4
De volta à 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, temos um endereço IP... (Aqui 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 lembrar de exportá-lo (normalmente 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. Voltemos à zona global.
Primeiro temos a interface bnx1 real, que também usa 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 esta para nenhuma zona, portanto ela pertencerá à zona 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 perfeitamente. Infelizmente, isso não nos ajuda muito.
Tentei entregar essa interface para a zona "teste":
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 reiniciar o cliente DHCP na interface leva ao mesmo resultado que vimos da ú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 e desesperada tentativa, tentei:
erikn@global:~ $ pfexec ifconfig bnx1:2 plumb \
> netmask 0xfffffc00 \
> broadcast 10.0.7.255 \
> zone test \
> up
Não tive 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 atribuir IPs DHCP para uma zona Solaris 10/09 sem fornecer uma NIC física própria?
Estou fazendo isso da maneira errada? Em vez disso, devo ter IPs 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.
Haverá alguma comunicação de rede entre as zonas, e
eles também executarão serviços acessíveis à rede que serão usados por outros hosts em nossa rede.
Responder1
A interface virtual da zona tem alguns recursos limitados... alguns estados não podem ser configurados, o filtro de pacotes também não funciona na zona. Se bem me lembro, a interface da zona não pode enviar transmissões Ethernet, então não há DHCP.
A propósito, por que você está fazendo tanto barulho sobre como configurar a interface da zona? E quanto a isso?
pfexec zonecfg -z test
> 'create -b ;
> set zonepath=/zones/test ;
> add net ;
> set physica=bnx1 ;
> set address=10.0.6.92 ;
> end ;
> verify ;
> commit'
Ele herdará a máscara de rede da interface da zona global. Claro que você pode configurar mais interfaces ou colocar a zona apenas na interface 'interna' (sem IP público) e deixar ipf
fornecer NAT
.