วันพฤหัสบดี, กุมภาพันธ์ 25, 2553

clone partition

วันนี้ซื้อฮาร์ดดิสก์มาใหม่ขนาด 1TB เพราะอยากจะรวบรวมข้อมูลที่กระจายอยู่ในฮาร์ดดิสก์หลายๆ ตัวมาให้อยู่ตัวเดียว จะได้หาได้ง่ายๆ ได้ยี่ห้อ Western Digital แคชขนาด 32 MB อืมๆ ไม่น้อยเลย ราคาแทบไม่ต่างจากที่ซื้อครั้งที่แล้ว แต่แคชเยอะกว่า 2 เท่า

คำเตือน: ผมแค่แสดงวิธีการที่ผมทำเพื่อเป็นตัวอย่างเท่านั้น ใครจะทำตามก็ตรวจสอบดิสก์กับพาร์ติชั่นดีๆ เน้อ เกิดพลาดไปช่วยไม่ได้น่ะ :P

มาเข้าถึงวิธิการกัน ไปรื้อแผ่น CD มาได้ Ubuntu 8.04 server (ใหม่ที่สุดที่เจอแล้ว - -') ก็บูตเข้า rescue broken system ไป เพื่อจะเข้า shell อย่างเดียว พอถึง shell ซึ่งฮาร์ดดิสก์ใหม่เป็น sda อันเก่าเป็น sdc ก็แบ่ง partition ด้วย

# fdisk /dev/sda

ก็สร้างไปตามต้องการ ณ ที่นี้ให้เก็บ OS ที่ sda2 ขนาด 80GB ที่เหลือเป็น sda3

# dd if=/dev/sdc2 /of=/dev/sda2 bs=1024

ก็ใช้เวลาไม่นาน ข้อมูล 30 GB ใช้เวลาแค่ประมาณครึ่งชั่วโมง เนื่องจากเราคัดลอกข้อมูลด้วย dd ทำให้ขนาดไฟล์ซิสเต็ม เท่ากับของเดิมด้วย แม้ว่าพาร์ติชันจะใหญ่กว่าก็ตาม ต่อไปก็ขยายไฟล์ซิสเต็ม จาก 30G เป็น 80G

# ntfsresize /dev/sda2

ก็อ่านคำเตือนกันไปจนจบแล้ว ก็ตอบ... [Y/N] เป็นอะไรเลือกเอา ฮึๆ

แล้วก็ย้ายเฉพาะ boot record มาด้วย

# dd if=/dev/sdc of=/dev/sda bs=1 count=446

ลองใช้ ntfs-3g เมาท์ดิสก์ได้ ก็เรียบร้อย เข้าวินโดส์แล้วย้ายข้อมูลที่เหลืออีกที









วันอังคาร, มกราคม 26, 2553

ติดตั้ง ssh2 สำหรับ PHP


ช่วงนี้มีงานที่ต้องใช้ PHP ไปเรียก SSH ไปเรียกทั้งเรียกคำสั่งและดาว์นโหลดไฟล์จากเครื่องอื่น PHP ที่มีมันก็ยังใช้ไม่ได้ ทั้ง base ของ CentOS และ rpmforge repository ก็ไม่มีแพคเกจนี้ ก็เลยต้องติดตั้ง extension ผ่าน PECL (PHP Extension Community Library) เอง ดังนี้

$ yum install php-pear libssh2-devel php-devel
ติดตั้งแพคเกจ developer ให้ครบซะก่อน

$ pecl install ssh2-beta
(จริงๆ แพคเกจชื่อ ssh2 แต่เนื่องจากเป็น beta อยู่ ซึ่ง pecl จะไม่ยอมติดตั้งโดย default ถ้าจะบังคับก็ต้องเติม -beta ต่อท้าย)

$ echo extension=ssh2.so > /etc/php.d/ssh2.ini
เพิ่มไฟล์ config ให้มันโหลด extension นี้

$ service httpd restart
รีสตาร์ท Apache เป็นอันเสร็จ


ลองใช้ ssh2_connect ก็เรียกได้เรียบร้อยแล้ว :)

วันเสาร์, มกราคม 16, 2553

FUSE Function not implemented

ช่วงที่เขียนไฟล์ซิสเต็มด้วย FUSE ก็เจอปัญหา คือ พอจะสร้างส่วนสำหรับเขียนไฟล์ (ทดสอบด้วยคำสั่ง touch) แต่ดันเจอ

$ touch fuse/11111
touch: cannot touch `fuse/11111': Function not implemented

จาก debug log

unique: 5, opcode: OPEN (14), nodeid: 2, insize: 48
unique: 5, error: 0 (Success), outsize: 32
OPEN[0] flags: 0x8801 /11111
unique: 6, opcode: SETATTR (4), nodeid: 2, insize: 128
unique: 6, error: -38 (Function not implemented), outsize: 16
unique: 7, opcode: SETATTR (4), nodeid: 2, insize: 128
unique: 7, error: -38 (Function not implemented), outsize: 16
unique: 8, opcode: SETATTR (4), nodeid: 2, insize: 128
unique: 8, error: -38 (Function not implemented), outsize: 16
unique: 9, opcode: FLUSH (25), nodeid: 2, insize: 64
FLUSH[0]
unique: 9, error: -38 (Function not implemented), outsize: 16
unique: 10, opcode: RELEASE (18), nodeid: 2, insize: 64
RELEASE[0] flags: 0x8801
unique: 10, error: 0 (Success), outsize: 16

ไปไล่ดูเอกสารทั้งของ FUSE และโมดูล perl FUSE มันก็ไม่มี setattr ให้ implement นี่ ไปเจอใน paper ชื่อ "ReFUSE: Userspace FUSE Reimplementation Using puffs" บอกว่าจริงๆ แล้วเมื่อมันเรียก system call setattr มันจะไปเรียก chmod, chown, และ utime ให้เอง ดังนั้นเลยรู้ว่าถ้าเราไม่ได้ implement 3 ตัวนั้นมันก็จะเจอ error message แบบนั้นแหละ สรุปข้อความมันทำให้เข้าใจผิดไปเยอะเลย