Archive for the 'Linux' Category

01
เม.ย.
10

วิธีแก้ให้โชว์ menu ตอนบูต ของ Grub 2

ตอนนี้ผมใช้ Ubuntu 10.04 Lucid Lynx beta อยู่ ก็จะมีอัพเดทถี่ๆแทบทุกวัน เมื่อคืนอัพเดทมีอัพ kernel จาก 2.6.32-18-generic ไปเป็น 2.6.32-19-generic แต่ก็ยังไม่ได้ restart เครื่อง จะนอนแล้วก็ปิดเครื่องไป พอเมื่อเช้าเปิดมาเจอ

[ 58.593255 ] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

ทำอะไรไม่ได้เลย เพราะ default ของ grub2 ที่มากับ lucid มันไม่แสดง menu ให้เลือก มันเลือกบูตจาก kernel ตัวล่าสุดไปเลย

ทำอะไรไม่ได้ก็เลยต้องหาแผ่น Live CD มาบูต ดีมีแผ่น Suriyan ที่ได้จากงาน miniDebCamp ติดกระเป๋า ก็เลยบูตเข้าไปที่ Suriyan ตัว Suriyan เองพัฒนาต่อมาจาก 9.10 Karmic ก็เลยใช้ grub2 เหมือนกัน

ตอนแรกก็ค้นหาวิธีในเนต หายังไงก็ไม่เจอ ก็เลยคิดว่าจะลองบูตเข้าไปที่ kernel ตัวเก่า ก็เลยหาวิธีแก้ให้มันแสดง menu ตอนบูต ปัญหาคือมันเป็น grub2 ซึ่งเปลี่ยนวิธี config ไปจากเดิมอย่างสิ้นเชิง ของเก่าเคยแก้แค่ไฟล์ menu.lst แค่ไฟล์เดียว ตอนนี้เข้าไปก็ไม่เจอไฟล์ menu.lst แล้ว

ค้นไปค้นมาไปเจอ document ของมันที่ https://wiki.ubuntu.com/Grub2 บอกวิธีแก้ให้มันแสดงเมนูโดยไปแก้ที่ไฟล์ /etc/default/grub ให้คอมเม้นที่

#GRUB_HIDDEN_TIMEOUT=3

และ ปรับค่าจำนวนเวลาที่จะแสดง menu ที่

GRUB_TIMEOUT=XXX

เสร็จแล้วให้เรียกคำสั่ง update-grub

แต่ว่า เราใช้ Suriyan บูต ทำให้มันไม่มอง drive ที่เรา mount เป็น root (/) ต้องเปลี่ยนด้วยคำสั่ง chroot ก่อน

ด้านล่างของ document จะมีบอกวิธี chroot แต่ว่าก่อนจะ chroot จะทำการ –bind พวก /dev /proc และ /sys ก่อน ด้วยคำสั่ง ประมาณนี้

$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys

ข้างหลังตรง /mnt/dev ก็คือชี้ไปที่ path ของรูทที่เรา mount ไว้ก่อน
หลังจากนั้น ใช้คำสั่ง

$ sudo chroot /mnt

เพื่อเปลี่ยน root directory โดย /mnt คือ path ของ drive อื่นที่ mount ไว้ หลังจากนั้นก็แก้ตามที่บอกข้างบน แล้ว reboot คราวนี้ก็จะเห็น menu แล้ว

สุดท้ายวิธีแก้ kernel panic ก็คือ บูตไป kernel เก่า แล้วไป apt-get remove ตัว kernel ใหม่ เสร็จแล้ว apt-get install ใหม่อีกที หายเลยทีนี้

06
ม.ค.
10

My Shell History

เห็น blog ของ @llun ทำ ลองดูบ้าง

history | awk ‘{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] ” ” CMD[a]/count*100 “% ” a;}’ | grep -v “./” | column -c3 -s ” ” -t | sort -nr | nl |  head -n10
1    126  25.2%  vim
2    92   18.4%  cd
3    86   17.2%  ls
4    68   13.6%  erl
5    26   5.2%   clisp
6    25   5%     ghci
7    24   4.8%   sudo
8    12   2.4%   exit
9    6    1.2%   kill
10    5    1%     ssh

เออ ช่วงนี้มี erl, clisp, ghci เยอะแฮะ ตอนแรกเดาว่า cd เยอะสุด แต่ก็ยังแพ้ VIM เหอะๆ ไม่มี emacs เลย

15
เม.ย.
08

My (shell) History

$ history|awk ‘{a[$2]++} END{for(i in a){printf “%5d\t%s\n”,a[i],i}}’|sort -rn|head
144   sudo
86   cd
75   ls
36   vim
33   exit
15   python
7   postgres
6   ./catalina.sh
5   psql
5   firefox3-4

09
พ.ย.
07

split vim viewport และ find and replace

split vim viewport { http://www.linux.com/articles/54157 }

AND

find and replace { http://www.vim.org/tips/tip.php?tip_id=31 }

01
พ.ย.
07

เพิ่ม menu ให้กับ menu popup บน ubuntu

หน้า desktop ของ ubuntu นั้นถูกควบคุมด้วยโปรแกรม nautilus เมื่อเราคลิ๊กขวาจะเห็น menu popup ขึ้นมา
ถ้าลงปกติก็จะเห็นว่ามันมีเมนู
popupmenu

ต่อไปผมจะทำการเพิ่ม menu ลงไปอีกอันคือ Display Setting ซึ่งผมจะให้มันเรียกโปรแกรม displayconfig-gtk ซึ่งเป็นโปรแกรมในการ ตั้งค่าต่างๆของ จอ เริ่มแรกก็ทำการโหลด source code ของ nautilus มาก่อนด้วยคำสั่ง

sudo apt-get source nautilus

แล้วก็ทำการโหลด เครื่องมือที่จำเป็นในการ build ผ่านทางคำสั่ง

sudo apt-get build-dep nautilus

แล้วก็เข้าไปแก้โค้ดที่ nautilus-2.20.0/src/file-manager/fm-desktop-icon-view.c

โดยจะทำการเพิ่มโค้ดฟังก์ชัน ที่จะเป็น callback โดยจะถูกเรียกใช้งานเมื่อเมนูถูกคลิ๊ก ดังนี้

static void

action_display_setting_callback (GtkAction *action,

gpointer data)

{

g_assert (FM_DIRECTORY_VIEW (data));

nautilus_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)),

_(“Display Setting”),

“gksudo displayconfig-gtk”,

NULL,

FALSE);

}
จากนั้นให้ทำการเพิ่ง ข้อมูลลงไปใน อาเรย์ desktop_view_entries ดังนี้

/* name, stock id */

{ “Display Setting”, NULL,

/* label, accelerator */

N_(“Display Setting”), NULL,

/* tooltip */

N_(“Setting a display properties”),

G_CALLBACK (action_display_setting_callback) },

เสร็จแล้วก็เซฟไฟล์นี้

ต่อไปจะไปแก้ที่ไฟล์ nautilus-2.20.0/src/file-manager/nautilus-desktop-icon-view-ui.xml

โดยเพิ่ม tag ต่อไปนี้ลงไปใน tag <popup name=”background”>


<placeholder name=“After Zoom Items”>

<placeholder name=“Display Items”>

                <menuitem name=“Display Setting” action=“Display Setting”/>

</placeholder>

</placeholder>

แล้วก็ เซฟไฟล์ แล้วแล้วก็ทำการ
./configure
make
sudo make install
ตามลำดับ  ก็จะได้ nautilus อันใหม่ที่มี menu popup บน desktop ที่มี menu ใหม่เพิ่มขึ้นมาดังรูป

popupmenu_after_edit

16
ต.ค.
07

list_entry กับ container_of

ในไฟล์ include/linux/list.h

/**
* list_entry – get the struct for this entry
* @ptr:        the &struct list_head pointer.
* @type:       the type of the struct this is embedded in.
* @member:     the name of the list_struct within the struct.
*/
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)

ในไฟล์ include/linux/kernel.h

/**
* container_of – cast a member of a structure out to the containing structure
* @ptr:        the pointer to the member.
* @type:       the type of the container struct this is embedded in.
* @member:     the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({                      \
const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
(type *)( (char *)__mptr – offsetof(type,member) );})

list_entry ทำหน้าที่ในการส่งค่าตำแหน่งของ struct ของ entry ที่เก็บตำแหน่งของ list นี้อยู่ (ที่ ptr ชี้อยู่)

09
ต.ค.
07

สลับชื่อไฟล์

ไม่มีไรมากก็ใช้ลีนุกซ์ ปกติทุกวัน ปกติจะเปลี่ยนชื่อไฟล์ใน terminal ก็ใช้ mv oldname newname แล้วก็มีเรื่องให้ต้องทำการเปลี่ยนชื่อไฟล์สลับกันไปมา เช่น จาก source.list.bak ไปเป็น source.list แล้วก็ให้ source.list ไปเป็น source.list.bak พูดง่ายๆก็คือสลับชื่อมันระหว่างไฟล์สองไฟล์นั่นเอง ถ้าจะสั่งด้วย mv มันก็จะได้สาม step

mv source.list source.tmp
mv source.list.bak source.list
mv source.tmp source.list.bak

อืม..กรณีนี้อาจได้ใช้บ่อยๆ ก็เลยกะเอาไปเขียนเป็นโปรแกรมซะเลย ??? ใช้อะไรดีละ C ดีมั้ย python หรือ perl เฮ่อๆๆ ไม่จำเป็นต้องขนาดนี้ก็ได้ ใช้ shell script นั่นแหละ ก็เลยเขียน shell script ขึ้นมาตัวนึง ไม่ได้ซับซ้อนอะไร เพราะก็เพิ่งหัดเขียนเหมือนกัน ตั้งชื่อว่า swn.sh swn ย่อมาจาก swap file name เฮ่อๆๆ ไม่รู้มันจะตรงความหมายไหม ช่างมันเถอะ ดูโค้ดละกัน

#!/bin/sh
#รับค่า command line argument ตัวแรก เก็บในตัวแปร file1
file1=$1
#รับค่า command line argument ตัวที่สอง เก็บในตัวแปร file2
file2=$2
#สร้างตัวแปร เก็บชื่อไฟล์ที่ใช้ช่วยในการสลับชื่อ
temp=”tmp”

# เปลี่ยนชื่อ $file1 เป็น $temp
mv $file1 $temp

# เปลี่ยนชื่อ $file2 เป็น $file1
mv $file2 $file1

# เปลี่ยนชื่อ $temp เป็น $file2
mv $temp $file2

เสร็จแล้วก็อย่าลืมเปลี่ยนโหมดให้ execute ได้ โดยสั่ง chmod +x swn.sh แล้วก็ย้ายไปอยู่ใน /usr/bin โดยสั่ง sudo cp swn.sh /usr/bin/swn.sh

เวลาเรียกใช้งานก็ swn.sh file1 file2 จะทำให้ ไฟล์สองไฟล์นี้สลับชื่อกันนั่นเอง