16. Examples
本章涵盖了使用live系统的特定用例的示例构建。如果您是构建自己的live系统映像的新手,我们建议您首先依次阅读这三个教程,因为每个教程都教授有助于您使用和理解其余示例的新技术。
16.1 Using the examples
要使用这些示例,您需要一个系统来构建它们,该系统满足Requirements中列出的要求,并且已经按照Installing live-build中描述的方式安装了live-build。
请注意,为了简洁起见,在这些示例中,我们没有指定要用于构建的本地镜像。如果使用本地镜像,可以大大加快下载速度。您可以在使用lb配置时指定选项,如Distribution mirrors used at build time中所述,或者为了更方便,在/etc/live/build.conf中设置构建系统的默认值。只需创建这个文件,并在其中设置相应的LB_MIRROR_*变量为您的首选镜像。构建中使用的所有其他镜像都是这些值的默认值。例如:
LB_MIRROR_BOOTSTRAP="http://mirror/debian/"
LB_MIRROR_CHROOT_SECURITY="http://mirror/debian-security/"
LB_MIRROR_CHROOT_BACKPORTS="http://mirror/debian-backports/"
16.2 Tutorial 1: A default image
用例:创建一个简单的第一个映像,学习live-build的基础知识。
在本教程中,我们将构建一个默认的ISO混合live系统映像,其中只包含基本包(没有Xorg)和一些live系统支持包,作为使用live-build的第一次练习。
没有比这更简单的了:
$ mkdir tutorial1 ; cd tutorial1 ; lb config
如果您愿意,请检查config/目录的内容。您将看到这里存储了一个框架配置,可以进行自定义,或者在本例中立即用于构建默认映像。
现在,以超级用户的身份构建映像,并在使用tee构建时保存日志。
# lb build 2>&1 | tee build.log
假设一切顺利,一段时间后,当前目录将包含live-image-i386.hybrid.iso. 这个ISO混合映像可以直接在虚拟机中启动,正如Testing an ISO image with Qemu 和 Testing an ISO image with VirtualBox, 中所描述的那样。或者像Burning an ISO image to a physical medium 和 Copying an ISO hybrid image to a USB stick中所描述的那样,将镜像刻录到光学介质或USB闪存设备上。
16.3 Tutorial 2: A web browser utility
用例:创建一个web浏览器实用程序图像,学习如何应用自定义。
在本教程中,我们将创建一个适合用作web浏览器实用程序的图像,作为自定义live系统图像的介绍。
$ mkdir tutorial2
$ cd tutorial2
$ lb config
$ echo "task-lxde-desktop iceweasel" >> config/package-lists/my.list.chroot
对于这个例子,我们选择LXDE反映了我们希望提供一个最小的桌面环境,因为图像的焦点是我们所考虑的单一用途,即web浏览器。我们甚至可以更进一步,在config/includes.chroot/etc/iceweasel/profile/中为web浏览器提供一个默认配置,或者为查看各种web内容提供额外的支持包,但是我们把这些作为练习留给读者。
再次以超级用户的身份构建镜像,保留日志,就像Tutorial 1一样:
# lb build 2>&1 | tee build.log
再次验证图像是否正确并进行测试,如Tutorial 1所示。
16.4 Tutorial 3: A personalized image
用例:创建一个项目来构建个性化的图像,包含您最喜欢的软件,无论您走到哪里,都可以随身携带在USB棒上,并随着您的需求和偏好的变化而不断修改。
由于我们将在许多版本中更改我们的个性化映像,并且我们希望跟踪这些更改,尝试一些事情,如果事情不成功,可能会恢复它们,因此我们将在流行的git版本控制系统中保留我们的配置。我们还将使用Managing a configuration中描述的通过自动脚本进行自动配置的最佳实践。
16.4.1 First revision
$ mkdir -p tutorial3/auto
$ cp /usr/share/doc/live-build/examples/auto/* tutorial3/auto/
$ cd tutorial3
编辑auto/config如下所示:
#!/bin/sh
lb config noauto \
--architectures i386 \
--linux-flavours 686-pae \
"${@}"
使用刚才创建的auto/config脚本,执行lb config来生成配置树:
$ lb config
现在填充本地包列表:
$ echo "task-lxde-desktop iceweasel xchat" >> config/package-lists/my.list.chroot
首先,–architectures i386确保在我们的amd64构建系统上,我们构建一个适合在大多数机器上使用的32位版本。其次,我们使用–linux-flavours 686-pae,因为我们不希望在更旧的系统上使用这个映像。第三,我们选择了lxde任务元包来提供最小的桌面。最后,我们添加了两个最受欢迎的软件包:iceweasel和xchat。
现在,构建图像:
# lb build
| 请注意,与前两个教程不同,我们不再需要输入2>&1 | tee build.log,因为它现在包含在auto/build中。 |
一旦你测试了映像(如教程1中所示)并对其工作感到满意,就该初始化我们的git存储库了,只添加我们刚刚创建的自动脚本,然后进行第一次提交:
$ git init
$ cp /usr/share/doc/live-build/examples/gitignore .gitignore
$ git add .
$ git commit -m "Initial import."
16.4.2 Second revision
在这个版本中,我们将从第一次构建开始清理,将vlc包添加到我们的配置中,重新构建,测试和提交。
lb clean命令将清除以前构建中生成的所有文件(缓存除外),这样可以节省重新下载包的时间。这确保了随后的lb构建将重新运行所有阶段,从我们的新配置中重新生成文件。
# lb clean
现在将vlc包添加到config/package-lists/my.list.chroot中的本地包列表中:
$ echo vlc >> config/package-lists/my.list.chroot
构建:
# lb build
测试,当你满意时,提交下一个修订:
$ git commit -a -m "Adding vlc media player."
当然,还可以对配置进行更复杂的修改,比如在config/的子目录中添加文件。当您提交新的修订时,请注意不要手动编辑或提交config中包含 LB_* 变量的顶层文件,因为这些也是构建产品,并且总是由lb clean清理并通过各自的自动脚本使用lb config重新创建。
我们的系列教程已经结束了。虽然可能有更多种类的自定义,即使只是使用这些简单示例中探索的几个特性,也可以创建几乎无限种类的不同图像。本节中的其余示例涵盖了从活动系统的用户收集的经验中提取的其他几个用例。
16.5 A VNC Kiosk Client
用例:创建带有live-build的映像,以直接引导到VNC服务器。
创建一个构建目录,并在其中创建一个框架配置,禁用建议创建一个最小的系统。然后创建两个初始包列表:第一个是由live-build提供的名为Packages的脚本生成的(参见Generated package lists),第二个包含xorg, gdm3, metacity 和 xvnc4viewer。
$ mkdir vnc-kiosk-client
$ cd vnc-kiosk-client
$ lb config -a i386 -k 686-pae --apt-recommends false
$ echo '! Packages Priority standard' > config/package-lists/standard.list.chroot
$ echo "xorg gdm3 metacity xvnc4viewer" > config/package-lists/my.list.chroot
正如Tweaking APT to save space中所解释的那样,您可能需要重新添加一些推荐的软件包以使映像正常工作。
列出推荐的一个简单方法是使用apt-cache。例如:
$ apt-cache depends live-config live-boot
在这个例子中,我们发现我们必须重新包含live-config和live-boot推荐的几个软件包:user-setup,以使自动登录工作,并将sudo作为关闭系统的必要程序。此外,添加live-tools可以方便地将映像复制到RAM并弹出,从而最终弹出活动介质。所以:
$ echo "live-tools user-setup sudo eject" > config/package-lists/recommends.list.chroot
然后,在config/includes中创建/etc/skel目录。Chroot并在其中为默认用户添加一个自定义.xsession,该用户将启动metacity并启动xvncviewer,连接到192.168.1.2服务器上的端口5901:
$ mkdir -p config/includes.chroot/etc/skel
$ cat > config/includes.chroot/etc/skel/.xsession << EOF
#!/bin/sh
/usr/bin/metacity &
/usr/bin/xvncviewer 192.168.1.2:1
exit
EOF
建立形象:
# lb build
尽情享用。
16.6 A minimal image for a 256MB USB key
用例:创建一个默认映像,其中删除了一些组件,以便适合256MB的USB存储器,并留下一些空间供您使用。
在优化图像以适应特定的媒体大小时,您需要了解在大小和功能之间所做的权衡。在本例中,我们只在256MB的媒体大小中为额外的材料腾出空间,但没有做任何破坏其中包含的包的完整性的事情,例如通过localepurge包清除区域设置数据,或其他类似的“intrusive”优化。特别值得注意的是,我们使用–debootstrap-options从零开始创建一个最小的系统,使用–binary image hdd创建一个可以复制到USB存储器的映像。
$ lb config --binary-image hdd --apt-indices false --apt-recommends false --debootstrap-options "--variant=minbase" --firmware-chroot false --memtest none
为了使映像正常工作,我们必须重新添加至少两个被–apt-recommends false选项遗漏的推荐包。参见Tweaking APT to save space.
$ echo "user-setup sudo" > config/package-lists/recommends.list.chroot
此外,你还需要网络访问,所以需要重新添加另外两个推荐的软件包:
$ echo "ifupdown isc-dhcp-client" >> config/package-lists/recommends.list.chroot
现在,用通常的方法构建图像:
# lb build 2>&1 | tee build.log
在撰写本文时,在笔者的系统上,上述配置生成了一个227MB的映像。当添加–binary-image hdd时,这与Tutorial 1中默认配置产生的288MB映像相比是有利的。
使用–apt-indices false省略APT的索引可以节省相当多的空间,但代价是需要在实际系统中使用APT之前进行apt-get更新。使用–apt-recommends false删除推荐的包可以节省一些额外的空间,但代价是省略了一些您可能期望在那里的包。–debootstrap-options “–variant=minbase”从一开始引导一个最小的系统。不使用–firmware-chroot false自动包含固件包也节省了一些空间。最后,–memtest none阻止安装内存测试器。
注意:一个最小的系统也可以使用钩子来实现,例如在/usr/share/doc/live-build/examples/hooks中找到的stripped.hook.chroot钩子它可以减少额外的少量空间并产生204MB的映像。但是,它通过从安装在系统上的软件包中删除文档和其他文件来实现。这违反了这些包的完整性,并且正如注释头所警告的那样,可能会产生不可预见的后果。这就是为什么推荐使用最小的debootstrap来实现这一目标。
16.7 A localized GNOME desktop and installer
用例:创建GNOME桌面映像,针对瑞士进行了本地化,并包含安装程序。
我们希望使用我们首选的桌面(在本例中是GNOME)为i386体系结构制作一个iso-hybrid映像,其中包含由GNOME的标准Debian安装程序安装的所有相同软件包。
我们最初的问题是发现适当的语言任务的名称。目前,live-build无法帮助解决这个问题。虽然我们可能会幸运地通过trial-and-error找到它,但有一个工具,grep-dctrl,可以用来从tasksel-data中的任务描述中挖掘它,所以要准备,确保你有这两个东西:
# apt-get install dctrl-tools tasksel-data
现在我们可以搜索合适的任务,首先使用:
$ grep-dctrl -FTest-lang de /usr/share/tasksel/descs/debian-tasks.desc -sTask
Task: german
通过这个命令,我们发现这个任务显然被称为德语。现在找到相关的任务:
$ grep-dctrl -FEnhances german /usr/share/tasksel/descs/debian-tasks.desc -sTask
Task: german-desktop
Task: german-kde-desktop
在引导时,我们将生成de_CH.UTF-8区域设置,并选择ch键盘布局。现在让我们把这些碎片拼在一起。回顾Using metapackages中任务元包是前缀task-,我们只需指定这些语言启动参数,然后将标准优先级包和所有我们发现的任务元包添加到我们的包列表中,如下所示:
$ mkdir live-gnome-ch
$ cd live-gnome-ch
$ lb config \
-a i386 \
--bootappend-live "boot=live components locales=de_CH.UTF-8 keyboard-layouts=ch" \
--debian-installer live
$ echo '! Packages Priority standard' > config/package-lists/standard.list.chroot
$ echo task-gnome-desktop task-german task-german-desktop >> config/package-lists/desktop.list.chroot
$ echo debian-installer-launcher >> config/package-lists/installer.list.chroot
注意,我们已经包含了debian-installer-launcher包,用于从live桌面启动安装程序。目前启动器正常工作所必需的586内核版本将默认包含在内。