定制Ubuntu LiveCD,其实可以使用UCK来完成。不过因为某些原因,在我的系统上UCK运行起来有些问题,懒得折腾,就学习了下手动构建LiveCD。我参考的 是Ubuntu官方的教程 ,所以以下内容的大部分为此教程的翻译。
说明:你完全可以使用UCK这类软件来定制LiveCD,这样很可能便捷许多(我也没有用过)。
这个教程讲的是从零开始构建一个LiveCD,如果你希望在现有LiveCD的基础上来定制,那么可以参考这里。
构建LiveCD需要4个步骤:
一:创建基本系统,进入虚根环境
使用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}