#!/bin/bash
#
# run this script to create a LiveCD in /tmp/live_data_1234
#
# Author: Tomas M.
# 这里,重新定义变量PATH,注意覆盖了原来系统的PATH变量。
export PATH=.:./tools:../tools:/usr/sbin:/usr/bin:/sbin:/bin:/
# 这三行,是要确保脚本执行的目录是 build脚本 所在的目录,
# 如果执行 "./build " , 则目录就是当前目录
# 如果执行 “/home/xxx/linix-live/build", 则会 “cd /home/xxx/linux-live"
CHANGEDIR=$(dirname $(readlink -f $0))
echo "Changing current directory to $CHANGEDIR"
cd $CHANGEDIR
# 导入/执行 tools/liblinuxlive,这个脚本中是全局变量、函数的定义,从名字就看出来了"lib"嘛
# 整个工程所用的许多工具函数什么的都在这里定义
# 导入失败则退出
. liblinuxlive || exit 1
# 导入/执行 .config 脚本, 这个脚本里是一些用户可以定制的参数,可以看一下。
. ./.config || exit 1
# only root can continue, because only root can read all files from your system
# 在tools/liblinuxlive中定义,必须以root执行build脚本
allow_only_root
# live CD name
# 让你自己给liveCD起个名字,默认名在.config中定义,为"mylinux"
echo -ne "Name of your live distro [hit enter for $LIVECDNAME]: "
read NEWLIVECDNAME
if [ "$NEWLIVECDNAME" != "" ]; then LIVECDNAME=$NEWLIVECDNAME; fi
LIVECDNAME=$(echo $LIVECDNAME | tr -d ' ')# 删去空格,保证没有空格
# 安装linux-live到 $ROOT/usr 中
# 特别的,把 tools/liblinuxlive 放到 $ROOT/usr/lib/ 下
# 把 tools/ 下面的其它可执行文件放到 $ROOT/usr/bin 下
# $ROOT 在 .config 中定义, 默认为 根 "/"
. ./install# 如果没有改.config中的$ROOT,执行这一句时,$ROOT为空,将安装的当前运行的系统中,这对于当前运行系统与要制作的live系统不一样时有区别。
if [ "$ROOT" -a "$ROOT" != "/" ]; then
. ./install $ROOT
fi
# search for kernel
# 搜索内核文件 vmlinuz。一般的发行版本现在都是vmlinuz-2.6.3x.xx. ,即会带着内核信息,需要自己作个链接吧。
VMLINUZ=$ROOT/boot/vmlinuz
if [ -L "$VMLINUZ" ]; then VMLINUZ=$(readlink -f $VMLINUZ); fi
echo -ne "Enter path for the kernel you'd like to use [hit enter for $VMLINUZ]: "
read NEWKERNEL
if [ "$NEWKERNEL" != "" ]; then VMLINUZ="$NEWKERNEL"; fi
if [ "$(ls $VMLINUZ 2>>$DEBUG)" = "" ]; then echo "cannot find $VMLINUZ"; exit 1; fi
header "Creating LiveCD from your Linux"
echo "some debug information can be found in $DEBUG"
# 创建目标文件夹
mkdir -p $CDDATA/$LIVECDNAME/{base,modules,optional,rootcopy,tools}
# 把 cd-root/boot 文件夹中的内容拷贝到 $CDDATA, 并修改几个文件的内容,改为 $LIVECDNAME 的定制信息
echo "copying cd-root to $CDDATA, using kernel from $VMLINUZ"
cp -R cd-root/boot $CDDATA
for i in isolinux syslinux; do
cat cd-root/boot/$i/$i.cfg | sed -r "s/LABEL linux/LABEL $LIVECDNAME/" | sed -r "s/Run linux/Run $LIVECDNAME/" > $CDDATA/boot/$i/$i.cfg
done
mv $CDDATA/boot/dos/linux.bat $CDDATA/boot/dos/${LIVECDNAME:0:8}.bat
cat cd-root/boot/dos/readme.txt | sed -r "s/LINUX.BAT/"${LIVECDNAME:0:8}.bat"/" > $CDDATA/boot/dos/readme.txt
# 拷贝文件
mkdir -p $CDDATA/$LIVECDNAME
cp -R cd-root/linux/* $CDDATA/$LIVECDNAME
cp tools/* $CDDATA/$LIVECDNAME/tools
cp -R DOC/LICENSE $CDDATA/$LIVECDNAME
cp $VMLINUZ $CDDATA/boot/vmlinuz
# 用 initrd/initrd_create 来创建initrd.gz, 并拷贝到$CDDATA/boot/initrd.gz
echo "creating initrd image..."
echo "Using kernel modules from $ROOT/$LMK"
cd initrd
./initrd_create $LIVECDNAME
if [ "$?" -ne 0 ]; then exit; fi
cd ..
cp initrd/initrd.gz $CDDATA/boot/initrd.gz
rm initrd/initrd.gz
echo "creating compressed images..."
# 把 $MKMOD(在.config中定义)中的每个文件夹都用 create_module(在liblinuxlive中定义) 压缩/模块化
for dir in $MKMOD; do
if [ -d $ROOT/$dir ]; then
echo "base/$dir.lzm ..."
echo -ne > exclude.txt
for i in $EXCLUDE; do
part=$(echo "x/$i" | tr -s / | sed -r "s:x/[^/]+/::")
if [ -e "$ROOT/$dir/$part" ]; then echo "$ROOT/$dir/$part" >> exclude.txt; fi
done
cat exclude.txt
create_module $ROOT/$dir $CDDATA/$LIVECDNAME/base/$dir.lzm -keep-as-directory -ef exclude.txt
if [ $? -ne 0 ]; then exit; fi
rm exclude.txt
echo
fi
done
# 后续还有一些工作,创建iso文件,或制作启动USB等。
cd $CDDATA/$LIVECDNAME
echo "--------done----------"
echo
echo "* run $CDDATA/$LIVECDNAME/make_iso.bat to create ISO image"
echo "* or copy content of $CDDATA to your USB device"
echo "and run ./boot/bootinst.sh (from the device!) to setup boot sector"
echo
echo "Now press Enter..."
read junk