2010年2月24日 星期三

設定開機時自動 fsck 的頻率

Reference:設定常規檔案系統檢查 (Filesystem Check, fsck)忽視fsck 當mount filesystem達到指定的數量

指令:dumpe2fs、tune2fs

因為電腦用途為個人使用,每天開開關關,沒幾個禮拜就會跑 fsck 檢查硬碟,實在很煩,可是又不想把這功能關掉,就來把檢查的掛載次數設多一點。

相關資訊利用

sudo dumpe2fs -h device

來查詢,Maximum mount count 就是設定這個磁區掛載幾次後,下次掛載時便執行 fsck 檢查,修改方式:

sudo tune2fs -c [ Maximum mount count Number] device

另外 Check interval 代表多久檢查一次,修改方式:

sudo tune2fs -i [ interval-between-checks ] device

如果在 /etc/fstab 內設定不檢查的話,用 dumpe2fs 來看上面的數值就是 -1 和 0

這些指令只對 ext2/ext3/ext4 有效,其他格式如果在 /etc/fstab 內設定要檢查的話,不知道有沒有辦法設定檢查時間,還要查一下相關資訊。

2010年1月6日 星期三

搞定不正確的系統時間

忘記從去年的什麼時候開始,每次開機時,系統時間都不準,必須要手動下 sudo ntpd -ds 才能校正,但下次開機時又是一樣的情形,查看 /var/log/daemon.log ,上次關機時 ntpd 明明都有 adjtime ,就覺得很奇怪,原本想說是不是 BIOS 電池沒電,但也不會每次都慢個一兩天,而且在 開機過程中 ntfs-3g 的時間是正常的,非常神奇,明明前後的時間都不對,就只有 ntfs-3g 跑的那段時間是正確的,昨天晚上突然想到 /etc/rc.conf 裡面似乎有 hardwareclock 的選項,才想到用 hwclock 指令查查看,果然問題就出在這邊,上網 google 了一下,才發現解決方法:

rm /var/lib/hwclock/adjtime (開機後會再重新產生,所以不用備份)

利用 ntpd -ds更新系統時間 (我是用 openntpd)

再下 hwclock -w

下次開機時間應該就正常了,不過問題出在哪我還不是很清楚,或許要翻翻 hwclock 的 document 或是上次更新時有將新的rc.conf 安裝到 rc.conf.pacnew,我還沒更新內容的關係?

Reference:
Arch Linux Forum:
My hw clock is randomly off even though I set it right...

吃葡萄不吐葡萄皮:
archlinux无厘头的时间错乱问题

2009年12月17日 星期四

利用 cron 與 rsync 備份資料

Reference:
鳥哥的私房菜 - 例行性工作排程rsync manualA turial on using rsyncrsync exampletar - exclude files

上次電腦當機後,決心要幫電腦資料做定期備份,才不會一次打破整籃雞蛋,我的構想是每天晚上利用 rsync 備份更動最頻繁的 home 到另一顆硬碟上,每周五利用 tar 將不見時會搥心肝的重要資料打包成 gz 存到另一顆硬碟,再燒到光碟上,並存入隨身碟,總共存放在三處,如此一來,資料消失在世界上的風險性相信可以大大降低。

不過存放備份的硬碟是 fat 格式,造成 rsync 時沒辦法複製權限和一堆有的沒的東東而錯誤,卡在那邊花了不少時間,後來就隨它去了,不能設權限也沒差,反正資料在就好,而且用 tar 打包時就可以保留檔案權限了,而 tar 時原本想用 bzip2 或 lzma 壓縮,但是所花的時間多到讓我受不了,乾脆用簡單的 gzip ,有壓總比沒壓好,下一步要把 anacron 搞懂,才不會因為有時電腦沒開而少了一次備份。

備份的 script 都是用 python 寫的,rsync 的 exclude 跟 tar 有點不太一樣,為了研究這個還花了不少時間, 不過有了範本後,下次要寫其他 script 應該可以更快上手。
rsync script:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# use 'rsync' to backup files to a fat partition
# write logs into log_file

import time
import sys
import subprocess as sp

# not configure ACL, xattrs currently(can use -AX to sync)
# the same as -va --compress -stats --delete
# args = " --verbose --archive --compress --stats --delete "

# because sync file from ext3 to vfat lead to errors (vfat don't have
# some file attributes), need to remove some args
args = " --verbose --recursive --times --compress --delete "

# need to sync some windows program, so use exclude
# instead of --cvs-exclude
ex_PATTERN = [ "*~", "*.pyc",\
"**cache**","**Cache**","**CACHE**", "**.macromedia/",\
"**.opera/icons/", "**.thumbnails/"]

exclude = ''.join( map( lambda p: " --exclude=" + p, ex_PATTERN))

SRC = " /home/myHome"
DEST = " /mnt/HardDisk/back/sync"
# there is also --log-file=FILE option
log_file = "/home/mylog.log"

def write_log( messages ):
with open(log_file, 'a') as f:
f.writelines("\n***************************************\n")
f.writelines( time.ctime() )
f.writelines("\n***************************************\n")
f.writelines( messages )

try:
ret = sp.Popen(["rsync" + args + exclude + SRC + DEST],\
stdout=sp.PIPE,shell=True).communicate()[0]
write_log(ret)
except OSError, e:
write_log("Execution failed:" + e )





tar script:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# use 'tar' to backup files, save them as my_tar_Year_Month_Day.tar.gz
# write logs into log_file

import time
import sys
import subprocess as sp

# use -f in front of DEST to prevent args mix up
args = " -czv --exclude-caches-all"

SRC = " /mnt/HardDisk/my_precious \
/mnt/HardDisk/rotl "

TIME_STRING = time.strftime( "%Y_%m_%d", time.localtime() )

DEST = " /mnt/HardDisk/bak/mytar_" + TIME_STRING + ".tar.gz"

log_file = "/home/mytargz.log"

ex_PATTERN = [ "*~", "*.pyc",\
"**cache**", "**Cache**","**CACHE**",\
"**.macromedia/", "**.opera/icons/", "**.thumbnails/"]

exclude = ''.join( map( lambda p: " --exclude=" + p, ex_PATTERN))


def write_log( messages ):
with open(log_file, 'a') as f:
f.writelines("\n***************************************\n")
f.writelines( time.ctime() )
f.writelines("\n***************************************\n")
f.writelines( messages )

try:
# use -f in front of DEST to prevent args mix up
ret = sp.Popen(["tar" + args + exclude + " -f " + DEST + SRC ],\
stdout=sp.PIPE,shell=True).communicate()[0]
write_log(ret)
except OSError, e:
write_log("Execution failed:" + e )

2009年12月8日 星期二

Easy iptables log analyzer

之前寫 iptables rule 的時候,偶爾會翻一下 log 來看有沒有哪些設定出問題,可是蠢人如我只會用簡單的 grep ,主要還是靠肉眼檢視,網路上找到的 analyzer 還要架 http 伺服器和 database,想說只是自己單機要用,不必那麼麻煩,也順便練習寫 python ,就寫了這個小程式做篩選,但先天規劃不良,後來反覆改寫花了不少時間,改到現在也沒那個熱血去翻 iptables log 了 XDD~

這程式主要是利用 sqlite3 這個 module 來把分析過後的 log 存在記憶體內,所以每次使用都要分析一遍,並沒有存實體檔案,因為我當初只想說偶爾看一下而已,沒想太多 :)

分析跑完後會出現一個 CLI ,輸入?就會列出可使用的 command list,主要就是送 query 查詢,可以選擇要顯示哪些欄位,也有些暫存的字串可以紀錄,不用每次打一大串指令,查詢完會先顯示有多少符合的 log,然後就可決定要將結果輸出或存成檔案。

分析的欄位有點簡陋,只有 Interface, IP , Port, Protocol, TCP flags ,其他的全包成同一個字串,有很大的改善空間,但是我很懶惰,所以... XD

檔案下載:eila.tar.gz

2009年12月3日 星期四

[Link] Python Speed

Python Speed
PerformanceTips
Python Patterns - An Optimization Anecdote

可以用 profile 來檢視執行效率

看了以上幾篇,讓我想法改變不少,不過如果完全照裡面的作法來寫,程式碼會變得不怎麼好看而且不好維護,感覺跟 zen of python 有相抵觸

另外還翻到在 lambda 裡面用 if / else 的方法:
  1. Boolean Operations:利用 and, or
  2. x if C else y:會先判斷 C ,再決定要執行 x 或 y
感覺上第一個比較不直覺,但是第二個似乎也不怎麼好看...