8. Customizing package installation
可能live系统最基本的定制是选择要包含在映像中的包。本章指导您使用各种build-time选项来定制live-build的软件包安装。影响在映像中可以安装哪些包的最广泛的选择是发行版和存档区域。为了确保体面的下载速度,您应该选择附近的分发镜像。您还可以为后端口、实验包或自定义包添加自己的存储库,或者将包直接作为文件包含。您可以定义包列表,包括一次安装许多相关包的元包,例如针对特定桌面或语言的包。最后,许多选项在构建时安装包时对apt(如果您愿意,也可以使用aptitude)进行一些控制。如果您使用代理,希望禁用推荐包的安装以节省空间,或者需要通过APT固定来控制安装哪些版本的包,那么您可能会发现这些很方便。
8.1 Package sources
8.1.1 Distribution, archive areas and mode
您选择的发行版对在您的live镜像中包含哪些软件包有最广泛的影响。指定代码名,对于live-build的trixie版本,默认为trixie。存档中携带的任何当前发行版都可以通过其代码名在这里指定。(参见Terms了解更多细节。)–distribution选项不仅影响存档中的包的源代码,而且还指示live-build按照需要构建每个受支持的发行版。例如,要针对不稳定版本sid进行构建,请指定:
$ lb config --distribution sid
在发行版归档中,归档区域是归档的主要部分。在Debian中,它们是主要的、贡献的和非自由的。只有main包含Debian发行版的一部分软件,因此这是默认的。可以指定一个或多个值,例如:
$ lb config --archive-areas "main contrib non-free"
通过–mode选项,某些Debian衍生产品可以获得实验支持。默认情况下,只有在debian或未知系统上构建时,才将此选项设置为debian。如果在任何受支持的派生上调用lb config,它将默认创建该派生的映像。如果在ubuntu模式下运行lb config,则支持指定衍生版本的发行版名称和归档区域,而不是Debian的。该模式还修改live-build行为以适应衍生产品。
注意:添加这些模式的项目主要负责支持这些选项的用户。Debian Live项目,反过来,只在最大努力的基础上提供开发支持,基于衍生项目的反馈,因为我们自己不开发或支持这些衍生项目。
8.1.2 Distribution mirrors
Debian存档在世界各地的镜像网络中进行复制,以便每个地区的人们可以选择附近的镜像以获得最佳下载速度。每个–mirror-*选项控制在构建的不同阶段使用哪个发行版镜像。回想一下在Stages of the build中,引导阶段是最初由debootstrap使用最小系统填充chroot的阶段,而chroot阶段是用于构建活动系统的文件系统的chroot阶段。因此,相应的镜像开关用于这些阶段,然后,在二进制阶段,使用–mirror-binary和–mirror-binary-security值,取代早期阶段中使用的任何镜像。
8.1.3 Distribution mirrors used at build time
要将构建时使用的分发镜像设置为指向本地镜像,只需设置–mirror-bootstrap和–mirror-chroot-security,如下所示。
$ lb config --mirror-bootstrap http://localhost/debian/ \
--mirror-chroot-security http://localhost/debian-security/
chroot镜像由–mirror-chroot指定,默认值为–mirror-bootstrap。
8.1.4 Distribution mirrors used at run time
–mirror-binary*选项控制放置在二进制镜像中的分发镜像。这些可以用于在运行live系统时安装其他软件包。默认使用deb.debian.org,该服务根据用户的IP族和镜像的可用性等因素选择地理上接近的镜像。当您无法预测哪个镜像最适合所有用户时,这是一个合适的选择。或者您可以指定自己的值,如下面的示例所示。从此配置构建的映像只适用于“mirror”可达的网络上的用户。
$ lb config --mirror-binary http://mirror/debian/ \
--mirror-binary-security http://mirror/debian-security/ \
--mirror-binary-backports http://mirror/debian-backports/
8.1.5 Additional repositories
您可以添加更多的存储库,从而在目标发行版中可用的包之外扩展您的包选择。这些可能是,例如,用于后端口,实验性或自定义包。要配置其他存储库,请创建config/archives/your-repository.list.chroot和/或config/archives/your-repository.list.binary文件。与–mirror-*选项一样,这些选项管理构建映像时在chroot阶段和二进制阶段使用的存储库,即在运行活动系统时使用。
例如,config/archives/live.list.chroot允许您在live系统构建时从debian-live快照存储库安装包。
deb http://debian-live.alioth.debian.org/ sid-snapshots main contrib non-free
如果您在config/archives/live.list.binary中添加相同的行,那么存储库将被添加到您的活动系统的/etc/apt/sources.list.d/目录中。
如果存在这样的文件,它们将被自动拾取。
您还应该将用于对存储库签名的ascii保护的GPG密钥放入config/archives/your-repository.key.{binary,chroot}文件中。
如果您需要自定义APT固定,这样的APT首选项片段可以放在config/archives/your-repository.pref.{binary,chroot}文件中,并将自动添加到您的活动系统的/etc/apt/preferences.d/目录中。
类似地,如果您需要自定义APT_AUTH.CONF(5)身份验证配置,可以将其放在config/archives/your-repository.auth.{binary,chroot}文件中,并将自动添加到您的活动系统的/etc/apt/auth.conf.d/目录中。
8.2 Choosing packages to install
有许多方法可以选择live-build将在映像中安装哪些包,以满足各种不同的需求。您可以简单地在包列表中命名要安装的单个包。您还可以在这些列表中使用元包,或者使用包控制文件字段选择它们。最后,您可以将包文件放在config/树中,这非常适合在从存储库中可用之前对新的或实验性的包进行测试。
8.2.1 Package lists
包列表是表达应该安装哪些包的强大方式。列表语法支持条件部分,这使得构建列表和调整它们以用于多种配置变得容易。包名也可以在构建时使用shell帮助器注入到列表中。
注意:当指定不存在的包时,live-build的行为取决于您选择的APT实用程序。请参阅Choosing apt or aptitude了解更多细节。
8.2.2 Using metapackages
填充包列表的最简单方法是使用发行版维护的任务元包。例如:
$ lb config
$ echo task-gnome-desktop > config/package-lists/desktop.list.chroot
这取代了live-build 2.x中支持的旧的预定义列表方法。与预定义的列表不同,任务元包不是特定于Live System项目的。相反,它们是由发行版中的专家工作组维护的,因此反映了每个小组关于哪些软件包最能满足预期用户需求的共识。它们还覆盖了比它们所取代的预定义列表更广泛的用例范围。
所有任务元包都以task-为前缀,因此确定哪些可用的快速方法(尽管它可能包含少量与名称匹配但不是元包的错误命中)是在包名称上匹配:
$ apt-cache search --names-only ^task-
除了这些之外,您还可以找到其他具有各种用途的元包。有些是更广泛的任务包的子集,如gnome-core,而另一些则是Debian Pure Blend的个别专门部分,如education-*元包。要列出存档中的所有元包,安装debtags包并列出所有带有role::metapackage标签的包,如下所示:
$ debtags search role::metapackage
8.2.3 Local package lists
无论您列出元包、单个包还是两者的组合,所有本地包列表都存储在config/package-lists/中。由于可以使用多个列表,因此这非常适合模块化设计。例如,您可能决定将一个列表用于特定的桌面选择,另一个列表用于相关软件包的集合,这些软件包可以轻松地在不同的桌面上使用。这允许您以最少的麻烦来试验不同的包集组合,在不同的live镜像目之间共享公共列表。
此目录中存在的包列表需要有.list后缀以便进行处理,然后需要有一个附加的阶段后缀.chroot或.binary,以指示该列表用于哪个阶段。
.list.chroot_install列表中的包既存在于运行系统中,也存在于已安装系统中。
注意:如果您不指定阶段后缀,则该列表将用于两个阶段。通常,您希望指定.list.chroot,这样包将只安装在活动文件系统中,而不会在介质上放置.deb的额外副本。
8.2.4 Local binary package lists
要创建二进制阶段列表,请在config/package-lists/中放置一个后缀为.list.binary的文件。这些包没有安装在活动文件系统中,而是包含在pool/下的活动介质中。您通常会将这样的列表与non-live安装程序变体之一一起使用。如上所述,如果希望该列表与chroot阶段列表相同,只需单独使用.list后缀即可。
8.2.5 Generated package lists
| 有时,编写列表的最佳方法是使用脚本生成列表。任何以感叹号开头的行都表示在构建映像时要在chroot中执行的命令。例如,可以包含行! grep-aptavail -n -sPackage -FPriority standard | sort在包列表中生成一个优先级为:standard的可用包排序列表。 |
实际上,使用grep-aptavail命令(从dctrl-tools包中)选择包非常有用,因此live-build提供了一个packages帮助脚本以提供方便。这个脚本接受两个参数:field和pattern。因此,你可以创建一个包含以下内容的列表:
$ lb config
$ echo '! Packages Priority standard' > config/package-lists/standard.list.chroot
8.2.6 Using conditionals inside package lists
存储在config/*(减去 LB_ 前缀)中的任何live-build配置变量都可以在包列表中的条件语句中使用。通常,这意味着所有lb配置选项都大写,并将破折号更改为下划线。但在实践中,只有那些影响包选择的才有意义,比如DISTRIBUTION、ARCHITECTURES或ARCHIVE_AREAS。
例如,如果指定了–architectures amd64,要安装ia32-libs:
#if ARCHITECTURES amd64
ia32-libs
#endif
你可以测试一些值中的任何一个,例如,如果指定了–architectures i386或–architectures amd64,安装memtest86+:
#if ARCHITECTURES i386 amd64
memtest86+
#endif
你也可以针对可能包含多个值的变量进行测试,例如,如果通过–archive-areas指定了contrib或non-free,则安装vrms:
#if ARCHIVE_AREAS contrib non-free
vrms
#endif
不支持条件嵌套。
8.2.7 Removing packages at install time
您可以在config/package-lists目录中以.list.chroot_live和.list.chroot_install后缀的文件中列出包。如果live列表和install列表都存在,那么.list.chroot_live列表中的包将在安装后用钩子删除(如果用户使用安装程序)。.list.chroot_install列表中的包既存在于运行系统中,也存在于已安装系统中。这是对安装程序的一个特殊调整,如果您在配置中设置了–debian-installer live,并且希望在安装时删除系统特定的live包,则可能会很有用。
8.2.8 Desktop and language tasks
桌面和语言任务是需要一些额外规划和配置的特殊情况。在这方面,live镜像与Debian Installer映像不同。在Debian安装程序中,如果介质是为特定的桌面环境准备的,则会自动安装相应的任务。因此,有内部的gnome-desktop, kde-desktop, lxde-desktop和xfce-desktop任务,它们都没有在tasksel的菜单中提供。同样,没有针对语言的任务菜单项,但用户在安装期间的语言选择会影响相应语言任务的选择。
在开发桌面live镜像时,映像通常会直接引导到工作桌面,桌面和默认语言的选择是在构建时做出的,而不是像Debian Installer那样在运行时做出的。这并不是说不能构建一个live镜像来支持多个桌面或多种语言,并为用户提供选择,但这不是live-build的默认行为。
因为没有为语言任务(包括特定于语言的字体和输入法包)自动提供规定,如果您需要它们,需要在配置中指定它们。例如,包含德语支持的GNOME桌面映像可能包括以下任务元包:
$ lb config
$ echo "task-gnome-desktop task-laptop" >> config/package-lists/my.list.chroot
$ echo "task-german task-german-desktop task-german-gnome-desktop" >> config/package-lists/my.list.chroot
8.2.9 Kernel flavour and version
默认情况下,映像中将包含一个或多个内核版本,具体取决于体系结构。您可以通过–linux-flavours选项选择不同的口味。每种风格都以默认存根linux-image作为后缀,形成每个元包名称,而元包名称又取决于映像中包含的确切内核包。
因此,默认情况下,amd64架构映像将包含linux-image-amd64风格的元包,而i386架构映像将包含linux-image-586元包。
当配置的归档文件中有多个内核包版本可用时,可以使用–linux-packages选项指定不同的内核包名称存根。例如,假设您正在构建一个amd64架构映像,并添加用于测试目的的实验归档文件,以便可以安装linux-image-3.18.0-trunk-amd64内核。您将按照如下方式配置该映像:
$ lb config --linux-packages linux-image-3.18.0-trunk
$ echo "deb http://deb.debian.org/debian/ experimental main" > config/archives/experimental.list.chroot
8.2.10 Custom kernels
您可以构建和包含您自己的定制内核,只要它们集成在Debian包管理系统中。live-build系统不支持不以.deb包构建的内核。
部署自己的内核包的正确且推荐的方法是遵循内核手册中的说明。记得适当地修改ABI和flavor后缀,然后在存储库中包含linux的完整构建和匹配的linux-latest包。
如果您选择不使用匹配的元包来构建内核包,则需要指定一个适当的–linux-packages存根,如内核风格和版本中所讨论的那样。正如我们在安装修改的或第三方软件包一节中所解释的那样,最好将自定义内核软件包包含在您自己的存储库中,不过该节中讨论的替代方法也可以。
关于如何定制内核的建议超出了本文档的范围。但是,您必须至少确保您的配置满足以下最低要求:
-
使用initial ramdisk。
-
包括联合文件系统模块(通常是aufs)。
-
包括配置所需的任何其他文件系统模块(例如,通常是squashfs)。
8.3 Installing modified or third-party packages
虽然这与live系统的理念相悖,但有时可能需要使用Debian存储库中软件包的修改版本来构建live系统。这可能是为了修改或支持额外的特性、语言和品牌,甚至是为了删除现有包中不需要的元素。类似地,”third-party”包可以用来添加定制和/或专有功能。
本节不包括关于构建或维护修改包的建议。不过,Joachim Breitner在http://www.joachim-breitner.de/blog/archives/282-How-to-fork-privately.html上的“如何私下分叉”方法可能会令人感兴趣。定制包的创建在Debian新维护者指南https://www.debian.org/doc/manuals/maint-guide/和其他地方都有介绍。
有两种方法可以安装修改后的自定义软件包:
-
packages.chroot
-
使用自定义APT存储库
使用packages.chroot更容易实现,对于“一次性”定制也很有用,但是有很多缺点,而使用自定义APT存储库的设置更耗时。
8.3.1 Using packages.chroot to install custom packages
要安装自定义包,只需将其复制到config/packages.chroot/目录。该目录中的包将在构建期间自动安装到活动系统中 —— 您不需要在其他地方指定它们。
包必须按照规定的方式命名。一种简单的方法是使用dpkg-name。
使用packages.chroot安装自定义包有以下缺点:
-
使用安全APT是不可能的。
-
您必须在config/packages.chroot/目录下安装所有适当的包。
-
它不适合在修订控制中存储live系统配置。
8.3.2 Using an APT repository to install custom packages
与使用packages.chroot不同,在使用自定义APT存储库时,必须确保在其他地方指定包。详情请参阅Choosing packages to install。
虽然创建APT存储库来安装自定义包似乎没有必要,但是以后可以很容易地重用基础设施来提供修改包的更新。
8.3.3 Custom packages and APT
live-build使用APT将所有包安装到live系统中,因此将继承该程序的行为。一个相关的例子是(假设使用默认配置),给定一个包在两个版本号不同的存储库中可用,APT将选择安装版本号较高的包。
因此,您可能希望增加自定义软件包的debian/changelog文件中的版本号,以确保修改后的版本安装在官方debian存储库中的版本之上。这也可以通过更改活动系统的APT固定首选项来实现——参见APT pinning了解更多信息。
8.4 Configuring APT at build time
您可以通过仅在构建时应用的许多选项来配置APT。(运行中的活动系统中使用的APT配置可以按照活动系统内容的正常方式进行配置,即通过config/includes.chroot/包含适当的配置。)要获得完整的列表,请在lb_config手册页中查找以apt开头的选项。
8.4.1 Choosing apt or aptitude
在构建时安装包时,您可以选择使用apt或aptitude。使用哪个实用工具由lb config的–apt参数控制。选择实现包安装首选行为的方法,显著的区别在于如何处理丢失的包。
-
apt: 使用此方法,如果指定了丢失的包,则包安装将失败。这是默认设置。
-
aptitude: 使用此方法,如果指定了丢失的包,则包安装将成功。
8.4.2 Using a proxy with APT
一个通常需要的APT配置是处理在代理后面构建映像。您可以根据需要使用–apt-http-proxy选项指定APT代理,例如:
$ lb config --apt-http-proxy http://proxy/
8.4.3 Tweaking APT to save space
您可能会发现自己需要在图像媒体上节省一些空间,在这种情况下,您可能会对以下选项中的一个或另一个或两个都感兴趣。
如果你不想在图像中包含APT索引,你可以省略那些:
$ lb config --apt-indices false
这不会影响/etc/apt/sources.list中的条目,而只会影响/var/lib/apt是否包含索引文件。权衡的是APT需要这些索引才能在活动系统中操作,因此在执行apt-cache搜索或apt-get安装之前,例如,用户必须首先进行apt-get更新以创建这些索引。
如果您发现安装推荐的软件包使您的映像过于膨胀,只要您准备好处理下面讨论的后果,您可以使用以下命令禁用APT的默认选项:
$ lb config --apt-recommends false
关闭推荐的最重要的结果是,live-boot和live-config本身会推荐一些提供大多数Live配置使用的重要功能的包。
你最有可能想要再次添加的两个包是:
-
live-config推荐的user-setup用于创建活动用户。
-
live-config推荐的Sudo用于在live映像中获得root访问权限,这是关闭计算机所需要的。
$ lb config --apt-recommends false
$ echo "user-setup sudo" > config/package-lists/recommends.list.chroot
除了最特殊的情况外,在所有情况下,您都需要将至少其中一些推荐的软件包添加回您的软件包列表中,否则您的映像将无法像预期的那样工作(如果有的话)。查看构建中包含的每个live-*包的推荐包,如果您不确定是否可以忽略它们,请将它们添加回包列表中。
更普遍的后果是,如果您没有为任何给定的软件包安装推荐的软件包,也就是说,“除了不寻常的安装之外,在所有安装中都可以找到与此软件包一起的软件包”(Debian Policy Manual, section 7.2),那么Live系统用户实际需要的一些软件包可能会被省略。因此,我们建议您查看关闭推荐对您的包列表造成的差异 (请参阅由lb build生成的binary.packages文件),并在列表中重新包含您仍然想要安装的任何丢失的包。或者,如果您发现您只想要保留少量推荐的软件包,则保留启用推荐并在所选软件包上设置负APT pin优先级以防止它们被安装,如APT pinning中所述。
8.4.4 Passing options to apt or aptitude
如果没有一个lb config选项来以你需要的方式改变APT的行为,使用–apt-options或–aptitude-options将任何选项传递给你配置的APT工具。有关详细信息,请参阅apt和aptitude的手册页。请注意,这两个选项都有默认值,除了您可能提供的任何覆盖之外,您还需要保留这些值。因此,例如,假设您已经从snapshot.debian.org中包含了一些用于测试目的的内容,并且想要指定Acquire::Check-Valid-Until=false以使APT对陈旧的发布文件满意,您将按照以下示例这样做,在默认值–yes之后附加新选项:
$ lb config --apt-options "--yes -oAcquire::Check-Valid-Until=false"
请查看手册页以充分了解这些选项以及何时使用它们。这只是一个示例,不应被理解为以这种方式配置映像的建议。这个选项不适用于live图像的最终发布。
对于涉及apt.conf选项的更复杂的APT配置,您可能需要创建一个config/apt/apt.conf文件。另请参阅其他apt-*选项,以获得一些常用选项的方便快捷方式。
8.4.5 APT pinning
有关背景信息,请先阅读apt_preferences(5)手册页。APT绑定既可以配置为构建时,也可以配置为运行时。对于前者,创建config/archives/.pref, config/archives/.pref.chroot和config/apt/preferences。对于后者,创建config/includes.chroot/etc/apt/preferences。
假设您正在构建一个trixie live系统,但需要在构建时从sid安装二进制映像中的所有活动包。您需要将sid添加到APT源中,并将其中的活动包置于高于默认优先级的位置,而将其中的所有其他包置于低于默认优先级的位置。因此,在构建时,只有需要的软件包才会从sid安装,其他所有软件包都来自目标系统发行版trixie。以下将实现这一目标:
$ echo "deb http://mirror/debian/ sid main" > config/archives/sid.list.chroot
$ cat >> config/archives/sid.pref.chroot << EOF
Package: live-*
Pin: release n=sid
Pin-Priority: 600
Package: *
Pin: release n=sid
Pin-Priority: 1
EOF
负pin优先级将阻止一个包被安装,就像在您不想要另一个包推荐的包的情况下一样。假设您正在使用config/package-lists/desktop.list.chroot中的task-lxde-desktop构建LXDE映像,但不希望用户被提示在密匙环中存储wifi密码。这个元包依赖于lxde-core, lxde-core推荐gksu, gksu又推荐gnome-keyring。所以您希望省略推荐的gnome-keyring包。这可以通过在config/apt/preferences中添加以下小节来实现:
Package: gnome-keyring
Pin: version *
Pin-Priority: -1