ห้องนี้เป็นห้องทดลอง เมื่อทดลองเสร็จแล้ว ถึงจะนำเสนออีกทีนึงครับ
ต้องการเชื่อม 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 เป็นตัวบูต
จะให้จ่ายไอพีตั้งแต่ 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
เอาจาก 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
ดู 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 ของเครื่องเซิร์ฟเวอร์
เอาบราวเซอร์ไปที่ 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
จะเอาไปทำแผ่นบูต
ทำที่เครื่องเซิร์ฟเวอร์
ถ้าในระบบเรามีการ์ดแลนเพียงชนิดเดียว เราก็แค่สร้างไฟล์ 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
ได้เปลื้องหนี้คุณสมเจตน์แล้ว ค่อยสบายหน่อย
เดี๋ยวถ้ามีเวลา จะกลับมาศึกษาต่ออีกที
update 50-07-07
# aptitude install vim-full less screen# usermod -s /bin/bash user1# vi /etc/profile
... EDITOR="/usr/bin/vi" export EDITOR ...
ปรับปรุง: จาก debianclub.com: system-wide default editor
# update-alternatives --config editor
<<<--- เลือกหมายเลขหน้า vim
# aptitude install vim-full# vi /etc/vim/vimrc.local
... syntax on
%sudo ALL=NOPASSWD: ALL
ถ้าเราชื่อ user1 ใช้คำสั่ง usermod แก้ให้เราอยู่ในกลุ่ม sudo ด้วย
# usermod -g sudo user1
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
Customize Sid Desktop
สมมุติว่าติดตั้งเดเบียนจาก debootstrap พร้อมทั้งทำ apt-proxy ไว้เรียบร้อยแล้ว
# 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# 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# useradd -m -g mygroup -G lp,dialout,cdrom,floppy,audio,video,plugdev,lpadmin -s /bin/bash user1
# passwd user1ของ samba คือ
# smbpasswd -a -s user1
# 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
# vi /etc/wgetrc
... http_proxy = http://server1.example.com:8080/ ftp_proxy = http://server1.example.com:8080/ ...
# aptitude install gdebi# 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# aptitude install pidginเมื่อเรียบร้อยแล้วก็ให้เริ่ม gdm ใหม่ได้เลย
# /etc/init.d/gdm restart
ผู้ใช้ที่ได้ล๊อกอินเข้าไป คงเหลือเพียงเพิ่มสถานะของภาษาลงบนพาเนล
คลิกขวาบนพาเนล -> Add to Panel -> Keyboard Indicator -> Add
แล้วก็จะสามารถทำงานได้ทันทีครับ
ฝากเสริมด้านเดสก์ทอปให้ด้วยนะครับ
หลังจากผ่านการติดตั้งแบบ Net Install หรือแบบ debootstrap มาแล้ว
ต้องติดตั้ง Xwindows ก่อน
# aptitude install x-window-system-core
ตามด้วย gnome แบบต่าง ๆ ดังนี้
# aptitude install gnome# aptitude install gnome-core gdm# aptitude install gnome-fifth-toe# aptitude install gnome-desktop-environmentเลือกใช้แบบน้อยที่สุด และส่วนเสริมที่ใช้
# 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
สมมุติว่าถูกติดตั้งจาก debootstrap หรือแผ่น Net Install
หลังจากทำ Customize บน Terminal เรียบร้อยแล้ว ทำต่อส่วนของ Desktop ด้วย
$ sudo aptitude install xorg gnome$ sudo aptitude install less gdebi$ sudo useradd -g dialout,cdrom,floppy,audio,video,plugdev user1 ...$ sudo aptitude install libthai0 pango-libthai scim-thaiDesktop -> Preference -> Keyboard
- TAB Layouts -> Add -> Thailand
- TAB Layout Options -> Group Shift/Lock behavior -> Alt+Shift changes group.-> Add to panel -> Keyboard IndicatorDesktop -> Preference -> Screensaver -> ปิด Lock screen when screensaver is active$ sudo aptitude install iceweasel$ 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$ sudo vi /etc/dosemu/dosemu.conf... $_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 ปรับเปลี่ยนตามต้องการ
$ sudo aptitude install qemu uml-utilities module-assistant$ 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
$ 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$ sudo aptitude install pidgin$ sudo aptitude install xchmช่วงนี้ 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 ทีหลังก็ได้ครับ
ขอเขียนลงห้องทดลองด้วยคนนะครับ :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 ไม่ได้
บันทึกการติดตั้งแพกเกจต่าง ๆ
เดี๋ยวนี้ 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-img create -f qcow winxp.qcow 5G$ qemu-img create -b winxp.qcow -f qcow winxp.ovl$qemu-img commit winxp.ovlสรุปว่าสำหรับ qemu ตั้งแต่รุ่น 0.8.2 เป็นต้นไป ต้องทดลองดูหลาย ๆ แบบ ดูว่าแบบไหนดีที่สุด ไม่จำเป็นต้องเป็นตามคู่มือเสมอไป
หมายเหตุ
อ้างอิง
ทดลองใช้ 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
รุ่นนี้เป็นรุ่นปรับแก้บั๊กเรื่อง 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
หากคร้านที่จะคอมไพล์เอง ดาวน์โหลดได้ที่นี่ครับ ฝากทดสอบบั๊กให้ด้วย
เมื่อได้ลองใช้งาน 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 ทั้งคู่
มีงานที่ต้องแปลงไฟล์ภาพ 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
$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=filename.pdf -- filename.prnเพิ่มเติม -sDEVICE
png = png16m
แต่คุณภาพไม่ค่อยดี สู้เป็น pdfwrite ไม่ได้ (เอามาแก้ใน gimp ได้)
ดูรายละเอียดของ DEVICE ได้จากคำสั่ง gs --help
เพิ่มเติมสำหรับวินโดวส์
หากต้องการทำต้นฉบับหนังสือเพื่อส่งโรงพิมพ์ ให้เลือกเครื่องพิมพ์เป็นพวก Image Setter เช่น Scitex เป็นต้น
จะไม่มีปัญหาเรื่องพิมพ์ตกขอบทำให้ขอบขาด
$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=combined.pdf file1.pdf
file2.pdf
เอามาจาก Blog of Amorn Jiraseree-amornkun : วิธีรวมไฟล์ pdf หลายไฟล์เข้าด้วยกันในลินุกซ์
บันทึกการทำงานกับเทอร์มินัล
เทอร์มินัลของ 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
เอามาจาก 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
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
สร้างไฟล์ที่จะดักการทำงานตอนรับแฟกซ์ ชื่อ /etc/hylafax/FaxDispatch
แล้วเริ่มการทำงานใหม่ เพื่อให้ไฟล์ใหม่นี้ถูกคัดลอกไปไว้ในไดเรคทอรี่ของ hylafax
# vi /etc/hylafax/FaxDispatch
/usr/bin/tiff2ps -a $FILE | lpr -P $PRINTER_NAME
# /etc/init.d/hylafax restart
เอามาจาก 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
# vi /etc/hylafax/config.ttyS0
... RecvFileMode: 0666 ...
ปรับปรุง 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 ให้ส่งแฟกซ์เอง
เพิ่มเติม
# vi /etc/hylafax/config.ttyS0
... RecvFileMode: 0666 ...
# /etc/init.d/hylafax restart
debootstrap เป็นแพกเกจที่ใช้ในการติดตั้งเดเบียนผ่านเครือข่าย
สามารถนำมาใช้ประโยชน์ได้เช่น การติดตั้งลินุกซ์ซ้อนเข้าในระบบเพื่อการทดลอง หรือการติดตั้งระบบเพิ่มเติมสำหรับงาน Virtualization
การใช้งาน ควรมี mirror ซึ่งอาจเป็น apt-proxy apt-cacher หรือ mirror แท้ ๆ อยู่ในเครือข่ายเราก่อน
รูปแบบใช้งานคือ
debootstrap [OPTION...] SUITE TARGET [MIRROR [SCRIPT]]
SUITE คือรุ่นของลินุกซ์ที่เราจะติดตั้ง สำหรับเดเบียนได้แก่ sarge หรือ etch เป็นต้น
TARGET คือพาร์ติชั่นที่เราเมานต์ไว้แล้วสำหรับการติดตั้ง
MIRROR คือคลังแพกเกจ เช่น apt-proxy หรือ mirror อื่น
รายละเอียดสามารถศึกษาได้เพิ่มเติมจาก man 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 ใหม่แบบสะอาด ๆ
เมื่อจะทำการทดลองระบบใหม่ ถ้าจำเป็นต้องลงใหม่ก็ทำเหมือนเดิมครับ
สมมุติว่า 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บนเดเบียน สามารถเปิดใช้งานมอดูลด้วยคำสั่ง a2enmod MODULENAME และปิดการใช้งานด้วยคำสั่ง a2dismod MODULENAME
# 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
# 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
!!!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
จะเอามาลองทดสอบ 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
... ติดตั้งตามปกติ ...
หมายเหตุ
$ xtightvncviewer localhost ใหม่boot = 'c' ด้วยผลการทดลอง
Control Panel -> Mouse -> TAB-Pointer options -> ปิด Enhance pointer positionสรุป
ถึงแม้จะยังไม่สมบูรณ์แบบ แต่ก็น่าใช้มาก โดยเฉพาะถ้าต้องการความเร็วในการใช้งาน การติดตั้งก็ไม่ยากเหมือนแต่ก่อน
เสียดายที่ต้องใช้กับซีพียูที่มีโหมด Vitualize เท่านั้น (Intel-VT, AMD-Pacifica) และโอเอสก็ต้องเป็น 32bit ขึ้นไปแบบ Windows XP
ถ้าใช้กับ Win98 ได้นี่จะประหยัดไลเซ่นซ์วินโดวส์เก่า ๆ ได้เยอะเลย
อ้างอิง
เอามาจาก ThaiLinuxCafe: ทำ mirror ด้วย rsync อย่างง่าย
ต้องการ syncronize ไดเรคทอรี่ /var/www ของเครื่อง server1.example.com
มายังไดเรคทอรี่ /var/www ของเครื่อง mirror.example.com
ซึ่งมีข้อดีกว่าการคัดลอกธรรมดาด้วย cp หรือ scp ตรงที่
ถ้าเราลบไฟล์ใน server1 ไฟล์ใน mirror จะถูกลบตามไปด้วย
ทำให้ทั้งสองเครื่องมีความสดใหม่เหมือนกัน
# aptitude install rsync
# vi /etc/default/rsync
RSYNC_ENABLE=true
# dpkg-reconfigure rsync
server1:# useradd -m -s /bin/bash someusermirror:# rsync -avz -e ssh someuser@server1.example.com:/var/www/ /var/www/
<<<--- ใส่ค่า password ของ someuserrsync จะทำการคัดลอกไฟล์ทั้งหมดใน /var/www ที่ someuser มีสิทธิในการอ่านทั้งหมด
มาที่ /var/www ของเครื่อง mirror
หมายเหตุ
ตรวจสอบเนื้อที่การใช้ไฟล์ด้วยคำสั่ง
# cd /var/www
# du -c | grep total
ต่อไปเป็นการทำให้ rsync ไม่ต้องถามรหัสผ่าน โดยการใช้ 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/
จบแล้วครับ
ต่อไปเป็นการให้ทำงานอัตโนมัติผ่าน cron
# 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 ตอนเที่ยงคืน ทุกวัน )
จบแล้วครับ
หลังจากทดลอง Xen แล้ว พบว่ายังมีปัญหาเกี่ยวกับคีย์บอร์ดที่ค่อนข้างเอาแน่เอานอนไม่ได้ และปัญหาความไม่คุ้นเคยในการใช้เมาส์ผ่าน VNC
จึงได้มาทดลองใช้ VirtualBox
ซีพียูอินเทล E6300 หน่วยความจำ 1G
พบว่า
จึงบันทึกการปรับตั้งค่าไว้ดังนี้
มีปัญหาว่าบางครั้ง แม้จะแก้ไขให้เราอยู่ในกลุ่ม 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