Showing posts with label file. Show all posts
Showing posts with label file. Show all posts

Wednesday, June 20, 2012

UNIX Programming

ทั้ง ๒ entries ที่ผ่านมา คือ program arguments  และ stdin/stdout  นั้น ถือเอาเป็น ตอนที่ I น่ะครับ นั่นเป็นเรื่องของ terminal ล้วนๆ ที่ไม่ต้องลำบากในการ “เปิด” และ “ปิด” อะไรให้ยุ่งยากแต่อย่างใดเลย  ใน entry นี้จะเป็นเรื่องที่ พิเศษ มาอีกนิดหนึ่ง  เชิญครับ

“STANDARD I/O LIBRARY”
standard I/O library (ต่อไปจะเรียกแต่สั้นๆว่า library) เป็นการรวบรวม routines ต่างๆ ไว้ที่เดียวกัน เพื่อให้เกิด ประสิทธิภาพ ของงานบริการด้าน I/O สำหรับโปรแกรมภาษา C และเพื่อให้สามารถใช้งานที่ไหนก็ได้  library นี้มีอยู่ในทุกๆระบบที่สนับสนุนภาษา C ดังนั้นโปรแกรมจึงสามารถโยกย้ายจากระบบหนึ่ง ไปยังอีกระบบอื่นได้โดยไม่ต้องแก้ไขเปลี่ยนแปลงอะไรเลย

“(๒.๑) File Access

โปรแกรมที่ยกมาให้ดูในตอน I นั้นทุกโปรแกรม อ่านข้อมูลจาก stdin และ เขียนผลลัพธ์ลงสู่ stdout ซึ่งได้นิยามเอาไว้ดีแล้ว และ โปรแกรม สามารถติดต่อได้โดยตรง    ในลำดับถัดมาเราจะเขียนโปรแกรมที่ต้องเข้าถึงแฟ้มเอกสาร ที่ยังไม่มีการติดต่อ กับโปรแกรม มาก่อนเป็นที่เรียบร้อยแล้ว เหมือนดั่งในกรณี stdin/stdout นั้น      ตัวอย่างง่ายๆ ได้แก่โปรแกรม wc ซึ่งนับจำนวนอักขระ จำนวนคำ จำนวนบรรทัดในแฟ้มเอกสารต่างๆ  เช่น

% wc x.c y.c

ก็จะพิมพ์ จำนวนบรรทัด คำ และอักขระในแฟ้มทั้งสอง และ จำนวนรวมแต่ละอย่างออกมา เป็นต้น

ปัญหาคือ เราจะให้แฟ้มเหล่านั้นถูกอ่านได้อย่างไรกัน นั่นคือจะเอาชื่อแฟ้ม ไปเชื่อมต่อกับประโยคทาง I/O ที่อ่าน-เขียนข้อมูลจริงๆ ได้อย่างไรกัน

กฏที่วางเอาไว้นั้น ง่ายมาก คือ ก่อนที่แฟ้มจะถูกอ่าน หรือ เขียน แฟ้มเอกสารต้องได้รับ การเปิด ก่อน ด้วยฟังก์ชั่นมาตรฐานใน library นี้ที่ชื่อ fopen.   ฟังก์ชั่นนี้ , fopen, จะเอาชื่อแฟ้มมา, ในที่นี้คือ x.c y.c ,  ดำเนินการบันทึกเป็นเบื้องต้นไว้ แล้วติดต่อ ถกเถียงกับระบบปฏิบัติการ  และ ได้ค่า ชื่อในวงการ มา ซึ่งจะใช้ชื่อนี้แหละ สำหรับการอ่าน และ การเขียนในลำดับต่อๆไป

ชื่อในวงการ นี้จะเป็น pointer, เรียกกันว่า file pointer, ที่ชี้ไปยัง structure ที่มีรายละเอียดของแฟ้ม เช่น ตำแหน่งของ buffer  ตำแหน่งปัจจุบันของอักขระใน buffer  แฟ้มนี้จะเปิดสำหรับอ่าน หรือ เปิดสำหรับเขียน และอื่นๆ  ซึ่งผู้ใช้งาน ไม่จำเป็นต้องรู้เลยแม้แต่น้อยนิดเกี่ยวกับ structure นี้ เพราะแฟ้ม stdio.h ได้ให้นิยามของ structure เอาไว้แล้ว ภายใต้ชื่อ FILE

สิ่งที่จำเป็นต้องระบุไว้ ก็มีเพียง การประกาศใช้งาน FILE เท่านั้น ดังตัวอย่าง

FILE *fp, *fopen();

ซึ่งบอกว่า fp เป็น pointer ไปยัง FILE และ fopen เป็นฟังก์ชั่นที่คืนค่า pointer มายัง FILE  ขอให้ทราบเอาง่ายๆว่า FILE นั้นเป็น ชนิดๆหนึ่ง คล้ายๆกับ int นั่นเอง อย่าคิดมาก

การเรียกใช้งานของฟังก์ชั่น fopen ก็ตรงไปตรงมา ดังนี้

    fp = fopen(name, mode);

โดยที่ name เป็นชื่อแฟ้มเอกสารที่เราต้องการทำงานด้วย   และ   mode นั้นคือลักษณะการทำงานกับแฟ้มเอกสารนั้นว่า เราจะ  อ่าน("r") หรือ เขียน("w") หรือ เขียนต่อท้าย("a") ทั้ง name และ mode เป็นอักขระ

ถ้าแฟ้มที่เราต้องการเปิดเพื่อ เขียน หรือ เขียนต่อท้าย นั้นยังไม่มี แฟ้มก็จะถูกสร้างขึ้นมา  การเปิด แฟ้มเอกสารที่มีอยู่แล้ว เพื่อ เขียน นั้น มีผลให้ สาระของแฟ้มเอกสารนั้น ถูกเขียนทับไป  และความพยายาม ที่จะอ่านแฟ้ม ที่ไม่มีอยู่เลย ยังผลให้ เกิด ความผิดพลาด ขึ้นมา   ในกรณีที่เกิด ความผิดพลาด ขึ้น ฟังก์ชั่น fopen จะคืนค่า NULL ซึ่งเป็น null pointer มาให้ผู้ใช้งาน และค่านี้ ได้รับ การนิยาม ไว้แล้ว ในแฟ้ม stdio.h

ในลำดับถัดมา ที่จำเป็นต้องทำคือ การอ่าน หรือ การเขียน หลังจากแฟ้มเอกสารได้รับ การเปิด ขึ้นมาแล้ว    ในการนี้ สามารถกระทำได้หลายทาง แต่ที่ง่ายที่สุดคือ  getc  และ  putc   โดยที่ getc จะคืนค่าถัดมาจากแฟ้มที่อ่าน มาให้, ฟังก์ชั่นนี้ ต้องการ file pointer เพื่อบอกว่า จะเอาจากแฟ้มไหน ดังนี้แล้ว

    c = getc(fp);

ก็จะนำค่าจากแฟ้มเอกสารที่อ้างอิงถึงโดย file pointer fp นั้น มาไว้ยัง c  และฟังก์ชันนี้ จะคืนค่า EOF ในกรณีที่อ่านไป จนถึงตำแหน่งสุดท้าย ของแฟ้มเอกสารแล้ว    putc  ก็จะกลับกันกับ  getc  กล่าวคือ

    putc(c, fp);

จะนำค่าอักขระ c ไปเก็บไว้ยังแฟ้ม ที่ชี้ไปโดย fp  แล้วคืนค่า c กลับมา    ทั้ง ๒ ฟังก์ชั่น จะคืนค่า  EOF ในกรณีที่เกิดความผิดพลาดขึ้น

อนึ่ง เมื่อโปรแกรมเริ่มทำงานนั้น แฟ้ม ๓ แฟ้มจะ ถูกเปิด ให้โดย อัตโนมัติทันที และ file pointer ก็จะกำหนดให้ ในทันที โดยอัตโนมัติ ด้วยเช่นกัน คือ  standard input, standard output และ standard error และ file pointer ของทั้ง ๓ นี้คือ stdin, stdout, stderr ตามลำดับ  และโดยปกติแล้ว ทั้ง ๓ file pointer นี้จะต่อตรงกับ terminal เสมอ แต่ก็อาจจะ redirect ไปยังที่อื่น หรือ pipe ต่อไปยังโปรแกรมอื่น อีกก็ได้  stdin, stdout, stderr นั้นเป็นวัตถุ ที่นิยามไว้แล้ว ในชนิด FILE * จึงสามารถใช้ได้กับวัตถุอื่นใด ที่เป็นชนิด FILE * ได้

เอาล่ะ เมื่อได้ความรู้มาเท่านี้แล้ว เรามาลองยกร่างโปรแกรมง่ายๆ ที่ชื่อ wc กันดูบ้าง ดังนี้

ถ้าโปรแกรมนี้ มี arguments มันก็จะ process arguments ไปจนหมด ถ้าไม่มี ก็จะรับจาก standard input  ซึ่งโดยลักษณะนี้ ทำให้โปรแกรม สามารถเรียกใช้งาน แบบเดี่ยวๆ ได้ หรือ สามารถใช้ร่วม เป็นส่วนหนึ่ง ของ process ใหญ่ได้    โปรแกม wc มีรายละเอียด, แฟ้มชื่อ wc.c,  และ Makefile ดังนี้

/*
 * wc.c
 */ 

#include <stdio.h>

int main(argc, argv)
int argc;
char *argv[];
{
  int c, i, inword;
  FILE *fp, *fopen();
  long linect, wordct, charct;
  long tlinect = 0, twordct = 0, tcharct = 0;

  i = 1;
  fp = stdin;
  do {
    if (argc > 1 && (fp=fopen(argv[i], "r")) == NULL) {
      fprintf(stderr, "wc: can't open %s\n", argv[i]);
      continue;
    }
    linect = wordct = charct = inword = 0;
    while((c = getc(fp)) != EOF) {
      charct++;
      if (c == '\n')
    linect++;
      if (c ==  ' ' || c == '\t' || c == '\n')
    inword = 0;
      else if (inword == 0) {
    inword = 1;
    wordct++;
      }
    }
    printf("%7ld %7ld %7ld", linect, wordct, charct);
    printf(argc > 1 ? " %s\n" : "\n", argv[i]);
    fclose(fp);
    tlinect += linect;
    twordct += wordct;
    tcharct += charct;
  } while (++i < argc);
  if (argc > 2)
    printf("%7ld %7ld %7ld total\n", tlinect, twordct, tcharct);
  return(0);
}



ฟังก์ชั่น fprintf ก็เหมือนกับฟังก์ชั่น printf เพียงแต่เราระบุ file pointer ชนิด FILE ไว้เป็น argument แรกก่อนเขาอื่น เท่านั้นเอง 

ฟังก์ชั่น fclose ก็เป็นฟังก์ชั่น ที่ตรงข้ามกับ fopen  มันทำหน้าที่ ตัดการเชื่อมต่อ ระหว่าง file pointer และ ชื่อข้างนอก ที่สร้างขึ้นมา โดยฟังก์ชั่น fopen นั้น และ ปลดปล่อย file pointer นั้น เพื่อให้ระบบ สามารถมี file pointer ไว้ใช้งานได้พอเพียง 

ขณะเดียวกัน fclose ก็จะกวาดล้าง buffer ที่ฟังก์ชั่น putc ได้รวบรวมเอาไว้นั้น ออกมาด้วยพร้อมกันเลย ฟังก์ชั่น fclose นี้ จะถูกเรียกมาโดยอัตโนมัติ ในทุกโปรแกรมที่ หยุดการทำงาน

และนี่คือ Makefile ของแฟ้มโปรแกรมที่ใช้ชื่อว่า wc.c

CC=clang
CFLAGS= -g
PROG= wc
SRCS= wc.c

NO_MAN=

.include <bsd.prog.mk>


อนึ่ง หากท่านสนใจในเรื่องของ Makefile ลองเข้าไปอ่านดูได้ที่ /usr/share/mk/bsd.README และแฟ้มอื่นๆ ที่เกี่ยวข้องได้ครับ

ขออนุญาตพัก ตอน II ช่วงแรกไว้ ที่นี่ก่อนครับ  ขอขอบคุณ ที่สละเวลามาอ่าน

Friday, August 28, 2009

FreeBSD: introducing sysinstall

รู้จักกับ Sysinstall

sysinstall เป็น โปรแกรมอรรถประโยชน์ ที่ให้มาโดย โครงการ FreeBSD ทำงานบนพื้นฐานของ console ที่แบ่งออกเป็นหลายหลาย เมนู และ จอแสดงผล ที่ท่านสามารถใช้ในการ ปรับ และ ควบคุม ลำดับขั้นตอนการติดตั้ง

ระบบควบคุมเมนูของ sysinstall นั้นประกอบด้วย ปุ่มลูกศร ปุ่ม Enter, Tab, Space และปุ่มอื่นๆอีกบ้าง คำบรรยายโดยละเอียดของ ปุ่ม เหล่านี้ และมันทำหน้าที่อะไร ได้บอกไว้ในข้อมูลการใช้งานของ sysinstall

เพื่อทบทวนข้อมูลเรื่องนี้ ขอให้แน่ใจว่า ได้วางแถบไว้บน Usage และเลือก Select นั้นตามรูป แล้วก็กัดปุ่ม Enter

คำสั่ง สำหรับการใช้งานระบบเมนู จะแสดงมาให้เห็น เมื่อท่านทบทวนจนหนำใจแล้ว ให้กดปุ่ม Enter เพื่อกลับมายัง เมนูหลัก

เลือกเมนูเอกสาร

จากเมนูหลัก ใช้ปุ่มลูกศร เลือก Doc แล้วกดปุ่ม Enter

ซึ่งจะแสดงเมนูของเอกสารทั้งหมด

เป็นสิ่งสำคัญมาก ที่ต้องอ่านที่มอบให้มา

เพื่อทบทวนเอกสาร ใช้ปุ่มลูกศรเลือกเอกสาร แล้วกดปุ่ม Enter เมื่อจบแล้ว กัดปุ่ม Enter อีกครั้ง ก็จะนำท่านกลับมาสู่ เมนูเอกสาร

เลือก Exit แล้วกด Enter ก็จะกลับมาเมนูหลัก ติดตั้ง

เลือกเมนู keymap

ท่านสามารถเปลี่ยน ชุดแป้นพิมพ์ ได้โดยง่าย โดยการเลือก Keymap จากเมนู แล้วกดปุ่ม Enter ซึ่งสิ่งนี้ จำเป็นก็ต่อเมื่อท่านใช้ แป้นพิมพ์ที่ไม่ใช่ภาษาโรมัน

แป้นพิมพ์อื่นๆ สามารถเลือกเปลี่ยนเอาได้ โดยการเลือกเอาจากเมนู โดยการใช้ปุ่มลูกศรขึ้น/ลง และกดปุ่ม Space ซึ่งปุ่มนี้ เมื่อกดซ้ำ ก็จะทำให้เกิด การไม่เลือก จากที่ ได้เลือก ไว้แล้วนั้น เมื่อเสร็จแล้ว ให้เลือก [ OK ] โดยใช้ปุ่มลูกศร แล้วกดปุ่ม Enter

ตอนนี้รายการแป้นพิมพ์ จะแสดงให้เห็นเพียงบางส่วน เท่านั้น เลือก [ Cancel ] โดยใช้ปุ่ม Tab จะทำให้ท่านใช้แป้นพิมพ์จากที่กำหนด โครงการ และกลับคืนสู่ เมนูติดตั้งหลัก

หน้าจอ Installation Options

รูปที่ ๑๐ เมนูหลักของ Sysinstallรูปที่ ๑๐

เลือก Option แล้วกด Enter รูปที่ ๑๐ เป็นเมนูหลักของ Sysinstall

สำหรับรายละเอียดต่างๆของ Sysinstall Option ดูได้จากรูป ๑๑

รูป ๑๑ Sysinstall Optionรูปที่ ๑๑ Sysinstall Option

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

คำบรรยายของ หัวข้อที่เลือก จะปรากฏด้านล่างขอจอภาพ ในสีน้ำเงิน และเป็นตัวหนังสือเข้ม โปรดสังเกตุด้วยว่า option หนึ่งที่ให้ไว้คือ Use Defaults ซึ่งจะกลับค่าต่างๆ คืนสู่สภาวะที่กำหนดไว้จาก โครงการ FreeBSD

กด F1 เพื่ออ่านคำช่วยเหลือสั้นๆ ของแต่ละ option (ไม่อยากแปลคำนี้ เลยขอใช้ทับคำไปเลย) ที่หน้าจอภาพ สำหรับ แสดงความช่วยเหลือ (มันเป็นคำฟุ่มเฟือยรึเปล่า ช่วยดูด้วยครับ ไม่มี ก็ได้ใจความเปี่ยมสาระ น่ะ)

กด Q เพื่อ ออกและกลับสู่ เมนูหลักของการติดตั้ง

เริ่มต้น การติดตั้งด้วยค่ามาตรฐาน

การติดตั้งค่าแบบ Standard เป็นการติดตั้งที่ใคร่ขอแนะนำให้ใช้ สำหรับผู้ที่ ใหม่ต่อ UNIX ® หรือ FreeBSD โปรดใช้ปุ่มลูกศรเพื่อวางแถบไว้ตรง Standard แล้วกดปุ่ม Enter เพื่อเริ่มต้นการติดตั้ง

รูป ๑๒ เริ่มต้นการติดตั้งด้วยค่ามาตรฐาน รูป ๑๒ เริ่มต้นการติดตั้งด้วยค่ามาตรฐาน

Thu Sep 3 09:12:49 ICT 2009

Monday, August 24, 2009

FreeBSD: installation ---> sysinstall

เริ่มต้นติดตั้ง

สำคัญ

โดยมารยาท การติดตั้งจะไม่ทำให้ hard disk ของท่านเกิดการ เขียนลง แต่อย่างใด ตราบเท่าที่ท่านยังไม่เห็นข้อความต่อไปนี้
Last Chance: Are you SURE you want continue the installation?

If you're running this on a disk with data you wish to save then WE
STRONGLY ENCOURAGE YOU TO MAKE PROPER BACKUPS before proceeding!

We can take no responsibility for lost disk contents!

The install can be exited at any time prior to the final warning without changing the contents of the hard
drive. If you are concerned that you have configured something incorrectly you can just turn the
computer off before this point, and no damage will be done.

ซึ่งอันนี้ ไม่แปลหรอกน่ะ ขอให้รู้ว่า นี่คือข้อความ สุดท้าย ที่ท่านต้องตัดสินใจ ว่าจะทำต่อ หรือ หยุดเท่่านี้

การเปิดเครื่องเปิดให้ระบบทำงาน

สำหรับเครื่องที่ใช้ i386

  1. เริ่ม ด้วยเครื่องคอมพิวเตอร์ที่ท่านจะติดตั้งนั้น ปิดไม่ให้กระแสไฟฟ้าเข้า
  2. เปิดเครื่องคอมพิวเตอร์ของท่านให้กระแสไฟฟ้าเข้า และได้เรียนให้ทราบแต่แรกแล้ว ว่า เราจะเลือกใช้ วิธี boot จาก cdrom ดังนั้น ขอให้ท่าน ใช้วิชา ทำให้เครื่องของท่าน boot จาก cdrom ให้ได้ สำหรับตอนนี้
  3. FreeBSD จะเริ่ม boot และท่านจะเห็นข้อความดังต่อไปนี้
    Booting from CD-Rom...
    CD Loader 1.2

    Building the boot loader arguments
    Looking up /BOOT/LOADER... Found
    Relocating the loader and the BTX
    Starting the BTX loader

    BTX loader 1.00 BTX version is 1.01
    Console: internal video/keyboard
    BIOS CD is cd0BIOS drive C: is disk0
    BIOS drive D: is disk1
    BIOS 639kB/261120kB available memory

    FreeBSD/i386 bootstrap loader, Revision 1.1

    Loading /boot/defaults/loader.conf
    /boot/kernel/kernel text=0x64daa0 data=0xa4e80+0xa9e40 syms=[0x4+0x6cac0+0x4+0x88e9d]
    \
  4. ขบวนการ boot ก็จะดำเนินไป จนกระทั่งท่านได้พบกับ FreeBSD boot loader menuFreeBSD boot loader menuรูป FreeBSD Boot Loader Menu

    ในตอนนี้ ท่านเพียงแต่เลือกเอาว่า จะรอ ๑๐ วินาฑี หรือ เคาะแป้นพิมพ์ Enter

ตรวจทาน ผลการสืบเสาะอุปกรณ์ต่างๆประจำเครื่อง

ข้อความตัวหนังสือ สักประมาณ หลายร้อยบรรทัดสุดท้าย ที่แสดงออกมาทางจอภาพนั้น จะถูกเก็บไว้ และ สามารถตรวจสอบได้ในภายหลัง

ในการที่จะตรวจทาน ทำได้ง่ายๆโดยการกัดปุ่ม Scroll Lock ซึ่งจะทำให้ท่าน เลื่อนจอภาพ ขึ้น-ลง ได้ โดยการใช้ปุ่ม PgUp หรือ PgDn หรือ ลูกศรขึ้น ลูกศรลง เพื่อตรวจทาน และเมื่อ หนำใจ แล้ว ก็กัดปุ่ม Scroll Lock อีกครั้ง เพื่อหยุด การเลื่อน จอภาพ และ ทำให้ จอภาพ กลับสู่สภาวะเดิม

เอาซิ ลองเลย เดี๋ยวนี้เลย เพื่อตรวจสอบ ข้อความ ที่ล้นจอภาพ จากการที่ kernel ดำเนินการ สืบเสาะ อุปกรณ์ต่างๆ ท่านจะพบกับตัวหนังสือ คล้ายๆกับรูปที่แสดงข้างล่างนี่แหละ ของจริง จากเครื่องของท่าน สมควร แตกต่าง ไปจากนี้บ้าง ก็ไม่ต้องตกอกตกใจไปน่ะ

รูป ตัวอย่างผลการสืบเสาะอุปกรณ์

avail memory = 253050880 (247120K bytes) 
Preloaded elf kernel "kernel" at 0xc0817000.
Preloaded mfs_root "/mfsroot" at 0xc0817084.
md0: Preloaded image </mfsroot> 4423680 bytes at 0xc03ddcd4

md1: Malloc disk
Using $PIR table, 4 entries at 0xc00fde60
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
pcib1:<VIA 82C598MVP (Apollo MVP3) PCI-PCI (AGP) bridge> at device 1.0 on pci0
pci1: <PCI bus> on pcib1
pci1: <Matrox MGA G200 AGP graphics accelerator> at 0.0 irq 11
isab0: <VIA 82C586 PCI-ISA bridge> at device 7.0 on pci0
isa0: <iSA bus> on isab0
atapci0: <VIA 82C586 ATA33 controller> port 0xe000-0xe00f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0 <VIA 83C572 USB controller> port 0xe400-0xe41f irq 10 at device 7.2 on pci0
usb0: <VIA 83572 USB controller> on uhci0
usb0: USB revision 1.0
uhub0: VIA UHCI root hub, class 9/0, rev 1.00/1.00, addr1
uhub0: 2 ports with 2 removable, self powered
pci0: <unknown card> (vendor=0x1106, dev=0x3040) at 7.3
dc0: <ADMtek AN985 10/100BaseTX> port 0xe800-0xe8ff mem 0xdb000000-0xeb0003ff irq 11 at device 8.0 on pci0
dc0: Ethernet address: 00:04:5a:74:6b:b5
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
ed0: <NE2000 PCI Ethernet (RealTek 8029)> port 0xec00-0xec1f irq 9 at device 10.0 on pci0
ed0 address 52:54:05:de:73:1b, type NE2000 (16 bit)
isa0: too many dependant configs (8)
isa0: unexpected small tag 14
orm0: <Option ROM> at iomem 0xc0000-0xc7fff on isa0
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5'' drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq1 on atkbdc0
kbd0 at atkbd0
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: model Generic PS/@ mouse, device ID 0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
pppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/15 bytes threshold
plip0: <PLIP network interface> on ppbus0
ad0: 8063MB <IBM-DHEA-38451> [16383/16/63] at ata0-master UDMA33
acd0: CD-RW <LITE-ON LTR-1210B> at ata1-slave PIO4
Mounting root from ufs:/dev/md0c
/stand/sysinstall running as init on vty0
ก่อนเริ่มต้นต่อไป ขอแนะ ให้สังเกตุบรรทัดสุดท้ายไว้น่ะ ให้จำไว้ด้วยเลย ยิ่งดี ว่า เขาเขียนอะไรลงไปสังเกตุให้ดี มีประโยชน์เชียวน่ะ ถ้าท่านเรียนวิชา operating system

กรุณาดูผลลัพธ์ ของการสืบเสาะให้ละเอียดอีกครั้ง เพื่อให้แน่ใจว่า FreeBSD พบอุปกรณ์ที่ท่านมีอยู่ ถ้าเขาตรวจไม่พบ อุปกรณ์นั้น ก็จะไม่มีให้เห็น ในการนี้ การปรับแต่ง kernel สามารถทำให้ท่าน เพิ่ม อุปกรณ์นั้นๆ ที่ไม่มีใน GENERIC kernel เช่น sound card ลงไป

นับจาก RELEASE-6.2 เป็นต้นมา หลังจากผ่านขั้นตอนการสืบเสาะ ท่านก็จะเห็นรูปข้างๆนี้ โปรดใช้ ปุ่มลูกศร เพื่อเลือก ประเทศ ภูมิภาค กลุ่ม จากนั้นให้ กดปุ่ม Enter ซึ่งจะกำหนดประเทศ และ แป้นพิมพ์ ให้ท่านโดยสะดวก อ้อ มันก็ง่ายด้วยน่ะ ที่จะออกจาก sysinstall และเริ่มต้นใหม่อีกหน

ออกจาก sysinstall ใช้ปุ่มลูกศร เพื่อเลือก Exit sysinstall จาก หน้าจอเมนูหลักของ sysinstall ซึ่งท่านจะเห็นข้อความที่จอภาพดังนี้






User Confirmation Requested
Are you sure you wish to exit? The system will reboot
(be sure to remove any floppies/CDs/DVDs from the drives).
[ Yes ] No

โปรแกรม จะเริ่มต้นอีกครั้ง ถ้า cdrom ยังอยู่ และท่านเลือก [ YES ]

Fri Aug 28 10:15:48 ICT 2009

Wednesday, August 19, 2009

FreeBSD: installation

เปิดบันทึกไว้ก่อน จากที่เคยวาง ผังเวลา ไว้น่ะ freebsd วันนี้ ขอเริ่ม ตอนแรก ที่การติดตั้ง ซึ่งอย่างไรเสียก็ไม่ได้หนีไปจาก hand book ในบทที่ว่าด้วยเรื่อง installation แล้วก็ เน้นจำเพาะ intel น่ะ เพราะไม่มีปัญญาไปหา cpu อื่นมาทำให้หรอก แต่ถ้าเพื่อนๆพี่ๆท่านใด จะให้ไป ทดลองให้ดู บนสถาปัตยกรรมอื่น ก็ยินดี

มะขาม ก็คาดหวังไว้ เหมือนกับ ทีมงาน ของ FreeBSD เขาคาดหวังไว้ ในสรุปความ ที่ระบุไว้ตั้งแต่ต้นเลยเช่นกัน ว่าเมื่ออ่านจบแล้ว ท่านจะได้นั่น ได้นี่ ฯลฯ

แต่ สิ่งที่อยากจะบอกจริงๆก็คือ ดูว่า เครื่องที่ท่านมีนั้น FreeBSD จะทำงานด้วยได้มั้ย โดยให้ไปดูใน hardware lists สำหรับ release เก่าๆ แต่กับ release ที่ท่านจะลงนั้น อยู่ในแฟ้ม ชื่อ HAREWARE.TXT ไปดูน่ะ เพราะอย่างน้อยน้อย ก็เงินของท่านเองแหละ ที่จ่ายออกไปให้กับเครื่อง ท่านสมควรรู้จักมัน

เพียงเท่านี้ สาระที่เขียนในคู่มือ ตอน hardware requirement ก็หมดแล้ว

สำหรับเรื่องของ Pre-installation Task นั้น มะขาม ได้เขียนไว้ ก่อนหน้านี้แล้ว แต่ จะรวบรวมมาวางไว้ให้ทบทวน กันอีกครั้ง เพื่ออำนวยความสะดวกให้

  1. เรื่องของแฟ้ม จุดเริ่มต้น ของ...
  2. เรื่องของ hard disk
  3. การจัด partition
  4. disk layout โครงสร้างสาระบบแฟ้มเอกสาร
  5. โครงสร้างสาระบบแฟ้มเอกสาร(๑)
  6. โครงสร้างสาระบบแฟ้มเอกสาร(๒)
  7. โครงสร้างสาระบบแฟ้มเอกสาร(๓)
ซึ่งเป็นเรื่องของ hard disk และการจัด partition น่ะ

เอกสารนี้ คงไม่ได้เขียนจบภายใน ๑ วัน วันนี้ ขอจบที่ Pre installation Task ไว้ตรงนี้ก่อน แต่ ต้องมีตอนต่อไป สำหรับส่วนที่เหลือ

Wed Aug 19 11:08:37 ICT 2009

Wednesday, January 28, 2009

FreeBSD: file

งวดนี้ ใคร่ขอเสนอเรื่องราวของ แฟ้ม หรือ file แต่พอให้ได้ไอเดีย ว่าแฟ้มคืออะไร มีอะไรอยู่ในแฟ้ม ความหมายของคำว่า เจ้าเข้าเจ้าของ หรือ การได้รับอนุญาตให้ใช้งานแฟ้ม พวกนี้เป็นเบื้องต้นก่อน

อะไรคือแฟ้ม
แฟ้ม คือลำดับของ byte หรือ คำ ในภาคภาษาไทย ส่วนที่ว่า คำ ในแฟ้มจะมีความหมายอะไร อย่างไร นั้น ตัวโปรแกรม ที่อ่าน หรือ ใช้ แฟ้มนั้นเองต่างหากจะเป็นผู้ที่รู้ หรือ เข้าใจดีที่สุด

พาย จอมใจ


การที่จะรู้จัก ต้องทดลองเอง เหมือนอย่างกับว่า เขาถามว่า เกลือมันมีรสเค็ม เค็มยังไง ก็ต้องตอบว่า ให้ไปกินเกลือดูเองซี ถึงจะรู้จักรสเค็ม ฉันไดก็ฉันนั้น ท่านต้องทดลอง เล่น กับแฟ้มดูสักระยะ ซึ่งในการนี้ ท่านสมควรหาเครื่องมาไว้เพื่อใช้งานด้วย จะดีกว่าไปขอมี account กับระบบ แต่ถ้าหาเครื่องยากนัก การมี account สัก ๑ ที่ก็ไม่เลวนักหรอก

เอาเป็นว่า ท่านสามารถใช้ FreeBSD ได้ตามใจก็แล้วกัน เน้าะ

สิ่งแรก ที่อยากให้ท่านทดลองก็คือ คำสั่ง file ลองดูน่ะครับ
# file  /bin /bin/ed /bin/pwd
ตามนี้เลยน่ะ แต่ถ้าตัวหนังสือมันไม่เอียง ก็ไม่ต้องตกใจไปหรอก ไม่ต้องเอียงตามหรอกน่า อ้อ ถ้าท่านไม่รู้ว่า file คืออะไรก็ง่ายๆน่ะ เหมือนเดิม file(1)
ที่อยากให้ดูช่วงนี้ คือ ความแตกต่างของผลลัพธ์ที่ได้ ผลลัพธ์จากคำสั่งที่ท่านใช้นั่นแหละครับ บรรทัดแรก บอกว่า directory สองบรรทัดสุดท้าย เป็นแต่ข้อความยาวๆ เข้าใจยาก แต่เรารู้ว่าเป็น โปรแกรม และ แน่นอน เป็นแฟ้ม แฟ้มหนึ่ง ซึ่งจากนี้ เราสรุปว่า
  • โปรแกรม ก็คือแฟ้ม
  • directory ก็คือ แฟ้ม
เอาล่ะครับ ลองดูอีกเที่ยวละกัน
# date  >> ~/junk
จากนั้น อีกหนหนึ่งน่ะ
# file  /bin /bin/ed /bin/pwd ~/junk
ยังต้องให้อธิบายอะไรอีกมั้ยครับ สังเกตุเองน่ะ ว่า ความแตกต่าง ของผลลัพธ์ เป็นอย่างไร
มาดูกันต่ออีกนิดหนึ่งน่ะ ทำตามไปก่อนน่ะ
# echo #\!/bin/sh > junk1
# echo set -x >> junk1
# file  /bin  /bin/ed  /bin/pwd  ~/junk  junk1
สังเกตุเห็นอะไรจากผลลัพธ์เพิ่มเติมไหมครับ
มาต่อกันน่ะ
ไหมพรม ฟ้าลำพูน

จากตัวอย่างที่ผ่านมา ท่านสมควรทราบได้แล้วว่า แฟ้ม พอจะแยกชนิดได้อยู่บ้าง เรามาดูกันต่อไปซิว่า devices หรืออุปกรณ์ประกอบต่างๆนั้น เป็น แฟ้ม ชนิดใด ลองดูน่ะ
# file /dev/ad0s1
หวังว่ายังคงจำ /dev/ad0s1 กันได้อยู่น่ะครับ

ทีนี่ เรามาดูต่อว่า ในเรื่องของแฟ้ม(files) นี่ นอกจาก ชนิด ที่สามารถดูได้จากคำสั่ง file(1) แล้ว ยังมีเรื่องของ สิทธิ หรือ permission ที่สมควรจะรู้ไว้เป็นเบื้องต้นด้วย ซึ่งในเรื่องของ permission นี้ ใคร่ขอให้มองว่า แฟ้มของเรานั้น บางแฟ้ม เราไม่อยากให้ใครอ่านเลย แต่ บางเรื่องที่เก็บในแฟ้ม เราอยากแชร์ให้กับเพื่อนร่วมก๊วนได้ทราบด้วย ก็มี
ซึ่งในการนี้เอง ก็ทำให้เกิดมีการแบ่งแยกผู้ใช้ออกเป็น ๓ พวกใหญ่ๆคือ เราเอง หนึ่งล่ะ กับ กลุ่ม อีกหนึ่งล่ะ และ คนอื่น อีกหนึ่งล่ะ ซึ่งทุกแฟ้ม(files) จะมีรายละเอียดของ permission ของผู้ใช้งาน เรียงตามลำดับดังนี้
user group other
ก็แล permission หรือ สิทธิ ที่ว่านั้นก็มี อ่าน เขียน ทำงาน อย่างนี้
read อ่านได้
write เขียนได้
execute สั่งให้ทำงานได้
โดยที่ในแต่ละประเภทของผู้ใช้ เขาจะเรียง permission ไปเป็น อ่านเขียนสั่ง ในลำดับนี้ไปทุกประเภท ดังนี้

-rwxrwxrwx

เจ้าตัวขีด - ที่อยู่ซ้ายสุดนั้น อย่าคิดว่าเป็นรอยเปื้อนจากการพิมพ์น่ะ เป็นขีด - จริงที่เจตนามีไว้ เพราะมันแทน ชนิด ของแฟ้ม(files) ที่ได้กล่าวมาก่อนหน้านี้ยังไงล่ะ ซึ่งก็มีพวก directory, ordinary file, special file ประดานี้ซึ่งก็จะมีสัญญลักษณ์แทนพอสรุปได้บ้าง ดังนี้
ถ้าเป็น ขีด - ก็แทนแฟ้มธรรมดาๆ
ถ้าเป็นตัวดี d ก็แทน directory
ถ้าเป็นตัว c หรือ อย่างอื่น ก็แทน special file

อนึ่งเจ้าตัว rwx นั้น ถ้าตัวไหนไม่ได้รับ สิทธิ มันก็ว่างไปโดยใช้ขีดเปล่าๆแทน เช่นอย่างกับว่าในกลุ่มเพื่อนเรา กับ คนอื่นด้วยนั้น เราอนุญาตให้เพียงอ่านได้เท่านั้น ดังนี้แล้ว permission ก็จะเป็น

-rwxr--r--

คงพอได้แนวความคิดบ้างน่ะครับ อ้อ มีทิปให้นิดหนึ่ง คือเจ้าตัว r w x เนี่ย เท่าที่บอกไปว่า ถ้าไม่ได้รับสิทธินั้นๆ ให้แทนด้วยขีด ไป ที่นี้ เรามาขยายความต่อไปว่า ถ้า ได้รับสิทธิ ให้แทนด้วย 1 ถ้าไม่ได้รับสิทธิ ให้แทนด้วย 0 แล้วให้มองกลุ่ม rwx เป็นเลขฐานแปด จากตัวอย่างข้างต้น permission ก็จะแปลงร่างอีกโฉมเป็น

-744

คุ้นๆกันบ้างไหมครับ ลองดูอีกนี้ดนึงซี อาจจะกระจ่างขึ้นมาได้บ้าง น่ะ

# ll junk1

คงแยกออกน่ะ ระหว่างเลข 1 กับตัว l

ขอยุติเรื่องราวของแฟ้ม(files)เบื้องต้นไว้แต่เพียงเท่านี้ก่อน หากจะมีคุณงามความดีอันใดบ้าง ก็ขอยกให้กับ กุสุมา ศรีโยธา เมียที่เสียชีวิตไปเมื่อวันที่ ๑ กพ ๒๕๓๗ โน้น พร้อมกับเพื่อนร่วมเดินทางอีก ๖ ท่าน แล หากขาดตกบกพร่อง หรือ ขัดเคืองประการใด มะไฟ ขอน้อมรับไว้แต่โดยดี โดยผู้เดียว


View My Stats