[轉貼]製作 livecd

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[轉貼]製作 livecd

文章moto » 週三 7月 07, 2004 4:25 pm

本文轉貼自: http://os208.nchc.org.tw/~klhaung 之 Blake, Kuo-Lien Huang (c00hkl00@nchc.org.tw) 兄大作:
代碼: 選擇全部
主旨: 製作 livecd
日期: 2003/02/18
內容:

1. Debian 中的 bootcd package

debian 有兩個 package 可以做 live cd
(1) mkinitrd-cd
(2) bootcd
前者的 dependency 有問題, 所以我就用後者,
很簡單的方法就做出了一個可開機的 iso image
(我是用vmware做測試的, 希望vmware不會耍我:>)


以下是產生一個 base 的 debian 的作法:
# apt-get install bootcd debootstrap
# mkdir /var/lib/bootcd
# vi /etc/bootcd/bootcdwrite.conf
修改
ISO_ONLY="yes"
BLANKING=no

# debootstrap --arch i386 woody /var/lib/bootcd
# apt-get install kernel-image-2.4.18-bf2.4 -d
# dpkg --root /var/lib/bootcd -i \
  /var/cache/apt/archives/kernel-image-2.4.18-bf2.4_2.4.1806-i386.deb
# bootcdwrite

然後你就可以在 /var/spool/bootcd/ 中找到 cdimage.iso 了

(ps: bootcd 是用 syslinux 去開機的, 反正這個動作也是很機械化的,
 所以 bootcdwrite 只是個 shell script 去使用它而已)

2. Debian 中的 bootcd package 的運作

產生 bootable cd 的指令是:

mkisofs $GRAFTPOINTS $MKISO_NOT \
    -R -b isolinux/isolinux.bin -c isolinux/boot.cat -o $VAR/cdimage \
    -no-emul-boot -boot-load-size 4 -boot-info-table \
    -x $SRCDI/proc -x $VAR -x $ERRLOG \
    -x $SRCDI/etc -x $SRCDI/var -x $SRCDI/tmp \
    -x $SRCDI/dev -x $SRCDI/home -x $SRCDI/root $EXCLUDE \
    /=$SRCDI/ /=$CHANGES \
    /home.ro/=$SRCDI/home /root.ro/=$SRCDI/root /var.ro/=$SRCDI/var \
    /etc.ro/=$SRCDI/etc $MKISODEVFS

說明:
(1) -x <PATH>
  Exclude <PATH> from being written to CDROM

這段是 pathspec 的描述
    /=$SRCDI/ /=$CHANGES \
    /home.ro/=$SRCDI/home /root.ro/=$SRCDI/root /var.ro/=$SRCDI/var \
    /etc.ro/=$SRCDI/etc
與 -x 搭佩就可以看出 CD 中會做出
/home.ro : copy /home as /home.ro in CD
/root.ro : copy /root as /roo.ro in CD
/var.ro  : copy /var  as /var.ro in CD
/etc.ro  : copy /etc  as /etc.ro in CD
/home /root /var /etc 都沒有被 copy 進去
那這些目錄是如何處理的呢? 用 RAMDISK, 請看 (4)

(2) -b <BOOT_CATALOG>
              Specifies the path and filename of the boot catalog
              to  be used when making an "El Torito" bootable CD.
              The pathname must be relative to  the  source  path
              specified  to  mkisofs.  This option is required to
              make a bootable CD.  This  file  will  be  inserted
              into  the output tree and not created in the source
              filesystem, so be sure the specified filename  does
              not  conflict  with an existing file, as it will be
              excluded. Usually a  name  like  "boot.catalog"  is
              chosen.

(3) isolinux/isolinux.bin, isolinux/vmlinuz.img
是在 do_isolinux() 處理:

   將 syslinux.bin (/usr/lib/syslinux.bin) 複製到 $(BOOTCDROOT)/isolinux
    底下, 也將我所 compile 好的 kernel 覆製到 $(BOOTCDROOT)/isolinux 下成為
vmlinuz.img

(4) RAMDISK
* linux 的開機程序是這樣的:
          - 將 kernel 載入
          - 將 initrd 載入 (如果 append 中有寫的話)
          - /sbin/init - 檢查 /etc/inittab 中 si::sysinit: 的設定,
            Debian default 是 si::susinit::/etc/init.d/rcS
            /etc/init.d/rcS 中會去 /etc/init.d/rcS.d 中依照順序執行

            bootcd 就是在這做了些手腳
( drbl也是, 不過drbl是將init前需要將 / mount 回來
              bootcd則是在 rc.d 的 script中做了些手腳)

* 它在光碟的檔案結構中產生一些 link
  /etc -> /ram1/etc
  /var -> /ram1/var
  /home -> /ram1/home
  /root -> /ram1/root
  /tmp  -> /ram1/tmp
  然後將
  /ram1/etc -> /etc.ro
  /ram1/var -> /var.ro
  /ram1/home -> /home.ro
  /ram1/root -> /root.ro
  /ram1/tmp -> /tmp.ro

    * 所以在開機過程中 init 所需要的 /etc/inittab 是放在 /etc.ro/ 的,
  然後在 /etc.ro/rcS.d/ 中加了兩個 script:
  S12bootcdram.sh
  S13bootcdflop.sh
  其中 S12bootcdram.sh 將 ramdisk mount 起到 ram1 中
  (mount /dev/ram1 /ram1 -o defaults,rw)
  然後將 /ram1.cpio.gz 解開放在 /ram1 中
  /dev/ram2 and ram2.cpio.gz 如法炮治

  那 ram1.cpio.gz 中放的是什麼呢?
  bootcdwrite 中有一段 code 會將我們做好的 bootcdimage 中的
  /etc /home /root /tmp 放在 ram1.cpio.gz 中
  /var 則放在 ram2.cpio.gz 中

============================================================================
# at Boottime /etc -> /ram1/etc -> /etc.ro
for i in etc tmp dev home root; do run ln -sf /$i.ro $CHANGES/ram1/$i; done
for i in var; do run ln -sf /$i.ro $CHANGES/ram2/$i; done
for i in etc tmp dev home root; do  run ln -sf /ram1/$i $CHANGES/$i; done
for i in var; do  run ln -sf /ram2/$i $CHANGES/$i; done
============================================================================
歡迎你來到MOTO學園一起討論Debian相關問題。
在post問題前可先別忘記了以下的步驟:
1:翻一下/usr/share/doc/中是否已經有解答了?
2:閱讀一下無痛起步是否已經提到了?
3:找一下google予以解答?
4:善用學園中的"搜尋"功能,往往答案就在裡面窩。
頭像
moto
摩托學園站長
摩托學園站長
 
文章: 2808
註冊時間: 週二 9月 03, 2002 3:37 am
來自: 台北

回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客