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;