找回密码
 注册
快捷导航
查看: 9027|回复: 7

总结一下LiveUSB的制作方法

[复制链接] |自动提醒
阅读字号:

911

回帖

43

积分

7000

资产值

钻石会员 Rank: 3Rank: 3Rank: 3

注册时间
2015-1-5
发表于 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的任务。

点评

一般来说,玩linux的会挑一个最喜欢的玩的  详情 回复 发表于 2015-9-19 12:42

1939

回帖

40

积分

3万

资产值

钻石会员 Rank: 3Rank: 3Rank: 3

注册时间
2002-10-6
银牌荣誉勋章(注册10年以上会员)铜牌荣誉勋章(注册8年以上会员)
发表于 2015-7-25 11:44:48| 字数 13| - 中国–河北–保定–雄县 电信 | 显示全部楼层
我靠,根本看不懂啊。落伍了
X220(2台) +X230+T430,工具而已,够用就好...
回复 支持 反对

使用道具 举报

4万

回帖

322

积分

12万

资产值

至尊会员III Rank: 4Rank: 4Rank: 4Rank: 4

注册时间
2010-10-22
铜牌荣誉勋章(注册8年以上会员)银牌荣誉勋章(注册10年以上会员)月全勤勋章
发表于 2015-7-25 12:39:29| 字数 17| - 中国–浙江–宁波 电信 来自手机版 | 显示全部楼层
liveusb是做什么的,不懂啊。
工作:X13  5850U 16G / 1T
娱乐:hp800g1dm 16G / 2T+ 1T
存储:HP z230sff 8G/240G+14T     群晖ds220j  2T+ 2T
回复 支持 反对

使用道具 举报

911

回帖

43

积分

7000

资产值

钻石会员 Rank: 3Rank: 3Rank: 3

注册时间
2015-1-5
 楼主| 发表于 2015-7-25 17:38:58| 字数 90| - 中国–北京–北京–海淀区 电信/北京大学 | 显示全部楼层
QUOTE:
lxq8432 发表于 2015-7-25 12:39
liveusb是做什么的,不懂啊。

Linux的安装光盘叫LiveCD,把光盘iso的内容放到U盘上就叫LiveUSB了。

点评

谢谢。明白了。  详情 回复 发表于 2015-7-25 17:45
回复 支持 反对

使用道具 举报

911

回帖

43

积分

7000

资产值

钻石会员 Rank: 3Rank: 3Rank: 3

注册时间
2015-1-5
 楼主| 发表于 2015-7-25 17:39:56| 字数 64| - 中国–北京–北京–海淀区 电信/北京大学 | 显示全部楼层
QUOTE:
LongSame 发表于 2015-7-25 11:44
我靠,根本看不懂啊。落伍了

不是很难懂啊,就是读一下shell脚本。
回复 支持 反对

使用道具 举报

1万

回帖

122

积分

11万

资产值

至尊会员I Rank: 4Rank: 4Rank: 4Rank: 4

注册时间
2008-9-22
年全勤勋章2020年全勤勋章2019月全勤勋章年全勤勋章2017年全勤勋章2018
发表于 2015-8-2 01:16:54| 字数 59| - 中国–北京–北京 电信/星缘新动力科技有限公司电信节点 | 显示全部楼层
我一般还是一个U盘只装一个系统。比如Fedora的Hybrid镜像,里面还带一个EFI分区,不知这种情况如何做多系统。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.5 © 2001-2023 Comsenz Inc

GMT+8, 2025-1-16 22:07 , Processed in 0.126651 second(s), 39 queries , Gzip On, OPcache On.

手机版|小黑屋|安卓客户端|iOS客户端|Archiver|备用网址1|备用网址2|在线留言|专门网

返回顶部