|
发表于 2015-7-25 10:17:27| 字数 2,360| - 中国–北京–北京–海淀区 电信/北京大学
|
显示全部楼层
|阅读模式
[ 本帖最后由 vimacs 于 2015-7-25 10:20 编辑 ]\n\n[ 本帖最后由 vimacs 于 2015-7-25 10:19 编辑 ]\n\n昨天随手在原有的Arch的LiveUSB上添加了openSUSE的启动项,总结一下制作LiveUSB的方法。
新手一般是用现成的工具做,包括直接写盘(dd,UltraISO)和LiveUSB制作工具(unetbootin等),这种方法灵活性太差,如果要做一个能带多个发行版的U盘的话,一般不会用这种方法。我比较喜欢按照archwiki上的做法先做一个arch的启动盘,然后在此基础上编辑syslinux的配置文件(EFI就更简单,直接加gummiboot的条目就行了).
写syslinux/GRUB的条目时,内核和initramfs/initrd这两个文件都很好找,最关键的就是内核参数。有的发行版的官方wiki会提供一个制作LiveUSB的内核参数说明(比如arch),有的直接套用iso里面的配置文件就行了(systemrescuecd好像就是这样),但有的就不这么好做,我下面就用openSUSE为例介绍一下这种情况怎么做LiveUSB.
首先,还是挂上iso,然后看里面的syslinux.cfg,可以轻松地找到内核和initrd所在的位置,先把它们复制到U盘里面,我把它复制到了U盘的suse目录下,于是syslinux中openSUSE的启动条目是
LINUX /suse/linux
INITRD /suse/initrd
最关键的内核参数怎么办呢?其实之前我在GitHub上找到过,不过作为学习,我觉得对一个文档做得不好的启动盘,应该自己找出方法。由于内核启动后要挂载initramfs/initrd执行里面的init脚本,于是我便提取initrd中的文件到一个目录下(我用的是/tmp/cpio):
cd /tmp/cpio
zcat <path-to-initrd>/initrd | cpio -i
这样就得到了initramfs里面的文件系统,我们直接读里面的init脚本。openSUSE的initramfs里面的init脚本注释很详细,非常好读。
首先它导出了一些环境变量,然后导入一些函数,之后初始化:
. /include
initialize
那么initialize这个函数干了什么呢?看看include文件就知道了,其实它只是导入了.profile文件,添加了一些环境变量而已,和我们要做的事情无关,于是继续往下看。关键是这一步:
#======================================
# 7) Mount the live image device
#--------------------------------------
if searchImageISODevice;then
if [ ! -z "$mediacheck" ]; then
runMediaCheck
fi
if [ ! -z "$kiwi_hybrid" ];then
setupHybridPersistent
fi
kiwiMount "$biosBootDevice" "/cdrom" "-o ro" 1>&2
fi
所以要读searchImageISODevice这个函数,它里面有段代码是这样的:
if [ ! -z "$isofrom" ];then
isofrom_device=$(echo $isofrom | cut -f1 -d:)
isofrom_system=$(echo $isofrom | cut -f2 -d:)
waitForStorageDevice $isofrom_device
mkdir /isofrom
if ! mount $isofrom_device /isofrom;then
systemException \
"Failed to mount ISO storage device !" \
"reboot"
fi
biosBootDevice=$(losetup -f --show /isofrom/$isofrom_system)
所以,LiveUSB的内核参数就出来了,应该加一条isofrom=<USB device>:<path to iso image>,并且要把openSUSE的iso文件复制到U盘下。假设U盘的UUID是XXXX-XXXX(或者卷标是ABCDEF),iso文件的路径是suse/openSUSE-12.3.iso,那么在syslinux的启动项条目那里应该加上
APPEND isofrom=/dev/disk/by-uuid/XXXX-XXXX:suse/openSUSE-12.3.iso
(用卷标的话就用/dev/disk/by-label/ABCDEF)
以上脚本是从openSUSE 12.3的iso里面找出来的,最新的13.2版本脚本有点变化,但方法一样。昨天我做了13.2的启动盘后,启动时发现它在等待/dev/loop0p1时不断重试,消耗了很多时间,发现是setupHybridPersistent导致的,根据上面的脚本,只要清掉kiwi_hybrid这个变量就行了,于是最终的syslinux条目是
LABEL openSUSE 12.3
LINUX /suse/linux
INITRD /suse/initrd
APPEND isofrom=/dev/disk/by-uuid/XXXX-XXXX:suse/openSUSE-12.3.iso kiwi_hybrid=
于是就完成了将openSUSE的启动盘加入到arch的LiveUSB的任务。
|
|