1.Linux下的解決方案 Linux下的集群系統通??梢苑譃槿悾?br />
- HA容錯集群 (Fail-over Cluster)
高可用性集群(High available)用于不可間斷服務的環境下。提供冗余的容錯備份,在主節點失效后,能夠立即接管相關資源及繼續提供相應服務。
- 負載均衡集群 (Load Balancing Cluster)
在應用服務的高負載情況下運用該技術,由多臺節點提供高可伸縮的,高負載的服務器組。以保證對外提供良好的服務響應。
- HPC高性能計算機集群 (High Performance Computing)
概念并不完全統一,有一定爭論,應該理解為并行系統,主要用于科學計算。
本文所要介紹的是前兩類集群的一個完美的組合。
1.1. Linux Virtual Server項目
在1998年5月,由章文嵩博士成立了Linux Virtual
Server的自由軟件項目,進行Linux服務器集群的開發工作。同時,Linux Virtual
Server項目也是國內最早出現的自由軟件項目之一。該項目針對高可伸縮、高可用網絡服務的需求,給出了基于IP層和基于內容請求分發的負載平衡調度解
決方法,它通過前端一個負載調度器(Load
Balancer)無縫地將網絡請求調度到真實服務器上,從而使得服務器集群的結構對客戶是透明的,客戶訪問集群系統提供的網絡服務就像訪問一臺高性能、
高可用的服務器一樣??蛻舫绦虿皇芊掌骷旱挠绊懖恍枳魅魏涡薷?。系統的伸縮性通過在服務機群中透明地加入和刪除一個節點來達到,通過檢測節點或服務進
程故障和正確地重置系統達到高可用性。并在Linux內核中實現了這些方法,將一組服務器構成一個實現可伸縮的、高可用網絡服務的虛擬服務器。
虛擬服務器的體系結構如圖2所示。
圖2:虛擬服務器的結構
1.1.1. LVS的核心軟件IPVS
在調度器的實現技術中,IP負載均衡技術是效率最高的。在已有的IP負載均衡技術中有通過網絡地址轉換(Network Address Translation)VS/NAT技術的基礎上,IPVS軟件實現了三種IP負載均衡技術:
1)Virtual Server via Network Address Translation(VS/NAT) 網絡地址轉換 (如圖1)
2)Virtual Server via IP Tunneling(VS/TUN) 隧道技術 (如圖2)
3)Virtual Server via Direct Routing(VS/DR) 直接路由 (如圖3)
針對不同的網絡服務需求和服務器配置,IPVS調度器實現了如下十種負載調度算法:
- 輪叫(Round Robin)
- 加權輪叫(Weighted Round Robin)
- 最少鏈接(Least Connections)
- 加權最少鏈接(Weighted Least Connections)
- 基于局部性的最少鏈接(Locality-Based Least Connections)
- 帶復制的基于局部性最少鏈接(Locality-Based Least Connections with Replication)
- 目標地址散列(Destination Hashing )
- 源地址散列(Source Hashing)
- 最短期望延遲(Shortest Expected Delay)(新增加調度算法)
- 無須隊列等待(Never Queue)(新增加調度算法)
其中9-10是最新1.09版IPVS軟件包中新增的調度算法,這十種調度算法將會在后面的ipvsadm配置文件中用到,通常用英文單詞的第一個字母的縮寫來表示。例如:輪叫(Round Robin)表示為rr。
三種IP負載均衡技術的優缺點比較
| VS/NAT | VS/TUN | VS/DR |
服務器(OS) | 任意 | 支持隧道 | 多數(支持Non-arp ) |
服務器網絡 | 私有網絡 | 局域網/廣域網 | 局域網 |
服務器數目(100M網絡) | 10~20 | 100 | 多(100) |
服務器網關 | 負載均衡器 | 自己的路由 | 自己的路由 |
效率 | 一般 | 高 | 最高 |
三種IP負載均衡技術中特別是后兩種技術VS/TUN,VS/DR極大地提高系統的伸縮性,它們的相關技術原理不是本文討論的重點,若需了解詳細內容,請參看章文嵩博士的相關撰文。
圖1
圖2
圖3
1.2. High Availability of LVS
較為成熟的方案有mon+heartbeat+fake+coda 和ldirectord+heartbeat 方案,本文我們采用的是ldirectord+heartbeat 方案。
1.2.1. Heartbeat
Linux-HA 項目開始于 1998 年,是 Linux-HA HOWTO(Haranld Milz 著)的產物。該項目目前由 Alan Robertson 領導,許多其他代碼提供者也參與其中。1.0.3版本是2003年6月發布的最新穩定版本。
Heartbeat
通過通信介質(通常是串行設備和以太網)監控節點的"健康"狀況。最好有多個冗余介質,以便我們既可以使用串行線又可以使用以太網鏈接。每個節點運行一個
守護程序進程(稱為"心跳")。主守護程序派生出讀和寫每個心跳介質的子進程,以及狀態進程。當檢測到某個節點發生故障時,Heartbeat 運行
shell 腳本來啟動(或停止)輔助節點上的服務。按照設計,這些腳本使用與系統 init 腳本(通常位于 /etc/init.d
中)相同的語法。缺省腳本是為文件系統、Web 服務器和虛擬 IP 故障轉移提供的。
1.2.2. Ldirectord
"ldirectord"(Linux Director Daemon)是Jacob Rief編程實現的一個獨立進程,以實現對服務和物理服務器的監測,廣泛地用于http和https等服務, Ldirectord與mon相比,優點如下:
- ldirectord是專門為LVS 監控而編寫的。
- ldirectored可以方便地被heartbeat管理啟動和停止。
- 它能從heartbeat的配置文件/etc/ha.d/xxx.cf中讀取所有有關IPVS路由表配置的信息。當 ldirectord
運行后,IPVS路由表將被適當地配置。你也可以將不同的虛擬服務器配置保存在不同的配置文件里,
所以你可以單獨修改某種服務的參數而不用停止其它的服務
- 另外,ldirectord安裝簡便,可以手工地啟動和停止。你可以在沒有備份負載均衡器的LVS集群上使用。
1.2.3. ldirectord+heartbeat的絕妙組合
ldirectord+heartbeat方案前端負載調度器采用雙機熱備份方式,雙機均安裝雙網卡,一個網卡用于連接集群系統,另一個作為冗余心
跳線路連接雙機。采用串口線 + 以太網口做為冗余心跳線路,以確保雙機熱備份的可靠性,消除由于主負載調度器或心跳線故障帶來的集群單點故障。
在主負載調度器及備份負載調度器同時安裝ldirectord及heartbeat,并同時運行Heartbeat,相互監視"健康"狀況,一旦備
份負載調度器監測到主負載調度器發生故障,備份服務器通過運行shell腳本來啟動備份調度器上服務來完成虛擬 IP
故障轉移,通過ipvsadm啟動LVS及ldirectord,完成負載調度器的整體接管。一旦主負載調度器恢復正常工作,備份負載將通過腳本停掉備份
負載調度器上的LVS及ldirectord,同時完成虛擬 IP
故障轉移,主負載調度器重新恢復接管LVS及ldirectord監控服務。這樣負載調度器就完成了一個標準的接管及恢復過程。
該方案結構清晰明了,安裝簡便,并且ldirectord是專門為LVS所開發,針對性強,無縫銜接,配合默契,堪稱絕妙組合。
2. LVS在Red Hat 9.0上的具體實現 2.1. 實現目標:
實現以常用、效率最高的LVS-DR IP負載技術為基礎,以高可用性(HA)+ 高性能 + 高性能/價格比 +
高可伸縮性為最終目的。負載均衡器采用HA技術構架,采用Heartbeat軟件包,heartbeat采用串口、網絡口冗余線路,保證24X7不間斷運
行。結構如圖:
Setup LVS using LVS-DR forwarding
________ | | | client | |________| CIP= SGW =192.168.7.254/24 (eth0) | | eth1 __________ | 192.168.0.1 | director | | --------| primiary |---| DIP=192.168.7.9/24 (eth0) | |__________| | | ttyS0| | |heartbeat | | |backup | | VIP=192.168.7.110/32 (eth0:0)* | ttyS0| | | _____|____ | | | director | | --------| backup |---| DIP=192.168.7.10/24 (eth0) eth1 |__________| | 192.168.0.2 | | | | | ----------------------------------- | | | | RIP=192.168.7.11/24 (eth0) RIP=192.168.7.12/24 (eth0) VIP=192.168.7.110/32 (lo:0) VIP=192.168.7.110/32 (lo:0) ____________ ____________ | | | | | realserver | ----------- | realserver | |____________| |____________|
|
2.2. 設備要求:
因為負載均衡器和真實服務器節點均有軟硬件冗余保障,所以硬件設備可以根據具體資金情況及提供服務規模而定。當然最好采用支持RAID,SCSI,
內存ECC校驗,熱插拔等技術的專用服務器,以提供穩定高效的服務。對于非關鍵業務服務,也可以考慮采用最新支持IDE
RAID(0,1,0+1,1.5,5)的服務器,可以獲得一個良好的性能/價格比。當然,如果你是一個對硬件技術細節非常熟悉,說話又有分量,對自己非
常有信心,敢冒風險,崇尚節約、實用性的人,那么DIY一組高性價比的服務器集群,也是一件非常有意義而且充滿樂趣的工作。
2.3.原始軟件環境:
Red Hat 9.0 完全安裝
Red Hat 9.0 (kernel-2.4.20-8 ) gcc -3.2.2-5
如果你使用的是Red Hat 8 ,那么你很幸運。Red Hat 8
(kernel-2.4.18-14)已經預先打了ipvs的補丁,在預安裝的內核中已將ipvs編譯成模塊,可以通過檢查
/lib/modules/2.4.18-14/kernel/net/ipv4/ipvs 是否存在來判斷??梢灾苯影惭bipvsadm。從Red
Hat 9 (kernel-2.4.20-8),Red Hat 取消了ipvs的補丁及預編譯ipvs為模塊的內核,且Red Hat 9
自帶的kernel-2.4.20-8的內核無法通過ipvs補丁linux-2.4.20-ipvs-1.0.9
.patch.gz的編譯,至少在我的兩臺P4的機器上都沒有通過編譯。標準內核linux-2.4.20.tar.gz則可以通過編譯。所以我們將采用
www.kernel.org上的標準內核kernel-2.4.20.tar.gz來構造我們的集群系統。
2.4.需下載軟件包:
# Linux kernel
http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.gz
# ipvs patch
http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9.patch.gz
# ipvs tar ball
http://www.linuxvirtualserver.org/software/kernel-2.4/ipvs-1.0.9.tar.gz
# hidden patch(已經包括在ipvs-1.0.9.tar.gz,可不用下載)
http://www.ssi.bg/~ja/hidden-2.4.20pre10-1.diff (解決arp 問題 for LVS-DR/LVS-Tun)
# ipvsadm (已包含在ipvs-1.0.9.tar.gz包中, 可不用下載)
# Ldirectord
http://www.linux-ha.org/download/heartbeat-ldirectord-1.0.3-1.i386.rpm
# heartbeat
http://www.linux-ha.org/download/heartbeat-1.0.3.tar.gz
http://www.linux-ha.org/download/heartbeat-1.0.3-1.src.rpm
http://www.linux-ha.org/download/heartbeat-1.0.3-1.i386.rpm
http://www.linux-ha.org/download/heartbeat-pils-1.0.3-1.i386.rpm
http://www.linux-ha.org/download/heartbeat-stonith-1.0.3-1.i386.rpm
2.5. 安裝要求:
2.5.1 Director:
- 內核打non-arp的補丁hidden-2.4.20pre10-1.diff (解決arp problem for
LVS-DR/LVS-Tun,雖然在Directors上運行時并不需要,但硬件環境如果和Realserver類似,內核可以直接放到
RealServer上運行,不用再為realServer重新編譯內核,當然也可不打該補丁。)
- 內核打ipvs的補丁linux-2.4.20-ipvs-1.0.9.patch.gz,重新編譯新內核。
- 運行新內核后編譯安裝ipvsadm。(LVS-NAT (network address translation); LVS-DR
(direct routing) and LVS-Tun (tunneling). 真實服務器 realserver/service
的轉發方式由ipvsadm來設置。)
2.5.2 RealServes: (在LVS-NAT方式下,不需要打任何補?。?/b>
內核打arp的補丁hidden-2.4.20pre10-1.diff (arp problem for LVS-DR/LVS-Tun)編譯新內核。
- 解決Non-arp problem
- 設置缺省網關(gw)
- LVS-NAT: director(DIP)
- LVS-DR, LVS-Tun: 對外路由 (不是director的IP).
如果你不知道你的內核源代碼是否已經預打過ipvs的補丁, 可以詢問你的Linux發行版的制造商或查看相關ipvs 文件,文件名類似于 /usr/src/linux-2.4/net/ipv4/ip_vs_*.c。
2.6. 安裝步驟:
2.6.1 Director或RealServer上內核的安裝:
export D=/tmp/download mkdir $D cd $D wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.20.tar.gz wget http://www.linuxvirtualserver.org/software/kernel-2.4/linux-2.4.20-ipvs-1.0.9 .patch.gz wget http://www.linuxvirtualserver.org/software/kernel-2.4/ipvs-1.0.9.tar.gz
tar zxvf linux-2.4.20.tar.gz tar zxvf ipvs-1.0.9.tar.gz gunzip linux-2.4.20-ipvs-1.0.9.patch.gz mv linux-2.4.20 /usr/src/linux-2.4.20 cd /usr/src rm -f linux-2.4 ln -s linux-2.4.20 linux-2.4 cd linux-2.4 patch -p1 < $D/ipvs-1.0.9/contrib/patches/hidden-2.4.20pre10-1.diff (arp for LVS-DR/LVS-Tun) patch -p1 < $D/linux-2.4.20-ipvs-1.0.9.patch (僅在編譯Director內核時打補?。?br />make mrproper cp /boot/config-2.4.20-8 .config (使用Red Hat 9自帶的config內核配置文件或使用/usr/src/linux-2.4.7-10/configs下的配置文件)
make menuconfig(參照相關ipvs及內核配置) 或在圖形界面運行: make xconfig
|
相關網絡內核選項:

相關LVS內核選項:

make dep make clean make bzImage make modules make modules_install cp arch/i386/boot/bzImage /boot/ vmlinuz-2.4.20-lvs (rs) cp System.map /boot/System.map.2.4.20-lvs (rs) cp vmlinux /boot/vmlinux-2.4.20-lvs (rs) cd /boot rm -f System map ln -s System.map.2.4.20-lvs (rs) System.map
vi /boot/grub/grub.conf: title 2.4.20-lvs root (hd0,0) kernel /boot/vmlinuz-2.4.20-lvs (rs) ro root=/dev/xxx
|
如果要安裝該內核在其它機器上:
tar czf linux-2.4.20-dir.tgz /usr/src/linux-2.4.20/
在其它機器上解壓tar zxvf linux-2.4.20-dir.tgz 放置到/usr/src rm -f linux-2.4 ln -s linux-2.4.20 linux-2.4 cd linux-2.4 make modules_install cp arch/i386/boot/bzImage /boot/ vmlinuz-2.4.20-lvs (rs) cp System.map /boot/System.map.2.4.20-lvs (rs) cd /boot rm -f System map ln -s System.map.2.4.20-lvs (rs) System.map
vi /boot/grub/grub.conf: title 2.4.20-lvs root (hd0,0) kernel /boot/vmlinuz-2.4.20-lvs (rs) ro root=/dev/xxx
|
2.6.2 Director上ipvsadm 的安裝:
用打過ipvs和hidden(for LVS-DR/LVS-Tun)補丁的新內核啟動linux
cd / tmp/download/ipvs-1.0.9/ipvs/ipvsadm make install
|
檢查ipvsadm 探測到內核的ipvs的補丁可以運行
如果成功你會看到類似于如下內容:
director: /usr/src# ipvsadm IP Virtual Server version 0.2.7 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
|
說明安裝成功
運行lsmod | grep ip_vs 可以看到ip_vs模塊已經被插入內核運行。
2.6.3. 運行腳本( Run Scripts )
以下以最常用的LVS-DR模式來介紹相關的腳本設置
( 以Telnet服務, 輪叫(rr)策略為例 )
2.6.3.1 Director上:
#!/bin/bash #---------------mini-rc.lvs_dr-director------------------------ #set ip_forward OFF for vs-dr director (1 on, 0 off) cat /proc/sys/net/ipv4/ip_forward echo 0 >/proc/sys/net/ipv4/ip_forward
#director is not gw for realservers: leave icmp redirects on echo 'setting icmp redirects (1 on, 0 off) ' echo 1 >/proc/sys/net/ipv4/conf/all/send_redirects cat /proc/sys/net/ipv4/conf/all/send_redirects echo 1 >/proc/sys/net/ipv4/conf/default/send_redirects cat /proc/sys/net/ipv4/conf/default/send_redirects echo 1 >/proc/sys/net/ipv4/conf/eth0/send_redirects cat /proc/sys/net/ipv4/conf/eth0/send_redirects
#add ethernet device and routing for VIP 192.168.7.110 #if use backup director ,pay any attention about bellow /sbin/ifconfig eth0:0 192.168.7.110 broadcast 192.168.7.110 netmask 255.255.255.255 up /sbin/route add -host 192.168.7.110 dev eth0:0 #listing ifconfig info for VIP 192.168.7.110 /sbin/ifconfig eth0:0
#check VIP 192.168.7.110 is reachable from self (director) /bin/ping -c 1 192.168.7.110 #listing routing info for VIP 192.168.7.110 /bin/netstat -rn
#setup_ipvsadm_table #clear ipvsadm table /sbin/ipvsadm -C #installing LVS services with ipvsadm #add telnet to VIP with round robin scheduling /sbin/ipvsadm -A -t 192.168.7.110:telnet -s rr
#forward telnet to realserver using direct routing with weight 1 /sbin/ipvsadm -a -t 192.168.7.110:telnet -r 192.168.7.11 -g -w 1 #check realserver reachable from director ping -c 1 192.168.7.11
#forward telnet to realserver using direct routing with weight 1 /sbin/ipvsadm -a -t 192.168.7.110:telnet -r 192.168.7.12 -g -w 1 #check realserver reachable from director ping -c 1 192.168.7.12
#displaying ipvsadm settings /sbin/ipvsadm
#not installing a default gw for LVS_TYPE vs-dr #---------------mini-rc.lvs_dr-director------------------------
|
該段運行腳本對于熟悉Linux網絡配置的讀者來說應該很容易理解。由于LVS是通過對標準內核打補丁,在內核級提供支持,所以在LVS-DR模式
下,首先是進行內核的相關設置。要關閉標準內核下的ip_forward轉發方式,即置為0。同時因為LVS-DR模式下,集群的網關是外部網關,而不是
負載均衡器。所以要打開icmp包的重定向設置send_redirects
置為1。接著就是綁定集群的虛擬服務器的IP地址,并添加一條到該IP地址的主機路由。然后對該虛擬IP做一些必要的自我檢測,同時列出路由表。最后是有
關ipvasdm的設置,首先清空ipvasdm表,然后添加需要提供負載均衡的服務及調度策略,這里例舉的是telnet服務,也可以直接使用端口號,
調度策略為輪叫(rr)策略。最后添加轉發到真實服務器的直接路由,如果有多臺RealServer或需要提供多種服務的負載均衡,依次添加。再做一些到
RealServer的網絡測試(也可不要),最后顯示ipvasdm所有的設置信息。
注意:
ipvs-1.0.9.tar.gz中包含的ipvsadm是1.21版,安裝后在/etc/rc.d/init.d/目錄下自動生成了標準的
init服務腳本,如果你的Director沒有安裝備份服務器,你可以通過服務管理工具讓它在相應的運行級里自動運行,如果Director是HA系
統,則由heartbeat控制運行。
另外該服務腳本提供了配置保存功能。配置文件為:/etc/sysconfig/ipvsadm 你必須手工建立。然后在其中輸入規則和策略:
例如:
-A -t 192.168.7.110:telnet -s rr -A -t 192.168.7.110:http -s rr -a -t 192.168.7.110:telnet -r 192.168.7.11 -g -w 1 -a -t 192.168.7.110:http -r 192.168.7.11 -g -w 1
|
然后存盤。
或直接運行:
/sbin/ipvsadm -A -t 192.168.7.110:telnet -s rr /sbin/ipvsadm -A -t 192.168.7.110:http - rr /sbin/ipvsadm -a -t 192.168.7.110:telnet -r 192.168.7.11 -g -w 1 /sbin/ipvsadm -a -t 192.168.7.110:http -r 192.168.7.11 -g -w 1
|
然后運行:/etc/rc.d/init.d/ipvsadm save
就可以保存當前配置到/etc/sysconfig/ipvsadm文件中。
在具有HA系統的Director上,ipvsadm可以方便地被Heartbeat管理-啟動、停止。Director上的VIP(虛擬)服務器地址由Heartbeat負責設置和切換。
做法如下:
在Heartbeat的配置文件haresources中加類似入如下一行:
linuxha1 IPaddr::192.168.7.110/24/192.168.7.255 ipvsadm ldirectord::www ldirectord::mail
2.6.3.2. RealServers上:
#!/bin/bash #----------mini-rc.lvs_dr-realserver------------------ #installing default gw 192.168.7.254 for vs-dr /sbin/route add default gw 192.168.7.254 #showing routing table /bin/netstat -rn #checking if DEFAULT_GW 192.168.1.254 is reachable ping -c 1 192.168.7.254
#set_realserver_ip_forwarding to OFF (1 on, 0 off). echo 0 >/proc/sys/net/ipv4/ip_forward cat /proc/sys/net/ipv4/ip_forward
#looking for DIP 192.168.7.9 ping -c 1 192.168.7.9
#looking for VIP (will be on director) ping -c 1 192.168.7.110
#install_realserver_vip /sbin/ifconfig lo:0 192.168.7.110 broadcast 192.168.7.110 netmask 255.255.255.255 up #ifconfig output /sbin/ifconfig lo:0 #installing route for VIP 192.168.1.110 on device lo:0 /sbin/route add -host 192.168.7.110 dev lo:0 #listing routing info for VIP 192.168.7.110 /bin/netstat -rn
#hiding interface lo:110, will not arp echo 1 >/proc/sys/net/ipv4/conf/all/hidden cat /proc/sys/net/ipv4/conf/all/hidden echo 1 >/proc/sys/net/ipv4/conf/lo/hidden cat /proc/sys/net/ipv4/conf/lo/hidden
#----------mini-rc.lvs_dr-realserver------------------
|
該段腳本和上面的腳本比較類似,相信不用再多做介紹了。需要注意的是:LVS-DR模式下,缺省網關的設置。集群的網關是外部網關,而不是負載均衡
器。還有就是RealServer上綁定的VIP地址的設備lo:0。另外不要忘了開啟not arp補丁的設置開關。相信你已經很清楚了。
你也可以把以上腳本改寫成符合init語法的標準腳本,放到/etc/rc.d/init.d/下面運行,或直接加到/etc/init.d/rc.local下運行。
改寫為標準init語法腳本如下:
#!/bin/bash # # hidden This shell script takes care of starting and stopping # the ipvs-hidden subsystem (hiddend). # # chkconfig: 2345 78 12 # description: ipvs-hidden # processname: hiddend
prog="hidden"
start(){
echo 0 >/proc/sys/net/ipv4/ip_forward /sbin/ifconfig lo:0 192.168.7.110 broadcast 192.168.7.110 netmask 255.255.255.255 up # installing route for VIP 192.168.1.110 on device lo:0 /sbin/route add -host 192.168.7.110 dev lo:0 # listing routing info for VIP 192.168.7.110 /bin/netstat -rn # hiding interface lo:0, will not arp # echo 1 >/proc/sys/net/ipv4/conf/all/hidden echo 1 >/proc/sys/net/ipv4/conf/lo/hidden
}
stop(){
echo 1 >/proc/sys/net/ipv4/ip_forward /sbin/ifconfig lo:0 192.168.7.110 broadcast 192.168.7.110 netmask 255.255.255.255 down /sbin/route del -host 192.168.7.110 dev lo:0 # echo 0 >/proc/sys/net/ipv4/conf/all/hidden echo 0 >/proc/sys/net/ipv4/conf/lo/hidden } restart(){ stop start }
condrestart(){ [ -e /var/lock/subsys/hiddend ] && restart || : }
# See how we were called. case "" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: " exit 1 esac
exit $?
|
然后:
cp rc.lvs /etc/rc.d/init.d/hiddend chmod 755 /etc/rc.d/init/d/hiddend chkconfig - -add hiddend
|
|