Saturday, November 26, 2005

kqemu tips

Mặc định kqemu cho phép tối đa 4 máy ảo sử dụng /dev/kqemu cùng lúc (max_instanses=4). Để cho phép nhiều hơn 4 máy ảo, modprobe với tham số max_instanses

# rmmod kqemu
# modprobe kqemu max_instanses=8


kqemu cũng đòi hỏi phải có /dev/shm còn trống lớn hơn lượng RAM của máy ảo yêu cầu, có thể trick bằng cách mount lại /dev/shm với dung lượng lớn hơn cả RAM của máy thật (tất nhiên tốc độ sẽ chậm vì thực chất là swap)

mount -t tmpfs -o size=512M /dev/shm /dev/shm

Wednesday, November 16, 2005

Máy ảo: Qemu xứng đáng thay thế VMWare Workstation?

Ảo hoá không chỉ là một xu hướng, nó còn là giải pháp hữu hiệu, tiết kiệm. Từ trước đến nay tôi vẫn quen dùng VMWare Workstation (!?) như là sự lựa chọn số một cho máy ảo bởi nó ... quá xịn! VMWare cũng mới cung cấp một phiên bản miễn phí VMWare Player khiến nó càng là một đối thủ nặng ký với các phần mềm cạnh tranh khác. Làm việc ngày càng nhiều với máy ảo Linux, điều tôi cần chủ yếu chỉ là thao tác từ xa qua mạng ảo, VMWare dường như ... thừa năng lực. Tôi đã tìm ra một giải pháp khác hoàn toàn free có thể thay thế được cho VMWare trên máy của mình, đó là Qemu.

Qemu khá gọn nhẹ, chạy nhanh - đặc biệt với kqemu (không open source). Một điểm khiến Qemu ngon lành hơn những phần mềm ảo hoá open source khác là: dòng lệnh đơn giản (có một số giao diện đồ hoạ như qemu-launcher, kqemu, QGui, QEMU Manager) và hỗ trợ cả Windows. Qemu cũng cho phép thiết lập mạng ảo dạng Bridge/NAT/Host only như với VMWare, tuy nhiên không ... có sẵn, cần một chút tay chân. Để thiết lập mạng ảo dạng Bridge/NAT ttrên Linux host tốt nhất là dùng VDE + Tun/Tap + bridge-utils. VDE (virtual distributed ethernet) đặc biệt hay là có thể nối nhiều switch ảo trên nhiều máy khác nhau qua ssh, cho phép lập một mạng riêng các máy ảo trên nhiều máy host. Hy vọng sau này sẽ có một GUI cho Qemu hỗ trợ thiết lập mạng ảo dễ dàng. Qemu cũng hỗ trợ cơ chế tương tự suspend/restore của VMWare qua savevm/loadvm, có cả snapshot và ổ đĩa ảo có kích thước tăng dần thay vì cấp phát một lần.

Chưa có thời gian để thử nghiệm ảo hoá các thiết bị ngoại vi trên Qemu như vga, video, sound, usb, wireless,... nhưng hiện tại tôi có thể hài lòng xem Qemu là một thay thế xứng đáng cho VMWare.

Qemu + LiveCD có thể là cách dễ nhất để đưa Linux đến giảng đường!

Saturday, November 05, 2005

Mailman site administration tips

GNU Mailman là phần mềm quản lý mailing list mạnh được sử dụng khá rộng rãi trên Internet. Mailman đi kèm giao diện quản trị qua web và dòng lệnh được viết bằng ngôn ngữ Python. Nếu bạn là site admin của hàng trăm mailing list và muốn thay đổi một option trên tất cả các list, sử dụng giao diện web là điều không tưởng. Script "withlist" đi kèm trong Mailman có thể giúp admin thực hiện các thao tác quản trị bằng dòng lệnh hàng loạt. Để sử dụng cần có một chút xíu kiến thức về Python.

Nội dung sau trích từ phần hướng dẫn của withlist:

Here's an example of how to use the -r option. Say you have a file in the
Mailman installation directory called `listaddr.py', with the following
two functions:

def listaddr(mlist):
print mlist.GetListEmail()

def requestaddr(mlist):
print mlist.GetRequestEmail()

Now, from the command line you can print the list's posting address by running
the following from the command line:

% bin/withlist -r listaddr mylist
Loading list: mylist (unlocked)
Importing listaddr ...
Running listaddr.listaddr() ...
mylist@myhost.com

And you can print the list's request address by running:

% bin/withlist -r listaddr.requestaddr mylist
Loading list: mylist (unlocked)
Importing listaddr ...
Running listaddr.requestaddr() ...
mylist-request@myhost.com


Ví dụ trên là cơ sở để viết các module thực hiện các thao tác theo ý muốn. Để xem trợ giúp các hàm/biến của module Mailman:

$ (MAILMAN_DIR)/bin/withlist listname
Loading list (unlocked)
The variable `m' is the listname MailList instance
>>> help()
help> modules Mailman


Script sau dùng là một ví dụ dùng để đặt option khi tạo member mới cho một list:


---mmtool.py---
from Mailman import mm_cfg

# setting the default new member options
def set_new_member_options(mList):
mList.Lock()
mList.new_member_options=258
mList.Save()
mList.Unlock()

# resetting option notmetoo for all exist members
def reset_notmetoo_options(mList):
mList.Lock()
for member in mList.getMembers():
mList.setMemberOption(member, mm_cfg.DontReceiveOwnPosts, 1)

mList.Save()
mList.Unlock()
---mmtool.py---


Sử dụng:
- Đặt new_member_options cho một list

$ (MAILMAN_DIR)/bin/withlist -r mmtool.set_new_member_options listname

- Reset notmetoo option cho tất cả các list

$ (MAILMAN_DIR)/bin/withlist -a -r mmtool.reset_notmetoo_options


Happy Pythoning!

Install netdisco-0.94 on CentOS/Fedora Core with apache2/mos_perl2

Netdisco là một công cụ nguồn mở khá mạnh giúp quản lý các thiết bị Cisco như switch, router thông qua SNMP. Tài liệu hướng dẫn cài đặt cho Netdisco chỉ hỗ trợ Apache 1.x, điều này gây không ít khó khăn cho các admin muốn sử dụng những bản phân phối mới như CenOS 4, Fedora Core 4 với Apache2 đi kèm. Trên mailing list trao đổi của Netdisco có bàn về vấn đề này nhưng chưa có cài đặt thành công nào được báo cáo.

Sau 2 ngày vật lộn, tôi đã cài đặt thành công Netdisco trên CentOS 4.1 với Apache2 cách đây ... hơn 1 tháng, và đã đưa vào sử dụng. Tuy nhiên, bây giờ mới có chút thời gian để dọn dẹp và ghi lại cách cài đặt. Sau đây là các bước chính để cài đặt Netdisco 0.94 với Apache2/mod_perl2, các bước không được đề cập đề nghị xem tài liệu cài đặt trên website netdisco.

1. Install CPAN stuff
cpan> install Digest::MD5
cpan> install Digest::SHA1
cpan> install Bundle::DBI
cpan> install DBD::Pg
cpan> install DB_File
cpan> install Apache::Session
cpan> force install Apache::Test
cpan> install Apache::Request
cpan> install HTML::Entities
cpan> install HTML::Mason
cpan> install MasonX::Request::WithApacheSession
cpan> install Graph
cpan> install GraphViz
cpan> install Compress::Zlib
cpan> install Net::NBName
cpan> force install Apache::DBI
cpan> install Exception::Class
cpan> install Params::Validate
cpan> install Class::Container
cpan> install Apache::Session::Wrapper

2. Install mod_perl2
http://search.cpan.org/CPAN/authors/id/G/GO/GOZER/mod_perl-2.0.1.tar.gz

3. Install MasonX-Apache2Handler
http://search.cpan.org/CPAN/authors/id/B/BE/BEAU/MasonX-Apache2Handler-0.05.tar.gz

4. Install libapreq2
(ref: http://www.masonhq.com/node/view.html?name=ApacheModPerl2&version_id=7452)
http://search.cpan.org/CPAN/authors/id/J/JO/JOESUF/libapreq2-2.06-dev.tar.gz

# tar zxvf libapreq2-2.06-dev.tar.gz
# cd libapreq2-2.06-dev
# perl Makefile.PL --with-apache2-apxs=/usr/sbin/apxs
# make
# make install

Add below line to /etc/httpd/conf/httpd.conf:
LoadModule apreq_module modules/mod_apreq2.so

3. Change in netdisco code and configuration
--- netdisco-0.94/netdisco_apache.conf 2004-03-08 02:13:49.000000000 +0700
+++ /usr/local/netdisco/netdisco_apache.conf 2005-10-20 10:55:58.000000000 +0700
@@ -30,6 +30,7 @@
use strict;

my $ah = new HTML::Mason::ApacheHandler(
+ args_method => 'mod_perl',
comp_root => '/usr/local/netdisco/html',

--- ApacheHandler.pm.org 2005-11-05 10:27:30.676141760 +0700
+++ /usr/lib/perl5/site_perl/5.8.5/HTML/Mason/ApacheHandler.pm 2005-10-20 11:23:04.000000000 +0700
@@ -232,6 +232,7 @@
if ($ENV{MOD_PERL}) {
if (APACHE2) {
require Apache2::RequestRec;
+ require Apache2::Connection;
require Apache2::RequestIO;

--- netdisco-0.94/html/autohandler 2004-11-10 03:34:42.000000000 +0700
+++ /usr/local/netdisco/html/autohandler 2005-10-20 11:34:31.000000000 +0700
@@ -91,7 +91,7 @@
}

# For Logging, tell apache what user is in:
-$r->connection->user($m->session->{user}) if defined($m->session->{user});
+$r->user($m->session->{user}) if defined($m->session->{user});

--- netdisco-0.94/html/login.html 2004-09-28 02:00:27.000000000 +0700
+++ /usr/local/netdisco/html/login.html 2005-10-20 11:18:11.000000000 +0700
@@ -93,7 +93,7 @@
$m->session->{user_port_ctl} = $db_user->{port_control};
$m->session->{user_admin} = $db_user->{admin};
$m->session->{start} = time;
- $r->connection->user($db_user->{username});
+ $r->user($db_user->{username});

--- netdisco-0.94/netdisco 2004-12-07 06:45:47.000000000 +0700
+++ /usr/local/netdisco/netdisco 2005-11-05 10:29:47.196387528 +0700
@@ -2945,7 +2945,7 @@
return;
}

- my @S = $G->strongly_connected_components;
+ my @S = $G->connected_components;

Sunday, October 09, 2005

Unison: Đồng bộ dữ liệu giữa desktop với laptop

Nếu bạn có 2 máy tính: một máy để bàn làm việc ở văn phòng và một máy xách tay để đi công tác (giả sử vậy cho nó ..."rồ", chứ thực ra cả hai cái máy của tôi đều để ở nhà), theo lẽ tự nhiên bạn sẽ muốn thư mục làm việc trên hai máy đó y chang nhau. Có nhiều cách và phần mềm phục vụ mục đích đó. Thêm nữa, nếu bạn chạy song song cả Windows và Linux trên 2 máy, bạn sẽ muốn có một phần mềm chạy được trên cả hai hệ điều hành với một giao diện cho tiện. Một trong những phần mềm đó là Unison.

Unison là công cụ đồng bộ file cho Unix và Windows. Nó cho phép hai bản sao của một tập các file và thư mục được lưu trên các máy khác nhau (hoặc các đĩa cứng khác nhau trên cùng một máy), được thay đổi tách biệt, sau đó cập nhật bằng cách truyền sự thay đổi trên mỗi bản sao cho bản sao kia (trích giới thiệu trên website của Unison). Đại khái, Unison cho phép bạn đồng bộ nội dung hai thư mục theo cả hai chiều một cách đơn giản nhất. Hỗ trợ giao diện đồ họa GTK và truyền file qua SSH, giờ đây bạn thể đồng bộ dữ liệu của mình từ Linux sang Windows bằng vài thao tác click chuột. Bản đóng gói có sẵn cho cả Linux và Windows có thể tải xuống ở đây và chạy ngay không cần cài đặt. Unison cũng có thể dùng để đồng bộ dữ liệu trên máy tính với đĩa cứng USB để mang đi vác về.

Thursday, September 22, 2005

Giải pháp từ điển với Stardict

Lâu nay tôi vẫn dùng Kdict trên Linux desktop của mình và LacViet MTD trên Windows. Sở dĩ tôi thích dùng Kdict là vì nó có thể tìm trong nhiều bộ từ điển một lúc, wordnet, web1913, hay foldoc có thể bù vào phần từ vựng còn thiếu của anhviet.

Sau khi đọc thread này trên VNOSS tôi quyết định thử stardict trên … Windows trước. Thử tiếp trên Linux, kết quả ngoài sự mong đợi: tìm từ trong nhiều bộ từ điển, trong cửa sổ giải nghĩa có thể click để tra tiếp từ bằng chuột giữa (middle-click), tra từ nhanh với copy-and-see ;). Tra một từ theo chuỗi nghĩa Anh-Việt Việt-Việt hoặc Việt-Anh Anh-Anh thật dễ dàng với stardict. Giờ đây, có thể yên tâm với bộ từ điển trên cả Linux và Windows.

Dữ liệu từ điển có thể tải xuống từ: http://james.dyndns.ws/pub/Dictionary/StarDict-James/ cho các từ điển Anh-Pháp-Nga-Đức-Việt và http://sourceforge.net/projects/cctv cho các từ điển Wordnet-Foldoc. Chỉ cần bung các file dữ liệu này vào “/usr/share/stardic/dic” hoặc “~/.stardict/dic” trên Linux, hay “Program Files\Stardict\dic” trên Windows.

Mẹo sử dụng với Windows: để tra từ nhanh dạng Scan, chọn từ cần tra, Ctrl+C để copy sau đó nhấn phím Scan (Shift, Alt, Ctrl) (vì thế nên mới gọi là copy-and-see ;))

Stardict giờ là sự lựa chọn số một của tôi cho từ điển.

Monday, September 19, 2005

BugMeNot Lookup on toolbar

BOSECO blog post một tip hay để tìm account "chùa" trên BugMeNot. Khá hữu ích khi cần đọc tài liệu ở một số site cần đăng ký.

Kéo link dưới đây rồi thả vào Link toolbar trên browser, mỗi lần đến site nào cần login click lên button và ... hưởng.

BugMeNot Lookup

Tuesday, September 13, 2005

Bash remote logger - rlogger.sh

Bạn có nhiều web server (apache) hoặc proxy server (squid) và muốn chứa access log tập trung ở một chỗ cho tiện việc phân tích và quan sát real-time? Cách tốt nhất dựng một log server tập trung và dùng giao thức syslog để gửi log về từ các server. Apache, squid, lại không hỗ trợ gửi access log trực tiếp qua syslog. Nếu máy chủ có trình biên dịch C, bạn có thể dùng SnareApacheSnareSquid để gửi log đến syslog server tập trung.

Shell script này (rlogger.sh) cũng thực hiện công việc tương tự, mục đích sử dụng trên các server được cài đặt "ngặt nghèo" không có trình biên dịch như IPCop/Smoothwall.



Update: Sửa lỗi "echo $MSG" khiến access log của squid không thể được duyệt đúng với SARG 2.0.9 do mất ký tự


--rlogger.sh--

#!/bin/bash
# bash remote logger
# simple logger(1) which sends log data to remote loghost via UDP

# (c) 2005 - Long Dinh Le
# released under GPL license

# usage sample:
# rlogger.sh loghost -p local6.info -f /var/log/squid/access.log

# TODO: add more error checking functions

# predefined facility and severity values
faclilities=(kernel=0 user=1 mail=2 daemon=3 auth=4 syslog=5 cron=9 authpriv=10 ftp=11 local0=16 local1=17 local2=18 local3=19 local4=20 local5=21 local6=22 local7=23)

severities=(emerg=0 alert=1 crit=2 err=3 warning=4 notice=5 info=6 debug=7)

# default values
PORT="514"
FACILITY=1
SEVERITY=6
TAIL="/usr/bin/tail -F"
NOHUP="/usr/bin/nohup"
AWK="/usr/bin/awk"

# misc functions
usage(){
echo
echo "Usage: `basename $0` -p . -f "
echo
echo "Facilities: ${faclilities[*]%=*}"
echo "Severities: ${severities[*]%=*}"
echo
echo "Default: facility=user, severity=info"
echo
exit 0
}

error() {
echo "Error: $1"
echo
exit 1
}

# DO NOT MODIFY FROM HERE
[ "$#" -lt 3 ] && usage

HOST="$1"
shift
# converting facility.severity into priority
[ "$1" = "-p" ] && {
FACILITY=${2%.*}
SEVERITY=${2#*.}
for ((i=0; i<${#faclilities[*]}; i++)); do [ "$FACILITY" = ${faclilities[$i]%=*} ] && FACILITY=${faclilities[$i]#*=} done for ((i=0; i<${#severities[*]}; i++)); do [ "$SEVERITY" = ${severities[$i]%=*} ] && SEVERITY=${severities[$i]#*=} done shift 2 } PRIORITY=$(($FACILITY*8 + $SEVERITY)) # testing logfile for read permission [ "$1" = "-f" ] && { shift LOGFILE="$1" } [ -f "$LOGFILE" -a -r "$LOGFILE" ] || error "$LOGFILE does not exist or cannot read" # connect to the loghost vi UDP # check connection error
exec 3<> /dev/udp/$HOST/$PORT

HEADER="<$PRIORITY>"

$NOHUP $TAIL $LOGFILE | while read MSG; do
echo "$MSG" | $AWK '{ print "'"$HEADER"'"$0 }' >&3
done &

--rlogger.sh--

Thursday, September 08, 2005

Edit legacy Visio drawing on Linux: any solution?

Cần phải chỉnh sửa lại mấy cái tài liệu người khác làm bằng MS Word (có biểu đồ vẽ bằng MS Visio 2003) trên Linux. OpenOfice 2.0 tuy có hơi trục trặc với file tạo từ MS Word với heading, paragraph, bullet, … nhưng nói chung có thể “dàn xếp được”. Kẹt một cái hình vẽ bằng Visio thì không có cách nào sửa lại được. Thử bằng cách dùng Visio lưu lại dưới dạng SVG rồi mở bằng Dia nhưng không thành công, Dia chỉ hiện mỗi background trắng xoá. (Dia thậm chí không không thể mở lại đúng file SVG mà nó export ra, chỉ với một hình đơn giản!).

Theo lời khuyên của mrchuoi, thử lưu lại dưới dạng XML (.vdx) rồi dùng vdxtosvg để chuyển sang dạng SVG, hy vọng sẽ mở được với Dia. Rất tiếc là Visio 2003 lưu file XML theo stylesheet kiểu gì đó mà mà vdxtosvg không thể hiểu được. Kết quả: thất bại hoàn toàn, đành phải ngậm ngùi vẽ lại trong OpenOffice. Còn có giải pháp nào khác khả thi không?

Sunday, September 04, 2005

Conexant HSF softmodem full speed hack

Cái laptop HP và PC ở nhà đều xài internal modem chipset Conexant, loại HSF vì lý do rẻ tiền (USD 9). Trên Linux chỉ có duy nhất driver của Linuxant là làm việc được với loại này. Linuxant cho bản driver miễn phí dùng với tốc độ tối đa 14.4 Kbps, để lướt net với cái sofmodem này quả là một cực hình. Tìm kiếm chán chê trên net cuối cùng cũng tìm được một cách để hack cái driver miễn phí này làm việc với full speed 56 Kbps trên FC4, kernel 2.6.x. Cách làm như sau:
- Download hsfmodem-7.18.00.05full_k2.6.11_1.1369_FC4-1fdr.i686.rpm hoặc hsfmodem-7.18.00.05full.tar.gz về từ Linuxant
- Install theo hướng dẫn
- Dùng hexedit (hoặc khexedit) edit file /usr/lib/hsfmodem/modules/binaries/linux-2.6.11-1.1369-FC4/hsfengine.ko (với bản cài đặt RPM) hoặc /usr/lib/hsfmodem/modules/imported/hsfengine-i386.O (với bản cài đặt từ .tar.gz), sửa giá trị tại offset 0x2659D từ 74 thành 75.
Theo quan sát của mình, có thể tìm đến offset tương tự trong các phiên bản trước đó bằng cách tìm kiếm theo pattern "74638b55", sau đó sửa giá trị giống như trên.

Vậy là có thể yên tâm lướt net với HSF softmodem.

Friday, September 02, 2005

Blog client

Để post trên blogger với blog client, tốt nhất là nên dùng:
  • Trên Windows: BloggerForWord addon, không còn gì đơn giản hơn

  • Trên Linux: Drivel, chỉ có chú này hỗ trợ blogger 2.0 API