ห้องทดลองลินุกซ์

ห้องนี้เป็นห้องทดลอง เมื่อทดลองเสร็จแล้ว ถึงจะนำเสนออีกทีนึงครับ

debian: ทดลอง ltsp

ต้องการเชื่อม Thin Client เข้าหา Thick Server ลินุกส์
โดยจะใช้งานในระบบดอส

งานที่ทำคือ

โฮมเพจ: Linux Terminal Server Project และ wiki.ltsp.org

ltsp ภาษาไทย: การติดตั้ง Linux Server เพื่อใช้งานแทน Netware Server
และ itdestination: มาสร้างระบบ Thin Client ด้วยลีนุกซ์กันเถอะ
และ linuxsiam: การติดตั้ง LTSP Server บน Debain

tfpt ภาษาไทย: itwizard: ตัวอย่างการใช้ TFTP กับการคอนฟิก CISCO Router

ต้องการแพคเกจ : ltsp, dhcp, tftp, nfs, xdmcp, samba
ltsp เป็นตัวหลัก
dhcp เป็นตัวจ่ายไอพี และตัวคัดเลือกการบูต
tftp เป็นตัวทำ file transfer
nfs เป็นตัว file server ของลินุกส์
samba เป็น file server อีกตัวที่ใช้ได้ทั้งลินุกส์และดอส
xdmcp เป็นตัวใช้งาน Xserver ของลินุกส์
rpld เป็นตัวบูต

ติดตั้ง dhcp

จะให้จ่ายไอพีตั้งแต่ 192.168.1.128-192.168.1.254
# apt-get install dhcp3-server

ปรับตั้ง
# vi /etc/default/dhcp3-server

...
INTERFACES="eth0"

# vi /etc/dhcp3/dhcpd.conf

...
option domain-name "example.com";
option domain-name-servers dns.example.com;
...
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.128 192.168.1.254;
  option routers server1.example.com;
}

สั่งเริ่มใหม่
# /etc/init.d/dhcp3-server restart

ติดตั้งแพคเกจอื่น

# apt-get install atftpd portmap nfs-kernel-server


ติดตั้ง ltsp

เอาจาก http://wiki.ltsp.org/twiki/pub/Ltsp/Documentation/ltspguide.pdf
# apt-get install ltsp-utils

ติดตั้ง
# ltspadmin
<<<--- Install/Update LTSP Packages

Where to retrieve packages from?
<<<--- [http://ltsp.mirrors.tds.net/pub/ltsp/ltsp-4.2/]

In which directory would you like to place the LTSP client tree?
<<<--- [/opt/ltsp]

If you want to use an HTTP proxy, enter it here
<<<--- ใส่ค่าพร๊อกซี่เซิร์ฟเวอร์ของเรา

If you want to use an FTP proxy, enter it here
<<<--- ใส่ค่าพร๊อกซี่เซิร์ฟเวอร์ของเรา

Correct? (y/n/c)
<<<--- y

Component Size (kb) Status
[*] ltsp_core 80916 Not installed
[*] ltsp_debug_tools 4284 Not installed
[*] ltsp_kernel 27708 Not installed
[*] ltsp_libusb 896 Not installed
[*] ltsp_localdev 4 Not installed
[*] ltsp_pciutils 428 Not installed
[*] ltsp_perl 28072 Not installed
[*] ltsp_rdesktop 1872 Not installed
[*] ltsp_scanners 29308 Not installed
[*] ltsp_vnc_module 452 Not installed
[ ] ltsp_x_addtl_fonts 17368 Not installed
[ ] ltsp_x_core 97716 Not installed
<<<--- q

Ready to install/update the selected LTSP packages? (y/n)
<<<--- y

...โปรแกรมจะดาวน์โหลดแพคเกจที่เกี่ยวข้องเข้ามาติดตั้ง...

Configure LTSP
Make a selection:
<<<--- c (Configure the services manually)

ตั้งค่าอินเทอร์เฟส
Make a selection:
<<<--- 2 (Interface selection)

Interface IP Address Netmask Network Broadcast Used
eth0 192.168.1.5 255.255.255.0 192.168.1.0 192.168.1.255 <-----
Only 1 Ethernet interface found, using eth0
Press <enter> to continue..

ปรับตั้ง dhcp
Make a selection:
<<<--- 3 (DHCP configuration)

Do you want to build a dhcpd.conf file (y/n) ?
<<<--- y
The dhcpd config file has been created as: /etc/dhcp3/dhcpd.conf.sample
Press to continue..

ปรับตั้ง tftpd
Make a selection:
<<<--- 4 (TFTP configuration)

Do you want to enable tftpd (y/n) ?
<<<--- y

กดไล่ค่าปริยายไปจนหมดแล้วจึงกด r เพื่อออกมา
กด s ดูความเรียบร้อย
และ q เพื่อออกมาสู่เมนูหลัก
และ q เพื่อออกจากโปรแกรม

สั่งเริ่มเซอร์วิสใหม่
# /etc/init.d/nfs-kernel-server restart
# /etc/init.d/portmap restart


สร้างอิมเมจ FreeDos

ดู samba: เรียกใช้งานจากดอสโดยใช้ดิสเก็ต 1 แผ่น
โดยเมื่อปรับแต่งจนสามารถบูตเข้าระบบได้แล้ว พร้อมทั้งปรับแต่ง autoexec.bat ให้เรียกใช้เน็ตเวิร์กไดรฟ์เรียบร้อยแล้ว
(วิธีการไม่ได้เขียนครับ เพราะเป็นเรื่องของการปรับแต่งดอสตามสภาพใช้งานของแต่ละท่าน)
เราก็เอาแผ่นดิสเก็ตแผ่นนี้มาทำเป็นดิสก์อิมเมจ
$ dd if=/dev/fd0 of=freedos.img
$ mcopy a:/KERNEL.SYS .
$ sudo apt-get install mknbi
$ mknbi-fdos --output=freedos.nb KERNEL.SYS freedos.img

หลังจากนั้นก็เอาไฟล์ freedos.nb ที่ได้ ไปใส่ในไดเรคทอรี่ /tftpboot ของเครื่องเซิร์ฟเวอร์


สร้างแผ่นบูตเข้า ltsp

เอาบราวเซอร์ไปที่ http://www.rom-o-matic.net/5.4.2/
(อาจตรวจสอบรุ่นใหม่ ๆ ได้จากหน้าหลัก)

ไปที่
1.Choose NIC/ROM type:
<<<--- เลือกชนิดการ์ดแลนให้ตรงกับเครื่องลูก

2.Choose ROM output format:
<<<--- Floppy bootable ROM Image (.zdsk)

4.To generate and download a ROM image press:
<<<--- Get ROM

เซฟไฟล์ไว้ แล้วเขียนลงแผ่นฟลอปปีดิสก์
(ตัวอย่าง ของผมเป็น via_rhine ได้ไฟล์ชื่อ eb-5.4.2-via-rhine.zdsk)
# cat eb-5.4.2-via-rhine.zdsk > /dev/fd0
จะเอาไปทำแผ่นบูต


ปรับแต่ง dhcp ขั้นสุดท้าย

ทำที่เครื่องเซิร์ฟเวอร์
ถ้าในระบบเรามีการ์ดแลนเพียงชนิดเดียว เราก็แค่สร้างไฟล์ freedos.nb เพียงไฟล์เดียว
ไฟล์ /etc/dhcp3/dhcpd.conf จะเป็นดังนี้

# dhcpd.conf

ddns-update-style             ad-hoc;

option subnet-mask            255.255.255.0;
option broadcast-address      192.168.1.255;
option routers                192.168.1.5;
option domain-name-servers    192.168.1.5;
#option domain-name            "your_domain.org";   # You really should fix this
option domain-name            "example.com";   # You really should fix this
option option-128 code 128 = string;
option option-129 code 129 = text;

get-lease-hostnames           true;

next-server                   192.168.1.5;
option root-path              "192.168.1.5:/opt/ltsp/i386";

subnet 192.168.1.0 netmask 255.255.255.0 {
    range   192.168.1.128   192.168.1.253;
    filename "/tftpboot/freedos.nb";
}

แต่ในทางปฏิบัติคงเป็นไปไม่ได้ที่จะมีการ์ดแลนเพียงชนิดเดียว
ดังนั้นเราจึงต้องสร้างอิมเมจหลายไฟล์ และแบ่งการใช้ด้วย mac address
สมมุติว่าเราสร้างอิมเมจสำหรับ
การ์ด via_rhine ในชื่อ fdvr.nb ค่า mac address ของเครื่องลูกเป็น 00:11:22:33:44:55
และการ์ด ne2000 ในชื่อ fdne2000.nb ค่า mac address ของเครื่องลูกเป็น 01:02:03:04:05:06
ไฟล์ /etc/dhcp3/dhcpd.conf จะเป็นดังนี้

# dhcpd.conf

ddns-update-style             ad-hoc;

option subnet-mask            255.255.255.0;
option broadcast-address      192.168.1.255;
option routers                192.168.1.5;
option domain-name-servers    192.168.1.5;
#option domain-name            "your_domain.org";   # You really should fix this
option domain-name            "example.com";   # You really should fix this
option option-128 code 128 = string;
option option-129 code 129 = text;

get-lease-hostnames           true;

next-server                   192.168.1.5;
option root-path              "192.168.1.5:/opt/ltsp/i386";

host ws128 {
    hardware ethernet  00:11:22:33:44:55;
    fixed-address  192.168.1.128;
    filename  "/tftpboot/fdvr.nb";
}
host ws129 {
    hardware ethernet  01:02:03:04:05:06;
    fixed-address  192.168.1.129;
    filename  "/tftpboot/fdne2000.nb";
}

subnet 192.168.1.0 netmask 255.255.255.0 {
    range   192.168.1.130   192.168.1.253;
    filename "/tftpboot/freedos.nb";
}

เริ่ม dhcp ใหม่
# /etc/init.d/dhcp3-server restart

วิธีดูค่า mac address อาจดูตอนบูตด้วยแผ่นบูตก็ได้
หรือดูจากลินุกส์ด้วยคำสั่ง ifconfig
หรือดูจากดอสด้วยคำสั่ง ipconfig /all

วิธีนี้มีข้อดีคือใช้เวลาบูตจากดิสเก็ตนิดเดียว เมื่อต่อเข้าเครื่องเซิร์ฟเวอร์แล้ว จะใช้อิมเมจจากเซิร์ฟเวอร์ในการบูตต่อ
ดังนั้นจึงเริ่มระบบได้รวดเร็วกว่าการบูตด้วยแผ่นดิสเก็ตล้วน ๆ
แต่มีข้อเสียคือการติดตั้งยุ่งยาก

เขียนหยาบและสเปะสปะหน่อยนะครับ เป็นเรื่องใหม่ที่ไม่เคยศึกษามาก่อน :P
ได้เปลื้องหนี้คุณสมเจตน์แล้ว ค่อยสบายหน่อย

เดี๋ยวถ้ามีเวลา จะกลับมาศึกษาต่ออีกที

บันทึก customize debian

update 50-07-07

ติดตั้งแพกเกจที่ใช้บ่อย
มี vim, less, screen
# aptitude install vim-full less screen
แก้ default shell
เดเบียนใช้ /bin/sh เป็น default shell
แต่ /bin/bash ใช้งานสะดวกกว่า
# usermod -s /bin/bash user1
แก้ default editor
เดเบียนใช้ nano เป็น default editor แต่เรานิยมใช้ vi
แก้ /etc/profile ให้มีตัวแปร EDITOR
# vi /etc/profile
...
EDITOR="/usr/bin/vi"
export EDITOR
...

ปรับปรุง: จาก debianclub.com: system-wide default editor
# update-alternatives --config editor
<<<--- เลือกหมายเลขหน้า vim

แก้ default vi
เดเบียนใช้ nvi เป็น default vi
แต่เราต้องการ syntax color เลยเปลี่ยนมาใช้ vim
# aptitude install vim-full
vim syntax color
ปกติ vim จะไม่ทำ syntax color
แก้ /etc/vim/vimrc.local
# vi /etc/vim/vimrc.local
...
syntax on
ถ้าต้องการใช้ sudo
แก้ไขไฟล์ /etc/sudoers ลบคอมเมนต์หน้าบรรทัดนี้
%sudo ALL=NOPASSWD: ALL

ถ้าเราชื่อ user1 ใช้คำสั่ง usermod แก้ให้เราอยู่ในกลุ่ม sudo ด้วย
# usermod -g sudo user1

ปรับตั้ง Proxy (ถ้าใช้พร๊อกซี่)
System -> Preference -> Network Proxy

แก้ไข wgetrc ให้ใช้งาน wget ผ่านพร๊อกซี่ได้
$ sudo vi /etc/wgetrc

...
http_proxy = http://proxy.example.com:8080/
ftp_proxy = http://proxy.example.com:8080/
...
ปรับตั้งภาษาไทย
System -> Preferenct -> Keyboard
TAB Layouts -> Add -> Thailand
TAB Layout Options -> Group Shift/Lock behavior -> Alt+Shift changes group.

ให้แสดงสถานะของภาษาบนพาเนล
คลิกขวาที่พาเนล Add to Panel -> Keyboard Indicator -> Add

ติดตั้ง libthai
$ sudo aptitude install libthai0

ติดตั้งฟอนต์ไทย
$ sudo aptitude install ttf-thai-tlwg otf-thai-tlwg

debian: Customize Sid

Customize Sid Desktop

สมมุติว่าติดตั้งเดเบียนจาก debootstrap พร้อมทั้งทำ apt-proxy ไว้เรียบร้อยแล้ว

แก้ไข source.list และปรับปรุงแพกเกจ
# vi /etc/apt/source.list
deb	http://server1.example.com:9999/debian main contrib non-free
deb-src	http://server1.example.com:9999/debian main contrib non-free
deb	http://server1.example.com:9999/debian-multimedia main

# aptitude update
# aptitude dist-upgrade

เก็บตกแพกเกจที่จำเป็นเบื้องต้น
# aptitude install ssh vim-full less screen

ปรับแต่ง vimrc ปริยาย (ดู vi โดยย่อ ประกอบ)
# vi /etc/vim/vimrc.local

set tabstop=4
set expandtab
set autoindent
set smartindent
set nu!
syntax on

ปรับ vim ให้เป็น editor ปริยาย
# update-alternatives --config editor

เลือกหมายเลขหน้า vim-full
สร้างผู้ใช้ชั่วคราว
# useradd temp1
# passwd temp1
ติดตั้ง Gnome
# aptitude install gnome xorg

ถ้ามีผู้ใช้หลายคน ควรปรับค่าปริยายของ Gnome
ปรับภาษาไทย ตาม gnome: เกร็ดการปรับตั้งค่าคีย์บอร์ดภาษาไทย
# gconftool-2 --direct \
--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \
--type list --list-type string \
--set /desktop/gnome/peripherals/keyboard/kbd/layouts [us,th]
# gconftool-2 --direct \
--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \
--type list --list-type string \
--set /desktop/gnome/peripherals/keyboard/kbd/options ["grp grp:alt_shift_toggle"]

ยกเลิกการล๊อกจอภาพ
# gconftool-2 --direct \
--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \
--type bool \
--set /apps/gnome-screensaver/lock_enabled false

ปรับเรื่องรหัสอักขระตอนเมานต์ usb กับ cdrom ทำให้เป็น utf8 อัตโนมัติ
# gconftool-2 --direct \
--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \
--type list --list-type string \
--set /system/storage/default_options/iso9660/mount_options [uid=,utf8,iocharset=utf8]
# gconftool-2 --direct \
--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \
--type list --list-type string \
--set /system/storage/default_options/udf/mount_options [uid=,utf8,iocharset=utf8]
# gconftool-2 --direct \
--config-source xml:readwrite:/etc/gconf/gconf.xml.defaults \
--type list --list-type string \
--set /system/storage/default_options/vfat/mount_options [shortname=lower,uid=,utf8,iocharset=utf8]

ติดตั้งแพกเกจกันเหนียวอื่น ๆ
# aptitude install smbfs
สร้างผู้ใช้
สมมุติว่าผู้ใช้ชื่อ user1 จะให้อยู่ในกลุ่ม mygroup
ของระบบคือ
# useradd -m -g mygroup -G lp,dialout,cdrom,floppy,audio,video,plugdev,lpadmin -s /bin/bash user1
# passwd user1

-m คือให้ยึดโครงสร้างไดเรกทอรี่ /home/user1 ตามแบบโครงสร้างใน /etc/skel
-g คือกลุ่มหลัก
-G คือกลุ่มที่ผู้ใช้คนนี้จะเข้าไปเป็นสมาชิก
-s คือเปลี่ยนเชลล์ จาก /bin/sh ไปเป็น /bin/bash ซึ่งปรับแต่งได้มากกว่า

ของ samba คือ
# smbpasswd -a -s user1

ปรับแก้ sudo
# vi /etc/sudoers
...
%mygroup    ALL=(ALL) ALL
..
ภาษาไทย
# aptitude install libthai0 ttf-thai-tlwg otf-thai-tlwg

หรือพม่า
# aptitude install ttf-sil-paduak

หรือลาว
# aptitude install ttf-lao

หรือเขมร
# aptitude install ttf-khmeros

ถ้าเราอยู่หลัง proxy ควรปรับตั้งให้ wget ใช้สำหรับดาวน์โหลดได้
# vi /etc/wgetrc
...
http_proxy = http://server1.example.com:8080/
ftp_proxy = http://server1.example.com:8080/
...
ตัวติดตั้งแพกเกจของ Gnome
# aptitude install gdebi
บราวเซอร์ ปกติ epiphany ใช้งานได้ดีและเร็วอยู่แล้ว แต่หากต้องการความสามารถเพิ่ม อาจติดตั้ง iceweasel เพิ่มได้
# aptitude install iceweasel flashplugin-nonfree
ออฟฟิศ
# aptitude install openoffice.org
มัลติมีเดีย
# aptitude install mplayer xmms gxine vlc audacity toolame k3b w32codecs
การทำงานเกี่ยวกับภาพ
# aptitude install imagemagick jhead libjpeg-progs
MSN
# aptitude install pidgin

เมื่อเรียบร้อยแล้วก็ให้เริ่ม gdm ใหม่ได้เลย
# /etc/init.d/gdm restart

ผู้ใช้ที่ได้ล๊อกอินเข้าไป คงเหลือเพียงเพิ่มสถานะของภาษาลงบนพาเนล
คลิกขวาบนพาเนล -> Add to Panel -> Keyboard Indicator -> Add
แล้วก็จะสามารถทำงานได้ทันทีครับ

ฝากเสริมด้านเดสก์ทอปให้ด้วยนะครับ

debian: ติดตั้ง gnome แบบต่าง ๆ

หลังจากผ่านการติดตั้งแบบ Net Install หรือแบบ debootstrap มาแล้ว
ต้องติดตั้ง Xwindows ก่อน
# aptitude install x-window-system-core

ตามด้วย gnome แบบต่าง ๆ ดังนี้

gnome แบบเต็ม
# aptitude install gnome
แบบน้อยที่สุด
# aptitude install gnome-core gdm
กินเนื้อที่ประมาณ 1.4G
แบบมากขึ้น
# aptitude install gnome-fifth-toe
กินเนื้อที่ประมาณ 2.1G (clean แล้วเหลือ 1.6G)
มากขึ้นเกือบสุด
# aptitude install gnome-desktop-environment
กินเนื้อที่ประมาณ 2.1G

เลือกใช้แบบน้อยที่สุด และส่วนเสริมที่ใช้
# aptitude install gnome-core gdm gnome-themes gimp inkscape evolution vim-full dosemu libthai0 ttf-thai-tlwg otf-thai-tlwg ttf-thai-arundina openoffice.org
กินเนื้อที่ 2.3G
หลังจากสั่ง aptitude clean เหลือสุทธิ 1.9G

อ้างอิง - wiki.debian.org: Installing GNOME

debian: บันทึก customize lenny desktop

สมมุติว่าถูกติดตั้งจาก debootstrap หรือแผ่น Net Install
หลังจากทำ Customize บน Terminal เรียบร้อยแล้ว ทำต่อส่วนของ Desktop ด้วย

ติดตั้งเดสก์ทอป
$ sudo aptitude install xorg gnome
แพกเกจระบบ
$ sudo aptitude install less gdebi
การเพิ่มผู้ใช้งาน
ถ้าต้องการเพิ่มผู้ใช้งานเดสก์ทอป สมมุติว่าชื่อ user1 ควรสั่งให้เป็นสมาชิกในกลุ่มของระบบด้วย
$ sudo useradd -g dialout,cdrom,floppy,audio,video,plugdev user1 ...
ภาษาไทย
$ sudo aptitude install libthai0 pango-libthai scim-thai
เพิ่มคีย์บอร์ดไทย
Desktop -> Preference -> Keyboard
- TAB Layouts -> Add -> Thailand
- TAB Layout Options -> Group Shift/Lock behavior -> Alt+Shift changes group.
เพิ่มการแสดงสถานะของภาษา
คลิกที่แถบพาเนล บนหรือล่างตามต้องการ คลิกขวา -> Add to panel -> Keyboard Indicator
ปิดการล๊อกจอภาพของ Screen saver
Desktop -> Preference -> Screensaver -> ปิด Lock screen when screensaver is active
บราวเซอร์ Iceweasel
$ sudo aptitude install iceweasel
ติดตั้ง flash เพิ่ม
$ sudo aptitude install flashplugin-nonfree
ออฟฟิศ
$ sudo aptitude install openoffice.org
มัลติมีเดีย
$ sudo aptitude install mplayer xmms gxine vlc audacity toolame k3b
ภาพ
$ sudo aptitude install imagemagick jhead jpegtran
ดอส
$ sudo aptitude install dosemu freedos
แก้ไขไฟล์ /etc/dosemu/dosemu.conf ให้ใช้เครื่องพิมพ์เครือข่ายได้
$ sudo vi /etc/dosemu/dosemu.conf
สมมุติว่ามีเครื่องพิมพ์สองตัว ชื่อ epson และ epson2
...
$_printer_command = "lpr -l -P epson, lpr -l -P epson2"
...

หมายเหตุ
ถ้าเป็น dosemu รุ่น 1.40 ขึ้นไป เปลี่ยนรูปแบบเป็น

...
$_lpt1 = "lpr -l -P epson"
$_lpt2 = "lpr -l -P epson2"
...

แก้ไขไฟล์ autoexec.bat และ config.sys ที่ /etc/freedos ปรับเปลี่ยนตามต้องการ

qemu
$ sudo aptitude install qemu uml-utilities module-assistant
ส่วนของ kqemu
$ sudo m-a a-i kqemu
ตั้งให้ฟอร์เวิร์ดแพกเก็ต เตรียมการให้กับส่วนของเน็ตเวิร์ก
$ sudo bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
$ sudo vi /etc/sysctl.conf
...
net.ipv4.ip_forward=1
...

ดูเพิ่มเติมที่ ubuntu: feisty - qemu

เครื่องพิมพ์
ขณะที่บันทึก gnome-cups-manager ยังใช้งานได้ไม่ดี ได้บ้าง ไม่ได้บ้าง จำเป็นต้องใช้แบบบรรทัดคำสั่ง
ถ้าเป็นเครื่องพิมพ์เครือข่ายที่ต่อกับเซิร์ฟเวอร์ลินุกซ์ ใช้คำสั่ง
$ sudo lpadmin -p $PRINTER -u allow:all -E -v smb://$USER:$PASSWORD@$SERVER/$SHARE -P /$PATH/$TO/$PPD
ถ้าเป็นเครื่องพิมพ์ที่ต่อกับเซิร์ฟเวอร์วินโดวส์ เอาชื่อผู้ใช้ออก เหลือแค่
$ sudo lpadmin -p $PRINTER -u allow:all -E -v smb://$SERVER/$SHARE -P /$PATH/$TO/$PPD
อย่าลืมแทนค่าตัวแปรต่าง ๆ ให้เป็นค่าที่เราต้องการ
Chat - MSN
$ sudo aptitude install pidgin
CHM - Compiled HTML Help
$ sudo aptitude install xchm

debian: บันทึกแก้ปัญหา Xorg ใน sid

ช่วงนี้ Xorg ของ sid มีปัญหาว่าไม่สามารถปรับตั้งไฟล์ /etc/X11/xorg.conf ได้
เนื่องจาก Bug #443004 ทำให้ในการติดตั้งใหม่ไม่สามารถใช้งาน X-window ได้

แก้ปัญหาโดยเปลี่ยน repository ไปเป็น lenny ชั่วคราว
$ sudo sed -i 's/sid/lenny/g' /etc/apt/sources.list

แลัวจึงติดตั้ง xorg ใหม่
$ sudo aptitude purge xorg
$ sudo aptitude update
$ sudo aptitude install xorg

เมื่อปรับตั้งเรียบร้อยแล้ว จึงเปลี่ยน repo กลับมาเป็น sid ก็จะสามารถใช้งานได้แล้ว
$ sudo sed -i 's/lenny/sid/g' /etc/apt/sources.list
$ sudo aptitude update
$ sudo aptitude dist-upgrade

เรียบร้อยแล้ว

หมายเหตุ
ช่วงนี้ gnome มีการเปลี่ยนรุ่น ก็สามารถใช้วิธีเดียวกันแก้ปัญหาได้
หรืออาจติดตั้งเป็นรุ่น lenny เลย แล้วจึงอัปเกรดมาเป็น sid ทีหลังก็ได้ครับ

Resize รูปด้วย Shell script แบบมี GUI

ขอเขียนลงห้องทดลองด้วยคนนะครับ :D

Shell script อันนี้เขียนไว้นานแล้วครับ (ประมาณ 2 ปีแล้ว :P) ให้ทำการ resize รูป JPEG ด้วยคำสั่ง convert จาก ImageMagick แล้วช่วงนั้นก็อยากเขียน shell script ให้มี GUI ก็เลยใช้ Xdialog ในการสร้าง GUI ขึ้นมา แต่ตอนนั้นสคริปต์มีข้อจำกัดนิดหน่อย คือทำงานกับชื่อแฟ้มหรือไดเร็คทอรีที่มี space ไม่ได้ โค้ดก็ไม่สวย :P (ตอนนั้นยังรู้อะไรไม่ค่อยมากนัก จริงๆ มันไม่ได้มีอะไรใหม่หรอก)

วันนี้มีเหตุให้ต้องมานั่ง resize ภาพประมาณ 200 กว่าภาพได้ เลยได้ฤกษ์ขุดขึ้นมาลองใช้ดูหน่อย แล้วก็นั่งแก้ไปแก้มา ก็แก้ให้ข้อจำกัดเหล่านั้นหมดไปแล้วเลยมาเสนอที่นี่ดีกว่า สคริปต์นี้ต้องการ ImageMagick กับ Xdialog ถึงจะทำงานนะครับ ใครใช้ *buntu ก็คง apt-get ได้เลย

ถ้าดูแล้วมีตรงไหนน่าแก้ไขก็แก้ได้เลยนะครับ

คำอธิบายทั้งหลายก็พยายามเขียนเอาไว้ใน comment ของ code ไว้แล้ว

#!/bin/bash


#jpgresize shell script with Xdialog.
#This program depends on ImageMagick (convert), Xdialog, textutils, expr and bc

#variables
tempfile=`mktemp`

#======================================================================

#functions
# numfiles -> it gets number of files to calculate the percentage.
# setcount -> This function sets the variables, named COUNT2 and COUNT3, to calculate the percentage. COUNT4 is for use with --gauge option.
# Xresize -> This function resizes the jpg and JPG files and displays progress bar using COUNT4 value.
# prog_term -> terminate the program.
# help_me -> display help.
# version -> display version.
# wizard_start -> start the wizard.
# choose_dir_wiz -> This function chooses a directory and keep the value into $tempfile.
# get_dir -> This function gets the value of a directory that will be used to keep the resized files. 
# get_size -> it gets the size (using slide bar) to work with convert. 

numfiles() {
	
	
	for f in *.[jJ][pP][gG]
		do
			COUNT=`expr $COUNT + 1`
		done
	
}

setcount() {
	COUNT2=`echo "scale=2; 100/$COUNT" |bc -l`
	COUNT3=`echo "scale=2; 100/$COUNT" |bc -l`
	COUNT4=`echo "$COUNT2" |cut -f1 -d"."`
}



Xresize() {
	for files in *.[jJ][pP][gG]
	do
		convert -resize "$SIZE"x"$SIZE" "$files" "$RESIZEDIR"/"r_$files" 2>/dev/null
		if [ $COUNT4 -gt 100 ]; then
			COUNT4=100
		fi
		echo $COUNT4
		echo XXX
		echo "Resizing... ($COUNT2 percent)"
		echo XXX
		COUNT2=`echo "scale=2; $COUNT2 + $COUNT3" | bc -l`
		COUNT4=`echo "$COUNT2" |cut -f1 -d"."`
	done| Xdialog --title "JPG Resizer" --gauge "Resizing..." 10 70 0
	
}

prog_term() {
	Xdialog --title "JPG Resizer" --msgbox "Program terminated" 10 30
	rm -f $tempfile
	exit 1
}


helpme() {
cat << EOF >$tempfile
	Script for JPEG resizing with wizard (from Xdialog). 
	Copyright (c) 2005 by Sahachart Anukulkitch. Distributed under GPL.
	
	The script will resize all JPEG files with specified size 
	(in percent) using wizard. Hope this will make picture
	resizing job easier ;). 
	
	Actually, if you want, just replace "jpg" in the script to other 
	image extensions such as png, bmp, xpm and so on. This script will 
	work for you to resize other image file types.
	
	Usage:
		Xjpgresize [option]
			-h display this help dialog and exit
			-v display version dialog and exit
	
		Without option, the script will start the wizard to resize 
		JPEG files. Choose the directory containg files you want, 
		enter the size and directory name that will be used to 
		keep the resized files. 
EOF
Xdialog --title "JPG Resizer Help"  --textbox $tempfile 30 100
rm -f $tempfile
exit 0
}

version() {
Xdialog --title "JPG Resizer" --msgbox "The JPEG resizing script version 0.3.1x, with Xdialog" 10 70
exit 0
}

wizard_start() {
	Xdialog --title "JPG Resizer" --left --wizard \
	--yesno "Welcome to JPG Resizer Wizard version 0.3.1x. \\nClick Next to proceed \\nor Cancle to terminate program. \\n \\n \\n \\nCopyright (c) 2005 by Sahachart Anukulkitch. \\n \\nYou can modify or redistributed this under GPL" 30 70
	case $? in
		0) choose_dir_wiz
		;;
		1) prog_term
		;;
		3) prog_term
	esac

}
	
choose_dir_wiz() {
	Xdialog --title "JPG Resizer - Please choose a directory" --wizard\
	--help "Please choose the directory contaning files \\n you wish to resize"\
	--dselect ~ 30 70 2>$tempfile

	case $? in
		0)  
		D_SELECTED=`cat $tempfile`
		cd "$D_SELECTED"		
		#test if there are JPEG files in the directory

		if [ -z `ls |grep -i "\.jpg"` ] 2>/dev/null
			then
			Xdialog --title "JPG Resizer" \
			--msgbox "There're no JPEG files in this directory." 10 70
			rm -rf $tempfile
			exit 1
		fi
		get_dir
		;;
		1) prog_term
		;;
		3) wizard_start
		;;
	esac
}

get_dir() {
	Xdialog --title "JPG Resizer" --left --wizard \
	--inputbox "Please enter directory name you want to keep files" 30 70 \
	"resized"  2>$tempfile

	case $? in
		0) 
		RESIZEDIR="`cat $tempfile`"
		get_size
		;;
		1) prog_term
		;;
		3) choose_dir_wiz
		;;
	esac
}

get_size() {
	Xdialog --title "JPG Resizer" --wizard \
	--rangebox "Use slide bar to choose size (%)" 30 70 1 99 50 2>$tempfile

	case $? in
		0)
		SIZE="`cat $tempfile`%"
		;;
		1) prog_term
		;;
		3) get_dir
		;;
	esac
}

#==============================================================================

#main program
#test the arguments using case

case $1 in
	-h)
		helpme
		;;
	-v)
		version
		;;
	*)
		;;
esac

#start the wizard

wizard_start



#check if directory is existed or create directory
if [ -d $RESIZEDIR ]; then
	Xdialog --title "JPG Resizer" --msgbox "The `pwd`/$RESIZEDIR exists." 7 70
else
	
	Xdialog --title "JPG Resizer" --yesno "Create `pwd`/$RESIZEDIR?" 10 70
	case $? in
		0) mkdir -p $RESIZEDIR
		;;
		1) prog_term
		;;
	esac
fi
#get number of files
numfiles
#set the COUNT- variables
setcount
#resize and display progress bar
Xresize

#get exit status from progress bar
case $? in 
	0)
	Xdialog --title "JPG Resizer" --msgbox "Resizing completed! \\n Click OK to finish the Wizard" 30 70 
	;;

	255)
	Xdialog --title "JPG Resizer" --msgbox "Program aborted!" 7 30
	;;
esac

rm -f $tempfile
#End

ปล. จริงๆ ใช้ gwenview หรือ digikam ทำเอาก็ได้ อาจจะดีกว่าด้วย เพราะมีปลั๊กอิน batch resize แถม Xdialog ก็หยุดพัฒนาแล้วด้วย เลยมีแต่หน้าตาน่าเกลียดๆ แบบ gtk+ (1.x) เท่านั้น แต่อันนี้เขียนเอาไว้ลองวิชาครับ อยากลอง port ไปใช้ kdialog ของ KDE ดูเหมือนกัน แต่ความยืดหยุ่นสู้ Xdialog ไม่ได้

debian: ติดตั้งแพกเกจ

บันทึกการติดตั้งแพกเกจต่าง ๆ

ubuntu: feisty - qemu

เดี๋ยวนี้ qemu พร้อม kqemu มีเป็นแบบแพกเกจเรียบร้อย การติดตั้งจึงต่างออกไปจากเดิม
สำหรับใน Feisty การติดตั้งเป็นดังนี้

ส่วนของ qemu
ติดตั้ง qemu
$ sudo aptitude install qemu

ส่วนของ kqemu
ติดตั้ง module-assistant
$ sudo aptitude install module-assistant

ติดตั้ง kqemu ผ่าน module-assistant
$ sudo m-a a-i kqemu

ใน Feisty ไม่ยอมสร้าง /dev/kqemu ให้ ต้องทำเอง
$ sudo mknod /dev/kqemu c 250 0
$ sudo chmod 666 /dev/kqemu
$ sudo modprobe kqemu

ส่วนของเน็ตเวิร์ก
สร้างตาราง nat ไว้รอก่อน
$ sudo iptables -t nat -D POSTROUTING -j MASQUERADE -o eth0
$ sudo iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0

ติดตั้งแพกเก็จชื่อ uml-utilities
$ sudo aptitude install uml-utilities

เอาอินเทอร์เฟส tun ขึ้นมา
$ sudo modprobe tun
$ sudo chmod 666 /dev/net/tun

qemu จะใช้งานเน็ตเวิร์กผ่านอินเทอร์เฟส tap0 เราจึงต้องสร้าง tap0 ขึ้นมา สมมุติว่าเราชื่อ user1
$ sudo tunctl -u user1

เสร็จแล้ว

สมมุติว่าเรามีอิมเมจ winxp.img อยู่แล้ว สามารถเรียกใช้งาน qemu ด้วย
$ qemu -kernel-kqemu -hda winxp.img -net nic -net tap,ifname=tap0

บันทึกเกร็ดเพิ่มเติม

  • ทดสอบไปทดสอบมา ดูแล้ว qemu น่าใช้ที่สุด เนื่องจากการทำงานราบเรียบกว่า Xen, VirtualBox, kvm, VMWare แพ้แต่ Parallel เท่านั้น ถึงแม้จะรันช้ากว่า แต่มีข้อดีตรงที่เราสามารถปรับเปลี่ยนได้ตามที่เราต้องการ
  • ในขั้นตอนติดตั้งโปรแกรม ควรปิดการทำงานของ kqemu โดยถ้าเป็น Windows Xp ให้เอาออปชั่น -kernel-kqemu ออก และถ้าเป็น Windows 98-ME ให้เติมออปชั่น -no-kqemu
  • ถ้าเป็นซีพียูตระกูลอินเทล - VT จะได้ความเร็วที่ราบรื่น แม้ไม่ได้ใส่ออปชั่น -kernel-kqemu ก็ตาม
  • เวลาติดตั้งโปรแกรม ควรใช้ประโยชน์จากการที่ qemu สามารถทำ overlay ได้มีเทคนิกดังนี้
    1. สร้างอิมเมจหลักก่อน สมมุติว่าชื่อ winxp.qcow
      $ qemu-img create -f qcow winxp.qcow 5G
    2. ติดตั้งวินโดวส์ โดยใช้ hda เป็น winxp.qcow จนเสร็จเรียบร้อย
    3. สร้าง Overlay image เพื่อเก็บอิมเมจเก่าไว้
      $ qemu-img create -b winxp.qcow -f qcow winxp.ovl
    4. ติดตั้งโปรแกรม หรือทำการทดลองใด ๆ บน Overlay image ที่สร้างขึ้น
    5. ถ้าติดตั้งไม่ผ่าน หรือทดลองจนงานเละ ก็ให้ลบอิมเมจ winxp.ovl ทิ้งไป แล้วเริ่มขั้นตอนก่อนหน้านี้ใหม่
    6. ถ้าติดตั้งหรือทดลองจนเสร็จเรียบร้อยแล้ว และต้องการบันทึกงานเข้าไปรวมกับอิมเมจเก่า ให้ใช้คำสั่ง
      $qemu-img commit winxp.ovl
      ผลคือข้อมูลใน winxp.ovl จะถูกบันทึกลงใน winxp.qcow และ winxp.ovl จะถูกลดขนาดลงมา พร้อมที่จะรับงานใหม่ต่อไป
  • ทดสอบล่าสุดบนเดเบียน qemu รุ่น 0.8.2 ซีพียู Pentium E6300 พบว่า
    • บน WindowsXP สั่งด้วย qemu เฉย ๆ เร็วกว่าใช้พารามิเตอร์ -kernel-kqemu
    • บน WindowsMe สั่งด้วย qemu -no-kqemu เร็วและเสถียรกว่า qemu เฉย ๆ (การสั่งด้วย qemu เฉย ๆ จะเปิดใช้งาน kqemu ในโหมด user โดยอัตโนมัติ)
    • บน WindowsMe สั่งด้วย qemu-system-x86_64 เฉย ๆ เสถียรเท่ากับสั่งด้วย qemu -no-kqemu แต่ช้ากว่า

    สรุปว่าสำหรับ qemu ตั้งแต่รุ่น 0.8.2 เป็นต้นไป ต้องทดลองดูหลาย ๆ แบบ ดูว่าแบบไหนดีที่สุด ไม่จำเป็นต้องเป็นตามคู่มือเสมอไป

หมายเหตุ

  • ผมอัปเกรดจาก dapper ด้วยคำสั่ง aptitude dist-upgrade จึงอาจมีสคริปต์เก่าหลงเหลืออยู่ ไม่แน่ใจว่าถ้าติดตั้งอูบุนตูจากแผ่นติดตั้งของ Feisty ล้วน ๆ ขั้นตอนการติดตั้ง qemu จะต่างออกไปจากนี้หรือไม่

อ้างอิง

debian: qemu เก็บตก

ทดลองใช้ qemu กับ usb
ในการสั่งรัน ต้องเติมพารามิเตอร์ -usbdevice host:XXXX:XXXX ต่อท้ายคำสั่ง
ซึ่งค่านี้คือค่า Vender ID และ Product ID ตามลำดับ โดยหาได้จากคำสั่ง lsusb

ตัวอย่างของเครื่องผมคือ
ต้องการใช้งาน usb ใน qemu โดยมี Printer Epson Stylus Photo 830 และสแกนเนอร์ UMAX Astra 5650

ดูค่าไอดี
$ lsusb

Bus 005 Device 001: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  
Bus 003 Device 002: ID 04b8:0005 Seiko Epson Corp. Stylus Printer
Bus 003 Device 001: ID 0000:0000  
Bus 002 Device 001: ID 0000:0000  
Bus 001 Device 002: ID 0461:0392 Primax Electronics, Ltd 
Bus 001 Device 001: ID 0000:0000  

สั่งรัน qemu
$ qemu YOUR-PARAMETER -usbdevice host:04b8:0005 -usbdevice host:0461:0392

เสียง
ใช้คำสั่ง
$ qemu YOUR-PARAMETER -soundhw all

debian: บันทึกการปรุง qemu รุ่นปรับแก้ NumLock/CapsLock เพื่อแจกจ่าย

รุ่นนี้เป็นรุ่นปรับแก้บั๊กเรื่อง NumLock/CapsLock ไม่ยอมเปลี่ยน ตามที่เคยบันทึกไว้

แต่ผมลืมแพกเกจที่ต้องการก่อนติดตั้งหมดแล้ว ฝากดูเอาเองตอน debuild หรือ configure

วิธีสร้างแพกเกจเดเบียน
$ sudo aptitude install devscripts
$ apt-get source qemu
$ cd qemu-0.9.0+20070816
$ vi sdl.c

. . .
    if (ev->keysym.sym == SDLK_PAUSE) {
        /* specific case */
        v = 0;
        if (ev->type == SDL_KEYUP)
            v |= 0x80;
        kbd_put_keycode(0xe1);
        kbd_put_keycode(0x1d | v);
    //    kbd_put_keycode(0x45 | v);
        return;
    }

    if (kbd_layout) {
        keycode = sdl_keyevent_to_keycode_generic(ev);
    } else {
        keycode = sdl_keyevent_to_keycode(ev);
    }

    switch(keycode) {
    case 0x00:
        /* sent when leaving window: reset the modifiers state */
        reset_keys();
        return;
    case 0x2a:                          /* Left Shift */
    case 0x36:                          /* Right Shift */
    case 0x1d:                          /* Left CTRL */
    case 0x9d:                          /* Right CTRL */
    case 0x38:                          /* Left ALT */
    case 0xb8:                         /* Right ALT */
        if (ev->type == SDL_KEYUP)
            modifiers_state[keycode] = 0;
        else
            modifiers_state[keycode] = 1;
        break;
    //case 0x45: /* num lock */
    //case 0x3a: /* caps lock */
        /* SDL does not send the key up event, so we generate it */
    //    kbd_put_keycode(keycode);
    //    kbd_put_keycode(keycode | 0x80);
    //    return;
    }
. . .

$ debuild -us -uc
จะได้แพกเกจเดเบียน ตามต้องการ

ติดตั้งด้วยคำสั่ง
$ sudo dpkg -i ../qemu_0.9.0+20070816-1_i386.deb

วิธีสร้างแพกเกจแบบทั่วไป
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0
$ configure --cc=gcc-3.4
$ make
$ checkinstall -D make install
$ make qemu-doc.html
$ make qemu-tech.html
$ make qemu.1
$ make qemu-img.1
$ sudo make install-doc
$ make tarbin

จะได้แพกเกจ qemu-0.9.0-i386.tar.gz ตามต้องการ โดยไฟล์จะมาอยู่ที่ไดเรกทอรี่ Home

Download
หากคร้านที่จะคอมไพล์เอง ดาวน์โหลดได้ที่นี่ครับ ฝากทดสอบบั๊กให้ด้วย

อ้างอิง
Murray's Blog: Building modified debian packages

บันทึกการแก้ปัญหา Num Lock - Caps Lock ของ qemu

เมื่อได้ลองใช้งาน qemu แบบจริงจัง เจอปัญหาว่า Num Lock กับ Caps Lock มีอาการแปลก ๆ กดแล้วได้ผลบ้าง ไม่ได้ผลบ้าง
เลยลองถอด qemu ของดิสโตร แล้วดาวน์โหลด qemu รุ่นล่าสุดมาลองดูซอร์สโค๊ด
$ sudo aptitude remove qemu
$ wget http://fabrice.bellard.free.fr/qemu/qemu-0.9.0.tar.gz
$ tar xfz qemu-0.9.0.tar.gz
$ cd qemu-0.9.0

ค้นข้อมูลในกูเกิลดู พบว่าต้นตออยู่ที่ไฟล์ sdl.c
พบว่า qemu แก้ปัญหา sdl ไม่ยอมส่งรหัส Num Lock - Caps Lock ไปให้ระบบ ด้วยการเขียนโค๊ดส่งรหัสเอง
แต่ปัจจุบันนี้ sdl น่าจะแก้ปัญหานี้แล้ว แต่โค๊ดส่วนนี้ยังคงอยู่ เลยทดลองเติมคอมเมนต์ในโค๊ดส่วนนี้ดู
$ vi sdl.c

...
    //case 0x45: /* num lock */
    //case 0x3a: /* caps lock */
        /* SDL does not send the key up event, so we generate it */
    //    kbd_put_keycode(keycode);
    //    kbd_put_keycode(keycode | 0x80);
    //    return;
    ...

แล้วจึงคอมไพล์ใหม่ ด้วย gcc-3.4 ซึ่งต้องติดตั้งใหม่
$ sudo aptitude install gcc-3.4
$ ./configure --cc=gcc-3.4
$ make
$ sudo make install

ผลปรากฎว่า สามารถใช้คีย์ Num Lock และ Caps Lock ได้อย่างที่ควรจะเป็นครับ

ทดลองกับเดเบียน Lenny และอูบุนตู Feisty ไลบรารี libsdl1.2-dev ทั้งคู่

debian: พิมพ์ลงไฟล์ pdf

มีงานที่ต้องแปลงไฟล์ภาพ tif เป็น pdf ถ้าหากเป็นภาพหน้าเดียว ก็สามารถแปะลงใน OpenOffice Writer แล้วส่งออกเป็น pdf ได้
แต่ถ้าหากเป็นเอกสารหลายหน้า จะไม่สามารถทำได้
จึงคิดว่าน่าจะใช้วิธีสร้างเครื่องพิมพ์เทียมให้ส่งออกเป็น pdf ดีกว่า ซึ่งจะทำให้สามารถใช้งานได้หลากหลายกว่า ไม่ใช่กับเฉพาะไฟล์ภาพ tif อย่างเดียว

ค้นไปค้นมา ปรากฎว่าแพกเกจ cups เขาทำมาให้อยู่แล้ว ชื่อ cups-pdf ลงเสร็จแล้วก็สามารถใช้งานได้เลย
$ sudo aptitude install cups-pdf

งานต่อมาคือเพิ่มเครื่องพิมพ์
System -> Administration -> Printing
โดยเพิ่มเครื่องพิมพ์เป็น Virtual PDF Printer
และให้ไดรเวอร์เป็น Generic -> Postcript color printer
เสร็จเรียบร้อยแล้ว

สำหรับ tif แบบหลายหน้า สามารถใช้ Document Viewer คือ Evince เปิดเอกสาร แล้วพิมพ์ผ่านเครื่องพิมพ์ postscript-color-printer อันใหม่นี้ได้เลย โดยไฟล์ pdf ที่ได้ จะไปอยู่ในไดเรกทอรี่บ้านของเรา ~/PDF

update-เพิ่มเติมคำสั่ง gs

งานพิมพ์จากวินโดวส์
ให้เลือกเครื่องพิมพ์เป็น Postscript แล้วพิมพ์ลงไฟล์
ต่อจากนี้อาจใช้ gs for windows ทำต่อ
หรือใช้คำสั่งบนลินุกซ์คือ gs รูปแบบคำสั่งคือ
$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=filename.pdf -- filename.prn
-dNOPAUSE คือให้ทำรวดเดียวไม่ต้องหยุด
-sDEVICE=pdfwrite คือทำเป็น pdf
-- คือทำเสร็จแล้วให้ออกจากโปรแกรมเลย

เพิ่มเติม -sDEVICE
png = png16m
แต่คุณภาพไม่ค่อยดี สู้เป็น pdfwrite ไม่ได้ (เอามาแก้ใน gimp ได้)
ดูรายละเอียดของ DEVICE ได้จากคำสั่ง gs --help

เพิ่มเติมสำหรับวินโดวส์
หากต้องการทำต้นฉบับหนังสือเพื่อส่งโรงพิมพ์ ให้เลือกเครื่องพิมพ์เป็นพวก Image Setter เช่น Scitex เป็นต้น
จะไม่มีปัญหาเรื่องพิมพ์ตกขอบทำให้ขอบขาด

เอามาจาก Hui's BLOG: gs แปลง PDF ภาษาญี่ปุ่นเป็น PNG

รวมไฟล์ pdf
$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=combined.pdf file1.pdf
file2.pdf

เอามาจาก Blog of Amorn Jiraseree-amornkun : วิธีรวมไฟล์ pdf หลายไฟล์เข้าด้วยกันในลินุกซ์

debain: Terminal

บันทึกการทำงานกับเทอร์มินัล

debian: XTerm

เทอร์มินัลของ GNOME ดือ gnome-terminal ยังใช้งานภาษาไทยกับ vim ได้ไม่ดีนัก
คือการเลื่อนเคอร์เซอร์ไม่ถูกตำแหน่ง และการคัดลอกข้อความด้วยเมาส์ก็ยังคัดลอกแบบผิด ๆ

การนี้ XTerm ใช้งานได้ดีกว่า แต่หน้าตาโบราณไปหน่อย และสีอักษรบนพื้นดำดูยากสักนิด
เลยทดลองปรับแต่งดูครับ

สำหรับเดเบียนติดตั้งด้วย
$ sudo aptitude install xterm xfonts-thai xfonts-thai-nectec xfonts-thai-poonlap xfonts-thai-vor

สำหรับผม ปรับแต่งให้เป็นพื้นขาว เลียนแบบ gnome-terminal และปรับแต่งตัวหนังสือให้ใหญ่ขึ้น และสีเข้มขึ้นเล็กน้อย
$ vi ~/.Xdefaults

!FONT
*VT100.utf8Fonts.font:  -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1

!COLOR
*VT100*foreground: grey10
*VT100*background: grey98

*VT100*color0: black
*VT100*color1: red2
*VT100*color2: green4
*VT100*color3: yellow3
*VT100*color4: blue4
*VT100*color5: magenta4
*VT100*color6: cyan4
*VT100*color7: gray90
*VT100*color8: gray50
*VT100*color9: red1
*VT100*color10: green3
*VT100*color11: yellow2
*VT100*color12: rgb:5c/5c/ff
*VT100*color13: magenta
*VT100*color14: cyan3
*VT100*color15: white

ให้ระบบรับรู้ค่าใหม่ของเรา
$ xrdb .Xdefaults

เสร็จแล้ว เรียกใช้ด้วยคำสั่ง
$ xterm
เรียบร้อย ใช้งานภาษาไทยได้ดีแล้ว

หมายเหตุ

  • ดูชื่อสี ได้จากไฟล์ /etc/X11/rgb.txt
  • ดูตัวอย่างพารามิเตอร์การปรับตั้งได้ที่ /etc/X11/apt-defaults/ ในไฟล์ XTerm และ XTerm-color

เอามาจาก - Xterm Terminal Emulator Options

debian: screen

เอามาจาก ThaiLinuxCafe - bash tips
---

จิ๊กมาจากบล๊อกคุณพูนลาภเรื่อง คุณเปิด terminal กี่บาน?
ท่านเขียนไว้ดีมาก ๆ

screen เป็น virtual terminal มีประโยชน์มากในการใช้งานผ่าน ssh
ข้อดีคือเวลาเรากลับเข้าไปในงานที่ทำค้างอยู่ มันจะเห็นเหมือนกับเราทำที่จุดนั้นจริง ๆ
สมมุติเราคอมไพล์งานค้างไว้ ถ้ามีข้อผิดพลาด มันจะแสดงให้เห็นข้อผิดพลาดนั้นด้วย
ที่สำคัญคือมันเป็น text mode จึงทำงานเร็วและไม่เปลืองแบนด์วิธ

สั่งเริ่ม screen
$ screen

คีย์ลัดที่ใช้บ่อย
C-a c = สร้างเชลล์ใหม่
C-a n = ไปเทอร์มินัลถัดไป ( ที่ยัง attach อยู่ )
C-a p = ไปเทอร์มินัลก่อนหน้า ( ที่ยัง attach อยู่ )
C-a d = detach เชลล์ปัจจุบัน ( กลับมาด้วยคำสั่ง screen -r )
C-a " = ดูเทอร์มินัลทั้งหมด ( คล้ายคำสั่ง screen -ls )
C-a 0 = ไปเทอร์มินัล 0
C-a 1 = ไปเทอร์มินัล 1
C-a S = แบ่งเทอร์มินัลแบบแนวตั้ง
(*หมายเหตุ C-a คือกด Ctrl+a )

ดูเชลล์ที่มี
$ screen -ls

ไป attach เชลล์ที่ถูก detach
ถ้ามีแค่เชลล์เดียว
$ screen -r
ถ้ามีหลายเชลล์
$ screen -r [pid.]tty[.host]

ปรับแต่งลักษณะของ screen ด้วยไฟล์ ~/.screenrc
$ vi ~/.screenrc

# ไม่เอาข้อความต้อนรับ
startup_message off

# ตั้งค่า scroll มากกว่าค่าปริยาย (100)
defscrollback 1024

# ทำให้มีแถบ status ด้านล่าง
hardstatus on
hardstatus alwayslastline
hardstatus string "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %H %{..Y} %m/%d %C%a "

# ใช้ Ctrl+t แทน Ctrl+a
escape ^Ta

ดูเพิ่มเติมได้ที่ gentoo-wiki: TIP Using screen

ถ้าใช้แล้วติดใจ อยากเวียนหัวเพิ่ม ให้ดู man screen


ตัวอย่างการใช้งาน

สมมุติว่าต้องการแก้ธีมของ drupal ที่เครื่อง server1.example.com
เราติดตั้ง drupal ไว้ที่ /var/www/drupal
สมมุติว่าเป็นธีม newsportal เหมือนของ debianclub
ไฟล์ที่ต้องการแก้ไขหลัก ๆ จะมีสองไฟล์ คือ style.css และ page.tpl.php
อยู่ใน /var/www/drupal/themes/newsportal/

เราจะเข้าถึง server1 ด้วยการใช้ ssh ปกติ
$ ssh server1.example.com

สั่งรัน screen
$ screen
กด Space bar ตามปกติ

ตอนนี้เราจะอยู่ในเทอร์มินัล 0 แต่ผมนิยมเว้นเทอร์มินัล 0 ไว้สำหรับงานจิปาถะชั่วคราว
และใช้เทอร์มินัล 1 ในการแก้ไขไฟล์ style.css
และใช้เทอร์มินัล 2 ในการแก้ไฟล์ page.tpl.php

กด C-a c เพื่อสร้างเทอร์มินัล 1
$ cd /var/www/drupal/themes/newsportal
$ vi style.css

กด C-a c เพื่อสร้างเทอร์มินัล 2
$ cd /var/www/drupal/themes/newsportal
$ vi page.tpl.php

หลังจากนี้เราสามารถสลับงานไปมาด้วยการกด C-a สองครั้ง
มันจะสลับไปมาระหว่างเทอร์มินัล 1 และ 2

ถ้าเราปิด ssh โดยไม่ออกจาก screen
เมื่อเข้ามาใหม่ เราสามารถเข้ามาที่งานที่ทำค้างไว้ได้เลย ด้วยคำสั่ง screen -r

หรือถ้าเราทำงานค้างไว้ที่ทำงาน และยังเปิด ssh ค้างอยู่
และเรากลับไปต่องานที่บ้าน เราสามารถช่วงชิง screen ที่ยังค้างอยู่ที่ทำงาน
มาด้วยคำสั่ง screen -d -r

จบแล้วครับ ใครมีทิป screen ดี ๆ แบ่งบ้างนะครับ

debian: ลองติดตั้ง Hylafax

เอามาจาก debian : ทดลองติดตั้ง hylafax

HylaFAX เป็นแพกเกจที่ใช้ทำ Fax Server
ใช้งานได้เสถียรดี และสามารถรองรับงานใหญ่ได้

ติดตั้ง hylafax-server
# aptitude install hylafax-server
Major possible upgrade issues
<<<--- [Enter]
Which paper size should be the system default?
<<<--- a4

ติดตั้งโมเด็มเป็นแฟกซ์
# faxsetup
ตอบตามจริง ยกเว้นข้อมูลของเรา ตัวอย่างของผมคือ
...
Country code [1]? <<<--- 66
Area code [415]? <<<--- 2
Phone number of fax modem [+1.999.555.1212]? <<<--- ใส่เบอร์แฟกซ์เรา
Local identification string (for TSI/CIG) ["NothingSetup"]? <<<--- ชื่อร้านหรือหน่วยงาน
...
Protection mode for received facsimile [0600]? <<<--- 0755
Protection mode for session logs [0600]? <<<--- 0755
...

อันนี้ผมขี้เกียจเก็บข้อมูลผู้ใช้ เลยตั้งเป็นว่าสามารถใช้งานได้จากทุกเครื่อง โดยไม่ต้องมีชื่อผู้ใช้งาน
# vi /etc/hylafax/hosts.hfaxd

...
^.*@.*\.example\.com$

# /etc/init.d/hylafax restart

client ฝั่งวินโดวส์ ผมใช้ Whfc
ส่วน client ฝั่งลินุกส์ ยังหาตัวที่ใช้งานสะดวกยังไม่ได้ครับ

ปรับปรุง: 49-11-14
วันนี้ได้มีโอกาสทดสอบการติดตั้งจริงบน etch อีกครั้งนึง
ปรากฎว่าเกิดปัญหาตอนติดตั้ง คือ
หน้าจอขึ้นมาถาม Area code ไม่หยุด ต้องกด Ctrl+C เพื่อเบรก
ทำให้การติดตั้งไฟล์ไม่สมบูรณ์
(ยังไม่แน่ใจว่าเกิดจากแพกเกจ หรือฮาร์ดแวร์ครับ)

ผมแก้ไขดังนี้ครับ

ดาวน์โหลดแพกเกจจากต้นฉบับ (ไม่แน่ใจความถูกต้องของแพกเกจในเครื่องเรา)
# wget http://ftp.us.debian.org/debian/pool/main/h/hylafax/hylafax-server_4.3.0-9_i386.deb

แตกไฟล์โดยไม่ติดตั้ง ไปยัง / (root directory)
# dpkg-deb -x hylafax-server_4.3.0-9_i386.deb /

ปรับตั้งแพกเกจใหม่
# dpkg-reconfigure hylafax-server

หลังจากนั้นก็เริ่มขั้นตอนตามปกติคือ
# faxsetup
...
# /etc/init.d/hylafax restart

debian: ตั้งให้ hylafax พิมพ์งานอัตโนมัติ

สร้างไฟล์ที่จะดักการทำงานตอนรับแฟกซ์ ชื่อ /etc/hylafax/FaxDispatch
แล้วเริ่มการทำงานใหม่ เพื่อให้ไฟล์ใหม่นี้ถูกคัดลอกไปไว้ในไดเรคทอรี่ของ hylafax
# vi /etc/hylafax/FaxDispatch

/usr/bin/tiff2ps -a $FILE | lpr -P $PRINTER_NAME

# /etc/init.d/hylafax restart

debian: ทดลองทำ HylaFAX Client

เอามาจาก debian : ทดลองติดตั้ง hylafax

ต้องมีเซิร์ฟเวอร์ที่เป็น HylaFAX แล้ว ดูวิธีติดตั้งได้จากคราวก่อน

ติดตั้ง Pyla
$ sudo aptitude install python python-tk
$ wget http://www.teamsw.it/pyla/download/pyla1.1.7.1.tgz
$ tar xfz pyla1.1.7.1.tgz
$ sudo mv pyla /usr/local
$ /usr/local/pyla/pyla.py
-> ปรับตั้งโปรแกรม

ติดตั้งเครื่องพิมพ์เทียมให้ pyla
เอามาจาก Fun with CUPS and Pyla
หลักการคือเขาใช้ perl เขียนโปรแกรมทำหน้าที่เป็น socket คอยดูว่ามีข้อมูลเข้ามาทางพอร์ต 5691 หรือเปล่า ถ้ามี ก็จะเรียกใช้โปรแกรมนี้ซึ่งจะไปเรียกใช้ pyla อีกทีนึง

สร้างโปรแกรมเรียก pyla ชื่อ pyla-print เอาใส่ไว้ใน /usr/local/bin
$ sudo vi /usr/local/bin/pyla-print

#!/usr/bin/perl

# Daniel E. Markle 
# 20031114 Revision 0.1

# This program starts up a daemon which will watch for a postscript file
#  coming in from CUPS, then launch pyla to send it as a fax.
# Use it with the socket://localhost:5691 URL in cups.

# Issues:
#    -security, make sure only localhost can see this port, it allows anyone
#      who can stream data to this port to popup pyla on your desktop
#    -must be ran as the user or the window may not pop up at the right
#      place, if at all

# ***CONFIGURE ME HERE

# Port to listen on, use socket://localhost: in cups
my $MY_PORT = 5691;

# Temporary file storage, this is a file not a folder
my $TMP_FILE_NAME = "/tmp/cupsfaxtemp";

# Path to pyla.py
my $PYLA_PATH = "/usr/local/pyla/pyla.py";

# Path to python binary
#  use this one for Linux
my $PYTHON_PATH = "/usr/bin/python";
#  use this one for OS X
#my $PYTHON_PATH = "/usr/bin/pythonw";

# ***END CONFIGURATION

# ----- You shouldn't need to touch anything beyond this point -----

use IO::Socket::INET;

# check to make sure we can use the temp file
open ( TMPFILE, ">", $TMP_FILE_NAME )
   or die "Can not open temp file $TMP_FILE_NAME, " .
   "check to make sure it is not owned by another user";
close ( TMPFILE );

if ( !(-e $PYLA_PATH) ) {
   die "I do not see pyla at $PYLA_PATH";
   }

my $data;
my $server = IO::Socket::INET->new (
   LocalPort => $MY_PORT,
   Type => SOCK_STREAM,
   Reuse => 1,
   Listen => 1
   ) or die "Could not start server process";
   
while ( my $job = $server->accept() ) {
   open ( TMPFILE, ">", $TMP_FILE_NAME );
   while ( <$job> ) {
      print TMPFILE $_;
      }
   close ( TMPFILE );
   close $job;
   `cat "$TMP_FILE_NAME" | "$PYTHON_PATH" "$PYLA_PATH" -i`
   }

ทำให้รันได้
$ sudo chmod 755 /usr/local/bin/pyla-print

สร้างโปรแกรมที่รันเป็น daemon คอยดูซอกเก็ต ชื่อ pyla-printd เอาใส่ไว้ใน /etc/init.d
$ sudo vi /etc/init.d/pyla-printd

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/pyla-print
NAME=pyla-print
DESC="Pseudo printer for Pyla"

test -x $DAEMON || exit 0

case "$1" in
        start)
                echo -n "Starting $DESC: "

                start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                        --background --make-pidfile --exec $DAEMON -- $DAEMON_OPTS

                echo "$NAME."
                ;;

        stop)
                echo -n "Stopping $DESC: "

                start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                        --oknodo

                echo "$NAME."
                ;;

        restart|force-reload)
                echo -n "Restarting $DESC: "

                start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                        --oknodo

                sleep 1

                start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                        --background --make-pidfile --exec $DAEMON -- $DAEMON_OPTS

                echo "$NAME."
                ;;

        *)
                N=/etc/init.d/$NAME
                echo "Usage: $N {start|stop|restart|force-reload}" >&2
                exit 1
                ;;
esac

exit 0

ทำให้รันได้ - สั่งรันเป็น daemon และให้เริ่มรันทุกครั้งที่เปิดเครื่อง
$ sudo chmod 755 /etc/init.d/pyla-printd
$ sudo /etc/init.d/pyla-printd restart
$ sudo update-rc.d pyla-printd defaults

ติดตั้งตัวจัดการเครื่องพิมพ์
$ sudo aptitude install cupsys-client

เพิ่มเครื่องพิมพ์เทียมให้ระบบ
$ sudo lpadmin -p pseudo-pyla -E -v socket://localhost:5691
หรือตั้งชื่อให้เรียกง่ายขึ้นว่า hylafax เฉย ๆ ก็ได้
$ sudo lpadmin -p hylafax -E -v socket://localhost:5691

เมื่อทุกอย่างเรียบร้อย จะมีเครื่องพิมพ์ฃื่อ psuedo-pyla ขึ้นมา ถ้าเราพิมพ์มาที่เครื่องพิมพ์ตัวนี้ เขาจะมาเรียกใช้ pyla ให้ส่งแฟกซ์เอง

update

แก้ปัญหาดูแฟกซ์ที่รับไม้ได้
ตั้งการอนุญาตใช้ไฟล์ ที่ไฟล์โมเด็ม (ส่วนใหญ่จะชื่อ config.ttyS0)
# vi /etc/hylafax/config.ttyS0
...
RecvFileMode:       0666
...

debian: ปรับปรุง HylaFax Client

ปรับปรุง HylaFax Client

ปรับปรุงจากdebian: ทดลองทำ HylaFAX Client
ครั้งก่อนมีปัญหาว่า daemon ถูกรันด้วย root ใน runlevel ที่อยู่ในสถานะอักขระ (text mode) ซึ่งยังไม่มีการกำหนดค่าตัวแปรแวดล้อม $DISPLAY
แต่เวลาซอกเก็ตถูกเรียกใช้ จะถูกเรียกใช้ด้วยผู้ใช้ที่ runlevel ที่อยู่ในสถานะกราฟฟิก โดย gtk จะมาดูว่าต้องแสดงผลที่จอไหนจากตัวแปรแวดล้อม $DISPLAY นี้ ทำให้โปรแกรมตาย
ซึ่งต้องแก้ปัญหาด้วยการใช้คำสั่ง $ sudo /etc/init.d/pyla-printd restart จากเทอร์มินอล จึงจะหาย

ตอนใหม่นี้ เราจะไม่ตั้งให้เรียกจาก runlevel แล้ว แต่จะตั้งให้รันจาก gnome-session ของผู้ใช้เลย ทำให้แก้ปัญหาเรื่องต้องเริ่มเซอร์วิสใหม่ได้

แต่เพื่อป้องกันการสับสน จะขอเริ่มใหม่เลย

ต้องมีเซิร์ฟเวอร์ที่เป็น HylaFAX แล้ว ดูวิธีติดตั้งได้จากdebian: ลองติดตั้ง Hylafax

ติดตั้ง Pyla
$ sudo aptitude install python python-tk
$ wget http://www.teamsw.it/pyla/download/pyla1.1.7.1.tgz
$ tar xfz pyla1.1.7.1.tgz
$ sudo mv pyla /usr/local
$ /usr/local/pyla/pyla.py
-> ปรับตั้งโปรแกรม

ติดตั้งเครื่องพิมพ์เทียมให้ pyla
เอามาจาก Fun with CUPS and Pyla
หลักการคือเขาใช้ perl เขียนโปรแกรมทำหน้าที่เป็น socket คอยดูว่ามีข้อมูลเข้ามาทางพอร์ต 5691 หรือเปล่า ถ้ามี ก็จะเรียกใช้โปรแกรมนี้ซึ่งจะไปเรียกใช้ pyla อีกทีนึง

สร้างโปรแกรมเรียก pyla ชื่อ pyla-print เอาใส่ไว้ใน /usr/local/bin
$ sudo vi /usr/local/bin/pyla-print

#!/usr/bin/perl

# Daniel E. Markle 
# 20031114 Revision 0.1

# This program starts up a daemon which will watch for a postscript file
#  coming in from CUPS, then launch pyla to send it as a fax.
# Use it with the socket://localhost:5691 URL in cups.

# Issues:
#    -security, make sure only localhost can see this port, it allows anyone
#      who can stream data to this port to popup pyla on your desktop
#    -must be ran as the user or the window may not pop up at the right
#      place, if at all

# ***CONFIGURE ME HERE

# Port to listen on, use socket://localhost: in cups
my $MY_PORT = 5691;

# Temporary file storage, this is a file not a folder
my $TMP_FILE_NAME = "/tmp/cupsfaxtemp";
`touch "$TMP_FILE_NAME"; chmod 777 "$TMP_FILE_NAME"`;

# Log file storage
my $LOG_FILE_NAME = "/tmp/cupsfaxlog";
`touch "$LOG_FILE_NAME"; chmod 777 "$LOG_FILE_NAME"`;

# Path to pyla.py
my $PYLA_PATH = "/usr/local/pyla/pyla.py";

# Path to python binary
#  use this one for Linux
my $PYTHON_PATH = "/usr/bin/python";
#  use this one for OS X
#my $PYTHON_PATH = "/usr/bin/pythonw";

# ***END CONFIGURATION

# ----- You shouldn't need to touch anything beyond this point -----

use IO::Socket::INET;

# check to make sure we can use the temp file
open ( TMPFILE, ">", $TMP_FILE_NAME )
   or die "Can not open temp file $TMP_FILE_NAME, " .
   "check to make sure it is not owned by another user";
close ( TMPFILE );

if ( !(-e $PYLA_PATH) ) {
   die "I do not see pyla at $PYLA_PATH";
   }

my $data;
my $server = IO::Socket::INET->new (
   LocalPort => $MY_PORT,
   Type => SOCK_STREAM,
   Reuse => 1,
   Listen => 1
   ) or die "Could not start server process";
   
while ( my $job = $server->accept() ) {
   open ( TMPFILE, ">", $TMP_FILE_NAME );
   while ( <$job> ) {
      print TMPFILE $_;
      }
   close ( TMPFILE );
   close $job;
   `cat "$TMP_FILE_NAME" | "$PYTHON_PATH" "$PYLA_PATH" -i &> "$LOG_FILE_NAME"`;
   }

ทำให้รันได้
$ sudo chmod 755 /usr/local/bin/pyla-print

ตั้งให้ gnome-sessions รัน pyla-print
ทำผ่านเมนู System -> Preferences -> Sessions
แท็บ Startup Programs กดปุ่ม Add

Name: Pyla Print Daemon
Command: /usr/local/bin/pyla-print
Comment: Pyla Print Daemon (start by gnome-sessions)

ล๊อกเอาต์ และ ล๊อกอิน 1 ครั้ง

จัดการให้โปรแกรมตายตอนล๊อกเอาต์
เมนู System -> Preferences -> Sessions
แท็บ Current Sessions เลือกบรรทัดที่เป็น pyla-print
เปลี่ยนปุ่ม Style เป็น Restart
เสร็จแล้ว

ติดตั้งตัวจัดการเครื่องพิมพ์
$ sudo aptitude install cupsys-client

เพิ่มเครื่องพิมพ์เทียมให้ระบบ ตั้งชื่อว่า hylafax
$ sudo lpadmin -p hylafax -E -v socket://localhost:5691

เมื่อทุกอย่างเรียบร้อย จะมีเครื่องพิมพ์ฃื่อ hylafax ขึ้นมา ถ้าเราพิมพ์มาที่เครื่องพิมพ์ตัวนี้ เขาจะมาเรียกใช้ pyla ให้ส่งแฟกซ์เอง

เพิ่มเติม

แก้ปัญหาดูแฟกซ์ที่รับไม้ได้ (ทำที่เซิร์ฟเวอร์)
ตั้งการอนุญาตใช้ไฟล์ ที่ไฟล์โมเด็ม (ส่วนใหญ่จะชื่อ config.ttyS0)
# vi /etc/hylafax/config.ttyS0
...
RecvFileMode:       0666
...

# /etc/init.d/hylafax restart

debian: debootstrap

debootstrap เป็นแพกเกจที่ใช้ในการติดตั้งเดเบียนผ่านเครือข่าย
สามารถนำมาใช้ประโยชน์ได้เช่น การติดตั้งลินุกซ์ซ้อนเข้าในระบบเพื่อการทดลอง หรือการติดตั้งระบบเพิ่มเติมสำหรับงาน Virtualization

การใช้งาน ควรมี mirror ซึ่งอาจเป็น apt-proxy apt-cacher หรือ mirror แท้ ๆ อยู่ในเครือข่ายเราก่อน

รูปแบบใช้งานคือ

debootstrap [OPTION...] SUITE TARGET [MIRROR [SCRIPT]]

SUITE คือรุ่นของลินุกซ์ที่เราจะติดตั้ง สำหรับเดเบียนได้แก่ sarge หรือ etch เป็นต้น
TARGET คือพาร์ติชั่นที่เราเมานต์ไว้แล้วสำหรับการติดตั้ง
MIRROR คือคลังแพกเกจ เช่น apt-proxy หรือ mirror อื่น

รายละเอียดสามารถศึกษาได้เพิ่มเติมจาก man debootstrap

ตัวอย่างการใช้งาน debootstrap สำหรับงานทดลอง

ก่อนหน้าที่จะรู้จักคำสั่ง aptitude การติดตั้งแพกเกจด้วยคำสั่ง apt-get นั้น เมื่อเราลบแพกเกจที่เราไม่ต้องการออกแล้ว จะเหลือแพกเกจลูกที่ไม่ถูกใช้งานอยู่เป็นจำนวนมาก เวลาเราต้องการทำการทดลองใหม่ เราจะไม่ทราบแน่ชัดถึงผลกระทบของแพกเกจใหม่กับแพคเกจลูกของใหม่กับของเก่า
ดังนั้นเพื่อให้ระบบสะอาดเหมือนกับการติดตั้งใหม่ เราจึงควรแบ่งพาร์ติชั่นไว้สำหรับการทดลองนี้โดยเฉพาะ ทุกครั้งที่ต้องการการทดลองใหม่ ๆ เราจะติดตั้งเดเบียนใหม่ลงในพาร์ติชั่นนี้เลย ด้วย debootstrap

สมมุติว่า mirror เราชื่อ www.example.com
เครื่องเราชื่อ server1

และสมมุติว่าแบ่งพาร์ติชั่นไว้ดังนี้

/dev/hda1   = /boot ขนาด 100M
/dev/hda2   = /     ขนาด 10G เป็นระบบปัจจุบัน
/dev/hda3   = Extended
/dev/hda5   = swap  ขนาด 512M

เราจะติดตั้งระบบใหม่บน /dev/hda6 ให้มีขนาด 20G เพื่อใช้เป็น / (root) ของระบบใหม่

สร้างพาร์ติชั่นใหม่ คือ /dev/hda6 ขนาด 20G
# fdisk /dev/hda

Command (m for help): <<<--- n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
<<<--- l
First cylinder (XXXX-XXXXX, default XXXXX):<<<--- {Enter}
Last cylinder or +size or +sizeM or +sizeK (XXXX-XXXXX, default XXXXX):<<<--- +20G
.
Command (m for help): <<<--- w

สร้างระบบไฟล์เป็น ext3
# mkfs.ext3 /dev/hda6

สร้างจุดเมานต์ให้ /dev/hda6 สมมุติว่าชื่อ /mnt/disk
# mkdir -p /mnt/disk

ก่อนจะติดตั้ง ต้องเมานต์ /dev/hda6 ลงบน /mnt/disk ก่อน
# mount /dev/hda6 /mnt/disk

ติดตั้ง etch บน /mnt/disk ผ่าน debootstrap
# debootstrap etch /mnt/disk http://www.example.com:9999/debian

เมื่อติดตั้งเสร็จแล้ว จำเป็นต้องคัดลอกไฟล์ที่จำเป็นในการเริ่มต้นระบบไปยัง /mnt/disk และทำการแก้ไขตามจำเป็น
# cp /etc/hosts /mnt/disk/etc ; vi /mnt/disk/etc/hosts
# cp /etc/network/interfaces /mnt/disk/etc/network ; vi /mnt/disk/etc/network/interfaces
# cp /etc/hostname /mnt/disk/etc ; vi /mnt/disk/etc/hostname
# cp /etc/apt/sources.list /mnt/disk/etc/apt ; vi /mnt/disk/etc/apt/sources.list
# cp /etc/fstab /mnt/disk/etc ; vi /mnt/disk/etc/fstab

ตรงไฟล์ /mnt/disk/etc/fstab อย่าลืมเปลี่ยน /dev/hda2 เป็น /dev/hda6

สร้างสภาพแวดล้อม เพื่อใช้ในการ chroot ไปยัง /mnt/disk
# mount -t proc none /mnt/disk/proc
# mount -o bind /dev /mnt/disk/dev
# mount -t sysfs /sys /mnt/disk/sys

chroot ไปยัง /mnt/disk
# chroot /mnt/disk /bin/bash

เริ่มการติดตั้งแพกเกจที่จำเป็นและปรับตั้งระบบ
server1:/# aptitude update
server1:/# aptitude install locales console-data
server1:/# dpkg-reconfigure locales
server1:/# aptitude install initrd-tools usbutils pciutils bzip2 ssh grub udev yaird ssh

( ถ้าต้องการระบบ X-Window ด้วย
server1:/# aptitude install xorg gdm gnome )

ติดตั้งเคอร์เนล
server1:/# aptitude install linux-image-686

อย่าลืมตั้งรหัสผ่านให้ root
server1:/# passwd

กันเหนียวด้วยการปรับตั้งระบบใหม่ทั้งหมด
server1:/# dpkg-reconfigure -a
ตอบค่าปริยายทั้งหมด ยกเว้นส่วนของ locales, tzconfig, dash ให้ตอบตามต้องการ

ออกจากสภาพ chroot
server1:/# exit

ยกเลิกการเมานต์ที่ผ่านมา
# umount /mnt/disk/proc
# umount /mnt/disk/dev
# umount /mnt/disk/sys
# ldconfig
# sync

(ถ้ายกเลิกเมานต์ไม่ผ่าน ไม่เป็นไร ให้ผ่านไปก่อน)

ปรับตั้งการบูต
# vi /boot/grub/menu.lst

แก้ไขลำดับการบูต
แก้จาก default 0 เป็น default 2

...
default        2
...

เติมลำดับการบูตให้กับเดเบียนใหม่ที่เราเพิ่งติดตั้งเสร็จ โดยต่อท้ายจากของเก่า

...
title       Etch-Experiment, kernel 2.6.18-3-386
root        (hd0,5)
kernel      /vmlinuz root=/dev/hda5 ro
initrd      /initrd.img
savedefault
...

เรียบร้อยแล้ว รีบูตใหม่ได้เลย
# reboot

ระบบใหม่จะเป็นเดเบียน Etch ใหม่แบบสะอาด ๆ
เมื่อจะทำการทดลองระบบใหม่ ถ้าจำเป็นต้องลงใหม่ก็ทำเหมือนเดิมครับ

ติดตั้งอูบุนตู Feisty ด้วย debootstrap จากเดเบียน Etch

สมมุติว่า mirror เราชื่อ www.example.com ได้ติดตั้ง apt-proxy สำหรับอูบุนตูไว้เรียบร้อยแล้ว
(เวลาใช้งานจาก apt-proxy ต้องระบุพอร์ตเป็น 9999)

และสมมุติว่าแบ่งพาร์ติชั่นไว้ดังนี้

/dev/hda1   = /    เป็นเดเบียน Etch
/dev/hda2   = ว่าง     ขนาด 20G เตรียมสำหรับ Feisty
/dev/hda3   = Extended
/dev/hda5   = swap  ขนาด 512M

เราจะติดตั้งระบบใหม่บน /dev/hda2 ให้มีขนาด 20G เพื่อใช้เป็น / (root) ของระบบใหม่

สร้างระบบไฟล์เป็น ext3
# mkfs.ext3 /dev/hda2

สร้างจุดเมานต์ให้ /dev/hda2 สมมุติว่าชื่อ /mnt/disk
# mkdir -p /mnt/disk

ก่อนจะติดตั้ง ต้องเมานต์ /dev/hda2 ลงบน /mnt/disk ก่อน
# mount /dev/hda2 /mnt/disk

ติดตั้ง debootstrap บน Etch
# aptitude install debootstrap

เนื่องจากแพกเกจ debootstrap ของ Etch ไม่มีสคริปต์สำหรับอูบุนตู Feisty
เราจึงต้องไปดาว์นโหลดแพกเกจ debootstrap ของ Feisty เอง เพื่อมาแตกเอาไฟล์สคริปต์นี้
# wget http://fr.archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.3.2ubuntu3_all.deb
ถึงวันนี้ มิเรอร์ของไทย mirror.in.th ยังไม่อัปเดตครับ

แตกด้วย Archive Manager เฉพาะไฟล์ที่ชื่อ feisty แล้วนำไปใส่ไว้ใน /usr/lib/debootstrap/scripts
# cp feisty /usr/lib/debootstrap/scripts

เริ่มติดตั้ง Feisty บน /mnt/disk ผ่าน debootstrap
# debootstrap feisty /mnt/disk http://www.example.com:9999/debian

เมื่อติดตั้งเสร็จแล้ว จำเป็นต้องคัดลอกไฟล์ที่จำเป็นในการเริ่มต้นระบบไปยัง /mnt/disk และทำการแก้ไขตามจำเป็น
# cp /etc/hosts /mnt/disk/etc ; vi /mnt/disk/etc/hosts
# cp /etc/networks/interface /mnt/disk/etc/networks ; vi /mnt/disk/etc/networks/interface
# cp /etc/hostname /mnt/disk/etc ; vi /mnt/disk/etc/hostname
# cp /etc/apt/sources.list /mnt/disk/etc/apt ; vi /mnt/disk/etc/apt/sources.list
# cp /etc/fstab /mnt/disk/etc ; vi /mnt/disk/etc/fstab

ตรงไฟล์ /mnt/disk/etc/fstab อย่าลืมเปลี่ยน /dev/hda1 เป็น /dev/hda2

แก้ไขไฟล์ /etc/apt/sources.list เป็นดังนี้
# vi /mnt/disk/etc/apt/sources.list

deb     http://www.example.com:9999/ubuntu feisty main restricted universe multiverse
deb-src http://www.example.com:9999/ubuntu feisty main restricted universe multiverse

สร้างสภาพแวดล้อม เพื่อใช้ในการ chroot ไปยัง /mnt/disk
# mount -t proc none /mnt/disk/proc
# mount -o bind /dev /mnt/disk/dev
# mount -t sysfs /sys /mnt/disk/sys

chroot ไปยัง /mnt/disk
# chroot /mnt/disk /bin/bash

เริ่มการติดตั้งแพกเกจที่จำเป็นและปรับตั้งระบบ
(CHROOT)# mount -a
(CHROOT)# aptitude update
(CHROOT)# aptitude install locales console-data localeconf

ปรับแต่ง locale ให้ด้วย
(CHROOT)# locale-def en_US.UTF-8
(CHROOT)# dpkg-reconfigure locales localeconf

ติดตั้งแพกเกจจำเป็นที่เหลือ
(CHROOT)# aptitude install initrd-tools usbutils pciutils bzip2 ssh grub udev yaird ubuntu-minimal ubuntu-standard

( ถ้าต้องการระบบ X-Window ด้วย
(CHROOT)# aptitude install ubuntu-desktop xorg gdm gnome )

ติดตั้งเคอร์เนล
(CHROOT)# aptitude install linux-image-686

อย่าลืมตั้งรหัสผ่านให้ root
(CHROOT)# passwd

ปรับตั้งระบบใหม่ทั้งหมด
(CHROOT)# dpkg-reconfigure -a
ตอบค่าปริยายทั้งหมด ยกเว้นส่วนของ locales, tzconfig, dash ให้ตอบตามต้องการ

ออกจากสภาพ chroot
(CHROOT)# exit

ยกเลิกการเมานต์ที่ผ่านมา
# umount /mnt/disk/proc
# umount /mnt/disk/dev
# umount /mnt/disk/sys
# ldconfig
# sync

(ถ้ายกเลิกเมานต์ไม่ผ่าน ไม่เป็นไร ให้ผ่านไปก่อน)

ปรับตั้งการบูต
# vi /boot/grub/menu.lst

แก้ไขลำดับการบูต
แก้จาก default 0 เป็น default 2

...
default        2
...

เติมลำดับการบูตให้กับอูบุนตูใหม่ที่เราเพิ่งติดตั้งเสร็จ โดยต่อท้ายจากของเก่า

...
title       Ubuntu Feisty - Experiment, kernel 2.6.20-15-generic
root        (hd0,1)
kernel      /vmlinuz root=/dev/hda2 ro
initrd      /initrd.img
savedefault
...

เรียบร้อยแล้ว รีบูตใหม่ได้เลย
# reboot

จะได้อูบุนตู Feisty ที่ติดตั้งผ่าน debootstrap

หมายเหตุ

  • เนื่องจากติดตั้งข้ามดิสโตร เมื่อบูตด้วยอูบุนตูแล้ว อย่าลืมใช้คำสั่งชุดนี้ด้วย
    $ sudo dpkg-reconfigure -a
    $ sudo aptitude update && sudo aptitude dist-upgrade
  • การทดลองจริง อาจไม่ราบรื่นแบบที่เขียน ถ้าผ่านขั้นตอนการติดตั้งเคอร์เนลแล้ว สามารถรีบูตเป็น Feisty แล้วมาทำต่อ อาจให้ผลที่ดีกว่า

debian: บันทึก apache2

บนเดเบียน สามารถเปิดใช้งานมอดูลด้วยคำสั่ง a2enmod MODULENAME และปิดการใช้งานด้วยคำสั่ง a2dismod MODULENAME

มอดูล

autoindex
ดูไฟล์ในไดเรกทอรี่
userdir
public_html ของผู้ใช้
rewrite
การทำ rewrite คือแปลงรูปของ url แบบต่าง ๆ
proxy
การทำ Redirect ไปยังเครื่องอื่น (mod_proxy) - ตัวอย่างการติดตั้ง
cband
จำกัดแบนด์วิดธ์ ทำได้หลายอย่าง
ยกตัวอย่างแค่อย่างเดียว คือจำกัดการใช้งานต่อไอพีให้ความเร็วไม่เกิน 1000kbps คำร้องไม่เกิน 10 ครั้งต่อวินาที และเปิดการใช้งานได้ไม่เกิน 10 ครั้งต่อวินาที
# vi /etc/apache2/site-enables/example.com
<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    ServerName www.example.com
    ServerAlias example.com
    <IfModule mod_cband.c>
        CBandExceededSpeed 1000 10 10
    </IfModule>
    ...
</VirtualHost>

# /etc/init.d/apache2 force-reload

ภาษา

# vi /etc/apache2/conf.d/charset

ไทย
AddCharset    TIS-620    .tis-620 .th
AddCharset    CP874      .cp874

บันทึกการอัปเกรด apache2.2 และ php5 บน etch

# aptitude update
# aptitude install apache2 apache2-doc apache2-mpm-prefork apache2-utils apache2.2-common
# aptitude install php5 php5-cgi php5-commonphp5-curlphp5-gd php5-mcrypt php5-mysql php5-odbc php5-pgsql php5-xmlrpc
# aptitude install libapache2-mod-php5

ช่วงนี้ aptitude ของ etch เป็นอะไรไม่รู้ ชอบติดตั้งไฟล์ไม่ครบ
(อาจเป็นที่ apt-proxy)
แก้ไขแพกเกจติดตั้งไฟล์ไม่ครบ โดยการแตกไฟล์โดยไม่ติดตั้ง ไปยัง /
# dpkg-deb -x /var/cache/apt/archives/apache2.2-common_2.2.3-3.1_i386.deb /

# aptitude install mysql-client-5.0 mysql-common mysql-server-5.0 phpmyadmin

บันทึกการเปิดโมดูลแบบน้อยสุด module-minimal
# a2enmod actions
# a2enmod alias
# a2enmod authz_host
# a2enmod cgi
# a2enmod dir
# a2enmod mime
# a2enmod php5
# a2enmod rewrite
# a2enmod status
# /etc/init.d/apache2 restart

บันทึกการเปิดใช้โมดูลแบบปกติ module-normal
# a2enmod alias
# a2enmod auth_basic
# a2enmod authn_file
# a2enmod authz_default
# a2enmod authz_groupfile
# a2enmod authz_host
# a2enmod authz_user
# a2enmod autoindex
# a2enmod cgi
# a2enmod dir
# a2enmod env
# a2enmod mime
# a2enmod mod_python
# a2enmod negotiation
# a2enmod php5
# a2enmod setenv
# a2enmod status
# /etc/init.d/apache2 restart

เอา php.ini จากตัวอย่างแบบ recommended มาใช้
# cp /usr/share/doc/php5/examples/php.ini-recommended /etc/php5/apache2/php.ini

แก้จะให้ใช้ได้กับ drupal
# vi /etc/php5/apache2/php.ini

...
; หน่วยความจำที่ยอมให้สคริปต์รันได้
; เก่าเป็น 8M drupal แนะนำ 12M เราใช้ 16M กันเหนียว
memory_limit = 16M ; Maximum amount of memory a script may consume (8MB)
...
; ตัวแปรเป็น global อัตโนมัติ
; อันนี้ก็กันเหนียว ตอนเขียนโค๊ดเรี่ยราดไว้หลายที่ เก่าเป็น Off เราแก้เป็น On
register_globals = On
...
; ขนาดไฟล์ใหญ่สุด ที่ post ได้
; อันนี้จำได้แม่น หน้าแตกเพราะเอา Bon Echo เข้าไม่ได้ เก่าเป็น 8M แก้เป็น 20M
post_max_size = 20M
...
; adodb ไม่ต้องก็ได้
include_path = ".:/usr/share/php5:/usr/share/php4:/usr/share/php/adodb"
...
; ค่าแนะนำของ drupal
session.save_handler = user
...
; ค่าแนะนำของ drupal
session.cache_limiter = none
...

ส่วนของไซต์ ถ้ามีหลายไซท์ ควรแยกไฟล์ออกมาวางไว้ที่ /etc/apache2/site-available
เวลาจะเปิดใช้งานก็ใช้คำสั่ง a2ensite
เช่นไซต์ example.com
# vi /etc/apache2/sites-available/example.com

<VirtualHost *:80>
  ServerAdmin webmaster@example.com
  ServerName www.example.com

  DocumentRoot /var/www/www.example.com/
  <Directory />
    Options FollowSymLinks
    AllowOverride All
  </Directory>
  <Directory /swww2/var/www/www.thaitux.info/>
    Options Indexes FollowSymLinks MultiViews
    DirectoryIndex index.html index.php
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>

  ErrorLog /var/log/apache2/error.log

  LogLevel warn

  CustomLog /var/log/apache2/access.log combined
  ServerSignature On
</VirtualHost>

เปิดใช้งานด้วยคำสั่ง
# a2ensite example.com
# /etc/init.d/apache2 restart

apache2-ssl

!!!BETA!!!
เอามาจาก

Debian Wiki - SubversionApache2SSLHowto
Bug#395823: apache2-ssl-certificate disappeared

ติดตั้ง apache2 กับ ssl
# aptitude install apache2 openssl

เปิดใช้โมดูล ssl
# a2enmod ssl

แก้ให้ apache2 ใช้พอร์ต https คือ 443
# vi /etc/apache2/ports.conf

...
Listen 443

etch รุ่นล่าสุด ชุดคำสั่งสร้างกุญแจของ apache2 ชื่อ apache2-ssl-certificate หายไปแล้ว
ต้องสั่งเองทีละขั้น
# export RANDFILE=/dev/random
# mkdir -p /etc/apache2/ssl
# openssl req $@ -new -x509 -days 365 -nodes -out \
/etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem

กรอกข้อมูลตามปกติ
...
Country Name (2 letter code) [AU]: <<<--- TH
State or Province Name (full name) [Some-State]: <<<--- Bangkok
Locality Name (eg, city) []: <<<--- Bangkok
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <<<--- Example Co.,Ltd.
Organizational Unit Name (eg, section) []: <<<--- computer
Common Name (eg, YOUR name) []: <<<--- webmaster
Email Address []: <<<--- webmaster@example.com

ป้องกันกุญแจ
# chmod 600 /etc/apache2/ssl/apache.pem

สร้างไฟล์ไซต์ ssl สมมุติชื่อไฟล์ว่า example-ssl โดยเอาโครงมาจากไฟล์ default
# cp /etc/apache2/sites-available/default /etc/apache2/sites-available/example-ssl

ปรับแก้
# vi /etc/apache2/sites-available/example-ssl

NameVirtualHost *:443
<VirtualHost *:443>

...
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    SSLProtocol all
    SSLCipherSuite HIGH:MEDIUM

</VirtualHost>

(ตรงนี้ สามารถเปลี่ยนไดเรกทอรี่ของ ssl ไปยังจุดใดก็ได้ ตามที่เราต้องการ
เช่น ถ้าใช้ svn ไดเรกทอรี่จะเป็น /var/lib/svn/)

สั่งเปิดใช้ไซต์ที่สร้างขึ้น
# a2ensite example-ssl

สั่งเริ่ม apache2 ใหม่
# /etc/init.d/apache2 restart

debian: ทดลอง XenOnLenny

จะเอามาลองทดสอบ Windows XP
ใช้ซีพียูอินเทล E6300 (เป็น VT อันดับเบื้องต้นที่สามารถวิ่ง Unmodified OS ได้) แรม 1G

ติดตั้ง xen
$ sudo aptitude install xen-hypervisor-3.0.3-1-i386 xen-utils-common

ติดตั้ง Dom0
$ sudo aptitude install xen-linux-system-2.6.18-4-xen-686
บูตใหม่ด้วย Dom0

เตรียมติดตั้ง DomU ที่เป็น Windows XP
$ sudo aptitude install xen-ioemu-3.0.3-1

สร้างไฟล์คอนฟิกสำหรับ Windows XP
$ sudo vi /etc/xen/winxp.cfg

ติดตั้ง DomU ไว้บนพาร์ติชั่นของฮาร์ดดิสก์จริง ๆ คือ /dev/hda2
ติดตั้งเน็ตเวิร์กตามค่าปริยาย คือเป็นแบบบริดจ์
เนื้อไฟล์เป็นดังนี้

kernel = "/usr/lib/xen-3.0.3-1/boot/hvmloader"
device_model ='/usr/lib/xen-3.0.3-1/bin/qemu-dm'
builder='hvm'
memory = 384
name = "winxp"
vcpus=1
disk = ['phy:/dev/hda2,ioemu:hda,w','phy:/dev/hdb,hdb:cdrom,r']
boot='d'
vif = [ 'type=ioemu, bridge=xenbr0' ]
vnc=1
vncviewer=1
serial='pty'
ne2000=0

ติดตั้ง VNC สำหรับดูหน้าจอ Windows XP
$ sudo aptitude install xtightvncviewer

เริ่มบูตเพื่อติดตั้ง DomU
$ sudo xm create winxp.cfg

เมื่อเคอร์เซอร์หลุดออกมาสู่ภาวะพร้อม ก็สั่งดูหน้าจอติดตั้ง Windows XP ด้วย xtightvncviewer
$ xtightvncviewer localhost

... ติดตั้งตามปกติ ...
หมายเหตุ

  • ถ้ามีการเปลี่ยนความละเอียดของหน้าจอบน Windows XP อาจต้องปิดหน้าต่างของ xtightvncviewer แล้วก็ใช้คำสั่ง $ xtightvncviewer localhost ใหม่
  • ถ้าติดตั้งเรียบร้อยแล้ว อย่าลืมเปลี่ยนพารามิเตอร์ boot ในไฟล์ winxp.cfg เป็น boot = 'c' ด้วย

ผลการทดลอง

  • หลังจากใช้ qemu มานาน เลยมีความรู้สึกว่าเร็วจี๋ทีเดียว โดยเฉพาะเรื่องเน็ตเวิร์ก เร็วมาก ๆ
  • แป้นพิมพ์ตัวเลข ยังมีอาการพิมพ์ไม่ติดเป็นบางครั้ง
  • ตำแหน่งเมาส์ไม่ตรงกัน ระหว่าง Dom0 กับ DomU แก้โดยต้องลองปรับตำแหน่งเมาส์ด้วยการเคลื่อนเมาส์ให้พ้นกรอบของหน้าต่าง Viewer แล้วย้ายมาเริ่มใหม่ในด้านตรงข้าม (ต้องลองไปลองมา แล้วจะเริ่มขยับตรงเอง)
  • ความเร่งของเมาส์ไม่เท่ากัน ระหว่าง Dom0 กับ DomU แก้โดยปรับที่ Windows XP ให้ปิดการทำงานของการเร่งเมาส์
    Control Panel -> Mouse -> TAB-Pointer options -> ปิด Enhance pointer position
  • ยังมีปัญหา(ติดตั้งยังไม่เป็น)เรื่องเน็ตเวิร์กคือ ping จาก DomU ไป Dom0 ได้ แต่ในทางกลับกัน ping ไม่ได้ ยังไม่ทราบว่าต้องตั้งที่ไหน
    จะติดตั้งแบบ NAT เหมือน qemu ก็กลัวเสียความเร็ว เดี๋ยวมีโอกาสค่อยลองอีกทีนึง (แก้ที่ไฟล์ winxp.cfg ตำแหน่ง vif และไฟล์ /etc/xen/scripts/qemu-ifup)

สรุป
ถึงแม้จะยังไม่สมบูรณ์แบบ แต่ก็น่าใช้มาก โดยเฉพาะถ้าต้องการความเร็วในการใช้งาน การติดตั้งก็ไม่ยากเหมือนแต่ก่อน
เสียดายที่ต้องใช้กับซีพียูที่มีโหมด Vitualize เท่านั้น (Intel-VT, AMD-Pacifica) และโอเอสก็ต้องเป็น 32bit ขึ้นไปแบบ Windows XP
ถ้าใช้กับ Win98 ได้นี่จะประหยัดไลเซ่นซ์วินโดวส์เก่า ๆ ได้เยอะเลย

อ้างอิง

debian: ทำ Mirror ด้วย rsync แบบง่าย

เอามาจาก ThaiLinuxCafe: ทำ mirror ด้วย rsync อย่างง่าย

ต้องการ syncronize ไดเรคทอรี่ /var/www ของเครื่อง server1.example.com
มายังไดเรคทอรี่ /var/www ของเครื่อง mirror.example.com
ซึ่งมีข้อดีกว่าการคัดลอกธรรมดาด้วย cp หรือ scp ตรงที่
ถ้าเราลบไฟล์ใน server1 ไฟล์ใน mirror จะถูกลบตามไปด้วย
ทำให้ทั้งสองเครื่องมีความสดใหม่เหมือนกัน

ทำที่ทั้งสองเครื่อง server1.example.com และ mirror.example.com
ติดตั้งและปรับแต่ง rsync
# aptitude install rsync
# vi /etc/default/rsync
RSYNC_ENABLE=true

# dpkg-reconfigure rsync

ทำที่เครื่อง server1.example.com
เพิ่มผู้ใช้ชื่อ someuser
server1:# useradd -m -s /bin/bash someuser
( -m คือให้คัดลอกรูปแบบจากไดเรคทอรี่ /etc/skel/
-s คือให้ใช้เชลล์คือ /bin/bash )
ทำที่เครื่อง mirror.example.com
ทำการคัดลอก
mirror:# rsync -avz -e ssh someuser@server1.example.com:/var/www/ /var/www/
<<<--- ใส่ค่า password ของ someuser

rsync จะทำการคัดลอกไฟล์ทั้งหมดใน /var/www ที่ someuser มีสิทธิในการอ่านทั้งหมด
มาที่ /var/www ของเครื่อง mirror

หมายเหตุ
ตรวจสอบเนื้อที่การใช้ไฟล์ด้วยคำสั่ง
# cd /var/www
# du -c | grep total

ทำให้ rsync ไม่ต้องถามรหัสผ่าน

ต่อไปเป็นการทำให้ rsync ไม่ต้องถามรหัสผ่าน โดยการใช้ public key

ทำที่ mirror.example.com
สร้าง public key เพื่อให้ไม่ต้องใส่รหัสผ่าน
mirror:# ssh-keygen -t dsa -b 1024
Enter file in which to save the key (/root/.ssh/id_dsa): <<<--- [Enter]
Enter passphrase (empty for no passphrase): <<<---[Enter]
Enter same passphrase again: <<<---[Enter]

คัดลอก key ไปยัง server1
mirror:# scp ~/.ssh/id_dsa.pub someuser@server1.example.com:/home/someuser/
Password: <<<--- ใส่ค่ารหัสผ่านของ someuser ( บน server1 )

ssh ไปยัง server1
mirror:# ssh server1.example.com -l someuser
Are you sure you want to continue connecting (yes/no)? <<<--- yes
Password: <<<--- ใส่ค่ารหัสผ่านของ someuser

ทำให้ key ที่สร้างไว้ ถูกใช้จาก rsync
someuser@server1:~$ mkdir ~/.ssh
someuser@server1:~$ chmod 700 ~/.ssh
someuser@server1:~$ mv id_dsa.pub ~/.ssh
someuser@server1:~$ cd ~/.ssh
someuser@server1:~/.ssh$ touch authorized_keys
someuser@server1:~/.ssh$ chmod 600 authorized_keys
someuser@server1:~/.ssh$ cat id_dsa.pub >> authorized_keys
someuser@server1:~/.ssh$ exit

ลบ known_hosts เก่าทิ้งก่อน
mirror:# rm .ssh/known_hosts

ทดสอบครั้งแรก
mirror:# rsync -avz --delete -e "ssh -i /root/.ssh/id_dsa" \
someuser@server1.example.com:/var/www/ /var/www/
Are you sure you want to continue connecting (yes/no)? <<<--- yes

เรียบร้อย ครั้งต่อไปเขาจะไม่ถามอีกแล้ว
เวลาจะใช้งาน ก็ใช้คำสั่งเดิม
mirror:# rsync -avz --delete -e "ssh -i /root/.ssh/id_dsa" \
someuser@server1.example.com:/var/www/ /var/www/

หรือ ถ้าใช้ชื่อเหมือนกัน ในที่นี้ someuser เป็น root เหมือนกันทั้งสองฝั่ง ย่อได้เป็น
mirror:# rsync -avz --delete --rsh=ssh root@server1.example.com:/var/www/ /var/www/

จบแล้วครับ

rsync อัตโนมัติผ่าน cron

ต่อไปเป็นการให้ทำงานอัตโนมัติผ่าน cron

ทำที่เครื่อง mirror.example.com
แก้ไข crontab
# crontab -e
...
0 0 * * * /usr/bin/rsync -azq --delete -e "ssh -i /root/.ssh/id_dsa" someuser@server1.example.com:/var/www/ /var/www/
...

( พิมพ์ต่อกันเป็นบรรทัดเดียวกันนะครับ - ให้ทำการ sync ตอนเที่ยงคืน ทุกวัน )

จบแล้วครับ

debian: บันทึก VirtualBox

หลังจากทดลอง Xen แล้ว พบว่ายังมีปัญหาเกี่ยวกับคีย์บอร์ดที่ค่อนข้างเอาแน่เอานอนไม่ได้ และปัญหาความไม่คุ้นเคยในการใช้เมาส์ผ่าน VNC
จึงได้มาทดลองใช้ VirtualBox
ซีพียูอินเทล E6300 หน่วยความจำ 1G
พบว่า

  • ถ้าใช้กับวินโดวส์ 9x ติดตั้งยาก มีปัญหากับ VGA และถ้าสามารถติดตั้งผ่านแล้ว ความเร็วสู้ qemu -no-kqemu ไม่ได้
  • ถ้าใช้กับวินโดวส์ Xp ความเร็วดีมาก สงสัยว่าจะเร็วกว่า Xen เสียอีก และเสถียรดีมาก ดีกว่า qemu สรุปว่าถ้าเป็น Windows Xp น่าใช้ VirtualBox มาก ๆ

จึงบันทึกการปรับตั้งค่าไว้ดังนี้

มีปัญหาว่าบางครั้ง แม้จะแก้ไขให้เราอยู่ในกลุ่ม vboxusers แล้วก็ตาม แต่บางครั้งก็ยังไม่สามารถรันได้ จึงแก้ไขให้ /dev/vboxdrv เป็นโหมด 666 ผ่าน udev
$ sudo vi /etc/udev/rules.d/60-vboxdrv.rules
แก้จาก KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0660"
แก้เป็น

KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="vboxusers", MODE="0666"

แก้ไขค่าเน็ตเวิร์ก tun ให้เป็น 666 เหมือนกัน
$ sudo vi /etc/udev/rules.d/020_permissions.rules
แก้เป็น

...
KERNEL=="tun",          MODE="0666"
...

สร้างสคริปต์สำหรับเน็ตเวิร์กแบบกำหนดเอง
$ vi ~/ifup-tap0

sudo iptables -t nat -D POSTROUTING -j MASQUERADE -o