由 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:善用學園中的"搜尋"功能,往往答案就在裡面窩。