定製Ubuntu LiveCD,其實可以使用UCK來完成。不過因爲某些原因,在我的系統上UCK運行起來有些問題,懶得折騰,就學習了下手動構建LiveCD。我參考的是Ubuntu官方的教程 ,所以以下內容的大部分爲此教程的翻譯。
說明:你完全可以使用UCK這類軟件來定製LiveCD,這樣很可能便捷許多(我也沒有用過)。
這個教程講的是從零開始構建一個LiveCD,如果你希望在現有LiveCD的基礎上來定製,那麼可以參考這裏 。
構建LiveCD需要4個步驟:
- 創建一個虛根環境,在其中安裝軟件。
- 壓縮這個虛根環境。
- 創建並配置鏡像(包含 linux內核,bootloader (isolinux),被壓縮的文件系統以及其他資源)。
- 刻錄鏡像到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