debian: debootstrap

debootstrap เป็นแพกเกจที่ใช้ในการติดตั้งเดเบียนผ่านเครือข่าย
สามารถนำมาใช้ประโยชน์ได้เช่น การติดตั้งลินุกซ์ซ้อนเข้าในระบบเพื่อการทดลอง หรือการติดตั้งระบบเพิ่มเติมสำหรับงาน Virtualization

การใช้งาน ควรมี mirror ซึ่งอาจเป็น apt-proxy apt-cacher หรือ mirror แท้ ๆ อยู่ในเครือข่ายเราก่อน

รูปแบบใช้งานคือ

debootstrap [OPTION...] SUITE TARGET [MIRROR [SCRIPT]]

SUITE คือรุ่นของลินุกซ์ที่เราจะติดตั้ง สำหรับเดเบียนได้แก่ sarge หรือ etch เป็นต้น
TARGET คือพาร์ติชั่นที่เราเมานต์ไว้แล้วสำหรับการติดตั้ง
MIRROR คือคลังแพกเกจ เช่น apt-proxy หรือ mirror อื่น

รายละเอียดสามารถศึกษาได้เพิ่มเติมจาก man debootstrap

ตัวอย่างการใช้งาน debootstrap สำหรับงานทดลอง

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

สมมุติว่า mirror เราชื่อ www.example.com
เครื่องเราชื่อ server1

และสมมุติว่าแบ่งพาร์ติชั่นไว้ดังนี้

/dev/hda1   = /boot ขนาด 100M
/dev/hda2   = /     ขนาด 10G เป็นระบบปัจจุบัน
/dev/hda3   = Extended
/dev/hda5   = swap  ขนาด 512M

เราจะติดตั้งระบบใหม่บน /dev/hda6 ให้มีขนาด 20G เพื่อใช้เป็น / (root) ของระบบใหม่

สร้างพาร์ติชั่นใหม่ คือ /dev/hda6 ขนาด 20G
# fdisk /dev/hda

Command (m for help): <<<--- n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
<<<--- l
First cylinder (XXXX-XXXXX, default XXXXX):<<<--- {Enter}
Last cylinder or +size or +sizeM or +sizeK (XXXX-XXXXX, default XXXXX):<<<--- +20G
.
Command (m for help): <<<--- w

สร้างระบบไฟล์เป็น ext3
# mkfs.ext3 /dev/hda6

สร้างจุดเมานต์ให้ /dev/hda6 สมมุติว่าชื่อ /mnt/disk
# mkdir -p /mnt/disk

ก่อนจะติดตั้ง ต้องเมานต์ /dev/hda6 ลงบน /mnt/disk ก่อน
# mount /dev/hda6 /mnt/disk

ติดตั้ง etch บน /mnt/disk ผ่าน debootstrap
# debootstrap etch /mnt/disk http://www.example.com:9999/debian

เมื่อติดตั้งเสร็จแล้ว จำเป็นต้องคัดลอกไฟล์ที่จำเป็นในการเริ่มต้นระบบไปยัง /mnt/disk และทำการแก้ไขตามจำเป็น
# cp /etc/hosts /mnt/disk/etc ; vi /mnt/disk/etc/hosts
# cp /etc/network/interfaces /mnt/disk/etc/network ; vi /mnt/disk/etc/network/interfaces
# cp /etc/hostname /mnt/disk/etc ; vi /mnt/disk/etc/hostname
# cp /etc/apt/sources.list /mnt/disk/etc/apt ; vi /mnt/disk/etc/apt/sources.list
# cp /etc/fstab /mnt/disk/etc ; vi /mnt/disk/etc/fstab

ตรงไฟล์ /mnt/disk/etc/fstab อย่าลืมเปลี่ยน /dev/hda2 เป็น /dev/hda6

สร้างสภาพแวดล้อม เพื่อใช้ในการ chroot ไปยัง /mnt/disk
# mount -t proc none /mnt/disk/proc
# mount -o bind /dev /mnt/disk/dev
# mount -t sysfs /sys /mnt/disk/sys

chroot ไปยัง /mnt/disk
# chroot /mnt/disk /bin/bash

เริ่มการติดตั้งแพกเกจที่จำเป็นและปรับตั้งระบบ
server1:/# aptitude update
server1:/# aptitude install locales console-data
server1:/# dpkg-reconfigure locales
server1:/# aptitude install initrd-tools usbutils pciutils bzip2 ssh grub udev yaird ssh

( ถ้าต้องการระบบ X-Window ด้วย
server1:/# aptitude install xorg gdm gnome )

ติดตั้งเคอร์เนล
server1:/# aptitude install linux-image-686

อย่าลืมตั้งรหัสผ่านให้ root
server1:/# passwd

กันเหนียวด้วยการปรับตั้งระบบใหม่ทั้งหมด
server1:/# dpkg-reconfigure -a
ตอบค่าปริยายทั้งหมด ยกเว้นส่วนของ locales, tzconfig, dash ให้ตอบตามต้องการ

ออกจากสภาพ chroot
server1:/# exit

ยกเลิกการเมานต์ที่ผ่านมา
# umount /mnt/disk/proc
# umount /mnt/disk/dev
# umount /mnt/disk/sys
# ldconfig
# sync

(ถ้ายกเลิกเมานต์ไม่ผ่าน ไม่เป็นไร ให้ผ่านไปก่อน)

ปรับตั้งการบูต
# vi /boot/grub/menu.lst

แก้ไขลำดับการบูต
แก้จาก default 0 เป็น default 2

...
default        2
...

เติมลำดับการบูตให้กับเดเบียนใหม่ที่เราเพิ่งติดตั้งเสร็จ โดยต่อท้ายจากของเก่า

...
title       Etch-Experiment, kernel 2.6.18-3-386
root        (hd0,5)
kernel      /vmlinuz root=/dev/hda5 ro
initrd      /initrd.img
savedefault
...

เรียบร้อยแล้ว รีบูตใหม่ได้เลย
# reboot

ระบบใหม่จะเป็นเดเบียน Etch ใหม่แบบสะอาด ๆ
เมื่อจะทำการทดลองระบบใหม่ ถ้าจำเป็นต้องลงใหม่ก็ทำเหมือนเดิมครับ

ติดตั้งอูบุนตู Feisty ด้วย debootstrap จากเดเบียน Etch

สมมุติว่า mirror เราชื่อ www.example.com ได้ติดตั้ง apt-proxy สำหรับอูบุนตูไว้เรียบร้อยแล้ว
(เวลาใช้งานจาก apt-proxy ต้องระบุพอร์ตเป็น 9999)

และสมมุติว่าแบ่งพาร์ติชั่นไว้ดังนี้

/dev/hda1   = /    เป็นเดเบียน Etch
/dev/hda2   = ว่าง     ขนาด 20G เตรียมสำหรับ Feisty
/dev/hda3   = Extended
/dev/hda5   = swap  ขนาด 512M

เราจะติดตั้งระบบใหม่บน /dev/hda2 ให้มีขนาด 20G เพื่อใช้เป็น / (root) ของระบบใหม่

สร้างระบบไฟล์เป็น ext3
# mkfs.ext3 /dev/hda2

สร้างจุดเมานต์ให้ /dev/hda2 สมมุติว่าชื่อ /mnt/disk
# mkdir -p /mnt/disk

ก่อนจะติดตั้ง ต้องเมานต์ /dev/hda2 ลงบน /mnt/disk ก่อน
# mount /dev/hda2 /mnt/disk

ติดตั้ง debootstrap บน Etch
# aptitude install debootstrap

เนื่องจากแพกเกจ debootstrap ของ Etch ไม่มีสคริปต์สำหรับอูบุนตู Feisty
เราจึงต้องไปดาว์นโหลดแพกเกจ debootstrap ของ Feisty เอง เพื่อมาแตกเอาไฟล์สคริปต์นี้
# wget http://fr.archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_0.3.3.2ubuntu3_all.deb
ถึงวันนี้ มิเรอร์ของไทย mirror.in.th ยังไม่อัปเดตครับ

แตกด้วย Archive Manager เฉพาะไฟล์ที่ชื่อ feisty แล้วนำไปใส่ไว้ใน /usr/lib/debootstrap/scripts
# cp feisty /usr/lib/debootstrap/scripts

เริ่มติดตั้ง Feisty บน /mnt/disk ผ่าน debootstrap
# debootstrap feisty /mnt/disk http://www.example.com:9999/debian

เมื่อติดตั้งเสร็จแล้ว จำเป็นต้องคัดลอกไฟล์ที่จำเป็นในการเริ่มต้นระบบไปยัง /mnt/disk และทำการแก้ไขตามจำเป็น
# cp /etc/hosts /mnt/disk/etc ; vi /mnt/disk/etc/hosts
# cp /etc/networks/interface /mnt/disk/etc/networks ; vi /mnt/disk/etc/networks/interface
# cp /etc/hostname /mnt/disk/etc ; vi /mnt/disk/etc/hostname
# cp /etc/apt/sources.list /mnt/disk/etc/apt ; vi /mnt/disk/etc/apt/sources.list
# cp /etc/fstab /mnt/disk/etc ; vi /mnt/disk/etc/fstab

ตรงไฟล์ /mnt/disk/etc/fstab อย่าลืมเปลี่ยน /dev/hda1 เป็น /dev/hda2

แก้ไขไฟล์ /etc/apt/sources.list เป็นดังนี้
# vi /mnt/disk/etc/apt/sources.list

deb     http://www.example.com:9999/ubuntu feisty main restricted universe multiverse
deb-src http://www.example.com:9999/ubuntu feisty main restricted universe multiverse

สร้างสภาพแวดล้อม เพื่อใช้ในการ chroot ไปยัง /mnt/disk
# mount -t proc none /mnt/disk/proc
# mount -o bind /dev /mnt/disk/dev
# mount -t sysfs /sys /mnt/disk/sys

chroot ไปยัง /mnt/disk
# chroot /mnt/disk /bin/bash

เริ่มการติดตั้งแพกเกจที่จำเป็นและปรับตั้งระบบ
(CHROOT)# mount -a
(CHROOT)# aptitude update
(CHROOT)# aptitude install locales console-data localeconf

ปรับแต่ง locale ให้ด้วย
(CHROOT)# locale-def en_US.UTF-8
(CHROOT)# dpkg-reconfigure locales localeconf

ติดตั้งแพกเกจจำเป็นที่เหลือ
(CHROOT)# aptitude install initrd-tools usbutils pciutils bzip2 ssh grub udev yaird ubuntu-minimal ubuntu-standard

( ถ้าต้องการระบบ X-Window ด้วย
(CHROOT)# aptitude install ubuntu-desktop xorg gdm gnome )

ติดตั้งเคอร์เนล
(CHROOT)# aptitude install linux-image-686

อย่าลืมตั้งรหัสผ่านให้ root
(CHROOT)# passwd

ปรับตั้งระบบใหม่ทั้งหมด
(CHROOT)# dpkg-reconfigure -a
ตอบค่าปริยายทั้งหมด ยกเว้นส่วนของ locales, tzconfig, dash ให้ตอบตามต้องการ

ออกจากสภาพ chroot
(CHROOT)# exit

ยกเลิกการเมานต์ที่ผ่านมา
# umount /mnt/disk/proc
# umount /mnt/disk/dev
# umount /mnt/disk/sys
# ldconfig
# sync

(ถ้ายกเลิกเมานต์ไม่ผ่าน ไม่เป็นไร ให้ผ่านไปก่อน)

ปรับตั้งการบูต
# vi /boot/grub/menu.lst

แก้ไขลำดับการบูต
แก้จาก default 0 เป็น default 2

...
default        2
...

เติมลำดับการบูตให้กับอูบุนตูใหม่ที่เราเพิ่งติดตั้งเสร็จ โดยต่อท้ายจากของเก่า

...
title       Ubuntu Feisty - Experiment, kernel 2.6.20-15-generic
root        (hd0,1)
kernel      /vmlinuz root=/dev/hda2 ro
initrd      /initrd.img
savedefault
...

เรียบร้อยแล้ว รีบูตใหม่ได้เลย
# reboot

จะได้อูบุนตู Feisty ที่ติดตั้งผ่าน debootstrap

หมายเหตุ

  • เนื่องจากติดตั้งข้ามดิสโตร เมื่อบูตด้วยอูบุนตูแล้ว อย่าลืมใช้คำสั่งชุดนี้ด้วย
    $ sudo dpkg-reconfigure -a
    $ sudo aptitude update && sudo aptitude dist-upgrade
  • การทดลองจริง อาจไม่ราบรื่นแบบที่เขียน ถ้าผ่านขั้นตอนการติดตั้งเคอร์เนลแล้ว สามารถรีบูตเป็น Feisty แล้วมาทำต่อ อาจให้ผลที่ดีกว่า