G.4 修改 ZENworks 映像资源文件

有时,您可能想通过添加自己的文件来修改映像发行套件。这些文件可以是其他程序、脚本、数据文件或已更新的 Linux 驱动程序。

您可以使用以下方法更新映像资源文件:

以下几节中提供了用于修改映像资源文件的各种方法:

G.4.1 向映像引导 CD 添加文件

如果需要将文件加到引导 CD,以便在进入实际映像进程(例如脚本,但通常不是驱动程序模块)后可使用此文件,则可以将这些文件复制到映像 CD 的 /addfiles 目录中。使用此方法可轻松在分发包中插入脚本或其他文件,无需修改 initrdroot 文件系统。但是,在引导和模块装载阶段,这些文件不可用。

映像引导 CD 有一个 /addfiles 目录,您可以向该目录添加文件。它们应以正确的目录名称放置在此目录下。然后在映像进程期间它们会在此目录中可用。

例如,可以如下添加文件:

  1. 如果要执行您自己的脚本而不是普通映像进程,请创建名为 myscript.s 的脚本文件,并将其放置在引导 CD 中。例如,/addfiles/bin/myscript.s

    重要说明:该脚本文件必须有符合 Linux 要求的 LF 行终结符,而不是 DOS CR 和 LF 行尾字符。换句话说,不能使用 Notepad.exe 创建脚本,而必须使用与 Linux 兼容的文本编辑器,如 TextPad。

  2. 要在 settings.txt 中加入以下行,请输入:

    export IMGCMD="/bin/myscript.s"
    

    当映像运行时,它会运行 /bin/myscript.s,而不是使用通常的 img ‑auto 命令。

G.4.2 向 initrd 或 root 文件系统添加文件

这是更新映像资源文件的首选方法,而且必须在 Linux 环境中执行。

执行下述过程之前,请确保您已经为计划更改的文件创建了备份复本,尤其是 /srv/tftp/boot/initrd 文件。如果要更改映像 CD 上的文件,则需要 ISO 编辑器或其他进程,用于提取并替换 bootcd.iso 映像文件中的文件。

重要说明:initrdroot 文件系统中更新或添加文件和 Linux 驱动程序时,请记录您所作的更改。Novell 发送给您的更新过的资源文件将不包含您自定义的更改。如果内核版本已被从 Novell 收到的较新资源文件更改,则原来添加的驱动程序必须更新,方式是从生产商获取新版本或使用正确的 Linux 内核版本源文件重新编译该驱动程序。

要向 root 文件系统添加文件,还可以 driverupdate 文件方法,如部分 G.4.3, 使用 drverupdate 文件方法中所述。

添加到 Initrd

修改 initrd 文件系统:

  1. 使用 Linux 设备创建工作目录,然后切换到该目录。

  2. 要将 initrd 从 PXE 服务器或引导 CD 复制到新的工作目录:

    • 对于 PXE,将 \tftp\boot\initrd 复制到 Linux 工作站的工作目录。

    • 对于 CD,从引导 CD 的 /boot/i386/loader 目录中提取 initrd,然后将提取的 initrd 复制到 Linux 工作站的工作目录。

  3. 要将 initrd 重命名为 initrd.gz,请输入:

    mv initrd initrd.gz
    
  4. 要解压缩 initrd.gz 文件,请输入:

    gunzip initrd.gz
    
  5. 要创建在随后步骤中用作装入点的另一个工作目录,请输入:

    mkdir work
    
    cd work
    
  6. 要将 initrd 提取到 /work 目录,请输入:

    cpio -idmuv <../initrd >/dev/null 2>&1
    
  7. 要将文件或最新的驱动程序复制到提取的 initrd 文件系统中,请输入:

    cp /your_path/module.ko lib/modules/2.6.5-override-default/initrd
    

    其中,您的路径模块.ko 文件的路径,模块是模块的名称。

    要包含在 initrd 文件系统中的其他文件也应复制到相应的目录。

  8. 要重新打包 initrd 文件系统,请输入:

    find . | cpio --quiet -o -H newc > ../initrd
    
    cd ..
    
  9. 要压缩新的 initrd 文件,请输入:

    gzip -v9c initrd > initrd.gz
    
  10. 要将 initrd.gz 重命名回 initrd,请输入:

    mv initrd.gz initrd
    
  11. 要将该文件复制回去:

    • 对于 PXE,将更新后的 initrd 文件复制到 PXE 服务器上的 \tftp\boot 目录。

    • 对于 CD,将更新后的 initrd 文件复制到引导 CD 上的 /boot/i386/loader 目录。

添加到 Root

修改 root 文件系统:

  1. 使用 Linux 设备创建工作目录,然后切换到该目录。

  2. 将 PXE 服务器或引导 CD 上的根目录复制到新的工作目录:

    • 对于 PXE,将 /tftp/boot/root 复制到 Linux 工作站的工作目录。

    • 对于 CD,从引导 CD 的 /boot/i386/ 目录中提取 root,然后将提取的 root 复制到 Linux 工作站的工作目录。

  3. 要将 root 重命名为 root.gz,请输入:

    mv root root.gz
    
  4. 要解压缩 root.gz 文件,请输入:

    gunzip root.gz
    
  5. 要创建在随后步骤中用作装入点的另一个工作目录,请输入:

    mkdir work
    
  6. 要将根文件系统装入 /work 目录,请输入:

    mount -o loop root work
    
  7. /work 目录进行必要的更改。

  8. 要卸装 root 文件系统,请输入:

    umount work
    
  9. 要压缩新的 root 文件,请输入:

    gzip -v9c root > root.gz
    
  10. 要将 root.gz 重命名回 root,请输入:

    mv root.gz root
    
  11. 要将该文件复制回去:

    • 对于 PXE,将更新后的 root 文件复制到 PXE 服务器上的 /tftp/boot 目录。

    • 对于 CD,将更新后的 root 文件复制到引导 CD 上的 /boot/i386/ 目录。

G.4.3 使用 drverupdate 文件方法

自定义 Novell 映像发行套件的另一种方法是使用所有 SUSE 发行套件内置的驱动程序更新机制。此方法需要修改名为 driverupdate 的文件,该文件位于“映像服务器”的 /srv/tftp/boot 目录或映像引导 CD 的根目录 (/)。

与修改 initrdroot 文件系统相比,此方法的入侵性较低。您只需创建一个附加文件,以供在引导期间合并到映像操作系统中。

可执行的驱动程序更新操作共有三种类型:

  • 安装内核模块或硬件驱动程序

  • 安装文件并执行脚本

  • 将文件置于操作系统中

本节将说明如何安装文件和执行脚本。有关其他两种方法的详细信息,请参见 Novell Connection Magazine 中的 Tech Talk #3 - Spittin’ Image。特别是请参见文章中的“SUSE Linux Driver Updates”和“Adding files to the distro "root" file”两段。

本节示例使用的程序“树”在当前映像发行套件中无法使用,会在引导期间加以安装。

驱动程序更新机制会搜索 driverupdate 文件,此文件中包含的目录结构会在使用 ZENwork 发行套件引导设备后模仿操作系统的目录结构。如果此文件存在,linuxrc 就会在引导期间下载,并以动态方式合并到操作系统中。

driverupdate 文件是一种文件系统文件,可属于任意文件系统类型(例如 EXT3 或 REISER)。为了简化说明,本示例将使用 CRAMFS 文件系统。

将树程序置于 driverupdate 文件中:

  1. 在“映像服务器”上创建工作目录,例如 /work

  2. 如果使用 driverupdate 文件,则将 driverupdate.tgz 文件下载到 /work 目录,然后输入以下内容进行解压缩:

    mkdir work
    cd work
    wget http://www.novell.com/connectionmagazine/2005/11/download/driverupdate.tgz
    tar -xzvf driverupdate.tgz
    

    driverupdate.tgz 文件包含的目录结构与在步骤 3中创建的结构相同。

  3. 如果选择手动创建目录,则在 /work 目录下创建以下目录结构:

    `-- linux
        `-- suse
            |-- i386-sles10
                |-- dud.config
                |-- inst-sys
                    `-- lib
                    `-- bin
                |-- adddir.s
    

    dud.config 文件内容应包含与以下列出行相似的行。您应通过提供自己的数据来维护关键字。但可以使用下列值:

    UpdateName:     ZENworks 10 Patch 
    UpdateID:       a37f92556e4dd99e
    UpdatePriority: 100
    

    adddir.s 文件应为包含以下几行的可执行脚本:

    echo "Processing: adddir.s" > /dev/tty3 2>&1
    # driver update: add files to inst-sys
    for i in /update/[0-9]*/inst-sys ; do
         [ -d "$i" ] && adddir "$i" /
    done
    
    # driver update: run update.pre scripts
    for i in /update/[0?9]*/install/update.pre ; do
         echo "Processing: $i" > /dev/tty3 2>&1
         [ -x "$i" ] && "$i"
    done
    
  4. 要将树程序复制到 /bin 目录,请输入:

    cp /usr/bin/tree dirstruct/linux/suse/i386-9.2/inst-sys/bin/
    
  5. 要创建 CRAMFS 文件,请输入:

    mkfs.cramfs work/ driverupdate
    

    SUSE 分发分发包需要 CRAMFS 文件。

  6. 要将 driverupdate 文件复制到 /srv/tftp/boot,请输入:

    cp driverupdate /srv/tftp/boot
    
  7. /srv/tftp/boot/settings.txt 文件末尾添加以下几行:

    # SUSE driver update
    for i in /update/[0?9]*/install/adddir.s ; do
         [ -x "$i" ] && "$i"
         rm $i
    done
    

    adddir.s 脚本随即运行,创建指向所有要复制的新文件的软链接。

    这些行可能已存在于 settings.txt 文件中。

  8. 重引导启用 PXE 的设备。

    引导操作系统后,在映像维护模式提示符处会显示“ZENworks 10 Patch”。

  9. 执行树程序。

完成引导后,您存放于 driverupdate 文件中的所有文件都将位于操作系统的 /update 目录下。然后,adddir.s 脚本(或在中添加到 settings.txt步骤 7 文件的代码)会在 root 文件系统下方,创建指向 /update 目录结构下相应文件的软链接。可运行以下命令来进行校验:

/# which tree
/bin/tree
/# ll /bin/tree
lrwxrwxrwx  1 root root 29 Aug 31 21:45 /bin/tree -> /update/000/inst-sys/bin/tree

如果仅要在映像操作系统里包含新的硬件驱动程序或内核模块,则较为简单的过程是将 .ko 文件复制到 /dirstruct/linux/suse/i386-9.2/modules/ 目录中。然后,映像操作系统会自动装载此目录中的所有 .ko 文件。