我正在使用 Generic_142901-04 内核在 Solaris 10 版本 10/09(s10x_u8wos_08a)上测试区域。
主机服务器有两个物理 NIC(bnx0 和 bnx1),由于我打算运行多个(三个或更多)区域,因此将 NIC 专用于一个区域是不可能的。目前,我没有为这些区域分配任何“专用”IP 地址,因此我从 DHCP 获取租约。
我的问题主要围绕这个网络配置,在我向您展示我当前的设置后我们会再回答这些问题。
以下是我设置区域所采取的步骤(以及一些附加信息):
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
我继续安装区域
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.
因此一些包产生了错误,但这并不让我担心,因为无论如何我都不需要它们在这个区域内。
无论如何,安装都会以零退出。
erikn@global:~ $ echo $?
0
我启动了区域
erikn@global:~ $ pfexec zoneadm -z test boot
并连接到“控制台”。
erikn@global:~ $ pfexec zlogin -C test
我遵循安装步骤;选择语言(英语)、设置区域设置(美国(en_US.ISO8859-1))、终端类型(DEC VT100)、赋予主机名(测试)、设置时区(Europe/Oslo)、设置 root 密码(“password123” - 不,只是开个玩笑)。
将 root shell 更改为 bash:
# usermod -s /usr/bin/bash root
UX: usermod: root is currently logged in, some changes may not take effect until next login.
已退出并再次登录。
由于有很多启用的服务(包括 telnet 和 finger),我认为禁用所有服务然后重新启用服务直到我有一个正常运行的系统会更容易。
-bash-3.00# svcs | grep " svc:" | sed "s/ \{1,\}/ /g" | cut -d' ' -f3 | \
> xargs svcadm disable
正如预期的那样,这样做会导致区域进入系统维护模式。
我重新启用了所有里程碑服务:
-bash-3.00# svcs -a | grep " svc:/milestone/" | sed "s/ \{1,\}/ /g" | \
> cut -d' ' -f3 | xargs svcadm enable
启用 sshd 和 syslogd。
-bash-3.00# svcadm enable svc:/network/ssh:default
-bash-3.00# svcadm enable svc:/system/system-log:default
循环依赖服务,使它们能够:
-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.
启用控制台登录并检查状态。
-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.
重新启动了区域。
-bash-3.00# reboot
看到控制台登录提示。已登录。检查服务状态:
-bash-3.00# svcs -xv
没有输出就是好输出。
为确保万无一失,已暂停该区域并从全局区域拍摄快照。
-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
此后,我再次启动了区域,找出了已安装软件包的依赖顺序(使用“pkgdep”脚本找到这里),并删除了一些我不需要的东西。
接下来就该配置网络了,这也是本题所要讨论的内容。
从全局区域,我创建了一个逻辑接口并将其分配给区域“测试”。
erikn@global:~ $ pfexec ifconfig bnx1:1 plumb zone test
我们可以验证这已被分配给区域:
-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
现在,由于区域配置了 IP 类型“共享”,因此它将无法在接口上发送 DHCP 请求。因此,我们从全局区域执行此操作:
erikn@global:~ $ pfexec ifconfig bnx1:1 dhcp start
ifconfig: bnx1:1: wait timed out, operation still pending...
事情进展不太顺利,不是吗?
erikn@global:~ $ echo $?
4
回到區域。
-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
好吧,我们有一个 IP 地址......(这里,我用 10.0.4.0/22 替换了网络,但网络掩码相同)。
我们修改 /etc/nsswitch.conf 和 /etc/resolv.conf 以使用我们的名称服务器。
由于我们在网络上使用 HTTP 代理,因此我们必须记住导出它(我通常将其放在 ~/.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]
尽管一切似乎都正常,但并不完美。让我们回到全局区域。
首先我们有真正的 bnx1 接口,它也使用 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)
然后我们有了逻辑接口:
erikn@global:~ $ ifconfig bnx1:1 dhcp status
Interface State Sent Recv Declined Flags
bnx1:1 PRE_BOUND 20 14 6
让我们创建另一个逻辑接口,但我们不会将其分配给任何区域,因此它将属于全局区域:
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)
所以这很完美。可惜,这对我们没什么帮助。
我尝试将该接口移交给区域“测试”:
erikn@global:~ $ pfexec ifconfig bnx1:2 zone test
erikn@global:~ $ echo $?
0
这让人不太高兴:
erikn@global:~ $ ifconfig bnx1:2 dhcp status
Interface State Sent Recv Declined Flags
bnx1:2 DECLINING 6 4 2
在接口上释放并重新启动 DHCP 客户端将导致与我们上次看到的相同的结果:
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...
作为最后的绝望尝试,我尝试了:
erikn@global:~ $ pfexec ifconfig bnx1:2 plumb \
> netmask 0xfffffc00 \
> broadcast 10.0.7.255 \
> zone test \
> up
没那么幸运。
erikn@global:~ $ pfexec ifconfig bnx1:2 dhcp start
ifconfig: bnx1:2: wait timed out, operation still pending...
我的问题基本上是:
是否有可能为 Solaris 10/09 区域使用 DHCP 分配 IP,而无需为其提供自己的物理 NIC?
我的做法是否错误?我是否应该为区域设置私有 IP,然后让主机进行 NAT?这可能吗?
我的最终目标是在每个区域运行不同的网络连接服务。
跨区域之间会有一些网络通信,并且
他们还将运行网络可访问服务,供我们网络上的其他主机使用。
答案1
区域虚拟接口的一些功能有限...某些状态无法设置,数据包过滤器在区域中也不起作用。如果我没记错的话,区域接口无法发送以太网广播,因此没有 DHCP。
顺便问一下,你为什么要花那么多心思来设置区域接口呢?那这个呢?
pfexec zonecfg -z test
> 'create -b ;
> set zonepath=/zones/test ;
> add net ;
> set physica=bnx1 ;
> set address=10.0.6.92 ;
> end ;
> verify ;
> commit'
它将从全局区域接口继承网络掩码。当然,您可以设置更多接口,或者将区域仅放在“内部”接口(无公共 IP)上,然后让其ipf
提供NAT
。