- 论坛徽章:
- 0
|
本帖最后由 cliffordl 于 2013-05-08 16:08 编辑
回复 3# Hongqiyaodao
4. LiveUSB的制作
4.1 准备工作
1. 创建“制作基地”
export LIVEUSB=/opt/liveusb
mkdir -pv ${LIVEUSB}
2. 创建制作初始化辅助系统的目录:
mkdir -pv ${LIVEUSB}/image/initramfs
3. 创建制作最终系统的目录:
mkdir -pv ${LIVEUSB}/system
4. 创建制作LiveUSB目录:
mkdir -pv ${LIVEUSB}/usb/boot
“usb”目录用于存放LiveUSB的内容,包括最终系统,“boot”目录存放GRUB相关的文件、内核以及辅助文件等。
5. 创建数据保存目录
mkdir -pv save save-data
分别是“U盘+挂载U盘存储”和“U盘空间存储”方式中使用的数据保存目录。
6. 创建软件包编译目录
mkdir -pv ${LIVEUSB}/{build,download}
export BUILD_DIR=${LIVEUSB}/build
export DOWNLOAD=${LIVEUSB}/download
4.2 相关软件包的编译安装
Squashfs-tools是Squashfs软件包中的一个部分,用于将目录或文件复制成SquashFS格式的镜像文件,LiveUSB的制作中用于压缩最终系统。
Cpio软件包提供用于将文件和目录打包成CPIO格式文件的命令,用于为LiveUSB中的Initramfs辅助系统打包。
CURL软件包中包含了从网络下载数据和文件的命令和函数库,在LiveUSB制作中作为Git软件包的支持库安装。
Git软件包提供了分布式的版本管理工具,作为LiveUSB制作过程中用于下载AUFS文件系统的内核补丁包。
Dosfstools软件包提供的工具命令能够处理MS-DOS使用的文件系统。
Xfsprogs软件包中包含对XFS文件系统处理的相关命令。
4.3 Live系统的制作
pushd ${LIVEUSB}/system
cp -a /{bin,etc,lib,sbin,root,usr} ./
修改模板系统为LiveUSB的最终系统
删除不必要的目录
rm -rf usr/src
rm -rf lib/modules
rm -f lib/udev/write_*
rm -f etc/udev/rules.d/70*
增加必要的文件和目录
mkdir -pv dev proc sys tmp mnt home root
chmod 1777 tmp
chmod 0700 root
mkdir -pv var/{run,log,lock,mail,spool}
mkdir -pv var/{opt,cache,lib/{misc,locate},local}
建立日志相关文件
touch var/run/utmp var/log/{btmp,lastlog,wtmp}
chgrp utmp var/run/utmp var/log/lastlog
chmod 644 var/run/utmp var/log/lastlog
创建合适的/etc/fstab
cat > ${LIVEUSB}/system/etc/fstab << EOF
none /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
EOF
创建合适的/etc/mtab
cat > ${LIVEUSB}/system/etc/mtab << EOF
none /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts gid=4,mode=620 0 0
EOF
启动脚本变更
rm -rf ${LIVEUSB}/system/etc/rc.d/rcsysinit.d/{S20checkfs,S30mountfs}
修改/etc/inittab
vi ${LIVEUSB}/system/etc/inittab
1:2345:respawn:/bin/openvt -f -c 1 -e -w -- /usr/bin/root-login
2:2345:respawn:/bin/openvt -f -c 2 -e -w -- /usr/bin/root-login
3:2345:respawn:/bin/openvt -f -c 3 -e -w -- /usr/bin/root-login
4:2345:respawn:/bin/openvt -f -c 4 -e -w -- /usr/bin/root-login
5:2345:respawn:/bin/openvt -f -c 5 -e -w -- /usr/bin/root-login
6:2345:respawn:/bin/openvt -f -c 6 -e -w -- /usr/bin/root-login
建立/usr/bin/root-login命令
/etc/inittab中设置了使用/usr/bin/root-login命令来代替登陆命令,但该命令并不存在,需要我们创建一个。使用如下命令:
cat > ${LIVEUSB}/system/usr/bin/root-login << "EOF"
#!/bin/bash
exec /bin/login -f root
EOF
chmod 0755 ${LIVEUSB}/system/usr/bin/root-login
设置动态获取IP地址
pushd ${LIVEUSB}/system/etc/sysconfig/network-devices
cat > ifconfig.eth0/ip << "EOF"
ONBOOT=yes
SERVICE=dhcpcd
DHCP_START=""
DHCP_STOP="-k"
EOF
popd
完成最终系统的制作
popd
5. LiveUSB对内核的要求
LiveUSB不同于一般使用硬盘安装的系统,需要根据LiveUSB的情况定之内核,LiveUSB必须支持的内核功能如下:
初始化辅助系统:
内存磁盘(RAM Disk)
回环设备(Loop Device)
SquashFS文件系统
AuFS文件系统
U盘设备支持
U盘所使用的文件系统
这些支持中除了AuFS文件系统外都已经在标准的Linux内核中提供了相应的功能选项,AuFS文件系统目前还未进入到标准的Linux内核中,需要手动为Linux内核安装AuFS补丁。
使用下面命令从网络下载AuFS的内核补丁:
pushd ${BUILD}
git clone http://git.c3sl.ufpr.br/pub/scm/aufs/aufs2-standalone.git
cd aufs2-standalone
git checkout origin/aufs2-33
popd
对内核应用AUFS补丁
patch -Np1 -i ${BUILD}/aufs2-standalone/aufs2-base.patch
patch -Np1 -i ${BUILD}/aufs2-standalone/aufs2-kbuild.patch
patch -Np1 -i ${BUILD}/aufs2-standalone/aufs2-standalone.patch
cp -av ${BUILD}/aufs2-standalone/{fs,include} ./
此时内核源码已经支持AUFS文件系统了,但还需要配置内核使AUFS成为使用状态。
5.2 配置内核源代码
make menuconfig
make
安装内核文件
cp arch/x86/boot/bzImage ${LIVEUSB}/usb/boot/liveusb-kernel
安装内核模块
make INSTALL_MOD_PATH=${LIVEUSB}/system/ modules_install
安装制作的Initramfs文件的特殊命令
cp -a scripts/gen_initramfs_list.sh ${LIVEUSB}/image/
cp -a usr/gen_init_cpio ${LIVEUSB}/image/
popd
6. LiveUSB初始化辅助系统的制作
进入Initramfs的制作目录开始创建系统,命令如下:
pushd ${LIVEUSB}/image/initramfs
6.1 Initramfs的init命令
Initramfs从/init文件开始进行,这是由内核所决定的。
创建init文件并准备编辑,使用命令:
cat > init << "EOF"
#!/bin/bash
挂载必要的文件系统
mount -t proc proc /proc
mount -t sysfs sysfs /sys
将/dev目录挂载为tmpfs文件系统
mount -n -t tmpfs -o mode=0755 udev /dev
使用Udev来创建各种设备文件
cp --preserve=all --recursive --remove-destination /lib/udev/devices/* /dev
echo "" > /sys/kernel/uenvent_helper
udevd --daemon
mkdir -p /dev/.udev/queue
udevadm trigger
udevadm settle
加载内核模块
while read module args; do
case "$module" in
""|"#"*) continue;;
esac
insmod.static /modules/$(module) ${args} >/dev/null
done < /modules/conf
为Live系统准备目录
export SYSTEM=/SYSTEM
mkdir -p ${SYSTEM} /mnt
mount -t tmpfs tempfs /mnt
mkdir -p /mnt/{usb,system}
设置等待U盘时间
DELAY=$(cat /proc/cmdline | awk -F'rootdelay=' 'print $2' |awk -F' ' 'print $1')
if [ "${DELAY}" = "" ]; then
sleep 10
else
sleep ${DELAY}
fi
搜索LiveUSB所在的U盘设备
UUID=$(cat /proc/cmdline | awk -F’UUID=”’ ‘{print $2}’ | awk -F’”’ ‘{print $1}’)
if [ "${UUID}"= "" ]; then
LiveUSB=$(cat /proc/cmdline |awk -F'root=' '{print $2}' | awk '{print $1}')
else
LiveUSB=$(blkid -U ${UUID})
fi
if [ "${LiveUSB}" != "" ]; then
mount ${liveUSB} /mnt/usb
else
exit
fi
创建最终系统运行环境
U盘存储方式
mount -o loop -t squashfs /mnt/usb/Live.img /mnt/sytem
mount -t aufs -o dirs=/mnt/usb/save=rw:mnt/system=ro aufs ${SYSTEM}
mount --bind /mnt/usb/save-data ${SYSTEM}/mnt
切换到最终系统
终止Udev的运行
killall udevd
切换到LiveUSB的最终系统
exec switch_root ${SYSTEM} /sbin/init
init命令制作终止
EOF
设置init文件的执行权限
chmod +x init
制作辅助系统
辅助系统中的init启动脚本内容已经确定,下面要制作出一个可以完成init脚本运行环境的系统。
创建辅助系统的基本目录
mkdir bin etc lib proc sys modules
确定需要的命令
cp -a /bin/{chgrp,cp,grep,mkdir,sed,sleep} bin
cp -a /bin/{cat,chmod,mount} bin
cp -a /usr/bin/{touch,killall} bin
cp -a /sbin/{switch_root,insmod,static,udevd,udevadm,blkid} bin
cp -a /usr/bin/{g,}awk bin
cp -a /bin/bash bin
复制Udev相关的文件
cp -a /lib/udev lib
cp -a /etc/udev etc
内核模块及配置文件
for i in vfat.ko loop.ko
do
find ${LIVEUSB}/system/lib/modules -name ${i} -exec cp -av '{}' modules/ ';'
done
创建配置文件
cat > modules/conf << "EOF"
loop.ko max_loop=255
vfat.ko
EOF
用户及组信息文件
cp -a /etc/{group,passwd} etc
创建一个空的fstab
touch etc/fstab
复制辅助系统中的命令所依赖的函数库
for i in $(ldd bin/* lib/udev/*id | grep "=>" | sed 's@(.*)@@g' | sort | awk -F'=>' '{print $2}' | uniq);
do
cp -v ${i} lib/
done
cp -v /lib/ld-linux.so.2 lib/
cp -v /lib/libnss_files.so.2 lib/
生成Initramfs文件
pushd ${LIVEUSB}/image
sh ./gen_initramfs_list.sh initramfs > file_list
./gen_init_cpio file_list > initramfs.cpio
gzip -9 initramfs.cpio
cp initramfs.cpio.gz ${LIVEUSB}/usb/boot
popd
辅助系统与内核的合并
make
cp arch/x86/boot/bzImage ${LIVEUSB}/usb/boot/liveusb-kernel-init
最终系统的生成
使用mksquashfs命令将最终系统中的所有文件和目录制作成SquashFS镜像文件,使用如下命令:
cd /opt/liveusb
mksquashfs * ${LIVEUSB}/usb/Live.img
设置GRUB-2
cd /opt/liveusb/usb
mkdir -pv boot/grub
cat > boot/grub/grub.cfg << “EOF”
set default=0
set timeout=5
Menuentry “My LiveUSB with Initranfs” {
linux /boot/liveusb-kernel root=UUID=<UUID> rootdelay=10
initrd /boot/initranfs.cpio.gz
}
insmod vbe
set gfxpayload=800x600x16
EOF
安装LiveUSB
mount /dev/sdb4 /mnt
cp -a ${LIVEUSB}/usb/* /mnt
UUID=$(blkid /dev/sdb4 | awk -F’UUID=”’ ‘{print $2}’ | awk -F’” ’ ‘{print $1}’)
sed -i “s@<UUID>@${UUID}@g” /mnt/boot/grub/grub.cfg
unset UUID
安装GRUB-2
cd /mnt
grub-install --no-floppy --root-directory=. /dev/sdb |
|