วันจันทร์ที่ 29 สิงหาคม พ.ศ. 2554

การ downgrade php เป็นรุ่น 5.2.x ใน Debian 6.0 (Squeeze)

เมื่อติดตั้ง Debian 6.0 จะได้ php5 เป็นรุ่น 5.3.x ซึ่งมีคุณสมบัติบางประการต่างไปจากรุ่นเดิมคือ 5.2.x (อ่านเพิ่มเติมที่ http://php.net/manual/en/migration53.php) ซึ่งในบางครั้งเรายังจำเป็นต้องใช้รุ่นเดิมอยู่ เช่นยังใช้ drupal 5.x ซึ่งยังใช้ไม่ได้กับ php 5.3 (ต้องเป็น drupal รุ่น 6.x ตัวหลังๆ หรือ drupal 7.x) สามารถเลือกติดตั้ง php5 จาก oldstable หรือ Debian 5.0 (lenny) โดยทำได้ดังนี้

เพิ่ม repository ของ lenny เช่น จากเดิมใน /etc/apt/sources.list มี


deb http://ftp.th.debian.org/debian squeeze main non-free contrib
deb http://ftp.th.debian.org/debian-security squeeze/updates main non-free contrib

ให้เพิ่ม ของ lenny เข้าไปด้วย เป็น

deb http://ftp.th.debian.org/debian squeeze main non-free contrib
deb http://ftp.th.debian.org/debian-security squeeze/updates main non-free contrib
deb http://ftp.th.debian.org/debian lenny main
deb http://ftp.th.debian.org/debian-security lenny/updates main

แก้ไข (หรือสร้างไฟล์ใหม่) /etc/apt/preferences ใส่คอนฟิกดังนี้ลงไป

Package: php-* php5 php5-* libapache2-mod-php5 php-pear
Pin: release a=oldstable
Pin-Priority: 999

จากนั้นสั่ง

# apt-get update
# apt-get -f install

ระบบจะ downgrade แพกเกจ PHP ที่ติดตั้งไปแล้ว ที่อยู่ในรายการที่เรากำหนด ให้เป็นรุ่นที่อยู่ใน oldstable ตามต้องการ ถ้ายังไม่ติดตั้ง ก็ติดตั้งตามปกติ

และเมื่อไหร่ที่พร้อมที่จะอัพเกรด php เป็นรุ่น 5.3 ก็แก้ไฟล์ /etc/apt/preferences เอาคอนฟิกที่เพิ่มเข้าไป 3 บรรทัดนั้นออก แล้วสั่ง upgrade ตามปกติได้เลย

วันเสาร์ที่ 27 สิงหาคม พ.ศ. 2554

การเปลี่ยน harddisk ใน MD RAID + ประสบการณ์ harddisk เสียพร้อมกัน 2 ตัว

ปกติเวลาทำ RAID บน server เราจะคาดหวังว่าข้อมูลมันจะปลอดภัยเป็นอันดับแรก โดยหลักการคือเราเชื่อว่าฮาร์ดดิสก์มันจะเสียไม่พร้อมกันหรอก พอเสียก็รีบเปลี่ยนตัวใหม่มาแทนทันที มันก็ควรจะอยู่ไปได้เรื่อยๆ นั่นคือเราคาดว่าฮาร์ดดิสก์มันควรจะเสียทีละตัว มีโอกาสน้อยมากที่มันจะเสียพร้อมๆ กัน

แต่ก็ไม่ใช่ว่าจะเป็นไปไม่ได้ เร็วๆ นี้ผมเจอเคสหนึ่ง เซิร์ฟเวอร์ที่เคยไปติดตั้งให้ลูกค้าเมื่อ 2 ปีกว่ามาแล้ว ส่งเมลมาแจ้งว่ามีดิสก์ตัวหนึ่งของ RAID เสีย (อันนี้เป็นข้อดีประการสำคัญของ Linux MD RAID ที่มันมีตัว monitor ที่จะส่งเมลบอกเราได้เมื่อพบดิสก์เสีย) ผมก็รีบแจ้งลูกค้าให้เตรียมฮาร์ดดิสก์ไปเปลี่ยน แล้วก็นัดกันเข้าไปเปลี่ยนที่ NOC แห่งหนึ่ง

เริ่มจาก ตรวจสอบดูสถานะของ RAID โดยสั่ง

# cat /proc/mdstat

ถ้าระบบ RAID มันปกติ จะพบสถานะแสดงเป็น [UU] อันนี้เป็นกรณี RAID1 ถ้ามีตัวหนึ่งเสีย จะเป็น [U_] และหลังชื่อ device ที่เสีย จะมี (F) บอกไว้
ในที่นี้ระบบดังกล่าวผมทำ RAID1 ไว้ 5 ชุด บนดิสก์ 4 ตัว ชุดหนึ่งเป็น RAID1 ที่สร้างจาก partition เล็กๆ 4 partition จากแต่ละดิสก์ เพื่อใช้เป็น /boot และติดตั้ง bootloader ไว้บนทุกดิสก์ นั่นคือระบบนี้จะต้องบูตได้จากดิสก์ทุกตัว แล้วรวมชุดที่เหลืออีกทีเป็น RAID0 2 ชุด สำหรับเก็บข้อมูล

ในที่นี้ดิสก์ตัวที่เสียคือ sda จึงสั่ง remove ตัวที่เสียออก

# mdadm /dev/md0 --remove /dev/sda1
mdadm: hot removed /dev/sda1
# mdadm /dev/md1 --remove /dev/sda3
mdadm: hot removed /dev/sda3

บางทีมันพบจุดเสียเฉพาะในบางพาร์ทิชัน แต่เราต้องเปลี่ยนด้วยกัน ก็ให้สั่ง fail มันก่อนแล้วค่อย remove

# mdadm /dev/md1 --fail /dev/sda3 --remove /dev/sda3
mdadm: hot removed /dev/sda3


เครื่องนี้มี hot swap bay ซึ่งมีหลอดแสดงสถานะการทำงานของดิสก์แต่ละตัวแยกกัน แต่เนื่องจากไม่ได้ใช้ hardware RAID จึงไม่มีไฟบอกสถานะว่าดิสก์ตัวไหนเสีย จึงเล่นมุกง่ายๆ โดยลองสั่งให้ดิสก์ตัวที่เสียมันทำงาน โดยสั่ง

# dd if=/dev/sda of=/dev/null bs=1G count=1

ไฟหลอดไหนกระพริบก็แสดงว่าคือตัวนั้น จึงถอดออกและใส่ตัวใหม่แทน แต่พบว่าปัญหาคือ hotswap มันทำงานผิดปกติหรือเปล่าไม่ทราบ ตัวใหม่จึงเห็นเป็น sde ซึ่งเป็นไปได้มากกว่าพอบูตใหม่ มันจะกลับมาแสดงเป็น sda แทนตัวเก่าอีกที แต่อันที่จริงไม่น่าจะมีปัญหาเพราะ RAID มันจะตรวจสอบจาก uuid ของ partition ไม่ใช่ชื่อ device

ขั้นต่อไปคือสร้างพาร์ทิชันให้เหมือนของเดิม ในที่นี้ดิสก์ทุกตัวถูกสร้างให้มีพาร์ทิชันแบบเดียวกันหมด จึงทำได้ง่ายๆ โดยการโคลนโครงสร้างพาร์ทิชันด้วย sfdisk

# sfdisk -d /dev/sdb | sfdisk /dev/sde

และเพิ่มดิสก์ใหม่เข้าไปใน RAID

# mdadm /dev/md0 --add /dev/sde1
# mdadm /dev/md1 --add /dev/sde3

ตรวจสอบดู

# cat /proc/mdstat

ก็จะพบว่า RAID กำลังถูก rebuild

อื่นๆ ที่ทำคือติดตั้ง grub ใน boot record เพื่อให้มันบูตได้ ซึ่งยังไม่ขอกล่าวถึงในที่นี้

ซึ่งทั้งหมดที่ทำนี้เครื่องนี้ยังให้บริการต่อตามปกติ แต่เพื่อความแน่ใจจึงขอรีบูตเครื่องใหม่เพื่อดูว่า RAID ยังทำงานได้ แต่พบว่า BIOS แจ้งว่าพบดิสก์เพียง 3 ตัว ปรากฏว่ามีดิสก์อีกตัวที่เดิมไม่ได้เสีย แต่พอรีบูตเครื่องแล้วไม่สามารถกลับมาทำงานได้ตามปกติ ซึ่งเป็นเรื่องในตำนานที่เคยได้ยินมาเหมือนกันว่า ระบบที่เปิดทิ้งไว้นานนับหลายปี ทำงานปกติดี แต่พอรีบูตแล้ว ดิสก์ไม่กลับมาทำงานอีก แต่ไม่คิดว่าจะเจอกับตัว แถม RAID ยัง rebuild ไม่เสร็จด้วย ตั้งสติกันสักพัก แล้วมาลุ้นกันว่าตัวไหนจะเสีย คือถ้าตัวที่เสียคือตัวที่คู่กับมันใน raid1 ก็โบกมือลาข้อมูลได้เลย แต่โชคดีที่ไปเสียตัวที่ไม่ใช่คู่มัน ไปเสียที่ raid1 อีกชุดหนึ่ง จึงต้องถอดดิสก์ตัวที่เสียอีกตัวให้ลูกค้าเอาไปเคลม โดยปล่อยให้ระบบทำงานในโหมด degraded ไปก่อน แล้วอีกอาทิตย์หนึ่งจึงกลับมาใส่และ rebuild มันคล้ายๆ step ข้างบนอีกรอบ

เพื่อความปลอดภัย เผื่อในกรณีซวยซ้ำซวยซ้อนแบบที่เจอมานี้ ควรใช้ RAID ที่ยอมให้ดิสก์เสียได้มากกว่า 1 ตัว เช่น RAID6 ที่ยอมให้ดิสก์เสียได้ถึง 2 ตัว (ส่วน RAID5 ยอมให้เสียได้เพียง 1 ตัว) RAID1+0 ก็พอไหว เสียได้ 1 ตัว กับอีกตัวที่ไม่ใช่คู่ของมัน (2 ใน 3 ตัว) อันนี้คือกรณีทำ RAID1 2 ชุด แล้วมารวมเป็น RAID0 อีกชุดหนึ่ง ถ้าทำ RAID0 2 ชุด แล้วมารวมเป็น RAID1 ผมคิดว่าไม่ใช่ไอเดียที่ดี เพราะถ้ามีดิสก์เสีย 1 ตัว อีก 1 ตัวที่จะเสียได้ ต้องเป็นคู่ของมันเท่านั้น (1 ใน 3 ตัว)

มีอีกแนวทางหนึ่งคือใช้ Linux MD RAID 10 ซึ่งเป็น non-standard RAID ซึ่งสามารถกำหนด layout ได้ว่าให้บันทึกข้อมูลในดิสก์ในลักษณะใด ซึ่งสามารถทำให้ระบบยอมให้ดิสก์เสียได้พร้อมกัน 2 ตัว ไม่ว่าจะเป็นตัวไหนก็ได้ โดย Linux MD RAID 10 นี้ยังให้ประสิทธิภาพทั้งการอ่านและเขียนสูงกว่าแบบอื่นๆ ซึ่งขึ้นอยู่กับ layout ที่เลือกอีกด้วย ไว้โอกาสหน้าจะเอามานำเสนออีกครั้งครับ

วันศุกร์ที่ 26 สิงหาคม พ.ศ. 2554

btrfs: ทำ profile แบบ RAID ในระดับ filesystem

คุณสมบัติหนึ่งของ btrfs คือ มันสามารถใช้ดิสก์หลายๆ ตัวมารวมเป็นพื้นที่เดียวกันได้ โดยไม่จำเป็นต้องพึ่ง RAID หรือ LVM ซึ่งสามารถกำหนด metadata profile และ data profie ได้ว่าให้มีคุณสมบัติคล้าย RAID แบบใด ซึ่งปัจจุบันสามารถกำหนดให้เป็น raid0, raid1, raid10

ตอนสร้าง filesystem แบบ btrfs มันจะใช้ metadate profile เป็น raid1 และ data profile เป็น raid0 ถ้าสร้างบนดิสก์ตัวเดียว metadata จะเก็บบนดิสก์ตัวเดียวกัน 2 สำเนา

# mkfs.btrfs /dev/sda1
เทียบเท่า
# mkfs.btrfs -m raid1 -d raid0 /dev/sda1

สร้างจากดิสก์ 2 ตัว
# mkfs.btrfs /dev/sda1 /dev/sdb1
เวลาเมานท์ก็ระบุตัวใดตัวหนึ่งก็ได้เช่น
# mount /dev/sda1 /mnt/data

อันที่จริงแล้วมันไม่ได้เป็น RAID จริงๆ คือไม่ได้เป็นลักษณะของ disk array แต่เป็นการกำหนดว่าหน่วยข้อมูลที่จัดเก็บใน filesystem บนดิสก์หลายๆ ตัว ให้มีลักษณะของการเก็บอย่างไร ได้แก่

raid0
เก็บหน่วยข้อมูลในลักษณะ stripping คือกระจายหน่วยข้อมูลที่ต่อเนื่องกัน ให้ไปอยู่บนดิสก์หลายๆ ตัว ทำให้การอ่านและเขียนเร็วขึ้นมากตามจำนวนดิสก์ที่มี

ต้องใช้ดิสก์อย่างน้อย 1 ตัว อันนี้จะต่างจาก RAID ปกติ ที่จะต้องใช้ดิสก์ 2 ตัวขึ้นไป คือถ้ามีดิสก์เพียง 1 ตัว มันก็จะเก็บข้อมูลตามปกตินั่นเอง
ถ้าในตอนแรกมีดิสก์ 2 ตัว เมื่อสั่ง delete ดิสก์ออก 1 ตัว มันจะคัดลอกข้อมูลจากตัวที่จะเอาออก มาที่ตัวที่เหลือ แล้วจึงเอาออก ซึ่งในการทำแบบนี้ สามารถทำในขณะที่ filesystem กำลังทำงานอยู่ได้ทันที ในการเพิ่ม ก็สามารถเพิ่มดิสก์เข้ามาได้ทันที โดยสามารถสั่ง balance เพื่อกระจายหน่วยข้อมูลออกไปเก็บบนดิสก์ทุกตัวอีกที
ความปลอดภัยของข้อมูล
แบบ raid0 นี้ข้อมูลแต่ละหน่วยมีเพียงชุดเดียว ไม่มีสำเนา หากมีดิสก์ตัวใดตัวหนึ่งเสีย ข้อมูลที่อยู่ในดิสก์ตัวนั้นจะเสียไปเลย

raid1
เก็บข้อมูลหน่วยละ 2 ชุด และอยู่คนละดิสก์กันเสมอ หรือเรียกอีกอย่างหนึ่งว่า mirroring ต้องใช้ดิสก์ 2 ตัวขึ้นไปเสมอ ดังนั้นถ้าตอนแรกสร้างบนดิสก์ 2 ตัว จะสั่ง delete ตัวใดตัวหนึ่งออกไม่ได้เลย แต่ถ้าดิสก์เกิดเสีย ยังสามารถเมานท์แบบ degrade ได้เพราะข้อมูลมีครบทั้งสองตัว

ตัวอย่าง
# mkfs.btrfs -d raid1 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
# mount /dev/sda1 /mnt/data

raid10
เก็บข้อมูลหน่วยละ 2 ชุดคนละดิสก์กัน และเรียงข้อมูลแบบ stripping ด้วย ทำให้ได้ทั้งความปลอดภัย และความเร็วในการอ่านและบันทึกข้อมูล แบบนี้ใช้ดิสก์ 4 ตัวขึ้นไปเสมอ ถ้ามีเพียง 4 ตัวจะ delete ตัวใดตัวหนึ่งออกไม่ได้

ตัวอย่าง
# mkfs.btrfs -m raid10 -d raid10 /dev/sd[a-d]1
# mount /dev/sda1 /mnt/data

สามารถเพิ่มดิสก์เข้าไปใน pool ของมันได้เรื่อยๆ เช่นเพิ่มดิสก์ตัวที่ 5 เข้ามา ก็สร้าง partition แล้วเพิ่มเข้ามาได้เลย
# btrfs device add /dev/sde1 /mnt/data
# btrfs filesystem balance /mnt/data
สังเกตว่าไม่ต้อง mkfs.btrfs แล้ว แค่เพิ่มเข้าไปเลย และหลังจากเพิ่ม สามารถสั่ง balance เพื่อกระจายข้อมูลไปยังดิสก์ตัวใหม่ด้วย

การถอดดิสก์ออกจาก pool ใช้คำสั่งตามตัวอย่างนี้
# btrfs device delete /dev/sde1 /mnt/data

การเมานท์เมื่อมีดิสก์บางตัวเสียหาย หรือถูกถอดออกไปโดยไม่ได้สั่ง delete
# mount -o degraded /dev/sda1 /mnt/data
ซึ่งก็ควรจัดหาดิสก์มาทดแทนให้เร็วที่สุดแล้วสั่ง
# btrfs device add /dev/sde1 /mnt/data
# btrfs device delete missing /mnt/data

ข้อสังเกตจากการทดลองใช้งานจริงมาระยะหนึ่ง

  1. data profile raid1 เวลาสร้างบนดิสก์ที่มากกว่า 2 ตัว มันชอบเอาข้อมูลไปกองอยู่บนดิสก์แค่ 2 ตัว ไม่ค่อยกระจายเท่าไหร่ ทำให้ดิสก์บางตัวทำงานหนัก ขณะที่บางตัวไม่ค่อยถูกใช้งาน เมื่อสั่ง balance ยิ่งทำให้ข้อมูลถูกย้ายมาเก็บแค่ 2 ตัว
  2. data profile raid10 เวลาถอดดิสก์ออกจากเครื่อง แล้วสั่งเมานท์ จะเมานท์ไม่ได้ แม้ว่าจะระบุอ็อพชัน -o degraded แล้วก็ตาม ส่วนแบบ raid1 ยังไม่ได้ลอง
  3. กำหนด layout ของการเก็บข้อมูลไม่ได้ จึงไม่สามารถระบุให้เก็บข้อมูลเป็น 3 ชุด แทนที่จะเป็น 2 ชุดได้ ซึ่งทำให้เสี่ยงที่จะเกิดปัญหาถ้ามีดิสก์เสีย 2 ตัวพร้อมๆ กัน
  4. ยังไม่รองรับ profile แบบ raid5, raid6
  5. ยังเปลี่ยน profile ไม่ได้ ถ้าสร้างแบบไหน ก็ต้องใช้แบบนั้นตลอดไป
  6. แต่ละ subvolume ไม่สามารถกำหนด profile แตกต่างกันได้
  7. การ balance ทำได้ช้ามาก
  8. สามารถสั่ง defragment ได้ แต่ก็ช้ามากเช่นกัน
  9. ยังไม่สามารถสั่งตรวจสอบ filesystem แบบ online คือกำลังเมานท์อยู่ได้ และการตรวจสอบแบบ offline ก็ยังไม่สมบูรณ์
โดยรวมๆ ยังมีหลายๆ อย่างไม่สมบูรณ์ แต่โดยส่วนตัวคิดว่า เมื่อสมบูรณ์กว่านี้ เราคงไม่จำเป็นต้องใช้ RAID อีกต่อไป

วันพฤหัสบดีที่ 25 สิงหาคม พ.ศ. 2554

ขอคืนพื้นที่ /var/log โดยการ compress log ด้วย xz

xz คล้ายๆ gzip แต่ compress ด้วยอัลกอริทึ่ม lzma2 มีใน squeeze ขึ้นมา หรือใน lenny-backports ดูเพิ่มเติมที่ http://tukaani.org/xz/


ทำไมต้องใช้ xz แทน gzip
  • บีบได้เยอะกว่ามาก พอเอามาใช้บีบ log เก่าที่ถูก rotate ทำให้ใช้พื้นที่น้อยลงมาก
  • ตอน decompress ทำได้ค่อนข้างเร็ว ช้ากว่า gunzip บ้าง แต่เร็วกว่า bunzip2 มาก
ข้อเสีย?
  • ใช้เวลา compress นานกว่ามาก เพราะใช้กำลังในการประมวลผลเยอะ (+ram เยอะๆ) แต่มันทำครั้งเดียว และก็ cpu กับ ram ไม่น่าเป็นปัญหากับ server ในปัจจุบันนัก ส่วนการอ่าน/นำไปใช้ก็มี xzcat, xzless ให้ เร็วใกล้เคียงกับ zcat, zless เลยทีเดียว
ติดตั้ง
# apt-get install xz-utils
# apt-get install xz-lzma   

เทียบคำสั่ง
gzip : xz
gunzip : unxz
zcat : xzcat
zless : xzless
zmore : xzmore
zgrep : xzgrep
zdiff : xzdiff
zcmp : xzcmp
zegrep : xzegrep

การประยุกต์ใช้กับ logrotate เพื่อขอคืนพื้นที่ใน /var/log
เพิ่มบรรทัดต่อไปนี้เข้าไปใน /etc/logrotate.conf
#---------------------------------
compresscmd /usr/bin/xz
uncompresscmd /usr/bin/unxz
compressext .xz
compressoptions -9
#---------------------------------

การแปลงจาก log เก่าที่เป็น .gz มาเป็น .xz
แปลงไฟล์เดียว
# gunzip access.log.2.gz
# xz -9 access.log.2

แปลงหลายๆ ไฟล์
# cd /var/log
# find . -name "*.gz" | sed 's/.gz$//' | xargs -I '{}' -n 1 -P 2 sh -c "gunzip '{}'.gz ; xz -9 '{}'"

* หมายเหตุ ตรง -P 2 นั่นคือทำพร้อมๆ กัน 2 process ถ้า cpu มีหลายๆ core ก็เพิ่มมากกว่านี้ได้ตามความเหมาะสม จะทำให้แปลงได้ไวขึ้น

ปล. คัดลอกมาจาก note เก่าใน Facebook ของผมเอง

วันพุธที่ 24 สิงหาคม พ.ศ. 2554

btrfs: การสร้าง snapshot ของข้อมูล ด้วยวิธี cp --reflink

ในครั้งก่อนเราได้ดูวิธีการทำ snapshot ของ subvolume ใน btrfs ไปแล้ว ซึ่งวิธีนั้นเหมาะกับผู้ที่เป็น admin เพราะมีสิทธิของ root ที่จะทำได้

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

วิธีการคือการใช้คำสั่ง cp (copy) โดยใช้อ็อพชั่น --reflink=always กับ -a ซึ่ง -a หรือ --archive คือการคัดลอกทั้ง subdirectory และไม่แปลง soft-link กลับเป็นไฟล์ และรักษาคุณสมบัติของไฟล์ทุกประการไว้
ส่วน --reflink ใช้กับการคัดลอกแบบ CoW คือไฟล์ที่ได้จะอยู่บนคนละ inode แต่ใน inode ชี้ไปหารายการบล็อคชุดเดียวกันกับต้นฉบับ เว้นแต่เมื่อบล็อคใดมีการแก้ไข จะถูกสำเนาไปเป็นบล็อคใหม่ทันที

เช่น ใน home ของผู้ใช้มีข้อมูลสำคัญเก็บใน Documents ต้องการสำเนาทั้งหมดเก็บไว้แบบ snapshot

$ mkdir backups
$ cp -a --reflink=always Documents backups/Documents-20110825

การคัดลอกจะใช้เวลาไม่นานนัก เพราะมีการอัพเดทเฉพาะส่วน metadata โดยส่วนข้อมูลยังชี้ไปที่เดิม พื้นที่ของดิสก์จะลดลงเล็กน้อย

สามารถสำเนาแบบนี้ได้อีกหลายๆ ครั้งตามต้องการ เช่น ในวันต่อมาก็สั่ง
$ cp -a --reflink=always Documents backups/Documents-20110826

เมื่อต้องการลบ snapshot เหล่านี้ออกบ้าง ก็ใช้คำสั่ง rm -rf ออกได้ เช่น

$ rm -rf backups/Documents-20110825

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

วันอังคารที่ 23 สิงหาคม พ.ศ. 2554

ประหยัดแบนด์วิดธ์ด้วยการดาวน์โหลด Ubuntu daily ด้วย zsync


เร็วด้วย ประหยัดด้วย โดยเฉพาะกับการดาวน์โหลดแผ่น daily-live ซึ่งไม่สามารถใช้ jigdo ได้
มันจะใช้ไฟล์ iso เก่าเป็น seed เพื่อหาส่วนที่ยังใช้ได้ แล้วดาวน์โหลดเฉพาะส่วนที่เปลี่ยนแปลง ซึ่งถ้าไฟล์เก่าไม่มีมันก็ดาวน์โหลดมาทั้งหมด

เช่นตัวอย่างนี้คือใช้ไฟล์ของเมื่อวานเป็น seed

zsync http://mirror1.ku.ac.th/ubuntu-allimages/daily-live/20110821/oneiric-desktop-amd64.iso.zsync

reading seed file oneiric-desktop-amd64.iso: *****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
Read oneiric-desktop-amd64.iso. Target 90.5% complete.      *************************************************
downloading from http://mirror1.ku.ac.th/ubuntu-allimages/daily-live/20110821/oneiric-desktop-amd64.iso:
##################-- 91.6% 0.1 kBps         TA   
##################-- 93.4% 0.4 kBps         A    
###################- 95.5% 0.9 kBps         A   
#################### 100.0% 9.8 kBps DONE       

verifying download...checksum matches OK
used 655728640 local, fetched 69735889

แล้วพอมันออกรุ่นจริง ชื่อไฟล์มันจะเปลี่ยน ก็ให้ระบุชื่อไฟล์เก่า เช่น

$ zsync -i oneiric-desktop-amd64.iso http://mirror1.ku.ac.th/ubuntu-releases/natty/ubuntu-11.04-desktop-amd64.iso.zsync

ปล. คัดลอกและดัดแปลงจาก note เก่า ใน Facebook ของตัวเองครับ

วันจันทร์ที่ 22 สิงหาคม พ.ศ. 2554

btrfs: การสร้าง snapshot ของข้อมูล

btrfs เป็น filesystem ของ Linux (น่าจะรองรับในทุก distro ในปัจจุบัน) ที่มีคุณสมบัติอย่างหนึ่งคือ CoW (Copy on Write) คือสามารถคัดลอกไฟล์เป็น 2 ชุดโดยอ้างอิงบล็อกของข้อมูลชุดเดียวกันได้ แต่เมื่อไฟล์ใดมีการแก้ไข จึงจะคัดลอกบล็อกที่แก้ไขเป็นอีกบล็อกหนึ่งแล้วจึงแก้ไขมัน ทำให้เวลาคัดลอกลักษณะนี้ มันใช้เนื้อที่น้อยมาก และจะใช้เนื้อที่เพิ่มขึ้นทีละนิดเมื่อไฟล์มีการเปลี่ยนแปลง และสามารถคัดลอกสำเนาในลักษณะนี้ได้หลายๆ ครั้ง (หลายๆ เวอร์ชัน) โดยที่เนื้อที่ที่ใช้เพิ่มขึ้นเฉพาะส่วนที่เปลี่ยนแปลงของแต่ละเวอร์ชันเท่านั้น

คุณสมบัตินี้ถูกใช้ในการทำ snapshot ของ filesystem ในระดับของ subvolume ด้วยคำสั่ง

 btrfs subvolume snapshot <source> [<dest>/]<name>

โดย <source> ต้องเป็น path ของ subvolume ที่ถูกเมานท์ ส่วน <dest> ต้องเป็น path ที่อยู่ใน subvolume ที่อยู่ใน btrfs pool เดียวกัน

เช่น
ในระบบมี subvolume ชื่อ @ เมานท์ไว้ที่ / (เป็น root directory)
และ @home เมานท์ไว้ที่ /home

# mkdir /backups
# btrfs subvolume snapshot /home /backups/home-20110822
Create a snapshot of '/home' in '/backups/home-20110822'


ใน /backups/home-20110822 จะมีข้อมูลเก็บอยู่เหมือนใน ้/home ในขณะเวลานั้นๆ ทันที โดยใช้เนื้อที่เพิ่มขึ้นเพียงเล็กน้อย และใช้เวลาในการทำ snapshot สั้นมากๆ แม้ว่าข้อมูลจะมีเป็นจำนวนมากก็ตาม ซึ่งผู้ดูแลระบบอาจจะแจ้งให้ผู้ใช้ทราบว่า สามารถมาเรียกคืนข้อมูลเก่าๆ ย้อนหลังจาก snapshot ที่เก็บไว้ที่ /backups ก็ได้

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

การลบ snapshot
เนื่องจากเนื้อของดิสก์จะถูกใช้เพิ่มขึ้น เมื่อข้อมูลปัจจุบันต่างจาก snapshot แต่ละรุ่น ดังนั้นการจะเรียกคืนเนื้อที่ส่วนนี้กลับมา ต้องลบ snapshot เก่าๆ ทิ้งไปบ้าง (อาจจะกำหนดเป็นนโยบายว่า จะเก็บย้อนหลังเพียง 7 วัน แล้วเขียน cron script เพื่อจัดการอัตโนมัติ เป็นต้น)

คำสั่ง
 btrfs subvolume delete <subvolume>

เช่น
# btrfs subvolume delete /backups/home-20110822
Delete subvolume '/backups/home-20110822'

ข้อควรระวังคือ ถ้าทำ snapshot ใน filesystem ที่มีไฟล์ถูกเปิดใช้งานอยู่ เช่น mysql server สำเนา snapshot ที่ได้จะไม่สมบูรณ์เพราะไฟล์ที่เปิดอยู่มักจะมีข้อมูลบางส่วนค้างอยู่ในหน่วยความจำ ยังไม่ได้ถูกบันทึกในไฟล์จริง ดังนั้นก่อนจะทำ snapshot ควรปิดระบบที่อาจจะเปิดไฟล์ค้างอยู่ก่อน (ในที่นี้คือให้ปิดโปรแกรม mysql server ก่อน) แล้วจึงสั่งทำ snapshot

ถ้าระบบของเราใช้ btrfs ที่มี data profile และ metadata profile เป็นแบบ RAID1 หรือสร้างบนระบบ RAID1, RAID10, RAID5/6 ไม่ว่าจะเป็นซอฟต์แวร์หรือฮาร์ดแวร์แล้วละก็ อาจจะกล่าวได้ว่า
"ลาก่อน โปรแกรม backup ทั้งหลาย"