Fedora Core 1 on Acer TravelMate 361EVi

Recently, I have upgraded Linux on my Acer TravelMate 361Evi to Fedora Core 1. The main reason to upgrade is that FC1 is the basis to develop packages for LinuxTLE 5.5, the next major release of Thai Linux distro that I have contributed my works to.


FC1 comes with kernel 2.4.22-1.2115.nptl, which is – like RH’ve done before – a collection of many patches ahead of 2.4.22 backported to 2.4.22. So, their kernel is very unique and sometimes we are not comfortable with that when we recompile our custom kernel :(

First thing you should know that FC1 provides 3 versions of gcc: 3.3.2, 3,2,3 and 2.96. For kernel and kernel modules, you should use gcc 3.2.3. There are reasons for this (try google, or RHN if you want to know about). So. every time you compile kernel or kernel modules, be sure that you export CC=gcc32.

The first kernel issue of FC1 is that the yenta_socket problem is back! I don’t know the reason why it happens again, but this can easily be fixed like before, just disable PCMCIA/Cardbus support in kernel and use the pcmcia-cs package instead. — done! (One thing I’ve noticed is that those yenta_socket problem always comes when I use RH kernel, but not if I use vanilla).

Okay, yenta_socket could be workaround. The next thing is that FC1 will not start ACPI by default, So I have to put “ACPI=on” as a boot parameter. Well, 361EVi does need ACPI. Otherwise, it would not shutdown when asking OS to do so (and I need to push the power button). So, put ACPI=on in /etc/grub.conf. Oh, by the way, if you use lilo, I’d suggest you to upgrade to grub, lilo will be deprecated soon.

So far, that’s all the MUST do things in kernel. The rest are optional but I’d recommend you to look around.


There are things you should do in your kernel to make display works properly. First, VESA Framebuffer won’t work anymore, but they introduced the new Intel Framebuffer (CONFIG_FB_INTEL), which should work better. So I used intelfb, and ignore the vesafb. I can still put VGA=xxx as a boot parameter, though.

For better graphic performance, AGPGART should be enabled (either CONFIG_AGP_INTEL or CONFIG_AGP_I810). DRM should be set to i830 (CONFIG_DRM_I830). I got nearly 600 fps of glxgears with 16-bit depth.

For XFree86, the device section should be something like this:

Section "Device"
        Identifier  "Videocard0"
        Driver      "i810"
        VendorName  "Videocard vendor"
        BoardName   "Intel 830"


You can use sound support from the kernel (CONFIG_SOUND_ICH) if you want to. if you want to use ALSA as I do, here is the way. First, kernel should enable sound support (CONFIG_SOUND) but *DO NOT* select any drivers. Then, grab alsa-driver source, extract, and

./configure --with-cards=intel8x0,virmidi
make install

You may also want to change /etc/modules.conf to be:

alias snd-card-0 snd-intel8x0
alias snd-card-1 snd-virmidi
alias sound-slot-0 snd-card-0
alias sound-slot-1 snd-card-1
alias char-major-116 snd
alias char-major-14 soundcore
options snd major=116 cards_limit=2
options snd-intel8x0 index=0
options snd-virmidi index=1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias sound-service-1-1 snd-seq-oss
alias sound-service-1-8 snd-seq-oss


Okay, for FC1, pcmcia-cs driver is needed as I described above.

My /etc/sysconfig/pcmcia is:


If you use vanilla kernel instead, you can just ignore pcmcia-cs package, then use kernel PCMCIA driver, and /etc/sysconfig/pcmcia should be changed to:


As usual, enabling PCMCIA makes the Orinoco Wireless LAN works immediately because it is hard-wired on 361EVi board.

10/100 Ethernet

This should work by default, but if it does not, or you want to

customize your kernel, be sure to choose either CONFIG_E100 or CONFIG_EEPRO100 (I use EEPRO100 compile in kernel). If you choose to compile as a module, put this into your /etc/modules.conf

alias eth0 eepro100


alias eth0 e100

Ports/Combo Drive

All should work.

Power Management

Well, I’d suggest you to use ACPI instead of APM. ACPI seems to be better than APM for 361EVi. FC1’s kernel also supports CPU Frequency Scaling (a.k.a SpeedStep, PowerNow!, those kind of things to switch CPU frequency on-the-fly). I enabled CPU Frequency Scaling to save battery when power is offline. These are things I set in your kernel:

# CPU Frequency scaling

# CPUFreq governors

# CPUFreq processor drivers

Rebuild the kernel, and after reboot the new kernel, I got these in /proc/cpufreq:

         minimum CPU frequency  -  maximum CPU frequency  -  policy
CPU  0       731500 kHz ( 73 %)  -     997500 kHz (100 %)  -  performance

I can set frequency and power policy to save mode by:

echo -n "0:731500:997500:powersave" > /proc/cpufreq

And bring them back to full-speed by:

echo -n "0:731500:997500:performance" > /proc/cpufreq

Use cpufreqd if you want it changes frequency and/or policy automatically.

Fedora Core 1 and NPTL

Fedora Core introduces a new thread library called NPTL (Native POSIX Thread Library). Linux will use this sooner or later. NPTL increases speed of your programs by implementing thread operations natively. This would increase speed of operations like start/stop threads, etc. People have tested the performance of NPTL and it can be 4xx faster than non-NPTL. But, a bad news is that it is not backward compatible to Linux thread, so your programs may crash (segfault, etc..)… Fedora people know this and already put a workaround. By setting LD_ASSUME_KERNEL environment, you can force to disable NPTL support. So, try:

$ LD_ASSUME_KERNEL=2.4.19 /path/to/your/program

if your program fails to operate on FC1.

Well, that should be all for now. Have fun !

ปรับความถี่ซีพียูบนลินุกซ์ด้วย CPU Frequency Scaling

ลินุกซ์สนับสนุนการปรับความถี่การทำงานของซีพียูโดยใช้ CPU Frequency scaling support ซึ่งเหมาะกับคอมพิวเตอร์ใช้ซีพียูที่สนับสนุนการปรับความถี่ เช่น ซีพียูที่สนับสนุน Intel SpeedStep (P-III Tuaalatin), Intel Enhanced SpeedStep (Centrino), AMD PowerNow!, Transmeta LongRun (Crusoe) เป็นต้น การปรับความถี่จะทำได้ทันที โดยไม่ต้อง reboot เครื่อง จึงเหมาะกับคอมพิวเตอร์โน๊ตบุ๊คที่ต้องการประหยัดพลังงานเมื่อใช้แบตเตอรี่

คอนฟิกฯ ส่วนของเคอร์เนล

การใช้ CPU Frequency scaling ต้อง patch kernel source เพื่อให้เคอร์เนลสนับสนุนเสียก่อน แนะนำให้ใช้ stable kernel ตัวล่าสุด + ac patch ตัวล่าสุดสำหรับเคอร์เนลดังกล่าว

ส่วนที่ต้องคอนฟิกฯ ในเคอร์เนลมีดังนี้:

# CPU Frequency scaling

# CPUFreq governors

และเลือก Driver ตัวที่ตรงกับซีพียู/ฮาร์ดแวร์ที่ใช้งานอยู่:

# CPUFreq processor drivers
CONFIG_X86_POWERNOW_K6=y สำหรับ mobile AMD K6-2+,  K6-3+
CONFIG_X86_POWERNOW_K7=y สำหรับ mobile AMD Athlon/Duron K7
CONFIG_ELAN_CPUFREQ=y สำหรับ AMD Elan SC400 / SC410
CONFIG_X86_LONGHAUL=y สำหรับ VIA Samuel/CyrixIII, Samuel/C3, Cyrix Ezra, Cyrix Ezra-T
CONFIG_X86_SPEEDSTEP_ICH=y สำหรับ mobile P-III (Coppermine), P-III-M (Tulaatin), P4-Ms
CONFIG_X86_SPEEDSTEP_CENTRINO สำหรับ Pentium M (Centrino)
CONFIG_X86_LONGRUN=y สำหรับ Transmeta Crusoe ที่สนับสนุน LongRun
CONFIG_X86_GX_SUSPMOD=y สำหรับ NatSemi Geode ที่สนับสนุน suspend modulation

จากนั้นคอมไพล์และติดตั้งเคอร์เนลใหม่ หลังจาก reboot แล้ว ข้อมูลของ frequency scaling จะปรากฏใน /proc/cpufreq

# cat /proc/cpufreq
          minimum CPU frequency  -  maximum CPU frequency  -  policy
CPU  0       731500 kHz ( 73 %)  -     997500 kHz (100 %)  -  performance


หลังจากเคอร์เนลสนับสนุน CPU frequency scaling แล้ว การปรับความถี่สามารถทำได้โดยส่ง string redirect ไปที่ /proc/cpufreq โดยใช้ฟอร์แมตดังนี้

<CPUID>:<min freq>:<max freq>:<policy>

CPUID เป็นหมายเลขอ้างอิงซีพียู สำหรับเครื่องส่วนใหญ่ที่เป็น uniprocessor จะเป็น 0 เพราะมีซีพียูเพียงตัวเดียว (0 คือ ID ของซีพียูตัวแรกของระบบ) ความถี่กำหนดในหน่วย kHz .. policy กำหนดได้สองอย่างคือ เป็น performace เพื่อเลือกการทำงานเต็มประสิทธิภาพ หรือ powersave เพื่อเลือกการทำงานในโหมดประหยัดพลังงาน ตัวอย่างเช่น

echo -n "0:731500:997500:powersave" > /proc/cpufreq

เป็นการกำหนดให้ซีพียูตัวแรก ทำงานที่ความถี่ช่วง 731500 kHz (~ 733 MHz) ถึง 999750 (~ 1 GHz) ในโหมดประหยัดพลังงาน

ถ้าต้องการกำหนดความถี่เป็นเปอร์เซ็น สามารถทำได้โดยใช้ฟอร์แมตนี้:

<CPUID>:<min freq>%<max freq>%<policy>

เราสามารถดูความถี่ปัจจุบันของซีพียูได้จาก /proc/cpuinfo

# cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 11
model name      : Intel(R) Pentium(R) III Mobile CPU      1000MHz
stepping        : 1
cpu MHz         : 733.272
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips        : 1464.72

ปรับความถี่อัตโนมัติโดยใช้ cpufreqd

CPU Frequency scaling ในเคอร์เนลไม่ได้ควบคุม/ปรับความถี่หรือ power policy อัตโนมัติ การเพิ่ม CPU Frequency scaling support ในเคอร์เนลเป็นการ enable ให้เราปรับความถี่ได้เท่านั้น แต่จะปรับความถี่ เมื่อไหร่ อย่างไร ขึ้นอยู่กับผู้ใช้ ซึ่งอาจจะปรับความถี่เองด้วยวิธีการข้างต้น หรือ ใช้ CPU Frequency daemon เช่น cpufreqd, cpudyn เพื่อปรับความถี่ซีพียูตามเงื่อนไขโดยอัตโนมัติ

cpufreqd เป็น daemon ที่ตรวจเช็คสถานะต่่างๆ ของระบบ เช่น AC status, battery level, CPU workload, running application และปรับความถี่ power policy ให้อัตโนมัติตามเงื่อนไขที่กำหนดไว้ใน configuration file (/etc/cpufreqd.conf) การทำงานของ cpufreqd จึงจำเป็นต้องอาศัย Power Management support ในเคอร์เนล (เช่น APM, ACPI) เพื่อรายงานสถานะของระบบด้วย

ซอร์ส ของ cpufreqd สามารถดาวน์โหลดได้จาก http://cpufreqd.sourceforge.net extract, configure, make, make install เพื่อติดตั้ง

RPM สำหรับ LinuxTLE 5.5/Fedora Core 1 จะ release ในแผ่นติดตั้งของ LinuxTLE 5.5 หรือสามารถดาวน์โหลดได้จาก ftp://ftp.kitty.in.th/pub/TLE/5.5/kitty-tle

Sync ปาล์ม / คลีเอ้ผ่านพอร์ตอินฟราเรด (IrDA) บนลินุกซ์

ขั้นตอน config

เริ่มแรกก็ตรวจสอบก่อนว่าเคอร์เนลมองเห็นพอร์ตอินฟราเรดแล้วหรือยัง โดยดูได้จากรายชื่อของพอร์ตสื่อสารที่ปรากฏใน dmesg:

[[email protected] kitt]$ dmesg | grep ttyS
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A

หนึ่งในนั้นควรจะเป็นพอร์ตอินฟราเรด เช่น เครื่องที่ผมใช้ ttyS01 (หรือ COM2) คือพอร์ตที่เป็นอินฟราเรด เวลาใช้งานพอร์ตนี้ก็จะติดต่อผ่านดีไวซ์ /dev/ttyS1 เมื่อรู้ว่าใช้ดีไวซ์ตัวไหนแล้วก็ไปตั้งใน/etc/sysconfig/irda อย่างนี้

[[email protected] kitt]$ cat /etc/sysconfig/irda

มาถึงตรงนี้ก็เป็นอันเสร็จขั้นตอนการ config พอร์ตอินฟราเรดสำหรับลินุกซ์ หากรีบูตระบบหรือสั่ง service irda start ลินุกซ์ก็พร้อมที่จะติดต่อกับพอร์ตอินฟราเรดแล้ว :)

แต่ต้องทำความเข้าใจอีกนิดว่าพอร์ตอินฟราเรดนั้นสามารถทำงานได้หลายรูปแบบขึ้นกับว่าใช้โปรโตคอลในการสื่อสารแบบไหน .. กรณีปาล์ม/คลีเอ้จะเชื่อมต่อด้วยโปรโตคอลแบบเดียวกับพอร์ตสื่อสาร (ircomm-tty) ซึ่งจะทำงานผ่านดีไวซ์ /dev/ircomm0 ครับ .. หาก sync ปาล์ม/คลิเอ้ผ่านอินฟราเรดเป็นประจำก็ควรทำ symlink จาก /dev/pilot ไปที่ /dev/ircomm0 ไว้เลยครับ เพราะโปรแกรมส่วนใหญ่จะใช้ /dev/pilot เป็นดีไวซ์ในการสื่อสารโดยปริยาย

(as root)
[[email protected] kitt]# ln -sf /dev/ircomm0 /dev/pilot

ทีนี้เราก็พร้อมจะเริ่ม sync กันแล้ว :D

วิธี synchronize ข้อมูล

โปรแกรมพื้นฐานที่สุดในการนี้ก็คือ pilot-xfer (หากไม่มี ให้ติดตั้งแพคเกจ pilot-link) การ backup/sync/restore/install ใช้คำสั่งนี้เพียงคำสั่งเดียวเลย

  • pilot-xfer -b สำหรับ backup (ทุก file)
  • pilot-xfer -s สำหรับ sync (backup เฉพาะ update ที่มีการ update)
  • pilot-xfer -r สำหรับ restore
  • pilot-xfer -i foo.prc สำหรับติดตั้ง foo.prc ลงในเครื่องปาล์ม/คลีเอ้

หากสั่งงานเหมือนข้างบนนี้ pilot-xfer จะใช้ดีไวซ์ /dev/pilot ในการเชื่อมกับปาล์ม/คลีเอ้ และเก็บข้อมูลลง $HOME/.pilot ซึ่งเป็น default directory ที่ใช้เก็บข้อมูล .. รายละเอียดอื่นๆ (อีกเยอะ) ดูได้ด้่วยการสั่ง man pilot-xfer ครับ มันมีโปรแกรมสำหรับ อ่าน/เขียน todo, memo, datebook, etc. ด้วย


Diagram การเชื่อมต่อจะประมาณนี้ครับ:

pilot-link -> /dev/pilot -> /dev/ircomm0 -> [ircomm-tty -> ircomm -> irda] ->
/dev/irda0 -> Hardware IrDA device -> palm

ข้างใน [ … ] คือส่วนของเคอร์เนลครับ ถ้า compile irda เป็น kernel module แล้ว lsmod ดูจะเห็นว่ามี

ircomm-tty             38528   0  (autoclean)
ircomm                 18252   0  [ircomm-tty]
irtty                  10048   2  (autoclean)
irda                  191872   0  (autoclean) [ircomm-tty ircomm irtty]

กรณีที่ compile kernel เองและต้องการใช้พอร์ดอินฟราเรดตรวจดูตามนี้ครับ


ส่วน Dongle / FIR ก็ config ตามฮาร์ดแวร์ที่มีอยู่ครับ

บางระบบจะไม่ probe ircomm-tty อัตโนมัติ ถ้าเจอกรณีนี้ก็ต้อง modprobe/insmod เองครับ โดย

(as root)
[[email protected] kitt]# modprobe ircomm-tty

จากนั้นค่อยเริ่ม pilot-xfer

มี palm หลายๆ รุ่น (หรืออาจจะทุกรุ่น ?) ที่จำเป็นต้องตั้ง flow control ของ IR เป็น off ด้วย ไม่งั้น

มันไม่ sync ครับ วิธีตั้งก็

HotSync -> Options -> Connection Setup -> IR to a PC/Handheld ->
Edit ... -> Details ... -> Flow Ctl: -> Off

ถ้าติดปัญหาเรื่อง permission เช็คที่ /etc/security/console.perm ควรจะมีสองบรรทัดนี้

<pilot>=/dev/pilot /dev/usb/ttyUSB* /dev/ircomm*
<console> 0600 <pilot>      0660 root.uucp

ถ้าไม่มี หรือมีแต่ไม่เหมือน ก็แก้ไขให้ได้ตามนี้ครับ จากนั้นก็ logout แล้ว login เข้ามาใหม่

Clie networking with Linux – พาน้องเอ้ท่องอินเทอร์เน็ต

วันนี้เกิดคึกอะไรขึ้นมาก็ไม่ทราบได้ อยากลองต่อ Clie เชื่อมอินเทอร์เน็ตผ่าน USB ดูว่าจะทำได้มั้ย วิธีการที่คิดไว้ก็คือใช้ PPP ผ่าน USB Serial ครับ … ก่อนอื่นก็ต้องเซ็ตค่าน้องเอ้ก่อน

Pref ==> Network:
Service: My Network
User Name: ไม่ต้องใส่
Password: ไม่ต้องใส่
Connection: Cradle/Cable

Connection type: PPP
Idle timeout: Never
Query DNS: Checked
IP Address: Checked Automatic

บรรทัดแรก เลือก End:

ส่วนของลินุกซ์ ..

ความต้องการพื้นฐานทางฝั่งลินุกซ์นี่แบ่งได้เป็นสองส่วนครับ ส่วนแรกคือส่วนของ USB Serial ซึ่งจำลอง USB เป็นดีไวซ์แบบซีเรียลเหมือน /dev/ttyS0 ทำให้เราใช้ PPP บน USB connection ได้ .. ส่วนที่สองก็คือส่วนของ PPP protocol .. มาเริ่มที่ USB Serial ก่อน .. ตรวจสอบเคอร์เนลตามนี้ครับ


อันสุดท้ายไม่เกี่ยวกับงานนี้เท่าไหร่ แต่จะได้ใช้แน่ๆ ถ้าต้องการ sync ข้อมูลระหว่าง Clie กับลินุกซ์ก็เลยเอามารวมไว้ด้วย .. ส่วนของ PPP ก็มี:

Network device support

หลังจากเคอร์เนลสนับสนุน USB Serial และ PPP แล้วทีนี้ก็มาทดสอบกัน

กรณีของผม peorth ใช้ไอพีแอดเดรส อยู่ในเครือข่าย ผมแอบขโมยไอพี มาใช้กับ Clie เป็นการชั่วคราว .. ส่วน Yggdrasil ( เอาไว้ทดสอบการเชื่อมต่อ .. ก่อนอื่นต้อง enable IP Forwarding เสียก่อนด้วยการสั่ง

[[email protected] root]# echo "1" > /proc/sys/net/ipv4/ip_forward

เราจำเป็นต้องใช้ IP Forwarding เพราะว่าแพคเก็ตจะต้องส่งข้ามอินเทอร์เฟซ eth0 และ ppp0 .. จากนั้นที่ Clie เลือก Pref ==> Network ==> [Connect] ลองเช็ค /var/log/messages ก็จะเห็น

Jun 30 01:48:59 peorth /etc/hotplug/usb.agent: Setup visor for USB product 54c/9a/100
Jun 30 01:48:59 peorth kernel: usbserial.c: USB Serial support registered for Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter detected
Jun 30 01:48:59 peorth kernel: host/usb-uhci.c: interrupt, status 2, frame# 1833
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter now attached to ttyUSB0 (or usb/tts/0 for devfs)
Jun 30 01:48:59 peorth kernel: usbserial.c: Handspring Visor / Treo / Palm 4.0 / Cli้ 4.x converter now attached to ttyUSB1 (or usb/tts/1 for devfs)
Jun 30 01:48:59 peorth kernel: usbserial.c: USB Serial support registered for Sony Cli้ 3.5
Jun 30 01:48:59 peorth kernel: visor.c: USB HandSpring Visor, Palm m50x, Treo, Sony Cli้ driver v1.7

สุดท้ายก็รัน pppd:

[[email protected] root]# pppd /dev/usb/ttyUSB0 115200 ms-dns noauth nodetach proxyarp
หลังจากสั่งคำสั่งเรียบร้อยแล้ว pppd จะไม่หลุดมาที่พรอมพ์แต่จะแสดงข้อความบอกสถานะการเชื่อมต่อ:
Using interface ppp0
Connect: ppp0  /dev/usb/ttyUSB0
Cannot determine ethernet address for proxy ARP
local  IP address
remote IP address

ถ้าใครคอมไพล์ PPP เป็นเคอร์เนลโมดูลลอง lsmod ดูควรจะปรากฏรายชื่อโมดูลประมาณนี้:

ppp_deflate             4504   0 (autoclean)
zlib_deflate           21528   0 (autoclean) [ppp_deflate]
bsd_comp                5464   0 (autoclean)
ppp_async               9440   1 (autoclean)
ppp_generic            20156   3 (autoclean) [ppp_deflate bsd_comp ppp_async]
slhc                    6756   1 (autoclean) [ppp_generic]

ออพชั่นที่ใส่ให้ pppd ประกอบด้วยซีเรียลดีไวซ์ที่ต้องการใช้งาน (/dev/usb/ttyUSB0) อัตราการส่งข้อมูล 115200 บิตต่อวินาที กำหนดไอพีแอดเดรสของ ppp0 ฝั่งลินุกซ์เป็น (เอา private IP หมายเลขไหนก็ได้ที่ไม่มีใครใช้) pppd จะกำหนดไอพีของ Clie เป็น (ตามที่แอบขโมยมาใช้ :P) และกำหนดไอพีแอดเดรสของ DNS Server ที่ให้ Clie ใช้เป็น ออพชั่น noauth ทำให้เชื่อมต่อได้ทันทีโดยไม่ต้องมี Authentication (แปลว่าไม่ต้องใส่ login/password) .. nodetach ทำให้ pppd คงการควบคุมพอร์ตไว้ ถ้าไม่ใส่ pppd จะปล่อยการควบคุมให้กับระบบทันทีที่การเชื่อมต่อทำได้สำเร็จ และสุดท้าย proxyarp ทำให้เครื่องอื่นๆ มองเห็น Clie เป็นเครื่องหนึ่งในเครือข่ายเดียวกับ Peorth … จากตรงนี้ถ้าเช็ค ifconfig ก็จะมีอินเทอร์เฟซ ppp0 ปรากฏขึ้นมาไอพีแอดเดรสของ ppp0 คือ เชื่อม Point-to-Point ไปยังไอพีแอดเดรส ที่กำหนดให้กับ Clie:

ppp0      Link encap:Point-to-Point Protocol
          inet addr:  P-t-P:  Mask:
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:82 (82.0 b)  TX bytes:97 (97.0 b)

จะลอง ping ไปยัง Clie ดูก็ได้ครับ:

[[email protected] kitt]$ ping
PING ( from : 56(84) bytes of data.
64 bytes from icmp_seq=1 ttl=254 time=15.1 ms
64 bytes from icmp_seq=2 ttl=254 time=4.89 ms
64 bytes from icmp_seq=3 ttl=254 time=1.31 ms
64 bytes from icmp_seq=4 ttl=254 time=0.431 ms

ถ้าได้ขนาดนี้ Clie ก็ท่องอินเทอร์เน็ตได้ละ .. :D

มีข้อสังเกตเล็กน้อยที่ผลของคำสั่ง ping .. และ อยู่ในเครือข่ายเดียวกันคือ ซึ่งปกติแล้วเมื่อสั่ง ping ค่า TTL (Time-To-Live) ของแพคเก็ตจะเป็น 64 หรือ 255 .. แต่ในกรณีนี้ TTL=254 เพราะแพคเก็ตต้อง forward ข้าม eth0 ไปยัง ppp0 ที่เชื่อมกับ Clie (เสมือนกับมีเราท์เตอร์คั่นอยู่ 1 hop) ทำให้ TTL มีค่าลดลงไป 1 ค่า

ถ้าไม่มีไอพีสำหรับ Clie

ในกรณีที่ไม่มีไอพีแอดเดรสที่จะกำหนดให้กับ Clie ก็ต้องทำ IP Masquerading บน eth0 กันล่ะครับ เพื่อให้ Clie ใช้ private IP เชื่อมต่ออินเทอร์เน็ตได้ผ่านทาง Peorth .. เอาล่ะครับ เช็คเคอร์เนลกันก่อนเลย

Networking option:

IP: Netfilter Configuration:


[[email protected] root]# cat "1" > /proc/sys/net/ipv4/ip_forward
[[email protected] root]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

คำสั่งนี้เป็นการทำ IP Masquerading อย่างง่ายๆ ครับ ถ้าใครเลือกคอมไพล์ออพชันต่างๆ เป็นโมดูลก็ลอง lsmod ดูครับ

ipt_MASQUERADE          2168   1  (autoclean)
iptable_nat            21272   1  (autoclean) [ipt_MASQUERADE]
ip_conntrack           27336   1  (autoclean) [ipt_MASQUERADE iptable_nat]
ip_tables              14904   4  [ipt_MASQUERADE iptable_nat]

ทีนี้ก็กด Connect ใน Pref ==> Network ==> [Connect] ของ Clie แล้วก็

[[email protected] root]# pppd /dev/usb/ttyUSB0 115200  ms-dns noauth nodetach


Using interface ppp0
Connect: ppp0  /dev/usb/ttyUSB0
Cannot determine ethernet address for proxy ARP
local  IP address
remote IP address

จะเห็นว่าไอพีแอดเดรสของ Clie ตอนนี้ถูกกำหนดเป็น แทน แต่ Clie ก็ยังใช้งานอินเทอร์เน็ตได้เหมือนกับ public IP จะต่างกันก็ตรงที่เครื่องอื่นๆ ไม่สามารถ ping ไปยัง Clie ได้เพราะมัน masquerade อยู่นั่นเอง .. ข้อสังเกตอีกอย่างคือ กรณีที่ทำ IP Masquerading เครื่อง Clie จะอยู่ใน private network จึงไม่จำเป็นต้องใช้ proxy ARP

แต่ไม่ว่าจะยังไง คราวนี้ก็ผมก็ sync AvantGo ผ่าน Mobile Link หรือ AG Connect ได้ไม่ยากแล้ว หรือจะเช็คเมล์ ไอซีคิว ฯลฯ ก็ยังไหว .. โฮ่ๆๆ :D


สำหรับลินุกซ์ทะเล RedHat และดิสตริบิวชั่นที่มีพื้นฐานจาก RedHat สามารถกำหนดให้ทำ IP Forwarding ถาวรเลยก็ได้ครับ โดยเพิ่มบรรทัด


เข้าไปใน /etc/sysconfig/network แต่ผมไม่แนะนำให้ทำ เพราะเราคงไม่ได้ต่อ Clie ใช้อินเทอร์เน็ตบ่อยครั้งนัก จึงไม่จำเป็นต้องเปิด IP Forwarding ไว้ตลอดเวลา เขียนเชลล์สคริปต์ให้ทำงานเป็นครั้งๆ ไปจะดีกว่า .. ส่วนออพชั่นของเคอร์เนลถ้าเป็นไปได้ก็ควรเลือกคอมไพล์เป็นโมดูลด้วยเหตุผลเดียวกัน

คำสั่ง pppd จำเป็นต้องเรียกใช้ “หลัง” สั่ง Connect ที่ Clie เพราะดีไวซ์ /dev/usb/ttyUSB0 จะไม่ปรากฏในระบบจนว่า Clie จะเริ่มการเชื่อมต่อเข้ามาทาง USB .. หากเรียก pppd ก่อนสั่ง Connect จะมี error message ขึ้นมาประมาณว่า

Failed to open /dev/usb/ttyUSB0: No such device

ส่วนเวลาที่สั่ง disconnect ที่ Clie pppd มักจะค้างและมี error ขึ้น เป็นเพราะว่าดีไวซ์ /dev/usb/ttyUSB0 มันหายไปจากระบบแล้ว pppd จึงไม่สามารถสั่ง flush ดีไวซ์ได้ ให้กด Ctrl+C เพื่อออกจาก pppd

สุดท้าย .. หากอะไรๆ ไม่เป็นไปอย่างที่คาดหวัง หรือไม่เป็นไปตามที่ผมเขียนๆ ไว้ .. ลอง tail /var/log/message lsmod modprobe tcpdump man และ google อาจจะพอช่วยได้ .. ไปนอนล่ะคร้าบบ

MIDI SoftSynth บนลินุกซ์ด้วย ALSA VirMIDI + TiMidity

ปัญหานึงของซาวด์การ์ดหลายๆ รุ่นคือไม่มีมิดี้ที่เป็นฮาร์ดแวร์ หรือ FM Synth ก็เลยไม่สามารถเล่นมิดี้บนลินุกซ์ได้ (ถ้าเป็นวินโดวส์ ไดรเวอร์จะจำลองมิดิ้ให้ เป็นซอฟต์ซินธ์ด้วย (SoftSynth/Software Wave Table Emulation) แต่นับว่าโชคดีที่ลินุกซ์ทะเลใช้ระบบเสียงของ ALSA (Advanced Linux Sound Architecture) ก็เลยมีทางที่จะเซ็ตซอฟต์ซินธ์บลินุกซ์ด้วยเหมือนกันโดยใช้ไดรเวอร์ Virtual MIDI และซอฟต์แวร์ชื่อ TiMidity++ … ขั้นตอนมีดังนี้ครับ

เริ่มกันที่ ALSA

คอมไฟล์ alsa-driver โดยระบุให้สร้างไดรเวอร์ virmidi ด้วย ถ้าติดตั้งลินุกซ์ทะเลปกติ จะมีไดรเวอร์นี้อยู่แล้ว แต่สำหรับคนที่ recompile alsa-driver ใหม่ถ้าระบุออพชั่น –with-cards ให้ใส่ virmidi เข้าไปด้วยประมาณนี้

./configure --with-sequencer=yes --with-oss=yes --with-cards=virmidi,intel8x0

จากนั้นก็ make และ make install ตามปกติ หลังจากติดตั้ง alsa-driver แล้ว ทีนี้ก็ลอง load kernel module กัน ..

[[email protected] kitt]$ modprobe snd-virmidi index=1

ถ้า lsmod ดูควรจะเห็นอะไรประมาณนี้

snd-virmidi             2144   0 (autoclean)
snd-seq-virmidi         5096   0 (autoclean) [snd-virmidi]
snd-seq-midi-event      5672   0 (autoclean) [snd-seq-virmidi]
snd-seq                47408   0 (autoclean) [snd-seq-virmidi snd-seq-midi-event]
snd-intel8x0           24228   1
snd-pcm                83360   0 [snd-intel8x0]
snd-timer              19688   0 [snd-seq snd-pcm]
snd-ac97-codec         44640   0 [snd-intel8x0]
snd-page-alloc          8552   0 [snd-intel8x0 snd-pcm]
snd-mpu401-uart         5184   0 [snd-intel8x0]
snd-rawmidi            18752   0 [snd-seq-virmidi snd-mpu401-uart]
snd-seq-device          6364   0 [snd-seq snd-rawmidi]
snd                    43332   0 [snd-mixer-oss snd-virmidi snd-seq-virmidi
snd-seq-midi-event snd-seq snd-intel8x0 snd-pcm snd-timer snd-ac97-codec
snd-mpu401-uart snd-rawmidi snd-seq-device]

ลองสั่ง cat /proc/asound/cards

[[email protected] kitt]$ cat /proc/asound/cards
0 [82801CAICH3    ]: ICH - Intel 82801CA-ICH3
                     Intel 82801CA-ICH3 at 0x9800, irq 10
1 [VirMIDI        ]: VirMIDI - VirMIDI
                     Virtual MIDI Card 1

จะเห็นว่ามีซาวด์การ์ดสองใบ หนึ่งในนั้นเป็นซาวด์การ์ดจริง (ในตัวอย่างนี้คือ 82801CA ICH3 ของชิพเซ็ต i830) อีกตัวเป็น VirMIDI เป็นการ์ดที่จำลองขึ้นมาโดย module snd-virmidi ..


ที่จริงลินุกซ์ทะเลให้ TiMidity++ มาด้วยนะครับ แต่ว่าไม่ได้คอมไพล์ให้ใช้กับ ALSA ได้ .. ก็ต้องดาวน์โหลดเวอร์ชันที่คอมไพล์ ALSA และ ALSA Sequencer Client ด้วย .. ไม่ต้องไปหาไกล ผมทำให้แล้วล่ะ คิดว่าคงอยู่ใน TLE Update แล้ว จะใช้ Synaptic หรือจะสั่ง apt-get install หรือ apt-get update/upgrade เอาก็ได้ หรือดาวน์โหลด rpm ก็ได้ที่


เชื่อม Virtual MIDI กับ TiMidity

Virtual MIDI ไม่ได้เล่นมิดี้ได้ด้วยตัวเองครับ มันแค่จำลองเป็นมิดี้อินเทอร์เฟซเท่านั้น จะทำให้มันเล่นมิดี้ มีเสียงได้ต้องทำให้ Virtual MIDI ส่งข้อมูลมิดี้ไปยัง TiMidity++ ให้ได้เสียก่อน .. อืมม จะอธิบายหลักการตรงนี้ก็เป็นเรื่องยาว .. ขอตัดบทเลยก็แล้วกัน ก่อนอื่น TiMidity++ เป็นโหมด ALSA Sequencer Client โดยระบุออพชัน -iA เข้าไป

[[email protected] kitt]$ timidity -iA -Os &
[1] 1106
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
TiMidity starting in ALSA server mode
can't set sched_setscheduler - using normal priority
Opening sequencer port: 128:0 128:1

จากนั้นหาหมายเลขพอร์ตของ Virtual MIDI โดยดูจากไฟล์ /proc/asound/clients หรือ /proc/asound/seq/clients

[[email protected] kitt]$ cat /proc/asound/seq/clients
Client info
  cur  clients : 6
  peak clients : 6
  max  clients : 192

Client   0 : "System" [Kernel]
  Port   0 : "Timer" (Rwe-)
  Port   1 : "Announce" (R-e-)
Client  72 : "Virtual Raw MIDI 1-0" [Kernel]
  Port   0 : "VirMIDI 1-0" (RWeX)
Client  73 : "Virtual Raw MIDI 1-1" [Kernel]
  Port   0 : "VirMIDI 1-1" (RWeX)
Client  74 : "Virtual Raw MIDI 1-2" [Kernel]
  Port   0 : "VirMIDI 1-2" (RWeX)
Client  75 : "Virtual Raw MIDI 1-3" [Kernel]
  Port   0 : "VirMIDI 1-3" (RWeX)
Client 128 : "Client-128" [User]
  Port   0 : "TiMidity port 0" (-We-)
  Port   1 : "TiMidity port 1" (-We-)
  Output pool :
    Pool size          : 500
    Cells in use       : 0
    Peak cells in use  : 0
    Alloc success      : 0
    Alloc failures     : 0
  Input pool :
    Pool size          : 1000
    Cells in use       : 0
    Peak cells in use  : 0
    Alloc success      : 0
    Alloc failures     : 0

จะเห็นว่ามี Virtual RAW MIDI อยู่ 4 ไคลเอนด์ หมายเลข 72, 73, 74 และ 75 ตามลำดับ ทุกตัวมีพอร์ต 0 … ส่วน TiMidity++ อยู่ที่ 128 มีสองพอร์ตคือ 0 และ 1 .. เมื่อได้หมายเลขพอร์ตแล้วก็สั่งเชื่อมพอร์ตได้แล้ว ที่ต้องทำก็คือเชื่อมพอร์ต 0 ของ Virtual RAW MIDI ตัวแรก เข้าไปที่พอร์ต 0 ของ TiMidity++ โดยคำสั่ง aconnect

[[email protected] kitt]$ aconnect 72:0 128:0

ดู /proc/asound/seq/clients อีกครั้ง

[[email protected] kitt]$ cat /proc/asound/seq/clients
Client info
  cur  clients : 6
  peak clients : 7
  max  clients : 192

Client   0 : "System" [Kernel]
  Port   0 : "Timer" (Rwe-)
  Port   1 : "Announce" (R-e-)
Client  72 : "Virtual Raw MIDI 1-0" [Kernel]
  Port   0 : "VirMIDI 1-0" (RWeX)
    Connecting To: 128:0
Client  73 : "Virtual Raw MIDI 1-1" [Kernel]
  Port   0 : "VirMIDI 1-1" (RWeX)
Client  74 : "Virtual Raw MIDI 1-2" [Kernel]
  Port   0 : "VirMIDI 1-2" (RWeX)
Client  75 : "Virtual Raw MIDI 1-3" [Kernel]
  Port   0 : "VirMIDI 1-3" (RWeX)
Client 128 : "Client-128" [User]
  Port   0 : "TiMidity port 0" (-We-)
    Connected From: 72:0
  Port   1 : "TiMidity port 1" (-We-)
  Output pool :
    Pool size          : 500
    Cells in use       : 0
    Peak cells in use  : 0
    Alloc success      : 0
    Alloc failures     : 0
  Input pool :
    Pool size          : 1000
    Cells in use       : 0
    Peak cells in use  : 1
    Alloc success      : 1
    Alloc failures     : 0

จะเห็นว่า Client 72 มีข้อความ Connected To: 128:0 และที่ TiMidity++ มีข้อความ Connected From: 72:0

แสดงว่าเชื่อมต่อเป็นที่เรียบร้อยแล้ว ถ้าสั่ง playmidi หรือใช้โปรแกรมอะไรก็ตามที่ใช้งานมิดี้ ข้อมูลของมิดี้จะส่งผ่าน external MIDI ซึ่งจำลองขึ้นมาโดยไดรเวอร์ Virtual MIDI ไปยัง TiMidity++ แล้วเราก็จะได้ยินเสียงมิดี้กันล่ะ :)


ถ้าต้องการคอนฟิกให้ลินุกซ์เรียก Virtual MIDI อัตโนมัติทุกครั้งที่บูตก็สามารถทำได้โดยแก้ /etc/modules.conf ประมาณนี้

alias snd-card-0 snd-intel8x0
alias snd-card-1 snd-virmidi
alias sound-slot-0 snd-card-0
alias sound-slot-1 snd-card-1
alias char-major-116 snd
alias char-major-14 soundcore
options snd major=116 cards_limit=2
options snd-intel8x0 index=0
options snd-virmidi index=1
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss

ที่ต้องเพิ่มเข้าไปใน /etc/modules.conf ก็คือ บรรทัด

alias snd-card-1 snd-virmidi
alias sound-slot-1 snd-card-1
options snd-virmidi index=1

และต้องเปลี่ยน cards_limit เป็น 2

ทีนี้ทุกครั้งที่บูต snd-virmidi module ก็จะได้รับการติดตั้งอัตโนมัติ ส่วนการเชื่อม Virtual MIDI กับ TiMidity++ ทำเป็นครั้งๆ ไปเมื่อต้องการใช้ดีกว่า เพราะยังต้องรัน timidity -iA -Os ก่อนถึงจะสั่ง aconnect ได้ .. จะให้มันรันตอนบูตเลยดูจะเป็นการเปลืองทรัพยากรระบบเปล่าๆ


ยังมีเทคนิคอีกเล็กน้อยสำหรับ TiMidity++ เพื่อให้การทำงานกับมิดี้ตอบสนองได้ดีขึ้นครับ … ปกติ TiMidity ใช้บัฟเฟอร์ขนาดใหญ่เพื่อให้เพลย์ได้ราบรื่น แต่ก็ทำให้มี latency เยอะซึ่งไม่เหมาะกับโปรแกรมที่ต้องการทำงานแบบเรียลไทม์ เช่น โปรแกรมซีเควนเซอร์ อย่าง Rosegarden หรือ Noteedit ทางแก้คือกำหนดบัฟเฟอร์ให้เล็กลงด้วยออพชัน -B ค่าที่เหมาะๆ มีคนแนะมาว่าใช้ -B2,8 ส่วนตัวผมใช้ -B8,8 กำลังพอดี

ถ้า TiMidity++ กินซีพียูเยอะ และต้องการลดมันลง สามารถทำได้โดยยกเลิกเอฟเฟกต์ต่างๆ เช่น reverb และ/หรือ chorus โดยกำหนดออพชัน -EFreverb=0 และ/หรือ -EFchorus=0 ตามลำดับ

ถ้ายังไม่พอใจอีก ก็ต้องลองรัน TiMidity++ ด้วย root หรือตั้ง suid root วิธีนี้ทำให้ TiMidity++ สามารถตั้ง scheduling เป็น FIFO ด้วย priority สูงสุดเท่าที่จะทำได้ (ซึ่งมีเฉพาะ root ที่มีสิทธิตั้งค่าแบบนั้น) วิธีนี้ทำให้การตอบสนองดีขึ้นโดยเฉพาะกับโปรแกรมที่ทำงานแบบเรียลไทม์

.. วันนี้ยาวแฮะ


พยายามกับภาษาญี่ปุ่นบนลินุกซ์มานานแล้ว วันนี้ก็เห็นผลเสียทีครับ เรื่องของเรื่องก็คือลินุกซ์ทะเล 5.0 ไม่มีภาษาญี่ปุ่นให้เลือก ตอนติดตั้ง .. glibc ก็เลยไม่สนับสนุน locale ญี่ปุ่นเลย หลังจากเอาเวลาว่างๆ ไปค้นข้อมูลหลายหน ก็ได้ข้อสรุปมาบ้างแล้ว

อย่างแรกเลยคือเรื่องของ locale ภาษาญี่ปุ่นที่ต้องเพิ่มเข้าไปใน glibc .. ทำได้ไม่ยากเลย แต่กว่าจะรู้วิธีนี้ก็เสียเวลางมหาซะนาน กุญแจอยู่ที่ localedef นั่นเองครับ .. สำหรับภาษาญี่ปุ่นนิยมใช้ ja_JP.eucJP ก็ localedef ได้เป็น

# localedef -v -c -i ja_JP -f EUC-JP /usr/lib/locale/ja_JP.eucJP

ลองสั่ง locale -a ดูถ้ามี ja_JP ก็ใช้ได้แล้ว

อย่างที่สองคือ keyboard input .. ต้องติดตั้งหลายตัวหน่อย


ไม่ต้องคิดมาก ลงๆ ไปเลย apt-get install kinput2 เอาก็ได้ เดี๋ยวมันลาก dependencies มาลงให้เอง :)


ก็ลองกันด้วย kterm นี่ล่ะครับ .. สตาร์ท canna เซิร์ฟเวอร์ก่อน ตามด้วย kinput2 เพื่อเชื่อมกับ canna แล้วค่อยเรียก kterm:

# service canna start
# kinput2 -canna &
# kterm &

ใน kterm กด shift-space จะเข้าสู่โหมด input ภาษาญี่ปุ่น ลองพิมพ์ภาษาญี่ปุ่นด้วยอักษรโรมาจิ .. เอาเป็น konnichiha ก็ได้ จะเห็นว่ามันแสดงเป็นตัวอักษรฮิระงานะ มีเส้นขีดใต้ข้อความ เส้นนี้เป็นตัวบอกว่าข้อความไหนที่ kinput2 กำลังประมวลผลอยู่ ลองเคาะ space ดูมันจะแสดงตัวคันจิขึ้นมาด้วย ถ้าเคาะ space อีกครั้ง kinput2 จะแสดงหน้าต่างให้เลือกตัวคันจิ คะตะคะนะ และฮิระงานะด้วย

ใช้ space หรือปุ่มลูกศรเลือกคำที่ต้องการ แล้วก็เคาะ enter .. หน้าต่างก็จะปิดลง เคาะ enter อีกครั้ง เส้นใต้ข้อความจะหายไป กด shift-space อีกครั้งก็จะออกจากโหมด input ภาษาญี่ปุ่น ..พอใช้ kterm ได้โปรแกรมอื่นๆ ที่ run เป็น text mode บน kterm ก็ควรจะใช้ภาษาญี่ปุ่นได้ด้วย .. ลองดูก็แล้วกัน


สำหรับ GNOME2 สามารถเซ็ตให้โปรแกรมใช้ kinput2 ได้โดยใช้ XIM .. อย่างแรกก็ต้องตั้ง XMODIFIERS ให้ input method เป็น kinput2 ก่อน

export XMODIFIERS="@im=kinput2"

ทีนี้ kinput2 จะทำงานอัตโนมัติถ้าโปรแกรมนั้นทำงานด้วย locale ญี่ปุ่น สมมติเป็น gedit บน terminal สั่ง

LANG=ja_JP gedit

จะ start gedit โดยกำหนดให้ LANG ที่ใช้เป็น ja_JP ครับ ทีนี้ใน gedit ให้คลิกขวาเลือก input method เป็น X Input Method ก็จะใช้ภาษาญี่ปุ่นได้เหมือนบน kterm .. อ่อ อย่าลืมเปลี่ยนฟอนต์เป็นภาษาญี่ปุ่นด้วยนะครับ ถ้าไม่มีก็ติดตั้งแพคเกจ ttfonts-ja ได้จากแผ่นติดตั้งลินุกซ์ทะเล หรือ apt-get install เอาก็ได้

เฮ่อ .. ได้ขนาดนี้ก็พอใจแล้ว .. วันนี้เอาไว้เท่านี้ก่อนครับ :)


อยากลองใช้ transcode แปลง DVD เป็น VCD ดูสักหนล่ะครับ แต่พาร์ติชันขนาด 5 GB ที่กันไว้ตอนแรกไม่พอเสียแล้ว .. ก็แค่ซอร์สของ DVD แผ่นนึงก็หมดไป 4 กิ๊กแล้ว .. อิมเมจของ VCD ที่จะสร้างด้วย transcode ก็ใช้พื้นที่อีกประมาณ 1.4 GB (เท่ากับแผ่นซีดี 700 MB สองแผ่นไง) แต่เวลา encode ต้องมีพื้นที่ว่างๆ ประมาณสามเท่าของอิมเมจ รวมๆ กันแล้วต้องใช้พื้นที่ 8-9 GB .. เฮ่อ .. ฮาร์ดดิสก์ 60 GB จะหมดก็คราวนี้ล่ะฟะ .. วกกลับมาเรื่องพาร์ติชัน 5 GB กันต่อ .. ในเมื่อมันไม่พอก็ขยายพาร์ติชันสิ ข่าวดี (หรือหรือข่าวเก่าแล้วก็ไม่รู้) คือพาร์ติชันที่ใช้ไฟล์ซิสเต็มแบบ ext2/ext3 สามารถย่อ/ขยาย ได้โดยข้อมูลไม่สูญหาย ไม่ต้องลบ หรือย้ายข้อมูลก่อนด้วย .. โอ๊ะ .. ทำได้ไงๆๆ …

สิ่งที่ต้องทำมีสองส่วนคือปรับขนาดของไฟล์ซิสเต็ม และปรับขนาดของพาร์ติชันครับ .. การปรับขนาด ext2/ext3 ทำได้ด้วย resize2fs ส่วนขนาดของพาร์ติชันก็ใช้ fdisk นี่ล่ะ .. เริ่มกันเลย ..

สมมติว่าต้องการขยาย /dev/hda7 ก่อนอื่นต้อง fdisk ก่อน ดูให้แน่ใจว่ามีที่ว่ามีที่ว่างต่อจากพาร์ติชันที่ต้องการขยาย จากนั้นทำตามขั้นตอนนี้

  1. unmount file system ที่จะขยายเสียก่อน
  2. เรียกโปรแกรม fdisk
  3. จดตัวเลข start ของ /dev/hda7 .. จดสิๆๆ
  4. ลบ {{/dev/hda7 ทิ้ง ..เอ่อ.. ไม่ต้องห่วงๆ เพราะข้อมูลทุกอย่างยังไม่หายไปไหน มันแค่ลบ entry ในตารางพาร์ติชันของฮาร์ดดิสก์ ไม่ได้ลบข้อมูล .. แต่ถ้าต้องการให้มันกลับมาก็ต้องสร้างพาร์ติชันที่มีตำแหน่งเริ่มต้นตรงที่เดิม นั่นเป็นเหตุผลว่าทำไมต้องจด start ของ /dev/hda7 ไว้ ..
  5. สร้างพาร์ติชัน /dev/hda7 เริ่มต้นที่เลข start ตัวเดิม กำหนดขนาดตามต้องการ แต่ไม่เกินพื้นที่ว่างที่เหลืออยู่
  6. บันทึกการเปลี่ยนแปลง ออกจาก fdisk
  7. รีบูต .. เพื่อความแน่นอน.. รีบูตเลยครับ .. ผมเคยพลาดมาแล้ว ใจร้อน ไม่ยอมรีบูต ไฟล์ซิสเต็มหาย ข้อมูลไปหมดเลย กู้กันสามวันสามคืน ได้ข้อมูลสำคัญๆ กลับมา 3-4 MB แต่ชีวิตหลังจากนั้นเหมือนกลับไปอยู่อดีต 3 เดือนก่อน เพราะแบคอัพล่าสุดอายุประมาณนั้น
  8. หลังจากรีบูตแล้ว e2fsck -f /dev/hda7 พาร์ติชันก่อนหนึ่งที
  9. จากนั้นสั่ง resize2fs /dev/hda7 แล้วก็ลุ้น.. ไม่ต้องกลั้นหายใจนะครับ ถ้าขยายไฟล์ซิสเต็มให้โตขึ้นใหญ่มากๆ ก็ต้องรอนานเป็นนาทีเหมือนกัน :)

ส่วนการย่อขนาดพาร์ติชัน ต้องสั่ง resize2fs เพื่อเปลี่ยนขนาดไฟล์ซิสเต็มก่อน แล้วค่อย fdisk ไปแก้ขนาดพาร์ติชัน สมมติว่าจะย่อ /dev/hda7 ให้เหลือแค่ 1048576 blocks ก็สั่ง

resize2fs /dev/hda7 1048576

จากนั้นก็เข้า fdisk จดตำแหน่งเริ่มต้นของพาร์ติชัน ลบพาร์ติชันของ /dev/hda7 ทิ้ง แล้วสร้างใหม่แบบเดียวกับการขยาย ข้อควรระวังคือ ต้องกำหนดขนาดพาร์ติชันไม่ให้เล็กไปกว่าขนาดที่ระบุตอน resize2fs (เช่น ในตัวอย่างนี้คือ 1048576 blocks) เพราะจะทำให้ข้อมูลหายได้

เสร็จแล้ว ขอตัวไป RIP DVD ก่อนละคร้าบบบ

แชร์ไฟล์/พรินเตอร์ผ่านโปรโตคอล AppleTalk ด้วยลินุกซ์

ที่ห้องแล็ป IRL พรินเตอร์จะต่อตรงกับเครื่อง Yggdrasil แล้วก็แชร์ผ่าน Samba ให้คนอื่นๆ ได้ใช้ แต่แล้วก็เกิดมีเครื่อง Apple PowerBook และ Apple iBook โผล่เข้ามาในเน็ตเวิร์ค แรกๆ ก็ไม่คิดว่าจะยุ่งยากอะไรจนกระทั่งได้รู้ว่า MacOS X มันไม่สามารถพิมพ์ผ่าน SMB ได้ …แปลกแฮะ ที่จริง OSX ก็มี SMB นะครับ แต่ว่ามันใช้ได้กับไฟล์เท่านั้น .. เท่าที่ google หาดูก็มีทางออกอยู่ 2-3 ทางคือ ซื้อ DAVE มาใช้ โปรแกรมนี้คงเรียกได้ว่าเป็น Samba for Mac แต่ไม่ฟรี (~ US$150) .. หรืออีกทางนึงก็คือคอนฟิกให้ Yggdrasil รู้จัก AppleTalk แล้วแชร์ไฟล์และพรินเตอร์ผ่าน netatalk .. อืมม.. วิธีหลังนี่น่าสนใจครับ :)

เคอร์เนลของลินุกซ์มี AppleTalk นานพอสมควรแล้ว และมีแพคเกจสำหรับแชร์ไฟล์ ไดเรคทอรี่ และพรินเตอร์ได้ .. แพคเกจที่ว่านี่ก็คือ netatalk (อ่านว่า เนต–ทอล์ค ลากเสียง ‘เนต’ ยาวๆ) .. ก่อนอื่น จัดการกับเคอร์เนลซะก่อน เช็คดูก่อนว่าเคอร์เนลสนับสนุน AppleTalk หรือยัง ถ้ายังก็ต้อง recompile เคอร์เนลครับ


จากนั้นติดตั้ง netatalk มี rpm เยอะแยะ หาดาวน์โหลดเอา ดีฟอลต์คอนฟิกฯ จะแชร์โฮมไดเรคทอรีให้อัตโนมัติ ค่อนข้างสะดวก ที่ต้องเพิ่มเข้าไปก็เป็นพวก แชร์พรินเตอร์ หรือ ไดเรคทอรีอื่นๆ

สำหรับลินุกซ์ทะเล ใช้ CUPS ก็แก้ /etc/atalk/papd.conf โดยเพิ่ม


บรรทัดแรก เป็นชื่อพรินเตอร์ที่จะปรากฏเมื่อเชื่อมผ่าน AppleTalk

บรรทัดที่สอง เป็นคำสั่งในการพิมพ์งาน กรณีของ CUPS จะใช้คำสั่งอย่างที่ปรากฏในตัวอย่างนี้ ส่วนอื่นๆ .. google เอา

บรรทัดที่สาม เป็น queue operator ของทะเลใช้ lp หรือไม่ก็ root ไปเลย

บรรทัดสุดท้าย เป็น ppd ที่จะใช้ ..ปกติแล้วเมื่อติดตั้งพรินเตอร์ CUPS จะสร้าง ppd เก็บไว้ที่ /etc/cups/ppd ก็เอามาใช้ได้เลย

ส่วนแชร์ไดเรคทอรี สามารถเพิ่มใน /etc/atalk/AppleVolumes.default เช่น

/usr2/public "Shared Space"

จากนั้นก็สตาร์ทเซอร์วิส atalk และ/หรือ คอนฟิกให้เรียกใช้เมื่อบูต

ทางฝั่งเครื่องแมค ให้ enable AppleTalk ใน System Preference -> Network จากนั้นก็เพิ่มพรินเตอร์เข้าไปในระบบโดยเลือกตามรูป

อย่าลืมเลือก Printer Model เป็น Generic เพราะเท่าที่ทดสอบดูถ้าเลือกเป็นอย่างอื่นจะพิมพ์ไม่ออก หลังจากเพิ่มเข้าไปแล้วเน็ตเวิร์คพรินเตอร์นี้ก็จะเข้าไปเป็นพรินเตอร์ตัวนึงของระบบ ตั้งเป็นดีฟอลต์ก็ได้ถ้าต้องการ

จากนั้นก็ลองสั่งพิมพ์เอกสารดู ..

ถ้าไม่สำเร็จ ให้ลองดู log ของ atalk และ cups ที่เซิร์ฟเวอร์ครับ จากนั้นก็ตัวใครตัวมันละครับ แก้ปัญหากันเอาเอง :P .. ที่จริงยังเหลือไม้ตายอีกทางหนึ่งคือ พิมพ์ผ่าน IPP (Internet Printing Protocol) ไปที่ CUPS บน Yggdrasil .. แต่เอาไว้โอกาสหน้าก็แล้วกัน

เมาท์เมโมรีสติ๊กบน Sony Clie T-665C

รอมานานแสนนานกว่าจะหาวิธีคอนฟิกให้เมาท์ memory stick ของ Clie PEG T-665C และ Clie รุ่นหลังๆ ได้ .. ปัญหาติดอยู่ที่ไดรเวอร์ USB Storage ในเคอร์เนล ดังนั้นงานนี้จะต้องแก้ซอร์สของเคอร์เนลและต้อง recompile เคอร์เนลกันใหม่

ไฟล์ที่ต้องแก้คือ /usr/src/linux/drivers/usb/storage/transport.c .. ในไฟล์นี้ ให้เปลี่ยน

   /* was this a command-completion interrupt? */
 if (us->irqbuf[0] && (us->subclass != US_SC_UFI)) {
   US_DEBUGP("-- not a command-completion IRQ");


 us->irqbuf[0] = 0;

แก้เสร็จก็ recompile เคอร์เนล

เสร็จแล้วก็มาทดสอบกัน .. ต่อ Clie เข้ากับพอร์ต USB เรียกโปรแกรม MS Import บน Clie .. ลอง lsmod ดูน่าจะเห็นบรรทัด usb-storage (ถ้าไม่ขึ้นลอง modprobe usb-storage) .. /var/log/messages ควรจะมีข้อความประมาณนี้ :

[[email protected] root]# tail /var/log/messages
Apr 11 15:37:01 admin kernel: hub.c: USB new device connect on bus1/2, assigned device number 2
Apr 11 15:37:01 admin kernel: usb.c: USB device 2 (vend/prod 0x54c/0x99) is not claimed by any active driver.
Apr 11 15:37:04 admin /etc/hotplug/usb.agent: Setup usb-storage for USB product 54c/99/100
Apr 11 15:37:04 admin kernel: Initializing USB Mass Storage driver...
Apr 11 15:37:04 admin kernel: usb.c: registered new driver usb-storage
Apr 11 15:37:04 admin kernel: scsi0 : SCSI emulation for USB Mass Storage devices
Apr 11 15:37:04 admin kernel:   Vendor: Sony      Model: CLIE MGMS         Rev: 1.00
Apr 11 15:37:04 admin kernel:   Type:   Direct-Access                      ANSI SCSI revision: 02
Apr 11 15:37:04 admin kernel: Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Apr 11 15:37:04 admin kernel: usb-uhci.c: interrupt, status 3, frame# 24
Apr 11 15:37:04 admin kernel: SCSI device sda: 126848 512-byte hdwr sectors (65 MB)
Apr 11 15:37:04 admin kernel: sda: Write Protect is off
Apr 11 15:37:04 admin kernel:  sda: sda1
Apr 11 15:37:04 admin kernel: USB Mass Storage support registered.

หรือจะดูที่ /proc/scsi/scsi ก็ได้

[[email protected] root]# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: Sony     Model: CLIE MGMS        Rev: 1.00
  Type:   Direct-Access                    ANSI SCSI revision: 02


mount -t vfat /dev/sda1 /mnt

เท่านี้ก็เรียบร้อย .. เมื่อเลิกใช้ให้สั่ง

rmmod usb-storage

แล้วค่อยกดปุ่ม disconnect ที่ MS Import .. ฮุๆๆ ได้อย่างนี้แล้วก็โหลด mp3 ไปฟังล่ะคร้าบบบ :D

เขียนแผ่นซีดีบนลินุกซ์ด้วย cdrecord และ mkisofs

ข้อมูลในฮาร์ดดิสก์เริ่มเยอะขึ้นๆ ทุกวัน สงสัยต้องเขียนลงแผ่นซีดีซักหน่อย แต่ในลินุกซ์ทะเล 5.0 ไม่มีโปรแกรมสำหรับเขียนซีดีง่ายๆ เลยครับ .. เอาวะ เล่นมันถึกๆ นี่ล่ะ ใช้ mkisofs + cdrecord ก็ได้ :D .. สองโปรแกรมนี้เป็นโปรแกรมหลักที่ใช้เขียนซีดีบนลินุกซ์ ส่วนโปรแกรมที่เป็นอินเทอร์เฟซสวยๆ ใช้ง่ายๆ อย่างพวก EClipt Roaster เป็นแค่หน้ากากที่ช่วยให้ใช้งานได้ง่ายขึ้นเท่านั้นเอง และเอาเข้าจริงๆ แล้วใช้ mkisofs + cdrecord ก็ไม่ได้ยากอะไรเลย จำแค่สองคำสั่งก็ใช้ได้แล้วครับ .. ที่เราจะทำก็คือใช้โปรแกรม mkisofs สร้างอิมเมจของแผ่นซีดีก่อน แล้วจึงเอาอิมเมจที่ได้ไปเขียนลงแผ่นจริงๆ อีกทีด้วย cdrecord ..

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

เริ่มกันที่สร้างอิมเมจก่อน คำสั่งพื้นฐานในการสร้างอิมเมจก็คือ

[[email protected] kitt]$ mkisofs -o image.iso /source/tree

mkisofs จะสร้างไฟล์ซิสเต็มและจัดโครงสร้างการจัดเก็บข้อมูลเสมือนกับว่า image.iso เป็นแผ่นซีดีแผ่นนึง แล้วก๊อปปี้ข้อมูลทั้งหมดจากไดเรคทอรี่ /source/tree ลงไป .. แต่การใช้งานจริงเรามักต้องการให้ซีดีใช้กับวินโดวส์หรือโอเอสอื่นๆ ได้ด้วย .. นอกจากนั้นอาจจะต้องการใช้ชื่อไฟล์ยาวๆ และชื่อไฟล์ภาษาไทยอีก จึงต้องระบุออพชันเพิ่มเติมเข้าไป ..อืมม.. เอาเป็นว่าจำคำสั่งนี้ไปเลยก็แล้วกันครับ:

mkisofs -V "My Label" -v -r -jcharset cp874 -o image.iso /source/tree


-V "My Label" เป็นการกำหนด volume label ของแผ่น เป็น “My Label” .. เปลี่ยนข้อความตามใจชอบ แต่อย่าลืมใส่เครื่องหมายคำพูดกันไว้สักหน่อย

-v หมายถึง verbose ที่จริงไม่จำเป็นเท่าไหร่ ไม่ต้องระบุก็ได้ แต่ผมชอบให้มันแสดงข้อความเยอะๆ จะได้รู้สึกว่ามันกำลังทำงานอยู่ :P

-r ตั้ง permission เป็น public permission อันนี้ใส่กันเอาไว้ เผื่อเอาแผ่นไปใช้กับลินุกซ์หรือยูนิกซ์อื่นๆ จะได้ไม่มีปัญหาเรื่อง permission ของไฟล์..

-jcharset cp874 เป็นการกำหนดให้ใช้ Joliet ซึ่งทำให้เก็บชื่อไฟล์ได้ยาว 64 ตัวอักษร และตั้ง charset สำหรับ Joliet เป็นภาษาไทย (cp874 คือ codepage ภาษาไทย) .. ออพชันนี้ทำให้วินโดวส์แสดงชื่อไฟล์และไดเรคทอรี่ภาษาไทยได้ถูกต้อง

หลังจากได้ไฟล์ image.iso แล้ว อาจจะอยากทดสอบดูก่อนเขียนลงแผ่นซีดี.. ไม่ยากๆ .. เพราะเราสร้าง image.iso เสมือนเป็นแผ่นซีดีอยู่แล้ว การทดสอบจึงทำได้โดยการเมาท์ไฟล์ image.iso ..

[[email protected] kitt]# mount -o loop image.iso /mnt

คำสั่งนี้จะเมาท์ไฟล์ image.iso ไว้ที่ /mnt ออพชัน -o loop เป็นการระบุว่าเราต้องการเมาท์อิมเมจของไฟล์ซิสเต็ม .. เมาท์ได้แล้วก็ลอง ls -lR /mnt ดู .. ถ้าทุกอย่างดูเรียบร้อยดีแล้วก็ umount /mnt แล้วก็เตรียมเขียนลงแผ่นจริงๆ กันล่ะครับ


ก่อนอื่นต้องสแกนหาไดรว์ที่จะใช้เขียนเสียก่อน โดยใช้คำสั่ง:

[[email protected] kitt]# cdrecord -scanbus
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J#rg Schilling
Using libscg version 'schily-0.7'
        0,0,0     0) 'LITE-ON ' 'LTR-40125S      ' 'ZS0N' Removable CD-ROM
        0,1,0     1) *
        0,2,0     2) *
        0,3,0     3) *
        0,4,0     4) *
        0,5,0     5) *
        0,6,0     6) *
        0,7,0     7) *

จากตัวอย่างจะเห็นว่าไดรว์เขียนซีดีเป็นดีไวซ์ 0,0,0 .. หมายเลขดีไวซ์นี้จะเอาไปใช้ระบุไดรว์เมื่อสั่ง cdrecord ..

[[email protected] kitt]# cdrecord -v speed=32 dev=0,0,0 -data image.iso


-v หมายถึง verbose .. เช่นเคย

speed=32 หมายถึงเขียนที่ 32x แต่อัตราการเขียนจริงๆ อาจจะไม่ตรงกับค่านี้

dev=0,0,0 เป็นการระบุให้ใช้ดีไวซ์หมายเลข 0,0,0 ในการเขียนซีดี

-data image.iso เป็นการระบุให้เอาไฟล์ image.iso ไปเขียนลงซีดี

ทีนี้ก็นั่งรอ ไม่กี่นาทีก็ได้แผ่นซีดีอุ่นๆ ออกมา :)

Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J#rg Schilling
TOC Type: 1 = CD-ROM
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.7'
atapi: 1
Device type    : Removable CD-ROM
Version        : 0
Response Format: 2
Capabilities   :
Vendor_info    : 'LITE-ON '
Identifikation : 'LTR-40125S      '
Revision       : 'ZS0N'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
Drive buf size : 1422080 = 1388 KB
FIFO size      : 4194304 = 4096 KB
Track 01: data   676 MB
Total size:      776 MB (76:56.77) = 346258 sectors
Lout start:      777 MB (76:58/58) = 346258 sectors
Current Secsize: 2048
ATIP info from disk:
  Indicated writing power: 7
  Is not unrestricted
  Is not erasable
  ATIP start of lead in:  -11597 (97:27/28)
  ATIP start of lead out: 359849 (79:59/74)
Disk type:    Short strategy type (Phthalocyanine or similar)
Manuf. index: 20
Manufacturer: Princo Corporation
Blocks total: 359849 Blocks current: 359849 Blocks remaining: 13591
Forcespeed is OFF.
Starting to write CD/DVD at speed 32 in real TAO mode for single session.
Last chance to quit, starting real write    0 seconds. Operation starts.
Waiting for reader process to fill input buffer ... input buffer ready.
BURN-Free is ON.
Turning BURN-Free off
Performing OPC...
Starting new track at sector: 0
Track 01:  676 of  676 MB written (fifo 100%) [buf  98%]  32.9x.
Track 01: Total bytes read/written: 709132288/709132288 (346256 sectors).
Writing  time:  177.016s
Average write speed  27.3x.
Min drive buffer fill was 97%
Fixating time:   26.745s
cdrecord: fifo had 11170 puts and 11170 gets.
cdrecord: fifo was 0 times empty and 6789 times full, min fill was 51%.

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

[[email protected] kitt]# mkisofs -V "My Label" -v -r -jcharset cp874 /source/tree
 | cdrecord -v fs=8m speed=36 dev=0,0,0 -

จะเห็นว่าเราไม่ได้ระบุ -o image.iso ใน mkisofs กรณีนี้ mkisofs จะส่งเอาท์พุตออก stdout แทน เราจึง pipe เข้าไปเป็นอินพุตของ cdrecord ได้โดยระบุออพชัน – (อยู่ท้ายบรรทัด) ซึ่งเป็นการกำหนดให้ cdrecord รับอินพุตจาก stdin … ส่วนออพชัน fs=8m เป็นการกำหนดขนาดของบัฟเฟอร์ในการเขียนซีดีให้มีขนาดเป็น 8 MB (ถ้าไม่ระบุจะเป็น 4 MB) .. ตามเอกสารของ cdrecord บอกไว้ว่าบัฟเฟอร์ควรมีขนาด 4 – 32 MB และแนะนำว่าขนาดอย่างน้อยควรจะเท่ากับบัฟเฟอร์ของไดรว์เขียนซีดี และอย่างมากไม่เกินครึ่งหนึ่งของหน่วยความจำของเครื่อง .. โดยทั่วไป 8 MB ก็เพียงพอแล้วครับ

สำหรับการก๊อปปี้ซีดีจากแผ่นนึงไปอีกแผ่นนึง ทำได้โดยสร้างอิมเมจของแผ่นต้นฉบับ ด้วยคำสั่ง

[[email protected] kitt]# dd if=/dev/cdrom of=image.iso bs=1k

จากนั้นก็เอา image.iso ไปเขียนลงซีดีด้วย cdrecord หรือกรณีที่มีไดรว์สองตัวจะก๊อปแผ่นโดยไม่ทำอิมเมจก็ได้เหมือนกัน

สมมติว่า /dev/hdd เป็นไดรว์ที่ใส่แผ่นต้นฉบับ และ /dev/hdc เป็นไดรว์สำหรับเขียนแผ่นซีดี มี dev=0,0,0 ก็จะสามารถสั่งให้ก๊อปปี้แผ่นได้โดยใช้คำสั่ง

[[email protected] kitt]# dd if=/dev/hdd bs=1k | cdrecord -v fs=8m speed=36 dev=0,0,0 -

เห็นเปล่า สั่งไม่เกินสองบรรทัดก็เขียนซีดีได้แล้ว ไม่ยากเลย :D