วันพฤหัสบดี, ธันวาคม 22, 2548

จะทำยังไงหาก swap partition เราไม่พอใช้งาน

อันนี้เป็น ของเก่าทำเก็บไว้กันลืม

โดยปกติแล้ว เวลาเราลง OS มักจะได้รับคำแนะนำอยู่เสมอๆ ว่าควรจะ create swap partition ให้เป็นสองเท่าของเนื้อที่ Ram ของตัวเครื่อง ซึ่งบางครั้งมันก็ไม่ได้จำเป็นเสมอไป ยกตัวอย่างง่ายๆ หากเรามีเครื่องที่มี ram ซัก 2 GB ขึ้นไป หากทำตามคำแนะนำมันจะต้องเสียพื้นที่ 4GB ให้เป็น swap partition ซึ่งดูๆ ไปแล้วมันต้องบ้าแน่ๆ หากทำแบบนั้นกับ server ที่ไม่ได้ใช้ ram ขนาดนั้น โดยปกติ ผมเองจะทำอย่างมากก็ create swap partition แค่ 1GB นี่ก็โครตเยอะแล้ว

แต่หลังจากนั้น ผมก็พบประสบการณ์อันน่ากลัว ที่ไม่เคยคาดคิดเกิดขึ้น คือ ram ไม่พอ แล้วมันไป swap จน swap จะหมด จนคิดว่าจะทำอย่างไรดี

สุดท้ายก็นึกว่าได้ มันทำ swap file ได้นี่หว่า (วิธีนี้อาจจะมีข้อเสีย ซึ่งจากที่ไปอ่านๆ ตามต่างประเทศเค้าบอกกันว่า มันจะทำให้ช้ากว่าแยกเป็น parition แต่ผมคิดว่าถ้ามันไม่บ่อยก็คงไม่มีปัญหาอะไร)

วิธีทำ
  1. ท ำการสร้าง file จากความว่างเปล่า โดยในที่นี้ผมจะสร้างให้มันมีขนาดซัก 512MB เอามันไว้ที่ไหนก็ได้ที่มีที่เหลือให้มันอยู่ นั้นล่ะ ในกรณีนี้สมมุติว่า root มันว่างแล้วกัน ง่ายดี
    # dd if=/dev/zero of=/swapfile1 bs=1024 count=524288000


  2. ขั้นต่อมาสั่งให้มันกลายเป็น swap file ซะ
    # mkswap /swapfile1

  3. จากนั้น สั่งให้มันสามารถนำมาใช้งานได้โดยสั่ง
    # swapon /swapfile1

    สามารถลองตรวจสอบได้จาก คำสั่ง cat /proc/swap

  4. ในกรณีที่เราต้องการให้มันกลายเป็น default ไปเลยนั้นให้แก้ไขที่ /etc/fstab แล้วก็เติมข้อความดังข้างล่างนี้ลงไปท้ายสุด
    /swapfile1 swap swap defaults 0 0

วันพุธ, ธันวาคม 14, 2548

log rotation บน solaris

เดี๋ยวนี้มีอะไรเกี่ยวกับ solaris มากเหลือเกิน วุ่นวายดี อันนี้จะเป้นเรื่องย้อนหลังหน่อย เกี่ยวกับ log rotation บน solaris นั้นล่ะ คือที่ผ่านมาได้จับงานอยู่งานหนึ่งเขียน application จากนั้นจะต้องทำ log rotation บน solaris ซึงมันเป็นเครื่องของคนอื่น แถมไ่ม่ได้ลง logrotate บนนั้นอีก (ทำไม ที่นั้นไม่ใช้ logrotate หว่า ไม่เข้าใจ) เลยต้องมาเขียนเอง

ขอเอา script มาแปะไว้กันหาย

#!/usr/bin/bash
archiveName=blabla
archiveBack=7
archivePath=/some/archive/log/path

logPath1=/where/path/log/for/archive/1
logPath2=/where/path/log/for/archive/2

#archiveDate=`date '+%Y-%m-%d'`
archiveDate=`getbefortoday`


# ---- begin make archive ----
archiveNo=0
n=$archiveBack

echo "starting archiving log file of $archiveDate ..."

cd $archivePath

for ((i = 0; i <= $archiveBack; i++)); do
   if [ -w $archiveName.$n.tar.bz2 ] ; then
     m=$(($n + 1))
     mv -f $archiveName.$n.tar.bz2      $archiveName.$m.tar.bz2
   fi
   n=$(($n - 1))
done

# tar and compress log files
cd $archivePath
tar -cf $archiveName.0.tar         $logPath1/$archiveDate.*         $logPath2/$archiveDate.*
bzip2 -9f $archiveName.0.tar
echo "finish archive." ; echo " "


echo "starting delete old log files..."
rm -rf $logPath1/$archiveDate.* $logPath2/$archiveDate.*
echo "finish delete old log files" ; echo " "


# delete old archive log file
echo "starting delete old archive log files."
rm -f $archivePath/$archiveName.$((archiveBack + 1)).tar.bz2


จาก scirpt ดังกล่าวจะมีบรรทัดหนึ่ง คือ archiveDate=`getbefortoday` ตรงนี้จะไปเรียก java app เล็กๆ ที่หาวันย้อนหลังของเครื่องไป 1 วัน โดยมี format yyyy-mm-dd ซึ่งโดยปกติบน linux ผมจะใช้คำสั่ง date แล้วใส่ format เอา แต่บน solaris มันสั่งไม่เหมือนกัน แถมรีบๆ เขียน java app มันซะเลย

ใครมีวิธีดีกว่านี้บอกให้หายโง่หน่อยเถอะครับ

.

mysql กับภาษาไทย อีกรอบ

เนื่องจากครั้งก่อนได้มีการแก้ mysql ให้ใช้ไทยได้ พบว่ามันไม่ค่อยสะดวก เลยหาวิธีใหม่ซึ่งง่ายกว่านั้น สั่ง server ให้ default charset เป็น tis620 ซะเลยง่ายดี

วิธีการแก้ไขก็ง่ายๆ คือ แก้ file /etc/my.cnf ซะ โดยเพิ่มเติมดังนี้

[mysqld]
port=3307
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=tis620
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

[mysql.server]
user=mysql
basedir=/var/lib
default-character-set=tis620

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set=tis620

[mysql]
default-character-set=tis620



ใ นส่วนของสีแดงคือที่เพิ่มเข้าไป จากนั้น restart service ก็ใช้ได้ตามปกติ ในที่นี้ทดลองกับ mysql version 4.1.x และ 5.0.x พบว่าใช้งานได้ดี และเหตุผลที่เพิ่ม [mysql] เข้าไปเนื่องจากเวลาใช้งาน mysql shell จะได้มี default charset เป็น tis620 ด้วย เผื่อทำการ import sql


และในส ่วนของ phpMyAdmin ที่เคยใช้แล้วมีปัญหา ได้ทดลองเอา version phpMyAdmin-2.7.0-pl1 มาใช้งาน และเลือก connection collation เป็น tis620_thai_ci พบว่าใช้งานได้ดีเหมือนกัน

.

วันอังคาร, ธันวาคม 13, 2548

startup scritp vsftpd บน solaris9

จากที่ผ่านมาได้มีการลง vsftpd server บน solaris9 พบว่ามีปัญหาเกิดขึ้นเมื่อ user ทำการ reboot เครื่องแล้ว service vsftpd ไม่ได้ start (ที่มันไม่ start เพราะไม่ได้ใส่ไว้อ่ะดิ)

เลยมาทำการแ ก้ปัญหาให้ user โดยจัดการให้ ตอนแรกว่าจะใส่ใน rc.local ง่ายดี พบว่ามันไม่มีนี่หว่า สุดท้ายพบว่าต้องมาเขียนเองซะแล้ว ใครมีหนทางที่ดีกว่านี้เสนอมาหน่อยเถอะ เกิดมี service ที่ต้องใสใ่เข้าไปอีก มาเขียนตลอดคงไม่ไหว


ขั้นแรกเขียน rc script ขึ้นมาซะ โดยมีรายละเอียดดังนี้ (เอา mysql script บางส่วนมาเป็นแนวทาง)

#!/bin/bash
# Copyright Sudkhet C. 2005
# This file is public domain and comes with NO WARRANTY of any kind

# vsftpd daemon start/stop script.

# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S51vsftpd and /etc/rc0.d/K07vsftpsd.
# When this is done the vsftpd server will be started when the machine is
# started and shut down when the systems goes down.
exec_daemon=/usr/sbin/vsftpd
conf_daemon=/etc/vsftpd/vsftpd.conf
pid_file=/var/run/vsftpd.pid

case "$1" in

start)
# Start daemon.
$exec_daemon $conf_daemon &
pid=$!
echo $pid > $pid_file
echo "Start vsftpd Done!."
;;

stop)
# Stop daemon. We use a signal here to avoid having to know the
if test -s "$pid_file"
then
vsftpd_pid=`cat $pid_file`
echo "Killing vsftpd with pid $vsftpd_pid"
kill $vsftpd_pid
# vsftpd should remove the pid_file when it exits, so wait for it.

sleep 1
while [ -s $pid_file -a "$flags" != aaaaaaaaaaaaaa ]
do
[ -z "$flags" ] && echo $echo_n "Wait for vsftpd to exit$echo_c" || echo $echo_n ".$echo_c"
flags=a$flags
sleep 1
done

if [ -s $pid_file ]
then echo " gave up waiting!"
elif [ -n "$flags" ]
then echo " done"
fi
# delete lock for RedHat / SuSE
if test -f $pid_file
then
rm -f $pid_file
fi
else
echo "No vsftpd pid file found. Looked for $pid_file."
fi
;;

*)
# usage
echo "Usage: $0 start|stop|restart"
exit 1
;;
esac

  1. จากนั้นก็ save ในชื่อ vsftpd แล้วเอาไปไว้ที่ /etc/init.d/vsftpd
  2. ทำการ change mode และ permission โดยสั่งดังนี้
    # chmod 744 vsftpd
    # chown root:sys vsftpd
  3. จากนั้นให้เพิ่มในส่วนของ startup และ shutdown ที่อยู่ใน rc โดยทำดังนี้
    # cp vsftpd /etc/rc3.d/S51vsftpd
    # cp vsftpd /etc/rc0.d/K17vsftpd
    # chown root:sys /etc/rc3.d/S51vsftpd
    # chown root:sys /etc/rc0.d/K17vsftpd
  4. จากนั้นลอง reboot เครื่องทดสอบพบว่าใช้การได้ดี


มีข้อผิดพลาดตรงไหน กรุณาบอกกล่าวด้วย