Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1867131
  • 博文数量: 473
  • 博客积分: 13997
  • 博客等级: 上将
  • 技术积分: 5953
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 11:52
文章分类

全部博文(473)

文章存档

2014年(8)

2013年(38)

2012年(95)

2011年(181)

2010年(151)

分类: LINUX

2010-06-24 17:25:31

定制Ubuntu LiveCD,其实可以使用UCK来完成。不过因为某些原因,在我的系统上UCK运行起来有些问题,懒得折腾,就学习了下手动构建LiveCD。我参考的 是 ,所以以下内容的大部分为此教程的翻译。


说明:你完全可以使用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对应的 。否则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.
# 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

阅读(2066) | 评论(0) | 转发(0) |
0

上一篇:Debootstrap分析

下一篇:Read用法----shell交互

给主人留下些什么吧!~~