VServer
出自DebianWiki
目錄 |
[編輯] 前言
VServer 是一種進階的 chroot 機制。 chroot 提供 processes 完全獨立的 file systems,但系統其它部份並不是獨立的。如可以看到所有 host 運行的 processes,網路位址也是跟 host 共用。
VServer 除了利用 chroot 的特性來打造一個獨立的 Linux 運行環境之外, 它還在 Linux Kernel 上動手腳,讓 VServer 在運作時彷彿真的是一台完全獨立的機器。
所以 vserver 必須和特製的 Linux Kernel 搭配運作。但還好的是目前 Debian 官方已有提供已編譯好的 linux-image-vserver,使用者不必再費心去自行編譯了。
[編輯] 事前準備
[編輯] 必須和支援 VServer 的 Kernel 搭配運作
由於 Kernel 還要加上 Patch 才能支援 VServer, 所以您可能得安裝以下套件:
kernel-patch-vserver
並自行使用 make-kpkg 指令來編譯並產生 Kernel 的 deb 套件。若是您不喜歡自行編譯 Kernel,您可以替而使用以下指令:
apt-cache search linux-image-vserver-*
來尋找 Debian 官方所提供有支援 VServer 的 Kernel。
[編輯] 安裝必需套件
而 VServer 所需的套件如下:
util-vserver
使用 apt-get 應該就能輕易安裝起來了。 另外,因為某些原因,請不要安裝 vserver-debiantools 套件。它是有名的大地雷...
[編輯] VServer 全域設定說明
VServer 的所有設定都是位於 /etc/vserver 中, 其中您可能會想要修改的是 /etc/vservers/.defaults/vdirbase, 它是一個符號連結,用來指定 VServer 子系統的安裝目錄。
由於安全上的因素,若您想要自行指定 VServer 子系統的安裝目錄, 請務必設定該目錄 barrier flag:
# 假設您的 VServer 子系統的安裝目錄為 /VServer
# 替該目錄設定 barrier flag
setattr --barrier /VServer
# 顯示該目錄的 barrier flag,其中大寫的 B 表示 barrier flag 已被設定了。
showattr -d /VServer
---Bui- /VServer
# 取消該目錄 barrier flag 的設定
setattr --~barrier /VServer
# 再一次顯示該目錄的 barrier flag,其中小寫的 b 表示 barrier flag 設定已被取消了。
showattr -d /VServer
---bui- /VServer
[編輯] 建立 chroot 環境
為了節省網路頻寬並縮短安裝時間, 我們可以利用手上已有的 Debian Sarge 安裝光碟或是 CD Image 檔來建立 chroot 環境。
[編輯] 掛載 Debian Installer CD Image
使用以下指令將 Debian Sarge 安裝光碟或是 CD Image 檔掛載在某個目錄下:
mount -o loop sarge-i386-netinst.iso /cdrom
[編輯] 建立 VServer 執行環境
使用以下指令來建立 VServer 執行環境:
# 這個 VServer 的名稱。日後將使用這個名稱來操作該 VServer VServerName=VServer # 這個 VServer 的 HostName VHostName=vserver # 和這個 VServer 搭配使用的網路介面 VInterface=eth0 # 這個 VServer 的 IP 位址和網路遮罩。 # 依個人使用經驗,在此可以使用和原生系統不同的 IP 位址 VIP=192.168.1.1 VPrefix=24 # 所使用的 Debian 版本。 # 必須和上一步中的 Debian 安裝光碟或是 CD Image 檔版本一致。 DebianVer=sarge # 指定所使用的 Debian 安裝光碟或是 CD Image 檔的掛載目錄 # 或是指定 Debian Archiver 位址也可以 CDRomMountPoint='/cdrom' Source="file:///$CDRomMountPoint/debian/" # 指定沒必要安裝的套件 REMOVE_PACKAGES="sparc-utils,dhcp-client,lilo,makedev,pcmcia-cs,ppp,pppconfig,pppoe,pppoeconf,setserial,syslinux,fdutils,libpcap0,iptables,pciutils" # 進行安裝 vserver $VServerName build -n $VServerName --hostname $VHostName --interface $VInterface:$VIP/$VPrefix -m debootstrap -- -d $DebianVer -m $Source -- --exclude=$REMOVE_PACKAGES
所以,您的指令可能會像這個樣子:
vserver VServer build -n VServer \
--hostname vserver \
--interface eth0:192.168.1.1/24 \
-m debootstrap -- -d sarge -m /cdrom -- \
--exclude="sparc-utils,dhcp-client,lilo,makedev,pcmcia-cs,ppp,pppconfig,pppoe,pppoeconf,setserial,syslinux,fdutils,libpcap0,iptables,pciutils"
等待個數分鐘,一個完整的 VServer 環境就出現了。
[編輯] 關閉不必要的 啟始/結束 Script
因為 VServer 所使用的還是 chroot 環境,所以有些開機動作,像是啟動網路、掛載磁碟分割區等等是不必要的。
所以請參考以下指令把這些 啟始/結束 Script 給刪掉:
# 指定 VServer 的 / 位址。 # 其中的 $VServerName 請參考上文中的設定。 CHROOTPATH="/etc/vservers/.defaults/vdirbase/$VServerName" cd $CHROOTPATH/etc/rc0.d rm K20makedev K25hwclock.sh S30urandom S31umountnfs.sh S35networking S36ifupdown S40umountfs S90halt K89klogd cd $CHROOTPATH/etc/rc6.d rm K20makedev K25hwclock.sh S30urandom S31umountnfs.sh S35networking S36ifupdown S40umountfs S90reboot K89klogd cd $CHROOTPATH/etc/rcS.d rm S05keymap.sh S48console-screen.sh S50hwclock.sh S40networking S45mountnfs.sh S10checkroot.sh S02mountvirtfs rm S30procps.sh S35mountall.sh S36mountvirtfs S39ifupdown S30checkfs.sh S18ifupdown-clean S18hwclockfirst.sh cd $CHROOTPATH/etc/rc2.d rm S20makedev S11klogd
[編輯] 設定 /etc/hosts 檔案
由於使用 debootstrap 所安裝的環境會沒有 /etc/hosts,所以您必須手動新增。例:
127.0.0.1 localhost.localdomain localhost
[編輯] 系統微調
依您喜好,您還可以修改以下檔案:
- /root/.bashrc
- /root/.vimrc
- /etc/apt/sources.list
以符合您的需求。
[編輯] 設定啟動時所要自動掛載的目錄
因為 VServer 所使用的還是 chroot 環境,所以在啟動 VServer 時是不該進行掛載磁碟分割區等等動作。
但,您可能會希望在啟動 VServer 時同時掛載某些目錄, 像是把主系統的 /var/cache/apt/archives 掛起來以節省磁碟空間, 那您可以修改 /etc/vservers/$VServerName/fstab 如下:
/var/cache/apt/archives /var/cache/apt/archives auto rbind 0 0
它的語法和 /etc/fstab 極為類似,所以在此就不多加說明了。
[編輯] 啟動 VServer 並進行基本設定
在建立完 VServer 後,您可能會希望再設定一些像是 root 的密碼、系統時區等等, 請執行以下指令:
# 啟動這個 VServer 子系統 vserver $VServerName start # 執行 base-config 指令 vserver $VServerName exec base-config # 關閉這個 VServer 子系統 vserver $VServerName stop
來進入這個 VServer 子系統並執行 base-config 指令。
[編輯] 安裝 VServer 時的參考資訊
[編輯] VServer 子系統設定
在建立一個 VServer 子系統後, 因為 VServer 所使用的還是 chroot 環境, 所以您必須在外部指定這個 VServer 在啟動時所需的系統環境。
如:
設定啟動時所要掛載的磁碟機,請修改:
/etc/vservers/$VServerName/fstab
其中的 $VServerName 為您替這個 VServer 所指定的名稱。
若要設定 IP 位址及相關參數,請修改:
/etc/vservers/$VServerName/interfaces/0/dev /etc/vservers/$VServerName/interfaces/0/ip /etc/vservers/$VServerName/interfaces/0/prefix
其中,0 表示第 1 個網路介面。 您也可以依此自行建立該 VServer 所會用到的網路介面。
[編輯] VServer 常用指令
VServer 提供了一些操作子系統的指令,如:
若要啟動這個 VServer 子系統,請下達:
vserver $VServerName start
若要進入這個 VServer 子系統,請下達:
vserver $VServerName enter
若要關閉這個 VServer 子系統,請下達:
vserver $VServerName stop
其它的指令請參考 vserver 的使用手冊。
[編輯] VServer 的限制
- IPv6:
VServer 現階段還是不支援 IPv6。請特別注意。
- Kernel:
因為 VServer 所使用的還是 chroot 機制,所以 VServer 會直接使用主系統的 Kernel。您無法指定 VServer 的子系統使用其它的 Kernel Image。
- iptables:
因為 VServer 所使用的還是 chroot 機制,所以 VServer 還是會延用主系統的一些作業環境。您無法在 VServer 裡自行再設定 iptables。
- /dev:
因為安全上的因素,您會發現 VServer 的 /dev 目錄空空如也,只剩少數幾個裝置檔。也因此有某些指令,像是 fdisk 是無效的。但請別擔心,這是正常現象。
[編輯] 在 VServer 上安裝各種網路服務的注意事項
[編輯] ssh
因為 sshd 在預設上是會監聽本機所有的網路位址,所以在 VServer 子系統裡就算啟動了 sshd,使用者連上的還是 VServer 主系統的 sshd。
所以請修改 VServer 主系統的 /etc/ssh/sshd_config 如下:
# 以下 192.168.1.1 為 VServer 主系統的 IP 位址 ListenAddress 192.168.1.1
並重新啟動 sshd。
[編輯] bind
因為安全上的因素,您無法在 VServer 上啟動由 Debian 官方所提供的 bind 9。您必須重新編譯 bind 9 並在編譯的過程中加上 --disable-linux-caps 參數。若您只願使用 Debian 官方所提供的套件,請替而使用 bind 8。
[編輯] dhcp
為了讓 DHCP Server 能夠啟動,請修改 /etc/vservers/$VServerName/bcapabilities 如下:
CAP_NET_RAW
並重新啟動該 VServer 子系統。
[編輯] nfs
據報告指出,nfs-kernel-server 不可能在 VServer 上正確運行。 請替而使用 nfs-user-server。
[編輯] mono
若需要使用 binfmt-support 請照下列順序安裝
apt-get install binfmt-support add "none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0" to /etc/vservers/<name>/fstab /etc/init.d/binfmt_misc restart vserver <name> exec apt-get install binfmt-support vserver <name> restart
[編輯] 在 VServer 裡執行 X Window
為了讓 vserver 裡也能執行 X Window,您必須進行以下設定:
[編輯] 新增必要的 /dev 裝置
為了讓 X Window 能順利啟動,您必須在 vserver 裡新增如下裝置:
HROOTPATH="/etc/vservers/.defaults/vdirbase/$VServerName" mknod $CHROOTPATH/dev/mem c 1 1 chmod 640 $CHROOTPATH/dev/mem chown root:kmem $CHROOTPATH/dev/mem mknod $CHROOTPATH/dev/tty0 c 4 0 chmod 600 $CHROOTPATH/dev/tty0 chown root:tty $CHROOTPATH/dev/tty0 mknod $CHROOTPATH/dev/tty7 c 4 7 chmod 600 $CHROOTPATH/dev/tty7 chown root:tty $CHROOTPATH/dev/tty7 cd $CHROOTPATH/dev; /sbin/MAKEDEV -v input
[編輯] 修改 bcapabilities
同時,您必須在 /etc/vservers/$VServerName/bcapabilities 中新增一行:
CAP_SYS_RAWIO
[編輯] 安裝 X Window
接下來,您就按您的需求安裝 X Window 所需的各式套件了。
[編輯] 在 VServer 裡啟動 nVIDIA 的 3D 加速顯示模組
其實使用 Xorg 所提供的 nv 或 vesa 模組就能順利啟動 X Window 了, 但我們還是想要使用 nVIDIA 官方所提供的顯示模組。
為了讓您的 VServer 裡的 X Window 也能使用 nVIDIA 官方所提供的顯示模組, 您必須再完成以下步驟:
[編輯] 新增 nVIDIA 顯示模組專用裝置
HROOTPATH="/etc/vservers/.defaults/vdirbase/$VServerName" mknod $CHROOTPATH/dev/nvidia0 c 195 0 chown 660 $CHROOTPATH/dev/nvidia0 chown root:video $CHROOTPATH/dev/nvidia0 mknod $CHROOTPATH/dev/nvidia1 c 195 1 chown 660 $CHROOTPATH/dev/nvidia1 chown root:video $CHROOTPATH/dev/nvidia1 mknod $CHROOTPATH/dev/nvidia2 c 195 2 chown 660 $CHROOTPATH/dev/nvidia2 chown root:video $CHROOTPATH/dev/nvidia2 mknod $CHROOTPATH/dev/nvidia3 c 195 3 chown 660 $CHROOTPATH/dev/nvidia3 chown root:video $CHROOTPATH/dev/nvidia3 mknod $CHROOTPATH/dev/nvidiactl c 195 255 chown 660 $CHROOTPATH/dev/nvidiactl chown root:video $CHROOTPATH/dev/nvidiactl
[編輯] 再度修改 bcapabilities
請再修改 /etc/vservers/$VServerName/bcapabilities 如下:
CAP_IPC_LOCK CAP_IPC_OWNER CAP_SYS_RAWIO CAP_SYS_ADMIN CAP_NET_ADMIN CAP_NET_RAW CAP_MKNOD
[編輯] 修改 vprocunhide-files
請再將以下兩行:
/proc/mtrr /proc/bus/
加入 /usr/lib/util-vserver/defaults/vprocunhide-files 中, 並重新啟動 /etc/init.d/util-vserver。
注意:
新增這兩行可能會產生安全上的疑慮。 不過我們還是當作不知道好了...
[編輯] 在 VServer 裡安裝 nVIDIA 相關套件
為了能在 VServer 裡啟動 nVIDIA 模組,您還必須安裝以下 nVIDIA 相關套件:
nvidia-kernel-common nvidia-kernel nvidia-glx
其中的 nvidia-kernel 套件可由 nvidia-kernel-source 套件產生。
由於講解如何由 nvidia-kernel-source 建立 deb 套件已超出本文範圍,所以在此我們就偷懶一下吧...
[編輯] 在 VServer 裡啟動 ATI 的 3D 加速顯示模組
[編輯] 設定 X Window 的使用權限
請使用以下指令來設定哪些使用者可以啟動 X Window:
dpkg-reconfigure x11-common
此時設定為【Anyone】。
[編輯] 啟動 X Window
接下來,您只要鍵入 startx 就能進入 X Window 了。
[編輯] 故障排除
[編輯] 在開機時自動啟動特定的 VServer
如果您想讓某個 VServer 子系統在開機時自動啟動,請重新執 util-vserver 的 debconf 設定:
dpkg-reconfigure util-vserver
並在以下問題:
If you choose this option and add the word 'default' to /etc/vservers/<vserver-name>/apps/init/mark
then those vservers will be started and stopped in the regular system boot sequence.
If you do not choose this option,
then you will need to manually start each vserver by running 'vserver <vserver-name> start'.
Automatically handle the starting and stopping of Vserver guests?
裡回答【Yes】。
您可以依上文中的指示,將
default
寫入 /etc/vservers/<vserver-name>/apps/init/mark 中, 之後這些 VServer 子系統就會在開機時啟動了。
![[Main Page]](/upload/4/49/Debian_taiwan_out.png)