2008年6月18日 星期三

MySQL的一些操作技巧

如果要backup MySQL database, 可以用mysqldump save成text file, 可以保存整個database或個別table, 要restore時可以在mysql 裡用source filename即可.

MySQL statement裡可以用變數來增加變化, 如想在select的result裡最左邊加一個column來表示行數, 而這個行數本身沒有記錄在table裡, 是select statement執行的時間動態產生.方法是:

1. set @v1=0;
(這裡是宣告一個叫@v1的變數, 值為0)
2. select @v1:=@v1+1, name from table;
(這裡是把最左邊的column定為@v1, 而@v1每次都會+1, 所以可以代表行數, 也可以混合其他function, 如 concat('no. ',@v1:=@v1+1) 這樣行數會變成"no. 1", "no. 2", ...)
p.s. 要注意是用":="而不是平常statement用的"="

2008年5月14日 星期三

Drupal

安裝好Drupal, cleanURL無法啟動, drupal.org中提到需要在/etc/httpd/conf/http.conf中uncomment LoadModule rewrite_module modules/mod_rewrite.so 這行才可以.
但照做了也一樣無法啟動, 後來看下去才知道要加

<Directory "/var/www/html/drupal-6.2">
AllowOverride All
</Directory>

加了以後就能啟動

2008年4月7日 星期一

find 指令 time 選項及 xargs 一起使用

今天看了一下catchall的mailbox, 有9萬多封郵件, 我的postfix是以directory方式儲存郵件,每個郵件都是一個檔案, 開次一打開這個資料夾都很慢, 所以想按日期分類, 減少單一資料夾的檔案數.

我的catchall是以IMAP連接dovecot的式, 需要先create 一些按日期的資料夾, 以2008-01, 2008-02, ...的分類成式, 由於每個用也有兩萬封, 還是太多, 所以再在每個月裡create 01-10, 11-20, 11-31資料夾, 按日分類, 兩這些資料夾的實際path是在catchall Maildir/.INBOX.2008-01.01-10, Maildir/.INBOX.2008-01.11-20, ...把郵件按日期move到這些folder裡的new或cur即可(dovecot會在IMAP登入時把郵件從new移到cur).

但catchall inbox的郵件太多, 執行ls等指令很慢, 單用mv 及 rm等指令一次也不能處理太多檔案. 其中一個辦法是以find找到想移動的檔案再用xargs送到mv處理, find 能處理的檔案很多, 但好像也有限(至少9萬個處理不了, 會直接停止執行), 所以find的使用要有點技巧.

find的功能很多, 這次要以郵件檔的modification time來判斷它到達server的時間, 所以要用mtime選項(因為ctime在移動後會改為移動的時間, 所以執行第二次已經不能判斷).

find . -mtime n 當中 . 為目前路徑搜尋, n 為數字, 代表多少個24小時. mtime default是以當前時間的n*24小時計算, 如果想要以當日的24:00作基準(實際是向未來的時間方向移動,即明日的00:00的n*24小時計算),需要加上-daystart參數.

n 的數值為 0 時代表現在到24小時前之間, 加上daystart代表現在到今天00:00之間
n 的數值為 1 時代表24小時前到48小時前之間, 加上daystart代表今天00:00到昨天00:00之間(即整個昨天)
n 還可以加+或-, 分別代表1(24小時前到48小時前的時段)的兩邊, 但不包括1, 即-1代表現在(理論上是無限的未來)到24小時前的時段, +1代表48小時及之前(理論上是無限的過去)的時段. -0應該沒有任何結果, 除非有未來建做的檔案存在, 有這樣的檔案應該是電腦的時間調校錯了.
之外mtime可以組會使用, 如:
find . -mtime +1 -mtime -3 這裡指48小時前及未到72小時之間, 相當於 -mtime 2.

了解mtime的用法後回到剛才的一個問題上, find遇到超出數量時也不能運作, 所以在我那個有9萬個files的folder上使用時需要些技巧, 經我測試發覺組合的mtime是由左至右執行,例如我想找48小時前至72小時前之間的files, 需要用 -mtime +1 及 -mtime -3, 如果是:

find . -mtime +1 -mtime -3 這樣會先執行 +1 , 即所有48小時前的檔案, 以我的情況是至少有8萬多個, 一段時間後自動跳出執行, 沒有結果. 相反:

find . -mtime -3 -mtime +1 這樣會先執行 -3, 現在至72小時前之間, 有幾千, 沒有超出限量, 跟著再以 +1把現在至48小時前之間的除去, 得到我想要的結果.

以find 找到檔案後要送給xargs再執行mv:
find . -mtime -3 -time +1 | xargs -i mv {} destination.
當中 -i 代表用{}代表前面送來的結果(這裡即find的結果), {}代表find的結果, 並作為mv的source, destination代表目標路徑.
除了-i外可以用 -I, 差別是-I可以指定代表結果的字完, 如:
xargs -i mv {} /tmp
相當於:
xargs -I [] mv [] /tmp

最後成功把emails按日期分類.

2008年1月13日 星期日

NTP server 設定

安裝套件:
ntp: NTP server的主要套件啦,包括設定檔以及執行檔等等,都是這個套件提供的;

tzdata: 套件名稱為『 Time Zone data 』的縮寫,提供了各個時區對應的顯示格式。

主要檔案:
/etc/ntp.conf: ntp的主要設定檔.
/usr/sbin/ntpd: ntp的daemon, 啟動時會讀取ntp.conf的設定.
/usr/sbin/ntpdate: ntp的client, 用來連接NTP server.
/bin/date: 可以顯示或修改時間, 但不會存到BIOS.
/sbin/hwclock: root才能執行,把時間寫入BIOS.

ntp是使用類似於DNS的階層式的架構, 每一層稱為stratum, 下層stratum會向上曾同步, 最多可以有15層.在Linux架設ntp server主要設定ntp.conf

ntp.conf中可以用restrict參數來限制連線, 其用法是:
restrict [ip] mask [netmask_ip] [parameter]
parameter有:
  1. ignore 拒絶所有ntp連線,
  2. nomodify 用戶不能修改,
  3. noquery 用戶不能查詢,等於不提供網絡校時,
  4. notrap 不提供trap ( remote event logging ),
  5. notrust 拒絶沒有認証的用戶.
如沒加任何parameter代表不設任何限制,另外上層的NTP server必須在被允許的清單內才能同步.
設定上層NTP server:
server [ ip or hostname ] [ prefer ]
其中prefer代表優先使用

設定記錄BIOS與NTP server震盪的誤差:
driftfile [可以被ntpd寫入的目錄及檔案 ]

設定以certificate來控制權限:
key [ keyfile]

另外在 /etc/sysconfig/ntpd裡面的SYNC_HWCLOCK改為yes:
SYNC_HWCLOCK=yes
可以就會把ntpd同步的時間寫入BIOS中

Client可以用ntpdate [ip or hostname]來與NTP server同步時間,然後用hwclock -w寫入BIOS即可.
在/etc/crontab中加入
10 5 * * * /usr/sbin/ntpdate server_ip && /sbin/hwclock -w
可以在每天5:10時與server_ip同步時間.

port number

ntp udp 123

2008年1月10日 星期四

Postfix > Extmail transport的設定

Extmail預設是使用maildrop作virtual mailbox 的transport, 但因為我公司的郵件帳號比較特別, 同一domain的郵件地址會分佈在兩個不同的mailserver上面, 所以必須使用/etc/postfix/transport來各別指定.

首先maildrop可以在master.cf裡設定,其主要作用是以pipe的方式直接把郵件存在用戶的郵箱裡,maildrop可以經過各變數(如${user}, ${nexthop}, ${recipient})等得出郵箱的用戶名及PATH,關於maildrop的設定可以參考MAILDROP_README.

為了要各別處理郵件帳號,需要用到transport檔案,屬於本機Extmail的帳號可以直接設為maildrop, 其他的帳號可以用relay:[ip]:port來redirect到其他mailserver.

/etc/postfix/transport example:

user1@example.com maildrop
user2@example.com maildrop
exuser@example.com relay:[192.168.0.1]:25

2008年1月9日 星期三

Postfix > Extmail裡webmail不受smtpd_recipient_restrictions控制的問題

在設好Extmail,讓它能和Postfix正常運作後,發現了一個問題,用smtp連線的用戶能正常受到Postfix中main.cf裡面的smtp_recipient_restrictions控制,但經webmail發出去的信卻好像不受smtp_recipient_restrictions控制,可能是安裝Extmail時沒有設定好,但又找不到問題所在.於是從測試郵件中的header尋找線索.

在一輪測試後發現一般用smtp連線所發出去的郵件是經過master.cf裡smtp inet那個transport出去的,而webmail發的郵件是從pickup出去的,也許問題就出在這裡,pickup沒有調用main.cf裡的smtp_recipient_restrictions.

於是嘗試修改master.cf, 在pickup這個transport下加上options:
-o myhostname=pickup.example.com
-o content_filter=smtp:[127.0.0.1]:25
其中myhostname只是為了在郵件header中方便確認經過pickup的位置及時間, 可以不加,example.com是隨便輸入的,而content_filter會把郵件傳送給smtp (注意是smtp unix, 而不是smtp inet),然後會以smtp protocol送到127.0.0.1:25中,然後就會經過smtpd_recipient_restrictions處理.

若不直接丟給port 25,中間還可以經過其他的處理,如在master.cf中加上127.0.0.1:10026這個transport來處理
127.0.0.1:10026 inet n - n - - smtpd
-o myhostname=redirect.example.com
-o content_filter=[127.0.0.1]:10024
10024是我的Postfix上amavisd的port, 這會把信丟給amavisd, 同樣方法可以針對不同的transport在中間加多層選項及防毒軟件.

Postfix > master.cf的內容

前陣子為了要限制一部份公司裡的郵件帳號,不讓他們發送郵件到公司以外的地方,於是打算用smtpd_restriction_classes來區分受限制及不受限制的帳號,然後用master.cf設定,以下是一些關於master.cf的內容.

master.cf裡面主要是定義各種transport,每一個row代表一個transport, 有些row是以空白開頭的,那是代表同屬於上一row的transport的一些額外設定值.每個column代表transport的設定值,有以下幾個:
  1. service name: 代表名字,名字的命名方法受另一設定值type所影響.
  2. type: transport的類型, 分別有inet, unix及fifo.
      • inet代表network sockets,可以用IP:port為命名方式,可以只用port命名,代表在本機上,IP可以host取代, port也可以用/etc/services裡的服務取代.
      • unix代表Unix domain socket, 用於同一主機的兩個processes溝通用,需要用特別的file作溝通用,命名方式就像unix的file命名,但要去掉directory部份.
      • fifo,與unix類似.
  3. private: 是否只給Postfix自己使用, y代表是, n代表否, -代表default, default為y. inet的應該設定為n,否則其他processes不能使用.
  4. unpriv: unprivileged account能否使用, Postfix以mail_owner的設定值運行(default為postfix),該account只能做他基本的需求.unpriv為y代表unprivileged account可以執行, n代表要有root權限才能執行.
  5. chroot: 是否以chroot方式運行,chroot的位置定義在master.cf裡的queue_directory.
  6. wakeup: 有些service需要定時執行,如pickup, flush, qmgr.數字代表秒數, 後面加?代表有使用的才會被叫醒, 0代表永不叫醒, default為0, 一般只有少數需要被叫醒,通常Postfix都已設定好,無需自行設定.
  7. maxproc: 同時能調用的數目,0為無限, 如無指定則以main.cf中的default_process_limit為值,default為100.
  8. command: 實際執行的指令程式, 指令程式的位置應該要在main.cfdaemon_directory裡面,default為/usr/libexec/postfix. 可以加-v來log, -D來debug.
另外可以在每個transport下一row以空白開頭,然後加-o加override一些main.cf裡的設定,如:

smtp-quick unix - - n - - smtp
-o smtp_connect_timeout=5s

這樣就建立了一個smtp-quick transport, 所有設定值都會以main.cf的設定為準, 除了smtp_connect_timeout以外.