从零开始构建Ubuntu LiveCD

从零开始构建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

你可能感兴趣的:(从零开始构建Ubuntu LiveCD)