前言:
了解named
如果說我們安裝的rpm包不符合我們的要求怎麼辦、比如說我們想起用named的線程模式、比如說我想讓他禁用IPv6、比如說我們想啟用某種特性、而rpm在編譯時沒有提供、那這時我們隻能去手動編譯安裝了,那如何去編譯安裝named:
編譯安裝named有一個麻煩之處、所有的配置檔案你都得自己去建立、像/var/named/這個目錄、編譯安裝時連這個目錄都不會存在、得自己去建立這個目錄、裡面的各種配置檔案、區域檔案、像根的、localhost的、以及localhost的反向的、都得手動去做、連我們service啟動腳本都沒、是以不到萬不得以最好别去編譯他、因為很麻煩、但對于我們學習來講、我們應該是變得法的去折騰自己、活着就是折騰嘛、那我們各種方法都去摸索一遍、将來我們真要用得着了也好應對。
首先上來就同步一下我們的時間:
# hwclock -s
然後檢查一下安裝環境所需要的開發包組、確定所依賴的開發包組都裝有了、我這裡沒有裝、那我就用yum來裝一下吧:
# yum -y groupinstall "Development Tools"
# yum -y groupinstall "Server Platform Development"
# yum grouplist
裝好後檢視一下、最主要兩項:Development tools和Server Platform Development
然後我們就去下載下傳源碼包了、這裡我就去www.isc.org/donloads/官方網站下載下傳了、支援使用的版本是9.9.5、目前使用的穩定版、這個版本中已經自帶dlz了、以前的版本沒有自帶的、安裝時要裝這個dlz的、如果我們将來人希望指資源記錄基于資料庫的方式存放的話、而且要能夠現場檢索、現場響應的話、則自定義啟用dlz功能即可、下載下傳好我們就去解壓縮:
# tar xf bind-9.9.5.tar.gz
這裡注意一下:我們要去編譯安裝一個服務、首先要去看他的README、然後看他的INSTALL、大體了解一下有沒有我們所需要的資訊、當然我們這裡就不多說了、直接往下走:
# ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named --enable-threads --enable-epoll --disable-chroot
--prefix=/usr/local/bind9:指定編譯存放的路徑
--sysconfdir=/etc/named:指定配置檔案存放路徑
--enable-threads:啟用了多線程的功能
然後make和make install就OK了、安裝完成就可以去配置了
# make && make install
我們前面說過、編譯安裝named什麼都得自己建立、使用者也沒有的、是以我們得給他建立一個使用者先、而且使用者是系統使用者、要加-r、系統使用者不會給他建立家目錄的:
先建立使用者組:
# groupadd -g 53 -r named
# useradd -g named -r named
這裡我們先去建立named的工作目錄、然後建立named.ca這個檔案:
# mkdir /var/named
這裡@後面的IP是能通路網際網路的伺服器、生成的資料存在到/var/named/named.ca中去
# dig -t NS . @172.16.0.1 > /var/named/named.ca
然後再去編輯/etc/named/named.conf的配置檔案、這個檔案也沒有、需要自己去編寫的:
# vim /etc/named/named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<code>#定義全局的</code>
<code> </code><code>options {</code>
<code> </code><code>#定義named的固定工作路徑</code>
<code> </code><code>directory </code><code>"/var/named"</code><code>;</code>
<code> </code><code>};</code>
<code> </code><code>#定義根的區域</code>
<code> </code><code>zone </code><code>"."</code> <code>IN {</code>
<code> </code><code>type</code> <code>hint; </code><code>#類型、hint表示為根的</code>
<code> </code><code>file</code> <code>"named.ca"</code><code>; </code><code>#指定的檔案</code>
<code> </code><code>#定義本本地的區域</code>
<code> </code><code>zone </code><code>"localhost"</code> <code>IN {</code>
<code> </code><code>type</code> <code>master; </code><code>#類型屬于master、屬于自己的</code>
<code> </code><code>file</code> <code>"named.localhost"</code><code>; </code><code>#指定的檔案</code>
<code> </code><code>allow-transfer { none; }; </code><code>#不允許任何人傳送的</code>
<code> </code><code>#定義反向解析的</code>
<code> </code><code>zone </code><code>"0.0.127.in-addr.arpa"</code> <code>IN {</code>
<code> </code><code>type</code> <code>master; </code><code>#類型屬于master、屬于自己的</code>
<code> </code><code>file</code> <code>"named.loopback"</code><code>; </code><code>#指定的檔案</code>
<code> </code><code>allow-transfer { none; };</code><code>#不允許任何人傳送的</code>
配置檔案中的三個檔案named.ca、named.localhost、named.loopback上面已經提供有一個了named.ca了、還有這兩個named.localhost、named.loopback、同樣我們也得提供、也是在/var/named目錄下建立:
# vim /var/named/named.localhost
<code>$TTL 86400 ;定義宏</code>
<code>@ IN SOA localhost admin.localhost. (</code>
<code> </code><code>2014031101 ;序列号</code>
<code> </code><code>2H ;重新整理時間</code>
<code> </code><code>10M ;失敗時重試間隔時間</code>
<code> </code><code>7D ;過期時間</code>
<code> </code><code>1D) ;否定答案的時間</code>
<code> </code><code>IN NS localhost.</code>
<code>localhost. IN A 172.0.0.1</code>
然後複制一份改寫named.loopback的檔案:
# cp /var/named/named.localhost /var/named/named.loopback
# vim named.loopback
<code>$TTL 86400</code>
<code> </code><code>2014031101</code>
<code> </code><code>2H</code>
<code> </code><code>10M</code>
<code> </code><code>7D</code>
<code> </code><code>1D )</code>
<code>1 IN PTR localhost.</code>
如果想用rndc遠端登入可以生成一個/etc/named/rndc.conf的配置檔案:
# /usr/local/bind9/sbin/rndc-confgen -r /dev/urandom > /etc/named/rndc.conf
到這裡我們别忘了給named.conf和rndc.conf修改屬主屬組和權限:
# chown root:named /etc/named/named.conf
# chown root:named /etc/named/rndc.conf
# chown root:named /var/named/*
# chmod 640 /etc/named/named.conf
# chmod 640 /etc/named/rndc.conf
# chmod 640 /var/named/*
為了友善、我們在PATH下加個的路徑、/etc/profile.d/named.sh:
# vim /etc/profile.d/named.sh
export PATH=/usr/local/bind9/bin:/usr/local/bind9/sbin:$PATH
在我們的終端重新登入一下就可以生效了
好的、檢查一下我們的區域檔案有沒有文法錯誤、然後就可以啟動了:
# named-checkzone "localhost" /var/named/named.localhost
# named-checkzone "0.0.127.in-addr.arpa" /var/named/named.loopback
# named -u named #這個表示以named使用者啟動named
# ss -tunl | grep "\<53\>" 然後再檢視一下有沒有監聽53号端口
最後、因為他是一個服務、是以我們要為他提供一個服務腳本、以後可以利用腳本啟動、編輯/etc/rc.d/init.d/named:
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<code># vim /etc/rc.d/init.d/named</code>
<code> </code><code>#!/bin/bash</code>
<code> </code><code>#</code>
<code> </code><code># description: named daemon 描述資訊</code>
<code> </code><code># chkconfig: - 25 88 啟動和關閉級别</code>
<code> </code><code># 啟動named的pid檔案、其實檔案路徑我們都可以自己指定的</code>
<code> </code><code>pidFile=</code><code>/usr/local/bind9/var/run/named</code><code>.pid</code>
<code> </code><code># 啟動服務時的鎖檔案、判斷一個服務是不是啟動是靠這個鎖檔案的</code>
<code> </code><code>lockFile=</code><code>/var/lock/subsys/named</code>
<code> </code><code># named的配置檔案路徑</code>
<code> </code><code>confFile=</code><code>/etc/named/named</code><code>.conf</code>
<code> </code><code># 判斷/etc/rc.d/init.d/functions路徑下的functios是否存在這個檔案、存在就sources進來</code>
<code> </code><code>[ -r </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code> <code>] && . </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>
<code> </code><code># 定義啟動方法</code>
<code> </code><code>start() {</code>
<code> </code><code># 判斷鎖檔案是否存在、如果存在就說服務已經啟動并退出</code>
<code> </code><code>if</code> <code>[ -e $lockFile ]; </code><code>then</code>
<code> </code><code>echo</code> <code>"named is already running..."</code>
<code> </code><code>exit</code> <code>0</code>
<code> </code><code>fi</code>
<code> </code><code># 列印服務已經啟動的資訊</code>
<code> </code><code>echo</code> <code>-n </code><code>"Starting named:"</code>
<code> </code><code># 調用functions中的daemon方法、并用--pidfile指定pid檔案在什麼地方、還指定使用者和配置檔案、我們本來是直接啟用named的、現在利用daemon這個函數來啟用這個服務、他會獲得很多額外的屬性、如果成功了會幫我們列印什麼[ OK ]的、還可以做判斷</code>
<code> </code><code>daemon --pidfile </code><code>"$pidFile"</code> <code>/usr/local/bind9/sbin/named</code> <code>-u named -c </code><code>"$confFile"</code>
<code> </code><code>RETVAL=$?</code>
<code> </code><code>echo</code>
<code> </code><code># 判斷上面的指令是否執行成功、說明啟動成功</code>
<code> </code><code>if</code> <code>[ $RETVAL -</code><code>eq</code> <code>0 ]; </code><code>then</code>
<code> </code><code># 如果判斷成功、就建立鎖檔案</code>
<code> </code><code>touch</code> <code>$lockFile</code>
<code> </code><code>return</code> <code>$RETVAL</code>
<code> </code><code>else</code>
<code> </code><code># 否則、就是失敗了、那就删除鎖檔案和pid檔案</code>
<code> </code><code>rm</code> <code>-f $lockFile $pidFile</code>
<code> </code><code>return</code> <code>1</code>
<code> </code><code>}</code>
<code> </code><code># 定義停止方法</code>
<code> </code><code>stop() {</code>
<code> </code><code># 如果鎖檔案不存在</code>
<code> </code><code>if</code> <code>[ ! -e $lockFile ]; </code><code>then</code>
<code> </code><code># 說明服務還沒有啟動</code>
<code> </code><code>echo</code> <code>"named is stopped."</code>
<code> </code><code>echo</code> <code>-n </code><code>"Stopping named:"</code>
<code> </code><code>killproc named</code>
<code> </code><code># 判斷以上的指令是否執行停止成功、如果成功</code>
<code> </code><code>if</code> <code>[ $RETVAL -</code><code>eq</code> <code>0 ];</code><code>then</code>
<code> </code><code># 删除鎖檔案和pid檔案</code>
<code> </code><code>return</code> <code>0</code>
<code> </code><code># 否則列印說沒能正常停止</code>
<code> </code><code>echo</code> <code>"Cannot stop named."</code>
<code> </code><code># 調用functions中的函數、會列印失敗</code>
<code> </code><code>failure</code>
<code> </code><code># 定義重新開機服務</code>
<code> </code><code>restart() {</code>
<code> </code><code># 調用停止方法</code>
<code> </code><code>stop</code>
<code> </code><code># 睡眠2秒</code>
<code> </code><code>sleep</code> <code>2</code>
<code> </code><code># 調用啟動方法</code>
<code> </code><code>start</code>
<code> </code><code># 定義重新加載服務方法</code>
<code> </code><code>reload() {</code>
<code> </code><code>echo</code> <code>-n </code><code>"Reloading named: "</code>
<code> </code><code># killprco HUP信号、named程序的信号</code>
<code> </code><code>killproc named -HUP</code>
<code> </code><code>return</code> <code>$RETVAL</code>
<code> </code><code># 定義服務狀态</code>
<code> </code><code>status() {</code>
<code> </code><code>if</code> <code>pidof named &> </code><code>/dev/null</code><code>; </code><code>then</code>
<code> </code><code>echo</code> <code>-n </code><code>"named is running..."</code>
<code> </code><code>success</code>
<code> </code><code>echo</code>
<code> </code><code>echo</code> <code>-n </code><code>"named is stopped..."</code>
<code> </code><code># 定義錯誤提示資訊</code>
<code> </code><code>usage() {</code>
<code> </code><code>echo</code> <code>"Usage: named {start|stop|restart|status|reload}"</code>
<code> </code><code>case</code> <code>$1 </code><code>in</code>
<code> </code><code>start)</code>
<code> </code><code>start ;;</code>
<code> </code><code>stop)</code>
<code> </code><code>stop ;;</code>
<code> </code><code>restart)</code>
<code> </code><code>restart ;;</code>
<code> </code><code>status)</code>
<code> </code><code>status ;;</code>
<code> </code><code>reload)</code>
<code> </code><code>reload ;;</code>
<code> </code><code>*)</code>
<code> </code><code>usage</code>
<code> </code><code>exit</code> <code>4 ;;</code>
<code> </code><code>esac</code>
OK、到這裡儲存退出,給他個執行權限
# chmod +x /etc/rc.d/init.d/named
再加到chkconfig裡面去:
# chkconfig --add named
# chkconfig --list named
=============================我是分隔線==========================================
本文轉自 wei0164 51CTO部落格,原文連結:http://blog.51cto.com/tanxw/1376088,如需轉載請自行聯系原作者