我正在使用 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),為其指定主機名稱(測試),設定時區(歐洲/奧斯陸),設定 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
正如預期的那樣,這樣做會導致該區域進入系統維護模式。
我重新啟用了所有 milstone 服務:
-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」腳本在這裡找到),並刪除了一些我不需要的東西。
接下來,是時候配置網路了,這就是這個問題的內容。
我從全域區域建立了一個邏輯介面並將其指派給區域“test”。
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...
我的問題基本上是:
是否可以讓 DHCP 為 Solaris 10/09 區域分配 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
。