從零開始構建Ubuntu LiveCD

定製Ubuntu LiveCD,其實可以使用UCK來完成。不過因爲某些原因,在我的系統上UCK運行起來有些問題,懶得折騰,就學習了下手動構建LiveCD。我參考的是Ubuntu官方的教程 ,所以以下內容的大部分爲此教程的翻譯。


說明:你完全可以使用UCK這類軟件來定製LiveCD,這樣很可能便捷許多(我也沒有用過)。

 

這個教程講的是從零開始構建一個LiveCD,如果你希望在現有LiveCD的基礎上來定製,那麼可以參考這裏

 

構建LiveCD需要4個步驟:

  1. 創建一個虛根環境,在其中安裝軟件。
  2. 壓縮這個虛根環境。
  3. 創建並配置鏡像(包含 linux內核,bootloader (isolinux),被壓縮的文件系統以及其他資源)。
  4. 刻錄鏡像到CD,或者U盤。

一:創建基本系統,進入虛根環境
使用debootstrap可以很方便的創建一個基本的linux系統,debootstrap被包含在軟件倉庫中,可以直接安裝。

mkdir livecd/livefs
sudo debootstrap --arch=i386 karmic livefs
cd livecd


我用的Ubuntu 9.10,所以是karmic。要注意的是ubuntu發行版中的debootstrap不包含引導下一個Ubuntu發行版的文件,比如,如果沒有安裝Karmic的debootstrap,你沒有你不能在Intrepid上啓動Karmic。所以你必須安裝對應版本的debootstrap。

 

複製域名解析配置文件:

sudo cp /etc/resolv.conf chroot/etc/resolv.conf



複製軟件包源列表(你也需要複製文件夾sources.list.d,如果有的話):

sudo cp /etc/apt/sources.list chroot/etc/apt/sources.list



複製源列表後,還得導入密鑰。你可以使用apt-key exportall導入宿主系統的所有密鑰到一個文件,在進入虛根環境後再用apt-key  add來導入這個文件。

 

下面進入虛根環境:

sudo chroot chroot

掛載必要的文件系統:
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts


設置環境變量:
export HOME=/root
export LC_ALL=C


然後導入剛纔導出的密鑰文件,假設文件名爲ppa.key
apt-key add ppa.key

更新源:

apt-get update


Ubuntu 9.10有一個bug,需要修復一下:

dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl


安裝lve系統所必須的包:
apt-get install ubuntu-standard casper lupin-casper
apt-get install discover1 laptop-detect os-prober
apt-get install linux-generic


Ubuntu 9.04在沒有安裝network-manager的情況下會在配置網卡是僵死,Ubuntu 9.10沒有這種情況。所以先安裝network-manager:
apt-get install --no-install-recommends network-manager

接下來就可以使用apt-get安裝卸載軟件了。如果你是想構建一個完整的gnome桌面,那麼只需要安裝ubuntu-desktop這個包就可以了,它會自動安裝它依賴的所有包。

如果你希望以後從LiveCD安裝到硬盤上,那麼得安裝ubiquity。

 

GTK前端,對於Gnome或Xfce:

apt-get install ubiquity-frontend-gtk

 

QT前端,對於KDE:

apt-get install ubiquity-frontend-kde

 

在退出虛根環境前,如果修補了bug,你需要撤銷的轉移:

rm /sbin/initctl

dpkg-divert --rename --remove /sbin/initctl

 

 

一些清理的步驟:

apt-get clean

rm -rf /tmp/*

rm /etc/resolv.conf

 

取消掛載文件系統:

umount -lf /proc

umount -lf /sys

umount -lf /dev/pts


退出虛根環境:

exit


二:壓縮虛根環境

 

創建目錄:

mkdir -p image/casper

 

壓縮虛根環境:

如果這個LiveCD需要安裝到硬盤上,那麼你需要將/boot文件夾也放進SquashFS文件系統。使用命令:

sudo mksquashfs chroot image/casper/filesystem.squashfs

 

如果你不需要以後將它安裝到硬盤上,那麼你則不需要/boot文件夾。你可以在壓縮虛根環境時忽略/boot文件夾,以節省一些空間。

sudo mksquashfs chroot image/casper/filesystem.squashfs -e boot

因爲LiveCD在啓動時必須先加載內核後才能讀取SquashFS裏面的內容,所有內核文件是放在SquashFS之外的,SquashFS的內核文件以及initrd根本不會用來引導LiveCD。

注意:如果你是在較早的系統上構建Karmic(9.10),那麼你需要安裝Karmic對應的squashfs-tools包 。否則LiveCD不能啓動。

 

三:創建並配置鏡像

 

安裝工具:
sudo apt-get install syslinux squashfs-tools mkisofs sbm

創建目錄:

mkdir -p image/{isolinux,install}

 

然後需要linux內核和由casper腳本創建的initrd,在宿主系統中可以找到它們。注意在9.10中,initrd使用的是lz格式而非gz格式

cp chroot/boot/vmlinuz-2.6.**-**-generic image/casper/vmlinuz

cp chroot/boot/initrd.img-2.6.**-**-generic image/casper/initrd.gz

 

複製isolinux和sbm的二進制文件:

cp /usr/lib/syslinux/isolinux.bin image/isolinux/
cp /boot/memtest86+.bin image/install/memtest
cp /boot/sbm.img image/install/

 

 

創建引導配置文件image/isolinux/isolinux.cfg:

這是以一個樣例,你可以查看syslinux的文檔來獲得詳細說明:

DEFAULT live
LABEL live
menu label ^Start or install Ubuntu
kernel /casper/vmlinuz
append file=/cdrom/preseed/ubuntu.seed boot=casper persistent initrd=/casper/initrd.gz quiet splash --
LABEL check
menu label ^Check CD for defects
kernel /casper/vmlinuz
append boot=casper integrity-check initrd=/casper/initrd.gz quiet splash --
LABEL memtest
menu label ^Memory test
kernel /install/memtest
append -
LABEL hd
menu label ^Boot from first hard disk
localboot 0x80
append -
DISPLAY isolinux.txt
TIMEOUT 300
PROMPT 1

#prompt flag_val
#
# If flag_val is 0, display the "boot:" prompt
# only if the Shift or Alt key is pressed,
# or Caps Lock or Scroll lock is set (this is the default).
# If flag_val is 1, always display the "boot:" prompt.
# http://linux.die.net/man/1/syslinux syslinux manpage

 

注意initrd的格式 (initrd.gz或initrd.lz)。

 

這個示例中,會顯示isolinux.txt的內容,所有在創建image/isolinux/isolinux.txt的內容:

 

splash.rle

************************************************************************

This is an Ubuntu Remix Live CD.

For the default live system, enter "live". To run memtest86+, enter "memtest"


************************************************************************


在splash.rle之前有一個特殊符號,這個符號你可以用一下的命令輸入:
printf "/x18" > image/isolinux/isolinux.txt

然後在打開這個文件添加其餘的內容。

創建manifest:

將已安裝包的清單保存到
image/casper/filesystem.manifest
sudo chroot chroot dpkg-query -W --showformat='${Package} ${Version}/n' | sudo tee image/casper/filesystem.manifest

然後創建desktop的清單,並在其總去除這些包,ubiquity casper live-initramfs user-setup discover1 xresprobe os-prober libdebian-installer4:
sudo cp -v image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
REMOVE='ubiquity casper live-initramfs user-setup discover1 xresprobe os-prober libdebian-installer4'
for i in $REMOVE
do
sudo sed -i "/${i}/d" image/casper/filesystem.manifest-desktop
done


創建image/README.diskdefines:


#define DISKNAME Ubuntu 9.10 "Karmic Koala" - Release i386 **Remix**
#define TYPE binary
#define TYPEbinary 1
#define ARCH i386
#define ARCHi386 1
#define DISKNUM 1
#define DISKNUM1 1
#define TOTALNUM 0
#define TOTALNUM0 1

 

創建一個空文件"ubuntu" 和一個隱藏文件夾" folder。這樣的作用是讓USB Creator可以識別這個LiveCD。如果沒有這兩樣,LiveCD依然可以啓動,但在無法使用USB creator將鏡像放至U盤:

touch image/ubuntu

mkdir image/.disk
cd image/.disk
touch base_installable
echo "full_cd/single" > cd_type
echo 'Ubuntu 9.10 "Karmic Koala Remix" - i386 (20090429)' > info
echo "http//ubuntu-rescue-remix.org" > release_notes_url
cd ../..

生成MD5值:

sudo -s

(cd image && find . -type f -print0 | xargs -0 md5sum | grep -v "/./md5sum.txt" > md5sum.txt)
exit


生成ISO鏡像:
cd image
sudo mkisofs -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-remix.iso .
cd ..


現在整個鏡像就製作完成了,你可以先在虛擬機中測試,沒有問題再刻錄到CD或U盤。
sudo qemu -m 1024 -cdrom ubuntu-remix.iso

四:安裝至U盤(EXT2):

刻錄至光盤的步驟我就略過了,很簡單。安裝至U盤一共8個步驟,使用EXT文件系統。你也可以使用USB-Creator將ISO鏡像很方便的放到U盤裏,製作非常簡單,但使用起來有一些不便。

 

1:準備工作

mkdir -p liveusb/{mnt,mnt}
cd liveusb
touch loop


2:創建一個ext2格式的loop設備,使用適合ISO鏡像的大小,在我這裏爲800M。

dd if=/dev/zero of=loop bs=1 count=1 seek=800M
mkfs.ext2 -L rescue -m 0 loop


3:掛載ISO鏡像到文件夾tmp,掛載loop設備到文件夾mntmkdir tmp
sudo mount -o loop ../ubuntu-remix.iso tmp
sudo mount -o loop loop mnt


4:複製ISO鏡像的內容到文件夾mnt
sudo cp -a tmp/* mnt/

5:更改啓動配置選項
cd mnt
sudo mkdir boot
sudo mv isolinux boot/extlinux
sudo mv boot/extlinux/isolinux.cfg boot/extlinux/extlinux.conf
sudo extlinux --install boot/extlinux/
cd ..
sudo umount mnt
sudo umount tmp


6:歸檔
gzip -c loop > remixusb.gz

7:給U盤分區:
sudo fdisk /dev/sdb

命令m(查看幫助),p(查看分區),d(刪除分區),n(增加分區),a(設置可啓動分區)
將U盤分爲兩個區,使用命令格式化爲ext2文件系統。

sudo mkfs.ext2 -L LiveUSB /dev/sdb1
sudo mkfs.ext2 -L casper-rw /dev/sdb2


注意:根據具體情況確定U盤的設備名,在我的機器上爲sdb,你的機器上很可能不是如此。

給U盤分區的目的是爲了可以用戶數據儲存在第二個分區,注意這個分區的名字爲casper-rw,並且請確認extlinux.conf(即isolinux.cfg)中的Live條目裏面的append行中包含參數persistent。這樣你的所有用戶數據就會儲存在casper-rw分區中,非常清晰明瞭。

8:最後安裝至U盤:
zcat remixusb.gz | sudo tee /dev/sdb1 >/dev/null

說明,如果U盤無法啓動,請嘗試安裝mrb:
sudo apt-get install mbr
sudo install-mbr /dev/sdb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章